ZGlmZiAtLWdpdCBhL2hscnN5bmMvaGxyc3luYy5weSBiL2hscnN5bmMvaGxyc3luYy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNGE0OTU1Ci0tLSAvZGV2L251bGwKKysrIGIvaGxyc3luYy9obHJzeW5jLnB5CkBAIC0wLDAgKzEsMTI1IEBACisjIS91c3IvYmluL3B5dGhvbjIuNQorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50CisKK2Zyb20gcHlzcWxpdGUyIGltcG9ydCBkYmFwaTIgYXMgc3FsaXRlMworaW1wb3J0IHN5cworCitobHIgPSBzcWxpdGUzLmNvbm5lY3Qoc3lzLmFyZ3ZbMV0pCit3ZWIgPSBzcWxpdGUzLmNvbm5lY3Qoc3lzLmFyZ3ZbMl0pCisKKyMgc3dpdGNoIHRvIGF1dG9jb21taXQKK2hsci5pc29sYXRpb25fbGV2ZWwgPSBOb25lCit3ZWIuaXNvbGF0aW9uX2xldmVsID0gTm9uZQorCitobHIucm93X2ZhY3RvcnkgPSBzcWxpdGUzLlJvdword2ViLnJvd19mYWN0b3J5ID0gc3FsaXRlMy5Sb3cKKword2l0aCBobHI6CisJaGxyX3N1YnNjcnMgPSBobHIuZXhlY3V0ZSgiIiIKKwkJU0VMRUNUICogRlJPTSBTdWJzY3JpYmVyCisJIiIiKS5mZXRjaGFsbCgpCisJaGxyX3Rva2VucyA9IGhsci5leGVjdXRlKCIiIgorCQlTRUxFQ1QgKiBGUk9NIEF1dGhUb2tlbgorCSIiIikuZmV0Y2hhbGwoKQorCit3aXRoIHdlYjoKKwl3ZWJfdG9rZW5zID0gd2ViLmV4ZWN1dGUoIiIiCisJCVNFTEVDVCAqIEZST00gcmVnX3Rva2VucworCSIiIikuZmV0Y2hhbGwoKQorCXdlYl9zbXMgPSB3ZWIuZXhlY3V0ZSgiIiIKKwkJU0VMRUNUICogRlJPTSBzbXNfcXVldWUKKwkiIiIpLmZldGNoYWxsKCkKKworIyBpbmRleCBieSBzdWJzY3IgaWQKK2hscl9zdWJzY3JzX2J5X2lkID0ge30KK2hscl9zdWJzY3JzX2J5X2V4dCA9IHt9CitobHJfdG9rZW5zX2J5X3N1YnNjcl9pZCA9IHt9Citmb3IgeCBpbiBobHJfc3Vic2NyczoKKwlobHJfc3Vic2Nyc19ieV9pZFt4WydpZCddXSA9IHgKKwlobHJfc3Vic2Nyc19ieV9leHRbeFsnZXh0ZW5zaW9uJ11dID0geAorZGVsIGhscl9zdWJzY3JzCitmb3IgeCBpbiBobHJfdG9rZW5zOgorCWhscl90b2tlbnNfYnlfc3Vic2NyX2lkW3hbJ3N1YnNjcmliZXJfaWQnXV0gPSB4CitkZWwgaGxyX3Rva2VucworCit3ZWJfdG9rZW5zX2J5X3N1YnNjcl9pZCA9IHt9Citmb3IgeCBpbiB3ZWJfdG9rZW5zOgorCXdlYl90b2tlbnNfYnlfc3Vic2NyX2lkW3hbJ3N1YnNjcmliZXJfaWQnXV0gPSB4CitkZWwgd2ViX3Rva2VucworCisjIHJlbW92ZSBsZWZ0b3ZlciB3ZWJfdG9rZW5zIGFuZCBjb3JyZWN0IGluY29uc2lzdGVudCBmaWVsZHMKK3dpdGggd2ViOgorCWZvciB4IGluIHdlYl90b2tlbnNfYnlfc3Vic2NyX2lkLnZhbHVlcygpOgorCQlzdWJzY3IgPSBobHJfc3Vic2Nyc19ieV9pZC5nZXQoeFsnc3Vic2NyaWJlcl9pZCddLCBOb25lKQorCQlpZiBzdWJzY3IgaXMgTm9uZToKKwkJCXdlYi5leGVjdXRlKCIiIgorCQkJCSAgICAgIERFTEVURSBGUk9NIHJlZ190b2tlbnMgV0hFUkUgc3Vic2NyaWJlcl9pZCA9ID8KKwkJCQkgICAiIiIsICh4WydzdWJzY3JpYmVyX2lkJ10sKSkKKwkJCWRlbCB3ZWJfdG9rZW5zX2J5X3N1YnNjcl9pZFt4WydzdWJzY3JpYmVyX2lkJ11dCisJCQljb250aW51ZQorCQlpZiBzdHIoeFsnaW1zaSddKSAhPSBzdHIoc3Vic2NyWydpbXNpJ10pIG9yIFwKKwkJICAgeFsnZXh0ZW5zaW9uJ10gIT0gc3Vic2NyWydleHRlbnNpb24nXSBvciBcCisJCSAgIHhbJ3Rtc2knXSAhPSBzdWJzY3JbJ3Rtc2knXSBvciBcCisJCSAgIHhbJ2xhYyddICE9IHN1YnNjclsnbGFjJ106CisJCQl3ZWIuZXhlY3V0ZSgiIiIKKwkJCQkgICAgICBVUERBVEUgcmVnX3Rva2VucworCQkJCSAgICAgIFNFVCBpbXNpID0gPywgZXh0ZW5zaW9uID0gPywgdG1zaSA9ID8sIGxhYyA9ID8KKwkJCQkgICAgICBXSEVSRSBzdWJzY3JpYmVyX2lkID0gPworCQkJCSAgICIiIiwgKHN0cihzdWJzY3JbJ2ltc2knXSksIHN1YnNjclsnZXh0ZW5zaW9uJ10sCisJCQkJICAgc3Vic2NyWyd0bXNpJ10sIHN1YnNjclsnbGFjJ10sIHhbJ3N1YnNjcmliZXJfaWQnXSkpCisKKyMgYWRkIG1pc3Npbmcgd2ViX3Rva2Vucword2l0aCB3ZWI6CisJZm9yIHggaW4gaGxyX3Rva2Vuc19ieV9zdWJzY3JfaWQudmFsdWVzKCk6CisJCXN1YnNjciA9IGhscl9zdWJzY3JzX2J5X2lkLmdldCh4WydzdWJzY3JpYmVyX2lkJ10sIE5vbmUpCisJCWlmIHN1YnNjciBpcyBOb25lOgorCQkJaGxyLmV4ZWN1dGUoIiIiCisJCQkJICAgICAgREVMRVRFIEZST00gQXV0aFRva2VuIFdIRVJFIHN1YnNjcmliZXJfaWQgPSA/CisJCQkJICAgIiIiLCAoeFsnc3Vic2NyaWJlcl9pZCddLCkpCisJCQlkZWwgaGxyX3Rva2Vuc19ieV9zdWJzY3JfaWRbeFsnc3Vic2NyaWJlcl9pZCddXQorCQkJY29udGludWUKKwkJd2VidG9rZW4gPSB3ZWJfdG9rZW5zX2J5X3N1YnNjcl9pZC5nZXQoeFsnc3Vic2NyaWJlcl9pZCddLCBOb25lKQorCQlpZiB3ZWJ0b2tlbiBpcyBOb25lOgorCQkJd2ViLmV4ZWN1dGUoIiIiCisJCQkJICAgICAgSU5TRVJUIElOVE8gcmVnX3Rva2VucworCQkJCSAgICAgIChzdWJzY3JpYmVyX2lkLCBleHRlbnNpb24sIHJlZ19jb21wbGV0ZWQsIG5hbWUsIGVtYWlsLCBsYWMsIGltc2ksIHRva2VuLCB0bXNpKQorCQkJCSAgICAgIFZBTFVFUworCQkJCSAgICAgICg/LCA/LCAwLCA/LCAnJywgPywgPywgPywgPykKKwkJCQkgICAiIiIsICh4WydzdWJzY3JpYmVyX2lkJ10sIHN1YnNjclsnZXh0ZW5zaW9uJ10sIHN1YnNjclsnbmFtZSddLAorCQkJCSAgIHN1YnNjclsnbGFjJ10sIHN0cihzdWJzY3JbJ2ltc2knXSksIHhbJ3Rva2VuJ10sIHN1YnNjclsndG1zaSddKSkKKworIyBhdXRob3JpemUgc3Vic2NyaWJlcnMKK3dpdGggaGxyOgorCWZvciB4IGluIHdlYl90b2tlbnNfYnlfc3Vic2NyX2lkLnZhbHVlcygpOgorCQlzdWJzY3IgPSBobHJfc3Vic2Nyc19ieV9pZC5nZXQoeFsnc3Vic2NyaWJlcl9pZCddLCBOb25lKQorCQlpZiB4WydyZWdfY29tcGxldGVkJ10gYW5kIG5vdCBzdWJzY3JbJ2F1dGhvcml6ZWQnXToKKwkJCWhsci5leGVjdXRlKCIiIgorCQkJCSAgICAgIFVQREFURSBTdWJzY3JpYmVyCisJCQkJICAgICAgU0VUIGF1dGhvcml6ZWQgPSAxCisJCQkJICAgICAgV0hFUkUgaWQgPSA/CisJCQkJICAgIiIiLCAoeFsnc3Vic2NyaWJlcl9pZCddLCkpCisKKyMgU3luYyBTTVMgZnJvbSB3ZWIgdG8gaGxyCit3aXRoIGhscjoKKwlmb3Igc21zIGluIHdlYl9zbXM6CisJCXN1YnNjciA9IGhscl9zdWJzY3JzX2J5X2V4dC5nZXQoc21zWydyZWNlaXZlcl9leHQnXSkKKwkJaWYgc3Vic2NyIGlzIE5vbmU6CisJCQlwcmludCAnJXMgbm90IGZvdW5kJyAlIHNtc1sncmVjZWl2ZXJfZXh0J10KKwkJCWNvbnRpbnVlCisJCWhsci5leGVjdXRlKCIiIgorCQkJCSAgICAgIElOU0VSVCBJTlRPIFNNUworCQkJCSAgICAgIChjcmVhdGVkLCBzZW5kZXJfaWQsIHJlY2VpdmVyX2lkLCByZXBseV9wYXRoX3JlcSwgc3RhdHVzX3JlcF9yZXEsIHByb3RvY29sX2lkLCBkYXRhX2NvZGluZ19zY2hlbWUsIHVkX2hkcl9pbmQsIHRleHQpCisJCQkJICAgICAgVkFMVUVTCisJCQkJICAgICAgKD8sIDEsID8sIDAsIDAsIDAsIDAsIDAsID8pCisJCQkJICAgIiIiLCAoc21zWydjcmVhdGVkJ10sIHN1YnNjclsnaWQnXSwgc21zWyd0ZXh0J10pKQord2l0aCB3ZWI6CisJZm9yIHNtcyBpbiB3ZWJfc21zOgorCQl3ZWIuZXhlY3V0ZSgiIiIKKwkJCQkgICAgICBERUxFVEUgRlJPTSBzbXNfcXVldWUgV0hFUkUgaWQgPSA/CisJCQkJICAgIiIiLCAoc21zWydpZCddLCkpCisKKworaGxyLmNsb3NlKCkKK3dlYi5jbG9zZSgpCisKZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi9saWJvc21vY29yZS8uZ2l0aWdub3JlCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSAuZ2l0aWdub3JlCnJlbmFtZSB0byBsaWJvc21vY29yZS8uZ2l0aWdub3JlCmRpZmYgLS1naXQgYS9DT1BZSU5HIGIvbGlib3Ntb2NvcmUvQ09QWUlORwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gQ09QWUlORwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvQ09QWUlORwpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuYW0gYi9saWJvc21vY29yZS9NYWtlZmlsZS5hbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gTWFrZWZpbGUuYW0KcmVuYW1lIHRvIGxpYm9zbW9jb3JlL01ha2VmaWxlLmFtCmRpZmYgLS1naXQgYS9jb25maWd1cmUuaW4gYi9saWJvc21vY29yZS9jb25maWd1cmUuaW4Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvbmZpZ3VyZS5pbgpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvY29uZmlndXJlLmluCmRpZmYgLS1naXQgYS9naXQtdmVyc2lvbi1nZW4gYi9saWJvc21vY29yZS9naXQtdmVyc2lvbi1nZW4Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGdpdC12ZXJzaW9uLWdlbgpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvZ2l0LXZlcnNpb24tZ2VuCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODVjNjk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxIEBACitTVUJESVJTID0gb3Ntb2NvbSBvc21vY29yZQpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29tL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29tL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MDIzZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb20vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSBAQAorU1VCRElSUyA9IHZ0eQpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29tL3Z0eS9NYWtlZmlsZS5hbSBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvbS92dHkvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJmMDYxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvbS92dHkvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0IEBACitvc21vdnR5X0hFQURFUlMgPSBidWZmZXIuaCBjb21tYW5kLmggdmVjdG9yLmggdnR5LmggXAorCXRlbG5ldF9pbnRlcmZhY2UuaCBsb2dnaW5nLmgKKworb3Ntb3Z0eWRpciA9ICQoaW5jbHVkZWRpcikvb3Ntb2NvbS92dHkKZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvbS92dHkvYnVmZmVyLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb20vdnR5L2J1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NDY3YTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb20vdnR5L2J1ZmZlci5oCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQnVmZmVyaW5nIHRvIG91dHB1dCBhbmQgaW5wdXQuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggS3VuaWhpcm8gSXNoaWd1cm8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgWmVicmEuCisgKgorICogR05VIFplYnJhIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBHTlUgWmVicmEgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBaZWJyYTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9aRUJSQV9CVUZGRVJfSAorI2RlZmluZSBfWkVCUkFfQlVGRkVSX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKiBDcmVhdGUgYSBuZXcgYnVmZmVyLiAgTWVtb3J5IHdpbGwgYmUgYWxsb2NhdGVkIGluIGNodW5rcyBvZiB0aGUgZ2l2ZW4KKyAgIHNpemUuICBJZiB0aGUgYXJndW1lbnQgaXMgMCwgdGhlIGxpYnJhcnkgd2lsbCBzdXBwbHkgYSByZWFzb25hYmxlCisgICBkZWZhdWx0IHNpemUgc3VpdGFibGUgZm9yIGJ1ZmZlcmluZyBzb2NrZXQgSS9PLiAqLworc3RydWN0IGJ1ZmZlciAqYnVmZmVyX25ldyh2b2lkICpjdHgsIHNpemVfdCk7CisKKy8qIEZyZWUgYWxsIGRhdGEgaW4gdGhlIGJ1ZmZlci4gKi8KK3ZvaWQgYnVmZmVyX3Jlc2V0KHN0cnVjdCBidWZmZXIgKik7CisKKy8qIFRoaXMgZnVuY3Rpb24gZmlyc3QgY2FsbHMgYnVmZmVyX3Jlc2V0IHRvIHJlbGVhc2UgYWxsIGJ1ZmZlcmVkIGRhdGEuCisgICBUaGVuIGl0IGZyZWVzIHRoZSBzdHJ1Y3QgYnVmZmVyIGl0c2VsZi4gKi8KK3ZvaWQgYnVmZmVyX2ZyZWUoc3RydWN0IGJ1ZmZlciAqKTsKKworLyogQWRkIHRoZSBnaXZlbiBkYXRhIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4gKi8KK2V4dGVybiB2b2lkIGJ1ZmZlcl9wdXQoc3RydWN0IGJ1ZmZlciAqLCBjb25zdCB2b2lkICosIHNpemVfdCk7CisvKiBBZGQgYSBzaW5nbGUgY2hhcmFjdGVyIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4gKi8KK2V4dGVybiB2b2lkIGJ1ZmZlcl9wdXRjKHN0cnVjdCBidWZmZXIgKiwgdV9jaGFyKTsKKy8qIEFkZCBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIuICovCitleHRlcm4gdm9pZCBidWZmZXJfcHV0c3RyKHN0cnVjdCBidWZmZXIgKiwgY29uc3QgY2hhciAqKTsKKworLyogQ29tYmluZSBhbGwgYWNjdW11bGF0ZWQgKGFuZCB1bmZsdXNoZWQpIGRhdGEgaW5zaWRlIHRoZSBidWZmZXIgaW50byBhCisgICBzaW5nbGUgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIGFsbG9jYXRlZCB1c2luZyBYTUFMTE9DKE1UWVBFX1RNUCkuICBOb3RlCisgICB0aGF0IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWx0ZXIgdGhlIHN0YXRlIG9mIHRoZSBidWZmZXIsIHNvIHRoZSBkYXRhCisgICBpcyBzdGlsbCBpbnNpZGUgd2FpdGluZyB0byBiZSBmbHVzaGVkLiAqLworY2hhciAqYnVmZmVyX2dldHN0cihzdHJ1Y3QgYnVmZmVyICopOworCisvKiBSZXR1cm5zIDEgaWYgdGhlcmUgaXMgbm8gcGVuZGluZyBkYXRhIGluIHRoZSBidWZmZXIuICBPdGhlcndpc2UgcmV0dXJucyAwLiAqLworaW50IGJ1ZmZlcl9lbXB0eShzdHJ1Y3QgYnVmZmVyICopOworCit0eXBlZGVmIGVudW0geworCS8qIEFuIEkvTyBlcnJvciBvY2N1cnJlZC4gIFRoZSBidWZmZXIgc2hvdWxkIGJlIGRlc3Ryb3llZCBhbmQgdGhlCisJICAgZmlsZSBkZXNjcmlwdG9yIHNob3VsZCBiZSBjbG9zZWQuICovCisJQlVGRkVSX0VSUk9SID0gLTEsCisKKwkvKiBUaGUgZGF0YSB3YXMgd3JpdHRlbiBzdWNjZXNzZnVsbHksIGFuZCB0aGUgYnVmZmVyIGlzIG5vdyBlbXB0eQorCSAgICh0aGVyZSBpcyBubyBwZW5kaW5nIGRhdGEgd2FpdGluZyB0byBiZSBmbHVzaGVkKS4gKi8KKwlCVUZGRVJfRU1QVFkgPSAwLAorCisJLyogVGhlcmUgaXMgcGVuZGluZyBkYXRhIGluIHRoZSBidWZmZXIgd2FpdGluZyB0byBiZSBmbHVzaGVkLiAgUGxlYXNlCisJICAgdHJ5IGZsdXNoaW5nIHRoZSBidWZmZXIgd2hlbiBzZWxlY3QgaW5kaWNhdGVzIHRoYXQgdGhlIGZpbGUgZGVzY3JpcHRvcgorCSAgIGlzIHdyaXRlYWJsZS4gKi8KKwlCVUZGRVJfUEVORElORyA9IDEKK30gYnVmZmVyX3N0YXR1c190OworCisvKiBUcnkgdG8gd3JpdGUgdGhpcyBkYXRhIHRvIHRoZSBmaWxlIGRlc2NyaXB0b3IuICBBbnkgZGF0YSB0aGF0IGNhbm5vdAorICAgYmUgd3JpdHRlbiBpbW1lZGlhdGVseSBpcyBhZGRlZCB0byB0aGUgYnVmZmVyIHF1ZXVlLiAqLworZXh0ZXJuIGJ1ZmZlcl9zdGF0dXNfdCBidWZmZXJfd3JpdGUoc3RydWN0IGJ1ZmZlciAqLCBpbnQgZmQsCisJCQkJICAgIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKKworLyogVGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBmbHVzaCBzb21lIChidXQgcGVyaGFwcyBub3QgYWxsKSBvZgorICAgdGhlIHF1ZXVlZCBkYXRhIHRvIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IuICovCitleHRlcm4gYnVmZmVyX3N0YXR1c190IGJ1ZmZlcl9mbHVzaF9hdmFpbGFibGUoc3RydWN0IGJ1ZmZlciAqLCBpbnQgZmQpOworCisvKiBUaGUgZm9sbG93aW5nIDIgZnVuY3Rpb25zIChidWZmZXJfZmx1c2hfYWxsIGFuZCBidWZmZXJfZmx1c2hfd2luZG93KQorICAgYXJlIGZvciB1c2UgaW4gbGliL3Z0eS5jIG9ubHkuICBUaGV5IHNob3VsZCBub3QgYmUgdXNlZCBlbHNld2hlcmUuICovCisKKy8qIENhbGwgYnVmZmVyX2ZsdXNoX2F2YWlsYWJsZSByZXBlYXRlZGx5IHVudGlsIGVpdGhlciBhbGwgZGF0YSBoYXMgYmVlbgorICAgZmx1c2hlZCwgb3IgYW4gSS9PIGVycm9yIGhhcyBiZWVuIGVuY291bnRlcmVkLCBvciB0aGUgb3BlcmF0aW9uIHdvdWxkCisgICBibG9jay4gKi8KK2V4dGVybiBidWZmZXJfc3RhdHVzX3QgYnVmZmVyX2ZsdXNoX2FsbChzdHJ1Y3QgYnVmZmVyICosIGludCBmZCk7CisKKy8qIEF0dGVtcHQgdG8gd3JpdGUgZW5vdWdoIGRhdGEgdG8gdGhlIGdpdmVuIGZkIHRvIGZpbGwgYSB3aW5kb3cgb2YgdGhlCisgICBnaXZlbiB3aWR0aCBhbmQgaGVpZ2h0IChhbmQgcmVtb3ZlIHRoZSBkYXRhIHdyaXR0ZW4gZnJvbSB0aGUgYnVmZmVyKS4KKworICAgSWYgIW5vX21vcmUsIHRoZW4gYSBtZXNzYWdlIHNheWluZyAiIC0tTW9yZS0tICIgaXMgYXBwZW5kZWQuCisgICBJZiBlcmFzZSBpcyB0cnVlLCB0aGVuIGZpcnN0IG92ZXJ3cml0ZSB0aGUgcHJldmlvdXMgIiAtLU1vcmUtLSAiIG1lc3NhZ2UKKyAgIHdpdGggc3BhY2VzLgorCisgICBBbnkgd3JpdGUgZXJyb3IgKGluY2x1ZGluZyBFQUdBSU4gb3IgRUlOVFIpIHdpbGwgY2F1c2UgdGhpcyBmdW5jdGlvbgorICAgdG8gcmV0dXJuIC0xIChiZWNhdXNlIHRoZSBsb2dpYyBmb3IgaGFuZGxpbmcgdGhlIGVyYXNlIGFuZCBtb3JlIGZlYXR1cmVzCisgICBpcyB0b28gY29tcGxpY2F0ZWQgdG8gcmV0cnkgdGhlIHdyaXRlIGxhdGVyKS4KKyovCitleHRlcm4gYnVmZmVyX3N0YXR1c190IGJ1ZmZlcl9mbHVzaF93aW5kb3coc3RydWN0IGJ1ZmZlciAqLCBpbnQgZmQsIGludCB3aWR0aCwKKwkJCQkJICAgaW50IGhlaWdodCwgaW50IGVyYXNlLCBpbnQgbm9fbW9yZSk7CisKKyNlbmRpZgkJCQkvKiBfWkVCUkFfQlVGRkVSX0ggKi8KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvbS92dHkvY29tbWFuZC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29tL3Z0eS9jb21tYW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEzNmY1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvbS92dHkvY29tbWFuZC5oCkBAIC0wLDAgKzEsMzg4IEBACisvKgorICogWmVicmEgY29uZmlndXJhdGlvbiBjb21tYW5kIGludGVyZmFjZSByb3V0aW5lCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDk4IEt1bmloaXJvIElzaGlndXJvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIFplYnJhLgorICoKKyAqIEdOVSBaZWJyYSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogR05VIFplYnJhIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgWmVicmE7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfWkVCUkFfQ09NTUFORF9ICisjZGVmaW5lIF9aRUJSQV9DT01NQU5EX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSAidmVjdG9yLmgiCisjaW5jbHVkZSAidnR5LmgiCisKKy8qIEhvc3QgY29uZmlndXJhdGlvbiB2YXJpYWJsZSAqLworc3RydWN0IGhvc3QgeworCS8qIEhvc3QgbmFtZSBvZiB0aGlzIHJvdXRlci4gKi8KKwljaGFyICpuYW1lOworCisJLyogUGFzc3dvcmQgZm9yIHZ0eSBpbnRlcmZhY2UuICovCisJY2hhciAqcGFzc3dvcmQ7CisJY2hhciAqcGFzc3dvcmRfZW5jcnlwdDsKKworCS8qIEVuYWJsZSBwYXNzd29yZCAqLworCWNoYXIgKmVuYWJsZTsKKwljaGFyICplbmFibGVfZW5jcnlwdDsKKworCS8qIFN5c3RlbSB3aWRlIHRlcm1pbmFsIGxpbmVzLiAqLworCWludCBsaW5lczsKKworCS8qIExvZyBmaWxlbmFtZS4gKi8KKwljaGFyICpsb2dmaWxlOworCisJLyogY29uZmlnIGZpbGUgbmFtZSBvZiB0aGlzIGhvc3QgKi8KKwljaGFyICpjb25maWc7CisKKwkvKiBGbGFncyBmb3Igc2VydmljZXMgKi8KKwlpbnQgYWR2YW5jZWQ7CisJaW50IGVuY3J5cHQ7CisKKwkvKiBCYW5uZXIgY29uZmlndXJhdGlvbi4gKi8KKwljb25zdCBjaGFyICptb3RkOworCWNoYXIgKm1vdGRmaWxlOworCisJY29uc3Qgc3RydWN0IHZ0eV9hcHBfaW5mbyAqYXBwX2luZm87Cit9OworCisvKiBUaGVyZSBhcmUgc29tZSBjb21tYW5kIGxldmVscyB3aGljaCBjYWxsZWQgZnJvbSBjb21tYW5kIG5vZGUuICovCitlbnVtIG5vZGVfdHlwZSB7CisJQVVUSF9OT0RFLAkJLyogQXV0aGVudGljYXRpb24gbW9kZSBvZiB2dHkgaW50ZXJmYWNlLiAqLworCVZJRVdfTk9ERSwJCS8qIFZpZXcgbm9kZS4gRGVmYXVsdCBtb2RlIG9mIHZ0eSBpbnRlcmZhY2UuICovCisJQVVUSF9FTkFCTEVfTk9ERSwJLyogQXV0aGVudGljYXRpb24gbW9kZSBmb3IgY2hhbmdlIGVuYWJsZS4gKi8KKwlFTkFCTEVfTk9ERSwJCS8qIEVuYWJsZSBub2RlLiAqLworCUNPTkZJR19OT0RFLAkJLyogQ29uZmlnIG5vZGUuIERlZmF1bHQgbW9kZSBvZiBjb25maWcgZmlsZS4gKi8KKwlTRVJWSUNFX05PREUsCQkvKiBTZXJ2aWNlIG5vZGUuICovCisJREVCVUdfTk9ERSwJCS8qIERlYnVnIG5vZGUuICovCisjaWYgMAorCUFBQV9OT0RFLAkJLyogQUFBIG5vZGUuICovCisJS0VZQ0hBSU5fTk9ERSwJCS8qIEtleS1jaGFpbiBub2RlLiAqLworCUtFWUNIQUlOX0tFWV9OT0RFLAkvKiBLZXktY2hhaW4ga2V5IG5vZGUuICovCisJSU5URVJGQUNFX05PREUsCQkvKiBJbnRlcmZhY2UgbW9kZSBub2RlLiAqLworCVpFQlJBX05PREUsCQkvKiB6ZWJyYSBjb25uZWN0aW9uIG5vZGUuICovCisJVEFCTEVfTk9ERSwJCS8qIHJ0bV90YWJsZSBzZWxlY3Rpb24gbm9kZS4gKi8KKwlSSVBfTk9ERSwJCS8qIFJJUCBwcm90b2NvbCBtb2RlIG5vZGUuICovCisJUklQTkdfTk9ERSwJCS8qIFJJUG5nIHByb3RvY29sIG1vZGUgbm9kZS4gKi8KKwlCR1BfTk9ERSwJCS8qIEJHUCBwcm90b2NvbCBtb2RlIHdoaWNoIGluY2x1ZGVzIEJHUDQrICovCisJQkdQX1ZQTlY0X05PREUsCQkvKiBCR1AgTVBMUy1WUE4gUEUgZXhjaGFuZ2UuICovCisJQkdQX0lQVjRfTk9ERSwJCS8qIEJHUCBJUHY0IHVuaWNhc3QgYWRkcmVzcyBmYW1pbHkuICAqLworCUJHUF9JUFY0TV9OT0RFLAkJLyogQkdQIElQdjQgbXVsdGljYXN0IGFkZHJlc3MgZmFtaWx5LiAgKi8KKwlCR1BfSVBWNl9OT0RFLAkJLyogQkdQIElQdjYgYWRkcmVzcyBmYW1pbHkgKi8KKwlPU1BGX05PREUsCQkvKiBPU1BGIHByb3RvY29sIG1vZGUgKi8KKwlPU1BGNl9OT0RFLAkJLyogT1NQRiBwcm90b2NvbCBmb3IgSVB2NiBtb2RlICovCisJSVNJU19OT0RFLAkJLyogSVNJUyBwcm90b2NvbCBtb2RlICovCisJTUFTQ19OT0RFLAkJLyogTUFTQyBmb3IgbXVsdGljYXN0LiAgKi8KKwlJUkRQX05PREUsCQkvKiBJQ01QIFJvdXRlciBEaXNjb3ZlcnkgUHJvdG9jb2wgbW9kZS4gKi8KKwlJUF9OT0RFLAkJLyogU3RhdGljIGlwIHJvdXRlIG5vZGUuICovCisJQUNDRVNTX05PREUsCQkvKiBBY2Nlc3MgbGlzdCBub2RlLiAqLworCVBSRUZJWF9OT0RFLAkJLyogUHJlZml4IGxpc3Qgbm9kZS4gKi8KKwlBQ0NFU1NfSVBWNl9OT0RFLAkvKiBBY2Nlc3MgbGlzdCBub2RlLiAqLworCVBSRUZJWF9JUFY2X05PREUsCS8qIFByZWZpeCBsaXN0IG5vZGUuICovCisJQVNfTElTVF9OT0RFLAkJLyogQVMgbGlzdCBub2RlLiAqLworCUNPTU1VTklUWV9MSVNUX05PREUsCS8qIENvbW11bml0eSBsaXN0IG5vZGUuICovCisJUk1BUF9OT0RFLAkJLyogUm91dGUgbWFwIG5vZGUuICovCisJU01VWF9OT0RFLAkJLyogU05NUCBjb25maWd1cmF0aW9uIG5vZGUuICovCisJRFVNUF9OT0RFLAkJLyogUGFja2V0IGR1bXAgbm9kZS4gKi8KKwlGT1JXQVJESU5HX05PREUsCS8qIElQIGZvcndhcmRpbmcgbm9kZS4gKi8KKyNlbmRpZgorCVZUWV9OT0RFLAkJLyogVnR5IG5vZGUuICovCisKKwlHU01ORVRfTk9ERSwKKwlCVFNfTk9ERSwKKwlUUlhfTk9ERSwKKwlUU19OT0RFLAorCVNVQlNDUl9OT0RFLAorCU1HQ1BfTk9ERSwKKwlHQlBST1hZX05PREUsCisJU0dTTl9OT0RFLAorCU5TX05PREUsCisJQlNTR1BfTk9ERSwKK307CisKKy8qIE5vZGUgd2hpY2ggaGFzIHNvbWUgY29tbWFuZHMgYW5kIHByb21wdCBzdHJpbmcgYW5kIGNvbmZpZ3VyYXRpb24KKyAgIGZ1bmN0aW9uIHBvaW50ZXIgLiAqLworc3RydWN0IGNtZF9ub2RlIHsKKwkvKiBOb2RlIGluZGV4LiAqLworCWVudW0gbm9kZV90eXBlIG5vZGU7CisKKwkvKiBQcm9tcHQgY2hhcmFjdGVyIGF0IHZ0eSBpbnRlcmZhY2UuICovCisJY29uc3QgY2hhciAqcHJvbXB0OworCisJLyogSXMgdGhpcyBub2RlJ3MgY29uZmlndXJhdGlvbiBnb2VzIHRvIHZ0eXNoID8gKi8KKwlpbnQgdnR5c2g7CisKKwkvKiBOb2RlJ3MgY29uZmlndXJhdGlvbiB3cml0ZSBmdW5jdGlvbiAqLworCWludCAoKmZ1bmMpIChzdHJ1Y3QgdnR5ICopOworCisJLyogVmVjdG9yIG9mIHRoaXMgbm9kZSdzIGNvbW1hbmQgbGlzdC4gKi8KKwl2ZWN0b3IgY21kX3ZlY3RvcjsKK307CisKK2VudW0geworCUNNRF9BVFRSX0RFUFJFQ0FURUQgPSAxLAorCUNNRF9BVFRSX0hJRERFTiwKK307CisKKy8qIFN0cnVjdHVyZSBvZiBjb21tYW5kIGVsZW1lbnQuICovCitzdHJ1Y3QgY21kX2VsZW1lbnQgeworCWNvbnN0IGNoYXIgKnN0cmluZzsJLyogQ29tbWFuZCBzcGVjaWZpY2F0aW9uIGJ5IHN0cmluZy4gKi8KKwlpbnQgKCpmdW5jKSAoc3RydWN0IGNtZF9lbGVtZW50ICosIHN0cnVjdCB2dHkgKiwgaW50LCBjb25zdCBjaGFyICpbXSk7CisJY29uc3QgY2hhciAqZG9jOwkvKiBEb2N1bWVudGF0aW9uIG9mIHRoaXMgY29tbWFuZC4gKi8KKwlpbnQgZGFlbW9uOwkJLyogRGFlbW9uIHRvIHdoaWNoIHRoaXMgY29tbWFuZCBiZWxvbmcuICovCisJdmVjdG9yIHN0cnZlYzsJCS8qIFBvaW50aW5nIG91dCBlYWNoIGRlc2NyaXB0aW9uIHZlY3Rvci4gKi8KKwl1bnNpZ25lZCBpbnQgY21kc2l6ZTsJLyogQ29tbWFuZCBpbmRleCBjb3VudC4gKi8KKwljaGFyICpjb25maWc7CQkvKiBDb25maWd1cmF0aW9uIHN0cmluZyAqLworCXZlY3RvciBzdWJjb25maWc7CS8qIFN1YiBjb25maWd1cmF0aW9uIHN0cmluZyAqLworCXVfY2hhciBhdHRyOwkJLyogQ29tbWFuZCBhdHRyaWJ1dGVzICovCit9OworCisvKiBDb21tYW5kIGRlc2NyaXB0aW9uIHN0cnVjdHVyZS4gKi8KK3N0cnVjdCBkZXNjIHsKKwljb25zdCBjaGFyICpjbWQ7CS8qIENvbW1hbmQgc3RyaW5nLiAqLworCWNvbnN0IGNoYXIgKnN0cjsJLyogQ29tbWFuZCdzIGRlc2NyaXB0aW9uLiAqLworfTsKKworLyogUmV0dXJuIHZhbHVlIG9mIHRoZSBjb21tYW5kcy4gKi8KKyNkZWZpbmUgQ01EX1NVQ0NFU1MgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ01EX1dBUk5JTkcgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ01EX0VSUl9OT19NQVRDSCAgICAgICAgIDIKKyNkZWZpbmUgQ01EX0VSUl9BTUJJR1VPVVMgICAgICAgIDMKKyNkZWZpbmUgQ01EX0VSUl9JTkNPTVBMRVRFICAgICAgIDQKKyNkZWZpbmUgQ01EX0VSUl9FWEVFRF9BUkdDX01BWCAgIDUKKyNkZWZpbmUgQ01EX0VSUl9OT1RISU5HX1RPRE8gICAgIDYKKyNkZWZpbmUgQ01EX0NPTVBMRVRFX0ZVTExfTUFUQ0ggIDcKKyNkZWZpbmUgQ01EX0NPTVBMRVRFX01BVENIICAgICAgIDgKKyNkZWZpbmUgQ01EX0NPTVBMRVRFX0xJU1RfTUFUQ0ggIDkKKyNkZWZpbmUgQ01EX1NVQ0NFU1NfREFFTU9OICAgICAgMTAKKworLyogQXJnYyBtYXggY291bnRzLiAqLworI2RlZmluZSBDTURfQVJHQ19NQVggICAyNQorCisvKiBUdXJuIG9mZiB0aGVzZSBtYWNyb3Mgd2hlbiB1aXNuZyBjcHAgd2l0aCBleHRyYWN0LnBsICovCisjaWZuZGVmIFZUWVNIX0VYVFJBQ1RfUEwKKworLyogaGVscGVyIGRlZmluZXMgZm9yIGVuZC11c2VyIERFRlVOKiBtYWNyb3MgKi8KKyNkZWZpbmUgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgYXR0cnMsIGRudW0pIFwKKyAgc3RhdGljIHN0cnVjdCBjbWRfZWxlbWVudCBjbWRuYW1lID0gXAorICB7IFwKKyAgICAuc3RyaW5nID0gY21kc3RyLCBcCisgICAgLmZ1bmMgPSBmdW5jbmFtZSwgXAorICAgIC5kb2MgPSBoZWxwc3RyLCBcCisgICAgLmF0dHIgPSBhdHRycywgXAorICAgIC5kYWVtb24gPSBkbnVtLCBcCisgIH07CisKKy8qIGdsb2JhbCAobm9uIHN0YXRpYykgY21kX2VsZW1lbnQgKi8KKyNkZWZpbmUgZ0RFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIGF0dHJzLCBkbnVtKSBcCisgIHN0cnVjdCBjbWRfZWxlbWVudCBjbWRuYW1lID0gXAorICB7IFwKKyAgICAuc3RyaW5nID0gY21kc3RyLCBcCisgICAgLmZ1bmMgPSBmdW5jbmFtZSwgXAorICAgIC5kb2MgPSBoZWxwc3RyLCBcCisgICAgLmF0dHIgPSBhdHRycywgXAorICAgIC5kYWVtb24gPSBkbnVtLCBcCisgIH07CisKKyNkZWZpbmUgREVGVU5fQ01EX0ZVTkNfREVDTChmdW5jbmFtZSkgXAorICBzdGF0aWMgaW50IGZ1bmNuYW1lIChzdHJ1Y3QgY21kX2VsZW1lbnQgKiwgc3RydWN0IHZ0eSAqLCBpbnQsIGNvbnN0IGNoYXIgKltdKTsgXAorCisjZGVmaW5lIERFRlVOX0NNRF9GVU5DX1RFWFQoZnVuY25hbWUpIFwKKyAgc3RhdGljIGludCBmdW5jbmFtZSBcCisgICAgKHN0cnVjdCBjbWRfZWxlbWVudCAqc2VsZiwgc3RydWN0IHZ0eSAqdnR5LCBpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKQorCisvKiBERUZVTiBmb3IgdnR5IGNvbW1hbmQgaW50ZXJhZmNlLiBMaXR0bGUgYml0IGhhY2t5IDstKS4gKi8KKyNkZWZpbmUgREVGVU4oZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9DTURfRlVOQ19ERUNMKGZ1bmNuYW1lKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIDAsIDApIFwKKyAgREVGVU5fQ01EX0ZVTkNfVEVYVChmdW5jbmFtZSkKKworLyogZ2xvYmFsIChub24gc3RhdGljKSBjbWRfZWxlbWVudCAqLworI2RlZmluZSBnREVGVU4oZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9DTURfRlVOQ19ERUNMKGZ1bmNuYW1lKSBcCisgIGdERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCAwLCAwKSBcCisgIERFRlVOX0NNRF9GVU5DX1RFWFQoZnVuY25hbWUpCisKKyNkZWZpbmUgREVGVU5fQVRUUihmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBhdHRyKSBcCisgIERFRlVOX0NNRF9GVU5DX0RFQ0woZnVuY25hbWUpIFwKKyAgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgYXR0ciwgMCkgXAorICBERUZVTl9DTURfRlVOQ19URVhUKGZ1bmNuYW1lKQorCisjZGVmaW5lIERFRlVOX0hJRERFTihmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0FUVFIgKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIENNRF9BVFRSX0hJRERFTikKKworI2RlZmluZSBERUZVTl9ERVBSRUNBVEVEKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5fQVRUUiAoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgQ01EX0FUVFJfREVQUkVDQVRFRCkgXAorCisvKiBERUZVTl9OT1NIIGZvciBjb21tYW5kcyB0aGF0IHZ0eXNoIHNob3VsZCBpZ25vcmUgKi8KKyNkZWZpbmUgREVGVU5fTk9TSChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpCisKKy8qIERFRlNIIGZvciB2dHlzaC4gKi8KKyNkZWZpbmUgREVGU0goZGFlbW9uLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5fQ01EX0VMRU1FTlQoTlVMTCwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCAwLCBkYWVtb24pIFwKKworLyogREVGVU4gKyBERUZTSCAqLworI2RlZmluZSBERUZVTlNIKGRhZW1vbiwgZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9DTURfRlVOQ19ERUNMKGZ1bmNuYW1lKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIDAsIGRhZW1vbikgXAorICBERUZVTl9DTURfRlVOQ19URVhUKGZ1bmNuYW1lKQorCisvKiBERUZVTiArIERFRlNIIHdpdGggYXR0cmlidXRlcyAqLworI2RlZmluZSBERUZVTlNIX0FUVFIoZGFlbW9uLCBmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBhdHRyKSBcCisgIERFRlVOX0NNRF9GVU5DX0RFQ0woZnVuY25hbWUpIFwKKyAgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgYXR0ciwgZGFlbW9uKSBcCisgIERFRlVOX0NNRF9GVU5DX1RFWFQoZnVuY25hbWUpCisKKyNkZWZpbmUgREVGVU5TSF9ISURERU4oZGFlbW9uLCBmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOU0hfQVRUUiAoZGFlbW9uLCBmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBDTURfQVRUUl9ISURERU4pCisKKyNkZWZpbmUgREVGVU5TSF9ERVBSRUNBVEVEKGRhZW1vbiwgZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTlNIX0FUVFIgKGRhZW1vbiwgZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgQ01EX0FUVFJfREVQUkVDQVRFRCkKKworLyogQUxJQVMgbWFjcm8gd2hpY2ggZGVmaW5lIGV4aXN0aW5nIGNvbW1hbmQncyBhbGlhcy4gKi8KKyNkZWZpbmUgQUxJQVMoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCAwLCAwKQorCisvKiBnbG9iYWwgKG5vbiBzdGF0aWMpIGNtZF9lbGVtZW50ICovCisjZGVmaW5lIGdBTElBUyhmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIGdERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCAwLCAwKQorCisjZGVmaW5lIEFMSUFTX0FUVFIoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgYXR0cikgXAorICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBhdHRyLCAwKQorCisjZGVmaW5lIEFMSUFTX0hJRERFTihmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIENNRF9BVFRSX0hJRERFTiwgMCkKKworI2RlZmluZSBBTElBU19ERVBSRUNBVEVEKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgQ01EX0FUVFJfREVQUkVDQVRFRCwgMCkKKworI2RlZmluZSBBTElBU19TSChkYWVtb24sIGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgMCwgZGFlbW9uKQorCisjZGVmaW5lIEFMSUFTX1NIX0hJRERFTihkYWVtb24sIGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgQ01EX0FUVFJfSElEREVOLCBkYWVtb24pCisKKyNkZWZpbmUgQUxJQVNfU0hfREVQUkVDQVRFRChkYWVtb24sIGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgQ01EX0FUVFJfREVQUkVDQVRFRCwgZGFlbW9uKQorCisjZW5kaWYJCQkJLyogVlRZU0hfRVhUUkFDVF9QTCAqLworCisvKiBTb21lIG1hY3JvZXMgKi8KKyNkZWZpbmUgQ01EX09QVElPTihTKSAgICgoU1swXSkgPT0gJ1snKQorI2RlZmluZSBDTURfVkFSSUFCTEUoUykgKCgoU1swXSkgPj0gJ0EnICYmIChTWzBdKSA8PSAnWicpIHx8ICgoU1swXSkgPT0gJzwnKSkKKyNkZWZpbmUgQ01EX1ZBUkFSRyhTKSAgICgoU1swXSkgPT0gJy4nKQorI2RlZmluZSBDTURfUkFOR0UoUykJKChTWzBdID09ICc8JykpCisKKyNkZWZpbmUgQ01EX0lQVjQoUykJICAgKChzdHJjbXAgKChTKSwgIkEuQi5DLkQiKSA9PSAwKSkKKyNkZWZpbmUgQ01EX0lQVjRfUFJFRklYKFMpICgoc3RyY21wICgoUyksICJBLkIuQy5EL00iKSA9PSAwKSkKKyNkZWZpbmUgQ01EX0lQVjYoUykgICAgICAgICgoc3RyY21wICgoUyksICJYOlg6Olg6WCIpID09IDApKQorI2RlZmluZSBDTURfSVBWNl9QUkVGSVgoUykgKChzdHJjbXAgKChTKSwgIlg6WDo6WDpYL00iKSA9PSAwKSkKKworLyogQ29tbW9uIGRlc2NyaXB0aW9ucy4gKi8KKyNkZWZpbmUgU0hPV19TVFIgIlNob3cgcnVubmluZyBzeXN0ZW0gaW5mb3JtYXRpb25cbiIKKyNkZWZpbmUgSVBfU1RSICJJUCBpbmZvcm1hdGlvblxuIgorI2RlZmluZSBJUFY2X1NUUiAiSVB2NiBpbmZvcm1hdGlvblxuIgorI2RlZmluZSBOT19TVFIgIk5lZ2F0ZSBhIGNvbW1hbmQgb3Igc2V0IGl0cyBkZWZhdWx0c1xuIgorI2RlZmluZSBDTEVBUl9TVFIgIlJlc2V0IGZ1bmN0aW9uc1xuIgorI2RlZmluZSBSSVBfU1RSICJSSVAgaW5mb3JtYXRpb25cbiIKKyNkZWZpbmUgQkdQX1NUUiAiQkdQIGluZm9ybWF0aW9uXG4iCisjZGVmaW5lIE9TUEZfU1RSICJPU1BGIGluZm9ybWF0aW9uXG4iCisjZGVmaW5lIE5FSUdIQk9SX1NUUiAiU3BlY2lmeSBuZWlnaGJvciByb3V0ZXJcbiIKKyNkZWZpbmUgREVCVUdfU1RSICJEZWJ1Z2dpbmcgZnVuY3Rpb25zIChzZWUgYWxzbyAndW5kZWJ1ZycpXG4iCisjZGVmaW5lIFVOREVCVUdfU1RSICJEaXNhYmxlIGRlYnVnZ2luZyBmdW5jdGlvbnMgKHNlZSBhbHNvICdkZWJ1ZycpXG4iCisjZGVmaW5lIFJPVVRFUl9TVFIgIkVuYWJsZSBhIHJvdXRpbmcgcHJvY2Vzc1xuIgorI2RlZmluZSBBU19TVFIgIkFTIG51bWJlclxuIgorI2RlZmluZSBNQkdQX1NUUiAiTUJHUCBpbmZvcm1hdGlvblxuIgorI2RlZmluZSBNQVRDSF9TVFIgIk1hdGNoIHZhbHVlcyBmcm9tIHJvdXRpbmcgdGFibGVcbiIKKyNkZWZpbmUgU0VUX1NUUiAiU2V0IHZhbHVlcyBpbiBkZXN0aW5hdGlvbiByb3V0aW5nIHByb3RvY29sXG4iCisjZGVmaW5lIE9VVF9TVFIgIkZpbHRlciBvdXRnb2luZyByb3V0aW5nIHVwZGF0ZXNcbiIKKyNkZWZpbmUgSU5fU1RSICAiRmlsdGVyIGluY29taW5nIHJvdXRpbmcgdXBkYXRlc1xuIgorI2RlZmluZSBWNE5PVEFUSU9OX1NUUiAic3BlY2lmeSBieSBJUHY0IGFkZHJlc3Mgbm90YXRpb24oZS5nLiAwLjAuMC4wKVxuIgorI2RlZmluZSBPU1BGNl9OVU1CRVJfU1RSICJTcGVjaWZ5IGJ5IG51bWJlclxuIgorI2RlZmluZSBJTlRFUkZBQ0VfU1RSICJJbnRlcmZhY2UgaW5mb21hdGlvblxuIgorI2RlZmluZSBJRk5BTUVfU1RSICJJbnRlcmZhY2UgbmFtZShlLmcuIGVwMClcbiIKKyNkZWZpbmUgSVA2X1NUUiAiSVB2NiBJbmZvcm1hdGlvblxuIgorI2RlZmluZSBPU1BGNl9TVFIgIk9wZW4gU2hvcnRlc3QgUGF0aCBGaXJzdCAoT1NQRikgZm9yIElQdjZcbiIKKyNkZWZpbmUgT1NQRjZfUk9VVEVSX1NUUiAiRW5hYmxlIGEgcm91dGluZyBwcm9jZXNzXG4iCisjZGVmaW5lIE9TUEY2X0lOU1RBTkNFX1NUUiAiPDEtNjU1MzU+IEluc3RhbmNlIElEXG4iCisjZGVmaW5lIFNFQ09ORFNfU1RSICI8MS02NTUzNT4gU2Vjb25kc1xuIgorI2RlZmluZSBST1VURV9TVFIgIlJvdXRpbmcgVGFibGVcbiIKKyNkZWZpbmUgUFJFRklYX0xJU1RfU1RSICJCdWlsZCBhIHByZWZpeCBsaXN0XG4iCisjZGVmaW5lIE9TUEY2X0RVTVBfVFlQRV9MSVNUIFwKKyIobmVpZ2hib3J8aW50ZXJmYWNlfGFyZWF8bHNhfHplYnJhfGNvbmZpZ3xkYmV4fHNwZnxyb3V0ZXxsc2RifHJlZGlzdHJpYnV0ZXxob29rfGFzYnJ8cHJlZml4fGFicikiCisjZGVmaW5lIElTSVNfU1RSICJJUy1JUyBpbmZvcm1hdGlvblxuIgorI2RlZmluZSBBUkVBX1RBR19TVFIgIlthcmVhIHRhZ11cbiIKKworI2RlZmluZSBDT05GX0JBQ0tVUF9FWFQgIi5zYXYiCisKKy8qIElQdjQgb25seSBtYWNoaW5lIHNob3VsZCBub3QgYWNjZXB0IElQdjYgYWRkcmVzcyBmb3IgcGVlcidzIElQCisgICBhZGRyZXNzLiAgU28gd2UgcmVwbGFjZSBWVFkgY29tbWFuZCBzdHJpbmcgbGlrZSBiZWxvdy4gKi8KKyNpZmRlZiBIQVZFX0lQVjYKKyNkZWZpbmUgTkVJR0hCT1JfQ01EICAgICAgICJuZWlnaGJvciAoQS5CLkMuRHxYOlg6Olg6WCkgIgorI2RlZmluZSBOT19ORUlHSEJPUl9DTUQgICAgIm5vIG5laWdoYm9yIChBLkIuQy5EfFg6WDo6WDpYKSAiCisjZGVmaW5lIE5FSUdIQk9SX0FERFJfU1RSICAiTmVpZ2hib3IgYWRkcmVzc1xuSVB2NiBhZGRyZXNzXG4iCisjZGVmaW5lIE5FSUdIQk9SX0NNRDIgICAgICAibmVpZ2hib3IgKEEuQi5DLkR8WDpYOjpYOlh8V09SRCkgIgorI2RlZmluZSBOT19ORUlHSEJPUl9DTUQyICAgIm5vIG5laWdoYm9yIChBLkIuQy5EfFg6WDo6WDpYfFdPUkQpICIKKyNkZWZpbmUgTkVJR0hCT1JfQUREUl9TVFIyICJOZWlnaGJvciBhZGRyZXNzXG5OZWlnaGJvciBJUHY2IGFkZHJlc3Ncbk5laWdoYm9yIHRhZ1xuIgorI2Vsc2UKKyNkZWZpbmUgTkVJR0hCT1JfQ01EICAgICAgICJuZWlnaGJvciBBLkIuQy5EICIKKyNkZWZpbmUgTk9fTkVJR0hCT1JfQ01EICAgICJubyBuZWlnaGJvciBBLkIuQy5EICIKKyNkZWZpbmUgTkVJR0hCT1JfQUREUl9TVFIgICJOZWlnaGJvciBhZGRyZXNzXG4iCisjZGVmaW5lIE5FSUdIQk9SX0NNRDIgICAgICAibmVpZ2hib3IgKEEuQi5DLkR8V09SRCkgIgorI2RlZmluZSBOT19ORUlHSEJPUl9DTUQyICAgIm5vIG5laWdoYm9yIChBLkIuQy5EfFdPUkQpICIKKyNkZWZpbmUgTkVJR0hCT1JfQUREUl9TVFIyICJOZWlnaGJvciBhZGRyZXNzXG5OZWlnaGJvciB0YWdcbiIKKyNlbmRpZgkJCQkvKiBIQVZFX0lQVjYgKi8KKworLyogUHJvdG90eXBlcy4gKi8KK3ZvaWQgaW5zdGFsbF9ub2RlKHN0cnVjdCBjbWRfbm9kZSAqLCBpbnQgKCopKHN0cnVjdCB2dHkgKikpOwordm9pZCBpbnN0YWxsX2RlZmF1bHQoZW51bSBub2RlX3R5cGUpOwordm9pZCBpbnN0YWxsX2VsZW1lbnQoZW51bSBub2RlX3R5cGUsIHN0cnVjdCBjbWRfZWxlbWVudCAqKTsKK3ZvaWQgaW5zdGFsbF9lbGVtZW50X3ZlKHN0cnVjdCBjbWRfZWxlbWVudCAqY21kKTsKK3ZvaWQgc29ydF9ub2RlKCk7CisKKy8qIENvbmNhdGVuYXRlcyBhcmd2W3NoaWZ0XSB0aHJvdWdoIGFyZ3ZbYXJnYy0xXSBpbnRvIGEgc2luZ2xlIE5VTC10ZXJtaW5hdGVkCisgICBzdHJpbmcgd2l0aCBhIHNwYWNlIGJldHdlZW4gZWFjaCBlbGVtZW50IChhbGxvY2F0ZWQgdXNpbmcKKyAgIFhNQUxMT0MoTVRZUEVfVE1QKSkuICBSZXR1cm5zIE5VTEwgaWYgc2hpZnQgPj0gYXJnYy4gKi8KK2NoYXIgKmFyZ3ZfY29uY2F0KGNvbnN0IGNoYXIgKiphcmd2LCBpbnQgYXJnYywgaW50IHNoaWZ0KTsKKwordmVjdG9yIGNtZF9tYWtlX3N0cnZlYyhjb25zdCBjaGFyICopOwordm9pZCBjbWRfZnJlZV9zdHJ2ZWModmVjdG9yKTsKK3ZlY3RvciBjbWRfZGVzY3JpYmVfY29tbWFuZCgpOworY2hhciAqKmNtZF9jb21wbGV0ZV9jb21tYW5kKCk7Citjb25zdCBjaGFyICpjbWRfcHJvbXB0KGVudW0gbm9kZV90eXBlKTsKK2ludCBjb25maWdfZnJvbV9maWxlKHN0cnVjdCB2dHkgKiwgRklMRSAqKTsKK2VudW0gbm9kZV90eXBlIG5vZGVfcGFyZW50KGVudW0gbm9kZV90eXBlKTsKK2ludCBjbWRfZXhlY3V0ZV9jb21tYW5kKHZlY3Rvciwgc3RydWN0IHZ0eSAqLCBzdHJ1Y3QgY21kX2VsZW1lbnQgKiosIGludCk7CitpbnQgY21kX2V4ZWN1dGVfY29tbWFuZF9zdHJpY3QodmVjdG9yLCBzdHJ1Y3QgdnR5ICosIHN0cnVjdCBjbWRfZWxlbWVudCAqKik7Cit2b2lkIGNvbmZpZ19yZXBsYWNlX3N0cmluZyhzdHJ1Y3QgY21kX2VsZW1lbnQgKiwgY2hhciAqLCAuLi4pOwordm9pZCBjbWRfaW5pdChpbnQpOworCisvKiBFeHBvcnQgdHlwaWNhbCBmdW5jdGlvbnMuICovCitleHRlcm4gc3RydWN0IGNtZF9lbGVtZW50IGNvbmZpZ19leGl0X2NtZDsKK2V4dGVybiBzdHJ1Y3QgY21kX2VsZW1lbnQgY29uZmlnX2hlbHBfY21kOworZXh0ZXJuIHN0cnVjdCBjbWRfZWxlbWVudCBjb25maWdfbGlzdF9jbWQ7CitjaGFyICpob3N0X2NvbmZpZ19maWxlKCk7Cit2b2lkIGhvc3RfY29uZmlnX3NldChjb25zdCBjaGFyICopOworCisvKiBUaGlzIGlzIGNhbGxlZCBmcm9tIG1haW4gd2hlbiBhIGRhZW1vbiBpcyBpbnZva2VkIHdpdGggLXYgb3IgLS12ZXJzaW9uLiAqLwordm9pZCBwcmludF92ZXJzaW9uKGludCBwcmludF9jb3B5cmlnaHQpOworCitleHRlcm4gdm9pZCAqdGFsbF92dHlfY21kX2N0eDsKKworI2VuZGlmCQkJCS8qIF9aRUJSQV9DT01NQU5EX0ggKi8KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvbS92dHkvbG9nZ2luZy5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29tL3Z0eS9sb2dnaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhmZmJjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvbS92dHkvbG9nZ2luZy5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBfVlRZX0xPR0dJTkdfSAorI2RlZmluZSBfVlRZX0xPR0dJTkdfSAorCisjZGVmaW5lIExPR0dJTkdfU1RSCSJDb25maWd1cmUgbG9nIG1lc3NhZ2UgdG8gdGhpcyB0ZXJtaW5hbFxuIgorI2RlZmluZSBGSUxURVJfU1RSCSJGaWx0ZXIgbG9nIG1lc3NhZ2VzXG4iCisKKyNlbmRpZiAvKiBfVlRZX0xPR0dJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29tL3Z0eS90ZWxuZXRfaW50ZXJmYWNlLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb20vdnR5L3RlbG5ldF9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDRlNjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29tL3Z0eS90ZWxuZXRfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw0MCBAQAorLyogbWluaW1hbGlzdGljIHRlbG5ldC9uZXR3b3JrIGludGVyZmFjZSBpdCBtaWdodCB0dXJuIGludG8gYSB3aXJlIGludGVyZmFjZSAqLworLyogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgVEVMTkVUX0lOVEVSRkFDRV9ICisjZGVmaW5lIFRFTE5FVF9JTlRFUkZBQ0VfSAorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbG9nZ2luZy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvbS92dHkvdnR5Lmg+CisKK3N0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiB7CisJc3RydWN0IGxsaXN0X2hlYWQgZW50cnk7CisJdm9pZCAqcHJpdjsKKwlzdHJ1Y3QgYnNjX2ZkIGZkOworCXN0cnVjdCB2dHkgKnZ0eTsKKwlzdHJ1Y3QgbG9nX3RhcmdldCAqZGJnOworfTsKKworCitpbnQgdGVsbmV0X2luaXQodm9pZCAqdGFsbF9jdHgsIHZvaWQgKnByaXYsIGludCBwb3J0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb20vdnR5L3ZlY3Rvci5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29tL3Z0eS92ZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmExODRkCi0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29tL3Z0eS92ZWN0b3IuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogR2VuZXJpYyB2ZWN0b3IgaW50ZXJmYWNlIGhlYWRlci4KKyAqIENvcHlyaWdodCAoQykgMTk5NywgOTggS3VuaWhpcm8gSXNoaWd1cm8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgWmVicmEuCisgKgorICogR05VIFplYnJhIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBHTlUgWmVicmEgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBaZWJyYTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAqIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9aRUJSQV9WRUNUT1JfSAorI2RlZmluZSBfWkVCUkFfVkVDVE9SX0gKKworLyogc3RydWN0IGZvciB2ZWN0b3IgKi8KK3N0cnVjdCBfdmVjdG9yIHsKKwl1bnNpZ25lZCBpbnQgYWN0aXZlOwkvKiBudW1iZXIgb2YgYWN0aXZlIHNsb3RzICovCisJdW5zaWduZWQgaW50IGFsbG9jZWQ7CS8qIG51bWJlciBvZiBhbGxvY2F0ZWQgc2xvdCAqLworCXZvaWQgKippbmRleDsJCS8qIGluZGV4IHRvIGRhdGEgKi8KK307Cit0eXBlZGVmIHN0cnVjdCBfdmVjdG9yICp2ZWN0b3I7CisKKyNkZWZpbmUgVkVDVE9SX01JTl9TSVpFIDEKKworLyogKFNvbWV0aW1lcykgdXNlZnVsbCBtYWNyb3MuICBUaGlzIG1hY3JvIGNvbnZlcnQgaW5kZXggZXhwcmVzc2lvbiB0bworIGFycmF5IGV4cHJlc3Npb24uICovCisvKiBSZWZlcmVuY2Ugc2xvdCBhdCBnaXZlbiBpbmRleCwgY2FsbGVyIG11c3QgZW5zdXJlIHNsb3QgaXMgYWN0aXZlICovCisjZGVmaW5lIHZlY3Rvcl9zbG90KFYsSSkgICgoViktPmluZGV4WyhJKV0pCisvKiBOdW1iZXIgb2YgYWN0aXZlIHNsb3RzLgorICogTm90ZSB0aGF0IHRoaXMgZGlmZmVycyBmcm9tIHZlY3Rvcl9jb3VudCgpIGFzIGl0IHRoZSBjb3VudCByZXR1cm5lZAorICogd2lsbCBpbmNsdWRlIGFueSBlbXB0eSBzbG90cworICovCisjZGVmaW5lIHZlY3Rvcl9hY3RpdmUoVikgKChWKS0+YWN0aXZlKQorCisvKiBQcm90b3R5cGVzLiAqLwordmVjdG9yIHZlY3Rvcl9pbml0KHVuc2lnbmVkIGludCBzaXplKTsKK3ZvaWQgdmVjdG9yX2Vuc3VyZSh2ZWN0b3IgdiwgdW5zaWduZWQgaW50IG51bSk7CitpbnQgdmVjdG9yX2VtcHR5X3Nsb3QodmVjdG9yIHYpOworaW50IHZlY3Rvcl9zZXQodmVjdG9yIHYsIHZvaWQgKnZhbCk7CitpbnQgdmVjdG9yX3NldF9pbmRleCh2ZWN0b3IgdiwgdW5zaWduZWQgaW50IGksIHZvaWQgKnZhbCk7Cit2b2lkIHZlY3Rvcl91bnNldCh2ZWN0b3IgdiwgdW5zaWduZWQgaW50IGkpOwordW5zaWduZWQgaW50IHZlY3Rvcl9jb3VudCh2ZWN0b3Igdik7Cit2b2lkIHZlY3Rvcl9vbmx5X3dyYXBwZXJfZnJlZSh2ZWN0b3Igdik7Cit2b2lkIHZlY3Rvcl9vbmx5X2luZGV4X2ZyZWUodm9pZCAqaW5kZXgpOwordm9pZCB2ZWN0b3JfZnJlZSh2ZWN0b3Igdik7Cit2ZWN0b3IgdmVjdG9yX2NvcHkodmVjdG9yIHYpOworCit2b2lkICp2ZWN0b3JfbG9va3VwKHZlY3RvciwgdW5zaWduZWQgaW50KTsKK3ZvaWQgKnZlY3Rvcl9sb29rdXBfZW5zdXJlKHZlY3RvciwgdW5zaWduZWQgaW50KTsKKworZXh0ZXJuIHZvaWQgKnRhbGxfdnR5X3ZlY19jdHg7CisKKyNlbmRpZgkJCQkvKiBfWkVCUkFfVkVDVE9SX0ggKi8KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvbS92dHkvdnR5LmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb20vdnR5L3Z0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMTc0NjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb20vdnR5L3Z0eS5oCkBAIC0wLDAgKzEsMTU5IEBACisjaWZuZGVmIF9WVFlfSAorI2RlZmluZSBfVlRZX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKy8qIEdDQyBoYXZlIHByaW50ZiB0eXBlIGF0dHJpYnV0ZSBjaGVjay4gICovCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgVlRZX1BSSU5URl9BVFRSSUJVVEUoYSxiKSBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgYSwgYikpKQorI2Vsc2UKKyNkZWZpbmUgVlRZX1BSSU5URl9BVFRSSUJVVEUoYSxiKQorI2VuZGlmCQkJCS8qIF9fR05VQ19fICovCisKKy8qIERvZXMgdGhlIEkvTyBlcnJvciBpbmRpY2F0ZSB0aGF0IHRoZSBvcGVyYXRpb24gc2hvdWxkIGJlIHJldHJpZWQgbGF0ZXI/ICovCisjZGVmaW5lIEVSUk5PX0lPX1JFVFJZKEVOKSBcCisJKCgoRU4pID09IEVBR0FJTikgfHwgKChFTikgPT0gRVdPVUxEQkxPQ0spIHx8ICgoRU4pID09IEVJTlRSKSkKKworLyogVnR5IHJlYWQgYnVmZmVyIHNpemUuICovCisjZGVmaW5lIFZUWV9SRUFEX0JVRlNJWiA1MTIKKworI2RlZmluZSBWVFlfQlVGU0laIDUxMgorI2RlZmluZSBWVFlfTUFYSElTVCAyMAorCisvKiBWdHkgZXZlbnRzICovCitlbnVtIGV2ZW50IHsKKwlWVFlfU0VSViwKKwlWVFlfUkVBRCwKKwlWVFlfV1JJVEUsCisJVlRZX0NMT1NFRCwKKwlWVFlfVElNRU9VVF9SRVNFVCwKKyNpZmRlZiBWVFlTSAorCVZUWVNIX1NFUlYsCisJVlRZU0hfUkVBRCwKKwlWVFlTSF9XUklURQorI2VuZGlmCQkJCS8qIFZUWVNIICovCit9OworCitzdHJ1Y3QgdnR5IHsKKwlGSUxFICpmaWxlOworCisJLyogcHJpdmF0ZSBkYXRhLCBzcGVjaWZpZWQgYnkgY3JlYXRvciAqLworCXZvaWQgKnByaXY7CisKKwkvKiBGaWxlIGRlc2NyaXB0ZXIgb2YgdGhpcyB2dHkuICovCisJaW50IGZkOworCisJLyogSXMgdGhpcyB2dHkgY29ubmVjdCB0byBmaWxlIG9yIG5vdCAqLworCWVudW0geyBWVFlfVEVSTSwgVlRZX0ZJTEUsIFZUWV9TSEVMTCwgVlRZX1NIRUxMX1NFUlYgfSB0eXBlOworCisJLyogTm9kZSBzdGF0dXMgb2YgdGhpcyB2dHkgKi8KKwlpbnQgbm9kZTsKKworCS8qIEZhaWx1cmUgY291bnQgKi8KKwlpbnQgZmFpbDsKKworCS8qIE91dHB1dCBidWZmZXIuICovCisJc3RydWN0IGJ1ZmZlciAqb2J1ZjsKKworCS8qIENvbW1hbmQgaW5wdXQgYnVmZmVyICovCisJY2hhciAqYnVmOworCisJLyogQ29tbWFuZCBjdXJzb3IgcG9pbnQgKi8KKwlpbnQgY3A7CisKKwkvKiBDb21tYW5kIGxlbmd0aCAqLworCWludCBsZW5ndGg7CisKKwkvKiBDb21tYW5kIG1heCBsZW5ndGguICovCisJaW50IG1heDsKKworCS8qIEhpc3RyeSBvZiBjb21tYW5kICovCisJY2hhciAqaGlzdFtWVFlfTUFYSElTVF07CisKKwkvKiBIaXN0b3J5IGxvb2t1cCBjdXJyZW50IHBvaW50ICovCisJaW50IGhwOworCisJLyogSGlzdG9yeSBpbnNlcnQgZW5kIHBvaW50ICovCisJaW50IGhpbmRleDsKKworCS8qIEZvciBjdXJyZW50IHJlZmVyZW5jaW5nIHBvaW50IG9mIGludGVyZmFjZSwgcm91dGUtbWFwLAorCSAgIGFjY2Vzcy1saXN0IGV0Yy4uLiAqLworCXZvaWQgKmluZGV4OworCisJLyogRm9yIG11bHRpcGxlIGxldmVsIGluZGV4IHRyZWF0bWVudCBzdWNoIGFzIGtleSBjaGFpbiBhbmQga2V5LiAqLworCXZvaWQgKmluZGV4X3N1YjsKKworCS8qIEZvciBlc2NhcGUgY2hhcmFjdGVyLiAqLworCXVuc2lnbmVkIGNoYXIgZXNjYXBlOworCisJLyogQ3VycmVudCB2dHkgc3RhdHVzLiAqLworCWVudW0geyBWVFlfTk9STUFMLCBWVFlfQ0xPU0UsIFZUWV9NT1JFLCBWVFlfTU9SRUxJTkUgfSBzdGF0dXM7CisKKwkvKiBJQUMgaGFuZGxpbmc6IHdhcyB0aGUgbGFzdCBjaGFyYWN0ZXIgcmVjZWl2ZWQgdGhlIElBQworCSAqIChpbnRlcnByZXQtYXMtY29tbWFuZCkgZXNjYXBlIGNoYXJhY3RlciAoYW5kIHRoZXJlZm9yZSB0aGUgbmV4dAorCSAqIGNoYXJhY3RlciB3aWxsIGJlIHRoZSBjb21tYW5kIGNvZGUpPyAgUmVmZXIgdG8gVGVsbmV0IFJGQyA4NTQuICovCisJdW5zaWduZWQgY2hhciBpYWM7CisKKwkvKiBJQUMgU0IgKG9wdGlvbiBzdWJuZWdvdGlhdGlvbikgaGFuZGxpbmcgKi8KKwl1bnNpZ25lZCBjaGFyIGlhY19zYl9pbl9wcm9ncmVzczsKKwkvKiBBdCB0aGUgbW9tZW50LCB3ZSBjYXJlIG9ubHkgYWJvdXQgdGhlIE5BV1MgKHdpbmRvdyBzaXplKSBuZWdvdGlhdGlvbiwKKwkgKiBhbmQgdGhhdCByZXF1aXJlcyBqdXN0IGEgNS1jaGFyYWN0ZXIgYnVmZmVyIChSRkMgMTA3Myk6CisJICogPE5BV1MgY2hhcj4gPDE2LWJpdCB3aWR0aD4gPDE2LWJpdCBoZWlnaHQ+ICovCisjZGVmaW5lIFRFTE5FVF9OQVdTX1NCX0xFTiA1CisJdW5zaWduZWQgY2hhciBzYl9idWZbVEVMTkVUX05BV1NfU0JfTEVOXTsKKwkvKiBIb3cgbWFueSBzdWJuZWdvdGlhdGlvbiBjaGFyYWN0ZXJzIGhhdmUgd2UgcmVjZWl2ZWQ/ICBXZSBqdXN0IGRyb3AKKwkgKiB0aG9zZSB0aGF0IGRvIG5vdCBmaXQgaW4gdGhlIGJ1ZmZlci4gKi8KKwlzaXplX3Qgc2JfbGVuOworCisJLyogV2luZG93IHdpZHRoL2hlaWdodC4gKi8KKwlpbnQgd2lkdGg7CisJaW50IGhlaWdodDsKKworCS8qIENvbmZpZ3VyZSBsaW5lcy4gKi8KKwlpbnQgbGluZXM7CisKKwlpbnQgbW9uaXRvcjsKKworCS8qIEluIGNvbmZpZ3VyZSBtb2RlLiAqLworCWludCBjb25maWc7Cit9OworCisvKiBTbWFsbCBtYWNybyB0byBkZXRlcm1pbmUgbmV3bGluZSBpcyBuZXdsaW5lIG9ubHkgb3IgbGluZWZlZWQgbmVlZGVkLiAqLworI2RlZmluZSBWVFlfTkVXTElORSAgKCh2dHktPnR5cGUgPT0gVlRZX1RFUk0pID8gIlxyXG4iIDogIlxuIikKKworc3RhdGljIGlubGluZSBjaGFyICp2dHlfbmV3bGluZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJcmV0dXJuIFZUWV9ORVdMSU5FOworfQorCitzdHJ1Y3QgdnR5X2FwcF9pbmZvIHsKKwljaGFyICpuYW1lOworCWNoYXIgKnZlcnNpb247CisJY2hhciAqY29weXJpZ2h0OworCXZvaWQgKnRhbGxfY3R4OworCWVudW0gbm9kZV90eXBlICgqZ29fcGFyZW50X2NiKShzdHJ1Y3QgdnR5ICp2dHkpOworfTsKKworLyogUHJvdG90eXBlcy4gKi8KK3ZvaWQgdnR5X2luaXQoc3RydWN0IHZ0eV9hcHBfaW5mbyAqYXBwX2luZm8pOworaW50IHZ0eV9yZWFkX2NvbmZpZ19maWxlKGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwgdm9pZCAqcHJpdik7Cit2b2lkIHZ0eV9pbml0X3Z0eXNoICh2b2lkKTsKK3ZvaWQgdnR5X3Jlc2V0ICh2b2lkKTsKK3N0cnVjdCB2dHkgKnZ0eV9uZXcgKHZvaWQpOworc3RydWN0IHZ0eSAqdnR5X2NyZWF0ZSAoaW50IHZ0eV9zb2NrLCB2b2lkICpwcml2KTsKK2ludCB2dHlfb3V0IChzdHJ1Y3QgdnR5ICosIGNvbnN0IGNoYXIgKiwgLi4uKSBWVFlfUFJJTlRGX0FUVFJJQlVURSgyLCAzKTsKK2ludCB2dHlfb3V0X25ld2xpbmUoc3RydWN0IHZ0eSAqKTsKK2ludCB2dHlfcmVhZChzdHJ1Y3QgdnR5ICp2dHkpOworLy92b2lkIHZ0eV90aW1lX3ByaW50IChzdHJ1Y3QgdnR5ICosIGludCk7Cit2b2lkIHZ0eV9jbG9zZSAoc3RydWN0IHZ0eSAqKTsKK2NoYXIgKnZ0eV9nZXRfY3dkICh2b2lkKTsKK3ZvaWQgdnR5X2xvZyAoY29uc3QgY2hhciAqbGV2ZWwsIGNvbnN0IGNoYXIgKnByb3RvLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QpOworaW50IHZ0eV9jb25maWdfbG9jayAoc3RydWN0IHZ0eSAqKTsKK2ludCB2dHlfY29uZmlnX3VubG9jayAoc3RydWN0IHZ0eSAqKTsKK2ludCB2dHlfc2hlbGwgKHN0cnVjdCB2dHkgKik7CitpbnQgdnR5X3NoZWxsX3NlcnYgKHN0cnVjdCB2dHkgKik7Cit2b2lkIHZ0eV9oZWxsbyAoc3RydWN0IHZ0eSAqKTsKKwordm9pZCAqdGFsbF92dHlfY3R4OworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGUwMTAyCi0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDEyIEBACitvc21vY29yZV9IRUFERVJTID0gc2lnbmFsLmggbGludXhsaXN0LmggdGltZXIuaCBzZWxlY3QuaCBtc2diLmggXAorCQkgICB0bHYuaCBiaXR2ZWMuaCBjb21wMTI4Lmggc3RhdGlzdGljcy5oIGdzbV91dGlscy5oIHV0aWxzLmggXAorCQkgICBnc210YXAuaCB3cml0ZV9xdWV1ZS5oIHJzbC5oIGdzbTQ4LmggcnhsZXZfc3RhdC5oIG1uY2MuaCBcCisJCSAgIGdzbTQ4X2llLmggbG9nZ2luZy5oIGdzbTA4MDguaCByYXRlX2N0ci5oCisKK2lmIEVOQUJMRV9UQUxMT0MKK29zbW9jb3JlX0hFQURFUlMgKz0gdGFsbG9jLmgKK2VuZGlmCisKK29zbW9jb3JlZGlyID0gJChpbmNsdWRlZGlyKS9vc21vY29yZQorCitTVUJESVJTID0gcHJvdG9jb2wKZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvYml0dmVjLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2JpdHZlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyOTc3ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2JpdHZlYy5oCkBAIC0wLDAgKzEsNzUgQEAKKyNpZm5kZWYgX0JJVFZFQ19ICisjZGVmaW5lIF9CSVRWRUNfSAorCisvKiBiaXQgdmVjdG9yIHV0aWxpdHkgcm91dGluZXMgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworCisvKiBJbiBHU00gbWFjIGJsb2NrcywgZXZlcnkgYml0IGNhbiBiZSAwIG9yIDEsIG9yIEwgb3IgSC4gIEwvSCBhcmUKKyAqIGRlZmluZWQgcmVsYXRpdmUgdG8gdGhlIDB4MmIgcGFkZGluZyBwYXR0ZXJuICovCitlbnVtIGJpdF92YWx1ZSB7CisJWkVSTwk9IDAsCisJT05FCT0gMSwKKwlMCT0gMiwKKwlICT0gMywKK307CisKK3N0cnVjdCBiaXR2ZWMgeworCXVuc2lnbmVkIGludCBjdXJfYml0OwkvKiBjdXJzZXIgdG8gdGhlIG5leHQgdW51c2VkIGJpdCAqLworCXVuc2lnbmVkIGludCBkYXRhX2xlbjsJLyogbGVuZ3RoIG9mIGRhdGEgYXJyYXkgaW4gYnl0ZXMgKi8KKwl1aW50OF90ICpkYXRhOwkJLyogcG9pbnRlciB0byBkYXRhIGFycmF5ICovCit9OworCisvKiBjaGVjayBpZiB0aGUgYml0IGlzIDAgb3IgMSBmb3IgYSBnaXZlbiBwb3NpdGlvbiBpbnNpZGUgYSBiaXR2ZWMgKi8KK2VudW0gYml0X3ZhbHVlIGJpdHZlY19nZXRfYml0X3Bvcyhjb25zdCBzdHJ1Y3QgYml0dmVjICpidiwgdW5zaWduZWQgaW50IGJpdG5yKTsKKworLyogY2hlY2sgaWYgdGhlIGJpdCBpcyBMIG9yIEggZm9yIGEgZ2l2ZW4gcG9zaXRpb24gaW5zaWRlIGEgYml0dmVjICovCitlbnVtIGJpdF92YWx1ZSBiaXR2ZWNfZ2V0X2JpdF9wb3NfaGlnaChjb25zdCBzdHJ1Y3QgYml0dmVjICpidiwKKwkJCQkJdW5zaWduZWQgaW50IGJpdG5yKTsKKworLyogZ2V0IHRoZSBOdGggc2V0IGJpdCBpbnNpZGUgdGhlIGJpdCB2ZWN0b3IgKi8KK3Vuc2lnbmVkIGludCBiaXR2ZWNfZ2V0X250aF9zZXRfYml0KGNvbnN0IHN0cnVjdCBiaXR2ZWMgKmJ2LCB1bnNpZ25lZCBpbnQgbik7CisKKy8qIFNldCBhIGJpdCBhdCBnaXZlbiBwb3NpdGlvbiAqLworaW50IGJpdHZlY19zZXRfYml0X3BvcyhzdHJ1Y3QgYml0dmVjICpidiwgdW5zaWduZWQgaW50IGJpdG51bSwKKwkJCWVudW0gYml0X3ZhbHVlIGJpdCk7CisKKy8qIFNldCB0aGUgbmV4dCBiaXQgaW4gdGhlIHZlY3RvciAqLworaW50IGJpdHZlY19zZXRfYml0KHN0cnVjdCBiaXR2ZWMgKmJ2LCBlbnVtIGJpdF92YWx1ZSBiaXQpOworCisvKiBnZXQgdGhlIG5leHQgYml0IChsb3cvaGlnaCkgaW5zaWRlIGEgYml0dmVjICovCitpbnQgYml0dmVjX2dldF9iaXRfaGlnaChzdHJ1Y3QgYml0dmVjICpidik7CisKKy8qIFNldCBtdWx0aXBsZSBiaXRzIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uICovCitpbnQgYml0dmVjX3NldF9iaXRzKHN0cnVjdCBiaXR2ZWMgKmJ2LCBlbnVtIGJpdF92YWx1ZSAqYml0cywgaW50IGNvdW50KTsKKworLyogQWRkIGFuIHVuc2lnbmVkIGludGVnZXIgKG9mIGxlbmd0aCBjb3VudCBiaXRzKSB0byBjdXJyZW50IHBvc2l0aW9uICovCitpbnQgYml0dmVjX3NldF91aW50KHN0cnVjdCBiaXR2ZWMgKmJ2LCB1bnNpZ25lZCBpbnQgaW4sIGludCBjb3VudCk7CisKKy8qIGdldCBtdWx0aXBsZSBiaXRzIChiYXNlZCBvbiBudW1lcmljIHZhbHVlKSBmcm9tIGN1cnJlbnQgcG9zICovCitpbnQgYml0dmVjX2dldF91aW50KHN0cnVjdCBiaXR2ZWMgKmJ2LCBpbnQgbnVtX2JpdHMpOworCisKKy8qIFBhZCB0aGUgYml0IHZlY3RvciB1cCB0byBhIGNlcnRhaW4gYml0IHBvc2l0aW9uICovCitpbnQgYml0dmVjX3NwYXJlX3BhZGRpbmcoc3RydWN0IGJpdHZlYyAqYnYsIHVuc2lnbmVkIGludCB1cF90b19iaXQpOworCisjZW5kaWYgLyogX0JJVFZFQ19IICovCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2NvbXAxMjguaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvY29tcDEyOC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNzgwOGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2NvbXAxMjguaApAQCAtMCwwICsxLDIyIEBACisvKgorICogQ09NUDEyOCBoZWFkZXIKKyAqCisgKiBTZWUgY29tcDEyOC5jIGZvciBkZXRhaWxzCisgKi8KKworI2lmbmRlZiBfX0NPTVAxMjhfSF9fCisjZGVmaW5lIF9fQ09NUDEyOF9IX18KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKgorICogUGVyZm9ybXMgdGhlIENPTVAxMjggYWxnb3JpdGhtICh1c2VkIGFzIEEzL0E4KQorICoga2kgICAgOiB1aW50OF90IFsxNl0KKyAqIHNyYW5kIDogdWludDhfdCBbMTZdCisgKiBzcmVzICA6IHVpbnQ4X3QgWzRdCisgKiBrYyAgICA6IHVpbnQ4X3QgWzhdCisgKi8KK3ZvaWQgY29tcDEyOCh1aW50OF90ICpraSwgdWludDhfdCAqc3JhbmQsIHVpbnQ4X3QgKnNyZXMsIHVpbnQ4X3QgKmtjKTsKKworI2VuZGlmIC8qIF9fQ09NUDEyOF9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9nc20wODA4LmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbTA4MDguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTY2ZTU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9nc20wODA4LmgKQEAgLTAsMCArMSw0MyBAQAorLyogKEMpIDIwMDksMjAxMCBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOSwyMDEwIGJ5IE9uLVdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKyNpZm5kZWYgT1NNT0NPUkVfR1NNMDgwOF9ICisjZGVmaW5lIE9TTU9DT1JFX0dTTTA4MDhfSAorCisjaW5jbHVkZSAidGx2LmgiCisKK3N0cnVjdCBtc2diOworCitzdHJ1Y3QgbXNnYiAqZ3NtMDgwOF9jcmVhdGVfbGF5ZXIzKHN0cnVjdCBtc2diICptc2csIHVpbnQxNl90IG5ldGNvZGUsIHVpbnQxNl90IGNvdW50cnljb2RlLCBpbnQgbGFjLCBpbnQgY2kpOworc3RydWN0IG1zZ2IgKmdzbTA4MDhfY3JlYXRlX3Jlc2V0KHZvaWQpOworc3RydWN0IG1zZ2IgKmdzbTA4MDhfY3JlYXRlX2NsZWFyX2NvbXBsZXRlKHZvaWQpOworc3RydWN0IG1zZ2IgKmdzbTA4MDhfY3JlYXRlX2NpcGhlcl9jb21wbGV0ZShzdHJ1Y3QgbXNnYiAqbGF5ZXIzLCB1aW50OF90IGFsZ19pZCk7CitzdHJ1Y3QgbXNnYiAqZ3NtMDgwOF9jcmVhdGVfY2lwaGVyX3JlamVjdCh1aW50OF90IGNhdXNlKTsKK3N0cnVjdCBtc2diICpnc20wODA4X2NyZWF0ZV9jbGFzc21hcmtfdXBkYXRlKGNvbnN0IHVpbnQ4X3QgKmNsYXNzbWFyaywgdWludDhfdCBsZW5ndGgpOworc3RydWN0IG1zZ2IgKmdzbTA4MDhfY3JlYXRlX3NhcGlfcmVqZWN0KHVpbnQ4X3QgbGlua19pZCk7CitzdHJ1Y3QgbXNnYiAqZ3NtMDgwOF9jcmVhdGVfYXNzaWdubWVudF9jb21wbGV0ZWQoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVpbnQ4X3QgcnJfY2F1c2UsCisJCQkJCQkgdWludDhfdCBjaG9zZW5fY2hhbm5lbCwgdWludDhfdCBlbmNyX2FsZ19pZCwKKwkJCQkJCSB1aW50OF90IHNwZWVjaF9tb2RlKTsKK3N0cnVjdCBtc2diICpnc20wODA4X2NyZWF0ZV9hc3NpZ25tZW50X2ZhaWx1cmUodWludDhfdCBjYXVzZSwgdWludDhfdCAqcnJfY2F1c2UpOworCit2b2lkIGdzbTA4MDhfcHJlcGVuZF9kdGFwX2hlYWRlcihzdHJ1Y3QgbXNnYiAqbXNnLCB1aW50OF90IGxpbmtfaWQpOworCitjb25zdCBzdHJ1Y3QgdGx2X2RlZmluaXRpb24gKmdzbTA4MDhfYXR0X3RsdmRlZigpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtNDguaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtNDguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTlmYmJkCi0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9nc200OC5oCkBAIC0wLDAgKzEsMzQgQEAKKyNpZm5kZWYgX09TTU9DT1JFX0dTTTQ4X0gKKyNkZWZpbmUgX09TTU9DT1JFX0dTTTQ4X0gKKworI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbTQ4X2llLmg+CisKKy8qIEEgcGFyc2VkIEdQUlMgcm91dGluZyBhcmVhICovCitzdHJ1Y3QgZ3Byc19yYV9pZCB7CisJdWludDE2X3QJbW5jOworCXVpbnQxNl90CW1jYzsKKwl1aW50MTZfdAlsYWM7CisJdWludDhfdAkJcmFjOworfTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCB0bHZfZGVmaW5pdGlvbiBnc200OF9hdHRfdGx2ZGVmOworY29uc3QgY2hhciAqZ3NtNDhfY2Nfc3RhdGVfbmFtZSh1aW50OF90IHN0YXRlKTsKK2NvbnN0IGNoYXIgKmdzbTQ4X2NjX21zZ19uYW1lKHVpbnQ4X3QgbXNndHlwZSk7Citjb25zdCBjaGFyICpycl9jYXVzZV9uYW1lKHVpbnQ4X3QgY2F1c2UpOworCit2b2lkIGdzbTQ4X2dlbmVyYXRlX2xhaShzdHJ1Y3QgZ3NtNDhfbG9jX2FyZWFfaWQgKmxhaTQ4LCB1aW50MTZfdCBtY2MsCisJCQl1aW50MTZfdCBtbmMsIHVpbnQxNl90IGxhYyk7CitpbnQgZ3NtNDhfZ2VuZXJhdGVfbWlkX2Zyb21fdG1zaSh1aW50OF90ICpidWYsIHVpbnQzMl90IHRtc2kpOworaW50IGdzbTQ4X2dlbmVyYXRlX21pZF9mcm9tX2ltc2kodWludDhfdCAqYnVmLCBjb25zdCBjaGFyICppbXNpKTsKKworLyogQ29udmVydCBNb2JpbGUgSWRlbnRpdHkgKDEwLjUuMS40KSB0byBzdHJpbmcgKi8KK2ludCBnc200OF9taV90b19zdHJpbmcoY2hhciAqc3RyaW5nLCBjb25zdCBpbnQgc3RyX2xlbiwKKwkJCWNvbnN0IHVpbnQ4X3QgKm1pLCBjb25zdCBpbnQgbWlfbGVuKTsKKworLyogUGFyc2UgUm91dGVpbmcgQXJlYSBJZGVudGlmaWVyICovCit2b2lkIGdzbTQ4X3BhcnNlX3JhKHN0cnVjdCBncHJzX3JhX2lkICpyYWlkLCBjb25zdCB1aW50OF90ICpidWYpOworaW50IGdzbTQ4X2NvbnN0cnVjdF9yYSh1aW50OF90ICpidWYsIGNvbnN0IHN0cnVjdCBncHJzX3JhX2lkICpyYWlkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbTQ4X2llLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbTQ4X2llLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAwNjE5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtNDhfaWUuaApAQCAtMCwwICsxLDEwNyBAQAorI2lmbmRlZiBfT1NNT0NPUkVfR1NNNDhfSUVfSAorI2RlZmluZSBfT1NNT0NPUkVfR1NNNDhfSUVfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tbmNjLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzA4Lmg+CisKKy8qIGRlY29kZSBhICdjYWxsZWQvY2FsbGluZy9jb25uZWN0IHBhcnR5IEJDRCBudW1iZXInIGFzIGluIDEwLjUuNC43ICovCitpbnQgZ3NtNDhfZGVjb2RlX2JjZF9udW1iZXIoY2hhciAqb3V0cHV0LCBpbnQgb3V0cHV0X2xlbiwKKwkJCSAgICBjb25zdCB1aW50OF90ICpiY2RfbHYsIGludCBoX2xlbik7CisKKy8qIGNvbnZlcnQgYSBBU0NJSSBwaG9uZSBudW1iZXIgdG8gJ2NhbGxlZC9jYWxsaW5nL2Nvbm5lY3QgcGFydHkgQkNEIG51bWJlcicgKi8KK2ludCBnc200OF9lbmNvZGVfYmNkX251bWJlcih1aW50OF90ICpiY2RfbHYsIHVpbnQ4X3QgbWF4X2xlbiwKKwkJCSAgICBpbnQgaF9sZW4sIGNvbnN0IGNoYXIgKmlucHV0KTsKKy8qIGRlY29kZSAnYmVhcmVyIGNhcGFiaWxpdHknICovCitpbnQgZ3NtNDhfZGVjb2RlX2JlYXJlcl9jYXAoc3RydWN0IGdzbV9tbmNjX2JlYXJlcl9jYXAgKmJjYXAsCisJCQkgICAgIGNvbnN0IHVpbnQ4X3QgKmx2KTsKKy8qIGVuY29kZSAnYmVhcmVyIGNhcGFiaWxpdHknICovCitpbnQgZ3NtNDhfZW5jb2RlX2JlYXJlcl9jYXAoc3RydWN0IG1zZ2IgKm1zZywgaW50IGx2X29ubHksCisJCQkgICAgIGNvbnN0IHN0cnVjdCBnc21fbW5jY19iZWFyZXJfY2FwICpiY2FwKTsKKy8qIGRlY29kZSAnY2FsbCBjb250cm9sIGNhcCcgKi8KK2ludCBnc200OF9kZWNvZGVfY2NjYXAoc3RydWN0IGdzbV9tbmNjX2NjY2FwICpjY2FwLCBjb25zdCB1aW50OF90ICpsdik7CisvKiBlbmNvZGUgJ2NhbGwgY29udHJvbCBjYXAnICovCitpbnQgZ3NtNDhfZW5jb2RlX2NjY2FwKHN0cnVjdCBtc2diICptc2csCisJCQljb25zdCBzdHJ1Y3QgZ3NtX21uY2NfY2NjYXAgKmNjYXApOworLyogZGVjb2RlICdjYWxsZWQgcGFydHkgQkNEIG51bWJlcicgKi8KK2ludCBnc200OF9kZWNvZGVfY2FsbGVkKHN0cnVjdCBnc21fbW5jY19udW1iZXIgKmNhbGxlZCwKKwkJCSBjb25zdCB1aW50OF90ICpsdik7CisvKiBlbmNvZGUgJ2NhbGxlZCBwYXJ0eSBCQ0QgbnVtYmVyJyAqLworaW50IGdzbTQ4X2VuY29kZV9jYWxsZWQoc3RydWN0IG1zZ2IgKm1zZywKKwkJCSBjb25zdCBzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyICpjYWxsZWQpOworLyogZGVjb2RlIGNhbGxlcmlkIG9mIHZhcmlvdXMgSUVzICovCitpbnQgZ3NtNDhfZGVjb2RlX2NhbGxlcmlkKHN0cnVjdCBnc21fbW5jY19udW1iZXIgKmNhbGxlcmlkLAorCQkJIGNvbnN0IHVpbnQ4X3QgKmx2KTsKKy8qIGVuY29kZSBjYWxsZXJpZCBvZiB2YXJpb3VzIElFcyAqLworaW50IGdzbTQ4X2VuY29kZV9jYWxsZXJpZChzdHJ1Y3QgbXNnYiAqbXNnLCBpbnQgaWUsIGludCBtYXhfbGVuLAorCQkJICAgY29uc3Qgc3RydWN0IGdzbV9tbmNjX251bWJlciAqY2FsbGVyaWQpOworLyogZGVjb2RlICdjYXVzZScgKi8KK2ludCBnc200OF9kZWNvZGVfY2F1c2Uoc3RydWN0IGdzbV9tbmNjX2NhdXNlICpjYXVzZSwKKwkJCWNvbnN0IHVpbnQ4X3QgKmx2KTsKKy8qIGVuY29kZSAnY2F1c2UnICovCitpbnQgZ3NtNDhfZW5jb2RlX2NhdXNlKHN0cnVjdCBtc2diICptc2csIGludCBsdl9vbmx5LAorCQkJY29uc3Qgc3RydWN0IGdzbV9tbmNjX2NhdXNlICpjYXVzZSk7CisvKiBkZWNvZGUgJ2NhbGxpbmcgbnVtYmVyJyAqLworaW50IGdzbTQ4X2RlY29kZV9jYWxsaW5nKHN0cnVjdCBnc21fbW5jY19udW1iZXIgKmNhbGxpbmcsCisJCQkgY29uc3QgdWludDhfdCAqbHYpOworLyogZW5jb2RlICdjYWxsaW5nIG51bWJlcicgKi8KK2ludCBnc200OF9lbmNvZGVfY2FsbGluZyhzdHJ1Y3QgbXNnYiAqbXNnLCAKKwkJCSAgY29uc3Qgc3RydWN0IGdzbV9tbmNjX251bWJlciAqY2FsbGluZyk7CisvKiBkZWNvZGUgJ2Nvbm5lY3RlZCBudW1iZXInICovCitpbnQgZ3NtNDhfZGVjb2RlX2Nvbm5lY3RlZChzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyICpjb25uZWN0ZWQsCisJCQkgY29uc3QgdWludDhfdCAqbHYpOworLyogZW5jb2RlICdjb25uZWN0ZWQgbnVtYmVyJyAqLworaW50IGdzbTQ4X2VuY29kZV9jb25uZWN0ZWQoc3RydWN0IG1zZ2IgKm1zZywKKwkJCSAgICBjb25zdCBzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyICpjb25uZWN0ZWQpOworLyogZGVjb2RlICdyZWRpcmVjdGluZyBudW1iZXInICovCitpbnQgZ3NtNDhfZGVjb2RlX3JlZGlyZWN0aW5nKHN0cnVjdCBnc21fbW5jY19udW1iZXIgKnJlZGlyZWN0aW5nLAorCQkJIGNvbnN0IHVpbnQ4X3QgKmx2KTsKKy8qIGVuY29kZSAncmVkaXJlY3RpbmcgbnVtYmVyJyAqLworaW50IGdzbTQ4X2VuY29kZV9yZWRpcmVjdGluZyhzdHJ1Y3QgbXNnYiAqbXNnLAorCQkJICAgICAgY29uc3Qgc3RydWN0IGdzbV9tbmNjX251bWJlciAqcmVkaXJlY3RpbmcpOworLyogZGVjb2RlICdmYWNpbGl0eScgKi8KK2ludCBnc200OF9kZWNvZGVfZmFjaWxpdHkoc3RydWN0IGdzbV9tbmNjX2ZhY2lsaXR5ICpmYWNpbGl0eSwKKwkJCSAgIGNvbnN0IHVpbnQ4X3QgKmx2KTsKKy8qIGVuY29kZSAnZmFjaWxpdHknICovCitpbnQgZ3NtNDhfZW5jb2RlX2ZhY2lsaXR5KHN0cnVjdCBtc2diICptc2csIGludCBsdl9vbmx5LAorCQkJICAgY29uc3Qgc3RydWN0IGdzbV9tbmNjX2ZhY2lsaXR5ICpmYWNpbGl0eSk7CisvKiBkZWNvZGUgJ25vdGlmeScgKi8KK2ludCBnc200OF9kZWNvZGVfbm90aWZ5KGludCAqbm90aWZ5LCBjb25zdCB1aW50OF90ICp2KTsKKy8qIGVuY29kZSAnbm90aWZ5JyAqLworaW50IGdzbTQ4X2VuY29kZV9ub3RpZnkoc3RydWN0IG1zZ2IgKm1zZywgaW50IG5vdGlmeSk7CisvKiBkZWNvZGUgJ3NpZ25hbCcgKi8KK2ludCBnc200OF9kZWNvZGVfc2lnbmFsKGludCAqc2lnbmFsLCBjb25zdCB1aW50OF90ICp2KTsKKy8qIGVuY29kZSAnc2lnbmFsJyAqLworaW50IGdzbTQ4X2VuY29kZV9zaWduYWwoc3RydWN0IG1zZ2IgKm1zZywgaW50IHNpZ25hbCk7CisvKiBkZWNvZGUgJ2tleXBhZCcgKi8KK2ludCBnc200OF9kZWNvZGVfa2V5cGFkKGludCAqa2V5cGFkLCBjb25zdCB1aW50OF90ICpsdik7CisvKiBlbmNvZGUgJ2tleXBhZCcgKi8KK2ludCBnc200OF9lbmNvZGVfa2V5cGFkKHN0cnVjdCBtc2diICptc2csIGludCBrZXlwYWQpOworLyogZGVjb2RlICdwcm9ncmVzcycgKi8KK2ludCBnc200OF9kZWNvZGVfcHJvZ3Jlc3Moc3RydWN0IGdzbV9tbmNjX3Byb2dyZXNzICpwcm9ncmVzcywKKwkJCSAgIGNvbnN0IHVpbnQ4X3QgKmx2KTsKKy8qIGVuY29kZSAncHJvZ3Jlc3MnICovCitpbnQgZ3NtNDhfZW5jb2RlX3Byb2dyZXNzKHN0cnVjdCBtc2diICptc2csIGludCBsdl9vbmx5LAorCQkJICAgY29uc3Qgc3RydWN0IGdzbV9tbmNjX3Byb2dyZXNzICpwKTsKKy8qIGRlY29kZSAndXNlci11c2VyJyAqLworaW50IGdzbTQ4X2RlY29kZV91c2VydXNlcihzdHJ1Y3QgZ3NtX21uY2NfdXNlcnVzZXIgKnV1LAorCQkJICAgY29uc3QgdWludDhfdCAqbHYpOworLyogZW5jb2RlICd1c2VydXNlcicgKi8KK2ludCBnc200OF9lbmNvZGVfdXNlcnVzZXIoc3RydWN0IG1zZ2IgKm1zZywgaW50IGx2X29ubHksCisJCQkgICBjb25zdCBzdHJ1Y3QgZ3NtX21uY2NfdXNlcnVzZXIgKnV1KTsKKy8qIGRlY29kZSAnc3MgdmVyc2lvbicgKi8KK2ludCBnc200OF9kZWNvZGVfc3N2ZXJzaW9uKHN0cnVjdCBnc21fbW5jY19zc3ZlcnNpb24gKnNzdiwKKwkJCSAgICBjb25zdCB1aW50OF90ICpsdik7CisvKiBlbmNvZGUgJ3NzIHZlcnNpb24nICovCitpbnQgZ3NtNDhfZW5jb2RlX3NzdmVyc2lvbihzdHJ1Y3QgbXNnYiAqbXNnLAorCQkJICAgY29uc3Qgc3RydWN0IGdzbV9tbmNjX3NzdmVyc2lvbiAqc3N2KTsKKy8qIGRlY29kZSAnbW9yZSBkYXRhJyBkb2VzIG5vdCByZXF1aXJlIGEgZnVuY3Rpb24sIGJlY2F1c2UgaXQgaGFzIG5vIHZhbHVlICovCisvKiBlbmNvZGUgJ21vcmUgZGF0YScgKi8KK2ludCBnc200OF9lbmNvZGVfbW9yZShzdHJ1Y3QgbXNnYiAqbXNnKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbV91dGlscy5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9nc21fdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWU5ZjJlCi0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9nc21fdXRpbHMuaApAQCAtMCwwICsxLDEwMyBAQAorLyogR1NNIHV0aWxpdHkgZnVuY3Rpb25zLCBlLmcuIGNvZGluZyBhbmQgZGVjb2RpbmcgKi8KKy8qCisgKiAoQykgMjAwOCBieSBEYW5pZWwgV2lsbG1hbm4gPGRhbmllbEB0b3RhbHVlYmVyd2FjaHVuZy5kZT4KKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIChDKSAyMDA5LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBHU01fVVRJTFNfSAorI2RlZmluZSBHU01fVVRJTFNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNkZWZpbmUgQUREX01PRFVMTyhzdW0sIGRlbHRhLCBtb2R1bG8pIGRvIHsJXAorCWlmICgoc3VtICs9IGRlbHRhKSA+PSBtb2R1bG8pCQlcCisJCXN1bSAtPSBtb2R1bG87CQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgR1NNX01BWF9GTgkoMjYqNTEqMjA0OCkKKworc3RydWN0IGdzbV90aW1lIHsKKwl1aW50MzJfdAlmbjsJLyogRk4gY291bnQgKi8KKwl1aW50MTZfdAl0MTsJLyogRk4gZGl2ICgyNio1MSkgKi8KKwl1aW50OF90CQl0MjsJLyogRk4gbW9kdWxvIDI2ICovCisJdWludDhfdAkJdDM7CS8qIEZOIG1vZHVsbyA1MSAqLworCXVpbnQ4X3QJCXRjOworfTsKKworZW51bSBnc21fYmFuZCB7CisJR1NNX0JBTkRfODUwCT0gMSwKKwlHU01fQkFORF85MDAJPSAyLAorCUdTTV9CQU5EXzE4MDAJPSA0LAorCUdTTV9CQU5EXzE5MDAJPSA4LAorCUdTTV9CQU5EXzQ1MAk9IDB4MTAsCisJR1NNX0JBTkRfNDgwCT0gMHgyMCwKKwlHU01fQkFORF83NTAJPSAweDQwLAorCUdTTV9CQU5EXzgxMAk9IDB4ODAsCit9OworCitjb25zdCBjaGFyICpnc21fYmFuZF9uYW1lKGVudW0gZ3NtX2JhbmQgYmFuZCk7CitlbnVtIGdzbV9iYW5kIGdzbV9iYW5kX3BhcnNlKGNvbnN0IGNoYXIgKm1oeik7CisKK2ludCBnc21fN2JpdF9kZWNvZGUoY2hhciAqZGVjb2RlZCwgY29uc3QgdWludDhfdCAqdXNlcl9kYXRhLCB1aW50OF90IGxlbmd0aCk7CitpbnQgZ3NtXzdiaXRfZW5jb2RlKHVpbnQ4X3QgKnJlc3VsdCwgY29uc3QgY2hhciAqZGF0YSk7CisKK2ludCBtc19wd3JfY3RsX2x2bChlbnVtIGdzbV9iYW5kIGJhbmQsIHVuc2lnbmVkIGludCBkYm0pOworaW50IG1zX3B3cl9kYm0oZW51bSBnc21fYmFuZCBiYW5kLCB1aW50OF90IGx2bCk7CisKKy8qIEFjY29yZGluZyB0byBUUyAwOC4wNSBDaGFwdGVyIDguMS40ICovCitpbnQgcnhsZXYyZGJtKHVpbnQ4X3QgcnhsZXYpOwordWludDhfdCBkYm0ycnhsZXYoaW50IGRibSk7CisKKy8qIEFjY29yZGluZyB0byBHU00gMDQuMDggQ2hhcHRlciAxMC41LjIuMjkgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJhY2hfbWF4X3RyYW5zX3ZhbDJyYXcoaW50IHZhbCkgeyByZXR1cm4gKHZhbCA+PiAxKSAmIDM7IH0KK3N0YXRpYyBpbmxpbmUgaW50IHJhY2hfbWF4X3RyYW5zX3JhdzJ2YWwoaW50IHJhdykgeworCWNvbnN0IGludCB0YmxbNF0gPSB7IDEsIDIsIDQsIDcgfTsKKwlyZXR1cm4gdGJsW3JhdyAmIDNdOworfQorCisjZGVmaW5lCUFSRkNOX1BDUwkweDgwMDAKKyNkZWZpbmUJQVJGQ05fVVBMSU5LCTB4NDAwMAorCitlbnVtIGdzbV9iYW5kIGdzbV9hcmZjbjJiYW5kKHVpbnQxNl90IGFyZmNuKTsKKworLyogQ29udmVydCBhbiBBUkZDTiB0byB0aGUgZnJlcXVlbmN5IGluIE1IeiAqIDEwICovCit1aW50MTZfdCBnc21fYXJmY24yZnJlcTEwKHVpbnQxNl90IGFyZmNuLCBpbnQgdXBsaW5rKTsKKworLyogQ29udmVydCBmcm9tIGZyYW1lIG51bWJlciB0byBHU00gdGltZSAqLwordm9pZCBnc21fZm4yZ3NtdGltZShzdHJ1Y3QgZ3NtX3RpbWUgKnRpbWUsIHVpbnQzMl90IGZuKTsKKworLyogQ29udmVydCBmcm9tIEdTTSB0aW1lIHRvIGZyYW1lIG51bWJlciAqLwordWludDMyX3QgZ3NtX2dzbXRpbWUyZm4oc3RydWN0IGdzbV90aW1lICp0aW1lKTsKKworLyogR1NNIFRTIDAzLjAzIENoYXB0ZXIgMi42ICovCitlbnVtIGdwcnNfdGxsaV90eW9lIHsKKwlUTExJX0xPQ0FMLAorCVRMTElfRk9SRUlHTiwKKwlUTExJX1JBTkRPTSwKKwlUTExJX0FVWElMSUFSWSwKKwlUTExJX1JFU0VSVkVELAorfTsKKworLyogVFMgMDMuMDMgQ2hhcHRlciAyLjYgKi8KK2ludCBncHJzX3RsbGlfdHlwZSh1aW50MzJfdCB0bGxpKTsKKwordm9pZCBnZW5lcmF0ZV9iYWNrdHJhY2UoKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9nc210YXAuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtdGFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNkNjRiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtdGFwLmgKQEAgLTAsMCArMSw3MiBAQAorI2lmbmRlZiBfR1NNVEFQX0gKKyNkZWZpbmUgX0dTTVRBUF9ICisKKy8qIGdzbXRhcCBoZWFkZXIsIHBzZXVkby1oZWFkZXIgaW4gZnJvbnQgb2YgdGhlIGFjdHVhIEdTTSBwYXlsb2FkICovCisKKy8qIEdTTVRBUCBpcyBhIGdlbmVyaWMgaGVhZGVyIGZvcm1hdCBmb3IgR1NNIHByb3RvY29sIGNhcHR1cmVzLAorICogaXQgdXNlcyB0aGUgSUFOQS1hc3NpZ25lZCBVRFAgcG9ydCBudW1iZXIgNDcyOSBhbmQgY2FycmllcworICogcGF5bG9hZCBpbiB2YXJpb3VzIGZvcm1hdHMgb2YgR1NNIGludGVyZmFjZXMgc3VjaCBhcyBVbSBNQUMKKyAqIGJsb2NrcyBvciBVbSBidXJzdHMuCisgKgorICogRXhhbXBsZSBwcm9ncmFtcyBnZW5lcmF0aW5nIEdTTVRBUCBkYXRhIGFyZSBhaXJwcm9iZQorICogKGh0dHA6Ly9haXJwcm9iZS5vcmcvKSBvciBPc21vY29tQkIgKGh0dHA6Ly9iYi5vc21vY29tLm9yZy8pCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjZGVmaW5lIEdTTVRBUF9WRVJTSU9OCQkweDAyCisKKyNkZWZpbmUgR1NNVEFQX1RZUEVfVU0JCTB4MDEKKyNkZWZpbmUgR1NNVEFQX1RZUEVfQUJJUwkweDAyCisjZGVmaW5lIEdTTVRBUF9UWVBFX1VNX0JVUlNUCTB4MDMJLyogcmF3IGJ1cnN0IGJpdHMgKi8KKworI2RlZmluZSBHU01UQVBfQlVSU1RfVU5LTk9XTgkJMHgwMAorI2RlZmluZSBHU01UQVBfQlVSU1RfRkNDSAkJMHgwMQorI2RlZmluZSBHU01UQVBfQlVSU1RfUEFSVElBTF9TQ0gJMHgwMgorI2RlZmluZSBHU01UQVBfQlVSU1RfU0NICQkweDAzCisjZGVmaW5lIEdTTVRBUF9CVVJTVF9DVFNfU0NICQkweDA0CisjZGVmaW5lIEdTTVRBUF9CVVJTVF9DT01QQUNUX1NDSAkweDA1CisjZGVmaW5lIEdTTVRBUF9CVVJTVF9OT1JNQUwJCTB4MDYKKyNkZWZpbmUgR1NNVEFQX0JVUlNUX0RVTU1ZCQkweDA3CisjZGVmaW5lIEdTTVRBUF9CVVJTVF9BQ0NFU1MJCTB4MDgKKyNkZWZpbmUgR1NNVEFQX0JVUlNUX05PTkUJCTB4MDkKKworI2RlZmluZSBHU01UQVBfQ0hBTk5FTF9VTktOT1dOCTB4MDAKKyNkZWZpbmUgR1NNVEFQX0NIQU5ORUxfQkNDSAkweDAxCisjZGVmaW5lIEdTTVRBUF9DSEFOTkVMX0NDQ0gJMHgwMgorI2RlZmluZSBHU01UQVBfQ0hBTk5FTF9SQUNICTB4MDMKKyNkZWZpbmUgR1NNVEFQX0NIQU5ORUxfQUdDSAkweDA0CisjZGVmaW5lIEdTTVRBUF9DSEFOTkVMX1BDSAkweDA1CisjZGVmaW5lIEdTTVRBUF9DSEFOTkVMX1NEQ0NICTB4MDYKKyNkZWZpbmUgR1NNVEFQX0NIQU5ORUxfU0RDQ0g0CTB4MDcKKyNkZWZpbmUgR1NNVEFQX0NIQU5ORUxfU0RDQ0g4CTB4MDgKKyNkZWZpbmUgR1NNVEFQX0NIQU5ORUxfVENIX0YJMHgwOQorI2RlZmluZSBHU01UQVBfQ0hBTk5FTF9UQ0hfSAkweDBhCisjZGVmaW5lIEdTTVRBUF9DSEFOTkVMX0FDQ0gJMHg4MAorCisjZGVmaW5lIEdTTVRBUF9BUkZDTl9GX1BDUwkweDgwMDAKKyNkZWZpbmUgR1NNVEFQX0FSRkNOX0ZfVVBMSU5LCTB4NDAwMAorI2RlZmluZSBHU01UQVBfQVJGQ05fTUFTSwkweDNmZmYKKworI2RlZmluZSBHU01UQVBfVURQX1BPUlQJCQk0NzI5CisKK3N0cnVjdCBnc210YXBfaGRyIHsKKwl1aW50OF90IHZlcnNpb247CS8qIHZlcnNpb24sIHNldCB0byAweDAxIGN1cnJlbnRseSAqLworCXVpbnQ4X3QgaGRyX2xlbjsJLyogbGVuZ3RoIGluIG51bWJlciBvZiAzMmJpdCB3b3JkcyAqLworCXVpbnQ4X3QgdHlwZTsJCS8qIHNlZSBHU01UQVBfVFlQRV8qICovCisJdWludDhfdCB0aW1lc2xvdDsJLyogdGltZXNsb3QgKDAuLjcgb24gVW0pICovCisKKwl1aW50MTZfdCBhcmZjbjsJCS8qIEFSRkNOIChmcmVxdWVuY3kpICovCisJaW50OF90IHNpZ25hbF9kYm07CS8qIHNpZ25hbCBsZXZlbCBpbiBkQm0gKi8KKwlpbnQ4X3Qgc25yX2RiOwkJLyogc2lnbmFsL25vaXNlIHJhdGlvIGluIGRCICovCisKKwl1aW50MzJfdCBmcmFtZV9udW1iZXI7CS8qIEdTTSBGcmFtZSBOdW1iZXIgKEZOKSAqLworCisJdWludDhfdCBzdWJfdHlwZTsJLyogVHlwZSBvZiBidXJzdC9jaGFubmVsLCBzZWUgYWJvdmUgKi8KKwl1aW50OF90IGFudGVubmFfbnI7CS8qIEFudGVubmEgTnVtYmVyICovCisJdWludDhfdCBzdWJfc2xvdDsJLyogc3ViLXNsb3Qgd2l0aGluIHRpbWVzbG90ICovCisJdWludDhfdCByZXM7CQkvKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAoUkZVKSAqLworCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZW5kaWYgLyogX0dTTVRBUF9IICovCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2xpbnV4bGlzdC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9saW51eGxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjk5YzVlCi0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9saW51eGxpc3QuaApAQCAtMCwwICsxLDM2MCBAQAorI2lmbmRlZiBfTElOVVhfTExJU1RfSAorI2RlZmluZSBfTElOVVhfTExJU1RfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpZm5kZWYgaW5saW5lCisjZGVmaW5lIGlubGluZSBfX2lubGluZV9fCisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIHByZWZldGNoKGNvbnN0IHZvaWQgKngpIHs7fQorCisvKioKKyAqIGNvbnRhaW5lcl9vZiAtIGNhc3QgYSBtZW1iZXIgb2YgYSBzdHJ1Y3R1cmUgb3V0IHRvIHRoZSBjb250YWluaW5nIHN0cnVjdHVyZQorICoKKyAqIEBwdHI6CXRoZSBwb2ludGVyIHRvIHRoZSBtZW1iZXIuCisgKiBAdHlwZToJdGhlIHR5cGUgb2YgdGhlIGNvbnRhaW5lciBzdHJ1Y3QgdGhpcyBpcyBlbWJlZGRlZCBpbi4KKyAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBtZW1iZXIgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKgorICovCisjZGVmaW5lIGNvbnRhaW5lcl9vZihwdHIsIHR5cGUsIG1lbWJlcikgKHsJCQlcCisgICAgICAgIGNvbnN0IHR5cGVvZiggKCh0eXBlICopMCktPm1lbWJlciApICpfX21wdHIgPSAodHlwZW9mKCAoKHR5cGUgKikwKS0+bWVtYmVyICkgKikocHRyKTsJXAorICAgICAgICAodHlwZSAqKSggKGNoYXIgKilfX21wdHIgLSBvZmZzZXRvZih0eXBlLCBtZW1iZXIpICk7fSkKKworCisvKgorICogVGhlc2UgYXJlIG5vbi1OVUxMIHBvaW50ZXJzIHRoYXQgd2lsbCByZXN1bHQgaW4gcGFnZSBmYXVsdHMKKyAqIHVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLCB1c2VkIHRvIHZlcmlmeSB0aGF0IG5vYm9keSB1c2VzCisgKiBub24taW5pdGlhbGl6ZWQgbGxpc3QgZW50cmllcy4KKyAqLworI2RlZmluZSBMTElTVF9QT0lTT04xICAoKHZvaWQgKikgMHgwMDEwMDEwMCkKKyNkZWZpbmUgTExJU1RfUE9JU09OMiAgKCh2b2lkICopIDB4MDAyMDAyMDApCisKKy8qCisgKiBTaW1wbGUgZG91Ymx5IGxpbmtlZCBsbGlzdCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBTb21lIG9mIHRoZSBpbnRlcm5hbCBmdW5jdGlvbnMgKCJfX3h4eCIpIGFyZSB1c2VmdWwgd2hlbgorICogbWFuaXB1bGF0aW5nIHdob2xlIGxsaXN0cyByYXRoZXIgdGhhbiBzaW5nbGUgZW50cmllcywgYXMKKyAqIHNvbWV0aW1lcyB3ZSBhbHJlYWR5IGtub3cgdGhlIG5leHQvcHJldiBlbnRyaWVzIGFuZCB3ZSBjYW4KKyAqIGdlbmVyYXRlIGJldHRlciBjb2RlIGJ5IHVzaW5nIHRoZW0gZGlyZWN0bHkgcmF0aGVyIHRoYW4KKyAqIHVzaW5nIHRoZSBnZW5lcmljIHNpbmdsZS1lbnRyeSByb3V0aW5lcy4KKyAqLworCitzdHJ1Y3QgbGxpc3RfaGVhZCB7CisJc3RydWN0IGxsaXN0X2hlYWQgKm5leHQsICpwcmV2OworfTsKKworI2RlZmluZSBMTElTVF9IRUFEX0lOSVQobmFtZSkgeyAmKG5hbWUpLCAmKG5hbWUpIH0KKworI2RlZmluZSBMTElTVF9IRUFEKG5hbWUpIFwKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBuYW1lID0gTExJU1RfSEVBRF9JTklUKG5hbWUpCisKKyNkZWZpbmUgSU5JVF9MTElTVF9IRUFEKHB0cikgZG8geyBcCisJKHB0ciktPm5leHQgPSAocHRyKTsgKHB0ciktPnByZXYgPSAocHRyKTsgXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIEluc2VydCBhIG5ldyBlbnRyeSBiZXR3ZWVuIHR3byBrbm93biBjb25zZWN1dGl2ZSBlbnRyaWVzLiAKKyAqCisgKiBUaGlzIGlzIG9ubHkgZm9yIGludGVybmFsIGxsaXN0IG1hbmlwdWxhdGlvbiB3aGVyZSB3ZSBrbm93CisgKiB0aGUgcHJldi9uZXh0IGVudHJpZXMgYWxyZWFkeSEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fbGxpc3RfYWRkKHN0cnVjdCBsbGlzdF9oZWFkICpfbmV3LAorCQkJICAgICAgc3RydWN0IGxsaXN0X2hlYWQgKnByZXYsCisJCQkgICAgICBzdHJ1Y3QgbGxpc3RfaGVhZCAqbmV4dCkKK3sKKwluZXh0LT5wcmV2ID0gX25ldzsKKwlfbmV3LT5uZXh0ID0gbmV4dDsKKwlfbmV3LT5wcmV2ID0gcHJldjsKKwlwcmV2LT5uZXh0ID0gX25ldzsKK30KKworLyoqCisgKiBsbGlzdF9hZGQgLSBhZGQgYSBuZXcgZW50cnkKKyAqIEBuZXc6IG5ldyBlbnRyeSB0byBiZSBhZGRlZAorICogQGhlYWQ6IGxsaXN0IGhlYWQgdG8gYWRkIGl0IGFmdGVyCisgKgorICogSW5zZXJ0IGEgbmV3IGVudHJ5IGFmdGVyIHRoZSBzcGVjaWZpZWQgaGVhZC4KKyAqIFRoaXMgaXMgZ29vZCBmb3IgaW1wbGVtZW50aW5nIHN0YWNrcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGxsaXN0X2FkZChzdHJ1Y3QgbGxpc3RfaGVhZCAqX25ldywgc3RydWN0IGxsaXN0X2hlYWQgKmhlYWQpCit7CisJX19sbGlzdF9hZGQoX25ldywgaGVhZCwgaGVhZC0+bmV4dCk7Cit9CisKKy8qKgorICogbGxpc3RfYWRkX3RhaWwgLSBhZGQgYSBuZXcgZW50cnkKKyAqIEBuZXc6IG5ldyBlbnRyeSB0byBiZSBhZGRlZAorICogQGhlYWQ6IGxsaXN0IGhlYWQgdG8gYWRkIGl0IGJlZm9yZQorICoKKyAqIEluc2VydCBhIG5ldyBlbnRyeSBiZWZvcmUgdGhlIHNwZWNpZmllZCBoZWFkLgorICogVGhpcyBpcyB1c2VmdWwgZm9yIGltcGxlbWVudGluZyBxdWV1ZXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsbGlzdF9hZGRfdGFpbChzdHJ1Y3QgbGxpc3RfaGVhZCAqX25ldywgc3RydWN0IGxsaXN0X2hlYWQgKmhlYWQpCit7CisJX19sbGlzdF9hZGQoX25ldywgaGVhZC0+cHJldiwgaGVhZCk7Cit9CisKKy8qCisgKiBEZWxldGUgYSBsbGlzdCBlbnRyeSBieSBtYWtpbmcgdGhlIHByZXYvbmV4dCBlbnRyaWVzCisgKiBwb2ludCB0byBlYWNoIG90aGVyLgorICoKKyAqIFRoaXMgaXMgb25seSBmb3IgaW50ZXJuYWwgbGxpc3QgbWFuaXB1bGF0aW9uIHdoZXJlIHdlIGtub3cKKyAqIHRoZSBwcmV2L25leHQgZW50cmllcyBhbHJlYWR5IQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19sbGlzdF9kZWwoc3RydWN0IGxsaXN0X2hlYWQgKiBwcmV2LCBzdHJ1Y3QgbGxpc3RfaGVhZCAqIG5leHQpCit7CisJbmV4dC0+cHJldiA9IHByZXY7CisJcHJldi0+bmV4dCA9IG5leHQ7Cit9CisKKy8qKgorICogbGxpc3RfZGVsIC0gZGVsZXRlcyBlbnRyeSBmcm9tIGxsaXN0LgorICogQGVudHJ5OiB0aGUgZWxlbWVudCB0byBkZWxldGUgZnJvbSB0aGUgbGxpc3QuCisgKiBOb3RlOiBsbGlzdF9lbXB0eSBvbiBlbnRyeSBkb2VzIG5vdCByZXR1cm4gdHJ1ZSBhZnRlciB0aGlzLCB0aGUgZW50cnkgaXMKKyAqIGluIGFuIHVuZGVmaW5lZCBzdGF0ZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGxsaXN0X2RlbChzdHJ1Y3QgbGxpc3RfaGVhZCAqZW50cnkpCit7CisJX19sbGlzdF9kZWwoZW50cnktPnByZXYsIGVudHJ5LT5uZXh0KTsKKwllbnRyeS0+bmV4dCA9IChzdHJ1Y3QgbGxpc3RfaGVhZCAqKUxMSVNUX1BPSVNPTjE7CisJZW50cnktPnByZXYgPSAoc3RydWN0IGxsaXN0X2hlYWQgKilMTElTVF9QT0lTT04yOworfQorCisvKioKKyAqIGxsaXN0X2RlbF9pbml0IC0gZGVsZXRlcyBlbnRyeSBmcm9tIGxsaXN0IGFuZCByZWluaXRpYWxpemUgaXQuCisgKiBAZW50cnk6IHRoZSBlbGVtZW50IHRvIGRlbGV0ZSBmcm9tIHRoZSBsbGlzdC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGxsaXN0X2RlbF9pbml0KHN0cnVjdCBsbGlzdF9oZWFkICplbnRyeSkKK3sKKwlfX2xsaXN0X2RlbChlbnRyeS0+cHJldiwgZW50cnktPm5leHQpOworCUlOSVRfTExJU1RfSEVBRChlbnRyeSk7IAorfQorCisvKioKKyAqIGxsaXN0X21vdmUgLSBkZWxldGUgZnJvbSBvbmUgbGxpc3QgYW5kIGFkZCBhcyBhbm90aGVyJ3MgaGVhZAorICogQGxsaXN0OiB0aGUgZW50cnkgdG8gbW92ZQorICogQGhlYWQ6IHRoZSBoZWFkIHRoYXQgd2lsbCBwcmVjZWRlIG91ciBlbnRyeQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGxpc3RfbW92ZShzdHJ1Y3QgbGxpc3RfaGVhZCAqbGxpc3QsIHN0cnVjdCBsbGlzdF9oZWFkICpoZWFkKQoreworICAgICAgICBfX2xsaXN0X2RlbChsbGlzdC0+cHJldiwgbGxpc3QtPm5leHQpOworICAgICAgICBsbGlzdF9hZGQobGxpc3QsIGhlYWQpOworfQorCisvKioKKyAqIGxsaXN0X21vdmVfdGFpbCAtIGRlbGV0ZSBmcm9tIG9uZSBsbGlzdCBhbmQgYWRkIGFzIGFub3RoZXIncyB0YWlsCisgKiBAbGxpc3Q6IHRoZSBlbnRyeSB0byBtb3ZlCisgKiBAaGVhZDogdGhlIGhlYWQgdGhhdCB3aWxsIGZvbGxvdyBvdXIgZW50cnkKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGxsaXN0X21vdmVfdGFpbChzdHJ1Y3QgbGxpc3RfaGVhZCAqbGxpc3QsCisJCQkJICBzdHJ1Y3QgbGxpc3RfaGVhZCAqaGVhZCkKK3sKKyAgICAgICAgX19sbGlzdF9kZWwobGxpc3QtPnByZXYsIGxsaXN0LT5uZXh0KTsKKyAgICAgICAgbGxpc3RfYWRkX3RhaWwobGxpc3QsIGhlYWQpOworfQorCisvKioKKyAqIGxsaXN0X2VtcHR5IC0gdGVzdHMgd2hldGhlciBhIGxsaXN0IGlzIGVtcHR5CisgKiBAaGVhZDogdGhlIGxsaXN0IHRvIHRlc3QuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGxsaXN0X2VtcHR5KGNvbnN0IHN0cnVjdCBsbGlzdF9oZWFkICpoZWFkKQoreworCXJldHVybiBoZWFkLT5uZXh0ID09IGhlYWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2xsaXN0X3NwbGljZShzdHJ1Y3QgbGxpc3RfaGVhZCAqbGxpc3QsCisJCQkJIHN0cnVjdCBsbGlzdF9oZWFkICpoZWFkKQoreworCXN0cnVjdCBsbGlzdF9oZWFkICpmaXJzdCA9IGxsaXN0LT5uZXh0OworCXN0cnVjdCBsbGlzdF9oZWFkICpsYXN0ID0gbGxpc3QtPnByZXY7CisJc3RydWN0IGxsaXN0X2hlYWQgKmF0ID0gaGVhZC0+bmV4dDsKKworCWZpcnN0LT5wcmV2ID0gaGVhZDsKKwloZWFkLT5uZXh0ID0gZmlyc3Q7CisKKwlsYXN0LT5uZXh0ID0gYXQ7CisJYXQtPnByZXYgPSBsYXN0OworfQorCisvKioKKyAqIGxsaXN0X3NwbGljZSAtIGpvaW4gdHdvIGxsaXN0cworICogQGxsaXN0OiB0aGUgbmV3IGxsaXN0IHRvIGFkZC4KKyAqIEBoZWFkOiB0aGUgcGxhY2UgdG8gYWRkIGl0IGluIHRoZSBmaXJzdCBsbGlzdC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGxsaXN0X3NwbGljZShzdHJ1Y3QgbGxpc3RfaGVhZCAqbGxpc3QsIHN0cnVjdCBsbGlzdF9oZWFkICpoZWFkKQoreworCWlmICghbGxpc3RfZW1wdHkobGxpc3QpKQorCQlfX2xsaXN0X3NwbGljZShsbGlzdCwgaGVhZCk7Cit9CisKKy8qKgorICogbGxpc3Rfc3BsaWNlX2luaXQgLSBqb2luIHR3byBsbGlzdHMgYW5kIHJlaW5pdGlhbGlzZSB0aGUgZW1wdGllZCBsbGlzdC4KKyAqIEBsbGlzdDogdGhlIG5ldyBsbGlzdCB0byBhZGQuCisgKiBAaGVhZDogdGhlIHBsYWNlIHRvIGFkZCBpdCBpbiB0aGUgZmlyc3QgbGxpc3QuCisgKgorICogVGhlIGxsaXN0IGF0IEBsbGlzdCBpcyByZWluaXRpYWxpc2VkCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsbGlzdF9zcGxpY2VfaW5pdChzdHJ1Y3QgbGxpc3RfaGVhZCAqbGxpc3QsCisJCQkJICAgIHN0cnVjdCBsbGlzdF9oZWFkICpoZWFkKQoreworCWlmICghbGxpc3RfZW1wdHkobGxpc3QpKSB7CisJCV9fbGxpc3Rfc3BsaWNlKGxsaXN0LCBoZWFkKTsKKwkJSU5JVF9MTElTVF9IRUFEKGxsaXN0KTsKKwl9Cit9CisKKy8qKgorICogbGxpc3RfZW50cnkgLSBnZXQgdGhlIHN0cnVjdCBmb3IgdGhpcyBlbnRyeQorICogQHB0cjoJdGhlICZzdHJ1Y3QgbGxpc3RfaGVhZCBwb2ludGVyLgorICogQHR5cGU6CXRoZSB0eXBlIG9mIHRoZSBzdHJ1Y3QgdGhpcyBpcyBlbWJlZGRlZCBpbi4KKyAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKi8KKyNkZWZpbmUgbGxpc3RfZW50cnkocHRyLCB0eXBlLCBtZW1iZXIpIFwKKwljb250YWluZXJfb2YocHRyLCB0eXBlLCBtZW1iZXIpCisKKy8qKgorICogbGxpc3RfZm9yX2VhY2gJLQlpdGVyYXRlIG92ZXIgYSBsbGlzdAorICogQHBvczoJdGhlICZzdHJ1Y3QgbGxpc3RfaGVhZCB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGxpc3QuCisgKi8KKyNkZWZpbmUgbGxpc3RfZm9yX2VhY2gocG9zLCBoZWFkKSBcCisJZm9yIChwb3MgPSAoaGVhZCktPm5leHQsIHByZWZldGNoKHBvcy0+bmV4dCk7IHBvcyAhPSAoaGVhZCk7IFwKKyAgICAgICAgCXBvcyA9IHBvcy0+bmV4dCwgcHJlZmV0Y2gocG9zLT5uZXh0KSkKKworLyoqCisgKiBfX2xsaXN0X2Zvcl9lYWNoCS0JaXRlcmF0ZSBvdmVyIGEgbGxpc3QKKyAqIEBwb3M6CXRoZSAmc3RydWN0IGxsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxsaXN0LgorICoKKyAqIFRoaXMgdmFyaWFudCBkaWZmZXJzIGZyb20gbGxpc3RfZm9yX2VhY2goKSBpbiB0aGF0IGl0J3MgdGhlCisgKiBzaW1wbGVzdCBwb3NzaWJsZSBsbGlzdCBpdGVyYXRpb24gY29kZSwgbm8gcHJlZmV0Y2hpbmcgaXMgZG9uZS4KKyAqIFVzZSB0aGlzIGZvciBjb2RlIHRoYXQga25vd3MgdGhlIGxsaXN0IHRvIGJlIHZlcnkgc2hvcnQgKGVtcHR5CisgKiBvciAxIGVudHJ5KSBtb3N0IG9mIHRoZSB0aW1lLgorICovCisjZGVmaW5lIF9fbGxpc3RfZm9yX2VhY2gocG9zLCBoZWFkKSBcCisJZm9yIChwb3MgPSAoaGVhZCktPm5leHQ7IHBvcyAhPSAoaGVhZCk7IHBvcyA9IHBvcy0+bmV4dCkKKworLyoqCisgKiBsbGlzdF9mb3JfZWFjaF9wcmV2CS0JaXRlcmF0ZSBvdmVyIGEgbGxpc3QgYmFja3dhcmRzCisgKiBAcG9zOgl0aGUgJnN0cnVjdCBsbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsbGlzdC4KKyAqLworI2RlZmluZSBsbGlzdF9mb3JfZWFjaF9wcmV2KHBvcywgaGVhZCkgXAorCWZvciAocG9zID0gKGhlYWQpLT5wcmV2LCBwcmVmZXRjaChwb3MtPnByZXYpOyBwb3MgIT0gKGhlYWQpOyBcCisgICAgICAgIAlwb3MgPSBwb3MtPnByZXYsIHByZWZldGNoKHBvcy0+cHJldikpCisgICAgICAgIAkKKy8qKgorICogbGxpc3RfZm9yX2VhY2hfc2FmZQktCWl0ZXJhdGUgb3ZlciBhIGxsaXN0IHNhZmUgYWdhaW5zdCByZW1vdmFsIG9mIGxsaXN0IGVudHJ5CisgKiBAcG9zOgl0aGUgJnN0cnVjdCBsbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KKyAqIEBuOgkJYW5vdGhlciAmc3RydWN0IGxsaXN0X2hlYWQgdG8gdXNlIGFzIHRlbXBvcmFyeSBzdG9yYWdlCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGxpc3QuCisgKi8KKyNkZWZpbmUgbGxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIG4sIGhlYWQpIFwKKwlmb3IgKHBvcyA9IChoZWFkKS0+bmV4dCwgbiA9IHBvcy0+bmV4dDsgcG9zICE9IChoZWFkKTsgXAorCQlwb3MgPSBuLCBuID0gcG9zLT5uZXh0KQorCisvKioKKyAqIGxsaXN0X2Zvcl9lYWNoX2VudHJ5CS0JaXRlcmF0ZSBvdmVyIGxsaXN0IG9mIGdpdmVuIHR5cGUKKyAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxsaXN0LgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqLworI2RlZmluZSBsbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsIGhlYWQsIG1lbWJlcikJCQkJXAorCWZvciAocG9zID0gbGxpc3RfZW50cnkoKGhlYWQpLT5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlciksCVwKKwkJICAgICBwcmVmZXRjaChwb3MtPm1lbWJlci5uZXh0KTsJCQlcCisJICAgICAmcG9zLT5tZW1iZXIgIT0gKGhlYWQpOyAJCQkJCVwKKwkgICAgIHBvcyA9IGxsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSwJXAorCQkgICAgIHByZWZldGNoKHBvcy0+bWVtYmVyLm5leHQpKQorCisvKioKKyAqIGxsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UgLSBpdGVyYXRlIGJhY2t3YXJkcyBvdmVyIGxsaXN0IG9mIGdpdmVuIHR5cGUuCisgKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsbGlzdC4KKyAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKi8KKyNkZWZpbmUgbGxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShwb3MsIGhlYWQsIG1lbWJlcikJCQlcCisJZm9yIChwb3MgPSBsbGlzdF9lbnRyeSgoaGVhZCktPnByZXYsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSwJXAorCQkgICAgIHByZWZldGNoKHBvcy0+bWVtYmVyLnByZXYpOwkJCVwKKwkgICAgICZwb3MtPm1lbWJlciAhPSAoaGVhZCk7IAkJCQkJXAorCSAgICAgcG9zID0gbGxpc3RfZW50cnkocG9zLT5tZW1iZXIucHJldiwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpLAlcCisJCSAgICAgcHJlZmV0Y2gocG9zLT5tZW1iZXIucHJldikpCisKKy8qKgorICogbGxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWUgLQlpdGVyYXRlIG92ZXIgbGxpc3Qgb2YgZ2l2ZW4gdHlwZQorICoJCQljb250aW51aW5nIGFmdGVyIGV4aXN0aW5nIHBvaW50CisgKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsbGlzdC4KKyAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKi8KKyNkZWZpbmUgbGxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWUocG9zLCBoZWFkLCBtZW1iZXIpIAkJXAorCWZvciAocG9zID0gbGxpc3RfZW50cnkocG9zLT5tZW1iZXIubmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpLAlcCisJCSAgICAgcHJlZmV0Y2gocG9zLT5tZW1iZXIubmV4dCk7CQkJXAorCSAgICAgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsJCQkJCVwKKwkgICAgIHBvcyA9IGxsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSwJXAorCQkgICAgIHByZWZldGNoKHBvcy0+bWVtYmVyLm5leHQpKQorCisvKioKKyAqIGxsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUgLSBpdGVyYXRlIG92ZXIgbGxpc3Qgb2YgZ2l2ZW4gdHlwZSBzYWZlIGFnYWluc3QgcmVtb3ZhbCBvZiBsbGlzdCBlbnRyeQorICogQHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCisgKiBAbjoJCWFub3RoZXIgdHlwZSAqIHRvIHVzZSBhcyB0ZW1wb3Jhcnkgc3RvcmFnZQorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxsaXN0LgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqLworI2RlZmluZSBsbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBvcywgbiwgaGVhZCwgbWVtYmVyKQkJCVwKKwlmb3IgKHBvcyA9IGxsaXN0X2VudHJ5KChoZWFkKS0+bmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpLAlcCisJCW4gPSBsbGlzdF9lbnRyeShwb3MtPm1lbWJlci5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlcik7CVwKKwkgICAgICZwb3MtPm1lbWJlciAhPSAoaGVhZCk7IAkJCQkJXAorCSAgICAgcG9zID0gbiwgbiA9IGxsaXN0X2VudHJ5KG4tPm1lbWJlci5uZXh0LCB0eXBlb2YoKm4pLCBtZW1iZXIpKQorCisvKioKKyAqIGxsaXN0X2Zvcl9lYWNoX3JjdQktCWl0ZXJhdGUgb3ZlciBhbiByY3UtcHJvdGVjdGVkIGxsaXN0CisgKiBAcG9zOgl0aGUgJnN0cnVjdCBsbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsbGlzdC4KKyAqLworI2RlZmluZSBsbGlzdF9mb3JfZWFjaF9yY3UocG9zLCBoZWFkKSBcCisJZm9yIChwb3MgPSAoaGVhZCktPm5leHQsIHByZWZldGNoKHBvcy0+bmV4dCk7IHBvcyAhPSAoaGVhZCk7IFwKKyAgICAgICAgCXBvcyA9IHBvcy0+bmV4dCwgKHsgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCk7IDA7fSksIHByZWZldGNoKHBvcy0+bmV4dCkpCisgICAgICAgIAkKKyNkZWZpbmUgX19sbGlzdF9mb3JfZWFjaF9yY3UocG9zLCBoZWFkKSBcCisJZm9yIChwb3MgPSAoaGVhZCktPm5leHQ7IHBvcyAhPSAoaGVhZCk7IFwKKyAgICAgICAgCXBvcyA9IHBvcy0+bmV4dCwgKHsgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCk7IDA7fSkpCisgICAgICAgIAkKKy8qKgorICogbGxpc3RfZm9yX2VhY2hfc2FmZV9yY3UJLQlpdGVyYXRlIG92ZXIgYW4gcmN1LXByb3RlY3RlZCBsbGlzdCBzYWZlCisgKgkJCQkJYWdhaW5zdCByZW1vdmFsIG9mIGxsaXN0IGVudHJ5CisgKiBAcG9zOgl0aGUgJnN0cnVjdCBsbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KKyAqIEBuOgkJYW5vdGhlciAmc3RydWN0IGxsaXN0X2hlYWQgdG8gdXNlIGFzIHRlbXBvcmFyeSBzdG9yYWdlCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGxpc3QuCisgKi8KKyNkZWZpbmUgbGxpc3RfZm9yX2VhY2hfc2FmZV9yY3UocG9zLCBuLCBoZWFkKSBcCisJZm9yIChwb3MgPSAoaGVhZCktPm5leHQsIG4gPSBwb3MtPm5leHQ7IHBvcyAhPSAoaGVhZCk7IFwKKwkJcG9zID0gbiwgKHsgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCk7IDA7fSksIG4gPSBwb3MtPm5leHQpCisKKy8qKgorICogbGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1CS0JaXRlcmF0ZSBvdmVyIHJjdSBsbGlzdCBvZiBnaXZlbiB0eXBlCisgKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsbGlzdC4KKyAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKi8KKyNkZWZpbmUgbGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHBvcywgaGVhZCwgbWVtYmVyKQkJCVwKKwlmb3IgKHBvcyA9IGxsaXN0X2VudHJ5KChoZWFkKS0+bmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpLAlcCisJCSAgICAgcHJlZmV0Y2gocG9zLT5tZW1iZXIubmV4dCk7CQkJXAorCSAgICAgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsgCQkJCQlcCisJICAgICBwb3MgPSBsbGlzdF9lbnRyeShwb3MtPm1lbWJlci5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlciksCVwKKwkJICAgICAoeyBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKTsgMDt9KSwJCVwKKwkJICAgICBwcmVmZXRjaChwb3MtPm1lbWJlci5uZXh0KSkKKworCisvKioKKyAqIGxsaXN0X2Zvcl9lYWNoX2NvbnRpbnVlX3JjdQktCWl0ZXJhdGUgb3ZlciBhbiByY3UtcHJvdGVjdGVkIGxsaXN0IAorICoJCQljb250aW51aW5nIGFmdGVyIGV4aXN0aW5nIHBvaW50LgorICogQHBvczoJdGhlICZzdHJ1Y3QgbGxpc3RfaGVhZCB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGxpc3QuCisgKi8KKyNkZWZpbmUgbGxpc3RfZm9yX2VhY2hfY29udGludWVfcmN1KHBvcywgaGVhZCkgXAorCWZvciAoKHBvcykgPSAocG9zKS0+bmV4dCwgcHJlZmV0Y2goKHBvcyktPm5leHQpOyAocG9zKSAhPSAoaGVhZCk7IFwKKyAgICAgICAgCShwb3MpID0gKHBvcyktPm5leHQsICh7IHNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpOyAwO30pLCBwcmVmZXRjaCgocG9zKS0+bmV4dCkpCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2xvZ2dpbmcuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbG9nZ2luZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlODI5NTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2xvZ2dpbmcuaApAQCAtMCwwICsxLDEzNSBAQAorI2lmbmRlZiBfT1NNT0NPUkVfTE9HR0lOR19ICisjZGVmaW5lIF9PU01PQ09SRV9MT0dHSU5HX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisKKyNkZWZpbmUgTE9HX01BWF9DQVRFR09SWQkzMgorI2RlZmluZSBMT0dfTUFYX0NUWAkJOAorI2RlZmluZSBMT0dfTUFYX0ZJTFRFUlMJOAorCisjZGVmaW5lIERFQlVHCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBERUJVR1Aoc3MsIGZtdCwgYXJncy4uLikgbG9ncChzcywgX19GSUxFX18sIF9fTElORV9fLCAwLCBmbXQsICMjIGFyZ3MpCisjZGVmaW5lIERFQlVHUEMoc3MsIGZtdCwgYXJncy4uLikgbG9ncChzcywgX19GSUxFX18sIF9fTElORV9fLCAxLCBmbXQsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBERUJVR1AoeHNzLCBmbXQsIGFyZ3MuLi4pCisjZGVmaW5lIERFQlVHUEMoc3MsIGZtdCwgYXJncy4uLikKKyNlbmRpZgorCisjZGVmaW5lIHN0YXRpY19hc3NlcnQoZXhwLCBuYW1lKSB0eXBlZGVmIGludCBkdW1teSMjbmFtZSBbKGV4cCkgPyAxIDogLTFdOworCitjaGFyICpoZXhkdW1wKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbik7Cit2b2lkIGxvZ3AodW5zaWduZWQgaW50IHN1YnN5cywgY2hhciAqZmlsZSwgaW50IGxpbmUsIGludCBjb250LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA1LCA2KSkpOworCisvKiBuZXcgbG9nZ2luZyBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgTE9HUChzcywgbGV2ZWwsIGZtdCwgYXJncy4uLikgXAorCWxvZ3AyKHNzLCBsZXZlbCwgX19GSUxFX18sIF9fTElORV9fLCAwLCBmbXQsICMjYXJncykKKyNkZWZpbmUgTE9HUEMoc3MsIGxldmVsLCBmbXQsIGFyZ3MuLi4pIFwKKwlsb2dwMihzcywgbGV2ZWwsIF9fRklMRV9fLCBfX0xJTkVfXywgMSwgZm10LCAjI2FyZ3MpCisKKy8qIGRpZmZlcmVudCBsZXZlbHMgKi8KKyNkZWZpbmUgTE9HTF9ERUJVRwkxCS8qIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dMX0lORk8JMworI2RlZmluZSBMT0dMX05PVElDRQk1CS8qIGFibm9ybWFsL3VuZXhwZWN0ZWQgY29uZGl0aW9uICovCisjZGVmaW5lIExPR0xfRVJST1IJNwkvKiBlcnJvciBjb25kaXRpb24sIHJlcXVpcmVzIHVzZXIgYWN0aW9uICovCisjZGVmaW5lIExPR0xfRkFUQUwJOAkvKiBmYXRhbCwgcHJvZ3JhbSBhYm9ydGVkICovCisKKyNkZWZpbmUgTE9HX0ZJTFRFUl9BTEwJMHgwMDAxCisKK3N0cnVjdCBsb2dfY2F0ZWdvcnkgeworCXVpbnQ4X3QgbG9nbGV2ZWw7CisJdWludDhfdCBlbmFibGVkOworfTsKKworc3RydWN0IGxvZ19pbmZvX2NhdCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpjb2xvcjsKKwljb25zdCBjaGFyICpkZXNjcmlwdGlvbjsKKwl1aW50OF90IGxvZ2xldmVsOworCXVpbnQ4X3QgZW5hYmxlZDsKK307CisKKy8qIGxvZyBjb250ZXh0IGluZm9ybWF0aW9uLCBwYXNzZWQgdG8gZmlsdGVyICovCitzdHJ1Y3QgbG9nX2NvbnRleHQgeworCXZvaWQgKmN0eFtMT0dfTUFYX0NUWCsxXTsKK307CisKK3N0cnVjdCBsb2dfdGFyZ2V0OworCit0eXBlZGVmIGludCBsb2dfZmlsdGVyKGNvbnN0IHN0cnVjdCBsb2dfY29udGV4dCAqY3R4LAorCQkgICAgICAgc3RydWN0IGxvZ190YXJnZXQgKnRhcmdldCk7CisKK3N0cnVjdCBsb2dfaW5mbyB7CisJLyogZmlsdGVyIGNhbGxiYWNrIGZ1bmN0aW9uICovCisJbG9nX2ZpbHRlciAqZmlsdGVyX2ZuOworCisJLyogcGVyLWNhdGVnb3J5IGluZm9ybWF0aW9uICovCisJY29uc3Qgc3RydWN0IGxvZ19pbmZvX2NhdCAqY2F0OworCXVuc2lnbmVkIGludCBudW1fY2F0OworfTsKKworc3RydWN0IGxvZ190YXJnZXQgeworICAgICAgICBzdHJ1Y3QgbGxpc3RfaGVhZCBlbnRyeTsKKworCWludCBmaWx0ZXJfbWFwOworCXZvaWQgKmZpbHRlcl9kYXRhW0xPR19NQVhfRklMVEVSUysxXTsKKworCXN0cnVjdCBsb2dfY2F0ZWdvcnkgY2F0ZWdvcmllc1tMT0dfTUFYX0NBVEVHT1JZKzFdOworCXVpbnQ4X3QgbG9nbGV2ZWw7CisJaW50IHVzZV9jb2xvcjoxOworCWludCBwcmludF90aW1lc3RhbXA6MTsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCUZJTEUgKm91dDsKKwkJfSB0Z3Rfc3Rkb3V0OworCisJCXN0cnVjdCB7CisJCQlpbnQgcHJpb3JpdHk7CisJCX0gdGd0X3N5c2xvZzsKKworCQlzdHJ1Y3QgeworCQkJdm9pZCAqdnR5OworCQl9IHRndF92dHk7CisJfTsKKworICAgICAgICB2b2lkICgqb3V0cHV0KSAoc3RydWN0IGxvZ190YXJnZXQgKnRhcmdldCwgY29uc3QgY2hhciAqc3RyaW5nKTsKK307CisKKy8qIHVzZSB0aGUgYWJvdmUgbWFjcm9zICovCit2b2lkIGxvZ3AyKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBsZXZlbCwgY2hhciAqZmlsZSwKKwkgICBpbnQgbGluZSwgaW50IGNvbnQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorCQkJCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgNiwgNykpKTsKK3ZvaWQgbG9nX2luaXQoY29uc3Qgc3RydWN0IGxvZ19pbmZvICpjYXQpOworCisvKiBjb250ZXh0IG1hbmFnZW1lbnQgKi8KK3ZvaWQgbG9nX3Jlc2V0X2NvbnRleHQodm9pZCk7CitpbnQgbG9nX3NldF9jb250ZXh0KHVpbnQ4X3QgY3R4LCB2b2lkICp2YWx1ZSk7CisKKy8qIGZpbHRlciBvbiB0aGUgdGFyZ2V0cyAqLwordm9pZCBsb2dfc2V0X2FsbF9maWx0ZXIoc3RydWN0IGxvZ190YXJnZXQgKnRhcmdldCwgaW50KTsKKwordm9pZCBsb2dfc2V0X3VzZV9jb2xvcihzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyZ2V0LCBpbnQpOwordm9pZCBsb2dfc2V0X3ByaW50X3RpbWVzdGFtcChzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyZ2V0LCBpbnQpOwordm9pZCBsb2dfc2V0X2xvZ19sZXZlbChzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyZ2V0LCBpbnQgbG9nX2xldmVsKTsKK3ZvaWQgbG9nX3BhcnNlX2NhdGVnb3J5X21hc2soc3RydWN0IGxvZ190YXJnZXQgKnRhcmdldCwgY29uc3QgY2hhciogbWFzayk7CitpbnQgbG9nX3BhcnNlX2xldmVsKGNvbnN0IGNoYXIgKmx2bCk7Citjb25zdCBjaGFyICpsb2dfbGV2ZWxfc3RyKHVuc2lnbmVkIGludCBsdmwpOworaW50IGxvZ19wYXJzZV9jYXRlZ29yeShjb25zdCBjaGFyICpjYXRlZ29yeSk7Cit2b2lkIGxvZ19zZXRfY2F0ZWdvcnlfZmlsdGVyKHN0cnVjdCBsb2dfdGFyZ2V0ICp0YXJnZXQsIGludCBjYXRlZ29yeSwKKwkJCSAgICAgICBpbnQgZW5hYmxlLCBpbnQgbGV2ZWwpOworCisvKiBtYW5hZ2VtZW50IG9mIHRoZSB0YXJnZXRzICovCitzdHJ1Y3QgbG9nX3RhcmdldCAqbG9nX3RhcmdldF9jcmVhdGUodm9pZCk7CitzdHJ1Y3QgbG9nX3RhcmdldCAqbG9nX3RhcmdldF9jcmVhdGVfc3RkZXJyKHZvaWQpOwordm9pZCBsb2dfYWRkX3RhcmdldChzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyZ2V0KTsKK3ZvaWQgbG9nX2RlbF90YXJnZXQoc3RydWN0IGxvZ190YXJnZXQgKnRhcmdldCk7CisKKy8qIEdlcm5lcmF0ZSBjb21tYW5kIGFyZ3VtZW50IHN0cmluZ3MgZm9yIFZUWSB1c2UgKi8KK2NvbnN0IGNoYXIgKmxvZ192dHlfY2F0ZWdvcnlfc3RyaW5nKHN0cnVjdCBsb2dfaW5mbyAqaW5mbyk7Citjb25zdCBjaGFyICpsb2dfdnR5X2xldmVsX3N0cmluZyhzdHJ1Y3QgbG9nX2luZm8gKmluZm8pOworCisjZW5kaWYgLyogX09TTU9DT1JFX0xPR0dJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9tbmNjLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL21uY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDk0YmI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9tbmNjLmgKQEAgLTAsMCArMSw3MSBAQAorI2lmbmRlZiBfT1NNT0NPUkVfTU5DQ19ICisjZGVmaW5lIF9PU01PQ09SRV9NTkNDX0gKKworI2RlZmluZSBHU01fTUFYX0ZBQ0lMSVRZICAgICAgIDEyOAorI2RlZmluZSBHU01fTUFYX1NTVkVSU0lPTiAgICAgIDEyOAorI2RlZmluZSBHU01fTUFYX1VTRVJVU0VSICAgICAgIDEyOAorCisvKiBFeHBhbmRlZCBmaWVsZHMgZnJvbSBHU00gVFMgMDQuMDgsIFRhYmxlIDEwLjUuMTAyICovCitzdHJ1Y3QgZ3NtX21uY2NfYmVhcmVyX2NhcCB7CisJaW50CQl0cmFuc2ZlcjsJLyogSW5mb3JtYXRpb24gVHJhbnNmZXIgQ2FwYWJpbGl0eSAqLworCWludCAJCW1vZGU7CQkvKiBUcmFuc2ZlciBNb2RlICovCisJaW50CQljb2Rpbmc7CQkvKiBDb2RpbmcgU3RhbmRhcmQgKi8KKwlpbnQJCXJhZGlvOwkJLyogUmFkaW8gQ2hhbm5lbCBSZXF1aXJlbWVudCAqLworCWludAkJc3BlZWNoX2N0bTsJLyogQ1RNIHRleHQgdGVsZXBob255IGluZGljYXRpb24gKi8KKwlpbnQJCXNwZWVjaF92ZXJbOF07CS8qIFNwZWVjaCB2ZXJzaW9uIGluZGljYXRpb24gKi8KK307CisKK3N0cnVjdCBnc21fbW5jY19udW1iZXIgeworCWludCAJCXR5cGU7CisJaW50IAkJcGxhbjsKKwlpbnQJCXByZXNlbnQ7CisJaW50CQlzY3JlZW47CisJY2hhcgkJbnVtYmVyWzMzXTsKK307CisKK3N0cnVjdCBnc21fbW5jY19jYXVzZSB7CisJaW50CQlsb2NhdGlvbjsKKwlpbnQJCWNvZGluZzsKKwlpbnQJCXJlYzsKKwlpbnQJCXJlY192YWw7CisJaW50CQl2YWx1ZTsKKwlpbnQJCWRpYWdfbGVuOworCWNoYXIJCWRpYWdbMzJdOworfTsKKworc3RydWN0IGdzbV9tbmNjX3VzZXJ1c2VyIHsKKwlpbnQJCXByb3RvOworCWNoYXIJCWluZm9bR1NNX01BWF9VU0VSVVNFUiArIDFdOyAvKiArIHRlcm1pbmF0aW9uIGNoYXIgKi8KK307CisKK3N0cnVjdCBnc21fbW5jY19wcm9ncmVzcyB7CisJaW50CQljb2Rpbmc7CisJaW50CQlsb2NhdGlvbjsKKwlpbnQgCQlkZXNjcjsKK307CisKK3N0cnVjdCBnc21fbW5jY19mYWNpbGl0eSB7CisJaW50CQlsZW47CisJY2hhcgkJaW5mb1tHU01fTUFYX0ZBQ0lMSVRZXTsKK307CisKK3N0cnVjdCBnc21fbW5jY19zc3ZlcnNpb24geworCWludAkJbGVuOworCWNoYXIJCWluZm9bR1NNX01BWF9TU1ZFUlNJT05dOworfTsKKworc3RydWN0IGdzbV9tbmNjX2NjY2FwIHsKKwlpbnQJCWR0bWY7CisJaW50CQlwY3A7Cit9OworCitlbnVtIHsKKwlHU01fTU5DQ19CQ0FQX1NQRUVDSAk9IDAsCisJR1NNX01OQ0NfQkNBUF9VTlJfRElHCT0gMSwKKwlHU01fTU5DQ19CQ0FQX0FVRElPCT0gMiwKKwlHU01fTU5DQ19CQ0FQX0ZBWF9HMwk9IDMsCisJR1NNX01OQ0NfQkNBUF9PVEhFUl9JVEMgPSA1LAorCUdTTV9NTkNDX0JDQVBfUkVTRVJWRUQJPSA3LAorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL21zZ2IuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbXNnYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NDFkYzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL21zZ2IuaApAQCAtMCwwICsxLDE2NSBAQAorI2lmbmRlZiBfTVNHQl9ICisjZGVmaW5lIF9NU0dCX0gKKworLyogKEMpIDIwMDggYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAibGludXhsaXN0LmgiCisKK3N0cnVjdCBtc2diIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCisJLyogUGFydCBvZiB3aGljaCBUUlggbG9naWNhbCBjaGFubmVsIHdlIHdlcmUgcmVjZWl2ZWQgLyB0cmFuc21pdHRlZCAqLworCS8qIEZJWE1FOiBtb3ZlIHRoZW0gaW50byB0aGUgY29udHJvbCBidWZmZXIgKi8KKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKworCS8qIHRoZSBMYXllcjEgaGVhZGVyIChpZiBhbnkpICovCisJdW5zaWduZWQgY2hhciAqbDFoOworCS8qIHRoZSBBLWJpcyBsYXllciAyIGhlYWRlcjogT01MLCBSU0woUkxMKSwgTlMgKi8KKwl1bnNpZ25lZCBjaGFyICpsMmg7CisJLyogdGhlIGxheWVyIDMgaGVhZGVyLiBGb3IgT01MOiBGT007IFJTTDogMDQuMDg7IEdQUlM6IEJTU0dQICovCisJdW5zaWduZWQgY2hhciAqbDNoOworCS8qIHRoZSBsYXllciA0IGhlYWRlciAqLworCXVuc2lnbmVkIGNoYXIgKmw0aDsKKworCS8qIHRoZSAnY29udHJvbCBidWZmZXInLCBsYXJnZSBlbm91Z2ggdG8gY29udGFpbiA1IHBvaW50ZXJzICovCisJdW5zaWduZWQgbG9uZyBjYls1XTsKKworCXVpbnQxNl90IGRhdGFfbGVuOworCXVpbnQxNl90IGxlbjsKKworCXVuc2lnbmVkIGNoYXIgKmhlYWQ7CisJdW5zaWduZWQgY2hhciAqdGFpbDsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCXVuc2lnbmVkIGNoYXIgX2RhdGFbMF07Cit9OworCitleHRlcm4gc3RydWN0IG1zZ2IgKm1zZ2JfYWxsb2ModWludDE2X3Qgc2l6ZSwgY29uc3QgY2hhciAqbmFtZSk7CitleHRlcm4gdm9pZCBtc2diX2ZyZWUoc3RydWN0IG1zZ2IgKm0pOworZXh0ZXJuIHZvaWQgbXNnYl9lbnF1ZXVlKHN0cnVjdCBsbGlzdF9oZWFkICpxdWV1ZSwgc3RydWN0IG1zZ2IgKm1zZyk7CitleHRlcm4gc3RydWN0IG1zZ2IgKm1zZ2JfZGVxdWV1ZShzdHJ1Y3QgbGxpc3RfaGVhZCAqcXVldWUpOworZXh0ZXJuIHZvaWQgbXNnYl9yZXNldChzdHJ1Y3QgbXNnYiAqbSk7CisKKyNkZWZpbmUgbXNnYl9sMShtKQkoKHZvaWQgKikobS0+bDFoKSkKKyNkZWZpbmUgbXNnYl9sMihtKQkoKHZvaWQgKikobS0+bDJoKSkKKyNkZWZpbmUgbXNnYl9sMyhtKQkoKHZvaWQgKikobS0+bDNoKSkKKyNkZWZpbmUgbXNnYl9zbXMobSkJKCh2b2lkICopKG0tPmw0aCkpCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1zZ2JfbDFsZW4oY29uc3Qgc3RydWN0IG1zZ2IgKm1zZ2IpCit7CisJcmV0dXJuIG1zZ2ItPnRhaWwgLSAodWludDhfdCAqKW1zZ2JfbDEobXNnYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1zZ2JfbDJsZW4oY29uc3Qgc3RydWN0IG1zZ2IgKm1zZ2IpCit7CisJcmV0dXJuIG1zZ2ItPnRhaWwgLSAodWludDhfdCAqKW1zZ2JfbDIobXNnYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1zZ2JfbDNsZW4oY29uc3Qgc3RydWN0IG1zZ2IgKm1zZ2IpCit7CisJcmV0dXJuIG1zZ2ItPnRhaWwgLSAodWludDhfdCAqKW1zZ2JfbDMobXNnYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1zZ2JfaGVhZGxlbihjb25zdCBzdHJ1Y3QgbXNnYiAqbXNnYikKK3sKKwlyZXR1cm4gbXNnYi0+bGVuIC0gbXNnYi0+ZGF0YV9sZW47Cit9CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgKm1zZ2JfcHV0KHN0cnVjdCBtc2diICptc2diLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnRtcCA9IG1zZ2ItPnRhaWw7CisJbXNnYi0+dGFpbCArPSBsZW47CisJbXNnYi0+bGVuICs9IGxlbjsKKwlyZXR1cm4gdG1wOworfQorc3RhdGljIGlubGluZSB2b2lkIG1zZ2JfcHV0X3U4KHN0cnVjdCBtc2diICptc2diLCB1aW50OF90IHdvcmQpCit7CisJdWludDhfdCAqc3BhY2UgPSBtc2diX3B1dChtc2diLCAxKTsKKwlzcGFjZVswXSA9IHdvcmQgJiAweEZGOworfQorc3RhdGljIGlubGluZSB2b2lkIG1zZ2JfcHV0X3UxNihzdHJ1Y3QgbXNnYiAqbXNnYiwgdWludDE2X3Qgd29yZCkKK3sKKwl1aW50OF90ICpzcGFjZSA9IG1zZ2JfcHV0KG1zZ2IsIDIpOworCXNwYWNlWzBdID0gd29yZCA+PiA4ICYgMHhGRjsKKwlzcGFjZVsxXSA9IHdvcmQgJiAweEZGOworfQorc3RhdGljIGlubGluZSB2b2lkIG1zZ2JfcHV0X3UzMihzdHJ1Y3QgbXNnYiAqbXNnYiwgdWludDMyX3Qgd29yZCkKK3sKKwl1aW50OF90ICpzcGFjZSA9IG1zZ2JfcHV0KG1zZ2IsIDQpOworCXNwYWNlWzBdID0gd29yZCA+PiAyNCAmIDB4RkY7CisJc3BhY2VbMV0gPSB3b3JkID4+IDE2ICYgMHhGRjsKKwlzcGFjZVsyXSA9IHdvcmQgPj4gOCAmIDB4RkY7CisJc3BhY2VbM10gPSB3b3JkICYgMHhGRjsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciAqbXNnYl9nZXQoc3RydWN0IG1zZ2IgKm1zZ2IsIHVuc2lnbmVkIGludCBsZW4pCit7CisJdW5zaWduZWQgY2hhciAqdG1wID0gbXNnYi0+ZGF0YTsKKwltc2diLT5kYXRhICs9IGxlbjsKKwltc2diLT5sZW4gLT0gbGVuOworCXJldHVybiB0bXA7Cit9CitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgbXNnYl9nZXRfdTgoc3RydWN0IG1zZ2IgKm1zZ2IpCit7CisJdWludDhfdCAqc3BhY2UgPSBtc2diX2dldChtc2diLCAxKTsKKwlyZXR1cm4gc3BhY2VbMF07Cit9CitzdGF0aWMgaW5saW5lIHVpbnQxNl90IG1zZ2JfZ2V0X3UxNihzdHJ1Y3QgbXNnYiAqbXNnYikKK3sKKwl1aW50OF90ICpzcGFjZSA9IG1zZ2JfZ2V0KG1zZ2IsIDIpOworCXJldHVybiBzcGFjZVswXSA8PCA4IHwgc3BhY2VbMV07Cit9CitzdGF0aWMgaW5saW5lIHVpbnQzMl90IG1zZ2JfZ2V0X3UzMihzdHJ1Y3QgbXNnYiAqbXNnYikKK3sKKwl1aW50OF90ICpzcGFjZSA9IG1zZ2JfZ2V0KG1zZ2IsIDQpOworCXJldHVybiBzcGFjZVswXSA8PCAyNCB8IHNwYWNlWzFdIDw8IDE2IHwgc3BhY2VbMl0gPDwgOCB8IHNwYWNlWzNdOworfQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyICptc2diX3B1c2goc3RydWN0IG1zZ2IgKm1zZ2IsIHVuc2lnbmVkIGludCBsZW4pCit7CisJbXNnYi0+ZGF0YSAtPSBsZW47CisJbXNnYi0+bGVuICs9IGxlbjsKKwlyZXR1cm4gbXNnYi0+ZGF0YTsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciAqbXNnYl9wdWxsKHN0cnVjdCBtc2diICptc2diLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCW1zZ2ItPmxlbiAtPSBsZW47CisJcmV0dXJuIG1zZ2ItPmRhdGEgKz0gbGVuOworfQorc3RhdGljIGlubGluZSBpbnQgbXNnYl90YWlscm9vbShjb25zdCBzdHJ1Y3QgbXNnYiAqbXNnYikKK3sKKwlyZXR1cm4gKG1zZ2ItPmhlYWQgKyBtc2diLT5kYXRhX2xlbikgLSBtc2diLT50YWlsOworfQorCisvKiBpbmNyZWFzZSB0aGUgaGVhZHJvb20gb2YgYW4gZW1wdHkgbXNnYiwgcmVkdWNpbmcgdGhlIHRhaWxyb29tICovCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnYl9yZXNlcnZlKHN0cnVjdCBtc2diICptc2csIGludCBsZW4pCit7CisJbXNnLT5kYXRhICs9IGxlbjsKKwltc2ctPnRhaWwgKz0gbGVuOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtc2diICptc2diX2FsbG9jX2hlYWRyb29tKGludCBzaXplLCBpbnQgaGVhZHJvb20sCisJCQkJCQljb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jKHNpemUsIG5hbWUpOworCWlmIChtc2cpCisJCW1zZ2JfcmVzZXJ2ZShtc2csIGhlYWRyb29tKTsKKwlyZXR1cm4gbXNnOworfQorCisjZW5kaWYgLyogX01TR0JfSCAqLwpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9NYWtlZmlsZS5hbSBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU3OTUwZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzIEBACitvc21vY29yZV9wcm90b19IRUFERVJTID0gZ3NtXzA0XzA4LmggZ3NtXzA0XzExLmggZ3NtXzA0XzgwLmggZ3NtXzA4XzU4LmggZ3NtXzEyXzIxLmggZ3NtXzA4XzA4LmgKKworb3Ntb2NvcmVfcHJvdG9kaXIgPSAkKGluY2x1ZGVkaXIpL29zbW9jb3JlL3Byb3RvY29sCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8wOC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfMDguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDAyMzc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfMDguaApAQCAtMCwwICsxLDc2MCBAQAorI2lmbmRlZiBQUk9UT19HU01fMDRfMDhfSAorI2RlZmluZSBQUk9UT19HU01fMDRfMDhfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIEdTTSBUUyAwNC4wOCAgZGVmaW5pdGlvbnMgKi8KK3N0cnVjdCBnc21fbGNoYW47CisKK3N0cnVjdCBnc200OF9jbGFzc21hcmsxIHsKKwl1aW50OF90IHNwYXJlOjEsCisJCSByZXZfbGV2ZWw6MiwKKwkJIGVzX2luZDoxLAorCQkgYTVfMToxLAorCQkgcHdyX2xldjozOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIENoYXB0ZXIgMTAuNS4yLjUgKi8KK3N0cnVjdCBnc200OF9jaGFuX2Rlc2MgeworCXVpbnQ4X3QgY2hhbl9ucjsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1aW50OF90IG1haW9faGlnaDo0LAorCQkJCSBoOjEsCisJCQkJIHRzYzozOworCQkJdWludDhfdCBoc246NiwKKwkJCQkgbWFpb19sb3c6MjsKKwkJfSBoMTsKKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3QgYXJmY25faGlnaDoyLAorCQkJCSBzcGFyZToyLAorCQkJCSBoOjEsCisJCQkJIHRzYzozOworCQkJdWludDhfdCBhcmZjbl9sb3c7CisJCX0gaDA7CisJfTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBDaGFwdGVyIDEwLjUuMi4yMWFhICovCitzdHJ1Y3QgZ3NtNDhfbXVsdGlfcmF0ZV9jb25mIHsKKwl1aW50OF90IHNtb2QgOiAyLAorCQkgc3BhcmU6IDEsCisJCSBpY21pIDogMSwKKwkJIG5zY2IgOiAxLAorCQkgdmVyIDogMzsKKwl1aW50OF90IG00Xzc1IDogMSwKKwkJIG01XzE1IDogMSwKKwkJIG01XzkwIDogMSwKKwkJIG02XzcwIDogMSwKKwkJIG03XzQwIDogMSwKKwkJIG03Xzk1IDogMSwKKwkJIG0xMF8yIDogMSwKKwkJIG0xMl8yIDogMTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIENoYXB0ZXIgMTAuNS4yLjMwICovCitzdHJ1Y3QgZ3NtNDhfcmVxX3JlZiB7CisJdWludDhfdCByYTsKKwl1aW50OF90IHQzX2hpZ2g6MywKKwkJIHQxXzo1OworCXVpbnQ4X3QgdDI6NSwKKwkJIHQzX2xvdzozOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qCisgKiBDaGFwdGVyIDkuMS41LzkuMS42CisgKgorICogRm9yIDkuMS42IHRoZSBjaGFuX2Rlc2MgaGFzIHRoZSBtZWFuaW5nIG9mIDEwLjUuMi41YQorICovCitzdHJ1Y3QgZ3NtNDhfY2hhbl9tb2RlX21vZGlmeSB7CisJc3RydWN0IGdzbTQ4X2NoYW5fZGVzYyBjaGFuX2Rlc2M7CisJdWludDhfdCBtb2RlOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK2VudW0gZ3NtNDhfY2hhbl9tb2RlIHsKKwlHU000OF9DTU9ERV9TSUdOCT0gMHgwMCwKKwlHU000OF9DTU9ERV9TUEVFQ0hfVjEJPSAweDAxLAorCUdTTTQ4X0NNT0RFX1NQRUVDSF9FRlIJPSAweDIxLAorCUdTTTQ4X0NNT0RFX1NQRUVDSF9BTVIJPSAweDQxLAorCUdTTTQ4X0NNT0RFX0RBVEFfMTRrNQk9IDB4MGYsCisJR1NNNDhfQ01PREVfREFUQV8xMmswCT0gMHgwMywKKwlHU000OF9DTU9ERV9EQVRBXzZrMAk9IDB4MGIsCisJR1NNNDhfQ01PREVfREFUQV8zazYJPSAweDIzLAorfTsKKworLyogQ2hhcHRlciA5LjEuMiAqLworc3RydWN0IGdzbTQ4X2Fzc19jbWQgeworCS8qIFNlbWFudGljIGlzIGZyb20gMTAuNS4yLjVhICovCisJc3RydWN0IGdzbTQ4X2NoYW5fZGVzYyBjaGFuX2Rlc2M7CisJdWludDhfdCBwb3dlcl9jb21tYW5kOworCXVpbnQ4X3QgZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIENoYXB0ZXIgMTAuNS4yLjIgKi8KK3N0cnVjdCBnc200OF9jZWxsX2Rlc2MgeworCXVpbnQ4X3QgYmNjOjMsCisJCSBuY2M6MywKKwkJIGFyZmNuX2hpOjI7CisJdWludDhfdCBhcmZjbl9sbzsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIENoYXB0ZXIgOS4xLjE1ICovCitzdHJ1Y3QgZ3NtNDhfaG9fY21kIHsKKwlzdHJ1Y3QgZ3NtNDhfY2VsbF9kZXNjIGNlbGxfZGVzYzsKKwlzdHJ1Y3QgZ3NtNDhfY2hhbl9kZXNjIGNoYW5fZGVzYzsKKwl1aW50OF90IGhvX3JlZjsKKwl1aW50OF90IHBvd2VyX2NvbW1hbmQ7CisJdWludDhfdCBkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogQ2hhcHRlciA5LjEuMTggKi8KK3N0cnVjdCBnc200OF9pbW1fYXNzIHsKKwl1aW50OF90IGwyX3BsZW47CisJdWludDhfdCBwcm90b19kaXNjcjsKKwl1aW50OF90IG1zZ190eXBlOworCXVpbnQ4X3QgcGFnZV9tb2RlOworCXN0cnVjdCBnc200OF9jaGFuX2Rlc2MgY2hhbl9kZXNjOworCXN0cnVjdCBnc200OF9yZXFfcmVmIHJlcV9yZWY7CisJdWludDhfdCB0aW1pbmdfYWR2YW5jZTsKKwl1aW50OF90IG1vYl9hbGxvY19sZW47CisJdWludDhfdCBtb2JfYWxsb2NbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogQ2hhcHRlciA5LjEuMjUgKi8KK3N0cnVjdCBnc200OF9wYWdfcmVzcCB7CisJdWludDhfdCBzcGFyZTo0LAorCQkga2V5X3NlcTo0OworCXVpbnQzMl90IGNsYXNzbWFyazI7CisJdWludDhfdCBtaV9sZW47CisJdWludDhfdCBtaVswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBDaGFwdGVyIDEwLjUuMS4zICovCitzdHJ1Y3QgZ3NtNDhfbG9jX2FyZWFfaWQgeworCXVpbnQ4X3QgZGlnaXRzWzNdOwkvKiBCQ0QhICovCisJdWludDE2X3QgbGFjOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFNlY3Rpb24gOS4yLjIgKi8KK3N0cnVjdCBnc200OF9hdXRoX3JlcSB7CisJdWludDhfdCBrZXlfc2VxOjQsCisJICAgICAgICAgc3BhcmU6NDsKKwl1aW50OF90IHJhbmRbMTZdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFNlY3Rpb24gOS4yLjE1ICovCitzdHJ1Y3QgZ3NtNDhfbG9jX3VwZF9yZXEgeworCXVpbnQ4X3QgdHlwZTo0LAorCQkga2V5X3NlcTo0OworCXN0cnVjdCBnc200OF9sb2NfYXJlYV9pZCBsYWk7CisJc3RydWN0IGdzbTQ4X2NsYXNzbWFyazEgY2xhc3NtYXJrMTsKKwl1aW50OF90IG1pX2xlbjsKKwl1aW50OF90IG1pWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFNlY3Rpb24gMTAuMSAqLworc3RydWN0IGdzbTQ4X2hkciB7CisJdWludDhfdCBwcm90b19kaXNjcjsKKwl1aW50OF90IG1zZ190eXBlOworCXVpbnQ4X3QgZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBTZWN0aW9uIDkuMS4zeCBTeXN0ZW0gaW5mb3JtYXRpb24gVHlwZSBoZWFkZXIgKi8KK3N0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV9oZWFkZXIgeworCXVpbnQ4X3QgbDJfcGxlbjsKKwl1aW50OF90IHJyX3Byb3RvY29sX2Rpc2NyaW1pbmF0b3IgOjQsCisJCXNraXBfaW5kaWNhdG9yOjQ7IAorCXVpbnQ4X3Qgc3lzdGVtX2luZm9ybWF0aW9uOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBnc200OF9yYWNoX2NvbnRyb2wgeworCXVpbnQ4X3QgcmUgOjEsCisJCSBjZWxsX2JhciA6MSwKKwkJIHR4X2ludGVnZXIgOjQsCisJCSBtYXhfdHJhbnMgOjI7CisJdWludDhfdCB0MjsKKwl1aW50OF90IHQzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFNlY3Rpb24gMTAuNS4yLjQgQ2VsbCBTZWxlY3Rpb24gUGFyYW1ldGVycyAqLworc3RydWN0IGdzbTQ4X2NlbGxfc2VsX3BhciB7CisJdWludDhfdCBtc190eHB3cl9tYXhfY2NjaDo1LAkvKiBHU00gMDUuMDggTVMtVFhQV1ItTUFYLUNDQ0ggKi8KKwkJIGNlbGxfcmVzZWxfaHlzdDozOwkvKiBHU00gMDUuMDggQ0VMTC1SRVNFTEVDVC1IWVNURVJFU0lTICovCisJdWludDhfdCByeGxldl9hY2NfbWluOjYsCS8qIEdTTSAwNS4wOCBSWExFVi1BQ0NFU1MtTUlOICovCisJCSBuZWNpOjEsCisJCSBhY3M6MTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBTZWN0aW9uIDEwLjUuMi4xMSBDb250cm9sIENoYW5uZWwgRGVzY3JpcHRpb24gLCBGaWd1cmUgMTAuNS4zMyAqLworc3RydWN0IGdzbTQ4X2NvbnRyb2xfY2hhbm5lbF9kZXNjciB7CisJdWludDhfdCBjY2NoX2NvbmYgOjMsCisJCWJzX2FnX2Jsa3NfcmVzIDozLAorCQlhdHQgOjEsCisJCXNwYXJlMSA6MTsKKwl1aW50OF90IGJzX3BhX21mcm1zIDogMywKKwkJc3BhcmUyIDo1OworCXVpbnQ4X3QgdDMyMTI7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGdzbTQ4X2NlbGxfb3B0aW9ucyB7CisJdWludDhfdCByYWRpb19saW5rX3RpbWVvdXQ6NCwKKwkJIGR0eDoyLAorCQkgcHdyYzoxLAorCQkgc3BhcmU6MTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBTZWN0aW9uIDkuMi45IENNIHNlcnZpY2UgcmVxdWVzdCAqLworc3RydWN0IGdzbTQ4X3NlcnZpY2VfcmVxdWVzdCB7CisJdWludDhfdCBjbV9zZXJ2aWNlX3R5cGUgOiA0LAorCQkgY2lwaGVyX2tleV9zZXEgIDogNDsKKwkvKiBsZW5ndGggKyAzIGJ5dGVzICovCisJdWludDMyX3QgY2xhc3NtYXJrOworCXVpbnQ4X3QgbWlfbGVuOworCXVpbnQ4X3QgbWlbMF07CisJLyogb3B0aW9uYWwgcHJpb3JpdHkgbGV2ZWwgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBTZWN0aW9uIDkuMS4zMSBTeXN0ZW0gaW5mb3JtYXRpb24gVHlwZSAxICovCitzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfMSB7CisJc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlX2hlYWRlciBoZWFkZXI7CisJdWludDhfdCBjZWxsX2NoYW5uZWxfZGVzY3JpcHRpb25bMTZdOworCXN0cnVjdCBnc200OF9yYWNoX2NvbnRyb2wgcmFjaF9jb250cm9sOworCXVpbnQ4X3QgcmVzdF9vY3RldHNbMF07IC8qIE5DSCBwb3NpdGlvbiBvbiB0aGUgQ0NDSCAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFNlY3Rpb24gOS4xLjMyIFN5c3RlbSBpbmZvcm1hdGlvbiBUeXBlIDIgKi8KK3N0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8yIHsKKwlzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfaGVhZGVyIGhlYWRlcjsKKwl1aW50OF90IGJjY2hfZnJlcXVlbmN5X2xpc3RbMTZdOworCXVpbnQ4X3QgbmNjX3Blcm1pdHRlZDsKKwlzdHJ1Y3QgZ3NtNDhfcmFjaF9jb250cm9sIHJhY2hfY29udHJvbDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBTZWN0aW9uIDkuMS4zNSBTeXN0ZW0gaW5mb3JtYXRpb24gVHlwZSAzICovCitzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfMyB7CisJc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlX2hlYWRlciBoZWFkZXI7CisJdWludDE2X3QgY2VsbF9pZGVudGl0eTsKKwlzdHJ1Y3QgZ3NtNDhfbG9jX2FyZWFfaWQgbGFpOworCXN0cnVjdCBnc200OF9jb250cm9sX2NoYW5uZWxfZGVzY3IgY29udHJvbF9jaGFubmVsX2Rlc2M7CisJc3RydWN0IGdzbTQ4X2NlbGxfb3B0aW9ucyBjZWxsX29wdGlvbnM7CisJc3RydWN0IGdzbTQ4X2NlbGxfc2VsX3BhciBjZWxsX3NlbF9wYXI7CisJc3RydWN0IGdzbTQ4X3JhY2hfY29udHJvbCByYWNoX2NvbnRyb2w7CisJdWludDhfdCByZXN0X29jdGV0c1swXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBTZWN0aW9uIDkuMS4zNiBTeXN0ZW0gaW5mb3JtYXRpb24gVHlwZSA0ICovCitzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfNCB7CisJc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlX2hlYWRlciBoZWFkZXI7CisJc3RydWN0IGdzbTQ4X2xvY19hcmVhX2lkIGxhaTsKKwlzdHJ1Y3QgZ3NtNDhfY2VsbF9zZWxfcGFyIGNlbGxfc2VsX3BhcjsKKwlzdHJ1Y3QgZ3NtNDhfcmFjaF9jb250cm9sIHJhY2hfY29udHJvbDsKKwkvKglvcHRpb25hbCBDQkNIIGNvbmRpdGlvbmFsIENCQ0guLi4gZm9sbG93ZWQgYnkKKwkJbWFuZGFudG9yeSBTSSA0IFJlc2V0IE9jdGV0cworCSAqLworCXVpbnQ4X3QgZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBTZWN0aW9uIDkuMS4zNyBTeXN0ZW0gaW5mb3JtYXRpb24gVHlwZSA1ICovCitzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfNSB7CisJdWludDhfdCBycl9wcm90b2NvbF9kaXNjcmltaW5hdG9yIDo0LAorCQlza2lwX2luZGljYXRvcjo0OyAKKwl1aW50OF90IHN5c3RlbV9pbmZvcm1hdGlvbjsKKwl1aW50OF90IGJjY2hfZnJlcXVlbmN5X2xpc3RbMTZdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFNlY3Rpb24gOS4xLjQwIFN5c3RlbSBpbmZvcm1hdGlvbiBUeXBlIDYgKi8KK3N0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV82IHsKKwl1aW50OF90IHJyX3Byb3RvY29sX2Rpc2NyaW1pbmF0b3IgOjQsCisJCXNraXBfaW5kaWNhdG9yOjQ7IAorCXVpbnQ4X3Qgc3lzdGVtX2luZm9ybWF0aW9uOworCXVpbnQxNl90IGNlbGxfaWRlbnRpdHk7CisJc3RydWN0IGdzbTQ4X2xvY19hcmVhX2lkIGxhaTsKKwlzdHJ1Y3QgZ3NtNDhfY2VsbF9vcHRpb25zIGNlbGxfb3B0aW9uczsKKwl1aW50OF90IG5jY19wZXJtaXR0ZWQ7CisJdWludDhfdCByZXN0X29jdGV0c1swXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBTZWN0aW9uIDkuMS40M2EgU3lzdGVtIEluZm9ybWF0aW9uIHR5cGUgMTMgKi8KK3N0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8xMyB7CisJc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlX2hlYWRlciBoZWFkZXI7CisJdWludDhfdCByZXN0X29jdGV0c1swXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBTZWN0aW9uIDkuMi4xMiBJTVNJIERldGFjaCBJbmRpY2F0aW9uICovCitzdHJ1Y3QgZ3NtNDhfaW1zaV9kZXRhY2hfaW5kIHsKKwlzdHJ1Y3QgZ3NtNDhfY2xhc3NtYXJrMSBjbGFzc21hcmsxOworCXVpbnQ4X3QgbWlfbGVuOworCXVpbnQ4X3QgbWlbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogU2VjdGlvbiAxMC4yICsgR1NNIDA0LjA3IDEyLjIuMy4xLjEgKi8KKyNkZWZpbmUgR1NNNDhfUERJU0NfR1JPVVBfQ0MJMHgwMAorI2RlZmluZSBHU000OF9QRElTQ19CQ0FTVF9DQwkweDAxCisjZGVmaW5lIEdTTTQ4X1BESVNDX1BEU1MxCTB4MDIKKyNkZWZpbmUgR1NNNDhfUERJU0NfQ0MJCTB4MDMKKyNkZWZpbmUgR1NNNDhfUERJU0NfUERTUzIJMHgwNAorI2RlZmluZSBHU000OF9QRElTQ19NTQkJMHgwNQorI2RlZmluZSBHU000OF9QRElTQ19SUgkJMHgwNgorI2RlZmluZSBHU000OF9QRElTQ19NTV9HUFJTCTB4MDgKKyNkZWZpbmUgR1NNNDhfUERJU0NfU01TCQkweDA5CisjZGVmaW5lIEdTTTQ4X1BESVNDX1NNX0dQUlMJMHgwYQorI2RlZmluZSBHU000OF9QRElTQ19OQ19TUwkweDBiCisjZGVmaW5lIEdTTTQ4X1BESVNDX0xPQwkJMHgwYworI2RlZmluZSBHU000OF9QRElTQ19NQVNLCTB4MGYKKyNkZWZpbmUgR1NNNDhfUERJU0NfVVNTRAkweDExCisKKy8qIFNlY3Rpb24gMTAuNCAqLworI2RlZmluZSBHU000OF9NVF9SUl9JTklUX1JFUQkJMHgzYworI2RlZmluZSBHU000OF9NVF9SUl9BRERfQVNTCQkweDNiCisjZGVmaW5lIEdTTTQ4X01UX1JSX0lNTV9BU1MJCTB4M2YKKyNkZWZpbmUgR1NNNDhfTVRfUlJfSU1NX0FTU19FWFQJCTB4MzkKKyNkZWZpbmUgR1NNNDhfTVRfUlJfSU1NX0FTU19SRUoJCTB4M2EKKworI2RlZmluZSBHU000OF9NVF9SUl9DSVBIX01fQ01ECQkweDM1CisjZGVmaW5lIEdTTTQ4X01UX1JSX0NJUEhfTV9DT01QTAkweDMyCisKKyNkZWZpbmUgR1NNNDhfTVRfUlJfQ0ZHX0NIR19DTUQJCTB4MzAKKyNkZWZpbmUgR1NNNDhfTVRfUlJfQ0ZHX0NIR19BQ0sJCTB4MzEKKyNkZWZpbmUgR1NNNDhfTVRfUlJfQ0ZHX0NIR19SRUoJCTB4MzMKKworI2RlZmluZSBHU000OF9NVF9SUl9BU1NfQ01ECQkweDJlCisjZGVmaW5lIEdTTTQ4X01UX1JSX0FTU19DT01QTAkJMHgyOQorI2RlZmluZSBHU000OF9NVF9SUl9BU1NfRkFJTAkJMHgyZgorI2RlZmluZSBHU000OF9NVF9SUl9IQU5ET19DTUQJCTB4MmIKKyNkZWZpbmUgR1NNNDhfTVRfUlJfSEFORE9fQ09NUEwJCTB4MmMKKyNkZWZpbmUgR1NNNDhfTVRfUlJfSEFORE9fRkFJTAkJMHgyOAorI2RlZmluZSBHU000OF9NVF9SUl9IQU5ET19JTkZPCQkweDJkCisKKyNkZWZpbmUgR1NNNDhfTVRfUlJfQ0VMTF9DSEdfT1JERVIJMHgwOAorI2RlZmluZSBHU000OF9NVF9SUl9QRENIX0FTU19DTUQJMHgyMworCisjZGVmaW5lIEdTTTQ4X01UX1JSX0NIQU5fUkVMCQkweDBkCisjZGVmaW5lIEdTTTQ4X01UX1JSX1BBUlRfUkVMCQkweDBhCisjZGVmaW5lIEdTTTQ4X01UX1JSX1BBUlRfUkVMX0NPTVAJMHgwZgorCisjZGVmaW5lIEdTTTQ4X01UX1JSX1BBR19SRVFfMQkJMHgyMQorI2RlZmluZSBHU000OF9NVF9SUl9QQUdfUkVRXzIJCTB4MjIKKyNkZWZpbmUgR1NNNDhfTVRfUlJfUEFHX1JFUV8zCQkweDI0CisjZGVmaW5lIEdTTTQ4X01UX1JSX1BBR19SRVNQCQkweDI3CisjZGVmaW5lIEdTTTQ4X01UX1JSX05PVElGX05DSAkJMHgyMAorI2RlZmluZSBHU000OF9NVF9SUl9OT1RJRl9GQUNDSAkJMHgyNQorI2RlZmluZSBHU000OF9NVF9SUl9OT1RJRl9SRVNQCQkweDI2CisKKyNkZWZpbmUgR1NNNDhfTVRfUlJfU1lTSU5GT184CQkweDE4CisjZGVmaW5lIEdTTTQ4X01UX1JSX1NZU0lORk9fMQkJMHgxOQorI2RlZmluZSBHU000OF9NVF9SUl9TWVNJTkZPXzIJCTB4MWEKKyNkZWZpbmUgR1NNNDhfTVRfUlJfU1lTSU5GT18zCQkweDFiCisjZGVmaW5lIEdTTTQ4X01UX1JSX1NZU0lORk9fNAkJMHgxYworI2RlZmluZSBHU000OF9NVF9SUl9TWVNJTkZPXzUJCTB4MWQKKyNkZWZpbmUgR1NNNDhfTVRfUlJfU1lTSU5GT182CQkweDFlCisjZGVmaW5lIEdTTTQ4X01UX1JSX1NZU0lORk9fNwkJMHgxZgorCisjZGVmaW5lIEdTTTQ4X01UX1JSX1NZU0lORk9fMmJpcwkweDAyCisjZGVmaW5lIEdTTTQ4X01UX1JSX1NZU0lORk9fMnRlcgkweDAzCisjZGVmaW5lIEdTTTQ4X01UX1JSX1NZU0lORk9fNWJpcwkweDA1CisjZGVmaW5lIEdTTTQ4X01UX1JSX1NZU0lORk9fNXRlcgkweDA2CisjZGVmaW5lIEdTTTQ4X01UX1JSX1NZU0lORk9fOQkJMHgwNAorI2RlZmluZSBHU000OF9NVF9SUl9TWVNJTkZPXzEzCQkweDAwCisKKyNkZWZpbmUgR1NNNDhfTVRfUlJfU1lTSU5GT18xNgkJMHgzZAorI2RlZmluZSBHU000OF9NVF9SUl9TWVNJTkZPXzE3CQkweDNlCisKKyNkZWZpbmUgR1NNNDhfTVRfUlJfQ0hBTl9NT0RFX01PRElGCTB4MTAKKyNkZWZpbmUgR1NNNDhfTVRfUlJfU1RBVFVTCQkweDEyCisjZGVmaW5lIEdTTTQ4X01UX1JSX0NIQU5fTU9ERV9NT0RJRl9BQ0sJMHgxNworI2RlZmluZSBHU000OF9NVF9SUl9GUkVRX1JFREVGCQkweDE0CisjZGVmaW5lIEdTTTQ4X01UX1JSX01FQVNfUkVQCQkweDE1CisjZGVmaW5lIEdTTTQ4X01UX1JSX0NMU01fQ0hHCQkweDE2CisjZGVmaW5lIEdTTTQ4X01UX1JSX0NMU01fRU5RCQkweDEzCisjZGVmaW5lIEdTTTQ4X01UX1JSX0VYVF9NRUFTX1JFUAkweDM2CisjZGVmaW5lIEdTTTQ4X01UX1JSX0VYVF9NRUFTX1JFUF9PUkQJMHgzNworI2RlZmluZSBHU000OF9NVF9SUl9HUFJTX1NVU1BfUkVRCTB4MzQKKworI2RlZmluZSBHU000OF9NVF9SUl9WR0NTX1VQTF9HUkFOVAkweDA4CisjZGVmaW5lIEdTTTQ4X01UX1JSX1VQTElOS19SRUxFQVNFCTB4MGUKKyNkZWZpbmUgR1NNNDhfTVRfUlJfVVBMSU5LX0ZSRUUJCTB4MGMKKyNkZWZpbmUgR1NNNDhfTVRfUlJfVVBMSU5LX0JVU1kJCTB4MmEKKyNkZWZpbmUgR1NNNDhfTVRfUlJfVEFMS0VSX0lORAkJMHgxMQorCisjZGVmaW5lIEdTTTQ4X01UX1JSX0FQUF9JTkZPCQkweDM4CisKKy8qIFRhYmxlIDEwLjIvM0dQUCBUUyAwNC4wOCAqLworI2RlZmluZSBHU000OF9NVF9NTV9JTVNJX0RFVEFDSF9JTkQJMHgwMQorI2RlZmluZSBHU000OF9NVF9NTV9MT0NfVVBEX0FDQ0VQVAkweDAyCisjZGVmaW5lIEdTTTQ4X01UX01NX0xPQ19VUERfUkVKRUNUCTB4MDQKKyNkZWZpbmUgR1NNNDhfTVRfTU1fTE9DX1VQRF9SRVFVRVNUCTB4MDgKKworI2RlZmluZSBHU000OF9NVF9NTV9BVVRIX1JFSgkJMHgxMQorI2RlZmluZSBHU000OF9NVF9NTV9BVVRIX1JFUQkJMHgxMgorI2RlZmluZSBHU000OF9NVF9NTV9BVVRIX1JFU1AJCTB4MTQKKyNkZWZpbmUgR1NNNDhfTVRfTU1fSURfUkVRCQkweDE4CisjZGVmaW5lIEdTTTQ4X01UX01NX0lEX1JFU1AJCTB4MTkKKyNkZWZpbmUgR1NNNDhfTVRfTU1fVE1TSV9SRUFMTF9DTUQJMHgxYQorI2RlZmluZSBHU000OF9NVF9NTV9UTVNJX1JFQUxMX0NPTVBMCTB4MWIKKworI2RlZmluZSBHU000OF9NVF9NTV9DTV9TRVJWX0FDQwkJMHgyMQorI2RlZmluZSBHU000OF9NVF9NTV9DTV9TRVJWX1JFSgkJMHgyMgorI2RlZmluZSBHU000OF9NVF9NTV9DTV9TRVJWX0FCT1JUCTB4MjMKKyNkZWZpbmUgR1NNNDhfTVRfTU1fQ01fU0VSVl9SRVEJCTB4MjQKKyNkZWZpbmUgR1NNNDhfTVRfTU1fQ01fU0VSVl9QUk9NUFQJMHgyNQorI2RlZmluZSBHU000OF9NVF9NTV9DTV9SRUVTVF9SRVEJMHgyOAorI2RlZmluZSBHU000OF9NVF9NTV9BQk9SVAkJMHgyOQorCisjZGVmaW5lIEdTTTQ4X01UX01NX05VTEwJCTB4MzAKKyNkZWZpbmUgR1NNNDhfTVRfTU1fU1RBVFVTCQkweDMxCisjZGVmaW5lIEdTTTQ4X01UX01NX0lORk8JCTB4MzIKKworLyogVGFibGUgMTAuMy8zR1BQIFRTIDA0LjA4ICovCisjZGVmaW5lIEdTTTQ4X01UX0NDX0FMRVJUSU5HCQkweDAxCisjZGVmaW5lIEdTTTQ4X01UX0NDX0NBTExfQ09ORgkJMHgwOAorI2RlZmluZSBHU000OF9NVF9DQ19DQUxMX1BST0MJCTB4MDIKKyNkZWZpbmUgR1NNNDhfTVRfQ0NfQ09OTkVDVAkJMHgwNworI2RlZmluZSBHU000OF9NVF9DQ19DT05ORUNUX0FDSwkJMHgwZgorI2RlZmluZSBHU000OF9NVF9DQ19FTUVSR19TRVRVUAkJMHgwZQorI2RlZmluZSBHU000OF9NVF9DQ19QUk9HUkVTUwkJMHgwMworI2RlZmluZSBHU000OF9NVF9DQ19FU1RBQgkJMHgwNAorI2RlZmluZSBHU000OF9NVF9DQ19FU1RBQl9DT05GCQkweDA2CisjZGVmaW5lIEdTTTQ4X01UX0NDX1JFQ0FMTAkJMHgwYgorI2RlZmluZSBHU000OF9NVF9DQ19TVEFSVF9DQwkJMHgwOQorI2RlZmluZSBHU000OF9NVF9DQ19TRVRVUAkJMHgwNQorCisjZGVmaW5lIEdTTTQ4X01UX0NDX01PRElGWQkJMHgxNworI2RlZmluZSBHU000OF9NVF9DQ19NT0RJRllfQ09NUEwJMHgxZgorI2RlZmluZSBHU000OF9NVF9DQ19NT0RJRllfUkVKRUNUCTB4MTMKKyNkZWZpbmUgR1NNNDhfTVRfQ0NfVVNFUl9JTkZPCQkweDEwCisjZGVmaW5lIEdTTTQ4X01UX0NDX0hPTEQJCTB4MTgKKyNkZWZpbmUgR1NNNDhfTVRfQ0NfSE9MRF9BQ0sJCTB4MTkKKyNkZWZpbmUgR1NNNDhfTVRfQ0NfSE9MRF9SRUoJCTB4MWEKKyNkZWZpbmUgR1NNNDhfTVRfQ0NfUkVUUgkJMHgxYworI2RlZmluZSBHU000OF9NVF9DQ19SRVRSX0FDSwkJMHgxZAorI2RlZmluZSBHU000OF9NVF9DQ19SRVRSX1JFSgkJMHgxZQorCisjZGVmaW5lIEdTTTQ4X01UX0NDX0RJU0NPTk5FQ1QJCTB4MjUKKyNkZWZpbmUgR1NNNDhfTVRfQ0NfUkVMRUFTRQkJMHgyZAorI2RlZmluZSBHU000OF9NVF9DQ19SRUxFQVNFX0NPTVBMCTB4MmEKKworI2RlZmluZSBHU000OF9NVF9DQ19DT05HX0NUUkwJCTB4MzkKKyNkZWZpbmUgR1NNNDhfTVRfQ0NfTk9USUZZCQkweDNlCisjZGVmaW5lIEdTTTQ4X01UX0NDX1NUQVRVUwkJMHgzZAorI2RlZmluZSBHU000OF9NVF9DQ19TVEFUVVNfRU5RCQkweDM0CisjZGVmaW5lIEdTTTQ4X01UX0NDX1NUQVJUX0RUTUYJCTB4MzUKKyNkZWZpbmUgR1NNNDhfTVRfQ0NfU1RPUF9EVE1GCQkweDMxCisjZGVmaW5lIEdTTTQ4X01UX0NDX1NUT1BfRFRNRl9BQ0sJMHgzMgorI2RlZmluZSBHU000OF9NVF9DQ19TVEFSVF9EVE1GX0FDSwkweDM2CisjZGVmaW5lIEdTTTQ4X01UX0NDX1NUQVJUX0RUTUZfUkVKCTB4MzcKKyNkZWZpbmUgR1NNNDhfTVRfQ0NfRkFDSUxJVFkJCTB4M2EKKworLyogRklYTUU6IFRhYmxlIDEwLjQgLyAxMC40YSAoR1BSUykgKi8KKworLyogU2VjdGlvbiAxMC41LjIuMjYsIFRhYmxlIDEwLjUuNjQgKi8KKyNkZWZpbmUgR1NNNDhfUE1fTUFTSwkJMHgwMworI2RlZmluZSBHU000OF9QTV9OT1JNQUwJCTB4MDAKKyNkZWZpbmUgR1NNNDhfUE1fRVhURU5ERUQJMHgwMQorI2RlZmluZSBHU000OF9QTV9SRU9SRwkJMHgwMgorI2RlZmluZSBHU000OF9QTV9TQU1FCQkweDAzCisKKy8qIENoYXB0ZXIgMTAuNS4zLjUgLyBUYWJsZSAxMC41LjkzICovCisjZGVmaW5lIEdTTTQ4X0xVUERfTk9STUFMCTB4MAorI2RlZmluZSBHU000OF9MVVBEX1BFUklPRElDCTB4MQorI2RlZmluZSBHU000OF9MVVBEX0lNU0lfQVRUCTB4MgorI2RlZmluZSBHU000OF9MVVBEX1JFU0VSVkVECTB4MworCisvKiBUYWJsZSAxMC41LjQgKi8KKyNkZWZpbmUgR1NNX01JX1RZUEVfTUFTSwkweDA3CisjZGVmaW5lIEdTTV9NSV9UWVBFX05PTkUJMHgwMAorI2RlZmluZSBHU01fTUlfVFlQRV9JTVNJCTB4MDEKKyNkZWZpbmUgR1NNX01JX1RZUEVfSU1FSQkweDAyCisjZGVmaW5lIEdTTV9NSV9UWVBFX0lNRUlTVgkweDAzCisjZGVmaW5lIEdTTV9NSV9UWVBFX1RNU0kJMHgwNAorI2RlZmluZSBHU01fTUlfT0RECQkweDA4CisKKyNkZWZpbmUgR1NNNDhfSUVfTVVMX1JBVEVfQ0ZHCTB4MDMJLyogMTAuNS4yLjIxYWEgKi8KKyNkZWZpbmUgR1NNNDhfSUVfTU9CSUxFX0lECTB4MTcKKyNkZWZpbmUgR1NNNDhfSUVfTkFNRV9MT05HCTB4NDMJLyogMTAuNS4zLjVhICovCisjZGVmaW5lIEdTTTQ4X0lFX05BTUVfU0hPUlQJMHg0NQkvKiAxMC41LjMuNWEgKi8KKyNkZWZpbmUgR1NNNDhfSUVfVVRDCQkweDQ2CS8qIDEwLjUuMy44ICovCisjZGVmaW5lIEdTTTQ4X0lFX05FVF9USU1FX1RaCTB4NDcJLyogMTAuNS4zLjkgKi8KKyNkZWZpbmUgR1NNNDhfSUVfTFNBX0lERU5UCTB4NDgJLyogMTAuNS4zLjExICovCisKKyNkZWZpbmUgR1NNNDhfSUVfQkVBUkVSX0NBUAkweDA0CS8qIDEwLjUuNC41ICovCisjZGVmaW5lIEdTTTQ4X0lFX0NBVVNFCQkweDA4CS8qIDEwLjUuNC4xMSAqLworI2RlZmluZSBHU000OF9JRV9DQ19DQVAJCTB4MTUJLyogMTAuNS40LjVhICovCisjZGVmaW5lIEdTTTQ4X0lFX0FMRVJUCQkweDE5CS8qIDEwLjUuNC4yNiAqLworI2RlZmluZSBHU000OF9JRV9GQUNJTElUWQkweDFjCS8qIDEwLjUuNC4xNSAqLworI2RlZmluZSBHU000OF9JRV9QUk9HUl9JTkQJMHgxZQkvKiAxMC41LjQuMjEgKi8KKyNkZWZpbmUgR1NNNDhfSUVfQVVYX1NUQVRVUwkweDI0CS8qIDEwLjUuNC40ICovCisjZGVmaW5lIEdTTTQ4X0lFX05PVElGWQkJMHgyNwkvKiAxMC41LjQuMjAgKi8KKyNkZWZpbmUgR1NNNDhfSUVfS1BEX0ZBQ0lMSVRZCTB4MmMJLyogMTAuNS40LjE3ICovCisjZGVmaW5lIEdTTTQ4X0lFX1NJR05BTAkJMHgzNAkvKiAxMC41LjQuMjMgKi8KKyNkZWZpbmUgR1NNNDhfSUVfQ09OTl9CQ0QJMHg0YwkvKiAxMC41LjQuMTMgKi8KKyNkZWZpbmUgR1NNNDhfSUVfQ09OTl9TVUIJMHg0ZAkvKiAxMC41LjQuMTQgKi8KKyNkZWZpbmUgR1NNNDhfSUVfQ0FMTElOR19CQ0QJMHg1YwkvKiAxMC41LjQuOSAqLworI2RlZmluZSBHU000OF9JRV9DQUxMSU5HX1NVQgkweDVkCS8qIDEwLjUuNC4xMCAqLworI2RlZmluZSBHU000OF9JRV9DQUxMRURfQkNECTB4NWUJLyogMTAuNS40LjcgKi8KKyNkZWZpbmUgR1NNNDhfSUVfQ0FMTEVEX1NVQgkweDZkCS8qIDEwLjUuNC44ICovCisjZGVmaW5lIEdTTTQ4X0lFX1JFRElSX0JDRAkweDc0CS8qIDEwLjUuNC4yMWEgKi8KKyNkZWZpbmUgR1NNNDhfSUVfUkVESVJfU1VCCTB4NzUJLyogMTAuNS40LjIxYiAqLworI2RlZmluZSBHU000OF9JRV9MT1dMX0NPTVBBVAkweDdjCS8qIDEwLjUuNC4xOCAqLworI2RlZmluZSBHU000OF9JRV9ISUdITF9DT01QQVQJMHg3ZAkvKiAxMC41LjQuMTYgKi8KKyNkZWZpbmUgR1NNNDhfSUVfVVNFUl9VU0VSCTB4N2UJLyogMTAuNS40LjI1ICovCisjZGVmaW5lIEdTTTQ4X0lFX1NTX1ZFUlMJMHg3ZgkvKiAxMC41LjQuMjQgKi8KKyNkZWZpbmUgR1NNNDhfSUVfTU9SRV9EQVRBCTB4YTAJLyogMTAuNS40LjE5ICovCisjZGVmaW5lIEdTTTQ4X0lFX0NMSVJfU1VQUAkweGExCS8qIDEwLjUuNC4xMWEgKi8KKyNkZWZpbmUgR1NNNDhfSUVfQ0xJUl9JTlZPQwkweGEyCS8qIDEwLjUuNC4xMWIgKi8KKyNkZWZpbmUgR1NNNDhfSUVfUkVWX0NfU0VUVVAJMHhhMwkvKiAxMC41LjQuMjJhICovCisjZGVmaW5lIEdTTTQ4X0lFX1JFUEVBVF9DSVIJMHhkMQkvKiAxMC41LjQuMjIgKi8KKyNkZWZpbmUgR1NNNDhfSUVfUkVQRUFUX1NFUQkweGQzCS8qIDEwLjUuNC4yMiAqLworCisvKiBTZWN0aW9uIDEwLjUuNC4xMSAvIFRhYmxlIDEwLjUuMTIyICovCisjZGVmaW5lIEdTTTQ4X0NBVVNFX0NTX0dTTQkweDYwCisKKy8qIFNlY3Rpb24gOS4xLjIgLyBUYWJsZSA5LjMgKi8KKyNkZWZpbmUgR1NNNDhfSUVfRlJRTElTVF9BRlRFUgkweDA1CisjZGVmaW5lIEdTTTQ4X0lFX0NFTExfQ0hfREVTQwkweDYyCisjZGVmaW5lIEdTTTQ4X0lFX01TTE9UX0RFU0MJMHgxMAorI2RlZmluZSBHU000OF9JRV9DSEFOTU9ERV8xCTB4NjMKKyNkZWZpbmUgR1NNNDhfSUVfQ0hBTk1PREVfMgkweDExCisjZGVmaW5lIEdTTTQ4X0lFX0NIQU5NT0RFXzMJMHgxMworI2RlZmluZSBHU000OF9JRV9DSEFOTU9ERV80CTB4MTQKKyNkZWZpbmUgR1NNNDhfSUVfQ0hBTk1PREVfNQkweDE1CisjZGVmaW5lIEdTTTQ4X0lFX0NIQU5NT0RFXzYJMHgxNgorI2RlZmluZSBHU000OF9JRV9DSEFOTU9ERV83CTB4MTcKKyNkZWZpbmUgR1NNNDhfSUVfQ0hBTk1PREVfOAkweDE4CisjZGVmaW5lIEdTTTQ4X0lFX0NIQU5ERVNDXzIJMHg2NAorLyogRklYTUUgKi8KKworLyogU2VjdGlvbiAxMC41LjQuMjMgLyBUYWJsZSAxMC41LjEzMCAqLworZW51bSBnc200OF9zaWduYWxfdmFsIHsKKwlHU000OF9TSUdOQUxfRElBTFRPTkUJPSAweDAwLAorCUdTTTQ4X1NJR05BTF9SSU5HQkFDSwk9IDB4MDEsCisJR1NNNDhfU0lHTkFMX0lOVEVSQ0VQVAk9IDB4MDIsCisJR1NNNDhfU0lHTkFMX05FVF9DT05HCT0gMHgwMywKKwlHU000OF9TSUdOQUxfQlVTWQk9IDB4MDQsCisJR1NNNDhfU0lHTkFMX0NPTkZJUk0JPSAweDA1LAorCUdTTTQ4X1NJR05BTF9BTlNXRVIJPSAweDA2LAorCUdTTTQ4X1NJR05BTF9DQUxMX1dBSVQJPSAweDA3LAorCUdTTTQ4X1NJR05BTF9PRkZfSE9PSwk9IDB4MDgsCisJR1NNNDhfU0lHTkFMX09GRgk9IDB4M2YsCisJR1NNNDhfU0lHTkFMX0FMRVJUX09GRgk9IDB4NGYsCit9OworCitlbnVtIGdzbTQ4X2NhdXNlX2xvYyB7CisJR1NNNDhfQ0FVU0VfTE9DX1VTRVIJCT0gMHgwMCwKKwlHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUJPSAweDAxLAorCUdTTTQ4X0NBVVNFX0xPQ19QVU5fU19MVQk9IDB4MDIsCisJR1NNNDhfQ0FVU0VfTE9DX1RSQU5TX05FVAk9IDB4MDMsCisJR1NNNDhfQ0FVU0VfTE9DX1BVTl9TX1JVCT0gMHgwNCwKKwlHU000OF9DQVVTRV9MT0NfUFJOX1NfUlUJPSAweDA1LAorCS8qIG5vdCBkZWZpbmVkICovCisJR1NNNDhfQ0FVU0VfTE9DX0lOTl9ORVQJCT0gMHgwNywKKwlHU000OF9DQVVTRV9MT0NfTkVUX0JFWU9ORAk9IDB4MGEsCit9OworCisvKiBTZWN0aW9uIDEwLjUuMi4zMSBSUiBDYXVzZSAvIFRhYmxlIDEwLjUuNzAgKi8KK2VudW0gZ3NtNDhfcnJfY2F1c2UgeworCUdTTTQ4X1JSX0NBVVNFX05PUk1BTAkJPSAweDAwLAorCUdTTTQ4X1JSX0NBVVNFX0FCTk9STUFMX1VOU1BFQwk9IDB4MDEsCisJR1NNNDhfUlJfQ0FVU0VfQUJOT1JNQUxfVU5BQ0NUCT0gMHgwMiwKKwlHU000OF9SUl9DQVVTRV9BQk5PUk1BTF9USU1FUgk9IDB4MDMsCisJR1NNNDhfUlJfQ0FVU0VfQUJOT1JNQUxfTk9BQ1QJPSAweDA0LAorCUdTTTQ4X1JSX0NBVVNFX1BSRU1QVElWRV9SRUwJPSAweDA1LAorCUdTTTQ4X1JSX0NBVVNFX0hORE9WRVJfSU1QCT0gMHgwNiwKKwlHU000OF9SUl9DQVVTRV9DSEFOX01PREVfVU5BQ0NUCT0gMHgwNywKKwlHU000OF9SUl9DQVVTRV9GUkVRX05PVF9JTVBMCT0gMHgwOCwKKwlHU000OF9SUl9DQVVTRV9DQUxMX0NMRUFSRUQJPSAweDQxLAorCUdTTTQ4X1JSX0NBVVNFX1NFTUFOVF9JTkNPUlIJPSAweDVmLAorCUdTTTQ4X1JSX0NBVVNFX0lOVkFMSURfTUFORF9JTkYgPSAweDYwLAorCUdTTTQ4X1JSX0NBVVNFX01TR19UWVBFX04JPSAweDYxLAorCUdTTTQ4X1JSX0NBVVNFX01TR19UWVBFX05fQ09NUEFUPSAweDYyLAorCUdTTTQ4X1JSX0NBVVNFX0NPTkRfSUVfRVJST1IJPSAweDY0LAorCUdTTTQ4X1JSX0NBVVNFX05PX0NFTExfQUxMT0NfQQk9IDB4NjUsCisJR1NNNDhfUlJfQ0FVU0VfUFJPVF9FUlJPUl9VTlNQQyA9IDB4NmYsCit9OworCisvKiBTZWN0aW9uIDEwLjUuNC4xMSBDQyBDYXVzZSAvIFRhYmxlIDEwLjUuMTIzICovCitlbnVtIGdzbTQ4X2NjX2NhdXNlIHsKKwlHU000OF9DQ19DQVVTRV9VTkFTU0lHTkVEX05SCT0gMSwKKwlHU000OF9DQ19DQVVTRV9OT19ST1VURQkJPSAzLAorCUdTTTQ4X0NDX0NBVVNFX0NIQU5fVU5BQ0NFUFQJPSA2LAorCUdTTTQ4X0NDX0NBVVNFX09QX0RFVF9CQVJSSU5HCT0gOCwKKwlHU000OF9DQ19DQVVTRV9OT1JNX0NBTExfQ0xFQVIJPSAxNiwKKwlHU000OF9DQ19DQVVTRV9VU0VSX0JVU1kJPSAxNywKKwlHU000OF9DQ19DQVVTRV9VU0VSX05PVFJFU1BPTkQJPSAxOCwKKwlHU000OF9DQ19DQVVTRV9VU0VSX0FMRVJUSU5HX05BCT0gMTksCisJR1NNNDhfQ0NfQ0FVU0VfQ0FMTF9SRUpFQ1RFRAk9IDIxLAorCUdTTTQ4X0NDX0NBVVNFX05VTUJFUl9DSEFOR0VECT0gMjIsCisJR1NNNDhfQ0NfQ0FVU0VfUFJFX0VNUFRJT04JPSAyNSwKKwlHU000OF9DQ19DQVVTRV9OT05TRV9VU0VSX0NMUgk9IDI2LAorCUdTTTQ4X0NDX0NBVVNFX0RFU1RfT09PCQk9IDI3LAorCUdTTTQ4X0NDX0NBVVNFX0lOVl9OUl9GT1JNQVQJPSAyOCwKKwlHU000OF9DQ19DQVVTRV9GQUNJTElUWV9SRUoJPSAyOSwKKwlHU000OF9DQ19DQVVTRV9SRVNQX1NUQVRVU19JTlEJPSAzMCwKKwlHU000OF9DQ19DQVVTRV9OT1JNQUxfVU5TUEVDCT0gMzEsCisJR1NNNDhfQ0NfQ0FVU0VfTk9fQ0lSQ1VJVF9DSEFOCT0gMzQsCisJR1NNNDhfQ0NfQ0FVU0VfTkVUV09SS19PT08JPSAzOCwKKwlHU000OF9DQ19DQVVTRV9URU1QX0ZBSUxVUkUJPSA0MSwKKwlHU000OF9DQ19DQVVTRV9TV0lUQ0hfQ09ORwk9IDQyLAorCUdTTTQ4X0NDX0NBVVNFX0FDQ19JTkZfRElTQ0FSRAk9IDQzLAorCUdTTTQ4X0NDX0NBVVNFX1JFUV9DSEFOX1VOQVZBSUwJPSA0NCwKKwlHU000OF9DQ19DQVVTRV9SRVNPVVJDRV9VTkFWQUlMCT0gNDcsCisJR1NNNDhfQ0NfQ0FVU0VfUU9TX1VOQVZBSUwJPSA0OSwKKwlHU000OF9DQ19DQVVTRV9SRVFfRkFDX05PVF9TVUJTQz0gNTAsCisJR1NNNDhfQ0NfQ0FVU0VfSU5DX0JBUlJFRF9DVUcJPSA1NSwKKwlHU000OF9DQ19DQVVTRV9CRUFSRVJfQ0FQX1VOQVVUSD0gNTcsCisJR1NNNDhfQ0NfQ0FVU0VfQkVBUkVSX0NBX1VOQVZBSUw9IDU4LAorCUdTTTQ4X0NDX0NBVVNFX1NFUlZfT1BUX1VOQVZBSUwJPSA2MywKKwlHU000OF9DQ19DQVVTRV9CRUFSRVJTRVJWX1VOSU1QTD0gNjUsCisJR1NNNDhfQ0NfQ0FVU0VfQUNNX0dFX0FDTV9NQVgJPSA2OCwKKwlHU000OF9DQ19DQVVTRV9SRVFfRkFDX05PVElNUEwJPSA2OSwKKwlHU000OF9DQ19DQVVTRV9SRVNUUl9CQ0FQX0FWQUlMCT0gNzAsCisJR1NNNDhfQ0NfQ0FVU0VfU0VSVl9PUFRfVU5JTVBMCT0gNzksCisJR1NNNDhfQ0NfQ0FVU0VfSU5WQUxfVFJBTlNfSUQJPSA4MSwKKwlHU000OF9DQ19DQVVTRV9VU0VSX05PVF9JTl9DVUcJPSA4NywKKwlHU000OF9DQ19DQVVTRV9JTkNPTVBBVF9ERVNUCT0gODgsCisJR1NNNDhfQ0NfQ0FVU0VfSU5WQUxfVFJBTlNfTkVUCT0gOTEsCisJR1NNNDhfQ0NfQ0FVU0VfU0VNQU5USUNfSU5DT1JSCT0gOTUsCisJR1NNNDhfQ0NfQ0FVU0VfSU5WQUxfTUFORF9JTkYJPSA5NiwKKwlHU000OF9DQ19DQVVTRV9NU0dUWVBFX05PVEVYSVNUCT0gOTcsCisJR1NNNDhfQ0NfQ0FVU0VfTVNHVFlQRV9JTkNPTVBBVAk9IDk4LAorCUdTTTQ4X0NDX0NBVVNFX0lFX05PVEVYSVNUCT0gOTksCisJR1NNNDhfQ0NfQ0FVU0VfQ09ORF9JRV9FUlIJPSAxMDAsCisJR1NNNDhfQ0NfQ0FVU0VfTVNHX0lOQ09NUF9TVEFURQk9IDEwMSwKKwlHU000OF9DQ19DQVVTRV9SRUNPVkVSWV9USU1FUgk9IDEwMiwKKwlHU000OF9DQ19DQVVTRV9QUk9UT19FUlIJPSAxMTEsCisJR1NNNDhfQ0NfQ0FVU0VfSU5URVJXT1JLSU5HCT0gMTI3LAorfTsKKworLyogQW5uZXggRywgR1NNIHNwZWNpZmljIGNhdXNlIHZhbHVlcyBmb3IgbW9iaWxpdHkgbWFuYWdlbWVudCAqLworZW51bSBnc200OF9yZWplY3RfdmFsdWUgeworCUdTTTQ4X1JFSkVDVF9JTVNJX1VOS05PV05fSU5fSExSCT0gMiwKKwlHU000OF9SRUpFQ1RfSUxMRUdBTF9NUwkJCT0gMywKKwlHU000OF9SRUpFQ1RfSU1TSV9VTktOT1dOX0lOX1ZMUgk9IDQsCisJR1NNNDhfUkVKRUNUX0lNRUlfTk9UX0FDQ0VQVEVECQk9IDUsCisJR1NNNDhfUkVKRUNUX0lMTEVHQUxfTUUJCQk9IDYsCisJR1NNNDhfUkVKRUNUX1BMTU5fTk9UX0FMTE9XRUQJCT0gMTEsCisJR1NNNDhfUkVKRUNUX0xPQ19OT1RfQUxMT1dFRAkJPSAxMiwKKwlHU000OF9SRUpFQ1RfUk9BTUlOR19OT1RfQUxMT1dFRAk9IDEzLAorCUdTTTQ4X1JFSkVDVF9ORVRXT1JLX0ZBSUxVUkUJCT0gMTcsCisJR1NNNDhfUkVKRUNUX0NPTkdFU1RJT04JCQk9IDIyLAorCUdTTTQ4X1JFSkVDVF9TUlZfT1BUX05PVF9TVVBQT1JURUQJPSAzMiwKKwlHU000OF9SRUpFQ1RfUlFEX1NSVl9PUFRfTk9UX1NVUFBPUlRFRAk9IDMzLAorCUdTTTQ4X1JFSkVDVF9TUlZfT1BUX1RNUF9PVVRfT0ZfT1JERVIJPSAzNCwKKwlHU000OF9SRUpFQ1RfQ0FMTF9DQU5fTk9UX0JFX0lERU5USUZJRUQJPSAzOCwKKwlHU000OF9SRUpFQ1RfSU5DT1JSRUNUX01FU1NBR0UJCT0gOTUsCisJR1NNNDhfUkVKRUNUX0lOVkFMSURfTUFOREFOVE9SWV9JTkYJPSA5NiwKKwlHU000OF9SRUpFQ1RfTVNHX1RZUEVfTk9UX0lNUExFTUVOVEVECT0gOTcsCisJR1NNNDhfUkVKRUNUX01TR19UWVBFX05PVF9DT01QQVRJQkxFCT0gOTgsCisJR1NNNDhfUkVKRUNUX0lORl9FTEVNRV9OT1RfSU1QTEVNRU5URUQJPSA5OSwKKwlHU000OF9SRUpFQ1RfQ09ORFRJT05BTF9JRV9FUlJPUgk9IDEwMCwKKwlHU000OF9SRUpFQ1RfTVNHX05PVF9DT01QQVRJQkxFCQk9IDEwMSwKKwlHU000OF9SRUpFQ1RfUFJPVE9DT0xfRVJST1IJCT0gMTExLAorCisJLyogYWNjb3JkaW5nIHRvIEcuNiBBZGRpdGlvbmFsIGNhdXNlIGNvZGVzIGZvciBHTU0gKi8KKwlHU000OF9SRUpFQ1RfR1BSU19OT1RfQUxMT1dFRAkJPSA3LAorCUdTTTQ4X1JFSkVDVF9TRVJWSUNFU19OT1RfQUxMT1dFRAk9IDgsCisJR1NNNDhfUkVKRUNUX01TX0lERU5USVRZX05PVF9ERVJWSVZBQkxFID0gOSwKKwlHU000OF9SRUpFQ1RfSU1QTElDSVRMWV9ERVRBQ0hFRAk9IDEwLAorCUdTTTQ4X1JFSkVDVF9HUFJTX05PVF9BTExPV0VEX0lOX1BMTU4JPSAxNCwKKwlHU000OF9SRUpFQ1RfTVNDX1RNUF9OT1RfUkVBQ0hBQkxFCT0gMTYsCit9OworCitlbnVtIGNocmVxX3R5cGUgeworCUNIUkVRX1RfRU1FUkdfQ0FMTCwKKwlDSFJFUV9UX0NBTExfUkVFU1RfVENIX0YsCisJQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9ILAorCUNIUkVRX1RfQ0FMTF9SRUVTVF9UQ0hfSF9EQkwsCisJQ0hSRVFfVF9TRENDSCwKKwlDSFJFUV9UX1RDSF9GLAorCUNIUkVRX1RfVk9JQ0VfQ0FMTF9UQ0hfSCwKKwlDSFJFUV9UX0RBVEFfQ0FMTF9UQ0hfSCwKKwlDSFJFUV9UX0xPQ0FUSU9OX1VQRCwKKwlDSFJFUV9UX1BBR19SX0FOWV9ORUNJMCwKKwlDSFJFUV9UX1BBR19SX0FOWV9ORUNJMSwKKwlDSFJFUV9UX1BBR19SX1RDSF9GLAorCUNIUkVRX1RfUEFHX1JfVENIX0ZILAorCUNIUkVRX1RfTE1VLAorCUNIUkVRX1RfUkVTRVJWRURfU0RDQ0gsCisJQ0hSRVFfVF9SRVNFUlZFRF9JR05PUkUsCit9OworCisvKiBDaGFwdGVyIDExLjMgKi8KKyNkZWZpbmUgR1NNNDhfVDMwMQkxODAsIDAKKyNkZWZpbmUgR1NNNDhfVDMwMwkzMCwgMAorI2RlZmluZSBHU000OF9UMzA1CTMwLCAwCisjZGVmaW5lIEdTTTQ4X1QzMDYJMzAsIDAKKyNkZWZpbmUgR1NNNDhfVDMwOAkxMCwgMAorI2RlZmluZSBHU000OF9UMzEwCTE4MCwgMAorI2RlZmluZSBHU000OF9UMzEzCTMwLCAwCisjZGVmaW5lIEdTTTQ4X1QzMjMJMzAsIDAKKyNkZWZpbmUgR1NNNDhfVDMzMQkzMCwgMAorI2RlZmluZSBHU000OF9UMzMzCTMwLCAwCisjZGVmaW5lIEdTTTQ4X1QzMzQJMjUsIDAgLyogbWluIDE1ICovCisjZGVmaW5lIEdTTTQ4X1QzMzgJMzAsIDAKKworLyogQ2hhcHRlciA1LjEuMi4yICovCisjZGVmaW5lCUdTTV9DU1RBVEVfTlVMTAkJCTAKKyNkZWZpbmUJR1NNX0NTVEFURV9JTklUSUFURUQJCTEKKyNkZWZpbmUJR1NNX0NTVEFURV9NTV9DT05ORUNUSU9OX1BFTkQJMiAvKiBzZWUgMTAuNS40LjYgKi8KKyNkZWZpbmUJR1NNX0NTVEFURV9NT19DQUxMX1BST0MJCTMKKyNkZWZpbmUJR1NNX0NTVEFURV9DQUxMX0RFTElWRVJFRAk0CisjZGVmaW5lCUdTTV9DU1RBVEVfQ0FMTF9QUkVTRU5UCQk2CisjZGVmaW5lCUdTTV9DU1RBVEVfQ0FMTF9SRUNFSVZFRAk3CisjZGVmaW5lCUdTTV9DU1RBVEVfQ09OTkVDVF9SRVFVRVNUCTgKKyNkZWZpbmUJR1NNX0NTVEFURV9NT19URVJNX0NBTExfQ09ORgk5CisjZGVmaW5lCUdTTV9DU1RBVEVfQUNUSVZFCQkxMAorI2RlZmluZQlHU01fQ1NUQVRFX0RJU0NPTk5FQ1RfUkVRCTEyCisjZGVmaW5lCUdTTV9DU1RBVEVfRElTQ09OTkVDVF9JTkQJMTIKKyNkZWZpbmUJR1NNX0NTVEFURV9SRUxFQVNFX1JFUQkJMTkKKyNkZWZpbmUJR1NNX0NTVEFURV9NT19PUklHX01PRElGWQkyNgorI2RlZmluZQlHU01fQ1NUQVRFX01PX1RFUk1fTU9ESUZZCTI3CisjZGVmaW5lCUdTTV9DU1RBVEVfQ09OTkVDVF9JTkQJCTI4CisKKyNkZWZpbmUgU0JJVChhKSAoMSA8PCBhKQorI2RlZmluZSBBTExfU1RBVEVTIDB4ZmZmZmZmZmYKKworLyogVGFibGUgMTAuNS4zLzNHUFAgVFMgMDQuMDg6IExvY2F0aW9uIEFyZWEgSWRlbnRpZmljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudCAqLworI2RlZmluZSBHU01fTEFDX1JFU0VSVkVEX0RFVEFDSEVEICAgICAgIDB4MAorI2RlZmluZSBHU01fTEFDX1JFU0VSVkVEX0FMTF9CVFMgICAgICAgIDB4ZmZmZQorCisvKiBHU00gMDQuMDggQmVhcmVyIENhcGFiaWxpdHk6IEluZm9ybWF0aW9uIFRyYW5zZmVyIENhcGFiaWxpdHkgKi8KK2VudW0gZ3NtNDhfYmNhcF9pdGNhcCB7CisJR1NNNDhfQkNBUF9JVENBUF9TUEVFQ0gJCT0gMCwKKwlHU000OF9CQ0FQX0lUQ0FQX1VOUl9ESUdfSU5GCT0gMSwKKwlHU000OF9CQ0FQX0lUQ0FQXzNrMV9BVURJTwk9IDIsCisJR1NNNDhfQkNBUF9JVENBUF9GQVhfRzMJCT0gMywKKwlHU000OF9CQ0FQX0lUQ0FQX09USEVSCQk9IDUsCisJR1NNNDhfQkNBUF9JVENBUF9SRVNFUlZFRAk9IDcsCit9OworCisvKiBHU00gMDQuMDggQmVhcmVyIENhcGFiaWxpdHk6IFRyYW5zZmVyIE1vZGUgKi8KK2VudW0gZ3NtNDhfYmNhcF90bW9kIHsKKwlHU000OF9CQ0FQX1RNT0RfQ0lSQ1VJVAkJPSAwLAorCUdTTTQ4X0JDQVBfVE1PRF9QQUNLRVQJCT0gMSwKK307CisKKy8qIEdTTSAwNC4wOCBCZWFyZXIgQ2FwYWJpbGl0eTogQ29kaW5nIFN0YW5kYXJkICovCitlbnVtIGdzbTQ4X2JjYXBfY29kaW5nIHsKKwlHU000OF9CQ0FQX0NPRElOR19HU01fU1RECT0gMCwKK307CisKKy8qIEdTTSAwNC4wOCBCZWFyZXIgQ2FwYWJpbGl0eTogUmFkaW8gQ2hhbm5lbCBSZXF1aXJlbWVudHMgKi8KK2VudW0gZ3NtNDhfYmNhcF9ycnEgeworCUdTTTQ4X0JDQVBfUlJRX0ZSX09OTFkJPSAxLAorCUdTTTQ4X0JDQVBfUlJRX0RVQUxfSFIJPSAyLAorCUdTTTQ4X0JDQVBfUlJRX0RVQUxfRlIJPSAzLAorfTsKKworI2RlZmluZSBHU000OF9UTVNJX0xFTgk1CisjZGVmaW5lIEdTTTQ4X01JRF9UTVNJX0xFTgkoR1NNNDhfVE1TSV9MRU4gKyAyKQorI2RlZmluZSBHU000OF9NSV9TSVpFIDMyCisKKy8qIENoYXB0ZXIgMTAuNC40LjE1ICovCitzdHJ1Y3QgZ3NtNDhfcmFfaWQgeworCXVpbnQ4X3QgZGlnaXRzWzNdOwkvKiBNQ0MgKyBNTkMgQkNEIGRpZ2l0cyAqLworCXVpbnQxNl90IGxhYzsJCS8qIExvY2F0aW9uIEFyZWEgQ29kZSAqLworCXVpbnQ4X3QgcmFjOwkJLyogUm91dGluZyBBcmVhIENvZGUgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisKKworI2VuZGlmIC8qIFBST1RPX0dTTV8wNF8wOF9IICovCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8xMS5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfMTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmEyYjE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfMTEuaApAQCAtMCwwICsxLDE4OCBAQAorI2lmbmRlZiBQUk9UT19HU01fMDRfMTFfSAorI2RlZmluZSBQUk9UT19HU01fMDRfMTFfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIEdTTSBUUyAwNC4xMSAgZGVmaW5pdGlvbnMgKi8KKworLyogQ2hhcHRlciA1LjIuMzogU01DLUNTIHN0YXRlcyBhdCB0aGUgbmV0d29yayBzaWRlICovCitlbnVtIGdzbTQxMV9jcF9zdGF0ZSB7CisJR1NNNDExX0NQU19JRExFIAkJPSAwLAorCUdTTTQxMV9DUFNfTU1fQ09OTl9QRU5ESU5HCT0gMSwJLyogb25seSBNVCAhICovCisJR1NNNDExX0NQU19XQUlUX0NQX0FDSwkJPSAyLAorCUdTTTQxMV9DUFNfTU1fRVNUQUJMSVNIRUQJPSAzLAorfTsKKworLyogQ2hhcHRlciA2LjIuMjogU01SIHN0YXRlcyBhdCB0aGUgbmV0d29yayBzaWRlICovCitlbnVtIGdzbTQxMV9ycF9zdGF0ZSB7CisJR1NNNDExX1JQU19JRExFCQkJPSAwLAorCUdTTTQxMV9SUFNfV0FJVF9GT1JfUlBfQUNLCT0gMSwKKwlHU000MTFfUlBTX1dBSVRfVE9fVFhfUlBfQUNLCT0gMywKK307CisKKy8qIENoYXB0ZXIgOC4xLjIgKHJlZmVycyB0byBHU00gMDQuMDcgQ2hhcHRlciAxMS4yLjMuMS4xICovCisjZGVmaW5lIEdTTTQxMV9QRElTQ19TTVMJMHgwOQorCisvKiBDaGFwdGVyIDguMS4zICovCisjZGVmaW5lIEdTTTQxMV9NVF9DUF9EQVRBCTB4MDEKKyNkZWZpbmUgR1NNNDExX01UX0NQX0FDSwkweDA0CisjZGVmaW5lIEdTTTQxMV9NVF9DUF9FUlJPUgkweDEwCisKK2VudW0gZ3NtNDExX2NwX2llIHsKKwlHU000MTFfQ1BfSUVfVVNFUl9EQVRBCQk9IDB4MDEsCS8qIDguMS40LjEgKi8KKwlHU000MTFfQ1BfSUVfQ0FVU0UJCT0gMHgwMiwJLyogOC4xLjQuMi4gKi8KK307CisKKy8qIFNlY3Rpb24gOC4xLjQuMiAvIFRhYmxlIDguMiAqLworZW51bSBnc200MTFfY3BfY2F1c2UgeworCUdTTTQxMV9DUF9DQVVTRV9ORVRfRkFJTAk9IDE3LAorCUdTTTQxMV9DUF9DQVVTRV9DT05HRVNUSU9OCT0gMjIsCisJR1NNNDExX0NQX0NBVVNFX0lOVl9UUkFOU19JRAk9IDgxLAorCUdTTTQxMV9DUF9DQVVTRV9TRU1BTlRfSU5DX01TRwk9IDk1LAorCUdTTTQxMV9DUF9DQVVTRV9JTlZfTUFORF9JTkYJPSA5NiwKKwlHU000MTFfQ1BfQ0FVU0VfTVNHVFlQRV9OT1RFWElTVD0gOTcsCisJR1NNNDExX0NQX0NBVVNFX01TR19JTkNPTVBfU1RBVEU9IDk4LAorCUdTTTQxMV9DUF9DQVVTRV9JRV9OT1RFWElTVAk9IDk5LAorCUdTTTQxMV9DUF9DQVVTRV9QUk9UT0NPTF9FUlIJPSAxMTEsCit9OworCisvKiBDaGFwdGVyIDguMi4yICovCisjZGVmaW5lIEdTTTQxMV9NVF9SUF9EQVRBX01PCTB4MDAKKyNkZWZpbmUgR1NNNDExX01UX1JQX0RBVEFfTVQJMHgwMQorI2RlZmluZSBHU000MTFfTVRfUlBfQUNLX01PCTB4MDIKKyNkZWZpbmUgR1NNNDExX01UX1JQX0FDS19NVAkweDAzCisjZGVmaW5lIEdTTTQxMV9NVF9SUF9FUlJPUl9NTwkweDA0CisjZGVmaW5lIEdTTTQxMV9NVF9SUF9FUlJPUl9NVAkweDA1CisjZGVmaW5lIEdTTTQxMV9NVF9SUF9TTU1BX01PCTB4MDYKKworZW51bSBnc200MTFfcnBfaWUgeworCUdTTTQxMV9JRV9SUF9VU0VSX0RBVEEJCT0gMHg0MSwJLyogOC4yLjUuMyAqLworCUdTTTQxMV9JRV9SUF9DQVVTRQkJPSAweDQyLAkvKiA4LjIuNS40ICovCit9OworCisvKiBDaGFwdGVyIDguMi41LjQgVGFibGUgOC40ICovCitlbnVtIGdzbTQxMV9ycF9jYXVzZSB7CisJLyogdmFsaWQgb25seSBmb3IgTU8gKi8KKwlHU000MTFfUlBfQ0FVU0VfTU9fTlVNX1VOQVNTSUdORUQJPSAxLAorCUdTTTQxMV9SUF9DQVVTRV9NT19PUF9ERVRfQkFSUgkJPSA4LAorCUdTTTQxMV9SUF9DQVVTRV9NT19DQUxMX0JBUlJFRAkJPSAxMCwKKwlHU000MTFfUlBfQ0FVU0VfTU9fU01TX1JFSkVDVEVECQk9IDIxLAorCUdTTTQxMV9SUF9DQVVTRV9NT19ERVNUX09VVF9PRl9PUkRFUgk9IDI3LAorCUdTTTQxMV9SUF9DQVVTRV9NT19VTklERU5USUZJRURfU1VCU0NSCT0gMjgsCisJR1NNNDExX1JQX0NBVVNFX01PX0ZBQ0lMSVRZX1JFSgkJPSAyOSwKKwlHU000MTFfUlBfQ0FVU0VfTU9fVU5LTk9XTl9TVUJTQ1IJPSAzMCwKKwlHU000MTFfUlBfQ0FVU0VfTU9fTkVUX09VVF9PRl9PUkRFUgk9IDM4LAorCUdTTTQxMV9SUF9DQVVTRV9NT19URU1QX0ZBSUwJCT0gNDEsCisJR1NNNDExX1JQX0NBVVNFX01PX0NPTkdFU1RJT04JCT0gNDIsCisJR1NNNDExX1JQX0NBVVNFX01PX1JFU19VTkFWQUlMCQk9IDQ3LAorCUdTTTQxMV9SUF9DQVVTRV9NT19SRVFfRkFDX05PVFNVQlNDUgk9IDUwLAorCUdTTTQxMV9SUF9DQVVTRV9NT19SRVFfRkFDX05PVElNUEwJPSA2OSwKKwlHU000MTFfUlBfQ0FVU0VfTU9fSU5URVJXT1JLSU5HCQk9IDEyNywKKwkvKiB2YWxpZCBvbmx5IGZvciBNVCAqLworCUdTTTQxMV9SUF9DQVVTRV9NVF9NRU1fRVhDRUVERUQJCT0gMjIsCisJLyogdmFsaWQgZm9yIGJvdGggZGlyZWN0aW9ucyAqLworCUdTTTQxMV9SUF9DQVVTRV9JTlZfVFJBTlNfUkVGCQk9IDgxLAorCUdTTTQxMV9SUF9DQVVTRV9TRU1BTlRfSU5DX01TRwkJPSA5NSwKKwlHU000MTFfUlBfQ0FVU0VfSU5WX01BTkRfSU5GCQk9IDk2LAorCUdTTTQxMV9SUF9DQVVTRV9NU0dUWVBFX05PVEVYSVNUCT0gOTcsCisJR1NNNDExX1JQX0NBVVNFX01TR19JTkNPTVBfU1RBVEUJPSA5OCwKKwlHU000MTFfUlBfQ0FVU0VfSUVfTk9URVhJU1QJCT0gOTksCisJR1NNNDExX1JQX0NBVVNFX1BST1RPQ09MX0VSUgkJPSAxMTEsCit9OworCisvKiBDaGFwdGVyIDEwOiBUaW1lcnMgKi8KKyNkZWZpbmUgR1NNNDExX1RNUl9UUjFNCQk0MCwgMAkvKiAzNSA8IHggPCA0NSBzZWNvbmRzICovCisjZGVmaW5lIEdTTTQxMV9UTVJfVFJBTQkJMzAsIDAJLyogMjUgPCB4IDwgMzUgc2Vjb25kcyAqLworI2RlZmluZSBHU000MTFfVE1SX1RSMk0JCTE1LCAwCS8qIDEyIDwgeCA8IDIwIHNlY29uZHMgKi8KKworI2RlZmluZSBHU000MTFfVE1SX1RDMUEJCTMwLCAwCisKKy8qIENoYXB0ZXIgOC4yLjEgKi8KK3N0cnVjdCBnc200MTFfcnBfaGRyIHsKKwl1aW50OF90IGxlbjsKKwl1aW50OF90IG1zZ190eXBlOworCXVpbnQ4X3QgbXNnX3JlZjsKKwl1aW50OF90IGRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogb3VyIG93biBlbnVtLCBub3QgcmVsYXRlZCB0byBvbi1haXIgcHJvdG9jb2wgKi8KK2VudW0gc21zX2FscGhhYmV0IHsKKwlEQ1NfTk9ORSwKKwlEQ1NfN0JJVF9ERUZBVUxULAorCURDU19VQ1MyLAorCURDU184QklUX0RBVEEsCit9OworCisvKiBHU00gMDMuNDAgLyBDaGFwdGVyIDkuMi4zLjE6IFRQLU1lc3NhZ2UtVHlwZS1JbmRpY2F0b3IgKi8KKyNkZWZpbmUgR1NNMzQwX1NNU19ERUxJVkVSX1NDMk1TCTB4MDAKKyNkZWZpbmUgR1NNMzQwX1NNU19ERUxJVkVSX1JFUF9NUzJTQwkweDAwCisjZGVmaW5lIEdTTTM0MF9TTVNfU1RBVFVTX1JFUF9TQzJNUwkweDAyCisjZGVmaW5lIEdTTTM0MF9TTVNfQ09NTUFORF9NUzJTQwkweDAyCisjZGVmaW5lIEdTTTM0MF9TTVNfU1VCTUlUX01TMlNDCQkweDAxCisjZGVmaW5lIEdTTTM0MF9TTVNfU1VCTUlUX1JFUF9TQzJNUwkweDAxCisjZGVmaW5lIEdTTTM0MF9TTVNfUkVTU0VSVkVECQkweDAzCisKKy8qIEdTTSAwMy40MCAvIENoYXB0ZXIgOS4yLjMuMjogVFAtTW9yZS1NZXNzYWdlcy10by1TZW5kICovCisjZGVmaW5lIEdTTTM0MF9UUF9NTVNfTU9SRQkJMAorI2RlZmluZSBHU00zNDBfVFBfTU1TX05PX01PUkUJCTEKKworLyogR1NNIDAzLjQwIC8gQ2hhcHRlciA5LjIuMy4zOiBUUC1WYWxpZGl0eS1QZXJpb2QtRm9ybWF0ICovCisjZGVmaW5lIEdTTTM0MF9UUF9WUEZfTk9ORQkJMAorI2RlZmluZSBHU00zNDBfVFBfVlBGX1JFTEFUSVZFCQkyCisjZGVmaW5lIEdTTTM0MF9UUF9WUEZfRU5IQU5DRUQJCTEKKyNkZWZpbmUgR1NNMzQwX1RQX1ZQRl9BQlNPTFVURQkJMworCisvKiBHU00gMDMuNDAgLyBDaGFwdGVyIDkuMi4zLjQ6IFRQLVN0YXR1cy1SZXBvcnQtSW5kaWNhdGlvbiAqLworI2RlZmluZSBHU00zNDBfVFBfU1JJX05PTkUJCTAKKyNkZWZpbmUgR1NNMzQwX1RQX1NSSV9QUkVTRU5UCQkxCisKKy8qIEdTTSAwMy40MCAvIENoYXB0ZXIgOS4yLjMuNTogVFAtU3RhdHVzLVJlcG9ydC1SZXF1ZXN0ICovCisjZGVmaW5lIEdTTTM0MF9UUF9TUlJfTk9ORQkJMAorI2RlZmluZSBHU00zNDBfVFBfU1JSX1JFUVVFU1RFRAkJMQorCisvKiBHU00gMDMuNDAgLyBDaGFwdGVyIDkuMi4zLjk6IFRQLVByb3RvY29sLUlkZW50aWZpZXIgKi8KKy8qIHRlbGVtYXRpYyBpbnRlcndvcmtpbmcgKDAwMSBvciAxMTEgaW4gYml0cyA3LTUpICovCisjZGVmaW5lIEdTTTM0MF9UUF9QSURfSU1QTElDSVQJCTB4MDAKKyNkZWZpbmUgR1NNMzQwX1RQX1BJRF9URUxFWAkJMHgwMQorI2RlZmluZSBHU00zNDBfVFBfUElEX0ZBWF9HMwkJMHgwMgorI2RlZmluZSBHU00zNDBfVFBfUElEX0ZBWF9HNAkJMHgwMworI2RlZmluZSBHU00zNDBfVFBfUElEX1ZPSUNFCQkweDA0CisjZGVmaW5lIEdTTTQzMF9UUF9QSURfRVJNRVMJCTB4MDUKKyNkZWZpbmUgR1NNNDMwX1RQX1BJRF9OQVRJT05BTF9QQUdJTkcJMHgwNgorI2RlZmluZSBHU000MzBfVFBfUElEX1ZJREVPVEVYCQkweDA3CisjZGVmaW5lIEdTTTQzMF9UUF9QSURfVEVMRVRFWF9VTlNQRUMJMHgwOAorI2RlZmluZSBHU000MzBfVFBfUElEX1RFTEVURVhfUFNQRE4JMHgwOQorI2RlZmluZSBHU000MzBfVFBfUElEX1RFTEVURVhfQ1NQRE4JMHgwYQorI2RlZmluZSBHU000MzBfVFBfUElEX1RFTEVURVhfUFNUTgkweDBiCisjZGVmaW5lIEdTTTQzMF9UUF9QSURfVEVMRVRFWF9JU0ROCTB4MGMKKyNkZWZpbmUgR1NNNDMwX1RQX1BJRF9URUxFVEVYX1VDSQkweDBkCisjZGVmaW5lIEdTTTQzMF9UUF9QSURfTVNHX0hBTkRMSU5HCTB4MTAKKyNkZWZpbmUgR1NNNDMwX1RQX1BJRF9NU0dfWDQwMAkJMHgxMQorI2RlZmluZSBHU000MzBfVFBfUElEX0VNQUlMCQkweDEyCisjZGVmaW5lIEdTTTQzMF9UUF9QSURfR1NNX01TCQkweDFmCisvKiBpZiBiaXQgNyA9IDAgYW5kIGJpdCA2ID0gMSAqLworI2RlZmluZSBHU000MzBfVFBfUElEX1NNU19UWVBFXzAJMAorI2RlZmluZSBHU000MzBfVFBfUElEX1NNU19UWVBFXzEJMQorI2RlZmluZSBHU000MzBfVFBfUElEX1NNU19UWVBFXzIJMgorI2RlZmluZSBHU000MzBfVFBfUElEX1NNU19UWVBFXzMJMworI2RlZmluZSBHU000MzBfVFBfUElEX1NNU19UWVBFXzQJNAorI2RlZmluZSBHU000MzBfVFBfUElEX1NNU19UWVBFXzUJNQorI2RlZmluZSBHU000MzBfVFBfUElEX1NNU19UWVBFXzYJNgorI2RlZmluZSBHU000MzBfVFBfUElEX1NNU19UWVBFXzcJNworI2RlZmluZSBHU000MzBfVFBfUElEX1JFVFVSTl9DQUxMX01TRwkweDFmCisjZGVmaW5lIEdTTTQzMF9UUF9QSURfTUVfREFUQV9ETkxPQUQJMHgzZAorI2RlZmluZSBHU000MzBfVFBfUElEX01FX0RFX1BFUlNPTkFMCTB4M2UKKyNkZWZpbmUgR1NNNDMwX1RQX1BJRF9NRV9TSU1fRE5MT0FECTB4M2YKKworLyogR1NNIDAzLjM4IENoYXB0ZXIgNDogU01TIERhdGEgQ29kaW5nIFNjaGVtZSAqLworI2RlZmluZSBHU00zMzhfRENTXzAwXworCisjZGVmaW5lIEdTTTMzOF9EQ1NfMTExMF83QklUCQkoMCA8PCAyKQorI2RlZmluZSBHU00zMzhfRENTXzExMTFfN0JJVAkJKDAgPDwgMikKKyNkZWZpbmUgR1NNMzM4X0RDU18xMTExXzhCSVRfREFUQQkoMSA8PCAyKQorI2RlZmluZSBHU00zMzhfRENTXzExMTFfQ0xBU1MwCQkwCisjZGVmaW5lIEdTTTMzOF9EQ1NfMTExMV9DTEFTUzFfTUUJMQorI2RlZmluZSBHU00zMzhfRENTXzExMTFfQ0xBU1MyX1NJTQkyCisjZGVmaW5lIEdTTTMzOF9EQ1NfMTExMV9DTEFTUzNfVEUJMwkvKiBTZWUgVFMgMDcuMDUgKi8KKworI2VuZGlmIC8qIFBST1RPX0dTTV8wNF8xMV9IICovCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF84MC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfODAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTVjOTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfODAuaApAQCAtMCwwICsxLDEyNiBAQAorI2lmbmRlZiBQUk9UT19HU01fMDRfODBfSAorI2RlZmluZSBQUk9UT19HU01fMDRfODBfSAorCisvKiBHU00gVFMgMDQuODAgIGRlZmluaXRpb25zIChTdXBwbGVtZW50YXJ5IFNlcnZpY2VzIFNwZWNpZmljYXRpb24sIEZvcm1hdHMgYW5kIENvZGluZykgKi8KKworLyogU2VjdGlvbiAzLjQgKi8KKyNkZWZpbmUgR1NNMDQ4MF9NVFlQRV9SRUxFQVNFX0NPTVBMRVRFCTB4MkEKKyNkZWZpbmUgR1NNMDQ4MF9NVFlQRV9GQUNJTElUWQkJCTB4M0EKKyNkZWZpbmUgR1NNMDQ4MF9NVFlQRV9SRUdJU1RFUgkJCTB4M0IKKworLyogU2VjdGlvbiAzLjUgKi8KKyNkZWZpbmUgR1NNMDQ4MF9JRV9GQUNJTElUWQkJCTB4MUMKKyNkZWZpbmUgR1NNMDQ4MF9JRV9TU19WRVJTSU9OCQkJMHg3RgorCisvKiBTZWN0aW9uIDMuNi4yICovCisjZGVmaW5lIEdTTTA0ODBfQ1RZUEVfSU5WT0tFCQkJMHhBMQorI2RlZmluZSBHU00wNDgwX0NUWVBFX1JFVFVSTl9SRVNVTFQJCTB4QTIKKyNkZWZpbmUgR1NNMDQ4MF9DVFlQRV9SRVRVUk5fRVJST1IJCTB4QTMKKyNkZWZpbmUgR1NNMDQ4MF9DVFlQRV9SRUpFQ1QJCQkweEE0CisKKy8qIFNlY3Rpb24gMy42LjMgKi8KKyNkZWZpbmUgR1NNMDQ4MF9DT01QSURUQUdfSU5WT0tFX0lECQkweDAyCisjZGVmaW5lIEdTTTA0ODBfQ09NUElEVEFHX0xJTktFRF9JRAkJMHg4MAorCisvKiBTZWN0aW9uIDMuNi40ICovCisjZGVmaW5lIEdTTTA0ODBfT1BFUkFUSU9OX0NPREUJCQkweDAyCisKKy8qIFNlY3Rpb24gMy42LjUgKi8KKyNkZWZpbmUgR1NNXzA0ODBfU0VRVUVOQ0VfVEFHCQkJMHgzMAorI2RlZmluZSBHU01fMDQ4MF9TRVRfVEFHCQkJMHgzMQorCisvKiBTZWN0aW9uIDMuNi42ICovCisjZGVmaW5lIEdTTV8wNDgwX0VSUk9SX0NPREVfVEFHCQkJMHgwMgorCisvKiBTZWN0aW9uIDMuNi43ICovCisvKiBUYWJsZSAzLjEzICovCisjZGVmaW5lIEdTTV8wNDgwX1BST0JMRU1fQ09ERV9UQUdfR0VORVJBTAkweDgwCisjZGVmaW5lIEdTTV8wNDgwX1BST0JMRU1fQ09ERV9UQUdfSU5WT0tFCTB4ODEKKyNkZWZpbmUgR1NNXzA0ODBfUFJPQkxFTV9DT0RFX1RBR19SRVRVUk5fUkVTVUxUCTB4ODIKKyNkZWZpbmUgR1NNXzA0ODBfUFJPQkxFTV9DT0RFX1RBR19SRVRVUk5fRVJST1IJMHg4MworCisvKiBUYWJsZSAzLjE0ICovCisjZGVmaW5lIEdTTV8wNDgwX0dFTl9QUk9CX0NPREVfVU5SRUNPR05JU0VECTB4MDAKKyNkZWZpbmUgR1NNXzA0ODBfR0VOX1BST0JfQ09ERV9NSVNUWVBFRAkJMHgwMQorI2RlZmluZSBHU01fMDQ4MF9HRU5fUFJPQl9DT0RFX0JBRF9TVFJVQ1RVUkUJMHgwMgorCisvKiBUYWJsZSAzLjE1ICovCisjZGVmaW5lIEdTTV8wNDgwX0lOVk9LRV9QUk9CX0NPREVfRFVQTElDQVRFX0lOVk9LRV9JRAkJMHgwMAorI2RlZmluZSBHU01fMDQ4MF9JTlZPS0VfUFJPQl9DT0RFX1VOUkVDT0dOSVNFRF9PUEVSQVRJT04JMHgwMQorI2RlZmluZSBHU01fMDQ4MF9JTlZPS0VfUFJPQl9DT0RFX01JU1RZUEVEX1BBUkFNRVRFUgkJMHgwMgorI2RlZmluZSBHU01fMDQ4MF9JTlZPS0VfUFJPQl9DT0RFX1JFU09VUkNFX0xJTUlUQVRJT04JCTB4MDMKKyNkZWZpbmUgR1NNXzA0ODBfSU5WT0tFX1BST0JfQ09ERV9JTklUSUFUSU5HX1JFTEVBU0UJCTB4MDQKKyNkZWZpbmUgR1NNXzA0ODBfSU5WT0tFX1BST0JfQ09ERV9VTlJFQ09HTklTRURfTElOS0VEX0lECTB4MDUKKyNkZWZpbmUgR1NNXzA0ODBfSU5WT0tFX1BST0JfQ09ERV9VTkVYUEVDVEVEX0xJTktFRF9SRVNQT05TRQkweDA2CisjZGVmaW5lIEdTTV8wNDgwX0lOVk9LRV9QUk9CX0NPREVfVU5FWFBFQ1RFRF9MSU5LRURfT1BFUkFUSU9OCTB4MDcKKworLyogVGFibGUgMy4xNiAqLworI2RlZmluZSBHU01fMDQ4MF9SRVNVTFRfUFJPQl9DT0RFX1VOUkVDT0dOSVNFRF9JTlZPS0VfSUQJMHgwMAorI2RlZmluZSBHU01fMDQ4MF9SRVNVTFRfUFJPQl9DT0RFX1JFVFVSTl9SRVNVTFRfVU5FWFBFQ1RFRAkweDAxCisjZGVmaW5lIEdTTV8wNDgwX1JFU1VMVF9QUk9CX0NPREVfTUlTVFlQRURfUEFSQU1FVEVSCQkweDAyCisKKy8qIFRhYmxlIDMuMTcgKi8KKyNkZWZpbmUgR1NNXzA0ODBfRVJST1JfUFJPQl9DT0RFX1VOUkVDT0dOSVNFRF9JTlZPS0VfSUQJCTB4MDAKKyNkZWZpbmUgR1NNXzA0ODBfRVJST1JfUFJPQl9DT0RFX1JFVFVSTl9FUlJPUl9VTkVYUEVDVEVECTB4MDEKKyNkZWZpbmUgR1NNXzA0ODBfRVJST1JfUFJPQl9DT0RFX1VOUkVDT0dOSVNFRF9FUlJPUgkJMHgwMgorI2RlZmluZSBHU01fMDQ4MF9FUlJPUl9QUk9CX0NPREVfVU5FWFBFQ1RFRF9FUlJPUgkJMHgwMworI2RlZmluZSBHU01fMDQ4MF9FUlJPUl9QUk9CX0NPREVfTUlTVFlQRURfUEFSQU1FVEVSCQkweDA0CisKKy8qIFNlY3Rpb24gNC41ICovCisjZGVmaW5lIEdTTTA0ODBfT1BfQ09ERV9SRUdJU1RFUl9TUwkJMHgwQQorI2RlZmluZSBHU00wNDgwX09QX0NPREVfRVJBU0VfU1MJCTB4MEIKKyNkZWZpbmUgR1NNMDQ4MF9PUF9DT0RFX0FDVElWQVRFX1NTCQkweDBDCisjZGVmaW5lIEdTTTA0ODBfT1BfQ09ERV9ERUFDVElWQVRFX1NTCQkweDBECisjZGVmaW5lIEdTTTA0ODBfT1BfQ09ERV9JTlRFUlJPR0FURV9TUwkJMHgwRQorI2RlZmluZSBHU00wNDgwX09QX0NPREVfTk9USUZZX1NTCQkweDEwCisjZGVmaW5lIEdTTTA0ODBfT1BfQ09ERV9SRUdJU1RFUl9QQVNTV09SRAkweDExCisjZGVmaW5lIEdTTTA0ODBfT1BfQ09ERV9HRVRfUEFTU1dPUkQJCTB4MTIKKyNkZWZpbmUgR1NNMDQ4MF9PUF9DT0RFX1BST0NFU1NfVVNTX0RBVEEJMHgxMworI2RlZmluZSBHU00wNDgwX09QX0NPREVfRk9SV0FSRF9DSEVDS19TU19JTkQJMHgyNgorI2RlZmluZSBHU00wNDgwX09QX0NPREVfUFJPQ0VTU19VU1NfUkVRCQkweDNCCisjZGVmaW5lIEdTTTA0ODBfT1BfQ09ERV9VU1NfUkVRVUVTVAkJMHgzQworI2RlZmluZSBHU00wNDgwX09QX0NPREVfVVNTX05PVElGWQkJMHgzRAorI2RlZmluZSBHU00wNDgwX09QX0NPREVfRk9SV0FSRF9DVUdfSU5GTwkweDc4CisjZGVmaW5lIEdTTTA0ODBfT1BfQ09ERV9TUExJVF9NUFRZCQkweDc5CisjZGVmaW5lIEdTTTA0ODBfT1BfQ09ERV9SRVRSSUVWRV9NUFRZCQkweDdBCisjZGVmaW5lIEdTTTA0ODBfT1BfQ09ERV9IT0xEX01QVFkJCTB4N0IKKyNkZWZpbmUgR1NNMDQ4MF9PUF9DT0RFX0JVSUxEX01QVFkJCTB4N0MKKyNkZWZpbmUgR1NNMDQ4MF9PUF9DT0RFX0ZPUldBUkRfQ0hBUkdFX0FEVklDRQkweDdECisKKyNkZWZpbmUgR1NNMDQ4MF9FUlJfQ09ERV9VTktOT1dOX1NVQlNDUklCRVIJCQkweDAxCisjZGVmaW5lIEdTTTA0ODBfRVJSX0NPREVfSUxMRUdBTF9TVUJTQ1JJQkVSCQkJMHgwOQorI2RlZmluZSBHU00wNDgwX0VSUl9DT0RFX0JFQVJFUl9TRVJWSUNFX05PVF9QUk9WSVNJT05FRAkJMHgwQQorI2RlZmluZSBHU00wNDgwX0VSUl9DT0RFX1RFTEVTRVJWSUNFX05PVF9QUk9WSVNJT05FRAkJMHgwQgorI2RlZmluZSBHU00wNDgwX0VSUl9DT0RFX0lMTEVHQUxfRVFVSVBNRU5UCQkJMHgwQworI2RlZmluZSBHU00wNDgwX0VSUl9DT0RFX0NBTExfQkFSUkVECQkJCTB4MEQKKyNkZWZpbmUgR1NNMDQ4MF9FUlJfQ09ERV9JTExFR0FMX1NTX09QRVJBVElPTgkJCTB4MTAKKyNkZWZpbmUgR1NNMDQ4MF9FUlJfQ09ERV9TU19FUlJPUl9TVEFUVVMJCQkweDExCisjZGVmaW5lIEdTTTA0ODBfRVJSX0NPREVfU1NfTk9UX0FWQUlMQUJMRQkJCTB4MTIKKyNkZWZpbmUgR1NNMDQ4MF9FUlJfQ09ERV9TU19TVUJTQ1JJUFRJT05fVklPTEFUSU9OCQkweDEzCisjZGVmaW5lIEdTTTA0ODBfRVJSX0NPREVfU1NfSU5DT01QQVRJQklMSVRZCQkJMHgxNAorI2RlZmluZSBHU00wNDgwX0VSUl9DT0RFX0ZBQ0lMSVRZX05PVF9TVVBQT1JURUQJCQkweDE1CisjZGVmaW5lIEdTTTA0ODBfRVJSX0NPREVfQUJTRU5UX1NVQlNDUklCRVIJCQkweDFCCisjZGVmaW5lIEdTTTA0ODBfRVJSX0NPREVfU1lTVEVNX0ZBSUxVUkUJCQkJMHgyMgorI2RlZmluZSBHU00wNDgwX0VSUl9DT0RFX0RBVEFfTUlTU0lORwkJCQkweDIzCisjZGVmaW5lIEdTTTA0ODBfRVJSX0NPREVfVU5FWFBFQ1RFRF9EQVRBX1ZBTFVFCQkJMHgyNAorI2RlZmluZSBHU00wNDgwX0VSUl9DT0RFX1BXX1JFR0lTVFJBVElPTl9GQUlMVVJFCQkweDI1CisjZGVmaW5lIEdTTTA0ODBfRVJSX0NPREVfTkVHQVRJVkVfUFdfQ0hFQ0sJCQkweDI2CisjZGVmaW5lIEdTTTA0ODBfRVJSX0NPREVfTlVNX1BXX0FUVEVNUFRTX1ZJT0xBVElPTgkJMHgyQgorI2RlZmluZSBHU00wNDgwX0VSUl9DT0RFX1VOS05PV05fQUxQSEFCRVQJCQkweDQ3CisjZGVmaW5lIEdTTTA0ODBfRVJSX0NPREVfVVNTRF9CVVNZCQkJCTB4NDgKKyNkZWZpbmUgR1NNMDQ4MF9FUlJfQ09ERV9NQVhfTVBUWV9QQVJUSUNJUEFOVFMJCQkweDdFCisjZGVmaW5lIEdTTTA0ODBfRVJSX0NPREVfUkVTT1VSQ0VTX05PVF9BVkFJTEFCTEUJCTB4N0YKKworLyogQVNOLjEgdHlwZS10YWdzICovCisjZGVmaW5lIEFTTjFfQk9PTEVBTl9UQUcJCTB4MDEKKyNkZWZpbmUgQVNOMV9JTlRFR0VSX1RBRwkJMHgwMgorI2RlZmluZSBBU04xX0JJVF9TVFJJTkdfVEFHCQkweDAzCisjZGVmaW5lIEFTTjFfT0NURVRfU1RSSU5HX1RBRwkJMHgwNAorI2RlZmluZSBBU04xX05VTExfVFlQRV9UQUcJCTB4MDUKKyNkZWZpbmUgQVNOMV9PQkpFQ1RfSURfVEFHCQkweDA2CisjZGVmaW5lIEFTTjFfVVRGOF9TVFJJTkdfVEFHCQkweDBDCisjZGVmaW5lIEFTTjFfUFJJTlRBQkxFX1NUUklOR19UQUcJMHgxMworI2RlZmluZSBBU04xX0lBNV9TVFJJTkdfVEFHCQkweDE2CisjZGVmaW5lIEFTTjFfVU5JQ09ERV9TVFJJTkdfVEFHCQkweDFFCisKKyNlbmRpZiAvKiBQUk9UT19HU01fMDRfODBfSCAqLwpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDhfMDguaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA4XzA4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI4ZjkzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA4XzA4LmgKQEAgLTAsMCArMSwzMDMgQEAKKy8qIEZyb20gR1NNMDguMDggKi8KKworI2lmbmRlZiBHU01fMDgwOF9ICisjZGVmaW5lIEdTTV8wODA4X0gKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKgorICogdGhpcyBpcyBmcm9tIEdTTSAwMy4wMyBDR0kgYnV0IGlzIGNvcGllZCBpbiBHU00gMDguMDgKKyAqIGluIMKnIDMuMi4yLjI3IGZvciBDZWxsIElkZW50aWZpZXIgTGlzdAorICovCitlbnVtIENFTExfSURFTlQgeworCUNFTExfSURFTlRfV0hPTEVfR0xPQkFMCQk9IDAsCisJQ0VMTF9JREVOVF9MQUNfQU5EX0NJCQk9IDEsCisJQ0VMTF9JREVOVF9DSQkJCT0gMiwKKwlDRUxMX0lERU5UX05PX0NFTEwJCT0gMywKKwlDRUxMX0lERU5UX0xBSV9BTkRfTEFDCQk9IDQsCisJQ0VMTF9JREVOVF9MQUMJCQk9IDUsCisJQ0VMTF9JREVOVF9CU1MJCQk9IDYsCisJQ0VMTF9JREVOVF9VVFJBTl9QTE1OX0xBQ19STkMJPSA4LAorCUNFTExfSURFTlRfVVRSQU5fUk5DCQk9IDksCisJQ0VMTF9JREVOVF9VVFJBTl9MQUNfUk5DCT0gMTAsCit9OworCisKKy8qIEdTTSAwOC4wNiDCpyA2LjMgKi8KK2VudW0gQlNTQVBfTVNHX1RZUEUgeworCUJTU0FQX01TR19CU1NfTUFOQUdFTUVOVCAgICA9IDB4MCwKKwlCU1NBUF9NU0dfRFRBUAkJICAgID0gMHgxLAorfTsKKworc3RydWN0IGJzc21hcF9oZWFkZXIgeworCXVpbnQ4X3QgdHlwZTsKKwl1aW50OF90IGxlbmd0aDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBkdGFwX2hlYWRlciB7CisJdWludDhfdCB0eXBlOworCXVpbnQ4X3QgbGlua19pZDsKKwl1aW50OF90IGxlbmd0aDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworZW51bSBCU1NfTUFQX01TR19UWVBFIHsKKwlCU1NfTUFQX01TR19SRVNFUlZFRF8wCQk9IDAsCisKKwkvKiBBU1NJR05NRU5UIE1FU1NBR0VTICovCisJQlNTX01BUF9NU0dfQVNTSUdNRU5UX1JRU1QJPSAxLAorCUJTU19NQVBfTVNHX0FTU0lHTUVOVF9DT01QTEVURQk9IDIsCisJQlNTX01BUF9NU0dfQVNTSUdNRU5UX0ZBSUxVUkUJPSAzLAorCisJLyogIEhBTkRPVkVSIE1FU1NBR0VTICovCisJQlNTX01BUF9NU0dfSEFORE9WRVJfUlFTVAkJPSAxNiwKKwlCU1NfTUFQX01TR19IQU5ET1ZFUl9SRVFVSVJFRAkJPSAxNywKKwlCU1NfTUFQX01TR19IQU5ET1ZFUl9SUVNUX0FDS05PV0xFREdFPSAxOCwKKwlCU1NfTUFQX01TR19IQU5ET1ZFUl9DTUQJCT0gMTksCisJQlNTX01BUF9NU0dfSEFORE9WRVJfQ09NUExFVEUJCT0gMjAsCisJQlNTX01BUF9NU0dfSEFORE9WRVJfU1VDQ0VFREVECQk9IDIxLAorCUJTU19NQVBfTVNHX0hBTkRPVkVSX0ZBSUxVUkUJCT0gMjIsCisJQlNTX01BUF9NU0dfSEFORE9WRVJfUEVSRk9STUVECQk9IDIzLAorCUJTU19NQVBfTVNHX0hBTkRPVkVSX0NBTkRJREFURV9FTlFVSVJFCT0gMjQsCisJQlNTX01BUF9NU0dfSEFORE9WRVJfQ0FORElEQVRFX1JFU1BPTlNFCT0gMjUsCisJQlNTX01BUF9NU0dfSEFORE9WRVJfUkVRVUlSRURfUkVKRUNUCT0gMjYsCisJQlNTX01BUF9NU0dfSEFORE9WRVJfREVURUNUCQk9IDI3LAorCisJLyogUkVMRUFTRSBNRVNTQUdFUyAqLworCUJTU19NQVBfTVNHX0NMRUFSX0NNRAkJPSAzMiwKKwlCU1NfTUFQX01TR19DTEVBUl9DT01QTEVURQkJPSAzMywKKwlCU1NfTUFQX01TR19DTEVBUl9SUVNUCQk9IDM0LAorCUJTU19NQVBfTVNHX1JFU0VSVkVEXzEJCQk9IDM1LAorCUJTU19NQVBfTVNHX1JFU0VSVkVEXzIJCQk9IDM2LAorCUJTU19NQVBfTVNHX1NBUElfTl9SRUpFQ1QJCT0gMzcsCisJQlNTX01BUF9NU0dfQ09ORlVTSU9OCQkJPSAzOCwKKworCS8qIE9USEVSIENPTk5FQ1RJT04gUkVMQVRFRCBNRVNTQUdFUyAqLworCUJTU19NQVBfTVNHX1NVU1BFTkQJCQk9IDQwLAorCUJTU19NQVBfTVNHX1JFU1VNRQkJCT0gNDEsCisJQlNTX01BUF9NU0dfQ09OTkVDVElPTl9PUklFTlRFRF9JTkZPUk1BVElPTiA9IDQyLAorCUJTU19NQVBfTVNHX1BFUkZPUk1fTE9DQVRJT05fUlFTVAk9IDQzLAorCUJTU19NQVBfTVNHX0xTQV9JTkZPUk1BVElPTgkJPSA0NCwKKwlCU1NfTUFQX01TR19QRVJGT1JNX0xPQ0FUSU9OX1JFU1BPTlNFCT0gNDUsCisJQlNTX01BUF9NU0dfUEVSRk9STV9MT0NBVElPTl9BQk9SVAk9IDQ2LAorCUJTU19NQVBfTVNHX0NPTU1PTl9JRAkJCT0gNDcsCisKKwkvKiBHRU5FUkFMIE1FU1NBR0VTICovCisJQlNTX01BUF9NU0dfUkVTRVQJCQk9IDQ4LAorCUJTU19NQVBfTVNHX1JFU0VUX0FDS05PV0xFREdFCQk9IDQ5LAorCUJTU19NQVBfTVNHX09WRVJMT0FECQkJPSA1MCwKKwlCU1NfTUFQX01TR19SRVNFUlZFRF8zCQkJPSA1MSwKKwlCU1NfTUFQX01TR19SRVNFVF9DSVJDVUlUCQk9IDUyLAorCUJTU19NQVBfTVNHX1JFU0VUX0NJUkNVSVRfQUNLTk9XTEVER0UJPSA1MywKKwlCU1NfTUFQX01TR19NU0NfSU5WT0tFX1RSQUNFCQk9IDU0LAorCUJTU19NQVBfTVNHX0JTU19JTlZPS0VfVFJBQ0UJCT0gNTUsCisJQlNTX01BUF9NU0dfQ09OTkVDVElPTkxFU1NfSU5GT1JNQVRJT04JPSA1OCwKKworCS8qIFRFUlJFU1RSSUFMIFJFU09VUkNFIE1FU1NBR0VTICovCisJQlNTX01BUF9NU0dfQkxPQ0sJCQk9IDY0LAorCUJTU19NQVBfTVNHX0JMT0NLSU5HX0FDS05PV0xFREdFCT0gNjUsCisJQlNTX01BUF9NU0dfVU5CTE9DSwkJCT0gNjYsCisJQlNTX01BUF9NU0dfVU5CTE9DS0lOR19BQ0tOT1dMRURHRQk9IDY3LAorCUJTU19NQVBfTVNHX0NJUkNVSVRfR1JPVVBfQkxPQ0sJCT0gNjgsCisJQlNTX01BUF9NU0dfQ0lSQ1VJVF9HUk9VUF9CTE9DS0lOR19BQ0tOT1dMRURHRQk9IDY5LAorCUJTU19NQVBfTVNHX0NJUkNVSVRfR1JPVVBfVU5CTE9DSwk9IDcwLAorCUJTU19NQVBfTVNHX0NJUkNVSVRfR1JPVVBfVU5CTE9DS0lOR19BQ0tOT1dMRURHRSA9IDcxLAorCUJTU19NQVBfTVNHX1VORVFVSVBQRURfQ0lSQ1VJVAkJPSA3MiwKKwlCU1NfTUFQX01TR19DSEFOR0VfQ0lSQ1VJVAkJPSA3OCwKKwlCU1NfTUFQX01TR19DSEFOR0VfQ0lSQ1VJVF9BQ0tOT1dMRURHRQk9IDc5LAorCisJLyogUkFESU8gUkVTT1VSQ0UgTUVTU0FHRVMgKi8KKwlCU1NfTUFQX01TR19SRVNPVVJDRV9SUVNUCQk9IDgwLAorCUJTU19NQVBfTVNHX1JFU09VUkNFX0lORElDQVRJT04JCT0gODEsCisJQlNTX01BUF9NU0dfUEFHSU5HCQkJPSA4MiwKKwlCU1NfTUFQX01TR19DSVBIRVJfTU9ERV9DTUQJCT0gODMsCisJQlNTX01BUF9NU0dfQ0xBU1NNQVJLX1VQREFURQkJPSA4NCwKKwlCU1NfTUFQX01TR19DSVBIRVJfTU9ERV9DT01QTEVURQk9IDg1LAorCUJTU19NQVBfTVNHX1FVRVVJTkdfSU5ESUNBVElPTgkJPSA4NiwKKwlCU1NfTUFQX01TR19DT01QTEVURV9MQVlFUl8zCQk9IDg3LAorCUJTU19NQVBfTVNHX0NMQVNTTUFSS19SUVNUCQk9IDg4LAorCUJTU19NQVBfTVNHX0NJUEhFUl9NT0RFX1JFSkVDVAkJPSA4OSwKKwlCU1NfTUFQX01TR19MT0FEX0lORElDQVRJT04JCT0gOTAsCisKKwkvKiBWR0NTL1ZCUyAqLworCUJTU19NQVBfTVNHX1ZHQ1NfVkJTX1NFVFVQCQk9IDQsCisJQlNTX01BUF9NU0dfVkdDU19WQlNfU0VUVVBfQUNLCQk9IDUsCisJQlNTX01BUF9NU0dfVkdDU19WQlNfU0VUVVBfUkVGVVNFCT0gNiwKKwlCU1NfTUFQX01TR19WR0NTX1ZCU19BU1NJR05NRU5UX1JRU1QJPSA3LAorCUJTU19NQVBfTVNHX1ZHQ1NfVkJTX0FTU0lHTk1FTlRfUkVTVUxUCT0gMjgsCisJQlNTX01BUF9NU0dfVkdDU19WQlNfQVNTSUdOTUVOVF9GQUlMVVJFCT0gMjksCisJQlNTX01BUF9NU0dfVkdDU19WQlNfUVVFVUlOR19JTkRJQ0FUSU9OCT0gMzAsCisJQlNTX01BUF9NU0dfVVBMSU5LX1JRU1QJCT0gMzEsCisJQlNTX01BUF9NU0dfVVBMSU5LX1JRU1RfQUNLTk9XTEVER0UJPSAzOSwKKwlCU1NfTUFQX01TR19VUExJTktfUlFTVF9DT05GSVJNQVRJT04JPSA3MywKKwlCU1NfTUFQX01TR19VUExJTktfUkVMRUFTRV9JTkRJQ0FUSU9OCT0gNzQsCisJQlNTX01BUF9NU0dfVVBMSU5LX1JFSkVDVF9DTUQJPSA3NSwKKwlCU1NfTUFQX01TR19VUExJTktfUkVMRUFTRV9DTUQJPSA3NiwKKwlCU1NfTUFQX01TR19VUExJTktfU0VJWkVEX0NNRAk9IDc3LAorfTsKKworZW51bSBHU00wODA4X0lFX0NPRElORyB7CisJR1NNMDgwOF9JRV9DSVJDVUlUX0lERU5USVRZX0NPREUJPSAxLAorCUdTTTA4MDhfSUVfUkVTRVJWRURfMAkJCT0gMiwKKwlHU00wODA4X0lFX1JFU09VUkNFX0FWQUlMQUJMRQkJPSAzLAorCUdTTTA4MDhfSUVfQ0FVU0UJCQk9IDQsCisJR1NNMDgwOF9JRV9DRUxMX0lERU5USUZJRVIJCT0gNSwKKwlHU00wODA4X0lFX1BSSU9SSVRZCQkJPSA2LAorCUdTTTA4MDhfSUVfTEFZRVJfM19IRUFERVJfSU5GT1JNQVRJT04JPSA3LAorCUdTTTA4MDhfSUVfSU1TSQkJCQk9IDgsCisJR1NNMDgwOF9JRV9UTVNJCQkJCT0gOSwKKwlHU00wODA4X0lFX0VOQ1JZUFRJT05fSU5GT1JNQVRJT04JPSAxMCwKKwlHU00wODA4X0lFX0NIQU5ORUxfVFlQRQkJCT0gMTEsCisJR1NNMDgwOF9JRV9QRVJJT0RJQ0lUWQkJCT0gMTIsCisJR1NNMDgwOF9JRV9FWFRFTkRFRF9SRVNPVVJDRV9JTkRJQ0FUT1IJPSAxMywKKwlHU00wODA4X0lFX05VTUJFUl9PRl9NU1MJCT0gMTQsCisJR1NNMDgwOF9JRV9SRVNFUlZFRF8xCQkJPSAxNSwKKwlHU00wODA4X0lFX1JFU0VSVkVEXzIJCQk9IDE2LAorCUdTTTA4MDhfSUVfUkVTRVJWRURfMwkJCT0gMTcsCisJR1NNMDgwOF9JRV9DTEFTU01BUktfSU5GT1JNQVRJT05fVDIJPSAxOCwKKwlHU00wODA4X0lFX0NMQVNTTUFSS19JTkZPUk1BVElPTl9UMwk9IDE5LAorCUdTTTA4MDhfSUVfSU5URVJGRVJFTkNFX0JBTkRfVE9fVVNFCT0gMjAsCisJR1NNMDgwOF9JRV9SUl9DQVVTRQkJCT0gMjEsCisJR1NNMDgwOF9JRV9SRVNFUlZFRF80CQkJPSAyMiwKKwlHU00wODA4X0lFX0xBWUVSXzNfSU5GT1JNQVRJT04JCT0gMjMsCisJR1NNMDgwOF9JRV9ETENJCQkJCT0gMjQsCisJR1NNMDgwOF9JRV9ET1dOTElOS19EVFhfRkxBRwkJPSAyNSwKKwlHU00wODA4X0lFX0NFTExfSURFTlRJRklFUl9MSVNUCQk9IDI2LAorCUdTTTA4MDhfSUVfUkVTUE9OU0VfUlFTVAkJPSAyNywKKwlHU00wODA4X0lFX1JFU09VUkNFX0lORElDQVRJT05fTUVUSE9ECT0gMjgsCisJR1NNMDgwOF9JRV9DTEFTU01BUktfSU5GT1JNQVRJT05fVFlQRV8xCT0gMjksCisJR1NNMDgwOF9JRV9DSVJDVUlUX0lERU5USVRZX0NPREVfTElTVAk9IDMwLAorCUdTTTA4MDhfSUVfRElBR05PU1RJQwkJCT0gMzEsCisJR1NNMDgwOF9JRV9MQVlFUl8zX01FU1NBR0VfQ09OVEVOVFMJPSAzMiwKKwlHU00wODA4X0lFX0NIT1NFTl9DSEFOTkVMCQk9IDMzLAorCUdTTTA4MDhfSUVfVE9UQUxfUkVTT1VSQ0VfQUNDRVNTSUJMRQk9IDM0LAorCUdTTTA4MDhfSUVfQ0lQSEVSX1JFU1BPTlNFX01PREUJCT0gMzUsCisJR1NNMDgwOF9JRV9DSEFOTkVMX05FRURFRAkJPSAzNiwKKwlHU00wODA4X0lFX1RSQUNFX1RZUEUJCQk9IDM3LAorCUdTTTA4MDhfSUVfVFJJR0dFUklECQkJPSAzOCwKKwlHU00wODA4X0lFX1RSQUNFX1JFRkVSRU5DRQkJPSAzOSwKKwlHU00wODA4X0lFX1RSQU5TQUNUSU9OSUQJCT0gNDAsCisJR1NNMDgwOF9JRV9NT0JJTEVfSURFTlRJVFkJCT0gNDEsCisJR1NNMDgwOF9JRV9PTUNJRAkJCT0gNDIsCisJR1NNMDgwOF9JRV9GT1JXQVJEX0lORElDQVRPUgkJPSA0MywKKwlHU00wODA4X0lFX0NIT1NFTl9FTkNSX0FMRwkJPSA0NCwKKwlHU00wODA4X0lFX0NJUkNVSVRfUE9PTAkJCT0gNDUsCisJR1NNMDgwOF9JRV9DSVJDVUlUX1BPT0xfTElTVAkJPSA0NiwKKwlHU00wODA4X0lFX1RJTUVfSU5ESUNBVElPTgkJPSA0NywKKwlHU00wODA4X0lFX1JFU09VUkNFX1NJVFVBVElPTgkJPSA0OCwKKwlHU00wODA4X0lFX0NVUlJFTlRfQ0hBTk5FTF9UWVBFXzEJPSA0OSwKKwlHU00wODA4X0lFX1FVRVVFSU5HX0lORElDQVRPUgkJPSA1MCwKKwlHU00wODA4X0lFX1NQRUVDSF9WRVJTSU9OCQk9IDY0LAorCUdTTTA4MDhfSUVfQVNTSUdOTUVOVF9SRVFVSVJFTUVOVAk9IDUxLAorCUdTTTA4MDhfSUVfVEFMS0VSX0ZMQUcJCQk9IDUzLAorCUdTTTA4MDhfSUVfQ09OTkVDVElPTl9SRUxFQVNFX1JRU1RFRAk9IDU0LAorCUdTTTA4MDhfSUVfR1JPVVBfQ0FMTF9SRUZFUkVOQ0UJCT0gNTUsCisJR1NNMDgwOF9JRV9FTUxQUF9QUklPUklUWQkJPSA1NiwKKwlHU00wODA4X0lFX0NPTkZJR19FVk9fSU5ESQkJPSA1NywKKwlHU00wODA4X0lFX09MRF9CU1NfVE9fTkVXX0JTU19JTkZPUk1BVElPTgk9IDU4LAorCUdTTTA4MDhfSUVfTFNBX0lERU5USUZJRVIJCT0gNTksCisJR1NNMDgwOF9JRV9MU0FfSURFTlRJRklFUl9MSVNUCQk9IDYwLAorCUdTTTA4MDhfSUVfTFNBX0lORk9STUFUSU9OCQk9IDYxLAorCUdTTTA4MDhfSUVfTENTX1FPUwkJCT0gNjIsCisJR1NNMDgwOF9JRV9MU0FfQUNDRVNTX0NUUkxfU1VQUFIJPSA2MywKKwlHU00wODA4X0lFX0xDU19QUklPUklUWQkJCT0gNjcsCisJR1NNMDgwOF9JRV9MT0NBVElPTl9UWVBFCQk9IDY4LAorCUdTTTA4MDhfSUVfTE9DQVRJT05fRVNUSU1BVEUJCT0gNjksCisJR1NNMDgwOF9JRV9QT1NJVElPTklOR19EQVRBCQk9IDcwLAorCUdTTTA4MDhfSUVfTENTX0NBVVNFCQkJPSA3MSwKKwlHU00wODA4X0lFX0xDU19DTElFTlRfVFlQRQkJPSA3MiwKKwlHU00wODA4X0lFX0FQRFUJCQkJPSA3MywKKwlHU00wODA4X0lFX05FVFdPUktfRUxFTUVOVF9JREVOVElUWQk9IDc0LAorCUdTTTA4MDhfSUVfR1BTX0FTU0lTVEFOQ0VfREFUQQkJPSA3NSwKKwlHU00wODA4X0lFX0RFQ0lQSEVSSU5HX0tFWVMJCT0gNzYsCisJR1NNMDgwOF9JRV9SRVRVUk5fRVJST1JfUlFTVAkJPSA3NywKKwlHU00wODA4X0lFX1JFVFVSTl9FUlJPUl9DQVVTRQkJPSA3OCwKKwlHU00wODA4X0lFX1NFR01FTlRBVElPTgkJCT0gNzksCisJR1NNMDgwOF9JRV9TRVJWSUNFX0hBTkRPVkVSCQk9IDgwLAorCUdTTTA4MDhfSUVfU09VUkNFX1JOQ19UT19UQVJHRVRfUk5DX1RSQU5TUEFSRU5UX1VNVFMJPSA4MSwKKwlHU00wODA4X0lFX1NPVVJDRV9STkNfVE9fVEFSR0VUX1JOQ19UUkFOU1BBUkVOVF9DRE1BMjAwMD0gODIsCisJR1NNMDgwOF9JRV9SRVNFUlZFRF81CQkJPSA2NSwKKwlHU00wODA4X0lFX1JFU0VSVkVEXzYJCQk9IDY2LAorfTsKKworZW51bSBnc20wODA4X2NhdXNlIHsKKwlHU00wODA4X0NBVVNFX1JBRElPX0lOVEVSRkFDRV9NRVNTQUdFX0ZBSUxVUkUJCQk9IDAsCisJR1NNMDgwOF9DQVVTRV9SQURJT19JTlRFUkZBQ0VfRkFJTFVSRQkJCQk9IDEsCisJR1NNMDgwOF9DQVVTRV9VUExJTktfUVVBTElUWQkJCQkJPSAyLAorCUdTTTA4MDhfQ0FVU0VfVVBMSU5LX1NUUkVOR1RICQkJCQk9IDMsCisJR1NNMDgwOF9DQVVTRV9ET1dOTElOS19RVUFMSVRZCQkJCQk9IDQsCisJR1NNMDgwOF9DQVVTRV9ET1dOTElOS19TVFJFTkdUSAkJCQkJPSA1LAorCUdTTTA4MDhfQ0FVU0VfRElTVEFOQ0UJCQkJCQk9IDYsCisJR1NNMDgwOF9DQVVTRV9PX0FORF9NX0lOVEVSVkVOVElPTgkJCQk9IDcsCisJR1NNMDgwOF9DQVVTRV9SRVNQT05TRV9UT19NU0NfSU5WT0NBVElPTgkJCT0gOCwKKwlHU00wODA4X0NBVVNFX0NBTExfQ09OVFJPTAkJCQkJPSA5LAorCUdTTTA4MDhfQ0FVU0VfUkFESU9fSU5URVJGQUNFX0ZBSUxVUkVfUkVWRVJTSU9OCQkJPSAxMCwKKwlHU00wODA4X0NBVVNFX0hBTkRPVkVSX1NVQ0NFU1NGVUwJCQkJPSAxMSwKKwlHU00wODA4X0NBVVNFX0JFVFRFUl9DRUxMCQkJCQk9IDEyLAorCUdTTTA4MDhfQ0FVU0VfRElSRUNURURfUkVUUlkJCQkJCT0gMTMsCisJR1NNMDgwOF9DQVVTRV9KT0lORURfR1JPVVBfQ0FMTF9DSEFOTkVMCQkJCT0gMTQsCisJR1NNMDgwOF9DQVVTRV9UUkFGRklDCQkJCQkJPSAxNSwKKwlHU00wODA4X0NBVVNFX0VRVUlQTUVOVF9GQUlMVVJFCQkJCQk9IDMyLAorCUdTTTA4MDhfQ0FVU0VfTk9fUkFESU9fUkVTT1VSQ0VfQVZBSUxBQkxFCQkJPSAzMywKKwlHU00wODA4X0NBVVNFX1JRU1RFRF9URVJSRVNUUklBTF9SRVNPVVJDRV9VTkFWQUlMQUJMRQk9IDM0LAorCUdTTTA4MDhfQ0FVU0VfQ0NDSF9PVkVSTE9BRAkJCQkJPSAzNSwKKwlHU00wODA4X0NBVVNFX1BST0NFU1NPUl9PVkVSTE9BRAkJCQk9IDM2LAorCUdTTTA4MDhfQ0FVU0VfQlNTX05PVF9FUVVJUFBFRAkJCQkJPSAzNywKKwlHU00wODA4X0NBVVNFX01TX05PVF9FUVVJUFBFRAkJCQkJPSAzOCwKKwlHU00wODA4X0NBVVNFX0lOVkFMSURfQ0VMTAkJCQkJPSAzOSwKKwlHU00wODA4X0NBVVNFX1RSQUZGSUNfTE9BRAkJCQkJPSA0MCwKKwlHU00wODA4X0NBVVNFX1BSRUVNUFRJT04JCQkJCT0gNDEsCisJR1NNMDgwOF9DQVVTRV9SUVNURURfVFJBTlNDT0RJTkdfUkFURV9BREFQVElPTl9VTkFWQUlMQUJMRQk9IDQ4LAorCUdTTTA4MDhfQ0FVU0VfQ0lSQ1VJVF9QT09MX01JU01BVENICQkJCT0gNDksCisJR1NNMDgwOF9DQVVTRV9TV0lUQ0hfQ0lSQ1VJVF9QT09MCQkJCT0gNTAsCisJR1NNMDgwOF9DQVVTRV9SUVNURURfU1BFRUNIX1ZFUlNJT05fVU5BVkFJTEFCTEUJCT0gNTEsCisJR1NNMDgwOF9DQVVTRV9MU0FfTk9UX0FMTE9XRUQJCQkJCT0gNTIsCisJR1NNMDgwOF9DQVVTRV9DSVBIRVJJTkdfQUxHT1JJVEhNX05PVF9TVVBQT1JURUQJCQk9IDY0LAorCUdTTTA4MDhfQ0FVU0VfVEVSUkVTVFJJQUxfQ0lSQ1VJVF9BTFJFQURZX0FMTE9DQVRFRAkJPSA4MCwKKwlHU00wODA4X0NBVVNFX0lOVkFMSURfTUVTU0FHRV9DT05URU5UUwkJCQk9IDgxLAorCUdTTTA4MDhfQ0FVU0VfSU5GT1JNQVRJT05fRUxFTUVOVF9PUl9GSUVMRF9NSVNTSU5HCQk9IDgyLAorCUdTTTA4MDhfQ0FVU0VfSU5DT1JSRUNUX1ZBTFVFCQkJCQk9IDgzLAorCUdTTTA4MDhfQ0FVU0VfVU5LTk9XTl9NRVNTQUdFX1RZUEUJCQkJPSA4NCwKKwlHU00wODA4X0NBVVNFX1VOS05PV05fSU5GT1JNQVRJT05fRUxFTUVOVAkJCT0gODUsCisJR1NNMDgwOF9DQVVTRV9QUk9UT0NPTF9FUlJPUl9CRVRXRUVOX0JTU19BTkRfTVNDCQk9IDk2LAorfTsKKworLyogR1NNIDA4LjA4IDMuMi4yLjExIENoYW5uZWwgVHlwZSAqLworZW51bSBnc20wODA4X2NoYW5faW5kaWNhdG9yIHsKKwlHU00wODA4X0NIQU5fU1BFRUNIID0gMSwKKwlHU00wODA4X0NIQU5fREFUQSAgID0gMiwKKwlHU00wODA4X0NIQU5fU0lHTiAgID0gMywKK307CisKK2VudW0gZ3NtMDgwOF9jaGFuX3JhdGVfdHlwZV9kYXRhIHsKKwlHU00wODA4X0RBVEFfRlVMTF9CTQk9IDB4OCwKKwlHU00wODA4X0RBVEFfSEFMRl9MTQk9IDB4OSwKKwlHU00wODA4X0RBVEFfRlVMTF9SUFJFRgk9IDB4YSwKKwlHU00wODA4X0RBVEFfSEFMRl9QUkVGCT0gMHhiLAorCUdTTTA4MDhfREFUQV9GVUxMX1BSRUZfTk9fQ0hBTkdFCT0gMHgxYSwKKwlHU00wODA4X0RBVEFfSEFMRl9QUkVGX05PX0NIQU5HRQk9IDB4MWIsCisJR1NNMDgwOF9EQVRBX01VTFRJX01BU0sJPSAweDIwLAorCUdTTTA4MDhfREFUQV9NVUxUSV9NQVNLX05PX0NIQU5HRQk9IDB4MzAsCit9OworCitlbnVtIGdzbTA4MDhfY2hhbl9yYXRlX3R5cGVfc3BlZWNoIHsKKwlHU00wODA4X1NQRUVDSF9GVUxMX0JNCT0gMHg4LAorCUdTTTA4MDhfU1BFRUNIX0hBTEZfTE0JPSAweDksCisJR1NNMDgwOF9TUEVFQ0hfRlVMTF9QUkVGPSAweGEsCisJR1NNMDgwOF9TUEVFQ0hfSEFMRl9QUkVGPSAweGIsCisJR1NNMDgwOF9TUEVFQ0hfRlVMTF9QUkVGX05PX0NIQU5HRQk9IDB4MWEsCisJR1NNMDgwOF9TUEVFQ0hfSEFMRl9QUkVGX05PX0NIQU5HRQk9IDB4MWIsCisJR1NNMDgwOF9TUEVFQ0hfUEVSTQk9IDB4ZiwKKwlHU00wODA4X1NQRUVDSF9QRVJNX05PX0NIQU5HRSA9IDB4MWYsCit9OworCitlbnVtIGdzbTA4MDhfcGVybWl0dGVkX3NwZWVjaCB7CisJR1NNMDgwOF9QRVJNX0ZSMQk9IDB4MDEsCisJR1NNMDgwOF9QRVJNX0ZSMgk9IDB4MTEsCisJR1NNMDgwOF9QRVJNX0ZSMwk9IDB4MjEsCisJR1NNMDgwOF9QRVJNX0hSMQk9IEdTTTA4MDhfUEVSTV9GUjEgfCAweDQsCisJR1NNMDgwOF9QRVJNX0hSMgk9IEdTTTA4MDhfUEVSTV9GUjIgfCAweDQsCisJR1NNMDgwOF9QRVJNX0hSMwk9IEdTTTA4MDhfUEVSTV9GUjMgfCAweDQsCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA4XzU4LmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wOF81OC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOTM5OGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wOF81OC5oCkBAIC0wLDAgKzEsNTEyIEBACisjaWZuZGVmIFBST1RPX0dTTV8wOF81OF9ICisjZGVmaW5lIFBST1RPX0dTTV8wOF81OF9ICisKKy8qIEdTTSBSYWRpbyBTaWduYWxsaW5nIExpbmsgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZSAKKyAqIDNHUFAgVFMgMDguNTggdmVyc2lvbiA4LjYuMCBSZWxlYXNlIDE5OTkgLyBFVFNJIFRTIDEwMCA1OTYgVjguNi4wICovCisKKy8qIChDKSAyMDA4IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCitzdHJ1Y3QgYWJpc19yc2xfY29tbW9uX2hkciB7CisJdWludDhfdAltc2dfZGlzY3I7CisJdWludDhfdAltc2dfdHlwZTsKKwl1aW50OF90CWRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogQ2hhcHRlciA4LjMgKi8KK3N0cnVjdCBhYmlzX3JzbF9ybGxfaGRyIHsKKwlzdHJ1Y3QgYWJpc19yc2xfY29tbW9uX2hkciBjOworCXVpbnQ4X3QJaWVfY2hhbjsKKwl1aW50OF90CWNoYW5fbnI7CisJdWludDhfdAlpZV9saW5rX2lkOworCXVpbnQ4X3QJbGlua19pZDsKKwl1aW50OF90CWRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogQ2hhcHRlciA4LjMgYW5kIDguNCAqLworc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciB7CisJc3RydWN0IGFiaXNfcnNsX2NvbW1vbl9oZHIgYzsKKwl1aW50OF90CWllX2NoYW47CisJdWludDhfdAljaGFuX25yOworCXVpbnQ4X3QJZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisKKy8qIENoYXB0ZXIgOS4xICovCisjZGVmaW5lIEFCSVNfUlNMX01ESVNDX1JMTAkJMHgwMgorI2RlZmluZSBBQklTX1JTTF9NRElTQ19ERURfQ0hBTgkJMHgwOAorI2RlZmluZSBBQklTX1JTTF9NRElTQ19DT01fQ0hBTgkJMHgwYworI2RlZmluZSBBQklTX1JTTF9NRElTQ19UUlgJCTB4MTAKKyNkZWZpbmUgQUJJU19SU0xfTURJU0NfTE9DCQkweDIwCisjZGVmaW5lIEFCSVNfUlNMX01ESVNDX0lQQUNDRVNTCQkweDdlCisjZGVmaW5lIEFCSVNfUlNMX01ESVNDX1RSQU5TUAkJMHgwMQorCisjZGVmaW5lIEFCSVNfUlNMX01ESVNDX0lTX1RSQU5TUCh4KQkoeCAmIDB4MDEpCisKKy8qIENoYXB0ZXIgOS4xICovCitlbnVtIGFiaXNfcnNsX21zZ3R5cGUgeworCS8qIFJhZGlvIExpbmsgTGF5ZXIgTWFuYWdlbWVudCAqLworCVJTTF9NVF9EQVRBX1JFUQkJCT0gMHgwMSwKKwlSU0xfTVRfREFUQV9JTkQsCisJUlNMX01UX0VSUk9SX0lORCwKKwlSU0xfTVRfRVNUX1JFUSwKKwlSU0xfTVRfRVNUX0NPTkYsCisJUlNMX01UX0VTVF9JTkQsCisJUlNMX01UX1JFTF9SRVEsCisJUlNMX01UX1JFTF9DT05GLAorCVJTTF9NVF9SRUxfSU5ELAorCVJTTF9NVF9VTklUX0RBVEFfUkVRLAorCVJTTF9NVF9VTklUX0RBVEFfSU5ELAkJLyogMHgwYiAqLworCisJLyogQ29tbW9uIENoYW5uZWwgTWFuYWdlbWVudCAvIFRSWCBNYW5hZ2VtZW50ICovCisJUlNMX01UX0JDQ0hfSU5GTwkJCT0gMHgxMSwKKwlSU0xfTVRfQ0NDSF9MT0FEX0lORCwKKwlSU0xfTVRfQ0hBTl9SUUQsCisJUlNMX01UX0RFTEVURV9JTkQsCisJUlNMX01UX1BBR0lOR19DTUQsCisJUlNMX01UX0lNTUVESUFURV9BU1NJR05fQ01ELAorCVJTTF9NVF9TTVNfQkNfUkVRLAorCS8qIGVtcHR5ICovCisJUlNMX01UX1JGX1JFU19JTkQJCQk9IDB4MTksCisJUlNMX01UX1NBQ0NIX0ZJTEwsCisJUlNMX01UX09WRVJMT0FELAorCVJTTF9NVF9FUlJPUl9SRVBPUlQsCisJUlNMX01UX1NNU19CQ19DTUQsCisJUlNMX01UX0NCQ0hfTE9BRF9JTkQsCisJUlNMX01UX05PVF9DTUQsCQkJLyogMHgxZiAqLworCisJLyogRGVkaWNhdGUgQ2hhbm5lbCBNYW5hZ2VtZW50ICovCisJUlNMX01UX0NIQU5fQUNUSVYJCQk9IDB4MjEsCisJUlNMX01UX0NIQU5fQUNUSVZfQUNLLAorCVJTTF9NVF9DSEFOX0FDVElWX05BQ0ssCisJUlNMX01UX0NPTk5fRkFJTCwKKwlSU0xfTVRfREVBQ1RJVkFURV9TQUNDSCwKKwlSU0xfTVRfRU5DUl9DTUQsCisJUlNMX01UX0hBTkRPX0RFVCwKKwlSU0xfTVRfTUVBU19SRVMsCisJUlNMX01UX01PREVfTU9ESUZZX1JFUSwKKwlSU0xfTVRfTU9ERV9NT0RJRllfQUNLLAorCVJTTF9NVF9NT0RFX01PRElGWV9OQUNLLAorCVJTTF9NVF9QSFlfQ09OVEVYVF9SRVEsCisJUlNMX01UX1BIWV9DT05URVhUX0NPTkYsCisJUlNMX01UX1JGX0NIQU5fUkVMLAorCVJTTF9NVF9NU19QT1dFUl9DT05UUk9MLAorCVJTTF9NVF9CU19QT1dFUl9DT05UUk9MLAkJLyogMHgzMCAqLworCVJTTF9NVF9QUkVQUk9DX0NPTkZJRywKKwlSU0xfTVRfUFJFUFJPQ19NRUFTX1JFUywKKwlSU0xfTVRfUkZfQ0hBTl9SRUxfQUNLLAorCVJTTF9NVF9TQUNDSF9JTkZPX01PRElGWSwKKwlSU0xfTVRfVEFMS0VSX0RFVCwKKwlSU0xfTVRfTElTVEVORVJfREVULAorCVJTTF9NVF9SRU1PVEVfQ09ERUNfQ09ORl9SRVAsCisJUlNMX01UX1JURF9SRVAsCisJUlNMX01UX1BSRV9IQU5ET19OT1RJRiwKKwlSU0xfTVRfTVJfQ09ERUNfTU9EX1JFUSwKKwlSU0xfTVRfTVJfQ09ERUNfTU9EX0FDSywKKwlSU0xfTVRfTVJfQ09ERUNfTU9EX05BQ0ssCisJUlNMX01UX01SX0NPREVDX01PRF9QRVIsCisJUlNMX01UX1RGT19SRVAsCisJUlNMX01UX1RGT19NT0RfUkVRLAkJLyogMHgzZiAqLworCVJTTF9NVF9MT0NBVElPTl9JTkZPCQk9IDB4NDEsCisKKwkvKiBpcC5hY2Nlc3Mgc3BlY2lmaWMgUlNMIG1lc3NhZ2UgdHlwZXMgKi8KKwlSU0xfTVRfSVBBQ19ESVJfUkVUUl9FTlEJPSAweDQwLAorCVJTTF9NVF9JUEFDX1BEQ0hfQUNUCQk9IDB4NDgsCisJUlNMX01UX0lQQUNfUERDSF9BQ1RfQUNLLAorCVJTTF9NVF9JUEFDX1BEQ0hfQUNUX05BQ0ssCisJUlNMX01UX0lQQUNfUERDSF9ERUFDVAkJPSAweDRiLAorCVJTTF9NVF9JUEFDX1BEQ0hfREVBQ1RfQUNLLAorCVJTTF9NVF9JUEFDX1BEQ0hfREVBQ1RfTkFDSywKKwlSU0xfTVRfSVBBQ19DT05ORUNUX01VWAkJPSAweDUwLAorCVJTTF9NVF9JUEFDX0NPTk5FQ1RfTVVYX0FDSywKKwlSU0xfTVRfSVBBQ19DT05ORUNUX01VWF9OQUNLLAorCVJTTF9NVF9JUEFDX0JJTkRfTVVYCQk9IDB4NTMsCisJUlNMX01UX0lQQUNfQklORF9NVVhfQUNLLAorCVJTTF9NVF9JUEFDX0JJTkRfTVVYX05BQ0ssCisJUlNMX01UX0lQQUNfRElTQ19NVVgJCT0gMHg1NiwKKwlSU0xfTVRfSVBBQ19ESVNDX01VWF9BQ0ssCisJUlNMX01UX0lQQUNfRElTQ19NVVhfTkFDSywKKwlSU0xfTVRfSVBBQ19DUkNYCQk9IDB4NzAsCQkvKiBCaW5kIHRvIGxvY2FsIEJUUyBSVFAgcG9ydCAqLworCVJTTF9NVF9JUEFDX0NSQ1hfQUNLLAorCVJTTF9NVF9JUEFDX0NSQ1hfTkFDSywKKwlSU0xfTVRfSVBBQ19NRENYCQk9IDB4NzMsCisJUlNMX01UX0lQQUNfTURDWF9BQ0ssCisJUlNMX01UX0lQQUNfTURDWF9OQUNLLAorCVJTTF9NVF9JUEFDX0RMQ1hfSU5ECQk9IDB4NzYsCisJUlNMX01UX0lQQUNfRExDWAkJPSAweDc3LAorCVJTTF9NVF9JUEFDX0RMQ1hfQUNLLAorCVJTTF9NVF9JUEFDX0RMQ1hfTkFDSywKK307CisKKy8qIFNpZW1lbnMgdmVuZG9yLXNwZWNpZmljICovCitlbnVtIGFiaXNfcnNsX21zZ3R5cGVfc2llbWVucyB7CisJUlNMX01UX1NJRU1FTlNfTVJQQ0kJCT0gMHg0MSwKKwlSU0xfTVRfU0lFTUVOU19JTlRSQUNfSE9fQ09ORF9JTkQgPSAweDQyLAorCVJTTF9NVF9TSUVNRU5TX0lOVEVSQ19IT19DT05EX0lORCA9IDB4NDMsCisJUlNMX01UX1NJRU1FTlNfRk9SQ0VEX0hPX1JFUQk9IDB4NDQsCisJUlNMX01UX1NJRU1FTlNfUFJFRl9BUkVBX1JFUQk9IDB4NDUsCisJUlNMX01UX1NJRU1FTlNfUFJFRl9BUkVBCT0gMHg0NiwKKwlSU0xfTVRfU0lFTUVOU19TVEFSVF9UUkFDRQk9IDB4NDcsCisJUlNMX01UX1NJRU1FTlNfU1RBUlRfVFJBQ0VfQUNLCT0gMHg0OCwKKwlSU0xfTVRfU0lFTUVOU19TVE9QX1RSQUNFCT0gMHg0OSwKKwlSU0xfTVRfU0lFTUVOU19UUk1SCQk9IDB4NGEsCisJUlNMX01UX1NJRU1FTlNfSE9fRkFJTF9JTkQJPSAweDRiLAorCVJTTF9NVF9TSUVNRU5TX1NUT1BfVFJBQ0VfQUNLCT0gMHg0YywKKwlSU0xfTVRfU0lFTUVOU19VUExGCQk9IDB4NGQsCisJUlNMX01UX1NJRU1FTlNfVVBMQgkJPSAweDRlLAorCVJTTF9NVF9TSUVNRU5TX1NFVF9TWVNfSU5GT18xMAk9IDB4NGYsCisJUlNMX01UX1NJRU1FTlNfTU9ESUZfQ09ORF9JTkQJPSAweDUwLAorfTsKKworLyogQ2hhcHRlciA5LjMgKi8KK2VudW0gYWJpc19yc2xfaWUgeworCVJTTF9JRV9DSEFOX05SCQkJPSAweDAxLAorCVJTTF9JRV9MSU5LX0lERU5ULAorCVJTTF9JRV9BQ1RfVFlQRSwKKwlSU0xfSUVfQlNfUE9XRVIsCisJUlNMX0lFX0NIQU5fSURFTlQsCisJUlNMX0lFX0NIQU5fTU9ERSwKKwlSU0xfSUVfRU5DUl9JTkZPLAorCVJTTF9JRV9GUkFNRV9OVU1CRVIsCisJUlNMX0lFX0hBTkRPX1JFRiwKKwlSU0xfSUVfTDFfSU5GTywKKwlSU0xfSUVfTDNfSU5GTywKKwlSU0xfSUVfTVNfSURFTlRJVFksCisJUlNMX0lFX01TX1BPV0VSLAorCVJTTF9JRV9QQUdJTkdfR1JPVVAsCisJUlNMX0lFX1BBR0lOR19MT0FELAorCVJTTF9JRV9QWUhTX0NPTlRFWFQJCT0gMHgxMCwKKwlSU0xfSUVfQUNDRVNTX0RFTEFZLAorCVJTTF9JRV9SQUNIX0xPQUQsCisJUlNMX0lFX1JFUV9SRUZFUkVOQ0UsCisJUlNMX0lFX1JFTEVBU0VfTU9ERSwKKwlSU0xfSUVfUkVTT1VSQ0VfSU5GTywKKwlSU0xfSUVfUkxNX0NBVVNFLAorCVJTTF9JRV9TVEFSVE5HX1RJTUUsCisJUlNMX0lFX1RJTUlOR19BRFZBTkNFLAorCVJTTF9JRV9VUExJTktfTUVBUywKKwlSU0xfSUVfQ0FVU0UsCisJUlNMX0lFX01FQVNfUkVTX05SLAorCVJTTF9JRV9NU0dfSUQsCisJLyogcmVzZXJ2ZWQgKi8KKwlSU0xfSUVfU1lTSU5GT19UWVBFCQk9IDB4MWUsCisJUlNMX0lFX01TX1BPV0VSX1BBUkFNLAorCVJTTF9JRV9CU19QT1dFUl9QQVJBTSwKKwlSU0xfSUVfUFJFUFJPQ19QQVJBTSwKKwlSU0xfSUVfUFJFUFJPQ19NRUFTLAorCVJTTF9JRV9JTU1fQVNTX0lORk8sCQkvKiBQaGFzZSAxICgzLjYuMCksIGxhdGVyIEZ1bGwgYmVsb3cgKi8KKwlSU0xfSUVfU01TQ0JfSU5GTwkJPSAweDI0LAorCVJTTF9JRV9NU19USU1JTkdfT0ZGU0VULAorCVJTTF9JRV9FUlJfTVNHLAorCVJTTF9JRV9GVUxMX0JDQ0hfSU5GTywKKwlSU0xfSUVfQ0hBTl9ORUVERUQsCisJUlNMX0lFX0NCX0NNRF9UWVBFLAorCVJTTF9JRV9TTVNDQl9NU0csCisJUlNMX0lFX0ZVTExfSU1NX0FTU19JTkZPLAorCVJTTF9JRV9TQUNDSF9JTkZPLAorCVJTTF9JRV9DQkNIX0xPQURfSU5GTywKKwlSU0xfSUVfU01TQ0JfQ0hBTl9JTkRJQ0FUT1IsCisJUlNMX0lFX0dST1VQX0NBTExfUkVGLAorCVJTTF9JRV9DSEFOX0RFU0MJCT0gMHgzMCwKKwlSU0xfSUVfTkNIX0RSWF9JTkZPLAorCVJTTF9JRV9DTURfSU5ESUNBVE9SLAorCVJTTF9JRV9FTUxQUF9QUklPLAorCVJTTF9JRV9VSUMsCisJUlNMX0lFX01BSU5fQ0hBTl9SRUYsCisJUlNMX0lFX01SX0NPTkZJRywKKwlSU0xfSUVfTVJfQ09OVFJPTCwKKwlSU0xfSUVfU1VQX0NPREVDX1RZUEVTLAorCVJTTF9JRV9DT0RFQ19DT05GSUcsCisJUlNMX0lFX1JURCwKKwlSU0xfSUVfVEZPX1NUQVRVUywKKwlSU0xfSUVfTExQX0FQRFUsCisJLyogU2llbWVucyB2ZW5kb3Itc3BlY2lmaWMgKi8KKwlSU0xfSUVfU0lFTUVOU19NUlBDSQkJPSAweDQwLAorCVJTTF9JRV9TSUVNRU5TX1BSRUZfQVJFQV9UWVBFCT0gMHg0MywKKwlSU0xfSUVfU0lFTUVOU19JTklOX0NFTExfSE9fUEFSCT0gMHg0NSwKKwlSU0xfSUVfU0lFTUVOU19UUkFDRV9SRUZfTlIJPSAweDQ2LAorCVJTTF9JRV9TSUVNRU5TX0lOVF9UUkFDRV9JRFgJPSAweDQ3LAorCVJTTF9JRV9TSUVNRU5TX0wyX0hEUl9JTkZPCT0gMHg0OCwKKwlSU0xfSUVfU0lFTUVOU19ISUdIRVNUX1JBVEUJPSAweDRlLAorCVJTTF9JRV9TSUVNRU5TX1NVR0dFU1RFRF9SQVRFCT0gMHg0ZiwKKworCS8qIGlwLmFjY2VzcyAqLworCVJTTF9JRV9JUEFDX1NSVFBfQ09ORklHCT0gMHhlMCwKKwlSU0xfSUVfSVBBQ19QUk9YWV9VRFAJPSAweGUxLAorCVJTTF9JRV9JUEFDX0JTQ01QTF9UT1VUCT0gMHhlMiwKKwlSU0xfSUVfSVBBQ19SRU1PVEVfSVAJPSAweGYwLAorCVJTTF9JRV9JUEFDX1JFTU9URV9QT1JUCT0gMHhmMSwKKwlSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRAk9IDB4ZjIsCisJUlNMX0lFX0lQQUNfTE9DQUxfUE9SVAk9IDB4ZjMsCisJUlNMX0lFX0lQQUNfU1BFRUNIX01PREUJPSAweGY0LAorCVJTTF9JRV9JUEFDX0xPQ0FMX0lQCT0gMHhmNSwKKwlSU0xfSUVfSVBBQ19DT05OX1NUQVQJPSAweGY2LAorCVJTTF9JRV9JUEFDX0hPX0NfUEFSTVMJPSAweGY3LAorCVJTTF9JRV9JUEFDX0NPTk5fSUQJPSAweGY4LAorCVJTTF9JRV9JUEFDX1JUUF9DU0RfRk1UCT0gMHhmOSwKKwlSU0xfSUVfSVBBQ19SVFBfSklUX0JVRgk9IDB4ZmEsCisJUlNMX0lFX0lQQUNfUlRQX0NPTVBSCT0gMHhmYiwKKwlSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRDI9IDB4ZmMsCisJUlNMX0lFX0lQQUNfUlRQX01QTEVYCT0gMHhmZCwKKwlSU0xfSUVfSVBBQ19SVFBfTVBMRVhfSUQ9IDB4ZmUsCit9OworCisvKiBDaGFwdGVyIDkuMy4xICovCisjZGVmaW5lIFJTTF9DSEFOX05SX01BU0sJMHhmOAorI2RlZmluZSBSU0xfQ0hBTl9CbV9BQ0NIcwkweDA4CisjZGVmaW5lIFJTTF9DSEFOX0xtX0FDQ0hzCTB4MTAJLyogLi4gMHgxOCAqLworI2RlZmluZSBSU0xfQ0hBTl9TRENDSDRfQUNDSAkweDIwCS8qIC4uIDB4MzggKi8KKyNkZWZpbmUgUlNMX0NIQU5fU0RDQ0g4X0FDQ0gJMHg0MAkvKiAuLi4weDc4ICovCisjZGVmaW5lIFJTTF9DSEFOX0JDQ0gJCTB4ODAKKyNkZWZpbmUgUlNMX0NIQU5fUkFDSAkJMHg4OAorI2RlZmluZSBSU0xfQ0hBTl9QQ0hfQUdDSAkweDkwCisKKy8qIENoYXB0ZXIgOS4zLjMgKi8KKyNkZWZpbmUgUlNMX0FDVF9UWVBFX0lOSVRJQUwJMHgwMAorI2RlZmluZSBSU0xfQUNUX1RZUEVfUkVBQ1QJMHg4MAorI2RlZmluZSBSU0xfQUNUX0lOVFJBX0lNTV9BU1MJMHgwMAorI2RlZmluZSBSU0xfQUNUX0lOVFJBX05PUk1fQVNTCTB4MDEKKyNkZWZpbmUgUlNMX0FDVF9JTlRFUl9BU1lOQwkweDAyCisjZGVmaW5lIFJTTF9BQ1RfSU5URVJfU1lOQwkweDAzCisjZGVmaW5lIFJTTF9BQ1RfU0VDT05EX0FERAkweDA0CisjZGVmaW5lIFJTTF9BQ1RfU0VDT05EX01VTFRJCTB4MDUKKworLyogQ2hhcHRlciA5LjMuNiAqLworc3RydWN0IHJzbF9pZV9jaGFuX21vZGUgeworCXVpbnQ4X3QgZHR4X2R0dTsKKwl1aW50OF90IHNwZF9pbmQ7CisJdWludDhfdCBjaGFuX3J0OworCXVpbnQ4X3QgY2hhbl9yYXRlOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisjZGVmaW5lIFJTTF9DTU9EX0RUWHUJCTB4MDEJLyogdXBsaW5rICovCisjZGVmaW5lIFJTTF9DTU9EX0RUWGQJCTB4MDIJLyogZG93bmxpbmsgKi8KK2VudW0gcnNsX2Ntb2Rfc3BkIHsKKwlSU0xfQ01PRF9TUERfU1BFRUNICT0gMHgwMSwKKwlSU0xfQ01PRF9TUERfREFUQQk9IDB4MDIsCisJUlNMX0NNT0RfU1BEX1NJR04JPSAweDAzLAorfTsKKyNkZWZpbmUgUlNMX0NNT0RfQ1JUX1NEQ0NICTB4MDEKKyNkZWZpbmUgUlNMX0NNT0RfQ1JUX1RDSF9CbQkweDA4CS8qIGZ1bGwtcmF0ZSAqLworI2RlZmluZSBSU0xfQ01PRF9DUlRfVENIX0xtCTB4MDkJLyogaGFsZi1yYXRlICovCisvKiBGSVhNRTogTW9yZSBDUlQgdHlwZXMgKi8KKy8qIFNwZWVjaCAqLworI2RlZmluZSBSU0xfQ01PRF9TUF9HU00xCTB4MDEKKyNkZWZpbmUgUlNMX0NNT0RfU1BfR1NNMgkweDExCisjZGVmaW5lIFJTTF9DTU9EX1NQX0dTTTMJMHgyMQorLyogRGF0YSAqLworI2RlZmluZSBSU0xfQ01PRF9TUF9OVF8xNGs1CTB4NTgKKyNkZWZpbmUgUlNMX0NNT0RfU1BfTlRfMTJrMAkweDUwCisjZGVmaW5lIFJTTF9DTU9EX1NQX05UXzZrMAkweDUxCisKKy8qIENoYXB0ZXIgOS4zLjUgKi8KK3N0cnVjdCByc2xfaWVfY2hhbl9pZGVudCB7CisJLyogR1NNIDA0LjA4IDEwLjUuMi41ICovCisJc3RydWN0IHsKKwkJdWludDhfdCBpZWk7CisJCXVpbnQ4X3QgY2hhbl9ucjsJLyogZW5jX2NoYW5fbnIgKi8KKwkJdWludDhfdCBvY3QzOworCQl1aW50OF90IG9jdDQ7CisJfSBjaGFuX2Rlc2M7CisjaWYgMAkvKiBzcGVjIHNheXMgd2UgbmVlZCB0aGlzIGJ1dCBBYmlzc2ltIGRvZXNuJ3QgdXNlIGl0ICovCisJc3RydWN0IHsKKwkJdWludDhfdCB0YWc7CisJCXVpbnQ4X3QgbGVuOworCX0gbW9iaWxlX2FsbG9jOworI2VuZGlmCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogQ2hhcHRlciA5LjMuMjIgKi8KKyNkZWZpbmUgUkxMX0NBVVNFX1QyMDBfRVhQSVJFRAkJMHgwMQorI2RlZmluZSBSTExfQ0FVU0VfUkVFU1RfUkVRCQkweDAyCisjZGVmaW5lIFJMTF9DQVVTRV9VTlNPTF9VQV9SRVNQCQkweDAzCisjZGVmaW5lIFJMTF9DQVVTRV9VTlNPTF9ETV9SRVNQCQkweDA0CisjZGVmaW5lIFJMTF9DQVVTRV9VTlNPTF9ETV9SRVNQX01GCTB4MDUKKyNkZWZpbmUgUkxMX0NBVVNFX1VOU09MX1NQUlZfUkVTUAkweDA2CisjZGVmaW5lIFJMTF9DQVVTRV9TRVFfRVJSCQkweDA3CisjZGVmaW5lIFJMTF9DQVVTRV9VRlJNX0lOQ19QQVJBTQkweDA4CisjZGVmaW5lIFJMTF9DQVVTRV9TRlJNX0lOQ19QQVJBTQkweDA5CisjZGVmaW5lIFJMTF9DQVVTRV9JRlJNX0lOQ19NQklUUwkweDBhCisjZGVmaW5lIFJMTF9DQVVTRV9JRlJNX0lOQ19MRU4JCTB4MGIKKyNkZWZpbmUgUkxMX0NBVVNFX0ZSTV9VTklNUEwJCTB4MGMKKyNkZWZpbmUgUkxMX0NBVVNFX1NBQk1fTUYJCTB4MGQKKyNkZWZpbmUgUkxMX0NBVVNFX1NBQk1fSU5GT19OT1RBTEwJMHgwZQorCisvKiBDaGFwdGVyIDkuMy4yNiAqLworI2RlZmluZSBSU0xfRVJSQ0xTX05PUk1BTAkJMHgwMAorI2RlZmluZSBSU0xfRVJSQ0xTX1JFU09VUkNFX1VOQVZBSUwJMHgyMAorI2RlZmluZSBSU0xfRVJSQ0xTX1NFUlZJQ0VfVU5BVkFJTAkweDMwCisjZGVmaW5lIFJTTF9FUlJDTFNfU0VSVklDRV9VTklNUEwJMHg0MAorI2RlZmluZSBSU0xfRVJSQ0xTX0lOVkFMX01TRwkJMHg1MAorI2RlZmluZSBSU0xfRVJSQ0xTX1BST1RPX0VSUk9SCQkweDYwCisjZGVmaW5lIFJTTF9FUlJDTFNfSU5URVJXT1JLSU5HCQkweDcwCisKKy8qIG5vcm1hbCBldmVudCAqLworI2RlZmluZSBSU0xfRVJSX1JBRElPX0lGX0ZBSUwJCTB4MDAKKyNkZWZpbmUgUlNMX0VSUl9SQURJT19MSU5LX0ZBSUwJCTB4MDEKKyNkZWZpbmUgUlNMX0VSUl9IQU5ET1ZFUl9BQ0NfRkFJTAkweDAyCisjZGVmaW5lIFJTTF9FUlJfVEFMS0VSX0FDQ19GQUlMCQkweDAzCisjZGVmaW5lIFJTTF9FUlJfT01fSU5URVJWRU5USU9OCQkweDA3CisjZGVmaW5lIFJTTF9FUlJfTk9STUFMX1VOU1BFQwkJMHgwZgorI2RlZmluZSBSU0xfRVJSX1RfTVNSRlBDSV9FWFAJCTB4MTgKKy8qIHJlc291cmNlIHVuYXZhaWxhYmxlICovCisjZGVmaW5lIFJTTF9FUlJfRVFVSVBNRU5UX0ZBSUwJCTB4MjAKKyNkZWZpbmUgUlNMX0VSUl9SUl9VTkFWQUlMCQkweDIxCisjZGVmaW5lIFJTTF9FUlJfVEVSUl9DSF9GQUlMCQkweDIyCisjZGVmaW5lIFJTTF9FUlJfQ0NDSF9PVkVSTE9BRAkJMHgyMworI2RlZmluZSBSU0xfRVJSX0FDQ0hfT1ZFUkxPQUQJCTB4MjQKKyNkZWZpbmUgUlNMX0VSUl9QUk9DRVNTT1JfT1ZFUkxPQUQJMHgyNQorI2RlZmluZSBSU0xfRVJSX1JFU19VTkFWQUlMCQkweDJmCisvKiBzZXJ2aWNlIG9yIG9wdGlvbiBub3QgYXZhaWxhYmxlICovCisjZGVmaW5lIFJTTF9FUlJfVFJBTlNDX1VOQVZBSUwJCTB4MzAKKyNkZWZpbmUgUlNMX0VSUl9TRVJWX09QVF9VTkFWQUlMCTB4M2YKKy8qIHNlcnZpY2Ugb3Igb3B0aW9uIG5vdCBpbXBsZW1lbnRlZCAqLworI2RlZmluZSBSU0xfRVJSX0VOQ1JfVU5JTVBMCQkweDQwCisjZGVmaW5lIFJTTF9FUlJfU0VSVl9PUFRfVU5JTVBMCQkweDRmCisvKiBpbnZhbGlkIG1lc3NhZ2UgKi8KKyNkZWZpbmUgUlNMX0VSUl9SQ0hfQUxSX0FDVFZfQUxMT0MJMHg1MAorI2RlZmluZSBSU0xfRVJSX0lOVkFMSURfTUVTU0FHRQkJMHg1ZgorLyogcHJvdG9jb2wgZXJyb3IgKi8KKyNkZWZpbmUgUlNMX0VSUl9NU0dfRElTQ1IJCTB4NjAKKyNkZWZpbmUgUlNMX0VSUl9NU0dfVFlQRQkJMHg2MQorI2RlZmluZSBSU0xfRVJSX01TR19TRVEJCQkweDYyCisjZGVmaW5lIFJTTF9FUlJfSUVfRVJST1IJCTB4NjMKKyNkZWZpbmUgUlNMX0VSUl9NQU5EX0lFX0VSUk9SCQkweDY0CisjZGVmaW5lIFJTTF9FUlJfT1BUX0lFX0VSUk9SCQkweDY1CisjZGVmaW5lIFJTTF9FUlJfSUVfTk9ORVhJU1QJCTB4NjYKKyNkZWZpbmUgUlNMX0VSUl9JRV9MRU5HVEgJCTB4NjcKKyNkZWZpbmUgUlNMX0VSUl9JRV9DT05URU5UCQkweDY4CisjZGVmaW5lIFJTTF9FUlJfUFJPVE8JCQkweDZmCisvKiBpbnRlcndvcmtpbmcgKi8KKyNkZWZpbmUgUlNMX0VSUl9JTlRFUldPUktJTkcJCTB4N2YKKworLyogQ2hhcHRlciA5LjMuMzAgKi8KKyNkZWZpbmUgUlNMX1NZU1RFTV9JTkZPXzgJMHgwMAorI2RlZmluZSBSU0xfU1lTVEVNX0lORk9fMQkweDAxCisjZGVmaW5lIFJTTF9TWVNURU1fSU5GT18yCTB4MDIKKyNkZWZpbmUgUlNMX1NZU1RFTV9JTkZPXzMJMHgwMworI2RlZmluZSBSU0xfU1lTVEVNX0lORk9fNAkweDA0CisjZGVmaW5lIFJTTF9TWVNURU1fSU5GT181CTB4MDUKKyNkZWZpbmUgUlNMX1NZU1RFTV9JTkZPXzYJMHgwNgorI2RlZmluZSBSU0xfU1lTVEVNX0lORk9fNwkweDA3CisjZGVmaW5lIFJTTF9TWVNURU1fSU5GT18xNgkweDA4CisjZGVmaW5lIFJTTF9TWVNURU1fSU5GT18xNwkweDA5CisjZGVmaW5lIFJTTF9TWVNURU1fSU5GT18yYmlzCTB4MGEKKyNkZWZpbmUgUlNMX1NZU1RFTV9JTkZPXzJ0ZXIJMHgwYgorI2RlZmluZSBSU0xfU1lTVEVNX0lORk9fNWJpcwkweDBkCisjZGVmaW5lIFJTTF9TWVNURU1fSU5GT181dGVyCTB4MGUKKyNkZWZpbmUgUlNMX1NZU1RFTV9JTkZPXzEwCTB4MGYKKyNkZWZpbmUgUkVMX0VYVF9NRUFTX09SREVSCTB4NDcKKyNkZWZpbmUgUlNMX01FQVNfSU5GTwkJMHg0OAorI2RlZmluZSBSU0xfU1lTVEVNX0lORk9fMTMJMHgyOAorI2RlZmluZSBSU0xfU1lTVEVNX0lORk9fMnF1YXRlcgkweDI5CisjZGVmaW5lIFJTTF9TWVNURU1fSU5GT185CTB4MmEKKyNkZWZpbmUgUlNMX1NZU1RFTV9JTkZPXzE4CTB4MmIKKyNkZWZpbmUgUlNMX1NZU1RFTV9JTkZPXzE5CTB4MmMKKyNkZWZpbmUgUlNMX1NZU1RFTV9JTkZPXzIwCTB4MmQKKworLyogQ2hhcHRlciA5LjMuNDAgKi8KKyNkZWZpbmUgUlNMX0NIQU5ORUVEX0FOWQkweDAwCisjZGVmaW5lIFJTTF9DSEFOTkVFRF9TRENDSAkweDAxCisjZGVmaW5lIFJTTF9DSEFOTkVFRF9UQ0hfRgkweDAyCisjZGVmaW5lIFJTTF9DSEFOTkVFRF9UQ0hfRm9ySAkweDAzCisKKy8qIENoYXB0ZXIgMy4zLjIuMyBCcm9jYXN0IGNvbnRyb2wgY2hhbm5lbCAqLworLyogQ0NDSC1DT05GLCBOQyBpcyBub3QgY29tYmluZWQgKi8KKyNkZWZpbmUgUlNMX0JDQ0hfQ0NDSF9DT05GXzFfTkMJMHgwMAorI2RlZmluZSBSU0xfQkNDSF9DQ0NIX0NPTkZfMV9DCTB4MDEKKyNkZWZpbmUgUlNMX0JDQ0hfQ0NDSF9DT05GXzJfTkMJMHgwMgorI2RlZmluZSBSU0xfQkNDSF9DQ0NIX0NPTkZfM19OQwkweDA0CisjZGVmaW5lIFJTTF9CQ0NIX0NDQ0hfQ09ORl80X05DCTB4MDYKKworLyogQlMtUEEtTUZSTVMgKi8KKyNkZWZpbmUgUlNMX0JTX1BBX01GUk1TXzIJMHgwMAorI2RlZmluZSBSU0xfQlNfUEFfTUZSTVNfMwkweDAxCisjZGVmaW5lIFJTTF9CU19QQV9NRlJNU180CTB4MDIKKyNkZWZpbmUgUlNMX0JTX1BBX01GUk1TXzUJMHgwMworI2RlZmluZSBSU0xfQlNfUEFfTUZSTVNfNgkweDA0CisjZGVmaW5lIFJTTF9CU19QQV9NRlJNU183CTB4MDUKKyNkZWZpbmUgUlNMX0JTX1BBX01GUk1TXzgJMHgwNgorI2RlZmluZSBSU0xfQlNfUEFfTUZSTVNfOQkweDA3CisKKy8qIFJTTF9JRV9JUEFDX1JUUF9QQVlMT0FEWzJdICovCitlbnVtIHJzbF9pcGFjX3J0cF9wYXlsb2FkIHsKKwlSU0xfSVBBQ19SVFBfR1NNCT0gMSwKKwlSU0xfSVBBQ19SVFBfRUZSLAorCVJTTF9JUEFDX1JUUF9BTVIsCisJUlNMX0lQQUNfUlRQX0NTRCwKKwlSU0xfSVBBQ19SVFBfTVVYLAorfTsKKworLyogUlNMX0lFX0lQQUNfU1BFRUNIX01PREUsIGxvd2VyIGZvdXIgYml0cyAqLworZW51bSByc2xfaXBhY19zcGVlY2hfbW9kZV9zIHsKKwlSU0xfSVBBQ19TUEVFQ0hfR1NNX0ZSID0gMCwJLyogR1NNIEZSIChUeXBlIDEsIEZTKSAqLworCVJTTF9JUEFDX1NQRUVDSF9HU01fRUZSID0gMSwJLyogR1NNIEVGUiAoVHlwZSAyLCBGUykgKi8KKwlSU0xfSVBBQ19TUEVFQ0hfR1NNX0FNUl9GUiA9IDIsCS8qIEdTTSBBTVIvRlIgKFR5cGUgMywgRlMpICovCisJUlNMX0lQQUNfU1BFRUNIX0dTTV9IUiA9IDMsCS8qIEdTTSBIUiAoVHlwZSAxLCBIUykgKi8KKwlSU0xfSVBBQ19TUEVFQ0hfR1NNX0FNUl9IUiA9IDUsCS8qIEdTTSBBTVIvaHIgKFR5cGUgMywgSFMpICovCisJUlNMX0lQQUNfU1BFRUNIX0FTX1JUUCA9IDB4ZiwJLyogQXMgc3BlY2lmaWVkIGJ5IFJUUCBQYXlsb2FkIElFICovCit9OworLyogUlNMX0lFX0lQQUNfU1BFRUNIX01PREUsIHVwcGVyIGZvdXIgYml0cyAqLworZW51bSByc2xfaXBhY19zcGVlY2hfbW9kZV9tIHsKKwlSU0xfSVBBQ19TUEVFQ0hfTV9SWFRYID0gMCwJLyogU2VuZCBhbmQgUmVjZWl2ZSAqLworCVJTTF9JUEFDX1NQRUVDSF9NX1JYID0gMSwJLyogUmVjZWl2ZSBvbmx5ICovCisJUlNMX0lQQUNfU1BFRUNIX01fVFggPSAyLAkvKiBTZW5kIG9ubHkgKi8KK307CisKKy8qIFJTTF9JRV9JUEFDX1JUUF9DU0RfRk1ULCBsb3dlciBmb3VyIGJpdHMgKi8KK2VudW0gcnNsX2lwYWNfcnRwX2NzZF9mb3JtYXRfZCB7CisJUlNMX0lQQUNfUlRQX0NTRF9FWFRfVFJBVSA9IDAsCisJUlNMX0lQQUNfUlRQX0NTRF9OT05fVFJBVSA9IDEsCisJUlNMX0lQQUNfUlRQX0NTRF9UUkFVX0JUUyA9IDIsCisJUlNMX0lQQUNfUlRQX0NTRF9JV0ZfRlJFRSA9IDMsCit9OworLyogUlNMX0lFX0lQQUNfUlRQX0NTRF9GTVQsIHVwcGVyIGZvdXIgYml0cyAqLworZW51bSByc2xfaXBhY19ydHBfY3NkX2Zvcm1hdF9pciB7CisJUlNMX0lQQUNfUlRQX0NTRF9JUl84ayA9IDAsCisJUlNMX0lQQUNfUlRQX0NTRF9JUl8xNmsgPSAxLAorCVJTTF9JUEFDX1JUUF9DU0RfSVJfMzJrID0gMiwKKwlSU0xfSVBBQ19SVFBfQ1NEX0lSXzY0ayA9IDMsCit9OworCisvKiBTaWVtZW5zIHZlbmRvci1zcGVjaWZpYyBSU0wgZXh0ZW5zaW9ucyAqLworc3RydWN0IHJzbF9tcnBjaSB7CisJdWludDhfdCBwb3dlcl9jbGFzczozLAorCQkgdmdjc19jYXBhYmxlOjEsCisJCSB2YnNfY2FwYWJsZToxLAorCQkgZ3NtX3BoYXNlOjI7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworZW51bSByc2xfbXJwY2lfcHdyY2xhc3MgeworCVJTTF9NUlBDSV9QV1JDXzEJPSAwLAorCVJTTF9NUlBDSV9QV1JDXzIJPSAxLAorCVJTTF9NUlBDSV9QV1JDXzMJPSAyLAorCVJTTF9NUlBDSV9QV1JDXzQJPSAzLAorCVJTTF9NUlBDSV9QV1JDXzUJPSA0LAorfTsKK2VudW0gcnNsX21ycGNpX3BoYXNlIHsKKwlSU0xfTVJQQ0lfUEhBU0VfMQk9IDAsCisJLyogcmVzZXJ2ZWQgKi8KKwlSU0xfTVJQQ0lfUEhBU0VfMgk9IDIsCisJUlNMX01SUENJX1BIQVNFXzJQTFVTCT0gMywKK307CisKKworI2VuZGlmIC8qIFBST1RPX0dTTV8wOF81OF9IICovCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8xMl8yMS5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMTJfMjEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2FlNDVkCi0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMTJfMjEuaApAQCAtMCwwICsxLDcxMyBAQAorI2lmbmRlZiBQUk9UT19HU01fMTJfMjFfSAorI2RlZmluZSBQUk9UT19HU01fMTJfMjFfSAorCisvKiBHU00gTmV0d29yayBNYW5hZ2VtZW50IG1lc3NhZ2VzIG9uIHRoZSBBLWJpcyBpbnRlcmZhY2UgCisgKiAzR1BQIFRTIDEyLjIxIHZlcnNpb24gOC4wLjAgUmVsZWFzZSAxOTk5IC8gRVRTSSBUUyAxMDAgNjIzIFY4LjAuMCAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorCisvKiBnZW5lcmljIGhlYWRlciBpbiBmcm9udCBvZiBldmVyeSBPTUwgbWVzc2FnZSBhY2NvcmRpbmcgdG8gVFMgMDguNTkgKi8KK3N0cnVjdCBhYmlzX29tX2hkciB7CisJdWludDhfdAltZGlzYzsKKwl1aW50OF90CXBsYWNlbWVudDsKKwl1aW50OF90CXNlcXVlbmNlOworCXVpbnQ4X3QJbGVuZ3RoOworCXVpbnQ4X3QJZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIEFCSVNfT01fTURJU0NfRk9NCQkweDgwCisjZGVmaW5lIEFCSVNfT01fTURJU0NfTU1JCQkweDQwCisjZGVmaW5lIEFCSVNfT01fTURJU0NfVFJBVQkJMHgyMAorI2RlZmluZSBBQklTX09NX01ESVNDX01BTlVGCQkweDEwCisjZGVmaW5lIEFCSVNfT01fUExBQ0VNRU5UX09OTFkJCTB4ODAKKyNkZWZpbmUgQUJJU19PTV9QTEFDRU1FTlRfRklSU1QgCTB4NDAKKyNkZWZpbmUgQUJJU19PTV9QTEFDRU1FTlRfTUlERExFCTB4MjAKKyNkZWZpbmUgQUJJU19PTV9QTEFDRU1FTlRfTEFTVAkJMHgxMAorCitzdHJ1Y3QgYWJpc19vbV9vYmpfaW5zdCB7CisJdWludDhfdAlidHNfbnI7CisJdWludDhfdAl0cnhfbnI7CisJdWludDhfdAl0c19ucjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgYWJpc19vbV9mb21faGRyIHsKKwl1aW50OF90CW1zZ190eXBlOworCXVpbnQ4X3QJb2JqX2NsYXNzOworCXN0cnVjdCBhYmlzX29tX29ial9pbnN0CW9ial9pbnN0OworCXVpbnQ4X3QJZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIEFCSVNfT01fRk9NX0hEUl9TSVpFCShzaXplb2Yoc3RydWN0IGFiaXNfb21faGRyKSArIHNpemVvZihzdHJ1Y3QgYWJpc19vbV9mb21faGRyKSkKKworLyogU2VjdGlvbiA5LjE6IE1lc3NhZ2UgVHlwZXMgKi8KK2VudW0gYWJpc19ubV9tc2d0eXBlIHsKKwkvKiBTVyBEb3dubG9hZCBNYW5hZ2VtZW50IE1lc3NhZ2VzICovCisJTk1fTVRfTE9BRF9JTklUCQkJPSAweDAxLAorCU5NX01UX0xPQURfSU5JVF9BQ0ssCisJTk1fTVRfTE9BRF9JTklUX05BQ0ssCisJTk1fTVRfTE9BRF9TRUcsCisJTk1fTVRfTE9BRF9TRUdfQUNLLAorCU5NX01UX0xPQURfQUJPUlQsCisJTk1fTVRfTE9BRF9FTkQsCisJTk1fTVRfTE9BRF9FTkRfQUNLLAorCU5NX01UX0xPQURfRU5EX05BQ0ssCisJTk1fTVRfU1dfQUNUX1JFUSwJCS8qIEJUUy0+QlNDICovCisJTk1fTVRfU1dfQUNUX1JFUV9BQ0ssCisJTk1fTVRfU1dfQUNUX1JFUV9OQUNLLAorCU5NX01UX0FDVElWQVRFX1NXLAkJLyogQlNDLT5CVFMgKi8KKwlOTV9NVF9BQ1RJVkFURV9TV19BQ0ssCisJTk1fTVRfQUNUSVZBVEVfU1dfTkFDSywKKwlOTV9NVF9TV19BQ1RJVkFURURfUkVQLAkJLyogMHgxMCAqLworCS8qIEEtYmlzIEludGVyZmFjZSBNYW5hZ2VtZW50IE1lc3NhZ2VzICovCisJTk1fTVRfRVNUQUJMSVNIX1RFSQkJPSAweDIxLAorCU5NX01UX0VTVEFCTElTSF9URUlfQUNLLAorCU5NX01UX0VTVEFCTElTSF9URUlfTkFDSywKKwlOTV9NVF9DT05OX1RFUlJfU0lHTiwKKwlOTV9NVF9DT05OX1RFUlJfU0lHTl9BQ0ssCisJTk1fTVRfQ09OTl9URVJSX1NJR05fTkFDSywKKwlOTV9NVF9ESVNDX1RFUlJfU0lHTiwKKwlOTV9NVF9ESVNDX1RFUlJfU0lHTl9BQ0ssCisJTk1fTVRfRElTQ19URVJSX1NJR05fTkFDSywKKwlOTV9NVF9DT05OX1RFUlJfVFJBRiwKKwlOTV9NVF9DT05OX1RFUlJfVFJBRl9BQ0ssCisJTk1fTVRfQ09OTl9URVJSX1RSQUZfTkFDSywKKwlOTV9NVF9ESVNDX1RFUlJfVFJBRiwKKwlOTV9NVF9ESVNDX1RFUlJfVFJBRl9BQ0ssCisJTk1fTVRfRElTQ19URVJSX1RSQUZfTkFDSywKKwkvKiBUcmFuc21pc3Npb24gTWFuYWdlbWVudCBNZXNzYWdlcyAqLworCU5NX01UX0NPTk5fTURST1BfTElOSwkJPSAweDMxLAorCU5NX01UX0NPTk5fTURST1BfTElOS19BQ0ssCisJTk1fTVRfQ09OTl9NRFJPUF9MSU5LX05BQ0ssCisJTk1fTVRfRElTQ19NRFJPUF9MSU5LLAorCU5NX01UX0RJU0NfTURST1BfTElOS19BQ0ssCisJTk1fTVRfRElTQ19NRFJPUF9MSU5LX05BQ0ssCisJLyogQWlyIEludGVyZmFjZSBNYW5hZ2VtZW50IE1lc3NhZ2VzICovCisJTk1fTVRfU0VUX0JUU19BVFRSCQk9IDB4NDEsCisJTk1fTVRfU0VUX0JUU19BVFRSX0FDSywKKwlOTV9NVF9TRVRfQlRTX0FUVFJfTkFDSywKKwlOTV9NVF9TRVRfUkFESU9fQVRUUiwKKwlOTV9NVF9TRVRfUkFESU9fQVRUUl9BQ0ssCisJTk1fTVRfU0VUX1JBRElPX0FUVFJfTkFDSywKKwlOTV9NVF9TRVRfQ0hBTl9BVFRSLAorCU5NX01UX1NFVF9DSEFOX0FUVFJfQUNLLAorCU5NX01UX1NFVF9DSEFOX0FUVFJfTkFDSywKKwkvKiBUZXN0IE1hbmFnZW1lbnQgTWVzc2FnZXMgKi8KKwlOTV9NVF9QRVJGX1RFU1QJCQk9IDB4NTEsCisJTk1fTVRfUEVSRl9URVNUX0FDSywKKwlOTV9NVF9QRVJGX1RFU1RfTkFDSywKKwlOTV9NVF9URVNUX1JFUCwKKwlOTV9NVF9TRU5EX1RFU1RfUkVQLAorCU5NX01UX1NFTkRfVEVTVF9SRVBfQUNLLAorCU5NX01UX1NFTkRfVEVTVF9SRVBfTkFDSywKKwlOTV9NVF9TVE9QX1RFU1QsCisJTk1fTVRfU1RPUF9URVNUX0FDSywKKwlOTV9NVF9TVE9QX1RFU1RfTkFDSywKKwkvKiBTdGF0ZSBNYW5hZ2VtZW50IGFuZCBFdmVudCBSZXBvcnQgTWVzc2FnZXMgKi8KKwlOTV9NVF9TVEFURUNIR19FVkVOVF9SRVAJPSAweDYxLAorCU5NX01UX0ZBSUxVUkVfRVZFTlRfUkVQLAorCU5NX01UX1NUT1BfRVZFTlRfUkVQLAorCU5NX01UX1NUT1BfRVZFTlRfUkVQX0FDSywKKwlOTV9NVF9TVE9QX0VWRU5UX1JFUF9OQUNLLAorCU5NX01UX1JFU1RfRVZFTlRfUkVQLAorCU5NX01UX1JFU1RfRVZFTlRfUkVQX0FDSywKKwlOTV9NVF9SRVNUX0VWRU5UX1JFUF9OQUNLLAorCU5NX01UX0NIR19BRE1fU1RBVEUsCisJTk1fTVRfQ0hHX0FETV9TVEFURV9BQ0ssCisJTk1fTVRfQ0hHX0FETV9TVEFURV9OQUNLLAorCU5NX01UX0NIR19BRE1fU1RBVEVfUkVRLAorCU5NX01UX0NIR19BRE1fU1RBVEVfUkVRX0FDSywKKwlOTV9NVF9DSEdfQURNX1NUQVRFX1JFUV9OQUNLLAorCU5NX01UX1JFUF9PVVRTVF9BTEFSTVMJCT0gMHg5MywKKwlOTV9NVF9SRVBfT1VUU1RfQUxBUk1TX0FDSywKKwlOTV9NVF9SRVBfT1VUU1RfQUxBUk1TX05BQ0ssCisJLyogRXF1aXBtZW50IE1hbmFnZW1lbnQgTWVzc2FnZXMgKi8KKwlOTV9NVF9DSEFOR0VPVkVSCQk9IDB4NzEsCisJTk1fTVRfQ0hBTkdFT1ZFUl9BQ0ssCisJTk1fTVRfQ0hBTkdFT1ZFUl9OQUNLLAorCU5NX01UX09QU1RBUlQsCisJTk1fTVRfT1BTVEFSVF9BQ0ssCisJTk1fTVRfT1BTVEFSVF9OQUNLLAorCU5NX01UX1JFSU5JVCwKKwlOTV9NVF9SRUlOSVRfQUNLLAorCU5NX01UX1JFSU5JVF9OQUNLLAorCU5NX01UX1NFVF9TSVRFX09VVCwJCS8qIEJTMTE6IGdldCBhbGFybSA/IT8gKi8KKwlOTV9NVF9TRVRfU0lURV9PVVRfQUNLLAorCU5NX01UX1NFVF9TSVRFX09VVF9OQUNLLAorCU5NX01UX0NIR19IV19DT05GCQk9IDB4OTAsCisJTk1fTVRfQ0hHX0hXX0NPTkZfQUNLLAorCU5NX01UX0NIR19IV19DT05GX05BQ0ssCisJLyogTWVhc3VyZW1lbnQgTWFuYWdlbWVudCBNZXNzYWdlcyAqLworCU5NX01UX01FQVNfUkVTX1JFUQkJPSAweDhhLAorCU5NX01UX01FQVNfUkVTX1JFU1AsCisJTk1fTVRfU1RPUF9NRUFTLAorCU5NX01UX1NUQVJUX01FQVMsCisJLyogT3RoZXIgTWVzc2FnZXMgKi8KKwlOTV9NVF9HRVRfQVRUUgkJCT0gMHg4MSwKKwlOTV9NVF9HRVRfQVRUUl9SRVNQLAorCU5NX01UX0dFVF9BVFRSX05BQ0ssCisJTk1fTVRfU0VUX0FMQVJNX1RIUkVTLAorCU5NX01UX1NFVF9BTEFSTV9USFJFU19BQ0ssCisJTk1fTVRfU0VUX0FMQVJNX1RIUkVTX05BQ0ssCit9OworCitlbnVtIGFiaXNfbm1fbXNndHlwZV9iczExIHsKKwlOTV9NVF9CUzExX1JFU0VUX1JFU09VUkNFCT0gMHg3NCwKKworCU5NX01UX0JTMTFfQkVHSU5fREJfVFgJCT0gMHhhMywKKwlOTV9NVF9CUzExX0JFR0lOX0RCX1RYX0FDSywKKwlOTV9NVF9CUzExX0JFR0lOX0RCX1RYX05BQ0ssCisJTk1fTVRfQlMxMV9FTkRfREJfVFgJCT0gMHhhNiwKKwlOTV9NVF9CUzExX0VORF9EQl9UWF9BQ0ssCisJTk1fTVRfQlMxMV9FTkRfREJfVFhfTkFDSywKKwlOTV9NVF9CUzExX0NSRUFURV9PQkoJCT0gMHhhOSwKKwlOTV9NVF9CUzExX0NSRUFURV9PQkpfQUNLLAorCU5NX01UX0JTMTFfQ1JFQVRFX09CSl9OQUNLLAorCU5NX01UX0JTMTFfREVMRVRFX09CSgkJPSAweGFjLAorCU5NX01UX0JTMTFfREVMRVRFX09CSl9BQ0ssCisJTk1fTVRfQlMxMV9ERUxFVEVfT0JKX05BQ0ssCisKKwlOTV9NVF9CUzExX1NFVF9BVFRSCQk9IDB4ZDAsCisJTk1fTVRfQlMxMV9TRVRfQVRUUl9BQ0ssCisJTk1fTVRfQlMxMV9TRVRfQVRUUl9OQUNLLAorCU5NX01UX0JTMTFfTE1UX1NFU1NJT04JCT0gMHhkYywKKworCU5NX01UX0JTMTFfR0VUX1NUQVRFCQk9IDB4ZTMsCisJTk1fTVRfQlMxMV9HRVRfU1RBVEVfQUNLLAorCU5NX01UX0JTMTFfTE1UX0xPR09OCQk9IDB4ZTUsCisJTk1fTVRfQlMxMV9MTVRfTE9HT05fQUNLLAorCU5NX01UX0JTMTFfUkVTVEFSVAkJPSAweGU3LAorCU5NX01UX0JTMTFfUkVTVEFSVF9BQ0ssCisJTk1fTVRfQlMxMV9ESVNDT05ORUNUCQk9IDB4ZTksCisJTk1fTVRfQlMxMV9ESVNDT05ORUNUX0FDSywKKwlOTV9NVF9CUzExX0xNVF9MT0dPRkYJCT0gMHhlYywKKwlOTV9NVF9CUzExX0xNVF9MT0dPRkZfQUNLLAorCU5NX01UX0JTMTFfUkVDT05ORUNUCQk9IDB4ZjEsCisJTk1fTVRfQlMxMV9SRUNPTk5FQ1RfQUNLLAorfTsKKworZW51bSBhYmlzX25tX21zZ3R5cGVfaXBhY2MgeworCU5NX01UX0lQQUNDX1JFU1RBUlQJCT0gMHg4NywKKwlOTV9NVF9JUEFDQ19SRVNUQVJUX0FDSywKKwlOTV9NVF9JUEFDQ19SRVNUQVJUX05BQ0ssCisJTk1fTVRfSVBBQ0NfUlNMX0NPTk5FQ1QJCT0gMHhlMCwKKwlOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVF9BQ0ssCisJTk1fTVRfSVBBQ0NfUlNMX0NPTk5FQ1RfTkFDSywKKwlOTV9NVF9JUEFDQ19SU0xfRElTQ09OTkVDVAk9IDB4ZTMsCisJTk1fTVRfSVBBQ0NfUlNMX0RJU0NPTk5FQ1RfQUNLLAorCU5NX01UX0lQQUNDX1JTTF9ESVNDT05ORUNUX05BQ0ssCisJTk1fTVRfSVBBQ0NfQ09OTl9UUkFGCQk9IDB4ZTYsCisJTk1fTVRfSVBBQ0NfQ09OTl9UUkFGX0FDSywKKwlOTV9NVF9JUEFDQ19DT05OX1RSQUZfTkFDSywKKwlOTV9NVF9JUEFDQ19ERUZfQk9PVF9TVwkJPSAweGVjLAorCU5NX01UX0lQQUNDX0RFRl9CT09UX1NXX0FDSywKKwlNTl9NVF9JUEFDQ19ERUZfQk9PVF9TV19OQUNLLAorCU5NX01UX0lQQUNDX1NFVF9OVkFUVFIJCT0gMHhlZiwKKwlOTV9NVF9JUEFDQ19TRVRfTlZBVFRSX0FDSywKKwlOTV9NVF9JUEFDQ19TRVRfTlZBVFRSX05BQ0ssCisJTk1fTVRfSVBBQ0NfR0VUX05WQVRUUgkJPSAweGYyLAorCU5NX01UX0lQQUNDX0dFVF9OVkFUVFJfQUNLLAorCU5NX01UX0lQQUNDX0dFVF9OVkFUVFJfTkFDSywKKwlOTV9NVF9JUEFDQ19TRVRfQVRUUgkJPSAweGY1LAorCU5NX01UX0lQQUNDX1NFVF9BVFRSX0FDSywKKwlOTV9NVF9JUEFDQ19TRVRfQVRUUl9OQUNLLAorfTsKKworZW51bSBhYmlzX25tX2JzMTFfY2VsbF9hbGxvYyB7CisJTk1fQlMxMV9DQU5SX0dTTQk9IDB4MDAsCisJTk1fQlMxMV9DQU5SX0RDUzE4MDAJPSAweDAxLAorfTsKKworLyogU2VjdGlvbiA5LjI6IE9iamVjdCBDbGFzcyAqLworZW51bSBhYmlzX25tX29ial9jbGFzcyB7CisJTk1fT0NfU0lURV9NQU5BR0VSCQk9IDB4MDAsCisJTk1fT0NfQlRTLAorCU5NX09DX1JBRElPX0NBUlJJRVIsCisJTk1fT0NfQ0hBTk5FTCwKKwlOTV9PQ19CQVNFQl9UUkFOU0MsCisJLyogUkZVOiAwNS1GRSAqLworCisJTk1fT0NfSVBBQ19FMV9UUlVOSwkJPSAweDBlLAorCU5NX09DX0lQQUNfRTFfUE9SVAkJPSAweDBmLAorCU5NX09DX0lQQUNfRTFfQ0hBTgkJPSAweDEwLAorCU5NX09DX0lQQUNfQ0xLX01PRFVMRQkJPSAweDIyLAorCisJTk1fT0NfQlMxMV9BREpDCQkJPSAweGEwLAorCU5NX09DX0JTMTFfSEFORE9WRVIJCT0gMHhhMSwKKwlOTV9PQ19CUzExX1BXUl9DVFJMCQk9IDB4YTIsCisJTk1fT0NfQlMxMV9CVFNFCQkJPSAweGEzLAkJLyogTE1UPyAqLworCU5NX09DX0JTMTFfUkFDSwkJCT0gMHhhNCwKKwlOTV9PQ19CUzExCQkJPSAweGE1LAkJLyogMDE6IEFMQ08gKi8KKwlOTV9PQ19CUzExX1RFU1QJCQk9IDB4YTYsCisJTk1fT0NfQlMxMV9FTlZBQlRTRQkJPSAweGE4LAorCU5NX09DX0JTMTFfQlBPUlQJCT0gMHhhOSwKKworCU5NX09DX0dQUlNfTlNFCQkJPSAweGYwLAorCU5NX09DX0dQUlNfQ0VMTAkJCT0gMHhmMSwKKwlOTV9PQ19HUFJTX05TVkMJCQk9IDB4ZjIsCisKKwlOTV9PQ19OVUxMCQkJPSAweGZmLAorfTsKKworLyogU2VjdGlvbiA5LjQ6IEF0dHJpYnV0ZXMgKi8KK2VudW0gYWJpc19ubV9hdHRyIHsKKwlOTV9BVFRfQUJJU19DSEFOTkVMCT0gMHgwMSwKKwlOTV9BVFRfQUREX0lORk8sCisJTk1fQVRUX0FERF9URVhULAorCU5NX0FUVF9BRE1fU1RBVEUsCisJTk1fQVRUX0FSRkNOX0xJU1QsCisJTk1fQVRUX0FVVE9OX1JFUE9SVCwKKwlOTV9BVFRfQVZBSUxfU1RBVFVTLAorCU5NX0FUVF9CQ0NIX0FSRkNOLAorCU5NX0FUVF9CU0lDLAorCU5NX0FUVF9CVFNfQUlSX1RJTUVSLAorCU5NX0FUVF9DQ0NIX0xfSV9QLAorCU5NX0FUVF9DQ0NIX0xfVCwKKwlOTV9BVFRfQ0hBTl9DT01CLAorCU5NX0FUVF9DT05OX0ZBSUxfQ1JJVCwKKwlOTV9BVFRfREVTVCwKKwkvKiByZXMgKi8KKwlOTV9BVFRfRVZFTlRfVFlQRQk9IDB4MTEsIC8qIEJTMTE6IGZpbGUgZGF0YSA/IT8gKi8KKwlOTV9BVFRfRklMRV9JRCwKKwlOTV9BVFRfRklMRV9WRVJTSU9OLAorCU5NX0FUVF9HU01fVElNRSwKKwlOTV9BVFRfSFNOLAorCU5NX0FUVF9IV19DT05GSUcsCisJTk1fQVRUX0hXX0RFU0MsCisJTk1fQVRUX0lOVEFWRV9QQVJBTSwKKwlOTV9BVFRfSU5URVJGX0JPVU5ELAorCU5NX0FUVF9MSVNUX1JFUV9BVFRSLAorCU5NX0FUVF9NQUlPLAorCU5NX0FUVF9NQU5VRl9TVEFURSwKKwlOTV9BVFRfTUFOVUZfVEhSRVNILAorCU5NX0FUVF9NQU5VRl9JRCwKKwlOTV9BVFRfTUFYX1RBLAorCU5NX0FUVF9NRFJPUF9MSU5LLAkvKiAweDIwICovCisJTk1fQVRUX01EUk9QX05FWFQsCisJTk1fQVRUX05BQ0tfQ0FVU0VTLAorCU5NX0FUVF9OWTEsCisJTk1fQVRUX09QRVJfU1RBVEUsCisJTk1fQVRUX09WRVJMX1BFUklPRCwKKwlOTV9BVFRfUEhZU19DT05GLAorCU5NX0FUVF9QT1dFUl9DTEFTUywKKwlOTV9BVFRfUE9XRVJfVEhSRVNILAorCU5NX0FUVF9QUk9CX0NBVVNFLAorCU5NX0FUVF9SQUNIX0JfVEhSRVNILAorCU5NX0FUVF9MREFWR19TTE9UUywKKwlOTV9BVFRfUkFEX1NVQkMsCisJTk1fQVRUX1JGX01BWFBPV1JfUiwKKwlOTV9BVFRfU0lURV9JTlBVVFMsCisJTk1fQVRUX1NJVEVfT1VUUFVUUywKKwlOTV9BVFRfU09VUkNFLAkJLyogMHgzMCAqLworCU5NX0FUVF9TUEVDX1BST0IsCisJTk1fQVRUX1NUQVJUX1RJTUUsCisJTk1fQVRUX1QyMDAsCisJTk1fQVRUX1RFSSwKKwlOTV9BVFRfVEVTVF9EVVIsCisJTk1fQVRUX1RFU1RfTk8sCisJTk1fQVRUX1RFU1RfUkVQT1JULAorCU5NX0FUVF9WU1dSX1RIUkVTSCwKKwlOTV9BVFRfV0lORE9XX1NJWkUsCisJLyogUmVzICAqLworCU5NX0FUVF9CUzExX1JTU0lfT0ZGUwk9IDB4M2QsCisJTk1fQVRUX0JTMTFfVFhQV1IJPSAweDNlLAorCU5NX0FUVF9CUzExX0RJVkVSU0lUWQk9IDB4M2YsCisJLyogUmVzICAqLworCU5NX0FUVF9UU0MJCT0gMHg0MCwKKwlOTV9BVFRfU1dfQ09ORklHLAorCU5NX0FUVF9TV19ERVNDUiwKKwlOTV9BVFRfU0VWRVJJVFksCisJTk1fQVRUX0dFVF9BUkksCisJTk1fQVRUX0hXX0NPTkZfQ0hHLAorCU5NX0FUVF9PVVRTVF9BTEFSTSwKKwlOTV9BVFRfRklMRV9EQVRBLAorCU5NX0FUVF9NRUFTX1JFUywKKwlOTV9BVFRfTUVBU19UWVBFLAorCisJTk1fQVRUX0JTMTFfRVNOX0ZXX0NPREVfTk8JPSAweDRjLAorCU5NX0FUVF9CUzExX0VTTl9IV19DT0RFX05PCT0gMHg0ZiwKKworCU5NX0FUVF9CUzExX0VTTl9QQ0JfU0VSSUFMCT0gMHg1NSwKKwlOTV9BVFRfQlMxMV9FWENFU1NJVkVfRElTVEFOQ0UJPSAweDU4LAorCisJTk1fQVRUX0JTMTFfQUxMX1RFU1RfQ0FURwk9IDB4NjAsCisJTk1fQVRUX0JTMTFfQlRTTFNfSE9QUElORywKKwlOTV9BVFRfQlMxMV9DRUxMX0FMTE9DX05SLAorCU5NX0FUVF9CUzExX0NFTExfR0xPQkFMX0lELAorCU5NX0FUVF9CUzExX0VOQV9JTlRFUkZfQ0xBU1MJPSAweDY2LAorCU5NX0FUVF9CUzExX0VOQV9JTlRfSU5URUNfSEFORE8JPSAweDY3LAorCU5NX0FUVF9CUzExX0VOQV9JTlRfSU5UUkNfSEFORE8JPSAweDY4LAorCU5NX0FUVF9CUzExX0VOQV9NU19QV1JfQ1RSTAk9IDB4NjksCisJTk1fQVRUX0JTMTFfRU5BX1BXUl9CREdUX0hPCT0gMHg2YSwKKwlOTV9BVFRfQlMxMV9FTkFfUFdSX0NUUkxfUkxGVwk9IDB4NmIsCisJTk1fQVRUX0JTMTFfRU5BX1JYTEVWX0hPCT0gMHg2YywKKwlOTV9BVFRfQlMxMV9FTkFfUlhRVUFMX0hPCT0gMHg2ZCwKKwlOTV9BVFRfQlMxMV9GQUNDSF9RVUFMCQk9IDB4NmUsCisKKwlOTV9BVFRfSVBBQ0NfRFNUX0lQCQk9IDB4ODAsCisJTk1fQVRUX0lQQUNDX0RTVF9JUF9QT1JUCT0gMHg4MSwKKwlOTV9BVFRfSVBBQ0NfU1NSQwkJPSAweDgyLAorCU5NX0FUVF9JUEFDQ19SVFBfUEFZTERfVFlQRQk9IDB4ODMsCisJTk1fQVRUX0lQQUNDX0JBU0VCX0lECQk9IDB4ODQsCisJTk1fQVRUX0lQQUNDX1NUUkVBTV9JRAkJPSAweDg1LAorCU5NX0FUVF9JUEFDQ19OVl9GTEFHUwkJPSAweDg2LAorCU5NX0FUVF9JUEFDQ19GUkVRX0NUUkwJCT0gMHg4NywKKwlOTV9BVFRfSVBBQ0NfUFJJTV9PTUxfQ0ZHCT0gMHg4OCwKKwlOTV9BVFRfSVBBQ0NfU0VDX09NTF9DRkcJPSAweDg5LAorCU5NX0FUVF9JUEFDQ19JUF9JRl9DRkcJCT0gMHg4YSwJCS8qIElQIGludGVyZmFjZSAqLworCU5NX0FUVF9JUEFDQ19JUF9HV19DRkcJCT0gMHg4YiwJCS8qIElQIGdhdGV3YXkgKi8KKwlOTV9BVFRfSVBBQ0NfSU5fU0VSVl9USU1FCT0gMHg4YywKKwlOTV9BVFRfSVBBQ0NfVFJYX0JUU19BU1MJPSAweDhkLAorCU5NX0FUVF9JUEFDQ19MT0NBVElPTgkJPSAweDhlLAkJLyogc3RyaW5nIGRlc2NyaWJpbmcgbG9jYXRpb24gKi8KKwlOTV9BVFRfSVBBQ0NfUEFHSU5HX0NGRwkJPSAweDhmLAorCU5NX0FUVF9JUEFDQ19GSUxFX0RBVEEJCT0gMHg5MCwKKwlOTV9BVFRfSVBBQ0NfVU5JVF9JRAkJPSAweDkxLAkJLyogU2l0ZS9CVFMvVFJYICovCisJTk1fQVRUX0lQQUNDX1BBUkVOVF9VTklUX0lECT0gMHg5MiwKKwlOTV9BVFRfSVBBQ0NfVU5JVF9OQU1FCQk9IDB4OTMsCQkvKiBkZWZhdWx0OiBuYnRzLTxtYWMtYXMtc3RyaW5nPiAqLworCU5NX0FUVF9JUEFDQ19TTk1QX0NGRwkJPSAweDk0LAorCU5NX0FUVF9JUEFDQ19QUklNX09NTF9DRkdfTElTVAk9IDB4OTUsCisJTk1fQVRUX0lQQUNDX1BSSU1fT01MX0ZCX1RPVVQJPSAweDk2LAorCU5NX0FUVF9JUEFDQ19DVVJfU1dfQ0ZHCQk9IDB4OTcsCisJTk1fQVRUX0lQQUNDX1RJTUlOR19CVVMJCT0gMHg5OCwKKwlOTV9BVFRfSVBBQ0NfQ0dJCQk9IDB4OTksCisJTk1fQVRUX0lQQUNDX1JBQwkJPSAweDlhLAorCU5NX0FUVF9JUEFDQ19PQkpfVkVSU0lPTgk9IDB4OWIsCisJTk1fQVRUX0lQQUNDX0dQUlNfUEFHSU5HX0NGRwk9IDB4OWMsCisJTk1fQVRUX0lQQUNDX05TRUkJCT0gMHg5ZCwKKwlOTV9BVFRfSVBBQ0NfQlZDSQkJPSAweDllLAorCU5NX0FUVF9JUEFDQ19OU1ZDSQkJPSAweDlmLAorCU5NX0FUVF9JUEFDQ19OU19DRkcJCT0gMHhhMCwKKwlOTV9BVFRfSVBBQ0NfQlNTR1BfQ0ZHCQk9IDB4YTEsCisJTk1fQVRUX0lQQUNDX05TX0xJTktfQ0ZHCT0gMHhhMiwKKwlOTV9BVFRfSVBBQ0NfUkxDX0NGRwkJPSAweGEzLAkKKwlOTV9BVFRfSVBBQ0NfQUxNX1RIUkVTSF9MSVNUCT0gMHhhNCwKKwlOTV9BVFRfSVBBQ0NfTU9OSVRfVkFMX0xJU1QJPSAweGE1LAorCU5NX0FUVF9JUEFDQ19USUJfQ09OVFJPTAk9IDB4YTYsCisJTk1fQVRUX0lQQUNDX1NVUFBfRkVBVFVSRVMJPSAweGE3LAorCU5NX0FUVF9JUEFDQ19DT0RJTkdfU0NIRU1FUwk9IDB4YTgsCisJTk1fQVRUX0lQQUNDX1JMQ19DRkdfMgkJPSAweGE5LAorCU5NX0FUVF9JUEFDQ19IRUFSVEJfVE9VVAk9IDB4YWEsCisJTk1fQVRUX0lQQUNDX1VQVElNRQkJPSAweGFiLAorCU5NX0FUVF9JUEFDQ19STENfQ0ZHXzMJCT0gMHhhYywKKwlOTV9BVFRfSVBBQ0NfU1NMX0NGRwkJPSAweGFkLAorCU5NX0FUVF9JUEFDQ19TRUNfUE9TU0lCTEUJPSAweGFlLAorCU5NX0FUVF9JUEFDQ19JTUxfU1NMX1NUQVRFCT0gMHhhZiwKKwlOTV9BVFRfSVBBQ0NfUkVWT0NfREFURQkJPSAweGIwLAorCisKKwlOTV9BVFRfQlMxMV9SRl9SRVNfSU5EX1BFUgk9IDB4OGYsCisJCisJTk1fQVRUX0JTMTFfUlhfTEVWX01JTl9DRUxMCT0gMHg5MCwKKwlOTV9BVFRfQlMxMV9BQklTX0VYVF9USU1FCT0gMHg5MSwKKwlOTV9BVFRfQlMxMV9USU1FUl9IT19SRVFVRVNUCT0gMHg5MiwKKwlOTV9BVFRfQlMxMV9USU1FUl9OQ0VMTAkJPSAweDkzLAorCU5NX0FUVF9CUzExX1RTWU5DCQk9IDB4OTQsCisJTk1fQVRUX0JTMTFfVFRSQVUJCT0gMHg5NSwKKwlOTV9BVFRfQlMxMV9FTVJHX0NGR19NRU1CRVIJPSAweDliLAorCU5NX0FUVF9CUzExX1RSWF9BUkVBCQk9IDB4OWYsCisKKwlOTV9BVFRfQlMxMV9CQ0NIX1JFQ09ORgkJPSAweGQ3LAorCU5NX0FUVF9CUzExX0JJVF9FUlJfVEhFU0gJPSAweGEwLAorCU5NX0FUVF9CUzExX0JPT1RfU1dfVkVSUwk9IDB4YTEsCisJTk1fQVRUX0JTMTFfQ0NMS19BQ0NVUkFDWQk9IDB4YTMsCisJTk1fQVRUX0JTMTFfQ0NMS19UWVBFCQk9IDB4YTQsCisJTk1fQVRUX0JTMTFfSU5QX0lNUEVEQU5DRQk9IDB4YWEsCisJTk1fQVRUX0JTMTFfTDFfUFJPVF9UWVBFCT0gMHhhYiwKKwlOTV9BVFRfQlMxMV9MSU5FX0NGRwkJPSAweGFjLAorCU5NX0FUVF9CUzExX0xJX1BPUlRfMQkJPSAweGFkLAorCU5NX0FUVF9CUzExX0xJX1BPUlRfMgkJPSAweGFlLAorCisJTk1fQVRUX0JTMTFfTDFfUkVNX0FMTV9UWVBFCT0gMHhiMCwKKwlOTV9BVFRfQlMxMV9TV19MT0FEX0lOVEVOREVECT0gMHhiYiwKKwlOTV9BVFRfQlMxMV9TV19MT0FEX1NBRkVUWQk9IDB4YmMsCisJTk1fQVRUX0JTMTFfU1dfTE9BRF9TVE9SRUQJPSAweGJkLAorCisJTk1fQVRUX0JTMTFfVkVORE9SX05BTUUJCT0gMHhjMSwKKwlOTV9BVFRfQlMxMV9IT1BQSU5HX01PREUJPSAweGM1LAorCU5NX0FUVF9CUzExX0xNVF9MT0dPTl9TRVNTSU9OCT0gMHhjNiwKKwlOTV9BVFRfQlMxMV9MTVRfTE9HSU5fVElNRQk9IDB4YzcsCisJTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFVgk9IDB4YzgsCisJTk1fQVRUX0JTMTFfTE1UX1VTRVJfTkFNRQk9IDB4YzksCisKKwlOTV9BVFRfQlMxMV9MMV9DT05UUk9MX1RTCT0gMHhkOCwKKwlOTV9BVFRfQlMxMV9SQURJT19NRUFTX0dSQU4JPSAweGRjLAkvKiBpbiBTQUNDSCBtdWx0aWZyYW1lcyAqLworCU5NX0FUVF9CUzExX1JBRElPX01FQVNfUkVQCT0gMHhkZCwKKworCU5NX0FUVF9CUzExX1NIX0xBUERfSU5UX1RJTUVSCT0gMHhlOCwKKworCU5NX0FUVF9CUzExX0JUU19TVEFURQkJPSAweGYwLAorCU5NX0FUVF9CUzExX0UxX1NUQVRFCQk9IDB4ZjEsCisJTk1fQVRUX0JTMTFfUExMCQkJPSAweGYyLAorCU5NX0FUVF9CUzExX1JYX09GRlNFVAkJPSAweGYzLAorCU5NX0FUVF9CUzExX0FOVF9UWVBFCQk9IDB4ZjQsCisJTk1fQVRUX0JTMTFfUExMX01PREUJCT0gMHhmYywKKwlOTV9BVFRfQlMxMV9QQVNTV09SRAkJPSAweGZkLAorfTsKKyNkZWZpbmUgTk1fQVRUX0JTMTFfRklMRV9EQVRBCU5NX0FUVF9FVkVOVF9UWVBFCisKKy8qIFNlY3Rpb24gOS40LjQ6IEFkbWluaXN0cmF0aXZlIFN0YXRlICovCitlbnVtIGFiaXNfbm1fYWRtX3N0YXRlIHsKKwlOTV9TVEFURV9MT0NLRUQJCT0gMHgwMSwKKwlOTV9TVEFURV9VTkxPQ0tFRAk9IDB4MDIsCisJTk1fU1RBVEVfU0hVVERPV04JPSAweDAzLAorCU5NX1NUQVRFX05VTEwJCT0gMHhmZiwKK307CisKKy8qIFNlY3Rpb24gOS40Ljc6IEFkbWluaXN0cmF0aXZlIFN0YXRlICovCitlbnVtIGFiaXNfbm1fYXZhaWxfc3RhdGUgeworCU5NX0FWU1RBVEVfSU5fVEVTVAk9IDEsCisJTk1fQVZTVEFURV9QT1dFUl9PRkYJPSAyLAorCU5NX0FWU1RBVEVfT0ZGX0xJTkUJPSAzLAorCU5NX0FWU1RBVEVfREVQRU5ERU5DWQk9IDUsCisJTk1fQVZTVEFURV9ERUdSQURFRAk9IDYsCisJTk1fQVZTVEFURV9OT1RfSU5TVEFMTEVEPSA3LAorCU5NX0FWU1RBVEVfT0sJCT0gMHhmZiwKK307CisKK2VudW0gYWJpc19ubV9vcF9zdGF0ZSB7CisJTk1fT1BTVEFURV9ESVNBQkxFRAk9IDEsCisJTk1fT1BTVEFURV9FTkFCTEVECT0gMiwKKwlOTV9PUFNUQVRFX05VTEwJCT0gMHhmZiwKK307CisKKy8qIFNlY3Rpb24gOS40LjEzOiBDaGFubmVsIENvbWJpbmF0aW9uICovCitlbnVtIGFiaXNfbm1fY2hhbl9jb21iIHsKKwlOTV9DSEFOQ19UQ0hGdWxsCT0gMHgwMCwJLyogVENIL0YgKyBUQ0gvSCArIFNBQ0NIL1RGICovCisJTk1fQ0hBTkNfVENISGFsZgk9IDB4MDEsIC8qIFRDSC9IKDAsMSkgKyBGQUNDSC9IKDAsMSkgKworCQkJCQkgICBTQUNDSC9USCgwLDEpICovCisJTk1fQ0hBTkNfVENISGFsZjIJPSAweDAyLCAvKiBUQ0gvSCgwKSArIEZBQ0NIL0goMCkgKyBTQUNDSC9USCgwKSArCisJCQkJCSAgIFRDSC9IKDEpICovCisJTk1fQ0hBTkNfU0RDQ0gJCT0gMHgwMywJLyogU0RDQ0gvOCArIFNBQ0NILzggKi8KKwlOTV9DSEFOQ19tYWluQkNDSAk9IDB4MDQsCS8qIEZDQ0ggKyBTQ0ggKyBCQ0NIICsgQ0NDSCAqLworCU5NX0NIQU5DX0JDQ0hDb21iCT0gMHgwNSwJLyogRkNDSCArIFNDSCArIEJDQ0ggKyBDQ0NIICsgU0RDQ0gvNCArCisJCQkJCSAgIFNBQ0NIL0M0ICovCisJTk1fQ0hBTkNfQkNDSAkJPSAweDA2LAkvKiBCQ0NIICsgQ0NDSCAqLworCU5NX0NIQU5DX0JDQ0hfQ0JDSAk9IDB4MDcsCS8qIENIQU5DX0JDQ0hDb21iICsgQ0JDSCAqLworCU5NX0NIQU5DX1NEQ0NIX0NCQ0gJPSAweDA4LAkvKiBDSEFOQ19TRENDSDggKyBDQkNIICovCisJLyogaXAuYWNjZXNzICovCisJTk1fQ0hBTkNfSVBBQ19iUERDSAk9IDB4MGIsCS8qIFBCQ0NIICsgUENDQ0ggKyBQRFRDSC9GICsgUEFDQ0gvRiArCisJCQkJCSAgIFBUQ0NIL0YgKi8KKwlOTV9DSEFOQ19JUEFDX2NQRENICT0gMHgwYywgLyogUEJDQ0ggKyBQRFRDSC9GICsgUEFDQ0gvRiArIFBUQ0NIL0YgKi8KKwlOTV9DSEFOQ19JUEFDX1BEQ0gJPSAweDBkLAkvKiBQRFRDSC9GICsgUEFDQ0gvRiArIFBUQ0NIL0YgKi8KKwlOTV9DSEFOQ19JUEFDX1RDSEZ1bGxfUERDSCA9IDB4ODAsCisJTk1fQ0hBTkNfSVBBQ19UQ0hGdWxsX1RDSEhhbGYgPSAweDgxLAorfTsKKworLyogU2VjdGlvbiA5LjQuMTY6IEV2ZW50IFR5cGUgKi8KK2VudW0gYWJpc19ubV9ldmVudF90eXBlIHsKKwlOTV9FVlRfQ09NTV9GQUlMCT0gMHgwMCwKKwlOTV9FVlRfUU9TX0ZBSUwJCT0gMHgwMSwKKwlOTV9FVlRfUFJPQ19GQUlMCT0gMHgwMiwKKwlOTV9FVlRfRVFVSVBfRkFJTAk9IDB4MDMsCisJTk1fRVZUX0VOVl9GQUlMCQk9IDB4MDQsCit9OworCisvKiBTZWN0aW9uOiA5LjQuNjM6IFBlcmNlaXZlZCBTZXZlcml0eSAqLworZW51bSBhYmlzX25tX3NldmVyaXR5IHsKKwlOTV9TRVZFUl9DRUFTRUQJCT0gMHgwMCwKKwlOTV9TRVZFUl9DUklUSUNBTAk9IDB4MDEsCisJTk1fU0VWRVJfTUFKT1IJCT0gMHgwMiwKKwlOTV9TRVZFUl9NSU5PUgkJPSAweDAzLAorCU5NX1NFVkVSX1dBUk5JTkcJPSAweDA0LAorCU5NX1NFVkVSX0lOREVURVJNSU5BVEUJPSAweDA1LAorfTsKKworLyogU2VjdGlvbiA5LjQuNDM6IFByb2JhYmxlIENhdXNlIFR5cGUgKi8KK2VudW0gYWJpc19ubV9wY2F1c2VfdHlwZSB7CisJTk1fUENBVVNFX1RfWDcyMQk9IDB4MDEsCisJTk1fUENBVVNFX1RfR1NNCQk9IDB4MDIsCisJTk1fUENBVVNFX1RfTUFOVUYJPSAweDAzLAorfTsKKworLyogU2VjdGlvbiA5LjQuMzY6IE5BQ0sgQ2F1c2VzICovCitlbnVtIGFiaXNfbm1fbmFja19jYXVzZSB7CisJLyogR2VuZXJhbCBOYWNrIENhdXNlcyAqLworCU5NX05BQ0tfSU5DT1JSX1NUUlVDVAkJPSAweDAxLAorCU5NX05BQ0tfTVNHVFlQRV9JTlZBTAkJPSAweDAyLAorCU5NX05BQ0tfT0JKQ0xBU1NfSU5WQUwJCT0gMHgwNSwKKwlOTV9OQUNLX09CSkNMQVNTX05PVFNVUFAJPSAweDA2LAorCU5NX05BQ0tfQlRTTlJfVU5LTgkJPSAweDA3LAorCU5NX05BQ0tfVFJYTlJfVU5LTgkJPSAweDA4LAorCU5NX05BQ0tfT0JKSU5TVF9VTktOCQk9IDB4MDksCisJTk1fTkFDS19BVFRSSURfSU5WQUwJCT0gMHgwYywKKwlOTV9OQUNLX0FUVFJJRF9OT1RTVVBQCQk9IDB4MGQsCisJTk1fTkFDS19QQVJBTV9SQU5HRQkJPSAweDBlLAorCU5NX05BQ0tfQVRUUkxJU1RfSU5DT05TSVNURU5UCT0gMHgwZiwKKwlOTV9OQUNLX1NQRUNfSU1QTF9OT1RTVVBQCT0gMHgxMCwKKwlOTV9OQUNLX0NBTlRfUEVSRk9STQkJPSAweDExLAorCS8qIFNwZWNpZmljIE5hY2sgQ2F1c2VzICovCisJTk1fTkFDS19SRVNfTk9USU1QTAkJPSAweDE5LAorCU5NX05BQ0tfUkVTX05PVEFWQUlMCQk9IDB4MWEsCisJTk1fTkFDS19GUkVRX05PVEFWQUlMCQk9IDB4MWIsCisJTk1fTkFDS19URVNUX05PVFNVUFAJCT0gMHgxYywKKwlOTV9OQUNLX0NBUEFDSVRZX1JFU1RSCQk9IDB4MWQsCisJTk1fTkFDS19QSFlTQ0ZHX05PVFBFUkZPUk0JPSAweDFlLAorCU5NX05BQ0tfVEVTVF9OT1RJTklUCQk9IDB4MWYsCisJTk1fTkFDS19QSFlTQ0ZHX05PVFJFU1RPUkUJPSAweDIwLAorCU5NX05BQ0tfVEVTVF9OT1NVQ0gJCT0gMHgyMSwKKwlOTV9OQUNLX1RFU1RfTk9TVE9QCQk9IDB4MjIsCisJTk1fTkFDS19NU0dJTkNPTlNJU1RfUEhZU0NGRwk9IDB4MjMsCisJTk1fTkFDS19GSUxFX0lOQ09NUExFVEUJCT0gMHgyNSwKKwlOTV9OQUNLX0ZJTEVfTk9UQVZBSUwJCT0gMHgyNiwKKwlOTV9OQUNLX0ZJTEVfTk9UQUNUSVZBVEUJPSAweDI3LAorCU5NX05BQ0tfUkVRX05PVF9HUkFOVAkJPSAweDI4LAorCU5NX05BQ0tfV0FJVAkJCT0gMHgyOSwKKwlOTV9OQUNLX05PVEhfUkVQT1JUX0VYSVNUCT0gMHgyYSwKKwlOTV9OQUNLX01FQVNfTk9UU1VQUAkJPSAweDJiLAorCU5NX05BQ0tfTUVBU19OT1RTVEFSVAkJPSAweDJjLAorfTsKKworLyogU2VjdGlvbiA5LjQuMSAqLworc3RydWN0IGFiaXNfbm1fY2hhbm5lbCB7CisJdWludDhfdAlhdHRyaWI7CisJdWludDhfdAlidHNfcG9ydDsKKwl1aW50OF90CXRpbWVzbG90OworCXVpbnQ4X3QJc3Vic2xvdDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBTaWVtZW5zIEJTLTExIHNwZWNpZmljIG9iamVjdHMgaW4gdGhlIFNpZW5lbXNIVyAoMHhBNSkgb2JqZWN0IGNsYXNzICovCitlbnVtIGFiaXNfYnMxMV9vYmp0eXBlIHsKKwlCUzExX09CSl9BTENPCQk9IDB4MDEsCisJQlMxMV9PQkpfQkJTSUcJCT0gMHgwMiwJLyogb2JqX2NsYXNzOiAwLDEgKi8KKwlCUzExX09CSl9UUlgxCQk9IDB4MDMsCS8qIG9ubHkgREVBQ1RJVkFURSBUUlgxICovCisJQlMxMV9PQkpfQ0NMSwkJPSAweDA0LAorCUJTMTFfT0JKX0dQU1UJCT0gMHgwNiwKKwlCUzExX09CSl9MSQkJPSAweDA3LAorCUJTMTFfT0JKX1BBCQk9IDB4MDksCS8qIG9ial9jbGFzczogMCwgMSovCit9OworCitlbnVtIGFiaXNfYnMxMV90cnhfcG93ZXIgeworCUJTMTFfVFJYX1BPV0VSX0dTTV8yVwk9IDB4MDYsCisJQlMxMV9UUlhfUE9XRVJfR1NNXzI1MG1XPSAweDA3LAorCUJTMTFfVFJYX1BPV0VSX0dTTV84MG1XCT0gMHgwOCwKKwlCUzExX1RSWF9QT1dFUl9HU01fMzBtVwk9IDB4MDksCisJQlMxMV9UUlhfUE9XRVJfRENTXzNXCT0gMHgwYSwKKwlCUzExX1RSWF9QT1dFUl9EQ1NfMVc2CT0gMHgwYiwKKwlCUzExX1RSWF9QT1dFUl9EQ1NfNTAwbVc9IDB4MGMsCisJQlMxMV9UUlhfUE9XRVJfRENTXzE2MG1XPSAweDBkLAorfTsKKworZW51bSBhYmlzX2JzMTFfbGlfcGxsX21vZGUgeworCUJTMTFfTElfUExMX0xPQ0tFRAk9IDIsCisJQlMxMV9MSV9QTExfU1RBTkRBTE9ORQk9IDMsCit9OworCitlbnVtIGFiaXNfYnMxMV9saW5lX2NmZyB7CisJQlMxMV9MSU5FX0NGR19TVEFSCT0gMHgwMCwKKwlCUzExX0xJTkVfQ0ZHX01VTFRJRFJPUAk9IDB4MDEsCisJQlMxMV9MSU5FX0NGR19MT09QCT0gMHgwMiwKK307CisKK2VudW0gYWJpc19iczExX3BoYXNlIHsKKwlCUzExX1NUQVRFX1NPRlRXQVJFX1JRRAkJPSAweDAxLAorCUJTMTFfU1RBVEVfTE9BRF9TTVVfSU5URU5ERUQJPSAweDExLAorCUJTMTFfU1RBVEVfTE9BRF9TTVVfU0FGRVRZCT0gMHgyMSwKKwlCUzExX1NUQVRFX0xPQURfRkFJTEVECQk9IDB4MzEsCisJQlMxMV9TVEFURV9MT0FEX0RJQUdOT1NUSUMJPSAweDQxLAorCUJTMTFfU1RBVEVfV0FSTV9VUAkJPSAweDUxLAorCUJTMTFfU1RBVEVfV0FSTV9VUF8yCQk9IDB4NTIsCisJQlMxMV9TVEFURV9XQUlUX01JTl9DRkcJCT0gMHg2MiwKKwlCUzExX1NUQVRFX01BSU5URU5BTkNFCQk9IDB4NzIsCisJQlMxMV9TVEFURV9MT0FEX01CQ0NVCQk9IDB4OTIsCisJQlMxMV9TVEFURV9XQUlUX01JTl9DRkdfMgk9IDB4QTIsCisJQlMxMV9TVEFURV9OT1JNQUwJCT0gMHgwMywKKwlCUzExX1NUQVRFX0FCSVNfTE9BRAkJPSAweDEzLAorfTsKKworZW51bSBhYmlzX25tX2lwYWNjX3Rlc3Rfbm8geworCU5NX0lQQUNDX1RFU1ROT19STE9PUF9BTlQJPSAweDAxLAorCU5NX0lQQUNDX1RFU1ROT19STE9PUF9YQ1ZSCT0gMHgwMiwKKwlOTV9JUEFDQ19URVNUTk9fRlVOQ19PQkoJPSAweDAzLAorCU5NX0lQQUNDX1RFU1ROT19DSEFOX1VTQUdFCT0gMHg0MCwKKwlOTV9JUEFDQ19URVNUTk9fQkNDSF9DSEFOX1VTQUdFCT0gMHg0MSwKKwlOTV9JUEFDQ19URVNUTk9fRlJFUV9TWU5DCT0gMHg0MiwKKwlOTV9JUEFDQ19URVNUTk9fQkNDSF9JTkZPCT0gMHg0MywKKwlOTV9JUEFDQ19URVNUTk9fVFhfQkVBQ09OCT0gMHg0NCwKKwlOTV9JUEFDQ19URVNUTk9fU1lTSU5GT19NT05JVE9SCT0gMHg0NSwKKwlOTV9JUEFDQ19URVNUTk9fQkNDQ0hfTU9OSVRPUgk9IDB4NDYsCit9OworCisvKiBmaXJzdCBieXRlIGFmdGVyIGxlbmd0aCBpbnNpZGUgTk1fQVRUX1RFU1RfUkVQT1JUICovCitlbnVtIGFiaXNfbm1faXBhY2NfdGVzdF9yZXMgeworCU5NX0lQQUNDX1RFU1RSRVNfU1VDQ0VTUwk9IDAsCisJTk1fSVBBQ0NfVEVTVFJFU19USU1FT1VUCT0gMSwKKwlOTV9JUEFDQ19URVNUUkVTX05PX0NIQU5TCT0gMiwKKwlOTV9JUEFDQ19URVNUUkVTX1BBUlRJQUwJPSAzLAorCU5NX0lQQUNDX1RFU1RSRVNfU1RPUFBFRAk9IDQsCit9OworCisvKiBpbnRlcm5hbCBJRSBpbnNpZGUgTk1fQVRUX1RFU1RfUkVQT1JUICovCitlbnVtIGFiaXNfbm1faXBhY2NfdGVzdHJlc19pZSB7CisJTk1fSVBBQ0NfVFJfSUVfRlJFUV9FUlJfTElTVAk9IDMsCisJTk1fSVBBQ0NfVFJfSUVfQ0hBTl9VU0FHRQk9IDQsCisJTk1fSVBBQ0NfVFJfSUVfQkNDSF9JTkZPCT0gNiwKKwlOTV9JUEFDQ19UUl9JRV9SRVNVTFRfREVUQUlMUwk9IDgsCisJTk1fSVBBQ0NfVFJfSUVfRlJFUV9FUlIJCT0gMTgsCit9OworCitlbnVtIGlwYWNfZWllIHsKKwlOTV9JUEFDX0VJRV9BUkZDTl9XSElURQkJPSAweDAxLAorCU5NX0lQQUNfRUlFX0FSRkNIX0JMQUNLCQk9IDB4MDIsCisJTk1fSVBBQ19FSUVfRlJFUV9FUlJfTElTVAk9IDB4MDMsCisJTk1fSVBBQ19FSUVfQ0hBTl9VU0VfTElTVAk9IDB4MDQsCisJTk1fSVBBQ19FSUVfQkNDSF9JTkZPX1RZUEUJPSAweDA1LAorCU5NX0lQQUNfRUlFX0JDQ0hfSU5GTwkJPSAweDA2LAorCU5NX0lQQUNfRUlFX0NPTkZJRwkJPSAweDA3LAorCU5NX0lQQUNfRUlFX1JFU19ERVRBSUxTCQk9IDB4MDgsCisJTk1fSVBBQ19FSUVfUlhMRVZfVEhSRVNICT0gMHgwOSwKKwlOTV9JUEFDX0VJRV9GUkVRX1NZTkNfT1BUUwk9IDB4MGEsCisJTk1fSVBBQ19FSUVfTUFDX0FERFIJCT0gMHgwYiwKKwlOTV9JUEFDX0VJRV9IV19TV19DT01QQVRfTlIJPSAweDBjLAorCU5NX0lQQUNfRUlFX01BTlVGX1NFUl9OUgk9IDB4MGQsCisJTk1fSVBBQ19FSUVfT0VNX0lECQk9IDB4MGUsCisJTk1fSVBBQ19FSUVfREFURV9USU1FX01BTlVGCT0gMHgwZiwKKwlOTV9JUEFDX0VJRV9EQVRFX1RJTUVfQ0FMSUIJPSAweDEwLAorCU5NX0lQQUNfRUlFX0JFQUNPTl9JTkZPCQk9IDB4MTEsCisJTk1fSVBBQ19FSUVfRlJFUV9FUlIJCT0gMHgxMiwKKwkvKiBGSVhNRSAqLworCU5NX0lQQUNfRUlFX0ZSRVFfQkFORFMJCT0gMHgxYywKKwlOTV9JUEFDX0VJRV9NQVhfVEEJCT0gMHgxZCwKKwlOTV9JUEFDX0VJRV9DSVBIX0FMR09TCQk9IDB4MWUsCisJTk1fSVBBQ19FSUVfQ0hBTl9UWVBFUwkJPSAweDFmLAorCU5NX0lQQUNfRUlFX0NIQU5fTU9ERVMJCT0gMHgyMCwKKwlOTV9JUEFDX0VJRV9HUFJTX0NPRElORwkJPSAweDIxLAorCU5NX0lQQUNfRUlFX1JUUF9GRUFUVVJFUwk9IDB4MjIsCisJTk1fSVBBQ19FSUVfUlNMX0ZFQVRVUkVTCT0gMHgyMywKKwlOTV9JUEFDX0VJRV9CVFNfSFdfQ0xBU1MJPSAweDI0LAorCU5NX0lQQUNfRUlFX0JUU19JRAkJPSAweDI1LAorfTsKKworZW51bSBpcGFjX2JjY2hfaW5mb190eXBlIHsKKwlJUEFDX0JJTkZfUlhMRVYJCQk9ICgxIDw8IDgpLAorCUlQQUNfQklORl9SWFFVQUwJCT0gKDEgPDwgOSksCisJSVBBQ19CSU5GX0ZSRVFfRVJSX1FVQUwJCT0gKDEgPDwgMTApLAorCUlQQUNfQklORl9GUkFNRV9PRkZTRVQJCT0gKDEgPDwgMTEpLAorCUlQQUNfQklORl9GUkFNRV9OUl9PRkZTRVQJPSAoMSA8PCAxMiksCisJSVBBQ19CSU5GX0JTSUMJCQk9ICgxIDw8IDEzKSwKKwlJUEFDX0JJTkZfQ0dJCQkJPSAoMSA8PCAxNCksCisJSVBBQ19CSU5GX05FSUdIX0JBX1NJMgkJPSAoMSA8PCAxNSksCisJSVBBQ19CSU5GX05FSUdIX0JBX1NJMmJpcwk9ICgxIDw8IDApLAorCUlQQUNfQklORl9ORUlHSF9CQV9TSTJ0ZXIJPSAoMSA8PCAxKSwKKwlJUEFDX0JJTkZfQ0VMTF9BTExPQwkJPSAoMSA8PCAyKSwKK307CisKKyNlbmRpZiAvKiBQUk9UT19HU01fMTJfMjFfSCAqLwpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9yYXRlX2N0ci5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9yYXRlX2N0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ODdkOWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3JhdGVfY3RyLmgKQEAgLTAsMCArMSw4MSBAQAorI2lmbmRlZiBfUkFURV9DVFJfSAorI2RlZmluZSBfUkFURV9DVFJfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKworI2RlZmluZSBSQVRFX0NUUl9JTlRWX05VTQk0CisKK2VudW0gcmF0ZV9jdHJfaW50diB7CisJUkFURV9DVFJfSU5UVl9TRUMsCisJUkFURV9DVFJfSU5UVl9NSU4sCisJUkFURV9DVFJfSU5UVl9IT1VSLAorCVJBVEVfQ1RSX0lOVFZfREFZLAorfTsKKworLyogZm9yIGVhY2ggb2YgdGhlIGludGVydmFscywgd2Uga2VlcCB0aGUgZm9sbG93aW5nIHZhbHVlcyAqLworc3RydWN0IHJhdGVfY3RyX3Blcl9pbnR2IHsKKwl1aW50NjRfdCBsYXN0OworCXVpbnQ2NF90IHJhdGU7Cit9OworCisvKiBmb3IgZWFjaCBhY3R1YWwgdmFsdWUsIHdlIGtlZXAgdGhlIGZvbGxvd2luZyBkYXRhICovCitzdHJ1Y3QgcmF0ZV9jdHIgeworCXVpbnQ2NF90IGN1cnJlbnQ7CisJc3RydWN0IHJhdGVfY3RyX3Blcl9pbnR2IGludHZbUkFURV9DVFJfSU5UVl9OVU1dOworfTsKKworc3RydWN0IHJhdGVfY3RyX2Rlc2MgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqZGVzY3JpcHRpb247Cit9OworCisvKiBEZXNjcmliZSBhIGNvdW50ZXIgZ3JvdXAgY2xhc3MgKi8KK3N0cnVjdCByYXRlX2N0cl9ncm91cF9kZXNjIHsKKwkvKiBUaGUgcHJlZml4IHRvIHRoZSBuYW1lIG9mIGFsbCBjb3VudGVycyBpbiB0aGlzIGdyb3VwICovCisJY29uc3QgY2hhciAqZ3JvdXBfbmFtZV9wcmVmaXg7CisJLyogVGhlIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBncm91cCAqLworCWNvbnN0IGNoYXIgKmdyb3VwX2Rlc2NyaXB0aW9uOworCS8qIFRoZSBudW1iZXIgb2YgY291bnRlcnMgaW4gdGhpcyBncm91cCAqLworCWNvbnN0IHVuc2lnbmVkIGludCBudW1fY3RyOworCS8qIFBvaW50ZXIgdG8gYXJyYXkgb2YgY291bnRlciBuYW1lcyAqLworCWNvbnN0IHN0cnVjdCByYXRlX2N0cl9kZXNjICpjdHJfZGVzYzsKK307CisKKy8qIE9uZSBpbnN0YW5jZSBvZiBhIGNvdW50ZXIgZ3JvdXAgY2xhc3MgKi8KK3N0cnVjdCByYXRlX2N0cl9ncm91cCB7CisJLyogTGlua2VkIGxpc3Qgb2YgYWxsIGNvdW50ZXIgZ3JvdXBzIGluIHRoZSBzeXN0ZW0gKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCS8qIFBvaW50ZXIgdG8gdGhlIGNvdW50ZXIgZ3JvdXAgY2xhc3MgKi8KKwljb25zdCBzdHJ1Y3QgcmF0ZV9jdHJfZ3JvdXBfZGVzYyAqZGVzYzsKKwkvKiBUaGUgaW5kZXggb2YgdGhpcyBjdHJfZ3JvdXAgd2l0aGluIGl0cyBjbGFzcyAqLworCXVuc2lnbmVkIGludCBpZHg7CisJLyogQWN0dWFsIGNvdW50ZXIgc3RydWN0dXJlcyBiZWxvdyAqLworCXN0cnVjdCByYXRlX2N0ciBjdHJbMF07Cit9OworCisvKiBBbGxvY2F0ZSBhIG5ldyBncm91cCBvZiBjb3VudGVycyBhY2NvcmRpbmcgdG8gZGVzY3JpcHRpb24gKi8KK3N0cnVjdCByYXRlX2N0cl9ncm91cCAqcmF0ZV9jdHJfZ3JvdXBfYWxsb2Modm9pZCAqY3R4LAorCQkJCQkgICAgY29uc3Qgc3RydWN0IHJhdGVfY3RyX2dyb3VwX2Rlc2MgKmRlc2MsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgaWR4KTsKKworLyogRnJlZSB0aGUgbWVtb3J5IGZvciB0aGUgc3BlY2lmaWVkIGdyb3VwIG9mIGNvdW50ZXJzICovCit2b2lkIHJhdGVfY3RyX2dyb3VwX2ZyZWUoc3RydWN0IHJhdGVfY3RyX2dyb3VwICpncnApOworCisvKiBBZGQgYSBudW1iZXIgdG8gdGhlIGNvdW50ZXIgKi8KK3ZvaWQgcmF0ZV9jdHJfYWRkKHN0cnVjdCByYXRlX2N0ciAqY3RyLCBpbnQgaW5jKTsKKworLyogSW5jcmVtZW50IHRoZSBjb3VudGVyIGJ5IDEgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByYXRlX2N0cl9pbmMoc3RydWN0IHJhdGVfY3RyICpjdHIpCit7CisJcmF0ZV9jdHJfYWRkKGN0ciwgMSk7Cit9CisKKy8qIEluaXRpYWxpemUgdGhlIGNvdW50ZXIgbW9kdWxlICovCitpbnQgcmF0ZV9jdHJfaW5pdCh2b2lkICp0YWxsX2N0eCk7CisKK3N0cnVjdCB2dHk7Cit2b2lkIHZ0eV9vdXRfcmF0ZV9jdHJfZ3JvdXAoc3RydWN0IHZ0eSAqdnR5LCBjb25zdCBjaGFyICpwcmVmaXgsCisJCQkgICAgc3RydWN0IHJhdGVfY3RyX2dyb3VwICpjdHJnKTsKKyNlbmRpZiAvKiBSQVRFX0NUUl9IICovCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3JzbC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9yc2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWI5MGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9yc2wuaApAQCAtMCwwICsxLDMyIEBACisjaWZuZGVmIF9PU01PQ09SRV9SU0xfSAorI2RlZmluZSBfT1NNT0NPUkVfUlNMX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3V0aWxzLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA4XzU4Lmg+CisKK3ZvaWQgcnNsX2luaXRfcmxsX2hkcihzdHJ1Y3QgYWJpc19yc2xfcmxsX2hkciAqZGgsIHVpbnQ4X3QgbXNnX3R5cGUpOworCitleHRlcm4gY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uIHJzbF9hdHRfdGx2ZGVmOworI2RlZmluZSByc2xfdGx2X3BhcnNlKGRlYywgYnVmLCBsZW4pICAgICBcCisJCQl0bHZfcGFyc2UoZGVjLCAmcnNsX2F0dF90bHZkZWYsIGJ1ZiwgbGVuLCAwLCAwKQorCisvKiBlbmNvZGUgY2hhbm5lbCBudW1iZXIgYXMgcGVyIFNlY3Rpb24gOS4zLjEgKi8KK3VpbnQ4X3QgcnNsX2VuY19jaGFuX25yKHVpbnQ4X3QgdHlwZSwgdWludDhfdCBzdWJjaCwgdWludDhfdCB0aW1lc2xvdCk7CisvKiBkZWNvZGUgY2hhbm5lbCBudW1iZXIgYXMgcGVyIFNlY3Rpb24gOS4zLjEgKi8KK2ludCByc2xfZGVjX2NoYW5fbnIodWludDhfdCBjaGFuX25yLCB1aW50OF90ICp0eXBlLCB1aW50OF90ICpzdWJjaCwgdWludDhfdCAqdGltZXNsb3QpOworCitjb25zdCBjaGFyICpyc2xfZXJyX25hbWUodWludDhfdCBlcnIpOworY29uc3QgY2hhciAqcnNsX3JsbV9jYXVzZV9uYW1lKHVpbnQ4X3QgZXJyKTsKKworLyogU2VjdGlvbiAzLjMuMi4zIFRTIDA1LjAyLiBJIHRoaW5rIHRoaXMgbG9va3MgbGlrZSBhIHRhYmxlICovCitpbnQgcnNsX2NjY2hfY29uZl90b19ic19jY19jaGFucyhpbnQgY2NjaF9jb25mKTsKKworLyogUHVzaCBhIFJTTCBSTEwgaGVhZGVyIHdpdGggTDNfSU5GTyBJRSAqLwordm9pZCByc2xfcmxsX3B1c2hfbDMoc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCBtc2dfdHlwZSwgdWludDhfdCBjaGFuX25yLAorCQkgICAgIHVpbnQ4X3QgbGlua19pZCwgaW50IHRyYW5zcGFyZW50KTsKKworLyogQWxsb2NhdGUgbXNnYiBhbmQgZmlsbCB3aXRoIHNpbXBsZSBSU0wgUkxMIGhlYWRlciAqLworc3RydWN0IG1zZ2IgKnJzbF9ybGxfc2ltcGxlKHVpbnQ4X3QgbXNnX3R5cGUsIHVpbnQ4X3QgY2hhbl9uciwKKwkJCSAgICB1aW50OF90IGxpbmtfaWQsIGludCB0cmFuc3BhcmVudCk7CisjZW5kaWYgLyogX09TTU9DT1JFX1JTTF9IICovCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3J4bGV2X3N0YXQuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcnhsZXZfc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNTUwOWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3J4bGV2X3N0YXQuaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIF9PU01PQ09SRV9SWExFVl9TVEFUU19ICisjZGVmaW5lIF9PU01PQ09SRV9SWExFVl9TVEFUU19ICisKKyNkZWZpbmUgTlVNX1JYTEVWUyAzMgorI2RlZmluZSBOVU1fQVJGQ05TIDEwMjQKKworc3RydWN0IHJ4bGV2X3N0YXRzIHsKKwkvKiB0aGUgbWF4aW11bSBudW1iZXIgb2YgQVJGQ04ncyBpcyAxMDI0LCBhbmQgdGhlcmUgYXJlIDMyIFJ4TGV2ZWxzLAorCSAqIHNvIGluIHdlIGtlZXAgb25lIDEwMjRiaXQtYml0dmVjIGZvciBlYWNoIFJ4TGV2ICovCisJdWludDhfdCByeGxldl9idWNrZXRzW05VTV9SWExFVlNdW05VTV9BUkZDTlMvOF07Cit9OworCit2b2lkIHJ4bGV2X3N0YXRfaW5wdXQoc3RydWN0IHJ4bGV2X3N0YXRzICpzdCwgdWludDE2X3QgYXJmY24sIHVpbnQ4X3QgcnhsZXYpOworCisvKiBnZXQgdGhlIG5leHQgQVJGQ04gdGhhdCBoYXMgdGhlIHNwZWNpZmllZCBSeGxldiAqLworaW50MTZfdCByeGxldl9zdGF0X2dldF9uZXh0KGNvbnN0IHN0cnVjdCByeGxldl9zdGF0cyAqc3QsIHVpbnQ4X3QgcnhsZXYsIGludDE2X3QgYXJmY24pOworCit2b2lkIHJ4bGV2X3N0YXRfcmVzZXQoc3RydWN0IHJ4bGV2X3N0YXRzICpzdCk7CisKK3ZvaWQgcnhsZXZfc3RhdF9kdW1wKGNvbnN0IHN0cnVjdCByeGxldl9zdGF0cyAqc3QpOworCisjZW5kaWYgLyogX09TTU9DT1JFX1JYTEVWX1NUQVRTX0ggKi8KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvc2VsZWN0LmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3NlbGVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOGIzZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3NlbGVjdC5oCkBAIC0wLDAgKzEsMjIgQEAKKyNpZm5kZWYgX0JTQ19TRUxFQ1RfSAorI2RlZmluZSBfQlNDX1NFTEVDVF9ICisKKyNpbmNsdWRlICJsaW51eGxpc3QuaCIKKworI2RlZmluZSBCU0NfRkRfUkVBRAkweDAwMDEKKyNkZWZpbmUgQlNDX0ZEX1dSSVRFCTB4MDAwMgorI2RlZmluZSBCU0NfRkRfRVhDRVBUCTB4MDAwNAorCitzdHJ1Y3QgYnNjX2ZkIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCWludCBmZDsKKwl1bnNpZ25lZCBpbnQgd2hlbjsKKwlpbnQgKCpjYikoc3RydWN0IGJzY19mZCAqZmQsIHVuc2lnbmVkIGludCB3aGF0KTsKKwl2b2lkICpkYXRhOworCXVuc2lnbmVkIGludCBwcml2X25yOworfTsKKworaW50IGJzY19yZWdpc3Rlcl9mZChzdHJ1Y3QgYnNjX2ZkICpmZCk7Cit2b2lkIGJzY191bnJlZ2lzdGVyX2ZkKHN0cnVjdCBic2NfZmQgKmZkKTsKK2ludCBic2Nfc2VsZWN0X21haW4oaW50IHBvbGxpbmcpOworI2VuZGlmIC8qIF9CU0NfU0VMRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvc2lnbmFsLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3NpZ25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZDgzZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3NpZ25hbC5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgT1NNT0NPUkVfU0lHTkFMX0gKKyNkZWZpbmUgT1NNT0NPUkVfU0lHTkFMX0gKKwordHlwZWRlZiBpbnQgc2lnbmFsX2NiZm4odW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJCXZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpOworCisKKy8qIE1hbmFnZW1lbnQgKi8KK2ludCByZWdpc3Rlcl9zaWduYWxfaGFuZGxlcih1bnNpZ25lZCBpbnQgc3Vic3lzLCBzaWduYWxfY2JmbiAqY2Jmbiwgdm9pZCAqZGF0YSk7Cit2b2lkIHVucmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIodW5zaWduZWQgaW50IHN1YnN5cywgc2lnbmFsX2NiZm4gKmNiZm4sIHZvaWQgKmRhdGEpOworCisvKiBEaXNwYXRjaCAqLwordm9pZCBkaXNwYXRjaF9zaWduYWwodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwgdm9pZCAqc2lnbmFsX2RhdGEpOworCisjZW5kaWYgLyogT1NNT0NPUkVfU0lHTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvc3RhdGlzdGljcy5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9zdGF0aXN0aWNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ1NjA1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvc3RhdGlzdGljcy5oCkBAIC0wLDAgKzEsMzEgQEAKKyNpZm5kZWYgX1NUQVRJU1RJQ1NfSAorI2RlZmluZSBfU1RBVElTVElDU19ICisKK3N0cnVjdCBjb3VudGVyIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqZGVzY3JpcHRpb247CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb3VudGVyX2luYyhzdHJ1Y3QgY291bnRlciAqY3RyKQoreworCWN0ci0+dmFsdWUrKzsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNvdW50ZXJfZ2V0KHN0cnVjdCBjb3VudGVyICpjdHIpCit7CisJcmV0dXJuIGN0ci0+dmFsdWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb3VudGVyX3Jlc2V0KHN0cnVjdCBjb3VudGVyICpjdHIpCit7CisJY3RyLT52YWx1ZSA9IDA7Cit9CisKK3N0cnVjdCBjb3VudGVyICpjb3VudGVyX2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBjb3VudGVyX2ZyZWUoc3RydWN0IGNvdW50ZXIgKmN0cik7CisKK2ludCBjb3VudGVyc19mb3JfZWFjaChpbnQgKCpoYW5kbGVfY291bnRlcikoc3RydWN0IGNvdW50ZXIgKiwgdm9pZCAqKSwgdm9pZCAqZGF0YSk7CisKKyNlbmRpZiAvKiBfU1RBVElTVElDU19IICovCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3RhbGxvYy5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS90YWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2Y3NjQzCi0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS90YWxsb2MuaApAQCAtMCwwICsxLDE5MiBAQAorI2lmbmRlZiBfVEFMTE9DX0hfCisjZGVmaW5lIF9UQUxMT0NfSF8KKy8qIAorICAgVW5peCBTTUIvQ0lGUyBpbXBsZW1lbnRhdGlvbi4KKyAgIFNhbWJhIHRlbXBvcmFyeSBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMKKworICAgQ29weXJpZ2h0IChDKSBBbmRyZXcgVHJpZGdlbGwgMjAwNC0yMDA1CisgICBDb3B5cmlnaHQgKEMpIFN0ZWZhbiBNZXR6bWFjaGVyIDIwMDYKKyAgIAorICAgICAqKiBOT1RFISBUaGUgZm9sbG93aW5nIExHUEwgbGljZW5zZSBhcHBsaWVzIHRvIHRoZSB0YWxsb2MKKyAgICAgKiogbGlicmFyeS4gVGhpcyBkb2VzIE5PVCBpbXBseSB0aGF0IGFsbCBvZiBTYW1iYSBpcyByZWxlYXNlZAorICAgICAqKiB1bmRlciB0aGUgTEdQTAorICAgCisgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjZGVmaW5lIEhBVkVfVkFfQ09QWQorCisvKiB0aGlzIGlzIG9ubHkgbmVlZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZCB0YWxsb2MgKi8KK3R5cGVkZWYgdm9pZCBUQUxMT0NfQ1RYOworCisvKgorICB0aGlzIHVzZXMgYSBsaXR0bGUgdHJpY2sgdG8gYWxsb3cgX19MSU5FX18gdG8gYmUgc3RyaW5naWZpZWQKKyovCisjaWZuZGVmIF9fbG9jYXRpb25fXworI2RlZmluZSBfX1RBTExPQ19TVFJJTkdfTElORTFfXyhzKSAgICAjcworI2RlZmluZSBfX1RBTExPQ19TVFJJTkdfTElORTJfXyhzKSAgIF9fVEFMTE9DX1NUUklOR19MSU5FMV9fKHMpCisjZGVmaW5lIF9fVEFMTE9DX1NUUklOR19MSU5FM19fICBfX1RBTExPQ19TVFJJTkdfTElORTJfXyhfX0xJTkVfXykKKyNkZWZpbmUgX19sb2NhdGlvbl9fIF9fRklMRV9fICI6IiBfX1RBTExPQ19TVFJJTkdfTElORTNfXworI2VuZGlmCisKKyNpZm5kZWYgVEFMTE9DX0RFUFJFQ0FURUQKKyNkZWZpbmUgVEFMTE9DX0RFUFJFQ0FURUQgMAorI2VuZGlmCisKKyNpZm5kZWYgUFJJTlRGX0FUVFJJQlVURQorI2lmIChfX0dOVUNfXyA+PSAzKQorLyoqIFVzZSBnY2MgYXR0cmlidXRlIHRvIGNoZWNrIHByaW50ZiBmbnMuICBhMSBpcyB0aGUgMS1iYXNlZCBpbmRleCBvZgorICogdGhlIHBhcmFtZXRlciBjb250YWluaW5nIHRoZSBmb3JtYXQsIGFuZCBhMiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0CisgKiBhcmd1bWVudC4gTm90ZSB0aGF0IHNvbWUgZ2NjIDIueCB2ZXJzaW9ucyBkb24ndCBoYW5kbGUgdGhpcworICogcHJvcGVybHkgKiovCisjZGVmaW5lIFBSSU5URl9BVFRSSUJVVEUoYTEsIGEyKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChfX3ByaW50Zl9fLCBhMSwgYTIpKSkKKyNlbHNlCisjZGVmaW5lIFBSSU5URl9BVFRSSUJVVEUoYTEsIGEyKQorI2VuZGlmCisjZW5kaWYKKworLyogdHJ5IHRvIG1ha2UgdGFsbG9jX3NldF9kZXN0cnVjdG9yKCkgYW5kIHRhbGxvY19zdGVhbCgpIHR5cGUgc2FmZSwKKyAgIGlmIHdlIGhhdmUgYSByZWNlbnQgZ2NjICovCisjaWYgKF9fR05VQ19fID49IDMpCisjZGVmaW5lIF9UQUxMT0NfVFlQRU9GKHB0cikgX190eXBlb2ZfXyhwdHIpCisjZGVmaW5lIHRhbGxvY19zZXRfZGVzdHJ1Y3RvcihwdHIsIGZ1bmN0aW9uKQkJCQkgICAgICBcCisJZG8gewkJCQkJCQkJICAgICAgXAorCQlpbnQgKCpfdGFsbG9jX2Rlc3RydWN0b3JfZm4pKF9UQUxMT0NfVFlQRU9GKHB0cikpID0gKGZ1bmN0aW9uKTsJICAgICAgXAorCQlfdGFsbG9jX3NldF9kZXN0cnVjdG9yKChwdHIpLCAoaW50ICgqKSh2b2lkICopKV90YWxsb2NfZGVzdHJ1Y3Rvcl9mbik7IFwKKwl9IHdoaWxlKDApCisvKiB0aGlzIGV4dHJlbWVseSBzdHJhbmdlIG1hY3JvIGlzIHRvIGF2b2lkIHNvbWUgYnJhaW5kYW1hZ2VkIHdhcm5pbmcKKyAgIHN0dXBpZGl0eSBpbiBnY2MgNC4xLnggKi8KKyNkZWZpbmUgdGFsbG9jX3N0ZWFsKGN0eCwgcHRyKSAoeyBfVEFMTE9DX1RZUEVPRihwdHIpIF9fdGFsbG9jX3N0ZWFsX3JldCA9IChfVEFMTE9DX1RZUEVPRihwdHIpKV90YWxsb2Nfc3RlYWwoKGN0eCksKHB0cikpOyBfX3RhbGxvY19zdGVhbF9yZXQ7IH0pCisjZWxzZQorI2RlZmluZSB0YWxsb2Nfc2V0X2Rlc3RydWN0b3IocHRyLCBmdW5jdGlvbikgXAorCV90YWxsb2Nfc2V0X2Rlc3RydWN0b3IoKHB0ciksIChpbnQgKCopKHZvaWQgKikpKGZ1bmN0aW9uKSkKKyNkZWZpbmUgX1RBTExPQ19UWVBFT0YocHRyKSB2b2lkICoKKyNkZWZpbmUgdGFsbG9jX3N0ZWFsKGN0eCwgcHRyKSAoX1RBTExPQ19UWVBFT0YocHRyKSlfdGFsbG9jX3N0ZWFsKChjdHgpLChwdHIpKQorI2VuZGlmCisKKyNkZWZpbmUgdGFsbG9jX3JlZmVyZW5jZShjdHgsIHB0cikgKF9UQUxMT0NfVFlQRU9GKHB0cikpX3RhbGxvY19yZWZlcmVuY2UoKGN0eCksKHB0cikpCisjZGVmaW5lIHRhbGxvY19tb3ZlKGN0eCwgcHRyKSAoX1RBTExPQ19UWVBFT0YoKihwdHIpKSlfdGFsbG9jX21vdmUoKGN0eCksKHZvaWQgKikocHRyKSkKKworLyogdXNlZnVsIG1hY3JvcyBmb3IgY3JlYXRpbmcgdHlwZSBjaGVja2VkIHBvaW50ZXJzICovCisjZGVmaW5lIHRhbGxvYyhjdHgsIHR5cGUpICh0eXBlICopdGFsbG9jX25hbWVkX2NvbnN0KGN0eCwgc2l6ZW9mKHR5cGUpLCAjdHlwZSkKKyNkZWZpbmUgdGFsbG9jX3NpemUoY3R4LCBzaXplKSB0YWxsb2NfbmFtZWRfY29uc3QoY3R4LCBzaXplLCBfX2xvY2F0aW9uX18pCisjZGVmaW5lIHRhbGxvY19wdHJ0eXBlKGN0eCwgcHRyKSAoX1RBTExPQ19UWVBFT0YocHRyKSl0YWxsb2Nfc2l6ZShjdHgsIHNpemVvZigqKHB0cikpKQorCisjZGVmaW5lIHRhbGxvY19uZXcoY3R4KSB0YWxsb2NfbmFtZWRfY29uc3QoY3R4LCAwLCAidGFsbG9jX25ldzogIiBfX2xvY2F0aW9uX18pCisKKyNkZWZpbmUgdGFsbG9jX3plcm8oY3R4LCB0eXBlKSAodHlwZSAqKV90YWxsb2NfemVybyhjdHgsIHNpemVvZih0eXBlKSwgI3R5cGUpCisjZGVmaW5lIHRhbGxvY196ZXJvX3NpemUoY3R4LCBzaXplKSBfdGFsbG9jX3plcm8oY3R4LCBzaXplLCBfX2xvY2F0aW9uX18pCisKKyNkZWZpbmUgdGFsbG9jX3plcm9fYXJyYXkoY3R4LCB0eXBlLCBjb3VudCkgKHR5cGUgKilfdGFsbG9jX3plcm9fYXJyYXkoY3R4LCBzaXplb2YodHlwZSksIGNvdW50LCAjdHlwZSkKKyNkZWZpbmUgdGFsbG9jX2FycmF5KGN0eCwgdHlwZSwgY291bnQpICh0eXBlICopX3RhbGxvY19hcnJheShjdHgsIHNpemVvZih0eXBlKSwgY291bnQsICN0eXBlKQorI2RlZmluZSB0YWxsb2NfYXJyYXlfc2l6ZShjdHgsIHNpemUsIGNvdW50KSBfdGFsbG9jX2FycmF5KGN0eCwgc2l6ZSwgY291bnQsIF9fbG9jYXRpb25fXykKKyNkZWZpbmUgdGFsbG9jX2FycmF5X3B0cnR5cGUoY3R4LCBwdHIsIGNvdW50KSAoX1RBTExPQ19UWVBFT0YocHRyKSl0YWxsb2NfYXJyYXlfc2l6ZShjdHgsIHNpemVvZigqKHB0cikpLCBjb3VudCkKKyNkZWZpbmUgdGFsbG9jX2FycmF5X2xlbmd0aChjdHgpICh0YWxsb2NfZ2V0X3NpemUoY3R4KS9zaXplb2YoKmN0eCkpCisKKyNkZWZpbmUgdGFsbG9jX3JlYWxsb2MoY3R4LCBwLCB0eXBlLCBjb3VudCkgKHR5cGUgKilfdGFsbG9jX3JlYWxsb2NfYXJyYXkoY3R4LCBwLCBzaXplb2YodHlwZSksIGNvdW50LCAjdHlwZSkKKyNkZWZpbmUgdGFsbG9jX3JlYWxsb2Nfc2l6ZShjdHgsIHB0ciwgc2l6ZSkgX3RhbGxvY19yZWFsbG9jKGN0eCwgcHRyLCBzaXplLCBfX2xvY2F0aW9uX18pCisKKyNkZWZpbmUgdGFsbG9jX21lbWR1cCh0LCBwLCBzaXplKSBfdGFsbG9jX21lbWR1cCh0LCBwLCBzaXplLCBfX2xvY2F0aW9uX18pCisKKyNkZWZpbmUgdGFsbG9jX3NldF90eXBlKHB0ciwgdHlwZSkgdGFsbG9jX3NldF9uYW1lX2NvbnN0KHB0ciwgI3R5cGUpCisjZGVmaW5lIHRhbGxvY19nZXRfdHlwZShwdHIsIHR5cGUpICh0eXBlICopdGFsbG9jX2NoZWNrX25hbWUocHRyLCAjdHlwZSkKKyNkZWZpbmUgdGFsbG9jX2dldF90eXBlX2Fib3J0KHB0ciwgdHlwZSkgKHR5cGUgKilfdGFsbG9jX2dldF90eXBlX2Fib3J0KHB0ciwgI3R5cGUsIF9fbG9jYXRpb25fXykKKworI2RlZmluZSB0YWxsb2NfZmluZF9wYXJlbnRfYnl0eXBlKHB0ciwgdHlwZSkgKHR5cGUgKil0YWxsb2NfZmluZF9wYXJlbnRfYnluYW1lKHB0ciwgI3R5cGUpCisKKyNpZiBUQUxMT0NfREVQUkVDQVRFRAorI2RlZmluZSB0YWxsb2NfemVyb19wKGN0eCwgdHlwZSkgdGFsbG9jX3plcm8oY3R4LCB0eXBlKQorI2RlZmluZSB0YWxsb2NfcChjdHgsIHR5cGUpIHRhbGxvYyhjdHgsIHR5cGUpCisjZGVmaW5lIHRhbGxvY19hcnJheV9wKGN0eCwgdHlwZSwgY291bnQpIHRhbGxvY19hcnJheShjdHgsIHR5cGUsIGNvdW50KQorI2RlZmluZSB0YWxsb2NfcmVhbGxvY19wKGN0eCwgcCwgdHlwZSwgY291bnQpIHRhbGxvY19yZWFsbG9jKGN0eCwgcCwgdHlwZSwgY291bnQpCisjZGVmaW5lIHRhbGxvY19kZXN0cm95KGN0eCkgdGFsbG9jX2ZyZWUoY3R4KQorI2RlZmluZSB0YWxsb2NfYXBwZW5kX3N0cmluZyhjLCBzLCBhKSAocz90YWxsb2Nfc3RyZHVwX2FwcGVuZChzLGEpOnRhbGxvY19zdHJkdXAoYywgYSkpCisjZW5kaWYKKworI2RlZmluZSBUQUxMT0NfRlJFRShjdHgpIGRvIHsgdGFsbG9jX2ZyZWUoY3R4KTsgY3R4PU5VTEw7IH0gd2hpbGUoMCkKKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBjb21lIGZyb20gdGFsbG9jLmMgICovCit2b2lkICpfdGFsbG9jKGNvbnN0IHZvaWQgKmNvbnRleHQsIHNpemVfdCBzaXplKTsKK3ZvaWQgKnRhbGxvY19wb29sKGNvbnN0IHZvaWQgKmNvbnRleHQsIHNpemVfdCBzaXplKTsKK3ZvaWQgX3RhbGxvY19zZXRfZGVzdHJ1Y3Rvcihjb25zdCB2b2lkICpwdHIsIGludCAoKl9kZXN0cnVjdG9yKSh2b2lkICopKTsKK2ludCB0YWxsb2NfaW5jcmVhc2VfcmVmX2NvdW50KGNvbnN0IHZvaWQgKnB0cik7CitzaXplX3QgdGFsbG9jX3JlZmVyZW5jZV9jb3VudChjb25zdCB2b2lkICpwdHIpOwordm9pZCAqX3RhbGxvY19yZWZlcmVuY2UoY29uc3Qgdm9pZCAqY29udGV4dCwgY29uc3Qgdm9pZCAqcHRyKTsKK2ludCB0YWxsb2NfdW5saW5rKGNvbnN0IHZvaWQgKmNvbnRleHQsIHZvaWQgKnB0cik7Citjb25zdCBjaGFyICp0YWxsb2Nfc2V0X25hbWUoY29uc3Qgdm9pZCAqcHRyLCBjb25zdCBjaGFyICpmbXQsIC4uLikgUFJJTlRGX0FUVFJJQlVURSgyLDMpOwordm9pZCB0YWxsb2Nfc2V0X25hbWVfY29uc3QoY29uc3Qgdm9pZCAqcHRyLCBjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgKnRhbGxvY19uYW1lZChjb25zdCB2b2lkICpjb250ZXh0LCBzaXplX3Qgc2l6ZSwgCisJCSAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBQUklOVEZfQVRUUklCVVRFKDMsNCk7Cit2b2lkICp0YWxsb2NfbmFtZWRfY29uc3QoY29uc3Qgdm9pZCAqY29udGV4dCwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKm5hbWUpOworY29uc3QgY2hhciAqdGFsbG9jX2dldF9uYW1lKGNvbnN0IHZvaWQgKnB0cik7Cit2b2lkICp0YWxsb2NfY2hlY2tfbmFtZShjb25zdCB2b2lkICpwdHIsIGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCAqX3RhbGxvY19nZXRfdHlwZV9hYm9ydChjb25zdCB2b2lkICpwdHIsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmxvY2F0aW9uKTsKK3ZvaWQgKnRhbGxvY19wYXJlbnQoY29uc3Qgdm9pZCAqcHRyKTsKK2NvbnN0IGNoYXIgKnRhbGxvY19wYXJlbnRfbmFtZShjb25zdCB2b2lkICpwdHIpOwordm9pZCAqdGFsbG9jX2luaXQoY29uc3QgY2hhciAqZm10LCAuLi4pIFBSSU5URl9BVFRSSUJVVEUoMSwyKTsKK2ludCB0YWxsb2NfZnJlZSh2b2lkICpwdHIpOwordm9pZCB0YWxsb2NfZnJlZV9jaGlsZHJlbih2b2lkICpwdHIpOwordm9pZCAqX3RhbGxvY19yZWFsbG9jKGNvbnN0IHZvaWQgKmNvbnRleHQsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCAqX3RhbGxvY19zdGVhbChjb25zdCB2b2lkICpuZXdfY3R4LCBjb25zdCB2b2lkICpwdHIpOwordm9pZCAqX3RhbGxvY19tb3ZlKGNvbnN0IHZvaWQgKm5ld19jdHgsIGNvbnN0IHZvaWQgKnBwdHIpOworc2l6ZV90IHRhbGxvY190b3RhbF9zaXplKGNvbnN0IHZvaWQgKnB0cik7CitzaXplX3QgdGFsbG9jX3RvdGFsX2Jsb2Nrcyhjb25zdCB2b2lkICpwdHIpOwordm9pZCB0YWxsb2NfcmVwb3J0X2RlcHRoX2NiKGNvbnN0IHZvaWQgKnB0ciwgaW50IGRlcHRoLCBpbnQgbWF4X2RlcHRoLAorCQkJICAgIHZvaWQgKCpjYWxsYmFjaykoY29uc3Qgdm9pZCAqcHRyLAorCQkJICAJCSAgICAgaW50IGRlcHRoLCBpbnQgbWF4X2RlcHRoLAorCQkJCQkgICAgIGludCBpc19yZWYsCisJCQkJCSAgICAgdm9pZCAqcHJpdmF0ZV9kYXRhKSwKKwkJCSAgICB2b2lkICpwcml2YXRlX2RhdGEpOwordm9pZCB0YWxsb2NfcmVwb3J0X2RlcHRoX2ZpbGUoY29uc3Qgdm9pZCAqcHRyLCBpbnQgZGVwdGgsIGludCBtYXhfZGVwdGgsIEZJTEUgKmYpOwordm9pZCB0YWxsb2NfcmVwb3J0X2Z1bGwoY29uc3Qgdm9pZCAqcHRyLCBGSUxFICpmKTsKK3ZvaWQgdGFsbG9jX3JlcG9ydChjb25zdCB2b2lkICpwdHIsIEZJTEUgKmYpOwordm9pZCB0YWxsb2NfZW5hYmxlX251bGxfdHJhY2tpbmcodm9pZCk7Cit2b2lkIHRhbGxvY19kaXNhYmxlX251bGxfdHJhY2tpbmcodm9pZCk7Cit2b2lkIHRhbGxvY19lbmFibGVfbGVha19yZXBvcnQodm9pZCk7Cit2b2lkIHRhbGxvY19lbmFibGVfbGVha19yZXBvcnRfZnVsbCh2b2lkKTsKK3ZvaWQgKl90YWxsb2NfemVybyhjb25zdCB2b2lkICpjdHgsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgKl90YWxsb2NfbWVtZHVwKGNvbnN0IHZvaWQgKnQsIGNvbnN0IHZvaWQgKnAsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgKl90YWxsb2NfYXJyYXkoY29uc3Qgdm9pZCAqY3R4LCBzaXplX3QgZWxfc2l6ZSwgdW5zaWduZWQgY291bnQsIGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCAqX3RhbGxvY196ZXJvX2FycmF5KGNvbnN0IHZvaWQgKmN0eCwgc2l6ZV90IGVsX3NpemUsIHVuc2lnbmVkIGNvdW50LCBjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgKl90YWxsb2NfcmVhbGxvY19hcnJheShjb25zdCB2b2lkICpjdHgsIHZvaWQgKnB0ciwgc2l6ZV90IGVsX3NpemUsIHVuc2lnbmVkIGNvdW50LCBjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgKnRhbGxvY19yZWFsbG9jX2ZuKGNvbnN0IHZvaWQgKmNvbnRleHQsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpOwordm9pZCAqdGFsbG9jX2F1dG9mcmVlX2NvbnRleHQodm9pZCk7CitzaXplX3QgdGFsbG9jX2dldF9zaXplKGNvbnN0IHZvaWQgKmN0eCk7Cit2b2lkICp0YWxsb2NfZmluZF9wYXJlbnRfYnluYW1lKGNvbnN0IHZvaWQgKmN0eCwgY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIHRhbGxvY19zaG93X3BhcmVudHMoY29uc3Qgdm9pZCAqY29udGV4dCwgRklMRSAqZmlsZSk7CitpbnQgdGFsbG9jX2lzX3BhcmVudChjb25zdCB2b2lkICpjb250ZXh0LCBjb25zdCB2b2lkICpwdHIpOworCitjaGFyICp0YWxsb2Nfc3RyZHVwKGNvbnN0IHZvaWQgKnQsIGNvbnN0IGNoYXIgKnApOworY2hhciAqdGFsbG9jX3N0cmR1cF9hcHBlbmQoY2hhciAqcywgY29uc3QgY2hhciAqYSk7CitjaGFyICp0YWxsb2Nfc3RyZHVwX2FwcGVuZF9idWZmZXIoY2hhciAqcywgY29uc3QgY2hhciAqYSk7CisKK2NoYXIgKnRhbGxvY19zdHJuZHVwKGNvbnN0IHZvaWQgKnQsIGNvbnN0IGNoYXIgKnAsIHNpemVfdCBuKTsKK2NoYXIgKnRhbGxvY19zdHJuZHVwX2FwcGVuZChjaGFyICpzLCBjb25zdCBjaGFyICphLCBzaXplX3Qgbik7CitjaGFyICp0YWxsb2Nfc3RybmR1cF9hcHBlbmRfYnVmZmVyKGNoYXIgKnMsIGNvbnN0IGNoYXIgKmEsIHNpemVfdCBuKTsKKworY2hhciAqdGFsbG9jX3Zhc3ByaW50Zihjb25zdCB2b2lkICp0LCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApIFBSSU5URl9BVFRSSUJVVEUoMiwwKTsKK2NoYXIgKnRhbGxvY192YXNwcmludGZfYXBwZW5kKGNoYXIgKnMsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkgUFJJTlRGX0FUVFJJQlVURSgyLDApOworY2hhciAqdGFsbG9jX3Zhc3ByaW50Zl9hcHBlbmRfYnVmZmVyKGNoYXIgKnMsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkgUFJJTlRGX0FUVFJJQlVURSgyLDApOworCitjaGFyICp0YWxsb2NfYXNwcmludGYoY29uc3Qgdm9pZCAqdCwgY29uc3QgY2hhciAqZm10LCAuLi4pIFBSSU5URl9BVFRSSUJVVEUoMiwzKTsKK2NoYXIgKnRhbGxvY19hc3ByaW50Zl9hcHBlbmQoY2hhciAqcywgY29uc3QgY2hhciAqZm10LCAuLi4pIFBSSU5URl9BVFRSSUJVVEUoMiwzKTsKK2NoYXIgKnRhbGxvY19hc3ByaW50Zl9hcHBlbmRfYnVmZmVyKGNoYXIgKnMsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBQUklOVEZfQVRUUklCVVRFKDIsMyk7CisKK3ZvaWQgdGFsbG9jX3NldF9hYm9ydF9mbih2b2lkICgqYWJvcnRfZm4pKGNvbnN0IGNoYXIgKnJlYXNvbikpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvdGltZXIuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvdGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWU4ODhiCi0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS90aW1lci5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiAoQykgMjAwOCwgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBUSU1FUl9ICisjZGVmaW5lIFRJTUVSX0gKKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKyNpbmNsdWRlICJsaW51eGxpc3QuaCIKKworLyoqCisgKiBUaW1lciBtYW5hZ2VtZW50OgorICogICAgICAtIENyZWF0ZSBhIHN0cnVjdCB0aW1lcl9saXN0CisgKiAgICAgIC0gRmlsbCBvdXQgdGltZW91dCBhbmQgdXNlIGFkZF90aW1lciBvcgorICogICAgICAgIHVzZSBzY2hlZHVsZV90aW1lciB0byBzY2hlZHVsZSBhIHRpbWVyIGluCisgKiAgICAgICAgeCBzZWNvbmRzIGFuZCBtaWNyb3NlY29uZHMgZnJvbSBub3cuLi4KKyAqICAgICAgLSBVc2UgZGVsX3RpbWVyIHRvIHJlbW92ZSB0aGUgdGltZXIKKyAqCisgKiAgSW50ZXJuYWxseToKKyAqICAgICAgLSBXZSBob29rIGludG8gc2VsZWN0LmMgdG8gZ2l2ZSBhIHRpbWV2YWwgb2YgdGhlCisgKiAgICAgICAgbmVhcmVzdCB0aW1lci4gT24gYWxyZWFkeSBwYXNzZWQgdGltZXJzIHdlIGdpdmUKKyAqICAgICAgICBpdCBhIDAgdG8gaW1tZWRpYXRlbHkgZmlyZSBhZnRlciB0aGUgc2VsZWN0CisgKiAgICAgIC0gdXBkYXRlX3RpbWVycyB3aWxsIGNhbGwgdGhlIGNhbGxiYWNrcyBhbmQgcmVtb3ZlCisgKiAgICAgICAgdGhlIHRpbWVycy4KKyAqCisgKi8KK3N0cnVjdCB0aW1lcl9saXN0IHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBlbnRyeTsKKwlzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworCXVuc2lnbmVkIGludCBhY3RpdmUgIDogMTsKKwl1bnNpZ25lZCBpbnQgaGFuZGxlZCA6IDE7CisJdW5zaWduZWQgaW50IGluX2xpc3QgOiAxOworCisJdm9pZCAoKmNiKSh2b2lkKik7CisJdm9pZCAqZGF0YTsKK307CisKKy8qKgorICogdGltZXIgbWFuYWdlbWVudAorICovCit2b2lkIGJzY19hZGRfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKTsKK3ZvaWQgYnNjX3NjaGVkdWxlX3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciwgaW50IHNlY29uZHMsIGludCBtaWNyb3NlY29uZHMpOwordm9pZCBic2NfZGVsX3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcik7CitpbnQgYnNjX3RpbWVyX3BlbmRpbmcoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKTsKKworCisvKioKKyAqIGludGVybmFsIHRpbWVyIGxpc3QgbWFuYWdlbWVudAorICovCitzdHJ1Y3QgdGltZXZhbCAqYnNjX25lYXJlc3RfdGltZXIoKTsKK3ZvaWQgYnNjX3ByZXBhcmVfdGltZXJzKCk7CitpbnQgYnNjX3VwZGF0ZV90aW1lcnMoKTsKK2ludCBic2NfdGltZXJfY2hlY2sodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS90bHYuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvdGx2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzczM2RiYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvdGx2LmgKQEAgLTAsMCArMSwyNDQgQEAKKyNpZm5kZWYgX1RMVl9ICisjZGVmaW5lIF9UTFZfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisKKy8qIFRlcm1pbm9sb2d5IC8gd29yZGluZworCQl0YWcJbGVuZ3RoCQl2YWx1ZQkoaW4gYml0cykKKworCSAgICBWCS0JLQkJOAorCSAgIExWCS0JOAkJTiAqIDgKKwkgIFRMVgk4CTgJCU4gKiA4CisJVEwxNlYJOAkxNgkJTiAqIDgKKwlUTFYxNgk4CTgJCU4gKiAxNgorCSBUdkxWCTgJOC8xNgkJTiAqIDgKKworKi8KKworI2RlZmluZSBMVl9HUk9TU19MRU4oeCkJCSh4KzEpCisjZGVmaW5lIFRMVl9HUk9TU19MRU4oeCkJKHgrMikKKyNkZWZpbmUgVExWMTZfR1JPU1NfTEVOKHgpCSgoMip4KSsyKQorI2RlZmluZSBUTDE2Vl9HUk9TU19MRU4oeCkJKHgrMykKKyNkZWZpbmUgTDE2VFZfR1JPU1NfTEVOKHgpCSh4KzMpCisKKyNkZWZpbmUgVFZMVl9NQVhfT05FQllURQkweDdmCisKK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgVFZMVl9HUk9TU19MRU4odWludDE2X3QgbGVuKQoreworCWlmIChsZW4gPD0gVFZMVl9NQVhfT05FQllURSkKKwkJcmV0dXJuIFRMVl9HUk9TU19MRU4obGVuKTsKKwllbHNlCisJCXJldHVybiBUTDE2Vl9HUk9TU19MRU4obGVuKTsKK30KKworLyogVExWIGdlbmVyYXRpb24gKi8KKworc3RhdGljIGlubGluZSB1aW50OF90ICpsdl9wdXQodWludDhfdCAqYnVmLCB1aW50OF90IGxlbiwKKwkJCQljb25zdCB1aW50OF90ICp2YWwpCit7CisJKmJ1ZisrID0gbGVuOworCW1lbWNweShidWYsIHZhbCwgbGVuKTsKKwlyZXR1cm4gYnVmICsgbGVuOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgKnRsdl9wdXQodWludDhfdCAqYnVmLCB1aW50OF90IHRhZywgdWludDhfdCBsZW4sCisJCQkJY29uc3QgdWludDhfdCAqdmFsKQoreworCSpidWYrKyA9IHRhZzsKKwkqYnVmKysgPSBsZW47CisJbWVtY3B5KGJ1ZiwgdmFsLCBsZW4pOworCXJldHVybiBidWYgKyBsZW47Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDhfdCAqdGx2MTZfcHV0KHVpbnQ4X3QgKmJ1ZiwgdWludDhfdCB0YWcsIHVpbnQ4X3QgbGVuLAorCQkJCWNvbnN0IHVpbnQxNl90ICp2YWwpCit7CisJKmJ1ZisrID0gdGFnOworCSpidWYrKyA9IGxlbjsKKwltZW1jcHkoYnVmLCB2YWwsIGxlbioyKTsKKwlyZXR1cm4gYnVmICsgbGVuKjI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDhfdCAqdGwxNnZfcHV0KHVpbnQ4X3QgKmJ1ZiwgdWludDhfdCB0YWcsIHVpbnQxNl90IGxlbiwKKwkJCQljb25zdCB1aW50OF90ICp2YWwpCit7CisJKmJ1ZisrID0gdGFnOworCSpidWYrKyA9IGxlbiA+PiA4OworCSpidWYrKyA9IGxlbiAmIDB4ZmY7CisJbWVtY3B5KGJ1ZiwgdmFsLCBsZW4pOworCXJldHVybiBidWYgKyBsZW4qMjsKK30KKworc3RhdGljIGlubGluZSB1aW50OF90ICp0dmx2X3B1dCh1aW50OF90ICpidWYsIHVpbnQ4X3QgdGFnLCB1aW50MTZfdCBsZW4sCisJCQkJIGNvbnN0IHVpbnQ4X3QgKnZhbCkKK3sKKwl1aW50OF90ICpyZXQ7CisKKwlpZiAobGVuIDw9IFRWTFZfTUFYX09ORUJZVEUpIHsKKwkJcmV0ID0gdGx2X3B1dChidWYsIHRhZywgbGVuLCB2YWwpOworCQlidWZbMV0gfD0gMHg4MDsKKwl9IGVsc2UKKwkJcmV0ID0gdGwxNnZfcHV0KGJ1ZiwgdGFnLCBsZW4sIHZhbCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgKm1zZ2JfdGx2MTZfcHV0KHN0cnVjdCBtc2diICptc2csIHVpbnQ4X3QgdGFnLCB1aW50OF90IGxlbiwgY29uc3QgdWludDE2X3QgKnZhbCkKK3sKKwl1aW50OF90ICpidWYgPSBtc2diX3B1dChtc2csIFRMVjE2X0dST1NTX0xFTihsZW4pKTsKKwlyZXR1cm4gdGx2MTZfcHV0KGJ1ZiwgdGFnLCBsZW4sIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDhfdCAqbXNnYl90bDE2dl9wdXQoc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCB0YWcsIHVpbnQxNl90IGxlbiwKKwkJCQkJY29uc3QgdWludDhfdCAqdmFsKQoreworCXVpbnQ4X3QgKmJ1ZiA9IG1zZ2JfcHV0KG1zZywgVEwxNlZfR1JPU1NfTEVOKGxlbikpOworCXJldHVybiB0bDE2dl9wdXQoYnVmLCB0YWcsIGxlbiwgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB1aW50OF90ICptc2diX3R2bHZfcHV0KHN0cnVjdCBtc2diICptc2csIHVpbnQ4X3QgdGFnLCB1aW50MTZfdCBsZW4sCisJCQkJICAgICAgY29uc3QgdWludDhfdCAqdmFsKQoreworCXVpbnQ4X3QgKmJ1ZiA9IG1zZ2JfcHV0KG1zZywgVFZMVl9HUk9TU19MRU4obGVuKSk7CisJcmV0dXJuIHR2bHZfcHV0KGJ1ZiwgdGFnLCBsZW4sIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDhfdCAqbXNnYl9sMTZ0dl9wdXQoc3RydWN0IG1zZ2IgKm1zZywgdWludDE2X3QgbGVuLCB1aW50OF90IHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnZhbCkKK3sKKwl1aW50OF90ICpidWYgPSBtc2diX3B1dChtc2csIEwxNlRWX0dST1NTX0xFTihsZW4pKTsKKworCSpidWYrKyA9IGxlbiA+PiA4OworCSpidWYrKyA9IGxlbiAmIDB4ZmY7CisJKmJ1ZisrID0gdGFnOworCW1lbWNweShidWYsIHZhbCwgbGVuKTsKKwlyZXR1cm4gYnVmICsgbGVuOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgKnZfcHV0KHVpbnQ4X3QgKmJ1ZiwgdWludDhfdCB2YWwpCit7CisJKmJ1ZisrID0gdmFsOworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDhfdCAqdHZfcHV0KHVpbnQ4X3QgKmJ1ZiwgdWludDhfdCB0YWcsIAorCQkJCXVpbnQ4X3QgdmFsKQoreworCSpidWYrKyA9IHRhZzsKKwkqYnVmKysgPSB2YWw7CisJcmV0dXJuIGJ1ZjsKK30KKworLyogJ3ZhbCcgaXMgc3RpbGwgaW4gaG9zdCBieXRlIG9yZGVyISAqLworc3RhdGljIGlubGluZSB1aW50OF90ICp0djE2X3B1dCh1aW50OF90ICpidWYsIHVpbnQ4X3QgdGFnLCAKKwkJCQkgdWludDE2X3QgdmFsKQoreworCSpidWYrKyA9IHRhZzsKKwkqYnVmKysgPSB2YWwgPj4gODsKKwkqYnVmKysgPSB2YWwgJiAweGZmOworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDhfdCAqbXNnYl9sdl9wdXQoc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCBsZW4sIGNvbnN0IHVpbnQ4X3QgKnZhbCkKK3sKKwl1aW50OF90ICpidWYgPSBtc2diX3B1dChtc2csIExWX0dST1NTX0xFTihsZW4pKTsKKwlyZXR1cm4gbHZfcHV0KGJ1ZiwgbGVuLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgKm1zZ2JfdGx2X3B1dChzdHJ1Y3QgbXNnYiAqbXNnLCB1aW50OF90IHRhZywgdWludDhfdCBsZW4sIGNvbnN0IHVpbnQ4X3QgKnZhbCkKK3sKKwl1aW50OF90ICpidWYgPSBtc2diX3B1dChtc2csIFRMVl9HUk9TU19MRU4obGVuKSk7CisJcmV0dXJuIHRsdl9wdXQoYnVmLCB0YWcsIGxlbiwgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB1aW50OF90ICptc2diX3R2X3B1dChzdHJ1Y3QgbXNnYiAqbXNnLCB1aW50OF90IHRhZywgdWludDhfdCB2YWwpCit7CisJdWludDhfdCAqYnVmID0gbXNnYl9wdXQobXNnLCAyKTsKKwlyZXR1cm4gdHZfcHV0KGJ1ZiwgdGFnLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgKm1zZ2Jfdl9wdXQoc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCB2YWwpCit7CisJdWludDhfdCAqYnVmID0gbXNnYl9wdXQobXNnLCAxKTsKKwlyZXR1cm4gdl9wdXQoYnVmLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgKm1zZ2JfdHYxNl9wdXQoc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCB0YWcsIHVpbnQxNl90IHZhbCkKK3sKKwl1aW50OF90ICpidWYgPSBtc2diX3B1dChtc2csIDMpOworCXJldHVybiB0djE2X3B1dChidWYsIHRhZywgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB1aW50OF90ICptc2diX3Rsdl9wdXNoKHN0cnVjdCBtc2diICptc2csIHVpbnQ4X3QgdGFnLCB1aW50OF90IGxlbiwgY29uc3QgdWludDhfdCAqdmFsKQoreworCXVpbnQ4X3QgKmJ1ZiA9IG1zZ2JfcHVzaChtc2csIFRMVl9HUk9TU19MRU4obGVuKSk7CisJcmV0dXJuIHRsdl9wdXQoYnVmLCB0YWcsIGxlbiwgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB1aW50OF90ICptc2diX3R2X3B1c2goc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCB0YWcsIHVpbnQ4X3QgdmFsKQoreworCXVpbnQ4X3QgKmJ1ZiA9IG1zZ2JfcHVzaChtc2csIDIpOworCXJldHVybiB0dl9wdXQoYnVmLCB0YWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDhfdCAqbXNnYl90djE2X3B1c2goc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCB0YWcsIHVpbnQxNl90IHZhbCkKK3sKKwl1aW50OF90ICpidWYgPSBtc2diX3B1c2gobXNnLCAzKTsKKwlyZXR1cm4gdHYxNl9wdXQoYnVmLCB0YWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDhfdCAqbXNnYl90dmx2X3B1c2goc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCB0YWcsIHVpbnQxNl90IGxlbiwKKwkJCQkgICAgICBjb25zdCB1aW50OF90ICp2YWwpCit7CisJdWludDhfdCAqYnVmID0gbXNnYl9wdXNoKG1zZywgVFZMVl9HUk9TU19MRU4obGVuKSk7CisJcmV0dXJuIHR2bHZfcHV0KGJ1ZiwgdGFnLCBsZW4sIHZhbCk7Cit9CisKKy8qIFRMViBwYXJzaW5nICovCisKK3N0cnVjdCB0bHZfcF9lbnRyeSB7CisJdWludDE2X3QgbGVuOworCWNvbnN0IHVpbnQ4X3QgKnZhbDsKK307CisKK2VudW0gdGx2X3R5cGUgeworCVRMVl9UWVBFX05PTkUsCisJVExWX1RZUEVfRklYRUQsCisJVExWX1RZUEVfVCwKKwlUTFZfVFlQRV9UViwKKwlUTFZfVFlQRV9UTFYsCisJVExWX1RZUEVfVEwxNlYsCisJVExWX1RZUEVfVHZMViwKK307CisKK3N0cnVjdCB0bHZfZGVmIHsKKwllbnVtIHRsdl90eXBlIHR5cGU7CisJdWludDhfdCBmaXhlZF9sZW47Cit9OworCitzdHJ1Y3QgdGx2X2RlZmluaXRpb24geworCXN0cnVjdCB0bHZfZGVmIGRlZlsweGZmXTsKK307CisKK3N0cnVjdCB0bHZfcGFyc2VkIHsKKwlzdHJ1Y3QgdGx2X3BfZW50cnkgbHZbMHhmZl07Cit9OworCitleHRlcm4gc3RydWN0IHRsdl9kZWZpbml0aW9uIHR2bHZfYXR0X2RlZjsKKworaW50IHRsdl9wYXJzZV9vbmUodWludDhfdCAqb190YWcsIHVpbnQxNl90ICpvX2xlbiwgY29uc3QgdWludDhfdCAqKm9fdmFsLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uICpkZWYsCisgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfbGVuKTsKK2ludCB0bHZfcGFyc2Uoc3RydWN0IHRsdl9wYXJzZWQgKmRlYywgY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uICpkZWYsCisJICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX2xlbiwgdWludDhfdCBsdl90YWcsIHVpbnQ4X3QgbHZfdGFnMik7CisvKiB0YWtlIGEgbWFzdGVyIChzcmMpIHRsdmRldiBhbmQgZmlsbCB1cCBhbGwgZW1wdHkgc2xvdHMgaW4gJ2RzdCcgKi8KK3ZvaWQgdGx2X2RlZl9wYXRjaChzdHJ1Y3QgdGx2X2RlZmluaXRpb24gKmRzdCwgY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uICpzcmMpOworCisjZGVmaW5lIFRMVlBfUFJFU0VOVCh4LCB5KQkoKHgpLT5sdlt5XS52YWwpCisjZGVmaW5lIFRMVlBfTEVOKHgsIHkpCQkoeCktPmx2W3ldLmxlbgorI2RlZmluZSBUTFZQX1ZBTCh4LCB5KQkJKHgpLT5sdlt5XS52YWwKKworI2VuZGlmIC8qIF9UTFZfSCAqLwpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS91dGlscy5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYzZmMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3V0aWxzLmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBPU01PQ09SRV9VVElMX0gKKyNkZWZpbmUgT1NNT0NPUkVfVVRJTF9ICisKKyNkZWZpbmUgQVJSQVlfU0laRSh4KSAoc2l6ZW9mKHgpIC8gc2l6ZW9mKCh4KVswXSkpCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworc3RydWN0IHZhbHVlX3N0cmluZyB7CisJdW5zaWduZWQgaW50IHZhbHVlOworCWNvbnN0IGNoYXIgKnN0cjsKK307CisKK2NvbnN0IGNoYXIgKmdldF92YWx1ZV9zdHJpbmcoY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyAqdnMsIHVpbnQzMl90IHZhbCk7CitpbnQgZ2V0X3N0cmluZ192YWx1ZShjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nICp2cywgY29uc3QgY2hhciAqc3RyKTsKKworY2hhciBiY2QyY2hhcih1aW50OF90IGJjZCk7CisvKiBvbmx5IHdvcmtzIGZvciBudW1iZXJzIGluIGFzY2NpICovCit1aW50OF90IGNoYXIyYmNkKGNoYXIgYyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS93cml0ZV9xdWV1ZS5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS93cml0ZV9xdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMjQ0YzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3dyaXRlX3F1ZXVlLmgKQEAgLTAsMCArMSw0NiBAQAorLyogR2VuZXJpYyB3cml0ZSBxdWV1ZSBpbXBsZW1lbnRhdGlvbiAqLworLyoKKyAqIChDKSAyMDEwIGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisgKiAoQykgMjAxMCBieSBPbi1XYXZlcworICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworI2lmbmRlZiB3cml0ZV9xdWV1ZV9oCisjZGVmaW5lIHdyaXRlX3F1ZXVlX2gKKworI2luY2x1ZGUgInNlbGVjdC5oIgorI2luY2x1ZGUgIm1zZ2IuaCIKKworc3RydWN0IHdyaXRlX3F1ZXVlIHsKKwlzdHJ1Y3QgYnNjX2ZkIGJmZDsKKwl1bnNpZ25lZCBpbnQgbWF4X2xlbmd0aDsKKwl1bnNpZ25lZCBpbnQgY3VycmVudF9sZW5ndGg7CisKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBtc2dfcXVldWU7CisKKwlpbnQgKCpyZWFkX2NiKShzdHJ1Y3QgYnNjX2ZkICpmZCk7CisJaW50ICgqd3JpdGVfY2IpKHN0cnVjdCBic2NfZmQgKmZkLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKKwlpbnQgKCpleGNlcHRfY2IpKHN0cnVjdCBic2NfZmQgKmZkKTsKK307CisKK3ZvaWQgd3JpdGVfcXVldWVfaW5pdChzdHJ1Y3Qgd3JpdGVfcXVldWUgKnF1ZXVlLCBpbnQgbWF4X2xlbmd0aCk7Cit2b2lkIHdyaXRlX3F1ZXVlX2NsZWFyKHN0cnVjdCB3cml0ZV9xdWV1ZSAqcXVldWUpOworaW50IHdyaXRlX3F1ZXVlX2VucXVldWUoc3RydWN0IHdyaXRlX3F1ZXVlICpxdWV1ZSwgc3RydWN0IG1zZ2IgKmRhdGEpOworaW50IHdyaXRlX3F1ZXVlX2JmZF9jYihzdHJ1Y3QgYnNjX2ZkICpmZCwgdW5zaWduZWQgaW50IHdoYXQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlLnBjLmluIGIvbGlib3Ntb2NvcmUvbGlib3Ntb2NvcmUucGMuaW4Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYm9zbW9jb3JlLnBjLmluCnJlbmFtZSB0byBsaWJvc21vY29yZS9saWJvc21vY29yZS5wYy5pbgpkaWZmIC0tZ2l0IGEvbGlib3Ntb3Z0eS5wYy5pbiBiL2xpYm9zbW9jb3JlL2xpYm9zbW92dHkucGMuaW4Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYm9zbW92dHkucGMuaW4KcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2xpYm9zbW92dHkucGMuaW4KZGlmZiAtLWdpdCBhL200L0RVTU1ZIGIvbGlib3Ntb2NvcmUvbTQvRFVNTVkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG00L0RVTU1ZCnJlbmFtZSB0byBsaWJvc21vY29yZS9tNC9EVU1NWQpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvc3JjL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvc3JjL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhN2Q4N2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9zcmMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxOSBAQAorU1VCRElSUz12dHkKKworIyBUaGlzIGlzIF9OT1RfIHRoZSBsaWJyYXJ5IHJlbGVhc2UgdmVyc2lvbiwgaXQncyBhbiBBUEkgdmVyc2lvbi4KKyMgUGxlYXNlIHJlYWQgQ2hhcHRlciA2ICJMaWJyYXJ5IGludGVyZmFjZSB2ZXJzaW9ucyIgb2YgdGhlIGxpYnRvb2wgZG9jdW1lbnRhdGlvbiBiZWZvcmUgbWFraW5nIGFueSBtb2RpZmljYXRpb24KK0xJQlZFUlNJT049MDowOjAKKworSU5DTFVERVMgPSAkKGFsbF9pbmNsdWRlcykgLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUKK0FNX0NGTEFHUyA9IC1mUElDIC1XYWxsCisKK2xpYl9MVExJQlJBUklFUyA9IGxpYm9zbW9jb3JlLmxhCisKK2xpYm9zbW9jb3JlX2xhX1NPVVJDRVMgPSB0aW1lci5jIHNlbGVjdC5jIHNpZ25hbC5jIG1zZ2IuYyByeGxldl9zdGF0LmMgXAorCQkJIHRsdl9wYXJzZXIuYyBiaXR2ZWMuYyBjb21wMTI4LmMgZ3NtX3V0aWxzLmMgc3RhdGlzdGljcy5jIFwKKwkJCSB3cml0ZV9xdWV1ZS5jIHV0aWxzLmMgcnNsLmMgZ3NtNDguYyBnc200OF9pZS5jIFwKKwkJCSBsb2dnaW5nLmMgZ3NtMDgwOC5jIHJhdGVfY3RyLmMKKworaWYgRU5BQkxFX1RBTExPQworbGlib3Ntb2NvcmVfbGFfU09VUkNFUyArPSB0YWxsb2MuYworZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL3NyYy9iaXR2ZWMuYyBiL2xpYm9zbW9jb3JlL3NyYy9iaXR2ZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGM0NjVhCi0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvc3JjL2JpdHZlYy5jCkBAIC0wLDAgKzEsMjE5IEBACisvKiBiaXQgdmVjdG9yIHV0aWxpdHkgcm91dGluZXMgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL2JpdHZlYy5oPgorCisjZGVmaW5lIEJJVE5VTV9GUk9NX0NPTVAoYnl0ZSwgYml0KQkoKGJ5dGUqOCkrYml0KQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBieXRlbnVtX2Zyb21fYml0bnVtKHVuc2lnbmVkIGludCBiaXRudW0pCit7CisJdW5zaWduZWQgaW50IGJ5dGVudW0gPSBiaXRudW0gLyA4OworCisJcmV0dXJuIGJ5dGVudW07Cit9CisKKy8qIGNvbnZlcnQgWkVSTy9PTkUvTC9IIHRvIGEgYml0bWFzayBhdCBnaXZlbiBwb3MgaW4gYSBieXRlICovCitzdGF0aWMgdWludDhfdCBiaXR2YWwybWFzayhlbnVtIGJpdF92YWx1ZSBiaXQsIHVpbnQ4X3QgYml0bnVtKQoreworCWludCBiaXR2YWw7CisKKwlzd2l0Y2ggKGJpdCkgeworCWNhc2UgWkVSTzoKKwkJYml0dmFsID0gKDAgPDwgYml0bnVtKTsKKwkJYnJlYWs7CisJY2FzZSBPTkU6CisJCWJpdHZhbCA9ICgxIDw8IGJpdG51bSk7CisJCWJyZWFrOworCWNhc2UgTDoKKwkJYml0dmFsID0gKCgweDJiIF4gKDAgPDwgYml0bnVtKSkgJiAoMSA8PCBiaXRudW0pKTsKKwkJYnJlYWs7CisJY2FzZSBIOgorCQliaXR2YWwgPSAoKDB4MmIgXiAoMSA8PCBiaXRudW0pKSAmICgxIDw8IGJpdG51bSkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIGJpdHZhbDsKK30KKworLyogY2hlY2sgaWYgdGhlIGJpdCBpcyAwIG9yIDEgZm9yIGEgZ2l2ZW4gcG9zaXRpb24gaW5zaWRlIGEgYml0dmVjICovCitlbnVtIGJpdF92YWx1ZSBiaXR2ZWNfZ2V0X2JpdF9wb3MoY29uc3Qgc3RydWN0IGJpdHZlYyAqYnYsIHVuc2lnbmVkIGludCBiaXRucikKK3sKKwl1bnNpZ25lZCBpbnQgYnl0ZW51bSA9IGJ5dGVudW1fZnJvbV9iaXRudW0oYml0bnIpOworCXVuc2lnbmVkIGludCBiaXRudW0gPSA3IC0gKGJpdG5yICUgOCk7CisJdWludDhfdCBiaXR2YWw7CisKKwlpZiAoYnl0ZW51bSA+PSBidi0+ZGF0YV9sZW4pCisJCXJldHVybiAtRUlOVkFMOworCisJYml0dmFsID0gYml0dmFsMm1hc2soT05FLCBiaXRudW0pOworCisJaWYgKGJ2LT5kYXRhW2J5dGVudW1dICYgYml0dmFsKQorCQlyZXR1cm4gT05FOworCisJcmV0dXJuIFpFUk87Cit9CisKKy8qIGNoZWNrIGlmIHRoZSBiaXQgaXMgTCBvciBIIGZvciBhIGdpdmVuIHBvc2l0aW9uIGluc2lkZSBhIGJpdHZlYyAqLworZW51bSBiaXRfdmFsdWUgYml0dmVjX2dldF9iaXRfcG9zX2hpZ2goY29uc3Qgc3RydWN0IGJpdHZlYyAqYnYsCisJCQkJCXVuc2lnbmVkIGludCBiaXRucikKK3sKKwl1bnNpZ25lZCBpbnQgYnl0ZW51bSA9IGJ5dGVudW1fZnJvbV9iaXRudW0oYml0bnIpOworCXVuc2lnbmVkIGludCBiaXRudW0gPSA3IC0gKGJpdG5yICUgOCk7CisJdWludDhfdCBiaXR2YWw7CisKKwlpZiAoYnl0ZW51bSA+PSBidi0+ZGF0YV9sZW4pCisJCXJldHVybiAtRUlOVkFMOworCisJYml0dmFsID0gYml0dmFsMm1hc2soSCwgYml0bnVtKTsKKworCWlmIChidi0+ZGF0YVtieXRlbnVtXSAmIGJpdHZhbCkKKwkJcmV0dXJuIEg7CisKKwlyZXR1cm4gTDsKK30KKworLyogZ2V0IHRoZSBOdGggc2V0IGJpdCBpbnNpZGUgdGhlIGJpdCB2ZWN0b3IgKi8KK3Vuc2lnbmVkIGludCBiaXR2ZWNfZ2V0X250aF9zZXRfYml0KGNvbnN0IHN0cnVjdCBiaXR2ZWMgKmJ2LCB1bnNpZ25lZCBpbnQgbikKK3sKKwl1bnNpZ25lZCBpbnQgaSwgayA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnYtPmRhdGFfbGVuKjg7IGkrKykgeworCQlpZiAoYml0dmVjX2dldF9iaXRfcG9zKGJ2LCBpKSA9PSBPTkUpIHsKKwkJCWsrKzsKKwkJCWlmIChrID09IG4pCisJCQkJcmV0dXJuIGk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogc2V0IHRoZSBiaXQgYXQgYSBnaXZlbiBwb3NpdGlvbiBpbnNpZGUgYSBiaXR2ZWMgKi8KK2ludCBiaXR2ZWNfc2V0X2JpdF9wb3Moc3RydWN0IGJpdHZlYyAqYnYsIHVuc2lnbmVkIGludCBiaXRuciwKKwkJCWVudW0gYml0X3ZhbHVlIGJpdCkKK3sKKwl1bnNpZ25lZCBpbnQgYnl0ZW51bSA9IGJ5dGVudW1fZnJvbV9iaXRudW0oYml0bnIpOworCXVuc2lnbmVkIGludCBiaXRudW0gPSA3IC0gKGJpdG5yICUgOCk7CisJdWludDhfdCBiaXR2YWw7CisKKwlpZiAoYnl0ZW51bSA+PSBidi0+ZGF0YV9sZW4pCisJCXJldHVybiAtRUlOVkFMOworCisJLyogZmlyc3QgY2xlYXIgdGhlIGJpdCAqLworCWJpdHZhbCA9IGJpdHZhbDJtYXNrKE9ORSwgYml0bnVtKTsKKwlidi0+ZGF0YVtieXRlbnVtXSAmPSB+Yml0dmFsOworCisJLyogdGhlbiBzZXQgaXQgdG8gZGVzaXJlZCB2YWx1ZSAqLworCWJpdHZhbCA9IGJpdHZhbDJtYXNrKGJpdCwgYml0bnVtKTsKKwlidi0+ZGF0YVtieXRlbnVtXSB8PSBiaXR2YWw7CisKKwlyZXR1cm4gMDsKK30KKworLyogc2V0IHRoZSBuZXh0IGJpdCBpbnNpZGUgYSBiaXR2ZWMgKi8KK2ludCBiaXR2ZWNfc2V0X2JpdChzdHJ1Y3QgYml0dmVjICpidiwgZW51bSBiaXRfdmFsdWUgYml0KQoreworCWludCByYzsKKworCXJjID0gYml0dmVjX3NldF9iaXRfcG9zKGJ2LCBidi0+Y3VyX2JpdCwgYml0KTsKKwlpZiAoIXJjKQorCQlidi0+Y3VyX2JpdCsrOworCisJcmV0dXJuIHJjOworfQorCisvKiBnZXQgdGhlIG5leHQgYml0IChsb3cvaGlnaCkgaW5zaWRlIGEgYml0dmVjICovCitpbnQgYml0dmVjX2dldF9iaXRfaGlnaChzdHJ1Y3QgYml0dmVjICpidikKK3sKKwlpbnQgcmM7CisKKwlyYyA9IGJpdHZlY19nZXRfYml0X3Bvc19oaWdoKGJ2LCBidi0+Y3VyX2JpdCk7CisJaWYgKHJjID49IDApCisJCWJ2LT5jdXJfYml0Kys7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIHNldCBtdWx0aXBsZSBiaXRzIChiYXNlZCBvbiBhcnJheSBvZiBiaXR2YWxzKSBhdCBjdXJyZW50IHBvcyAqLworaW50IGJpdHZlY19zZXRfYml0cyhzdHJ1Y3QgYml0dmVjICpidiwgZW51bSBiaXRfdmFsdWUgKmJpdHMsIGludCBjb3VudCkKK3sKKwlpbnQgaSwgcmM7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlyYyA9IGJpdHZlY19zZXRfYml0KGJ2LCBiaXRzW2ldKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCisvKiBzZXQgbXVsdGlwbGUgYml0cyAoYmFzZWQgb24gbnVtZXJpYyB2YWx1ZSkgYXQgY3VycmVudCBwb3MgKi8KK2ludCBiaXR2ZWNfc2V0X3VpbnQoc3RydWN0IGJpdHZlYyAqYnYsIHVuc2lnbmVkIGludCB1aSwgaW50IG51bV9iaXRzKQoreworCWludCBpLCByYzsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fYml0czsgaSsrKSB7CisJCWludCBiaXQgPSAwOworCQlpZiAodWkgJiAoMSA8PCAobnVtX2JpdHMgLSBpIC0gMSkpKQorCQkJYml0ID0gMTsKKwkJcmMgPSBiaXR2ZWNfc2V0X2JpdChidiwgYml0KTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCisvKiBnZXQgbXVsdGlwbGUgYml0cyAoYmFzZWQgb24gbnVtZXJpYyB2YWx1ZSkgZnJvbSBjdXJyZW50IHBvcyAqLworaW50IGJpdHZlY19nZXRfdWludChzdHJ1Y3QgYml0dmVjICpidiwgaW50IG51bV9iaXRzKQoreworCWludCBpOworCXVuc2lnbmVkIGludCB1aSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2JpdHM7IGkrKykgeworCQlpbnQgYml0ID0gYml0dmVjX2dldF9iaXRfcG9zKGJ2LCBidi0+Y3VyX2JpdCk7CisJCWlmIChiaXQgPCAwKQorCQkJcmV0dXJuIGJpdDsKKwkJaWYgKGJpdCkKKwkJCXVpIHw9ICgxIDw8IChudW1fYml0cyAtIGkgLSAxKSk7CisJCWJ2LT5jdXJfYml0Kys7CisJfQorCisJcmV0dXJuIHVpOworfQorCisvKiBwYWQgYWxsIHJlbWFpbmluZyBiaXRzIHVwIHRvIG51bV9iaXRzICovCitpbnQgYml0dmVjX3NwYXJlX3BhZGRpbmcoc3RydWN0IGJpdHZlYyAqYnYsIHVuc2lnbmVkIGludCB1cF90b19iaXQpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSBidi0+Y3VyX2JpdDsgaSA8PSB1cF90b19iaXQ7IGkrKykKKwkJYml0dmVjX3NldF9iaXQoYnYsIEwpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9zcmMvY29tcDEyOC5jIGIvbGlib3Ntb2NvcmUvc3JjL2NvbXAxMjguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDU2ODBjCi0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvc3JjL2NvbXAxMjguYwpAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIENPTVAxMjggaW1wbGVtZW50YXRpb24KKyAqCisgKgorICogVGhpcyBjb2RlIGlzIGluc3BpcmVkIGJ5IG9yaWdpbmFsIGNvZGUgZnJvbSA6CisgKiAgTWFyYyBCcmljZW5vIDxtYXJjQHNjYXJkLm9yZz4sIElhbiBHb2xkYmVyZyA8aWFuZ0Bjcy5iZXJrZWxleS5lZHU+LAorICogIGFuZCBEYXZpZCBXYWduZXIgPGRhd0Bjcy5iZXJrZWxleS5lZHU+CisgKgorICogQnV0IGl0IGhhcyBiZWVuIGZ1bGx5IHJld3JpdHRlbiBmcm9tIHZhcmlvdXMgUERGcyBmb3VuZCBvbmxpbmUgZGVzY3JpYmluZworICogdGhlIGFsZ29yaXRobSBiZWNhdXNlIHRoZSBsaWNlbmNlIG9mIHRoZSBjb2RlIHJlZmVyZW5jZWQgYWJvdmUgd2FzIHVuY2xlYXIuCisgKiBBIGNvbW1lbnQgc25pcHBldCBmcm9tIHRoZSBvcmlnaW5hbCBjb2RlIGlzIGluY2x1ZGVkIGJlbG93LCBpdCBkZXNjcmliZXMKKyAqIHdoZXJlIHRoZSBkb2MgY2FtZSBmcm9tIGFuZCBob3cgdGhlIGFsZ29yaXRobSB3YXMgcmV2ZXJzZSBlbmdpbmVlcmVkLgorICoKKyAqCisgKiAoQykgMjAwOSBieSBTeWx2YWluIE11bmF1dCA8dG50QDI0NnROdC5jb20+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKy8qCisgKiAtLS0gU05JUCAtLS0KKyAqCisgKiBUaGlzIGNvZGUgZGVyaXZlZCBmcm9tIGEgbGVha2VkIGRvY3VtZW50IGZyb20gdGhlIEdTTSBzdGFuZGFyZHMuCisgKiBTb21lIG1pc3NpbmcgcGllY2VzIHdlcmUgZmlsbGVkIGluIGJ5IHJldmVyc2UtZW5naW5lZXJpbmcgYSB3b3JraW5nIFNJTS4KKyAqIFdlIGhhdmUgdmVyaWZpZWQgdGhhdCB0aGlzIGlzIHRoZSBjb3JyZWN0IENPTVAxMjggYWxnb3JpdGhtLgorICoKKyAqIFRoZSBmaXJzdCBwYWdlIG9mIHRoZSBkb2N1bWVudCBpZGVudGlmaWVzIGl0IGFzCisgKiAJX1RlY2huaWNhbCBJbmZvcm1hdGlvbjogR1NNIFN5c3RlbSBTZWN1cml0eSBTdHVkeV8uCisgKiAJMTAtMTYxNy0wMSwgMTB0aCBKdW5lIDE5ODguCisgKiBUaGUgYm90dG9tIG9mIHRoZSB0aXRsZSBwYWdlIGlzIG1hcmtlZAorICogCVJhY2FsIFJlc2VhcmNoIEx0ZC4KKyAqIAlXb3J0b24gRHJpdmUsIFdvcnRvbiBHcmFuZ2UgSW5kdXN0cmlhbCBFc3RhdGUsCisgKiAJUmVhZGluZywgQmVya3MuIFJHMiAwU0IsIEVuZ2xhbmQuCisgKiAJVGVsZXBob25lOiBSZWFkaW5nICgwNzM0KSA4Njg2MDEgICBUZWxleDogODQ3MTUyCisgKiBUaGUgcmVsZXZhbnQgYml0cyBhcmUgaW4gUGFydCBJLCBTZWN0aW9uIDIwIChwYWdlcyA2Ni0tNjcpLiAgRW5qb3khCisgKgorICogTm90ZTogVGhlcmUgYXJlIHRocmVlIHR5cG9zIGluIHRoZSBzcGVjIChkaXNjb3ZlcmVkIGJ5CisgKiByZXZlcnNlLWVuZ2luZWVyaW5nKS4KKyAqIEZpcnN0LCAieiA9ICgyICogeFtuXSArIHhbbl0pIG1vZCAyXig5LWopIiBzaG91bGQgY2xlYXJseSByZWFkCisgKiAieiA9ICgyICogeFttXSArIHhbbl0pIG1vZCAyXig5LWopIi4KKyAqIFNlY29uZCwgdGhlICJrIiBsb29wIGluIHRoZSAiRm9ybSBiaXRzIGZyb20gYnl0ZXMiIHNlY3Rpb24gaXMgc2V2ZXJlbHkKKyAqIGJvdGNoZWQ6IHRoZSBrIGluZGV4IHNob3VsZCBydW4gb25seSBmcm9tIDAgdG8gMywgYW5kIGNsZWFybHkgdGhlIHJhbmdlCisgKiBvbiAidGhlICg4LWspdGggYml0IG9mIGJ5dGUgaiIgaXMgYWxzbyBvZmYgKHNob3VsZCBiZSAwLi43LCBub3QgMS4uOCwKKyAqIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgc3Vic2VxdWVudCBzZWN0aW9uKS4KKyAqIFRoaXJkLCBTUkVTIGlzIHRha2VuIGZyb20gdGhlIGZpcnN0IDggbmliYmxlcyBvZiB4W10sIG5vdCB0aGUgbGFzdCA4IGFzCisgKiBjbGFpbWVkIGluIHRoZSBkb2N1bWVudC4gIChBbmQgdGhlIGRvY3VtZW50IGRvZXNuJ3Qgc3BlY2lmeSBob3cgS2MgaXMKKyAqIGRlcml2ZWQsIGJ1dCB0aGF0IHdhcyBhbHNvIGVhc2lseSBkaXNjb3ZlcmVkIHdpdGggcmV2ZXJzZSBlbmdpbmVlcmluZy4pCisgKiBBbGwgb2YgdGhlc2UgdHlwb3MgaGF2ZSBiZWVuIGNvcnJlY3RlZCBpbiB0aGUgZm9sbG93aW5nIGNvZGUuCisgKgorICogLS0tIC9TTklQIC0tLQorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyogVGhlIGNvbXByZXNzaW9uIHRhYmxlcyAoanVzdCBjb3BpZWQgLi4uKSAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdGFibGVfMFs1MTJdID0geworIDEwMiwgMTc3LCAxODYsIDE2MiwgICAyLCAxNTYsIDExMiwgIDc1LCAgNTUsICAyNSwgICA4LCAgMTIsIDI1MSwgMTkzLCAyNDYsIDE4OCwKKyAxMDksIDIxMywgMTUxLCAgNTMsICA0MiwgIDc5LCAxOTEsIDExNSwgMjMzLCAyNDIsIDE2NCwgMjIzLCAyMDksIDE0OCwgMTA4LCAxNjEsCisgMjUyLCAgMzcsIDI0NCwgIDQ3LCAgNjQsIDIxMSwgICA2LCAyMzcsIDE4NSwgMTYwLCAxMzksIDExMywgIDc2LCAxMzgsICA1OSwgIDcwLAorICA2NywgIDI2LCAgMTMsIDE1NywgIDYzLCAxNzksIDIyMSwgIDMwLCAyMTQsICAzNiwgMTY2LCAgNjksIDE1MiwgMTI0LCAyMDcsIDExNiwKKyAyNDcsIDE5NCwgIDQxLCAgODQsICA3MSwgICAxLCAgNDksICAxNCwgIDk1LCAgMzUsIDE2OSwgIDIxLCAgOTYsICA3OCwgMjE1LCAyMjUsCisgMTgyLCAyNDMsICAyOCwgIDkyLCAyMDEsIDExOCwgICA0LCAgNzQsIDI0OCwgMTI4LCAgMTcsICAxMSwgMTQ2LCAxMzIsIDI0NSwgIDQ4LAorIDE0OSwgIDkwLCAxMjAsICAzOSwgIDg3LCAyMzAsIDEwNiwgMjMyLCAxNzUsICAxOSwgMTI2LCAxOTAsIDIwMiwgMTQxLCAxMzcsIDE3NiwKKyAyNTAsICAyNywgMTAxLCAgNDAsIDIxOSwgMjI3LCAgNTgsICAyMCwgIDUxLCAxNzgsICA5OCwgMjE2LCAxNDAsICAyMiwgIDMyLCAxMjEsCisgIDYxLCAxMDMsIDIwMywgIDcyLCAgMjksIDExMCwgIDg1LCAyMTIsIDE4MCwgMjA0LCAxNTAsIDE4MywgIDE1LCAgNjYsIDE3MiwgMTk2LAorICA1NiwgMTk3LCAxNTgsICAgMCwgMTAwLCAgNDUsIDE1MywgICA3LCAxNDQsIDIyMiwgMTYzLCAxNjcsICA2MCwgMTM1LCAyMTAsIDIzMSwKKyAxNzQsIDE2NSwgIDM4LCAyNDksIDIyNCwgIDM0LCAyMjAsIDIyOSwgMjE3LCAyMDgsIDI0MSwgIDY4LCAyMDYsIDE4OSwgMTI1LCAyNTUsCisgMjM5LCAgNTQsIDE2OCwgIDg5LCAxMjMsIDEyMiwgIDczLCAxNDUsIDExNywgMjM0LCAxNDMsICA5OSwgMTI5LCAyMDAsIDE5MiwgIDgyLAorIDEwNCwgMTcwLCAxMzYsIDIzNSwgIDkzLCAgODEsIDIwNSwgMTczLCAyMzYsICA5NCwgMTA1LCAgNTIsICA0NiwgMjI4LCAxOTgsICAgNSwKKyAgNTcsIDI1NCwgIDk3LCAxNTUsIDE0MiwgMTMzLCAxOTksIDE3MSwgMTg3LCAgNTAsICA2NSwgMTgxLCAxMjcsIDEwNywgMTQ3LCAyMjYsCisgMTg0LCAyMTgsIDEzMSwgIDMzLCAgNzcsICA4NiwgIDMxLCAgNDQsICA4OCwgIDYyLCAyMzgsICAxOCwgIDI0LCAgNDMsIDE1NCwgIDIzLAorICA4MCwgMTU5LCAxMzQsIDExMSwgICA5LCAxMTQsICAgMywgIDkxLCAgMTYsIDEzMCwgIDgzLCAgMTAsIDE5NSwgMjQwLCAyNTMsIDExOSwKKyAxNzcsIDEwMiwgMTYyLCAxODYsIDE1NiwgICAyLCAgNzUsIDExMiwgIDI1LCAgNTUsICAxMiwgICA4LCAxOTMsIDI1MSwgMTg4LCAyNDYsCisgMjEzLCAxMDksICA1MywgMTUxLCAgNzksICA0MiwgMTE1LCAxOTEsIDI0MiwgMjMzLCAyMjMsIDE2NCwgMTQ4LCAyMDksIDE2MSwgMTA4LAorICAzNywgMjUyLCAgNDcsIDI0NCwgMjExLCAgNjQsIDIzNywgICA2LCAxNjAsIDE4NSwgMTEzLCAxMzksIDEzOCwgIDc2LCAgNzAsICA1OSwKKyAgMjYsICA2NywgMTU3LCAgMTMsIDE3OSwgIDYzLCAgMzAsIDIyMSwgIDM2LCAyMTQsICA2OSwgMTY2LCAxMjQsIDE1MiwgMTE2LCAyMDcsCisgMTk0LCAyNDcsICA4NCwgIDQxLCAgIDEsICA3MSwgIDE0LCAgNDksICAzNSwgIDk1LCAgMjEsIDE2OSwgIDc4LCAgOTYsIDIyNSwgMjE1LAorIDI0MywgMTgyLCAgOTIsICAyOCwgMTE4LCAyMDEsICA3NCwgICA0LCAxMjgsIDI0OCwgIDExLCAgMTcsIDEzMiwgMTQ2LCAgNDgsIDI0NSwKKyAgOTAsIDE0OSwgIDM5LCAxMjAsIDIzMCwgIDg3LCAyMzIsIDEwNiwgIDE5LCAxNzUsIDE5MCwgMTI2LCAxNDEsIDIwMiwgMTc2LCAxMzcsCisgIDI3LCAyNTAsICA0MCwgMTAxLCAyMjcsIDIxOSwgIDIwLCAgNTgsIDE3OCwgIDUxLCAyMTYsICA5OCwgIDIyLCAxNDAsIDEyMSwgIDMyLAorIDEwMywgIDYxLCAgNzIsIDIwMywgMTEwLCAgMjksIDIxMiwgIDg1LCAyMDQsIDE4MCwgMTgzLCAxNTAsICA2NiwgIDE1LCAxOTYsIDE3MiwKKyAxOTcsICA1NiwgICAwLCAxNTgsICA0NSwgMTAwLCAgIDcsIDE1MywgMjIyLCAxNDQsIDE2NywgMTYzLCAxMzUsICA2MCwgMjMxLCAyMTAsCisgMTY1LCAxNzQsIDI0OSwgIDM4LCAgMzQsIDIyNCwgMjI5LCAyMjAsIDIwOCwgMjE3LCAgNjgsIDI0MSwgMTg5LCAyMDYsIDI1NSwgMTI1LAorICA1NCwgMjM5LCAgODksIDE2OCwgMTIyLCAxMjMsIDE0NSwgIDczLCAyMzQsIDExNywgIDk5LCAxNDMsIDIwMCwgMTI5LCAgODIsIDE5MiwKKyAxNzAsIDEwNCwgMjM1LCAxMzYsICA4MSwgIDkzLCAxNzMsIDIwNSwgIDk0LCAyMzYsICA1MiwgMTA1LCAyMjgsICA0NiwgICA1LCAxOTgsCisgMjU0LCAgNTcsIDE1NSwgIDk3LCAxMzMsIDE0MiwgMTcxLCAxOTksICA1MCwgMTg3LCAxODEsICA2NSwgMTA3LCAxMjcsIDIyNiwgMTQ3LAorIDIxOCwgMTg0LCAgMzMsIDEzMSwgIDg2LCAgNzcsICA0NCwgIDMxLCAgNjIsICA4OCwgIDE4LCAyMzgsICA0MywgIDI0LCAgMjMsIDE1NCwKKyAxNTksICA4MCwgMTExLCAxMzQsIDExNCwgICA5LCAgOTEsICAgMywgMTMwLCAgMTYsICAxMCwgIDgzLCAyNDAsIDE5NSwgMTE5LCAyNTMsCit9LCB0YWJsZV8xWzI1Nl0gPSB7CisgIDE5LCAgMTEsICA4MCwgMTE0LCAgNDMsICAgMSwgIDY5LCAgOTQsICAzOSwgIDE4LCAxMjcsIDExNywgIDk3LCAgIDMsICA4NSwgIDQzLAorICAyNywgMTI0LCAgNzAsICA4MywgIDQ3LCAgNzEsICA2MywgIDEwLCAgNDcsICA4OSwgIDc5LCAgIDQsICAxNCwgIDU5LCAgMTEsICAgNSwKKyAgMzUsIDEwNywgMTAzLCAgNjgsICAyMSwgIDg2LCAgMzYsICA5MSwgIDg1LCAxMjYsICAzMiwgIDUwLCAxMDksICA5NCwgMTIwLCAgIDYsCisgIDUzLCAgNzksICAyOCwgIDQ1LCAgOTksICA5NSwgIDQxLCAgMzQsICA4OCwgIDY4LCAgOTMsICA1NSwgMTEwLCAxMjUsIDEwNSwgIDIwLAorICA5MCwgIDgwLCAgNzYsICA5NiwgIDIzLCAgNjAsICA4OSwgIDY0LCAxMjEsICA1NiwgIDE0LCAgNzQsIDEwMSwgICA4LCAgMTksICA3OCwKKyAgNzYsICA2NiwgMTA0LCAgNDYsIDExMSwgIDUwLCAgMzIsICAgMywgIDM5LCAgIDAsICA1OCwgIDI1LCAgOTIsICAyMiwgIDE4LCAgNTEsCisgIDU3LCAgNjUsIDExOSwgMTE2LCAgMjIsIDEwOSwgICA3LCAgODYsICA1OSwgIDkzLCAgNjIsIDExMCwgIDc4LCAgOTksICA3NywgIDY3LAorICAxMiwgMTEzLCAgODcsICA5OCwgMTAyLCAgIDUsICA4OCwgIDMzLCAgMzgsICA1NiwgIDIzLCAgIDgsICA3NSwgIDQ1LCAgMTMsICA3NSwKKyAgOTUsICA2MywgIDI4LCAgNDksIDEyMywgMTIwLCAgMjAsIDExMiwgIDQ0LCAgMzAsICAxNSwgIDk4LCAxMDYsICAgMiwgMTAzLCAgMjksCisgIDgyLCAxMDcsICA0MiwgMTI0LCAgMjQsICAzMCwgIDQxLCAgMTYsIDEwOCwgMTAwLCAxMTcsICA0MCwgIDczLCAgNDAsICAgNywgMTE0LAorICA4MiwgMTE1LCAgMzYsIDExMiwgIDEyLCAxMDIsIDEwMCwgIDg0LCAgOTIsICA0OCwgIDcyLCAgOTcsICAgOSwgIDU0LCAgNTUsICA3NCwKKyAxMTMsIDEyMywgIDE3LCAgMjYsICA1MywgIDU4LCAgIDQsICAgOSwgIDY5LCAxMjIsICAyMSwgMTE4LCAgNDIsICA2MCwgIDI3LCAgNzMsCisgMTE4LCAxMjUsICAzNCwgIDE1LCAgNjUsIDExNSwgIDg0LCAgNjQsICA2MiwgIDgxLCAgNzAsICAgMSwgIDI0LCAxMTEsIDEyMSwgIDgzLAorIDEwNCwgIDgxLCAgNDksIDEyNywgIDQ4LCAxMDUsICAzMSwgIDEwLCAgIDYsICA5MSwgIDg3LCAgMzcsICAxNiwgIDU0LCAxMTYsIDEyNiwKKyAgMzEsICAzOCwgIDEzLCAgIDAsICA3MiwgMTA2LCAgNzcsICA2MSwgIDI2LCAgNjcsICA0NiwgIDI5LCAgOTYsICAzNywgIDYxLCAgNTIsCisgMTAxLCAgMTcsICA0NCwgMTA4LCAgNzEsICA1MiwgIDY2LCAgNTcsICAzMywgIDUxLCAgMjUsICA5MCwgICAyLCAxMTksIDEyMiwgIDM1LAorfSwgdGFibGVfMlsxMjhdID0geworIDUyLCAgNTAsICA0NCwgICA2LCAgMjEsICA0OSwgIDQxLCAgNTksICAzOSwgIDUxLCAgMjUsICAzMiwgIDUxLCAgNDcsICA1MiwgIDQzLAorIDM3LCAgIDQsICA0MCwgIDM0LCAgNjEsICAxMiwgIDI4LCAgIDQsICA1OCwgIDIzLCAgIDgsICAxNSwgIDEyLCAgMjIsICAgOSwgIDE4LAorIDU1LCAgMTAsICAzMywgIDM1LCAgNTAsICAgMSwgIDQzLCAgIDMsICA1NywgIDEzLCAgNjIsICAxNCwgICA3LCAgNDIsICA0NCwgIDU5LAorIDYyLCAgNTcsICAyNywgICA2LCAgIDgsICAzMSwgIDI2LCAgNTQsICA0MSwgIDIyLCAgNDUsICAyMCwgIDM5LCAgIDMsICAxNiwgIDU2LAorIDQ4LCAgIDIsICAyMSwgIDI4LCAgMzYsICA0MiwgIDYwLCAgMzMsICAzNCwgIDE4LCAgIDAsICAxMSwgIDI0LCAgMTAsICAxNywgIDYxLAorIDI5LCAgMTQsICA0NSwgIDI2LCAgNTUsICA0NiwgIDExLCAgMTcsICA1NCwgIDQ2LCAgIDksICAyNCwgIDMwLCAgNjAsICAzMiwgICAwLAorIDIwLCAgMzgsICAgMiwgIDMwLCAgNTgsICAzNSwgICAxLCAgMTYsICA1NiwgIDQwLCAgMjMsICA0OCwgIDEzLCAgMTksICAxOSwgIDI3LAorIDMxLCAgNTMsICA0NywgIDM4LCAgNjMsICAxNSwgIDQ5LCAgIDUsICAzNywgIDUzLCAgMjUsICAzNiwgIDYzLCAgMjksICAgNSwgICA3LAorfSwgdGFibGVfM1s2NF0gPSB7CisgIDEsICAgNSwgIDI5LCAgIDYsICAyNSwgICAxLCAgMTgsICAyMywgIDE3LCAgMTksICAgMCwgICA5LCAgMjQsICAyNSwgICA2LCAgMzEsCisgMjgsICAyMCwgIDI0LCAgMzAsICAgNCwgIDI3LCAgIDMsICAxMywgIDE1LCAgMTYsICAxNCwgIDE4LCAgIDQsICAgMywgICA4LCAgIDksCisgMjAsICAgMCwgIDEyLCAgMjYsICAyMSwgICA4LCAgMjgsICAgMiwgIDI5LCAgIDIsICAxNSwgICA3LCAgMTEsICAyMiwgIDE0LCAgMTAsCisgMTcsICAyMSwgIDEyLCAgMzAsICAyNiwgIDI3LCAgMTYsICAzMSwgIDExLCAgIDcsICAxMywgIDIzLCAgMTAsICAgNSwgIDIyLCAgMTksCit9LCB0YWJsZV80WzMyXSA9IHsKKyAxNSwgIDEyLCAgMTAsICAgNCwgICAxLCAgMTQsICAxMSwgICA3LCAgIDUsICAgMCwgIDE0LCAgIDcsICAgMSwgICAyLCAgMTMsICAgOCwKKyAxMCwgICAzLCAgIDQsICAgOSwgICA2LCAgIDAsICAgMywgICAyLCAgIDUsICAgNiwgICA4LCAgIDksICAxMSwgIDEzLCAgMTUsICAxMiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90ICpfY29tcDEyOF90YWJsZVs1XSA9IHsgdGFibGVfMCwgdGFibGVfMSwgdGFibGVfMiwgdGFibGVfMywgdGFibGVfNCB9OworCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX2NvbXAxMjhfY29tcHJlc3Npb25fcm91bmQodWludDhfdCAqeCwgaW50IG4sIGNvbnN0IHVpbnQ4X3QgKnRibCkKK3sKKwlpbnQgaSwgaiwgbSwgYSwgYiwgeSwgejsKKwltID0gNCAtIG47CisJZm9yIChpPTA7IGk8KDE8PG4pOyBpKyspCisJCWZvciAoaj0wOyBqPCgxPDxtKTsgaisrKSB7CisJCQlhID0gaiArIGkgKiAoMjw8bSk7CisJCQliID0gYSArICgxPDxtKTsKKwkJCXkgPSAoeFthXSArICh4W2JdPDwxKSkgJiAoKDMyPDxtKS0xKTsKKwkJCXogPSAoKHhbYV08PDEpICsgeFtiXSkgJiAoKDMyPDxtKS0xKTsKKwkJCXhbYV0gPSB0YmxbeV07CisJCQl4W2JdID0gdGJsW3pdOworCQl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX2NvbXAxMjhfY29tcHJlc3Npb24odWludDhfdCAqeCkKK3sKKwlpbnQgbjsKKwlmb3IgKG49MDsgbjw1OyBuKyspCisJCV9jb21wMTI4X2NvbXByZXNzaW9uX3JvdW5kKHgsIG4sIF9jb21wMTI4X3RhYmxlW25dKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfY29tcDEyOF9iaXRzZnJvbWJ5dGVzKHVpbnQ4X3QgKngsIHVpbnQ4X3QgKmJpdHMpCit7CisJaW50IGk7CisJbWVtc2V0KGJpdHMsIDB4MDAsIDEyOCk7CisJZm9yIChpPTA7IGk8MTI4OyBpKyspCisJCWlmICh4W2k+PjJdICYgKDE8PCgzLShpJjMpKSkpCisJCQliaXRzW2ldID0gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfY29tcDEyOF9wZXJtdXRhdGlvbih1aW50OF90ICp4LCB1aW50OF90ICpiaXRzKQoreworCWludCBpOworCW1lbXNldCgmeFsxNl0sIDB4MDAsIDE2KTsKKwlmb3IgKGk9MDsgaTwxMjg7IGkrKykKKwkJeFsoaT4+MykrMTZdIHw9IGJpdHNbKGkqMTcpICYgMTI3XSA8PCAoNy0oaSY3KSk7Cit9CisKK3ZvaWQKK2NvbXAxMjgodWludDhfdCAqa2ksIHVpbnQ4X3QgKnJhbmQsIHVpbnQ4X3QgKnNyZXMsIHVpbnQ4X3QgKmtjKQoreworCWludCBpOworCXVpbnQ4X3QgeFszMl0sIGJpdHNbMTI4XTsKKworCS8qIHhbMTYtMzFdID0gUkFORCAqLworCW1lbWNweSgmeFsxNl0sIHJhbmQsIDE2KTsKKworCS8qIFJvdW5kIDEtNyAqLworCWZvciAoaT0wOyBpPDc7IGkrKykgeworCQkvKiB4WzAtMTVdID0gS2kgKi8KKwkJbWVtY3B5KHgsIGtpLCAxNik7CisKKwkJLyogQ29tcHJlc3Npb24gKi8KKwkJX2NvbXAxMjhfY29tcHJlc3Npb24oeCk7CisKKwkJLyogRm9ybUJpdEZyb21CeXRlcyAqLworCQlfY29tcDEyOF9iaXRzZnJvbWJ5dGVzKHgsIGJpdHMpOworCisJCS8qIFBlcm11dGF0aW9uICovCisJCV9jb21wMTI4X3Blcm11dGF0aW9uKHgsIGJpdHMpOworCX0KKworCS8qIFJvdW5kIDggKGZpbmFsKSAqLworCQkvKiB4WzAtMTVdID0gS2kgKi8KKwltZW1jcHkoeCwga2ksIDE2KTsKKworCQkvKiBDb21wcmVzc2lvbiAqLworCV9jb21wMTI4X2NvbXByZXNzaW9uKHgpOworCisJLyogT3V0cHV0IHN0YWdlICovCisJZm9yIChpPTA7IGk8ODsgaSs9MikKKwkJc3Jlc1tpPj4xXSA9IHhbaV08PDQgfCB4W2krMV07CisKKwlmb3IgKGk9MDsgaTwxMjsgaSs9MikKKwkJa2NbaT4+MV0gPSAoeFtpICsgMThdIDw8IDYpIHwKKwkJICAgICAgICAgICAoeFtpICsgMTldIDw8IDIpIHwKKwkJICAgICAgICAgICAoeFtpICsgMjBdID4+IDIpOworCisJa2NbNl0gPSAoeFszMF08PDYpIHwgKHhbMzFdPDwyKTsKKwlrY1s3XSA9IDA7Cit9CisKZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL3NyYy9nc20wODA4LmMgYi9saWJvc21vY29yZS9zcmMvZ3NtMDgwOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYzAzNWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9zcmMvZ3NtMDgwOC5jCkBAIC0wLDAgKzEsMzA2IEBACisvKiAoQykgMjAwOSwyMDEwIGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIChDKSAyMDA5LDIwMTAgYnkgT24tV2F2ZXMKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtMDgwOC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Byb3RvY29sL2dzbV8wOF8wOC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbTQ4Lmg+CisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2RlZmluZSBCU1NNQVBfTVNHX1NJWkUgNTEyCisjZGVmaW5lIEJTU01BUF9NU0dfSEVBRFJPT00gMTI4CisKK3N0cnVjdCBtc2diICpnc20wODA4X2NyZWF0ZV9sYXllcjMoc3RydWN0IG1zZ2IgKm1zZ19sMywgdWludDE2X3QgbmMsIHVpbnQxNl90IGNjLCBpbnQgbGFjLCBpbnQgX2NpKQoreworCXVpbnQ4X3QgKmRhdGE7CisJdWludDE2X3QgKmNpOworCXN0cnVjdCBtc2diKiBtc2c7CisJc3RydWN0IGdzbTQ4X2xvY19hcmVhX2lkICpsYWk7CisKKwltc2cgID0gbXNnYl9hbGxvY19oZWFkcm9vbShCU1NNQVBfTVNHX1NJWkUsIEJTU01BUF9NU0dfSEVBRFJPT00sCisJCQkJICAgImJzc21hcCBjbXBsIGwzIik7CisJaWYgKCFtc2cpCisJCXJldHVybiBOVUxMOworCisJLyogY3JlYXRlIHRoZSBic3NtYXAgaGVhZGVyICovCisJbXNnLT5sM2ggPSBtc2diX3B1dChtc2csIDIpOworCW1zZy0+bDNoWzBdID0gMHgwOworCisJLyogY3JlYXRlIGxheWVyIDMgaGVhZGVyICovCisJZGF0YSA9IG1zZ2JfcHV0KG1zZywgMSk7CisJZGF0YVswXSA9IEJTU19NQVBfTVNHX0NPTVBMRVRFX0xBWUVSXzM7CisKKwkvKiBjcmVhdGUgdGhlIGNlbGwgaGVhZGVyICovCisJZGF0YSA9IG1zZ2JfcHV0KG1zZywgMyk7CisJZGF0YVswXSA9IEdTTTA4MDhfSUVfQ0VMTF9JREVOVElGSUVSOworCWRhdGFbMV0gPSAxICsgc2l6ZW9mKCpsYWkpICsgMjsKKwlkYXRhWzJdID0gQ0VMTF9JREVOVF9XSE9MRV9HTE9CQUw7CisKKwlsYWkgPSAoc3RydWN0IGdzbTQ4X2xvY19hcmVhX2lkICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpsYWkpKTsKKwlnc200OF9nZW5lcmF0ZV9sYWkobGFpLCBjYywgbmMsIGxhYyk7CisKKwljaSA9ICh1aW50MTZfdCAqKSBtc2diX3B1dChtc2csIDIpOworCSpjaSA9IGh0b25zKF9jaSk7CisKKwkvKiBjb3B5IHRoZSBsYXllcjMgZGF0YSAqLworCWRhdGEgPSBtc2diX3B1dChtc2csIG1zZ2JfbDNsZW4obXNnX2wzKSArIDIpOworCWRhdGFbMF0gPSBHU00wODA4X0lFX0xBWUVSXzNfSU5GT1JNQVRJT047CisJZGF0YVsxXSA9IG1zZ2JfbDNsZW4obXNnX2wzKTsKKwltZW1jcHkoJmRhdGFbMl0sIG1zZ19sMy0+bDNoLCBkYXRhWzFdKTsKKworCS8qIHVwZGF0ZSB0aGUgc2l6ZSAqLworCW1zZy0+bDNoWzFdID0gbXNnYl9sM2xlbihtc2cpIC0gMjsKKworCXJldHVybiBtc2c7Cit9CisKK3N0cnVjdCBtc2diICpnc20wODA4X2NyZWF0ZV9yZXNldCh2b2lkKQoreworCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jX2hlYWRyb29tKEJTU01BUF9NU0dfU0laRSwgQlNTTUFQX01TR19IRUFEUk9PTSwKKwkJCQkJICAgICAgICJic3NtYXA6IHJlc2V0Iik7CisJaWYgKCFtc2cpCisJCXJldHVybiBOVUxMOworCisJbXNnLT5sM2ggPSBtc2diX3B1dChtc2csIDYpOworCW1zZy0+bDNoWzBdID0gQlNTQVBfTVNHX0JTU19NQU5BR0VNRU5UOworCW1zZy0+bDNoWzFdID0gMHgwNDsKKwltc2ctPmwzaFsyXSA9IDB4MzA7CisJbXNnLT5sM2hbM10gPSAweDA0OworCW1zZy0+bDNoWzRdID0gMHgwMTsKKwltc2ctPmwzaFs1XSA9IDB4MjA7CisJcmV0dXJuIG1zZzsKK30KKworc3RydWN0IG1zZ2IgKmdzbTA4MDhfY3JlYXRlX2NsZWFyX2NvbXBsZXRlKHZvaWQpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2NfaGVhZHJvb20oQlNTTUFQX01TR19TSVpFLCBCU1NNQVBfTVNHX0hFQURST09NLAorCQkJCQkgICAgICAgImJzc21hcDogY2xlYXIgY29tcGxldGUiKTsKKwlpZiAoIW1zZykKKwkJcmV0dXJuIE5VTEw7CisKKwltc2ctPmwzaCA9IG1zZ2JfcHV0KG1zZywgMyk7CisJbXNnLT5sM2hbMF0gPSBCU1NBUF9NU0dfQlNTX01BTkFHRU1FTlQ7CisJbXNnLT5sM2hbMV0gPSAxOworCW1zZy0+bDNoWzJdID0gQlNTX01BUF9NU0dfQ0xFQVJfQ09NUExFVEU7CisKKwlyZXR1cm4gbXNnOworfQorCitzdHJ1Y3QgbXNnYiAqZ3NtMDgwOF9jcmVhdGVfY2lwaGVyX2NvbXBsZXRlKHN0cnVjdCBtc2diICpsYXllcjMsIHVpbnQ4X3QgYWxnX2lkKQoreworCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jX2hlYWRyb29tKEJTU01BUF9NU0dfU0laRSwgQlNTTUFQX01TR19IRUFEUk9PTSwKKwkJCQkJICAgICAgICJjaXBoZXItY29tcGxldGUiKTsKKwlpZiAoIW1zZykKKwkJcmV0dXJuIE5VTEw7CisKKyAgICAgICAgLyogc2VuZCByZXNwb25zZSB3aXRoIEJTUyBvdmVycmlkZSBmb3IgQTUvMS4uLiBjaGVhdGluZyAqLworCW1zZy0+bDNoID0gbXNnYl9wdXQobXNnLCAzKTsKKwltc2ctPmwzaFswXSA9IEJTU0FQX01TR19CU1NfTUFOQUdFTUVOVDsKKwltc2ctPmwzaFsxXSA9IDB4ZmY7CisJbXNnLT5sM2hbMl0gPSBCU1NfTUFQX01TR19DSVBIRVJfTU9ERV9DT01QTEVURTsKKworCS8qIGluY2x1ZGUgbGF5ZXIzIGluIGNhc2Ugd2UgaGF2ZSBhdCBsZWFzdCB0d28gb2N0ZXRzICovCisJaWYgKGxheWVyMyAmJiBtc2diX2wzbGVuKGxheWVyMykgPiAyKSB7CisJCW1zZy0+bDRoID0gbXNnYl9wdXQobXNnLCBtc2diX2wzbGVuKGxheWVyMykgKyAyKTsKKwkJbXNnLT5sNGhbMF0gPSBHU00wODA4X0lFX0xBWUVSXzNfTUVTU0FHRV9DT05URU5UUzsKKwkJbXNnLT5sNGhbMV0gPSBtc2diX2wzbGVuKGxheWVyMyk7CisJCW1lbWNweSgmbXNnLT5sNGhbMl0sIGxheWVyMy0+bDNoLCBtc2diX2wzbGVuKGxheWVyMykpOworCX0KKworCS8qIGFuZCB0aGUgb3B0aW9uYWwgQlNTIG1lc3NhZ2UgKi8KKwltc2ctPmw0aCA9IG1zZ2JfcHV0KG1zZywgMik7CisJbXNnLT5sNGhbMF0gPSBHU00wODA4X0lFX0NIT1NFTl9FTkNSX0FMRzsKKwltc2ctPmw0aFsxXSA9IGFsZ19pZDsKKworCS8qIHVwZGF0ZSB0aGUgc2l6ZSAqLworCW1zZy0+bDNoWzFdID0gbXNnYl9sM2xlbihtc2cpIC0gMjsKKwlyZXR1cm4gbXNnOworfQorCitzdHJ1Y3QgbXNnYiAqZ3NtMDgwOF9jcmVhdGVfY2lwaGVyX3JlamVjdCh1aW50OF90IGNhdXNlKQoreworCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jX2hlYWRyb29tKEJTU01BUF9NU0dfU0laRSwgQlNTTUFQX01TR19IRUFEUk9PTSwKKwkJCQkJICAgICAgICJic3NtYXA6IGNsZWFyIGNvbXBsZXRlIik7CisJaWYgKCFtc2cpCisJCXJldHVybiBOVUxMOworCisJbXNnLT5sM2ggPSBtc2diX3B1dChtc2csIDMpOworCW1zZy0+bDNoWzBdID0gQlNTQVBfTVNHX0JTU19NQU5BR0VNRU5UOworCW1zZy0+bDNoWzFdID0gMjsKKwltc2ctPmwzaFsyXSA9IEJTU19NQVBfTVNHX0NJUEhFUl9NT0RFX1JFSkVDVDsKKwltc2ctPmwzaFszXSA9IGNhdXNlOworCisJcmV0dXJuIG1zZzsKK30KKworc3RydWN0IG1zZ2IgKmdzbTA4MDhfY3JlYXRlX2NsYXNzbWFya191cGRhdGUoY29uc3QgdWludDhfdCAqY2xhc3NtYXJrX2RhdGEsIHVpbnQ4X3QgbGVuZ3RoKQoreworCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jX2hlYWRyb29tKEJTU01BUF9NU0dfU0laRSwgQlNTTUFQX01TR19IRUFEUk9PTSwKKwkJCQkJICAgICAgICJjbGFzc21hcmstdXBkYXRlIik7CisJaWYgKCFtc2cpCisJCXJldHVybiBOVUxMOworCisJbXNnLT5sM2ggPSBtc2diX3B1dChtc2csIDMpOworCW1zZy0+bDNoWzBdID0gQlNTQVBfTVNHX0JTU19NQU5BR0VNRU5UOworCW1zZy0+bDNoWzFdID0gMHhmZjsKKwltc2ctPmwzaFsyXSA9IEJTU19NQVBfTVNHX0NMQVNTTUFSS19VUERBVEU7CisKKwltc2ctPmw0aCA9IG1zZ2JfcHV0KG1zZywgbGVuZ3RoKTsKKwltZW1jcHkobXNnLT5sNGgsIGNsYXNzbWFya19kYXRhLCBsZW5ndGgpOworCisJLyogdXBkYXRlIHRoZSBzaXplICovCisJbXNnLT5sM2hbMV0gPSBtc2diX2wzbGVuKG1zZykgLSAyOworCXJldHVybiBtc2c7Cit9CisKK3N0cnVjdCBtc2diICpnc20wODA4X2NyZWF0ZV9zYXBpX3JlamVjdCh1aW50OF90IGxpbmtfaWQpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2NfaGVhZHJvb20oQlNTTUFQX01TR19TSVpFLCBCU1NNQVBfTVNHX0hFQURST09NLAorCQkJCQkgICAgICAgImJzc21hcDogc2FwaSAnbicgcmVqZWN0Iik7CisJaWYgKCFtc2cpCisJCXJldHVybiBOVUxMOworCisJbXNnLT5sM2ggPSBtc2diX3B1dChtc2csIDUpOworCW1zZy0+bDNoWzBdID0gQlNTQVBfTVNHX0JTU19NQU5BR0VNRU5UOworCW1zZy0+bDNoWzFdID0gMzsKKwltc2ctPmwzaFsyXSA9IEJTU19NQVBfTVNHX1NBUElfTl9SRUpFQ1Q7CisJbXNnLT5sM2hbM10gPSBsaW5rX2lkOworCW1zZy0+bDNoWzRdID0gR1NNMDgwOF9DQVVTRV9CU1NfTk9UX0VRVUlQUEVEOworCisJcmV0dXJuIG1zZzsKK30KKworc3RydWN0IG1zZ2IgKmdzbTA4MDhfY3JlYXRlX2Fzc2lnbm1lbnRfY29tcGxldGVkKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1aW50OF90IHJyX2NhdXNlLAorCQkJCQkJIHVpbnQ4X3QgY2hvc2VuX2NoYW5uZWwsIHVpbnQ4X3QgZW5jcl9hbGdfaWQsCisJCQkJCQkgdWludDhfdCBzcGVlY2hfbW9kZSkKK3sKKwl1aW50OF90ICpkYXRhOworCisJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2MoMzUsICJic3NtYXA6IGFzcyBjb21wbCIpOworCWlmICghbXNnKQorCQlyZXR1cm4gTlVMTDsKKworCW1zZy0+bDNoID0gbXNnYl9wdXQobXNnLCAzKTsKKwltc2ctPmwzaFswXSA9IEJTU0FQX01TR19CU1NfTUFOQUdFTUVOVDsKKwltc2ctPmwzaFsxXSA9IDB4ZmY7CisJbXNnLT5sM2hbMl0gPSBCU1NfTUFQX01TR19BU1NJR01FTlRfQ09NUExFVEU7CisKKwkvKiB3cml0ZSAzLjIuMi4yMiAqLworCWRhdGEgPSBtc2diX3B1dChtc2csIDIpOworCWRhdGFbMF0gPSBHU00wODA4X0lFX1JSX0NBVVNFOworCWRhdGFbMV0gPSBycl9jYXVzZTsKKworCS8qIHdyaXRlIGNpcnRjdWl0IGlkZW50aXR5ICBjb2RlIDMuMi4yLjIgKi8KKwkvKiB3cml0ZSBjZWxsIGlkZW50aWZpZXIgMy4yLjIuMTcgKi8KKwkvKiB3cml0ZSBjaG9zZW4gY2hhbm5lbCAzLjIuMi4zMyB3aGVuIEJUUyBwaWNrZWQgaXQgKi8KKwlkYXRhID0gbXNnYl9wdXQobXNnLCAyKTsKKwlkYXRhWzBdID0gR1NNMDgwOF9JRV9DSE9TRU5fQ0hBTk5FTDsKKwlkYXRhWzFdID0gY2hvc2VuX2NoYW5uZWw7CisKKwkvKiB3cml0ZSBjaG9zZW4gZW5jcnlwdGlvbiBhbGdvcml0aG0gMy4yLjIuNDQgKi8KKwlkYXRhID0gbXNnYl9wdXQobXNnLCAyKTsKKwlkYXRhWzBdID0gR1NNMDgwOF9JRV9DSE9TRU5fRU5DUl9BTEc7CisJZGF0YVsxXSA9IGVuY3JfYWxnX2lkOworCisJLyogd3JpdGUgY2lyY3VpdCBwb29sIDMuMi4yLjQ1ICovCisJLyogd3JpdGUgc3BlZWNoIHZlcnNpb24gY2hvc2VuOiAzLjIuMi41MSB3aGVuIEJUUyBwaWNrZWQgaXQgKi8KKwlpZiAoc3BlZWNoX21vZGUgIT0gMCkgeworCQlkYXRhID0gbXNnYl9wdXQobXNnLCAyKTsKKwkJZGF0YVswXSA9IEdTTTA4MDhfSUVfU1BFRUNIX1ZFUlNJT047CisJCWRhdGFbMV0gPSBzcGVlY2hfbW9kZTsKKwl9CisKKwkvKiB3cml0ZSBMU0EgaWRlbnRpZmllciAzLjIuMi4xNSAqLworCisKKwkvKiB1cGRhdGUgdGhlIHNpemUgKi8KKwltc2ctPmwzaFsxXSA9IG1zZ2JfbDNsZW4obXNnKSAtIDI7CisJcmV0dXJuIG1zZzsKK30KKworc3RydWN0IG1zZ2IgKmdzbTA4MDhfY3JlYXRlX2Fzc2lnbm1lbnRfZmFpbHVyZSh1aW50OF90IGNhdXNlLCB1aW50OF90ICpycl9jYXVzZSkKK3sKKwl1aW50OF90ICpkYXRhOworCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jX2hlYWRyb29tKEJTU01BUF9NU0dfU0laRSwgQlNTTUFQX01TR19IRUFEUk9PTSwKKwkJCQkJICAgICAgICJic3NtYXA6IGFzcyBmYWlsIik7CisJaWYgKCFtc2cpCisJCXJldHVybiBOVUxMOworCisJbXNnLT5sM2ggPSBtc2diX3B1dChtc2csIDYpOworCW1zZy0+bDNoWzBdID0gQlNTQVBfTVNHX0JTU19NQU5BR0VNRU5UOworCW1zZy0+bDNoWzFdID0gMHhmZjsKKwltc2ctPmwzaFsyXSA9IEJTU19NQVBfTVNHX0FTU0lHTUVOVF9GQUlMVVJFOworCW1zZy0+bDNoWzNdID0gR1NNMDgwOF9JRV9DQVVTRTsKKwltc2ctPmwzaFs0XSA9IDE7CisJbXNnLT5sM2hbNV0gPSBjYXVzZTsKKworCS8qIFJSIGNhdXNlIDMuMi4yLjIyICovCisJaWYgKHJyX2NhdXNlKSB7CisJCWRhdGEgPSBtc2diX3B1dChtc2csIDIpOworCQlkYXRhWzBdID0gR1NNMDgwOF9JRV9SUl9DQVVTRTsKKwkJZGF0YVsxXSA9ICpycl9jYXVzZTsKKwl9CisKKwkvKiBDaXJjdWl0IHBvb2wgMy4yMi40NSAqLworCS8qIENpcmN1aXQgcG9vbCBsaXN0IDMuMi4yLjQ2ICovCisKKwkvKiB1cGRhdGUgdGhlIHNpemUgKi8KKwltc2ctPmwzaFsxXSA9IG1zZ2JfbDNsZW4obXNnKSAtIDI7CisJcmV0dXJuIG1zZzsKK30KKwordm9pZCBnc20wODA4X3ByZXBlbmRfZHRhcF9oZWFkZXIoc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCBsaW5rX2lkKQoreworCXVpbnQ4X3QgKmhoID0gbXNnYl9wdXNoKG1zZywgMyk7CisJaGhbMF0gPSBCU1NBUF9NU0dfRFRBUDsKKwloaFsxXSA9IGxpbmtfaWQ7CisJaGhbMl0gPSBtc2ctPmxlbiAtIDM7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGx2X2RlZmluaXRpb24gYnNzX2F0dF90bHZkZWYgPSB7CisJLmRlZiA9IHsKKwkJW0dTTTA4MDhfSUVfSU1TSV0JCSAgICA9IHsgVExWX1RZUEVfVExWIH0sCisJCVtHU00wODA4X0lFX1RNU0ldCQkgICAgPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbR1NNMDgwOF9JRV9DRUxMX0lERU5USUZJRVJfTElTVF0gICA9IHsgVExWX1RZUEVfVExWIH0sCisJCVtHU00wODA4X0lFX0NIQU5ORUxfTkVFREVEXQkgICAgPSB7IFRMVl9UWVBFX1RWIH0sCisJCVtHU00wODA4X0lFX0VNTFBQX1BSSU9SSVRZXQkgICAgPSB7IFRMVl9UWVBFX1RWIH0sCisJCVtHU00wODA4X0lFX0NIQU5ORUxfVFlQRV0JICAgID0geyBUTFZfVFlQRV9UTFYgfSwKKwkJW0dTTTA4MDhfSUVfUFJJT1JJVFldCQkgICAgPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbR1NNMDgwOF9JRV9DSVJDVUlUX0lERU5USVRZX0NPREVdICA9IHsgVExWX1RZUEVfVFYgfSwKKwkJW0dTTTA4MDhfSUVfRE9XTkxJTktfRFRYX0ZMQUddCSAgICA9IHsgVExWX1RZUEVfVFYgfSwKKwkJW0dTTTA4MDhfSUVfSU5URVJGRVJFTkNFX0JBTkRfVE9fVVNFXSA9IHsgVExWX1RZUEVfVFYgfSwKKwkJW0dTTTA4MDhfSUVfQ0xBU1NNQVJLX0lORk9STUFUSU9OX1QyXSA9IHsgVExWX1RZUEVfVExWIH0sCisJCVtHU00wODA4X0lFX0dST1VQX0NBTExfUkVGRVJFTkNFXSAgID0geyBUTFZfVFlQRV9UTFYgfSwKKwkJW0dTTTA4MDhfSUVfVEFMS0VSX0ZMQUddCSAgICA9IHsgVExWX1RZUEVfVCB9LAorCQlbR1NNMDgwOF9JRV9DT05GSUdfRVZPX0lOREldCSAgICA9IHsgVExWX1RZUEVfVFYgfSwKKwkJW0dTTTA4MDhfSUVfTFNBX0FDQ0VTU19DVFJMX1NVUFBSXSAgPSB7IFRMVl9UWVBFX1RWIH0sCisJCVtHU00wODA4X0lFX1NFUlZJQ0VfSEFORE9WRVJdCSAgICA9IHsgVExWX1RZUEVfVFZ9LAorCQlbR1NNMDgwOF9JRV9FTkNSWVBUSU9OX0lORk9STUFUSU9OXSA9IHsgVExWX1RZUEVfVExWIH0sCisJCVtHU00wODA4X0lFX0NJUEhFUl9SRVNQT05TRV9NT0RFXSAgID0geyBUTFZfVFlQRV9UViB9LAorCQlbR1NNMDgwOF9JRV9DRUxMX0lERU5USUZJRVJdCSAgICA9IHsgVExWX1RZUEVfVExWIH0sCisJCVtHU00wODA4X0lFX0NIT1NFTl9DSEFOTkVMXQkgICAgPSB7IFRMVl9UWVBFX1RWIH0sCisJCVtHU00wODA4X0lFX0xBWUVSXzNfSU5GT1JNQVRJT05dICAgID0geyBUTFZfVFlQRV9UTFYgfSwKKwl9LAorfTsKKworY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uICpnc20wODA4X2F0dF90bHZkZWYoKQoreworCXJldHVybiAmYnNzX2F0dF90bHZkZWY7Cit9CmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9zcmMvZ3NtNDguYyBiL2xpYm9zbW9jb3JlL3NyYy9nc200OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NTdhZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9zcmMvZ3NtNDguYwpAQCAtMCwwICsxLDM1MyBAQAorLyogR1NNIE1vYmlsZSBSYWRpbyBJbnRlcmZhY2UgTGF5ZXIgMyBtZXNzYWdlcworICogM0dQUCBUUyAwNC4wOCB2ZXJzaW9uIDcuMjEuMCBSZWxlYXNlIDE5OTggLyBFVFNJIFRTIDEwMCA5NDAgVjcuMjEuMCAqLworCisvKiAoQykgMjAwOC0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOCwgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS91dGlscy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbTQ4Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9wcm90b2NvbC9nc21fMDRfMDguaD4KKworY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uIGdzbTQ4X2F0dF90bHZkZWYgPSB7CisJLmRlZiA9IHsKKwkJW0dTTTQ4X0lFX01PQklMRV9JRF0JPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbR1NNNDhfSUVfTkFNRV9MT05HXQk9IHsgVExWX1RZUEVfVExWIH0sCisJCVtHU000OF9JRV9OQU1FX1NIT1JUXQk9IHsgVExWX1RZUEVfVExWIH0sCisJCVtHU000OF9JRV9VVENdCQk9IHsgVExWX1RZUEVfVFYgfSwKKwkJW0dTTTQ4X0lFX05FVF9USU1FX1RaXQk9IHsgVExWX1RZUEVfRklYRUQsIDcgfSwKKwkJW0dTTTQ4X0lFX0xTQV9JREVOVF0JPSB7IFRMVl9UWVBFX1RMViB9LAorCisJCVtHU000OF9JRV9CRUFSRVJfQ0FQXQk9IHsgVExWX1RZUEVfVExWIH0sCisJCVtHU000OF9JRV9DQVVTRV0JPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbR1NNNDhfSUVfQ0NfQ0FQXQk9IHsgVExWX1RZUEVfVExWIH0sCisJCVtHU000OF9JRV9BTEVSVF0JPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbR1NNNDhfSUVfRkFDSUxJVFldCT0geyBUTFZfVFlQRV9UTFYgfSwKKwkJW0dTTTQ4X0lFX1BST0dSX0lORF0JPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbR1NNNDhfSUVfQVVYX1NUQVRVU10JPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbR1NNNDhfSUVfTk9USUZZXQk9IHsgVExWX1RZUEVfVFYgfSwKKwkJW0dTTTQ4X0lFX0tQRF9GQUNJTElUWV0JPSB7IFRMVl9UWVBFX1RWIH0sCisJCVtHU000OF9JRV9TSUdOQUxdCT0geyBUTFZfVFlQRV9UViB9LAorCQlbR1NNNDhfSUVfQ09OTl9CQ0RdCT0geyBUTFZfVFlQRV9UTFYgfSwKKwkJW0dTTTQ4X0lFX0NPTk5fU1VCXQk9IHsgVExWX1RZUEVfVExWIH0sCisJCVtHU000OF9JRV9DQUxMSU5HX0JDRF0JPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbR1NNNDhfSUVfQ0FMTElOR19TVUJdCT0geyBUTFZfVFlQRV9UTFYgfSwKKwkJW0dTTTQ4X0lFX0NBTExFRF9CQ0RdCT0geyBUTFZfVFlQRV9UTFYgfSwKKwkJW0dTTTQ4X0lFX0NBTExFRF9TVUJdCT0geyBUTFZfVFlQRV9UTFYgfSwKKwkJW0dTTTQ4X0lFX1JFRElSX0JDRF0JPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbR1NNNDhfSUVfUkVESVJfU1VCXQk9IHsgVExWX1RZUEVfVExWIH0sCisJCVtHU000OF9JRV9MT1dMX0NPTVBBVF0JPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbR1NNNDhfSUVfSElHSExfQ09NUEFUXQk9IHsgVExWX1RZUEVfVExWIH0sCisJCVtHU000OF9JRV9VU0VSX1VTRVJdCT0geyBUTFZfVFlQRV9UTFYgfSwKKwkJW0dTTTQ4X0lFX1NTX1ZFUlNdCT0geyBUTFZfVFlQRV9UTFYgfSwKKwkJW0dTTTQ4X0lFX01PUkVfREFUQV0JPSB7IFRMVl9UWVBFX1QgfSwKKwkJW0dTTTQ4X0lFX0NMSVJfU1VQUF0JPSB7IFRMVl9UWVBFX1QgfSwKKwkJW0dTTTQ4X0lFX0NMSVJfSU5WT0NdCT0geyBUTFZfVFlQRV9UIH0sCisJCVtHU000OF9JRV9SRVZfQ19TRVRVUF0JPSB7IFRMVl9UWVBFX1QgfSwKKwkJW0dTTTQ4X0lFX1JFUEVBVF9DSVJdICAgPSB7IFRMVl9UWVBFX1QgfSwKKwkJW0dTTTQ4X0lFX1JFUEVBVF9TRVFdICAgPSB7IFRMVl9UWVBFX1QgfSwKKwkJLyogRklYTUU6IG1vcmUgZWxlbWVudHMgKi8KKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgcnJfY2F1c2VfbmFtZXNbXSA9IHsKKwl7IEdTTTQ4X1JSX0NBVVNFX05PUk1BTCwJCSJOb3JtYWwgZXZlbnQiIH0sCisJeyBHU000OF9SUl9DQVVTRV9BQk5PUk1BTF9VTlNQRUMsCSJBYm5vcm1hbCByZWxlYXNlLCB1bnNwZWNpZmllZCIgfSwKKwl7IEdTTTQ4X1JSX0NBVVNFX0FCTk9STUFMX1VOQUNDVCwJIkFibm9ybWFsIHJlbGVhc2UsIGNoYW5uZWwgdW5hY2NlcHRhYmxlIiB9LAorCXsgR1NNNDhfUlJfQ0FVU0VfQUJOT1JNQUxfVElNRVIsCSJBYm5vcm1hbCByZWxlYXNlLCB0aW1lciBleHBpcmVkIiB9LAorCXsgR1NNNDhfUlJfQ0FVU0VfQUJOT1JNQUxfTk9BQ1QsCSJBYm5vcm1hbCByZWxlYXNlLCBubyBhY3Rpdml0eSBvbiByYWRpbyBwYXRoIiB9LAorCXsgR1NNNDhfUlJfQ0FVU0VfUFJFTVBUSVZFX1JFTCwJCSJQcmVlbXB0aXZlIHJlbGVhc2UiIH0sCisJeyBHU000OF9SUl9DQVVTRV9ITkRPVkVSX0lNUCwJCSJIYW5kb3ZlciBpbXBvc3NpYmxlLCB0aW1pbmcgYWR2YW5jZSBvdXQgb2YgcmFuZ2UiIH0sCisJeyBHU000OF9SUl9DQVVTRV9DSEFOX01PREVfVU5BQ0NULAkiQ2hhbm5lbCBtb2RlIHVuYWNjZXB0YWJsZSIgfSwKKwl7IEdTTTQ4X1JSX0NBVVNFX0ZSRVFfTk9UX0lNUEwsCQkiRnJlcXVlbmN5IG5vdCBpbXBsZW1lbnRlZCIgfSwKKwl7IEdTTTQ4X1JSX0NBVVNFX0NBTExfQ0xFQVJFRCwJCSJDYWxsIGFscmVhZHkgY2xlYXJlZCIgfSwKKwl7IEdTTTQ4X1JSX0NBVVNFX1NFTUFOVF9JTkNPUlIsCQkiU2VtYW50aWNhbGx5IGluY29ycmVjdCBtZXNzYWdlIiB9LAorCXsgR1NNNDhfUlJfQ0FVU0VfSU5WQUxJRF9NQU5EX0lORiwJIkludmFsaWQgbWFuZGF0b3J5IGluZm9ybWF0aW9uIiB9LAorCXsgR1NNNDhfUlJfQ0FVU0VfTVNHX1RZUEVfTiwJCSJNZXNzYWdlIHR5cGUgbm9uLWV4aXN0YW50IG9yIG5vdCBpbXBsZW1lbnRlZCIgfSwKKwl7IEdTTTQ4X1JSX0NBVVNFX01TR19UWVBFX05fQ09NUEFULAkiTWVzc2FnZSB0eXBlIG5vdCBjb21wYXRpYmxlIHdpdGggcHJvdG9jb2wgc3RhdGUiIH0sCisJeyBHU000OF9SUl9DQVVTRV9DT05EX0lFX0VSUk9SLAkJIkNvbmRpdGlvbmFsIElFIGVycm9yIiB9LAorCXsgR1NNNDhfUlJfQ0FVU0VfTk9fQ0VMTF9BTExPQ19BLAkiTm8gY2VsbCBhbGxvY2F0aW9uIGF2YWlsYWJsZSIgfSwKKwl7IEdTTTQ4X1JSX0NBVVNFX1BST1RfRVJST1JfVU5TUEMsCSJQcm90b2NvbCBlcnJvciB1bnNwZWNpZmllZCIgfSwKKwl7IDAsCQkJCQlOVUxMIH0sCit9OworCisvKiBGSVhNRTogY29udmVydCB0byB2YWx1ZV9zdHJpbmcgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpjY19zdGF0ZV9uYW1lc1szM10gPSB7CisJIk5VTEwiLAorCSJJTklUSUFURUQiLAorCSJNTV9DT05ORUNUSU9OX1BFTkQiLAorCSJNT19DQUxMX1BST0MiLAorCSJDQUxMX0RFTElWRVJFRCIsCisJImlsbGVnYWwgc3RhdGUgNSIsCisJIkNBTExfUFJFU0VOVCIsCisJIkNBTExfUkVDRUlWRUQiLAorCSJDT05ORUNUX1JFUVVFU1QiLAorCSJNT19URVJNX0NBTExfQ09ORiIsCisJIkFDVElWRSIsCisJIkRJU0NPTk5FQ1RfUkVRIiwKKwkiRElTQ09OTkVDVF9JTkQiLAorCSJpbGxlZ2FsIHN0YXRlIDEzIiwKKwkiaWxsZWdhbCBzdGF0ZSAxNCIsCisJImlsbGVnYWwgc3RhdGUgMTUiLAorCSJpbGxlZ2FsIHN0YXRlIDE2IiwKKwkiaWxsZWdhbCBzdGF0ZSAxNyIsCisJImlsbGVnYWwgc3RhdGUgMTgiLAorCSJSRUxFQVNFX1JFUSIsCisJImlsbGVnYWwgc3RhdGUgMjAiLAorCSJpbGxlZ2FsIHN0YXRlIDIxIiwKKwkiaWxsZWdhbCBzdGF0ZSAyMiIsCisJImlsbGVnYWwgc3RhdGUgMjMiLAorCSJpbGxlZ2FsIHN0YXRlIDI0IiwKKwkiaWxsZWdhbCBzdGF0ZSAyNSIsCisJIk1PX09SSUdfTU9ESUZZIiwKKwkiTU9fVEVSTV9NT0RJRlkiLAorCSJDT05ORUNUX0lORCIsCisJImlsbGVnYWwgc3RhdGUgMjkiLAorCSJpbGxlZ2FsIHN0YXRlIDMwIiwKKwkiaWxsZWdhbCBzdGF0ZSAzMSIsCit9OworCitjb25zdCBjaGFyICpnc200OF9jY19zdGF0ZV9uYW1lKHVpbnQ4X3Qgc3RhdGUpCit7CisJaWYgKHN0YXRlIDwgQVJSQVlfU0laRShjY19zdGF0ZV9uYW1lcykpCisJCXJldHVybiBjY19zdGF0ZV9uYW1lc1tzdGF0ZV07CisKKwlyZXR1cm4gImludmFsaWQiOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBjY19tc2dfbmFtZXNbXSA9IHsKKwl7IEdTTTQ4X01UX0NDX0FMRVJUSU5HLAkJIkFMRVJUSU5HIiB9LAorCXsgR1NNNDhfTVRfQ0NfQ0FMTF9QUk9DLAkiQ0FMTF9QUk9DIiB9LAorCXsgR1NNNDhfTVRfQ0NfUFJPR1JFU1MsCQkiUFJPR1JFU1MiIH0sCisJeyBHU000OF9NVF9DQ19FU1RBQiwJCSJFU1RBQiIgfSwKKwl7IEdTTTQ4X01UX0NDX1NFVFVQLAkJIlNFVFVQIiB9LAorCXsgR1NNNDhfTVRfQ0NfRVNUQUJfQ09ORiwJIkVTVEFCX0NPTkYiIH0sCisJeyBHU000OF9NVF9DQ19DT05ORUNULAkJIkNPTk5FQ1QiIH0sCisJeyBHU000OF9NVF9DQ19DQUxMX0NPTkYsCSJDQUxMX0NPTkYiIH0sCisJeyBHU000OF9NVF9DQ19TVEFSVF9DQywJCSJTVEFSVF9DQyIgfSwKKwl7IEdTTTQ4X01UX0NDX1JFQ0FMTCwJCSJSRUNBTEwiIH0sCisJeyBHU000OF9NVF9DQ19FTUVSR19TRVRVUCwJIkVNRVJHX1NFVFVQIiB9LAorCXsgR1NNNDhfTVRfQ0NfQ09OTkVDVF9BQ0ssCSJDT05ORUNUX0FDSyIgfSwKKwl7IEdTTTQ4X01UX0NDX1VTRVJfSU5GTywJIlVTRVJfSU5GTyIgfSwKKwl7IEdTTTQ4X01UX0NDX01PRElGWV9SRUpFQ1QsCSJNT0RJRllfUkVKRUNUIiB9LAorCXsgR1NNNDhfTVRfQ0NfTU9ESUZZLAkJIk1PRElGWSIgfSwKKwl7IEdTTTQ4X01UX0NDX0hPTEQsCQkiSE9MRCIgfSwKKwl7IEdTTTQ4X01UX0NDX0hPTERfQUNLLAkJIkhPTERfQUNLIiB9LAorCXsgR1NNNDhfTVRfQ0NfSE9MRF9SRUosCQkiSE9MRF9SRUoiIH0sCisJeyBHU000OF9NVF9DQ19SRVRSLAkJIlJFVFIiIH0sCisJeyBHU000OF9NVF9DQ19SRVRSX0FDSywJCSJSRVRSX0FDSyIgfSwKKwl7IEdTTTQ4X01UX0NDX1JFVFJfUkVKLAkJIlJFVFJfUkVKIiB9LAorCXsgR1NNNDhfTVRfQ0NfTU9ESUZZX0NPTVBMLAkiTU9ESUZZX0NPTVBMIiB9LAorCXsgR1NNNDhfTVRfQ0NfRElTQ09OTkVDVCwJIkRJU0NPTk5FQ1QiIH0sCisJeyBHU000OF9NVF9DQ19SRUxFQVNFX0NPTVBMLAkiUkVMRUFTRV9DT01QTCIgfSwKKwl7IEdTTTQ4X01UX0NDX1JFTEVBU0UsCQkiUkVMRUFTRSIgfSwKKwl7IEdTTTQ4X01UX0NDX1NUT1BfRFRNRiwJIlNUT1BfRFRNRiIgfSwKKwl7IEdTTTQ4X01UX0NDX1NUT1BfRFRNRl9BQ0ssCSJTVE9QX0RUTUZfQUNLIiB9LAorCXsgR1NNNDhfTVRfQ0NfU1RBVFVTX0VOUSwJIlNUQVRVU19FTlEiIH0sCisJeyBHU000OF9NVF9DQ19TVEFSVF9EVE1GLAkiU1RBUlRfRFRNRiIgfSwKKwl7IEdTTTQ4X01UX0NDX1NUQVJUX0RUTUZfQUNLLAkiU1RBUlRfRFRNRl9BQ0siIH0sCisJeyBHU000OF9NVF9DQ19TVEFSVF9EVE1GX1JFSiwJIlNUQVJUX0RUTUZfUkVKIiB9LAorCXsgR1NNNDhfTVRfQ0NfQ09OR19DVFJMLAkiQ09OR19DVFJMIiB9LAorCXsgR1NNNDhfTVRfQ0NfRkFDSUxJVFksCQkiRkFDSUxJVFkiIH0sCisJeyBHU000OF9NVF9DQ19TVEFUVVMsCQkiU1RBVFVTIiB9LAorCXsgR1NNNDhfTVRfQ0NfTk9USUZZLAkJIk5PVEZJWSIgfSwKKwl7IDAsCQkJCU5VTEwgfQorfTsKKworY29uc3QgY2hhciAqZ3NtNDhfY2NfbXNnX25hbWUodWludDhfdCBtc2d0eXBlKQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKGNjX21zZ19uYW1lcywgbXNndHlwZSk7Cit9CisKK2NvbnN0IGNoYXIgKnJyX2NhdXNlX25hbWUodWludDhfdCBjYXVzZSkKK3sKKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhycl9jYXVzZV9uYW1lcywgY2F1c2UpOworfQorCitzdGF0aWMgdm9pZCB0b19iY2QodWludDhfdCAqYmNkLCB1aW50MTZfdCB2YWwpCit7CisJYmNkWzJdID0gdmFsICUgMTA7CisJdmFsID0gdmFsIC8gMTA7CisJYmNkWzFdID0gdmFsICUgMTA7CisJdmFsID0gdmFsIC8gMTA7CisJYmNkWzBdID0gdmFsICUgMTA7CisJdmFsID0gdmFsIC8gMTA7Cit9CisKK3ZvaWQgZ3NtNDhfZ2VuZXJhdGVfbGFpKHN0cnVjdCBnc200OF9sb2NfYXJlYV9pZCAqbGFpNDgsIHVpbnQxNl90IG1jYywKKwkJCXVpbnQxNl90IG1uYywgdWludDE2X3QgbGFjKQoreworCXVpbnQ4X3QgYmNkWzNdOworCisJdG9fYmNkKGJjZCwgbWNjKTsKKwlsYWk0OC0+ZGlnaXRzWzBdID0gYmNkWzBdIHwgKGJjZFsxXSA8PCA0KTsKKwlsYWk0OC0+ZGlnaXRzWzFdID0gYmNkWzJdOworCisJdG9fYmNkKGJjZCwgbW5jKTsKKwkvKiBGSVhNRTogZG8gd2UgbmVlZCB0aHJlZS1kaWdpdCBNTkM/IFNlZSBUYWJsZSAxMC41LjMgKi8KKyNpZiAwCisJbGFpNDgtPmRpZ2l0c1sxXSB8PSBiY2RbMl0gPDwgNDsKKwlsYWk0OC0+ZGlnaXRzWzJdID0gYmNkWzBdIHwgKGJjZFsxXSA8PCA0KTsKKyNlbHNlCisJbGFpNDgtPmRpZ2l0c1sxXSB8PSAweGYgPDwgNDsKKwlsYWk0OC0+ZGlnaXRzWzJdID0gYmNkWzFdIHwgKGJjZFsyXSA8PCA0KTsKKyNlbmRpZgorCisJbGFpNDgtPmxhYyA9IGh0b25zKGxhYyk7Cit9CisKK2ludCBnc200OF9nZW5lcmF0ZV9taWRfZnJvbV90bXNpKHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3QgdG1zaSkKK3sKKwl1aW50MzJfdCAqdHB0ciA9ICh1aW50MzJfdCAqKSAmYnVmWzNdOworCisJYnVmWzBdID0gR1NNNDhfSUVfTU9CSUxFX0lEOworCWJ1ZlsxXSA9IEdTTTQ4X1RNU0lfTEVOOworCWJ1ZlsyXSA9IDB4ZjAgfCBHU01fTUlfVFlQRV9UTVNJOworCSp0cHRyID0gaHRvbmwodG1zaSk7CisKKwlyZXR1cm4gNzsKK30KKworaW50IGdzbTQ4X2dlbmVyYXRlX21pZF9mcm9tX2ltc2kodWludDhfdCAqYnVmLCBjb25zdCBjaGFyICppbXNpKQoreworCXVuc2lnbmVkIGludCBsZW5ndGggPSBzdHJsZW4oaW1zaSksIGksIG9mZiA9IDA7CisJdWludDhfdCBvZGQgPSAobGVuZ3RoICYgMHgxKSA9PSAxOworCisJYnVmWzBdID0gR1NNNDhfSUVfTU9CSUxFX0lEOworCWJ1ZlsyXSA9IGNoYXIyYmNkKGltc2lbMF0pIDw8IDQgfCBHU01fTUlfVFlQRV9JTVNJIHwgKG9kZCA8PCAzKTsKKworCS8qIGlmIHRoZSBsZW5ndGggaXMgZXZlbiB3ZSB3aWxsIGZpbGwgaGFsZiBvZiB0aGUgbGFzdCBvY3RldCAqLworCWlmIChvZGQpCisJCWJ1ZlsxXSA9IChsZW5ndGggKyAxKSA+PiAxOworCWVsc2UKKwkJYnVmWzFdID0gKGxlbmd0aCArIDIpID4+IDE7CisKKwlmb3IgKGkgPSAxOyBpIDwgYnVmWzFdOyArK2kpIHsKKwkJdWludDhfdCBsb3dlciwgdXBwZXI7CisKKwkJbG93ZXIgPSBjaGFyMmJjZChpbXNpWysrb2ZmXSk7CisJCWlmICghb2RkICYmIG9mZiArIDEgPT0gbGVuZ3RoKQorCQkJdXBwZXIgPSAweDBmOworCQllbHNlCisJCQl1cHBlciA9IGNoYXIyYmNkKGltc2lbKytvZmZdKSAmIDB4MGY7CisKKwkJYnVmWzIgKyBpXSA9ICh1cHBlciA8PCA0KSB8IGxvd2VyOworCX0KKworCXJldHVybiAyICsgYnVmWzFdOworfQorCisvKiBDb252ZXJ0IE1vYmlsZSBJZGVudGl0eSAoMTAuNS4xLjQpIHRvIHN0cmluZyAqLworaW50IGdzbTQ4X21pX3RvX3N0cmluZyhjaGFyICpzdHJpbmcsIGNvbnN0IGludCBzdHJfbGVuLCBjb25zdCB1aW50OF90ICptaSwKKwkJICAgICAgIGNvbnN0IGludCBtaV9sZW4pCit7CisJaW50IGk7CisJdWludDhfdCBtaV90eXBlOworCWNoYXIgKnN0cl9jdXIgPSBzdHJpbmc7CisJdWludDMyX3QgdG1zaTsKKworCW1pX3R5cGUgPSBtaVswXSAmIEdTTV9NSV9UWVBFX01BU0s7CisKKwlzd2l0Y2ggKG1pX3R5cGUpIHsKKwljYXNlIEdTTV9NSV9UWVBFX05PTkU6CisJCWJyZWFrOworCWNhc2UgR1NNX01JX1RZUEVfVE1TSToKKwkJLyogVGFibGUgMTAuNS40LjMsIHJldmVyc2UgZ2VuZXJhdGVfbWlkX2Zyb21fdG1zaSAqLworCQlpZiAobWlfbGVuID09IEdTTTQ4X1RNU0lfTEVOICYmIG1pWzBdID09ICgweGYwIHwgR1NNX01JX1RZUEVfVE1TSSkpIHsKKwkJCW1lbWNweSgmdG1zaSwgJm1pWzFdLCA0KTsKKwkJCXRtc2kgPSBudG9obCh0bXNpKTsKKwkJCXJldHVybiBzbnByaW50ZihzdHJpbmcsIHN0cl9sZW4sICIldSIsIHRtc2kpOworCQl9CisJCWJyZWFrOworCWNhc2UgR1NNX01JX1RZUEVfSU1TSToKKwljYXNlIEdTTV9NSV9UWVBFX0lNRUk6CisJY2FzZSBHU01fTUlfVFlQRV9JTUVJU1Y6CisJCSpzdHJfY3VyKysgPSBiY2QyY2hhcihtaVswXSA+PiA0KTsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBtaV9sZW47IGkrKykgeworCQkJaWYgKHN0cl9jdXIgKyAyID49IHN0cmluZyArIHN0cl9sZW4pCisJCQkJcmV0dXJuIHN0cl9jdXIgLSBzdHJpbmc7CisJCQkqc3RyX2N1cisrID0gYmNkMmNoYXIobWlbaV0gJiAweGYpOworCQkJLyogc2tpcCBsYXN0IG5pYmJsZSBpbiBsYXN0IGlucHV0IGJ5dGUgd2hlbiBHU01fRVZFTiAqLworCQkJaWYoIChpICE9IG1pX2xlbi0xKSB8fCAobWlbMF0gJiBHU01fTUlfT0REKSkKKwkJCQkqc3RyX2N1cisrID0gYmNkMmNoYXIobWlbaV0gPj4gNCk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCSpzdHJfY3VyKysgPSAnXDAnOworCisJcmV0dXJuIHN0cl9jdXIgLSBzdHJpbmc7Cit9CisKK3ZvaWQgZ3NtNDhfcGFyc2VfcmEoc3RydWN0IGdwcnNfcmFfaWQgKnJhaWQsIGNvbnN0IHVpbnQ4X3QgKmJ1ZikKK3sKKwlyYWlkLT5tY2MgPSAoYnVmWzBdICYgMHhmKSAqIDEwMDsKKwlyYWlkLT5tY2MgKz0gKGJ1ZlswXSA+PiA0KSAqIDEwOworCXJhaWQtPm1jYyArPSAoYnVmWzFdICYgMHhmKSAqIDE7CisKKwkvKiBJIHdvbmRlciB3aG8gY2FtZSB1cCB3aXRoIHRoZSBzdHVwaWRpdHkgb2YgZW5jb2RpbmcgdGhlIE1OQworCSAqIGRpZmZlcmVudGx5IGRlcGVuZGluZyBvbiBob3cgbWFueSBkaWdpdHMgaXRzIGRlY2ltYWwgbnVtYmVyIGhhcyEgKi8KKwlpZiAoKGJ1ZlsxXSA+PiA0KSA9PSAweGYpIHsKKwkJcmFpZC0+bW5jID0gKGJ1ZlsyXSAmIDB4ZikgKiAxMDsKKwkJcmFpZC0+bW5jICs9IChidWZbMl0gPj4gNCkgKiAxOworCX0gZWxzZSB7CisJCXJhaWQtPm1uYyA9IChidWZbMl0gJiAweGYpICogMTAwOworCQlyYWlkLT5tbmMgKz0gKGJ1ZlsyXSA+PiA0KSAqIDEwOworCQlyYWlkLT5tbmMgKz0gKGJ1ZlsxXSA+PiA0KSAqIDE7CisJfQorCisJcmFpZC0+bGFjID0gbnRvaHMoKih1aW50MTZfdCAqKShidWYgKyAzKSk7CisJcmFpZC0+cmFjID0gYnVmWzVdOworfQorCitpbnQgZ3NtNDhfY29uc3RydWN0X3JhKHVpbnQ4X3QgKmJ1ZiwgY29uc3Qgc3RydWN0IGdwcnNfcmFfaWQgKnJhaWQpCit7CisJdWludDE2X3QgbWNjID0gcmFpZC0+bWNjOworCXVpbnQxNl90IG1uYyA9IHJhaWQtPm1uYzsKKworCWJ1ZlswXSA9ICgobWNjIC8gMTAwKSAlIDEwKSB8ICgoKG1jYyAvIDEwKSAlIDEwKSA8PCA0KTsKKwlidWZbMV0gPSAobWNjICUgMTApOworCisJLyogSSB3b25kZXIgd2hvIGNhbWUgdXAgd2l0aCB0aGUgc3R1cGlkaXR5IG9mIGVuY29kaW5nIHRoZSBNTkMKKwkgKiBkaWZmZXJlbnRseSBkZXBlbmRpbmcgb24gaG93IG1hbnkgZGlnaXRzIGl0cyBkZWNpbWFsIG51bWJlciBoYXMhICovCisJaWYgKG1uYyA8IDEwMCkgeworCQlidWZbMV0gfD0gMHhmMDsKKwkJYnVmWzJdID0gKChtbmMgLyAxMCkgJSAxMCkgfCAoKG1uYyAlIDEwKSA8PCA0KTsKKwl9IGVsc2UgeworCQlidWZbMV0gfD0gKG1uYyAlIDEwKSA8PCA0OworCQlidWZbMl0gPSAoKG1uYyAvIDEwMCkgJSAxMCkgfCAoKChtY2MgLyAxMCkgJSAxMCkgPDwgNCk7CisJfQorCisJKih1aW50MTZfdCAqKShidWYrMykgPSBodG9ucyhyYWlkLT5sYWMpOworCisJYnVmWzVdID0gcmFpZC0+cmFjOworCisJcmV0dXJuIDY7Cit9CmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9zcmMvZ3NtNDhfaWUuYyBiL2xpYm9zbW9jb3JlL3NyYy9nc200OF9pZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMmExZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9zcmMvZ3NtNDhfaWUuYwpAQCAtMCwwICsxLDY1OSBAQAorLyogR1NNIE1vYmlsZSBSYWRpbyBJbnRlcmZhY2UgTGF5ZXIgMyBtZXNzYWdlcworICogM0dQUCBUUyAwNC4wOCB2ZXJzaW9uIDcuMjEuMCBSZWxlYXNlIDE5OTggLyBFVFNJIFRTIDEwMCA5NDAgVjcuMjEuMCAqLworCisvKiAoQykgMjAwOCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDktMjAxMCBieSBBbmRyZWFzIEV2ZXJzYmVyZworICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvdXRpbHMuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbW5jYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8wOC5oPgorCitzdGF0aWMgY29uc3QgY2hhciBiY2RfbnVtX2RpZ2l0c1tdID0geworCScwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLAorCSc4JywgJzknLCAnKicsICcjJywgJ2EnLCAnYicsICdjJywgJ1wwJworfTsKKworLyogZGVjb2RlIGEgJ2NhbGxlZC9jYWxsaW5nL2Nvbm5lY3QgcGFydHkgQkNEIG51bWJlcicgYXMgaW4gMTAuNS40LjcgKi8KK2ludCBnc200OF9kZWNvZGVfYmNkX251bWJlcihjaGFyICpvdXRwdXQsIGludCBvdXRwdXRfbGVuLAorCQkJICAgIGNvbnN0IHVpbnQ4X3QgKmJjZF9sdiwgaW50IGhfbGVuKQoreworCXVpbnQ4X3QgaW5fbGVuID0gYmNkX2x2WzBdOworCWludCBpOworCisJZm9yIChpID0gMSArIGhfbGVuOyBpIDw9IGluX2xlbjsgaSsrKSB7CisJCS8qIGxvd2VyIG5pYmJsZSAqLworCQlvdXRwdXRfbGVuLS07CisJCWlmIChvdXRwdXRfbGVuIDw9IDEpCisJCQlicmVhazsKKwkJKm91dHB1dCsrID0gYmNkX251bV9kaWdpdHNbYmNkX2x2W2ldICYgMHhmXTsKKworCQkvKiBoaWdoZXIgbmliYmxlICovCisJCW91dHB1dF9sZW4tLTsKKwkJaWYgKG91dHB1dF9sZW4gPD0gMSkKKwkJCWJyZWFrOworCQkqb3V0cHV0KysgPSBiY2RfbnVtX2RpZ2l0c1tiY2RfbHZbaV0gPj4gNF07CisJfQorCWlmIChvdXRwdXRfbGVuID49IDEpCisJCSpvdXRwdXQrKyA9ICdcMCc7CisKKwlyZXR1cm4gMDsKK30KKworLyogY29udmVydCBhIHNpbmdsZSBBU0NJSSBjaGFyYWN0ZXIgdG8gY2FsbC1jb250cm9sIEJDRCAqLworc3RhdGljIGludCBhc2NfdG9fYmNkKGNvbnN0IGNoYXIgYXNjKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYmNkX251bV9kaWdpdHMpOyBpKyspIHsKKwkJaWYgKGJjZF9udW1fZGlnaXRzW2ldID09IGFzYykKKwkJCXJldHVybiBpOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogY29udmVydCBhIEFTQ0lJIHBob25lIG51bWJlciB0byAnY2FsbGVkL2NhbGxpbmcvY29ubmVjdCBwYXJ0eSBCQ0QgbnVtYmVyJyAqLworaW50IGdzbTQ4X2VuY29kZV9iY2RfbnVtYmVyKHVpbnQ4X3QgKmJjZF9sdiwgdWludDhfdCBtYXhfbGVuLAorCQkgICAgICBpbnQgaF9sZW4sIGNvbnN0IGNoYXIgKmlucHV0KQoreworCWludCBpbl9sZW4gPSBzdHJsZW4oaW5wdXQpOworCWludCBpOworCXVpbnQ4X3QgKmJjZF9jdXIgPSBiY2RfbHYgKyAxICsgaF9sZW47CisKKwkvKiB0d28gZGlnaXRzIHBlciBieXRlLCBwbHVzIHR5cGUgYnl0ZSAqLworCWJjZF9sdlswXSA9IGluX2xlbi8yICsgaF9sZW47CisJaWYgKGluX2xlbiAlIDIpCisJCWJjZF9sdlswXSsrOworCisJaWYgKGJjZF9sdlswXSA+IG1heF9sZW4pCisJCXJldHVybiAtRUlPOworCisJZm9yIChpID0gMDsgaSA8IGluX2xlbjsgaSsrKSB7CisJCWludCByYyA9IGFzY190b19iY2QoaW5wdXRbaV0pOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCQlpZiAoaSAlIDIgPT0gMCkKKwkJCSpiY2RfY3VyID0gcmM7CisJCWVsc2UKKwkJCSpiY2RfY3VyKysgfD0gKHJjIDw8IDQpOworCX0KKwkvKiBhcHBlbmQgcGFkZGluZyBuaWJibGUgaW4gY2FzZSBvZiBvZGQgbGVuZ3RoICovCisJaWYgKGkgJSAyKQorCQkqYmNkX2N1cisrIHw9IDB4ZjA7CisKKwkvKiByZXR1cm4gaG93IG1hbnkgYnl0ZXMgd2UgdXNlZCAqLworCXJldHVybiAoYmNkX2N1ciAtIGJjZF9sdik7Cit9CisKKy8qIGRlY29kZSAnYmVhcmVyIGNhcGFiaWxpdHknICovCitpbnQgZ3NtNDhfZGVjb2RlX2JlYXJlcl9jYXAoc3RydWN0IGdzbV9tbmNjX2JlYXJlcl9jYXAgKmJjYXAsCisJCQkgICAgIGNvbnN0IHVpbnQ4X3QgKmx2KQoreworCXVpbnQ4X3QgaW5fbGVuID0gbHZbMF07CisJaW50IGksIHM7CisKKwlpZiAoaW5fbGVuIDwgMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwliY2FwLT5zcGVlY2hfdmVyWzBdID0gLTE7IC8qIGVuZCBvZiBsaXN0LCBvZiBtYXhpbXVtIDcgdmFsdWVzICovCisKKwkvKiBvY3RldCAzICovCisJYmNhcC0+dHJhbnNmZXIgPSBsdlsxXSAmIDB4MDc7CisJYmNhcC0+bW9kZSA9IChsdlsxXSAmIDB4MDgpID4+IDM7CisJYmNhcC0+Y29kaW5nID0gKGx2WzFdICYgMHgxMCkgPj4gNDsKKwliY2FwLT5yYWRpbyA9IChsdlsxXSAmIDB4NjApID4+IDU7CisKKwlpZiAoYmNhcC0+dHJhbnNmZXIgPT0gR1NNX01OQ0NfQkNBUF9TUEVFQ0gpIHsKKwkJaSA9IDE7CisJCXMgPSAwOworCQl3aGlsZSghKGx2W2ldICYgMHg4MCkpIHsKKwkJCWkrKzsgLyogb2N0ZXQgM2EgZXRjICovCisJCQlpZiAoaW5fbGVuIDwgaSkKKwkJCQlyZXR1cm4gMDsKKwkJCWJjYXAtPnNwZWVjaF92ZXJbcysrXSA9IGx2W2ldICYgMHgwZjsKKwkJCWJjYXAtPnNwZWVjaF92ZXJbc10gPSAtMTsgLyogZW5kIG9mIGxpc3QgKi8KKwkJCWlmIChpID09IDIpIC8qIG9jdGV0IDNhICovCisJCQkJYmNhcC0+c3BlZWNoX2N0bSA9IChsdltpXSAmIDB4MjApID4+IDU7CisJCQlpZiAocyA9PSA3KSAvKiBtYXhpbXVtIHNwZWVjaCB2ZXJzaW9ucyArIGVuZCBvZiBsaXN0ICovCisJCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgeworCQlpID0gMTsKKwkJd2hpbGUgKCEobHZbaV0gJiAweDgwKSkgeworCQkJaSsrOyAvKiBvY3RldCAzYSBldGMgKi8KKwkJCWlmIChpbl9sZW4gPCBpKQorCQkJCXJldHVybiAwOworCQkJLyogaWdub3JlIHRoZW0gKi8KKwkJfQorCQkvKiBGSVhNRTogaW1wbGVtZW50IE9DVEVUIDQrIHBhcnNpbmcgKi8KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogZW5jb2RlICdiZWFyZXIgY2FwYWJpbGl0eScgKi8KK2ludCBnc200OF9lbmNvZGVfYmVhcmVyX2NhcChzdHJ1Y3QgbXNnYiAqbXNnLCBpbnQgbHZfb25seSwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGdzbV9tbmNjX2JlYXJlcl9jYXAgKmJjYXApCit7CisJdWludDhfdCBsdlszMiArIDFdOworCWludCBpID0gMSwgczsKKworCWx2WzFdID0gYmNhcC0+dHJhbnNmZXI7CisJbHZbMV0gfD0gYmNhcC0+bW9kZSA8PCAzOworCWx2WzFdIHw9IGJjYXAtPmNvZGluZyA8PCA0OworCWx2WzFdIHw9IGJjYXAtPnJhZGlvIDw8IDU7CisKKwlpZiAoYmNhcC0+dHJhbnNmZXIgPT0gR1NNX01OQ0NfQkNBUF9TUEVFQ0gpIHsKKwkJZm9yIChzID0gMDsgYmNhcC0+c3BlZWNoX3ZlcltzXSA+PSAwOyBzKyspIHsKKwkJCWkrKzsgLyogb2N0ZXQgM2EgZXRjICovCisJCQlsdltpXSA9IGJjYXAtPnNwZWVjaF92ZXJbc107CisJCQlpZiAoaSA9PSAyKSAvKiBvY3RldCAzYSAqLworCQkJCWx2W2ldIHw9IGJjYXAtPnNwZWVjaF9jdG0gPDwgNTsKKwkJfQorCQlsdltpXSB8PSAweDgwOyAvKiBsYXN0IElFIG9mIG9jdGV0IDMgZXRjICovCisJfSBlbHNlIHsKKwkJLyogRklYTUU6IGltcGxlbWVudCBPQ1RFVCA0KyBlbmNvZGluZyAqLworCX0KKworCWx2WzBdID0gaTsKKwlpZiAobHZfb25seSkKKwkJbXNnYl9sdl9wdXQobXNnLCBsdlswXSwgbHYrMSk7CisJZWxzZQorCQltc2diX3Rsdl9wdXQobXNnLCBHU000OF9JRV9CRUFSRVJfQ0FQLCBsdlswXSwgbHYrMSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogZGVjb2RlICdjYWxsIGNvbnRyb2wgY2FwJyAqLworaW50IGdzbTQ4X2RlY29kZV9jY2NhcChzdHJ1Y3QgZ3NtX21uY2NfY2NjYXAgKmNjYXAsIGNvbnN0IHVpbnQ4X3QgKmx2KQoreworCXVpbnQ4X3QgaW5fbGVuID0gbHZbMF07CisKKwlpZiAoaW5fbGVuIDwgMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBvY3RldCAzICovCisJY2NhcC0+ZHRtZiA9IGx2WzFdICYgMHgwMTsKKwljY2FwLT5wY3AgPSAobHZbMV0gJiAweDAyKSA+PiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGVuY29kZSAnY2FsbCBjb250cm9sIGNhcCcgKi8KK2ludCBnc200OF9lbmNvZGVfY2NjYXAoc3RydWN0IG1zZ2IgKm1zZywKKwkJCWNvbnN0IHN0cnVjdCBnc21fbW5jY19jY2NhcCAqY2NhcCkKK3sKKwl1aW50OF90IGx2WzJdOworCisJbHZbMF0gPSAxOworCWx2WzFdID0gMDsKKwlpZiAoY2NhcC0+ZHRtZikKKwkJbHYgWzFdIHw9IDB4MDE7CisJaWYgKGNjYXAtPnBjcCkKKwkJbHYgWzFdIHw9IDB4MDI7CisKKwltc2diX3Rsdl9wdXQobXNnLCBHU000OF9JRV9DQ19DQVAsIGx2WzBdLCBsdisxKTsKKworCXJldHVybiAwOworfQorCisvKiBkZWNvZGUgJ2NhbGxlZCBwYXJ0eSBCQ0QgbnVtYmVyJyAqLworaW50IGdzbTQ4X2RlY29kZV9jYWxsZWQoc3RydWN0IGdzbV9tbmNjX251bWJlciAqY2FsbGVkLAorCQkJIGNvbnN0IHVpbnQ4X3QgKmx2KQoreworCXVpbnQ4X3QgaW5fbGVuID0gbHZbMF07CisKKwlpZiAoaW5fbGVuIDwgMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBvY3RldCAzICovCisJY2FsbGVkLT5wbGFuID0gbHZbMV0gJiAweDBmOworCWNhbGxlZC0+dHlwZSA9IChsdlsxXSAmIDB4NzApID4+IDQ7CisKKwkvKiBvY3RldCA0Li5OICovCisJZ3NtNDhfZGVjb2RlX2JjZF9udW1iZXIoY2FsbGVkLT5udW1iZXIsIHNpemVvZihjYWxsZWQtPm51bWJlciksIGx2LCAxKTsKKworCXJldHVybiAwOworfQorCisvKiBlbmNvZGUgJ2NhbGxlZCBwYXJ0eSBCQ0QgbnVtYmVyJyAqLworaW50IGdzbTQ4X2VuY29kZV9jYWxsZWQoc3RydWN0IG1zZ2IgKm1zZywKKwkJCSBjb25zdCBzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyICpjYWxsZWQpCit7CisJdWludDhfdCBsdlsxOF07CisJaW50IHJldDsKKworCS8qIG9jdGV0IDMgKi8KKwlsdlsxXSA9IGNhbGxlZC0+cGxhbjsKKwlsdlsxXSB8PSBjYWxsZWQtPnR5cGUgPDwgNDsKKworCS8qIG9jdGV0IDQuLk4sIG9jdGV0IDIgKi8KKwlyZXQgPSBnc200OF9lbmNvZGVfYmNkX251bWJlcihsdiwgc2l6ZW9mKGx2KSwgMSwgY2FsbGVkLT5udW1iZXIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJbXNnYl90bHZfcHV0KG1zZywgR1NNNDhfSUVfQ0FMTEVEX0JDRCwgbHZbMF0sIGx2KzEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGRlY29kZSBjYWxsZXJpZCBvZiB2YXJpb3VzIElFcyAqLworaW50IGdzbTQ4X2RlY29kZV9jYWxsZXJpZChzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyICpjYWxsZXJpZCwKKwkJCSBjb25zdCB1aW50OF90ICpsdikKK3sKKwl1aW50OF90IGluX2xlbiA9IGx2WzBdOworCWludCBpID0gMTsKKworCWlmIChpbl9sZW4gPCAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIG9jdGV0IDMgKi8KKwljYWxsZXJpZC0+cGxhbiA9IGx2WzFdICYgMHgwZjsKKwljYWxsZXJpZC0+dHlwZSA9IChsdlsxXSAmIDB4NzApID4+IDQ7CisKKwkvKiBvY3RldCAzYSAqLworCWlmICghKGx2WzFdICYgMHg4MCkpIHsKKwkJY2FsbGVyaWQtPnNjcmVlbiA9IGx2WzJdICYgMHgwMzsKKwkJY2FsbGVyaWQtPnByZXNlbnQgPSAobHZbMl0gJiAweDYwKSA+PiA1OworCQlpID0gMjsKKwl9CisKKwkvKiBvY3RldCA0Li5OICovCisJZ3NtNDhfZGVjb2RlX2JjZF9udW1iZXIoY2FsbGVyaWQtPm51bWJlciwgc2l6ZW9mKGNhbGxlcmlkLT5udW1iZXIpLCBsdiwgaSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogZW5jb2RlIGNhbGxlcmlkIG9mIHZhcmlvdXMgSUVzICovCitpbnQgZ3NtNDhfZW5jb2RlX2NhbGxlcmlkKHN0cnVjdCBtc2diICptc2csIGludCBpZSwgaW50IG1heF9sZW4sCisJCQkgICBjb25zdCBzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyICpjYWxsZXJpZCkKK3sKKwl1aW50OF90IGx2W21heF9sZW4gLSAxXTsKKwlpbnQgaF9sZW4gPSAxOworCWludCByZXQ7CisKKwkvKiBvY3RldCAzICovCisJbHZbMV0gPSBjYWxsZXJpZC0+cGxhbjsKKwlsdlsxXSB8PSBjYWxsZXJpZC0+dHlwZSA8PCA0OworCisJaWYgKGNhbGxlcmlkLT5wcmVzZW50IHx8IGNhbGxlcmlkLT5zY3JlZW4pIHsKKwkJLyogb2N0ZXQgM2EgKi8KKwkJbHZbMl0gPSBjYWxsZXJpZC0+c2NyZWVuOworCQlsdlsyXSB8PSBjYWxsZXJpZC0+cHJlc2VudCA8PCA1OworCQlsdlsyXSB8PSAweDgwOworCQloX2xlbisrOworCX0gZWxzZQorCQlsdlsxXSB8PSAweDgwOworCisJLyogb2N0ZXQgNC4uTiwgb2N0ZXQgMiAqLworCXJldCA9IGdzbTQ4X2VuY29kZV9iY2RfbnVtYmVyKGx2LCBzaXplb2YobHYpLCBoX2xlbiwgY2FsbGVyaWQtPm51bWJlcik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwltc2diX3Rsdl9wdXQobXNnLCBpZSwgbHZbMF0sIGx2KzEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGRlY29kZSAnY2F1c2UnICovCitpbnQgZ3NtNDhfZGVjb2RlX2NhdXNlKHN0cnVjdCBnc21fbW5jY19jYXVzZSAqY2F1c2UsCisJCQljb25zdCB1aW50OF90ICpsdikKK3sKKwl1aW50OF90IGluX2xlbiA9IGx2WzBdOworCWludCBpOworCisJaWYgKGluX2xlbiA8IDIpCisJCXJldHVybiAtRUlOVkFMOworCisJY2F1c2UtPmRpYWdfbGVuID0gMDsKKworCS8qIG9jdGV0IDMgKi8KKwljYXVzZS0+bG9jYXRpb24gPSBsdlsxXSAmIDB4MGY7CisJY2F1c2UtPmNvZGluZyA9IChsdlsxXSAmIDB4NjApID4+IDU7CisKKwlpID0gMTsKKwlpZiAoIShsdltpXSAmIDB4ODApKSB7CisJCWkrKzsgLyogb2N0ZXQgM2EgKi8KKwkJaWYgKGluX2xlbiA8IGkrMSkKKwkJCXJldHVybiAwOworCQljYXVzZS0+cmVjID0gMTsKKwkJY2F1c2UtPnJlY192YWwgPSBsdltpXSAmIDB4N2Y7CisJfQorCWkrKzsKKworCS8qIG9jdGV0IDQgKi8KKwljYXVzZS0+dmFsdWUgPSBsdltpXSAmIDB4N2Y7CisJaSsrOworCisJaWYgKGluX2xlbiA8IGkpIC8qIG5vIGRpYWcgKi8KKwkJcmV0dXJuIDA7CisKKwlpZiAoaW5fbGVuIC0gKGktMSkgPiAzMikgLyogbWF4aW11bSAzMiBvY3RldHMgKi8KKwkJcmV0dXJuIDA7CisKKwkvKiBvY3RldCA1LU4gKi8KKwltZW1jcHkoY2F1c2UtPmRpYWcsIGx2ICsgaSwgaW5fbGVuIC0gKGktMSkpOworCWNhdXNlLT5kaWFnX2xlbiA9IGluX2xlbiAtIChpLTEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGVuY29kZSAnY2F1c2UnICovCitpbnQgZ3NtNDhfZW5jb2RlX2NhdXNlKHN0cnVjdCBtc2diICptc2csIGludCBsdl9vbmx5LAorCQkJY29uc3Qgc3RydWN0IGdzbV9tbmNjX2NhdXNlICpjYXVzZSkKK3sKKwl1aW50OF90IGx2WzMyKzRdOworCWludCBpOworCisJaWYgKGNhdXNlLT5kaWFnX2xlbiA+IDMyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIG9jdGV0IDMgKi8KKwlsdlsxXSA9IGNhdXNlLT5sb2NhdGlvbjsKKwlsdlsxXSB8PSBjYXVzZS0+Y29kaW5nIDw8IDU7CisKKwlpID0gMTsKKwlpZiAoY2F1c2UtPnJlYykgeworCQlpKys7IC8qIG9jdGV0IDNhICovCisJCWx2W2ldID0gY2F1c2UtPnJlY192YWw7CisJfQorCWx2W2ldIHw9IDB4ODA7IC8qIGVuZCBvZiBvY3RldCAzICovCisKKwkvKiBvY3RldCA0ICovCisJaSsrOworCWx2W2ldID0gMHg4MCB8IGNhdXNlLT52YWx1ZTsKKworCS8qIG9jdGV0IDUtTiAqLworCWlmIChjYXVzZS0+ZGlhZ19sZW4pIHsKKwkJbWVtY3B5KGx2ICsgaSwgY2F1c2UtPmRpYWcsIGNhdXNlLT5kaWFnX2xlbik7CisJCWkgKz0gY2F1c2UtPmRpYWdfbGVuOworCX0KKworCWx2WzBdID0gaTsKKwlpZiAobHZfb25seSkKKwkJbXNnYl9sdl9wdXQobXNnLCBsdlswXSwgbHYrMSk7CisJZWxzZQorCQltc2diX3Rsdl9wdXQobXNnLCBHU000OF9JRV9DQVVTRSwgbHZbMF0sIGx2KzEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGRlY29kZSAnY2FsbGluZyBudW1iZXInICovCitpbnQgZ3NtNDhfZGVjb2RlX2NhbGxpbmcoc3RydWN0IGdzbV9tbmNjX251bWJlciAqY2FsbGluZywKKwkJCSBjb25zdCB1aW50OF90ICpsdikKK3sKKwlyZXR1cm4gZ3NtNDhfZGVjb2RlX2NhbGxlcmlkKGNhbGxpbmcsIGx2KTsKK30KKworLyogZW5jb2RlICdjYWxsaW5nIG51bWJlcicgKi8KK2ludCBnc200OF9lbmNvZGVfY2FsbGluZyhzdHJ1Y3QgbXNnYiAqbXNnLCAKKwkJCSAgY29uc3Qgc3RydWN0IGdzbV9tbmNjX251bWJlciAqY2FsbGluZykKK3sKKwlyZXR1cm4gZ3NtNDhfZW5jb2RlX2NhbGxlcmlkKG1zZywgR1NNNDhfSUVfQ0FMTElOR19CQ0QsIDE0LCBjYWxsaW5nKTsKK30KKworLyogZGVjb2RlICdjb25uZWN0ZWQgbnVtYmVyJyAqLworaW50IGdzbTQ4X2RlY29kZV9jb25uZWN0ZWQoc3RydWN0IGdzbV9tbmNjX251bWJlciAqY29ubmVjdGVkLAorCQkJIGNvbnN0IHVpbnQ4X3QgKmx2KQoreworCXJldHVybiBnc200OF9kZWNvZGVfY2FsbGVyaWQoY29ubmVjdGVkLCBsdik7Cit9CisKKy8qIGVuY29kZSAnY29ubmVjdGVkIG51bWJlcicgKi8KK2ludCBnc200OF9lbmNvZGVfY29ubmVjdGVkKHN0cnVjdCBtc2diICptc2csCisJCQkgICAgY29uc3Qgc3RydWN0IGdzbV9tbmNjX251bWJlciAqY29ubmVjdGVkKQoreworCXJldHVybiBnc200OF9lbmNvZGVfY2FsbGVyaWQobXNnLCBHU000OF9JRV9DT05OX0JDRCwgMTQsIGNvbm5lY3RlZCk7Cit9CisKKy8qIGRlY29kZSAncmVkaXJlY3RpbmcgbnVtYmVyJyAqLworaW50IGdzbTQ4X2RlY29kZV9yZWRpcmVjdGluZyhzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyICpyZWRpcmVjdGluZywKKwkJCSBjb25zdCB1aW50OF90ICpsdikKK3sKKwlyZXR1cm4gZ3NtNDhfZGVjb2RlX2NhbGxlcmlkKHJlZGlyZWN0aW5nLCBsdik7Cit9CisKKy8qIGVuY29kZSAncmVkaXJlY3RpbmcgbnVtYmVyJyAqLworaW50IGdzbTQ4X2VuY29kZV9yZWRpcmVjdGluZyhzdHJ1Y3QgbXNnYiAqbXNnLAorCQkJICAgICAgY29uc3Qgc3RydWN0IGdzbV9tbmNjX251bWJlciAqcmVkaXJlY3RpbmcpCit7CisJcmV0dXJuIGdzbTQ4X2VuY29kZV9jYWxsZXJpZChtc2csIEdTTTQ4X0lFX1JFRElSX0JDRCwgMTksIHJlZGlyZWN0aW5nKTsKK30KKworLyogZGVjb2RlICdmYWNpbGl0eScgKi8KK2ludCBnc200OF9kZWNvZGVfZmFjaWxpdHkoc3RydWN0IGdzbV9tbmNjX2ZhY2lsaXR5ICpmYWNpbGl0eSwKKwkJCSAgIGNvbnN0IHVpbnQ4X3QgKmx2KQoreworCXVpbnQ4X3QgaW5fbGVuID0gbHZbMF07CisKKwlpZiAoaW5fbGVuIDwgMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoaW5fbGVuID4gc2l6ZW9mKGZhY2lsaXR5LT5pbmZvKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1jcHkoZmFjaWxpdHktPmluZm8sIGx2KzEsIGluX2xlbik7CisJZmFjaWxpdHktPmxlbiA9IGluX2xlbjsKKworCXJldHVybiAwOworfQorCisvKiBlbmNvZGUgJ2ZhY2lsaXR5JyAqLworaW50IGdzbTQ4X2VuY29kZV9mYWNpbGl0eShzdHJ1Y3QgbXNnYiAqbXNnLCBpbnQgbHZfb25seSwKKwkJCSAgIGNvbnN0IHN0cnVjdCBnc21fbW5jY19mYWNpbGl0eSAqZmFjaWxpdHkpCit7CisJdWludDhfdCBsdltHU01fTUFYX0ZBQ0lMSVRZICsgMV07CisKKwlpZiAoZmFjaWxpdHktPmxlbiA8IDEgfHwgZmFjaWxpdHktPmxlbiA+IEdTTV9NQVhfRkFDSUxJVFkpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtY3B5KGx2KzEsIGZhY2lsaXR5LT5pbmZvLCBmYWNpbGl0eS0+bGVuKTsKKwlsdlswXSA9IGZhY2lsaXR5LT5sZW47CisJaWYgKGx2X29ubHkpCisJCW1zZ2JfbHZfcHV0KG1zZywgbHZbMF0sIGx2KzEpOworCWVsc2UKKwkJbXNnYl90bHZfcHV0KG1zZywgR1NNNDhfSUVfRkFDSUxJVFksIGx2WzBdLCBsdisxKTsKKworCXJldHVybiAwOworfQorCisvKiBkZWNvZGUgJ25vdGlmeScgKi8KK2ludCBnc200OF9kZWNvZGVfbm90aWZ5KGludCAqbm90aWZ5LCBjb25zdCB1aW50OF90ICp2KQoreworCSpub3RpZnkgPSB2WzBdICYgMHg3ZjsKKworCXJldHVybiAwOworfQorCisvKiBlbmNvZGUgJ25vdGlmeScgKi8KK2ludCBnc200OF9lbmNvZGVfbm90aWZ5KHN0cnVjdCBtc2diICptc2csIGludCBub3RpZnkpCit7CisJbXNnYl92X3B1dChtc2csIG5vdGlmeSB8IDB4ODApOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGRlY29kZSAnc2lnbmFsJyAqLworaW50IGdzbTQ4X2RlY29kZV9zaWduYWwoaW50ICpzaWduYWwsIGNvbnN0IHVpbnQ4X3QgKnYpCit7CisJKnNpZ25hbCA9IHZbMF07CisKKwlyZXR1cm4gMDsKK30KKworLyogZW5jb2RlICdzaWduYWwnICovCitpbnQgZ3NtNDhfZW5jb2RlX3NpZ25hbChzdHJ1Y3QgbXNnYiAqbXNnLCBpbnQgc2lnbmFsKQoreworCW1zZ2JfdHZfcHV0KG1zZywgR1NNNDhfSUVfU0lHTkFMLCBzaWduYWwpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGRlY29kZSAna2V5cGFkJyAqLworaW50IGdzbTQ4X2RlY29kZV9rZXlwYWQoaW50ICprZXlwYWQsIGNvbnN0IHVpbnQ4X3QgKmx2KQoreworCXVpbnQ4X3QgaW5fbGVuID0gbHZbMF07CisKKwlpZiAoaW5fbGVuIDwgMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqa2V5cGFkID0gbHZbMV0gJiAweDdmOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGVuY29kZSAna2V5cGFkJyAqLworaW50IGdzbTQ4X2VuY29kZV9rZXlwYWQoc3RydWN0IG1zZ2IgKm1zZywgaW50IGtleXBhZCkKK3sKKwltc2diX3R2X3B1dChtc2csIEdTTTQ4X0lFX0tQRF9GQUNJTElUWSwga2V5cGFkKTsKKworCXJldHVybiAwOworfQorCisvKiBkZWNvZGUgJ3Byb2dyZXNzJyAqLworaW50IGdzbTQ4X2RlY29kZV9wcm9ncmVzcyhzdHJ1Y3QgZ3NtX21uY2NfcHJvZ3Jlc3MgKnByb2dyZXNzLAorCQkJICAgY29uc3QgdWludDhfdCAqbHYpCit7CisJdWludDhfdCBpbl9sZW4gPSBsdlswXTsKKworCWlmIChpbl9sZW4gPCAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXByb2dyZXNzLT5jb2RpbmcgPSAobHZbMV0gJiAweDYwKSA+PiA1OworCXByb2dyZXNzLT5sb2NhdGlvbiA9IGx2WzFdICYgMHgwZjsKKwlwcm9ncmVzcy0+ZGVzY3IgPSBsdlsyXSAmIDB4N2Y7CisKKwlyZXR1cm4gMDsKK30KKworLyogZW5jb2RlICdwcm9ncmVzcycgKi8KK2ludCBnc200OF9lbmNvZGVfcHJvZ3Jlc3Moc3RydWN0IG1zZ2IgKm1zZywgaW50IGx2X29ubHksCisJCQkgICBjb25zdCBzdHJ1Y3QgZ3NtX21uY2NfcHJvZ3Jlc3MgKnApCit7CisJdWludDhfdCBsdlszXTsKKworCWx2WzBdID0gMjsKKwlsdlsxXSA9IDB4ODAgfCAoKHAtPmNvZGluZyAmIDB4MykgPDwgNSkgfCAocC0+bG9jYXRpb24gJiAweGYpOworCWx2WzJdID0gMHg4MCB8IChwLT5kZXNjciAmIDB4N2YpOworCWlmIChsdl9vbmx5KQorCQltc2diX2x2X3B1dChtc2csIGx2WzBdLCBsdisxKTsKKwllbHNlCisJCW1zZ2JfdGx2X3B1dChtc2csIEdTTTQ4X0lFX1BST0dSX0lORCwgbHZbMF0sIGx2KzEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGRlY29kZSAndXNlci11c2VyJyAqLworaW50IGdzbTQ4X2RlY29kZV91c2VydXNlcihzdHJ1Y3QgZ3NtX21uY2NfdXNlcnVzZXIgKnV1LAorCQkJICAgY29uc3QgdWludDhfdCAqbHYpCit7CisJdWludDhfdCBpbl9sZW4gPSBsdlswXTsKKwljaGFyICppbmZvID0gdXUtPmluZm87CisJaW50IGluZm9fbGVuID0gc2l6ZW9mKHV1LT5pbmZvKTsKKwlpbnQgaTsKKworCWlmIChpbl9sZW4gPCAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXV1LT5wcm90byA9IGx2WzFdOworCisJZm9yIChpID0gMjsgaSA8PSBpbl9sZW47IGkrKykgeworCQlpbmZvX2xlbi0tOworCQlpZiAoaW5mb19sZW4gPD0gMSkKKwkJCWJyZWFrOworCQkqaW5mbysrID0gbHZbaV07CisJfQorCWlmIChpbmZvX2xlbiA+PSAxKQorCQkqaW5mbysrID0gJ1wwJzsKKworCXJldHVybiAwOworfQorCisvKiBlbmNvZGUgJ3VzZXJ1c2VyJyAqLworaW50IGdzbTQ4X2VuY29kZV91c2VydXNlcihzdHJ1Y3QgbXNnYiAqbXNnLCBpbnQgbHZfb25seSwKKwkJCSAgIGNvbnN0IHN0cnVjdCBnc21fbW5jY191c2VydXNlciAqdXUpCit7CisJdWludDhfdCBsdltHU01fTUFYX1VTRVJVU0VSICsgMl07CisKKwlpZiAoc3RybGVuKHV1LT5pbmZvKSA+IEdTTV9NQVhfVVNFUlVTRVIpCisJCXJldHVybiAtRUlOVkFMOworCisJbHZbMF0gPSAxICsgc3RybGVuKHV1LT5pbmZvKTsKKwlsdlsxXSA9IHV1LT5wcm90bzsKKwltZW1jcHkobHYgKyAyLCB1dS0+aW5mbywgc3RybGVuKHV1LT5pbmZvKSk7CisJaWYgKGx2X29ubHkpCisJCW1zZ2JfbHZfcHV0KG1zZywgbHZbMF0sIGx2KzEpOworCWVsc2UKKwkJbXNnYl90bHZfcHV0KG1zZywgR1NNNDhfSUVfVVNFUl9VU0VSLCBsdlswXSwgbHYrMSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogZGVjb2RlICdzcyB2ZXJzaW9uJyAqLworaW50IGdzbTQ4X2RlY29kZV9zc3ZlcnNpb24oc3RydWN0IGdzbV9tbmNjX3NzdmVyc2lvbiAqc3N2LAorCQkJICAgIGNvbnN0IHVpbnQ4X3QgKmx2KQoreworCXVpbnQ4X3QgaW5fbGVuID0gbHZbMF07CisKKwlpZiAoaW5fbGVuIDwgMSB8fCBpbl9sZW4gPCBzaXplb2Yoc3N2LT5pbmZvKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1jcHkoc3N2LT5pbmZvLCBsdiArIDEsIGluX2xlbik7CisJc3N2LT5sZW4gPSBpbl9sZW47CisKKwlyZXR1cm4gMDsKK30KKworLyogZW5jb2RlICdzcyB2ZXJzaW9uJyAqLworaW50IGdzbTQ4X2VuY29kZV9zc3ZlcnNpb24oc3RydWN0IG1zZ2IgKm1zZywKKwkJCSAgIGNvbnN0IHN0cnVjdCBnc21fbW5jY19zc3ZlcnNpb24gKnNzdikKK3sKKwl1aW50OF90IGx2W0dTTV9NQVhfU1NWRVJTSU9OICsgMV07CisKKwlpZiAoc3N2LT5sZW4gPiBHU01fTUFYX1NTVkVSU0lPTikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsdlswXSA9IHNzdi0+bGVuOworCW1lbWNweShsdiArIDEsIHNzdi0+aW5mbywgc3N2LT5sZW4pOworCW1zZ2JfdGx2X3B1dChtc2csIEdTTTQ4X0lFX1NTX1ZFUlMsIGx2WzBdLCBsdisxKTsKKworCXJldHVybiAwOworfQorCisvKiBkZWNvZGUgJ21vcmUgZGF0YScgZG9lcyBub3QgcmVxdWlyZSBhIGZ1bmN0aW9uLCBiZWNhdXNlIGl0IGhhcyBubyB2YWx1ZSAqLworCisvKiBlbmNvZGUgJ21vcmUgZGF0YScgKi8KK2ludCBnc200OF9lbmNvZGVfbW9yZShzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXVpbnQ4X3QgKmllOworCisJaWUgPSBtc2diX3B1dChtc2csIDEpOworCWllWzBdID0gR1NNNDhfSUVfTU9SRV9EQVRBOworCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL3NyYy9nc21fdXRpbHMuYyBiL2xpYm9zbW9jb3JlL3NyYy9nc21fdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzkyZmQzCi0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvc3JjL2dzbV91dGlscy5jCkBAIC0wLDAgKzEsMzc2IEBACisvKgorICogKEMpIDIwMDggYnkgRGFuaWVsIFdpbGxtYW5uIDxkYW5pZWxAdG90YWx1ZWJlcndhY2h1bmcuZGU+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOS0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKy8vI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS91dGlscy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlICIuLi9jb25maWcuaCIKKworLyogR1NNIDAzLjM4IDYuMi4xIENoYXJhY2h0ZXIgcGFja2luZyAqLworaW50IGdzbV83Yml0X2RlY29kZShjaGFyICp0ZXh0LCBjb25zdCB1aW50OF90ICp1c2VyX2RhdGEsIHVpbnQ4X3QgbGVuZ3RoKQoreworCWludCBpID0gMDsKKwlpbnQgbCA9IDA7CisKKyAgICAgICAgLyogRklYTUU6IFdlIG5lZWQgdG8gYWNjb3VudCBmb3IgdXNlciBkYXRhIGhlYWRlcnMgaGVyZSAqLworCWkgKz0gbDsKKwlmb3IgKDsgaSA8IGxlbmd0aDsgaSArKykKKwkJKih0ZXh0ICsrKSA9CisJCQkoKHVzZXJfZGF0YVsoaSAqIDcgKyA3KSA+PiAzXSA8PAorCQkJICAoNyAtICgoaSAqIDcgKyA3KSAmIDcpKSkgfAorCQkJICh1c2VyX2RhdGFbKGkgKiA3KSA+PiAzXSA+PgorCQkJICAoKGkgKiA3KSAmIDcpKSkgJiAweDdmOworCSp0ZXh0ID0gJ1wwJzsKKworCXJldHVybiBpIC0gbDsKK30KKworCisvKiBHU00gMDMuMzggNi4yLjEgQ2hhcmFjaHRlciBwYWNraW5nICovCitpbnQgZ3NtXzdiaXRfZW5jb2RlKHVpbnQ4X3QgKnJlc3VsdCwgY29uc3QgY2hhciAqZGF0YSkKK3sKKwlpbnQgaSxqID0gMDsKKwl1bnNpZ25lZCBjaGFyIGNoMSwgY2gyOworCWludCBzaGlmdCA9IDA7CisKKwlmb3IgKCBpPTA7IGk8c3RybGVuKGRhdGEpOyBpKysgKSB7CisKKwkJY2gxID0gZGF0YVtpXSAmIDB4N0Y7CisJCWNoMSA9IGNoMSA+PiBzaGlmdDsKKwkJY2gyID0gZGF0YVsoaSsxKV0gJiAweDdGOworCQljaDIgPSBjaDIgPDwgKDctc2hpZnQpOworCisJCWNoMSA9IGNoMSB8IGNoMjsKKworCQlyZXN1bHRbaisrXSA9IGNoMTsKKworCQlzaGlmdCsrOworCisJCWlmICgoc2hpZnQgPT0gNykgJiYgKGkrMTxzdHJsZW4oZGF0YSkpKSB7CisJCQlzaGlmdCA9IDA7CisJCQlpKys7CisJCX0KKwl9CisKKwlyZXR1cm4gaTsKK30KKworLyogZGV0ZXJtaW5lIHBvd2VyIGNvbnRyb2wgbGV2ZWwgZm9yIGdpdmVuIGRCbSB2YWx1ZSwgYXMgaW5kaWNhdGVkCisgKiBieSB0aGUgdGFibGVzIGluIGNoYXB0ZXIgNC4xLjEgb2YgR1NNIFRTIDA1LjA1ICovCitpbnQgbXNfcHdyX2N0bF9sdmwoZW51bSBnc21fYmFuZCBiYW5kLCB1bnNpZ25lZCBpbnQgZGJtKQoreworCXN3aXRjaCAoYmFuZCkgeworCWNhc2UgR1NNX0JBTkRfNDUwOgorCWNhc2UgR1NNX0JBTkRfNDgwOgorCWNhc2UgR1NNX0JBTkRfNzUwOgorCWNhc2UgR1NNX0JBTkRfOTAwOgorCWNhc2UgR1NNX0JBTkRfODEwOgorCWNhc2UgR1NNX0JBTkRfODUwOgorCQlpZiAoZGJtID49IDM5KQorCQkJcmV0dXJuIDA7CisJCWVsc2UgaWYgKGRibSA8IDUpCisJCQlyZXR1cm4gMTk7CisJCWVsc2UgeworCQkJLyogd2UgYXJlIGd1YXJhbnRlZWQgdG8gaGF2ZSAoNSA8PSBkYm0gPCAzOSkgKi8KKwkJCXJldHVybiAyICsgKCgzOSAtIGRibSkgLyAyKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEdTTV9CQU5EXzE4MDA6CisJCWlmIChkYm0gPj0gMzYpCisJCQlyZXR1cm4gMjk7CisJCWVsc2UgaWYgKGRibSA+PSAzNCkJCisJCQlyZXR1cm4gMzA7CisJCWVsc2UgaWYgKGRibSA+PSAzMikKKwkJCXJldHVybiAzMTsKKwkJZWxzZSBpZiAoZGJtID09IDMxKQorCQkJcmV0dXJuIDA7CisJCWVsc2UgeworCQkJLyogd2UgYXJlIGd1YXJhbnRlZWQgdG8gaGF2ZSAoMCA8PSBkYm0gPCAzMSkgKi8KKwkJCXJldHVybiAoMzAgLSBkYm0pIC8gMjsKKwkJfQorCQlicmVhazsKKwljYXNlIEdTTV9CQU5EXzE5MDA6CisJCWlmIChkYm0gPj0gMzMpCisJCQlyZXR1cm4gMzA7CisJCWVsc2UgaWYgKGRibSA+PSAzMikKKwkJCXJldHVybiAzMTsKKwkJZWxzZSBpZiAoZGJtID09IDMxKQorCQkJcmV0dXJuIDA7CisJCWVsc2UgeworCQkJLyogd2UgYXJlIGd1YXJhbnRlZWQgdG8gaGF2ZSAoMCA8PSBkYm0gPCAzMSkgKi8KKwkJCXJldHVybiAoMzAgLSBkYm0pIC8gMjsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK2ludCBtc19wd3JfZGJtKGVudW0gZ3NtX2JhbmQgYmFuZCwgdWludDhfdCBsdmwpCit7CisJbHZsICY9IDB4MWY7CisKKwlzd2l0Y2ggKGJhbmQpIHsKKwljYXNlIEdTTV9CQU5EXzQ1MDoKKwljYXNlIEdTTV9CQU5EXzQ4MDoKKwljYXNlIEdTTV9CQU5EXzc1MDoKKwljYXNlIEdTTV9CQU5EXzkwMDoKKwljYXNlIEdTTV9CQU5EXzgxMDoKKwljYXNlIEdTTV9CQU5EXzg1MDoKKwkJaWYgKGx2bCA8IDIpCisJCQlyZXR1cm4gMzk7CisJCWVsc2UgaWYgKGx2bCA8IDIwKQorCQkJcmV0dXJuIDM5IC0gKChsdmwgLSAyKSAqIDIpIDsKKwkJZWxzZQorCQkJcmV0dXJuIDU7CisJCWJyZWFrOworCWNhc2UgR1NNX0JBTkRfMTgwMDoKKwkJaWYgKGx2bCA8IDE2KQorCQkJcmV0dXJuIDMwIC0gKGx2bCAqIDIpOworCQllbHNlIGlmIChsdmwgPCAyOSkKKwkJCXJldHVybiAwOworCQllbHNlCisJCQlyZXR1cm4gMzYgLSAoKGx2bCAtIDI5KSAqIDIpOworCQlicmVhazsKKwljYXNlIEdTTV9CQU5EXzE5MDA6CisJCWlmIChsdmwgPCAxNikKKwkJCXJldHVybiAzMCAtIChsdmwgKiAyKTsKKwkJZWxzZSBpZiAobHZsIDwgMzApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZWxzZQorCQkJcmV0dXJuIDMzIC0gKGx2bCAtIDMwKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCisvKiBBY2NvcmRpbmcgdG8gVFMgMDguMDUgQ2hhcHRlciA4LjEuNCAqLworaW50IHJ4bGV2MmRibSh1aW50OF90IHJ4bGV2KQoreworCWlmIChyeGxldiA+IDYzKQorCQlyeGxldiA9IDYzOworCisJcmV0dXJuIC0xMTAgKyByeGxldjsKK30KKworLyogQWNjb3JkaW5nIHRvIFRTIDA4LjA1IENoYXB0ZXIgOC4xLjQgKi8KK3VpbnQ4X3QgZGJtMnJ4bGV2KGludCBkYm0pCit7CisJaW50IHJ4bGV2ID0gZGJtICsgMTEwOworCisJaWYgKHJ4bGV2ID4gNjMpCisJCXJ4bGV2ID0gNjM7CisJZWxzZSBpZiAocnhsZXYgPCAwKQorCQlyeGxldiA9IDA7CisKKwlyZXR1cm4gcnhsZXY7Cit9CisKK2NvbnN0IGNoYXIgKmdzbV9iYW5kX25hbWUoZW51bSBnc21fYmFuZCBiYW5kKQoreworCXN3aXRjaCAoYmFuZCkgeworCWNhc2UgR1NNX0JBTkRfNDUwOgorCQlyZXR1cm4gIkdTTTQ1MCI7CisJY2FzZSBHU01fQkFORF80ODA6CisJCXJldHVybiAiR1NNNDUwIjsKKwljYXNlIEdTTV9CQU5EXzc1MDoKKwkJcmV0dXJuICJHU003NTAiOworCWNhc2UgR1NNX0JBTkRfODEwOgorCQlyZXR1cm4gIkdTTTgxMCI7CisJY2FzZSBHU01fQkFORF84NTA6CisJCXJldHVybiAiR1NNODUwIjsKKwljYXNlIEdTTV9CQU5EXzkwMDoKKwkJcmV0dXJuICJHU005MDAiOworCWNhc2UgR1NNX0JBTkRfMTgwMDoKKwkJcmV0dXJuICJEQ1MxODAwIjsKKwljYXNlIEdTTV9CQU5EXzE5MDA6CisJCXJldHVybiAiUENTMTkwMCI7CisJfQorCXJldHVybiAiaW52YWxpZCI7Cit9CisKK2VudW0gZ3NtX2JhbmQgZ3NtX2JhbmRfcGFyc2UoY29uc3QgY2hhciogbWh6KQoreworCXdoaWxlICgqbWh6ICYmICFpc2RpZ2l0KCptaHopKQorCQltaHorKzsKKworCWlmICgqbWh6ID09ICdcMCcpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChzdHJ0b2wobWh6LCBOVUxMLCAxMCkpIHsKKwljYXNlIDQ1MDoKKwkJcmV0dXJuIEdTTV9CQU5EXzQ1MDsKKwljYXNlIDQ4MDoKKwkJcmV0dXJuIEdTTV9CQU5EXzQ4MDsKKwljYXNlIDc1MDoKKwkJcmV0dXJuIEdTTV9CQU5EXzc1MDsKKwljYXNlIDgxMDoKKwkJcmV0dXJuIEdTTV9CQU5EXzgxMDsKKwljYXNlIDg1MDoKKwkJcmV0dXJuIEdTTV9CQU5EXzg1MDsKKwljYXNlIDkwMDoKKwkJcmV0dXJuIEdTTV9CQU5EXzkwMDsKKwljYXNlIDE4MDA6CisJCXJldHVybiBHU01fQkFORF8xODAwOworCWNhc2UgMTkwMDoKKwkJcmV0dXJuIEdTTV9CQU5EXzE5MDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCisKKyNpZmRlZiBIQVZFX0VYRUNJTkZPX0gKKyNpbmNsdWRlIDxleGVjaW5mby5oPgordm9pZCBnZW5lcmF0ZV9iYWNrdHJhY2UoKQoreworCWludCBpLCBucHRyczsKKwl2b2lkICpidWZmZXJbMTAwXTsKKwljaGFyICoqc3RyaW5nczsKKworCW5wdHJzID0gYmFja3RyYWNlKGJ1ZmZlciwgQVJSQVlfU0laRShidWZmZXIpKTsKKwlwcmludGYoImJhY2t0cmFjZSgpIHJldHVybmVkICVkIGFkZHJlc3Nlc1xuIiwgbnB0cnMpOworCisJc3RyaW5ncyA9IGJhY2t0cmFjZV9zeW1ib2xzKGJ1ZmZlciwgbnB0cnMpOworCWlmICghc3RyaW5ncykKKwkJcmV0dXJuOworCisJZm9yIChpID0gMTsgaSA8IG5wdHJzOyBpKyspCisJCXByaW50ZigiJXNcbiIsIHN0cmluZ3NbaV0pOworCisJZnJlZShzdHJpbmdzKTsKK30KKyNlbmRpZgorCitlbnVtIGdzbV9iYW5kIGdzbV9hcmZjbjJiYW5kKHVpbnQxNl90IGFyZmNuKQoreworCWlmIChhcmZjbiAmIEFSRkNOX1BDUykKKwkJcmV0dXJuIEdTTV9CQU5EXzE5MDA7CisJZWxzZSBpZiAoYXJmY24gPD0gMTI0KQorCQlyZXR1cm4gR1NNX0JBTkRfOTAwOworCWVsc2UgaWYgKGFyZmNuID49IDk1NSAmJiBhcmZjbiA8PSAxMDIzKQorCQlyZXR1cm4gR1NNX0JBTkRfOTAwOworCWVsc2UgaWYgKGFyZmNuID49IDEyOCAmJiBhcmZjbiA8PSAyNTEpCisJCXJldHVybiBHU01fQkFORF84NTA7CisJZWxzZSBpZiAoYXJmY24gPj0gNTEyICYmIGFyZmNuIDw9IDg4NSkKKwkJcmV0dXJuIEdTTV9CQU5EXzE4MDA7CisJZWxzZSBpZiAoYXJmY24gPj0gMjU5ICYmIGFyZmNuIDw9IDI5MykKKwkJcmV0dXJuIEdTTV9CQU5EXzQ1MDsKKwllbHNlIGlmIChhcmZjbiA+PSAzMDYgJiYgYXJmY24gPD0gMzQwKQorCQlyZXR1cm4gR1NNX0JBTkRfNDgwOworCWVsc2UgaWYgKGFyZmNuID49IDM1MCAmJiBhcmZjbiA8PSA0MjUpCisJCXJldHVybiBHU01fQkFORF84MTA7CisJZWxzZSBpZiAoYXJmY24gPj0gNDM4ICYmIGFyZmNuIDw9IDUxMSkKKwkJcmV0dXJuIEdTTV9CQU5EXzc1MDsKKwllbHNlCisJCXJldHVybiBHU01fQkFORF8xODAwOworfQorCisvKiBDb252ZXJ0IGFuIEFSRkNOIHRvIHRoZSBmcmVxdWVuY3kgaW4gTUh6ICogMTAgKi8KK3VpbnQxNl90IGdzbV9hcmZjbjJmcmVxMTAodWludDE2X3QgYXJmY24sIGludCB1cGxpbmspCit7CisJdWludDE2X3QgZnJlcTEwX3VsOworCXVpbnQxNl90IGZyZXExMF9kbDsKKworCWlmIChhcmZjbiAmIEFSRkNOX1BDUykgeworCQkvKiBEQ1MgMTkwMCAqLworCQlhcmZjbiAmPSB+QVJGQ05fUENTOworCQlmcmVxMTBfdWwgPSAxODUwMiArIDIgKiAoYXJmY24tNTEyKTsKKwkJZnJlcTEwX2RsID0gZnJlcTEwX3VsICsgODAwOworCX0gZWxzZSBpZiAoYXJmY24gPD0gMTI0KSB7CisJCS8qIFByaW1hcnkgR1NNICsgQVJGQ04gMCBvZiBFLUdTTSAqLworCQlmcmVxMTBfdWwgPSA4OTAwICsgMiAqIGFyZmNuOworCQlmcmVxMTBfZGwgPSBmcmVxMTBfdWwgKyA0NTA7CisJfSBlbHNlIGlmIChhcmZjbiA+PSA5NTUgJiYgYXJmY24gPD0gMTAyMykgeworCQkvKiBFLUdTTSBhbmQgUi1HU00gKi8KKwkJZnJlcTEwX3VsID0gODkwMCArIDIgKiAoYXJmY24gLSAxMDI0KTsKKwkJZnJlcTEwX2RsID0gZnJlcTEwX3VsICsgNDUwOworCX0gZWxzZSBpZiAoYXJmY24gPj0gMTI4ICYmIGFyZmNuIDw9IDI1MSkgeworCQkvKiBHU00gODUwICovCisJCWZyZXExMF91bCA9IDgyNDIgKyAyICogKGFyZmNuIC0gMTI4KTsKKwkJZnJlcTEwX2RsID0gZnJlcTEwX3VsICsgNDUwOworCX0gZWxzZSBpZiAoYXJmY24gPj0gNTEyICYmIGFyZmNuIDw9IDg4NSkgeworCQkvKiBEQ1MgMTgwMCAqLworCQlmcmVxMTBfdWwgPSAxNzEwMiArIDIgKiAoYXJmY24gLSA1MTIpOworCQlmcmVxMTBfZGwgPSBmcmVxMTBfdWwgKyA5NTA7CisJfSBlbHNlIGlmIChhcmZjbiA+PSAyNTkgJiYgYXJmY24gPD0gMjkzKSB7CisJCS8qIEdTTSA0NTAgKi8KKwkJZnJlcTEwX3VsID0gNDUwNiArIDIgKiAoYXJmY24gLSAyNTkpOworCQlmcmVxMTBfZGwgPSBmcmVxMTBfdWwgKyAxMDA7CisJfSBlbHNlIGlmIChhcmZjbiA+PSAzMDYgJiYgYXJmY24gPD0gMzQwKSB7CisJCS8qIEdTTSA0ODAgKi8KKwkJZnJlcTEwX3VsID0gNDc5MCArIDIgKiAoYXJmY24gLSAzMDYpOworCQlmcmVxMTBfZGwgPSBmcmVxMTBfdWwgKyAxMDA7CisJfSBlbHNlIGlmIChhcmZjbiA+PSAzNTAgJiYgYXJmY24gPD0gNDI1KSB7CisJCS8qIEdTTSA4MTAgKi8KKwkJZnJlcTEwX3VsID0gODA2MCArIDIgKiAoYXJmY24gLSAzNTApOworCQlmcmVxMTBfZGwgPSBmcmVxMTBfdWwgKyA0NTA7CisJfSBlbHNlIGlmIChhcmZjbiA+PSA0MzggJiYgYXJmY24gPD0gNTExKSB7CisJCS8qIEdTTSA3NTAgKi8KKwkJZnJlcTEwX3VsID0gNzQ3MiArIDIgKiAoYXJmY24gLSA0MzgpOworCQlmcmVxMTBfZGwgPSBmcmVxMTBfdWwgKyAzMDA7CisJfSBlbHNlCisJCXJldHVybiAweGZmZmY7CisKKwlpZiAodXBsaW5rKQorCQlyZXR1cm4gZnJlcTEwX3VsOworCWVsc2UKKwkJcmV0dXJuIGZyZXExMF9kbDsKK30KKwordm9pZCBnc21fZm4yZ3NtdGltZShzdHJ1Y3QgZ3NtX3RpbWUgKnRpbWUsIHVpbnQzMl90IGZuKQoreworCXRpbWUtPmZuID0gZm47CisJdGltZS0+dDEgPSB0aW1lLT5mbiAvICgyNio1MSk7CisJdGltZS0+dDIgPSB0aW1lLT5mbiAlIDI2OworCXRpbWUtPnQzID0gdGltZS0+Zm4gJSA1MTsKKwl0aW1lLT50YyA9ICh0aW1lLT5mbiAvIDUxKSAlIDg7Cit9CisKK3VpbnQzMl90IGdzbV9nc210aW1lMmZuKHN0cnVjdCBnc21fdGltZSAqdGltZSkKK3sKKwkvKiBUUyAwNS4wMiBDaGFwdGVyIDQuMy4zIFRETUEgZnJhbWUgbnVtYmVyICovCisJcmV0dXJuICg1MSAqICgodGltZS0+dDMgLSB0aW1lLT50MiArIDI2KSAlIDI2KSArIHRpbWUtPnQzICsgKDI2ICogNTEgKiB0aW1lLT50MSkpOworfQorCisvKiBUUyAwMy4wMyBDaGFwdGVyIDIuNiAqLworaW50IGdwcnNfdGxsaV90eXBlKHVpbnQzMl90IHRsbGkpCit7CisJaWYgKCh0bGxpICYgMHhjMDAwMDAwMCkgPT0gMHhjMDAwMDAwMCkKKwkJcmV0dXJuIFRMTElfTE9DQUw7CisJZWxzZSBpZiAoKHRsbGkgJiAweGMwMDAwMDAwKSA9PSAweDgwMDAwMDAwKQorCQlyZXR1cm4gVExMSV9GT1JFSUdOOworCWVsc2UgaWYgKCh0bGxpICYgMHhmODAwMDAwMCkgPT0gMHg3ODAwMDAwMCkKKwkJcmV0dXJuIFRMTElfUkFORE9NOworCWVsc2UgaWYgKCh0bGxpICYgMHhmODAwMDAwMCkgPT0gMHg3MDAwMDAwMCkKKwkJcmV0dXJuIFRMTElfQVVYSUxJQVJZOworCisJcmV0dXJuIFRMTElfUkVTRVJWRUQ7Cit9CmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9zcmMvbG9nZ2luZy5jIGIvbGlib3Ntb2NvcmUvc3JjL2xvZ2dpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGMzMGRiCi0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvc3JjL2xvZ2dpbmcuYwpAQCAtMCwwICsxLDQxOSBAQAorLyogRGVidWdnaW5nL0xvZ2dpbmcgc3VwcG9ydCBjb2RlICovCisKKy8qIChDKSAyMDA4LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA4IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiLi4vY29uZmlnLmgiCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3V0aWxzLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbG9nZ2luZy5oPgorCitjb25zdCBzdHJ1Y3QgbG9nX2luZm8gKm9zbW9fbG9nX2luZm87CisKK3N0YXRpYyBzdHJ1Y3QgbG9nX2NvbnRleHQgbG9nX2NvbnRleHQ7CitzdGF0aWMgdm9pZCAqdGFsbF9sb2dfY3R4ID0gTlVMTDsKK3N0YXRpYyBMTElTVF9IRUFEKHRhcmdldF9saXN0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgbG9nbGV2ZWxfc3Ryc1tdID0geworCXsgMCwJCSJFVkVSWVRISU5HIiB9LAorCXsgTE9HTF9ERUJVRywJIkRFQlVHIiB9LAorCXsgTE9HTF9JTkZPLAkiSU5GTyIgfSwKKwl7IExPR0xfTk9USUNFLAkiTk9USUNFIiB9LAorCXsgTE9HTF9FUlJPUiwJIkVSUk9SIiB9LAorCXsgTE9HTF9GQVRBTCwJIkZBVEFMIiB9LAorCXsgMCwgTlVMTCB9LAorfTsKKworaW50IGxvZ19wYXJzZV9sZXZlbChjb25zdCBjaGFyICpsdmwpCit7CisJcmV0dXJuIGdldF9zdHJpbmdfdmFsdWUobG9nbGV2ZWxfc3RycywgbHZsKTsKK30KKworY29uc3QgY2hhciAqbG9nX2xldmVsX3N0cih1bnNpZ25lZCBpbnQgbHZsKQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKGxvZ2xldmVsX3N0cnMsIGx2bCk7Cit9CisKK2ludCBsb2dfcGFyc2VfY2F0ZWdvcnkoY29uc3QgY2hhciAqY2F0ZWdvcnkpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgb3Ntb19sb2dfaW5mby0+bnVtX2NhdDsgKytpKSB7CisJCWlmICghc3RyY2FzZWNtcChvc21vX2xvZ19pbmZvLT5jYXRbaV0ubmFtZSsxLCBjYXRlZ29yeSkpCisJCQlyZXR1cm4gaTsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoKKyAqIFBhcnNlIHRoZSBjYXRlZ29yeSBtYXNrLgorICogVGhlIGZvcm1hdCBjYW4gYmUgdGhpczogY2F0ZWdvcnkxOmNhdGVnb3J5MjpjYXRlZ29yeTMKKyAqIG9yIGNhdGVnb3J5MSwyOmNhdGVnb3J5MiwzOi4uLgorICovCit2b2lkIGxvZ19wYXJzZV9jYXRlZ29yeV9tYXNrKHN0cnVjdCBsb2dfdGFyZ2V0KiB0YXJnZXQsIGNvbnN0IGNoYXIgKl9tYXNrKQoreworCWludCBpID0gMDsKKwljaGFyICptYXNrID0gc3RyZHVwKF9tYXNrKTsKKwljaGFyICpjYXRlZ29yeV90b2tlbiA9IE5VTEw7CisKKwkvKiBEaXNhYmxlIGV2ZXJ5dGhpbmcgdG8gZW5hYmxlIGl0IGFmdGVyd2FyZHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0YXJnZXQtPmNhdGVnb3JpZXMpOyArK2kpCisJCXRhcmdldC0+Y2F0ZWdvcmllc1tpXS5lbmFibGVkID0gMDsKKworCWNhdGVnb3J5X3Rva2VuID0gc3RydG9rKG1hc2ssICI6Iik7CisJZG8geworCQlmb3IgKGkgPSAwOyBpIDwgb3Ntb19sb2dfaW5mby0+bnVtX2NhdDsgKytpKSB7CisJCQljaGFyKiBjb2xvbiA9IHN0cnN0cihjYXRlZ29yeV90b2tlbiwgIiwiKTsKKwkJCWludCBsZW5ndGggPSBzdHJsZW4oY2F0ZWdvcnlfdG9rZW4pOworCisJCQlpZiAoY29sb24pCisJCQkgICAgbGVuZ3RoID0gY29sb24gLSBjYXRlZ29yeV90b2tlbjsKKworCQkJaWYgKHN0cm5jYXNlY21wKG9zbW9fbG9nX2luZm8tPmNhdFtpXS5uYW1lLAorCQkJCQljYXRlZ29yeV90b2tlbiwgbGVuZ3RoKSA9PSAwKSB7CisJCQkJaW50IGxldmVsID0gMDsKKworCQkJCWlmIChjb2xvbikKKwkJCQkJbGV2ZWwgPSBhdG9pKGNvbG9uKzEpOworCisJCQkJdGFyZ2V0LT5jYXRlZ29yaWVzW2ldLmVuYWJsZWQgPSAxOworCQkJCXRhcmdldC0+Y2F0ZWdvcmllc1tpXS5sb2dsZXZlbCA9IGxldmVsOworCQkJfQorCQl9CisJfSB3aGlsZSAoKGNhdGVnb3J5X3Rva2VuID0gc3RydG9rKE5VTEwsICI6IikpKTsKKworCWZyZWUobWFzayk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBjb2xvcihpbnQgc3Vic3lzKQoreworCWlmIChzdWJzeXMgPCBvc21vX2xvZ19pbmZvLT5udW1fY2F0KQorCQlyZXR1cm4gb3Ntb19sb2dfaW5mby0+Y2F0W3N1YnN5c10uY29sb3I7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgX291dHB1dChzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyZ2V0LCB1bnNpZ25lZCBpbnQgc3Vic3lzLAorCQkgICAgY2hhciAqZmlsZSwgaW50IGxpbmUsIGludCBjb250LCBjb25zdCBjaGFyICpmb3JtYXQsCisJCSAgICB2YV9saXN0IGFwKQoreworCWNoYXIgY29sWzMwXTsKKwljaGFyIHN1YlszMF07CisJY2hhciB0aW1bMzBdOworCWNoYXIgYnVmWzQwOTZdOworCWNoYXIgZmluYWxbNDA5Nl07CisKKwkvKiBwcmVwYXJlIHRoZSBkYXRhICovCisJY29sWzBdID0gJ1wwJzsKKwlzdWJbMF0gPSAnXDAnOworCXRpbVswXSA9ICdcMCc7CisJYnVmWzBdID0gJ1wwJzsKKworCS8qIGFyZSB3ZSB1c2luZyBjb2xvciAqLworCWlmICh0YXJnZXQtPnVzZV9jb2xvcikgeworCQljb25zdCBjaGFyICpjID0gY29sb3Ioc3Vic3lzKTsKKwkJaWYgKGMpIHsKKwkJCXNucHJpbnRmKGNvbCwgc2l6ZW9mKGNvbCksICIlcyIsIGNvbG9yKHN1YnN5cykpOworCQkJY29sW3NpemVvZihjb2wpLTFdID0gJ1wwJzsKKwkJfQorCX0KKwl2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm9ybWF0LCBhcCk7CisJYnVmW3NpemVvZihidWYpLTFdID0gJ1wwJzsKKworCWlmICghY29udCkgeworCQlpZiAodGFyZ2V0LT5wcmludF90aW1lc3RhbXApIHsKKwkJCWNoYXIgKnRpbWVzdHI7CisJCQl0aW1lX3QgdG07CisJCQl0bSA9IHRpbWUoTlVMTCk7CisJCQl0aW1lc3RyID0gY3RpbWUoJnRtKTsKKwkJCXRpbWVzdHJbc3RybGVuKHRpbWVzdHIpLTFdID0gJ1wwJzsKKwkJCXNucHJpbnRmKHRpbSwgc2l6ZW9mKHRpbSksICIlcyAiLCB0aW1lc3RyKTsKKwkJCXRpbVtzaXplb2YodGltKS0xXSA9ICdcMCc7CisJCX0KKwkJc25wcmludGYoc3ViLCBzaXplb2Yoc3ViKSwgIjwlNC40eD4gJXM6JWQgIiwgc3Vic3lzLCBmaWxlLCBsaW5lKTsKKwkJc3ViW3NpemVvZihzdWIpLTFdID0gJ1wwJzsKKwl9CisKKwlzbnByaW50ZihmaW5hbCwgc2l6ZW9mKGZpbmFsKSwgIiVzJXMlcyVzXDAzM1swO20iLCBjb2wsIHRpbSwgc3ViLCBidWYpOworCWZpbmFsW3NpemVvZihmaW5hbCktMV0gPSAnXDAnOworCXRhcmdldC0+b3V0cHV0KHRhcmdldCwgZmluYWwpOworfQorCisKK3N0YXRpYyB2b2lkIF9sb2dwKHVuc2lnbmVkIGludCBzdWJzeXMsIGludCBsZXZlbCwgY2hhciAqZmlsZSwgaW50IGxpbmUsCisJCSAgaW50IGNvbnQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkKK3sKKwlzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodGFyLCAmdGFyZ2V0X2xpc3QsIGVudHJ5KSB7CisJCXN0cnVjdCBsb2dfY2F0ZWdvcnkgKmNhdGVnb3J5OworCQlpbnQgb3V0cHV0ID0gMDsKKworCQljYXRlZ29yeSA9ICZ0YXItPmNhdGVnb3JpZXNbc3Vic3lzXTsKKwkJLyogc3Vic3lzdGVtIGlzIG5vdCBzdXBwb3NlZCB0byBiZSBsb2dnZWQgKi8KKwkJaWYgKCFjYXRlZ29yeS0+ZW5hYmxlZCkKKwkJCWNvbnRpbnVlOworCisJCS8qIENoZWNrIHRoZSBnbG9iYWwgbG9nIGxldmVsICovCisJCWlmICh0YXItPmxvZ2xldmVsICE9IDAgJiYgbGV2ZWwgPCB0YXItPmxvZ2xldmVsKQorCQkJY29udGludWU7CisKKwkJLyogQ2hlY2sgdGhlIGNhdGVnb3J5IGxvZyBsZXZlbCAqLworCQlpZiAodGFyLT5sb2dsZXZlbCA9PSAwICYmIGNhdGVnb3J5LT5sb2dsZXZlbCAhPSAwICYmCisJCSAgICBsZXZlbCA8IGNhdGVnb3J5LT5sb2dsZXZlbCkKKwkJCWNvbnRpbnVlOworCisJCS8qIEFwcGx5IGZpbHRlcnMgaGVyZS4uLiBpZiB0aGF0IGJlY29tZXMgbWVzc3kgd2Ugd2lsbAorCQkgKiBuZWVkIHRvIHB1dCBmaWx0ZXJzIGluIGEgbGlzdCBhbmQgZWFjaCBmaWx0ZXIgd2lsbAorCQkgKiBzYXkgc3RvcCwgY29udGludWUsIG91dHB1dCAqLworCQlpZiAoKHRhci0+ZmlsdGVyX21hcCAmIExPR19GSUxURVJfQUxMKSAhPSAwKQorCQkJb3V0cHV0ID0gMTsKKwkJZWxzZSBpZiAob3Ntb19sb2dfaW5mby0+ZmlsdGVyX2ZuKQorCQkJb3V0cHV0ID0gb3Ntb19sb2dfaW5mby0+ZmlsdGVyX2ZuKCZsb2dfY29udGV4dCwKKwkJCQkJCSAgICAgICB0YXIpOworCisJCWlmIChvdXRwdXQpIHsKKwkJCS8qIEZJWE1FOiBjb3B5aW5nIHRoZSB2YV9saXN0IGlzIGFuIHVnbHkKKwkJCSAqIHdvcmthcm91bmQgYWdhaW5zdCBhIGJ1ZyBoaWRkZW4gc29tZXdoZXJlIGluCisJCQkgKiBfb3V0cHV0LiAgSWYgd2UgZG8gbm90IGNvcHkgaGVyZSwgdGhlIGZpcnN0CisJCQkgKiBjYWxsIHRvIF9vdXRwdXQoKSB3aWxsIGNvcnJ1cHQgdGhlIHZhX2xpc3QKKwkJCSAqIGNvbnRlbnRzLCBhbmQgYW55IGZ1cnRoZXIgX291dHB1dCgpIGNhbGxzCisJCQkgKiB3aXRoIHRoZSBzYW1lIHZhX2xpc3Qgd2lsbCBzZWdmYXVsdCAqLworCQkJdmFfbGlzdCBicDsKKwkJCXZhX2NvcHkoYnAsIGFwKTsKKwkJCV9vdXRwdXQodGFyLCBzdWJzeXMsIGZpbGUsIGxpbmUsIGNvbnQsIGZvcm1hdCwgYnApOworCQkJdmFfZW5kKGJwKTsKKwkJfQorCX0KK30KKwordm9pZCBsb2dwKHVuc2lnbmVkIGludCBzdWJzeXMsIGNoYXIgKmZpbGUsIGludCBsaW5lLCBpbnQgY29udCwKKwkgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgZm9ybWF0KTsKKwlfbG9ncChzdWJzeXMsIExPR0xfREVCVUcsIGZpbGUsIGxpbmUsIGNvbnQsIGZvcm1hdCwgYXApOworCXZhX2VuZChhcCk7Cit9CisKK3ZvaWQgbG9ncDIodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IGxldmVsLCBjaGFyICpmaWxlLCBpbnQgbGluZSwgaW50IGNvbnQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgZm9ybWF0KTsKKwlfbG9ncChzdWJzeXMsIGxldmVsLCBmaWxlLCBsaW5lLCBjb250LCBmb3JtYXQsIGFwKTsKKwl2YV9lbmQoYXApOworfQorCitzdGF0aWMgY2hhciBoZXhkX2J1ZmZbNDA5Nl07CisKK2NoYXIgKmhleGR1bXAoY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCWludCBpOworCWNoYXIgKmN1ciA9IGhleGRfYnVmZjsKKworCWhleGRfYnVmZlswXSA9IDA7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWludCBsZW5fcmVtYWluID0gc2l6ZW9mKGhleGRfYnVmZikgLSAoY3VyIC0gaGV4ZF9idWZmKTsKKwkJaW50IHJjID0gc25wcmludGYoY3VyLCBsZW5fcmVtYWluLCAiJTAyeCAiLCBidWZbaV0pOworCQlpZiAocmMgPD0gMCkKKwkJCWJyZWFrOworCQljdXIgKz0gcmM7CisJfQorCWhleGRfYnVmZltzaXplb2YoaGV4ZF9idWZmKS0xXSA9IDA7CisJcmV0dXJuIGhleGRfYnVmZjsKK30KKwordm9pZCBsb2dfYWRkX3RhcmdldChzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyZ2V0KQoreworCWxsaXN0X2FkZF90YWlsKCZ0YXJnZXQtPmVudHJ5LCAmdGFyZ2V0X2xpc3QpOworfQorCit2b2lkIGxvZ19kZWxfdGFyZ2V0KHN0cnVjdCBsb2dfdGFyZ2V0ICp0YXJnZXQpCit7CisJbGxpc3RfZGVsKCZ0YXJnZXQtPmVudHJ5KTsKK30KKwordm9pZCBsb2dfcmVzZXRfY29udGV4dCh2b2lkKQoreworCW1lbXNldCgmbG9nX2NvbnRleHQsIDAsIHNpemVvZihsb2dfY29udGV4dCkpOworfQorCitpbnQgbG9nX3NldF9jb250ZXh0KHVpbnQ4X3QgY3R4X25yLCB2b2lkICp2YWx1ZSkKK3sKKwlpZiAoY3R4X25yID4gTE9HX01BWF9DVFgpCisJCXJldHVybiAtRUlOVkFMOworCisJbG9nX2NvbnRleHQuY3R4W2N0eF9ucl0gPSB2YWx1ZTsKKworCXJldHVybiAwOworfQorCit2b2lkIGxvZ19zZXRfYWxsX2ZpbHRlcihzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyZ2V0LCBpbnQgYWxsKQoreworCWlmIChhbGwpCisJCXRhcmdldC0+ZmlsdGVyX21hcCB8PSBMT0dfRklMVEVSX0FMTDsKKwllbHNlCisJCXRhcmdldC0+ZmlsdGVyX21hcCAmPSB+TE9HX0ZJTFRFUl9BTEw7Cit9CisKK3ZvaWQgbG9nX3NldF91c2VfY29sb3Ioc3RydWN0IGxvZ190YXJnZXQgKnRhcmdldCwgaW50IHVzZV9jb2xvcikKK3sKKwl0YXJnZXQtPnVzZV9jb2xvciA9IHVzZV9jb2xvcjsKK30KKwordm9pZCBsb2dfc2V0X3ByaW50X3RpbWVzdGFtcChzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyZ2V0LCBpbnQgcHJpbnRfdGltZXN0YW1wKQoreworCXRhcmdldC0+cHJpbnRfdGltZXN0YW1wID0gcHJpbnRfdGltZXN0YW1wOworfQorCit2b2lkIGxvZ19zZXRfbG9nX2xldmVsKHN0cnVjdCBsb2dfdGFyZ2V0ICp0YXJnZXQsIGludCBsb2dfbGV2ZWwpCit7CisJdGFyZ2V0LT5sb2dsZXZlbCA9IGxvZ19sZXZlbDsKK30KKwordm9pZCBsb2dfc2V0X2NhdGVnb3J5X2ZpbHRlcihzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyZ2V0LCBpbnQgY2F0ZWdvcnksCisJCQkgICAgICAgaW50IGVuYWJsZSwgaW50IGxldmVsKQoreworCWlmIChjYXRlZ29yeSA+PSBvc21vX2xvZ19pbmZvLT5udW1fY2F0KQorCQlyZXR1cm47CisJdGFyZ2V0LT5jYXRlZ29yaWVzW2NhdGVnb3J5XS5lbmFibGVkID0gISFlbmFibGU7CisJdGFyZ2V0LT5jYXRlZ29yaWVzW2NhdGVnb3J5XS5sb2dsZXZlbCA9IGxldmVsOworfQorCisvKiBzaW5jZSBDODkvQzk5IHNheXMgc3RkZXJyIGlzIGEgbWFjcm8sIHdlIGNhbiBzYWZlbHkgZG8gdGhpcyEgKi8KKyNpZmRlZiBzdGRlcnIKK3N0YXRpYyB2b2lkIF9zdGRlcnJfb3V0cHV0KHN0cnVjdCBsb2dfdGFyZ2V0ICp0YXJnZXQsIGNvbnN0IGNoYXIgKmxvZykKK3sKKwlmcHJpbnRmKHRhcmdldC0+dGd0X3N0ZG91dC5vdXQsICIlcyIsIGxvZyk7CisJZmZsdXNoKHRhcmdldC0+dGd0X3N0ZG91dC5vdXQpOworfQorI2VuZGlmCisKK3N0cnVjdCBsb2dfdGFyZ2V0ICpsb2dfdGFyZ2V0X2NyZWF0ZSh2b2lkKQoreworCXN0cnVjdCBsb2dfdGFyZ2V0ICp0YXJnZXQ7CisJdW5zaWduZWQgaW50IGk7CisKKwl0YXJnZXQgPSB0YWxsb2NfemVybyh0YWxsX2xvZ19jdHgsIHN0cnVjdCBsb2dfdGFyZ2V0KTsKKwlpZiAoIXRhcmdldCkKKwkJcmV0dXJuIE5VTEw7CisKKwlJTklUX0xMSVNUX0hFQUQoJnRhcmdldC0+ZW50cnkpOworCisJLyogaW5pdGlhbGl6ZSB0aGUgcGVyLWNhdGVnb3J5IGVuYWJsZWQvbG9nbGV2ZWwgZnJvbSBkZWZhdWx0cyAqLworCWZvciAoaSA9IDA7IGkgPCBvc21vX2xvZ19pbmZvLT5udW1fY2F0OyBpKyspIHsKKwkJc3RydWN0IGxvZ19jYXRlZ29yeSAqY2F0ID0gJnRhcmdldC0+Y2F0ZWdvcmllc1tpXTsKKwkJY2F0LT5lbmFibGVkID0gb3Ntb19sb2dfaW5mby0+Y2F0W2ldLmVuYWJsZWQ7CisJCWNhdC0+bG9nbGV2ZWwgPSBvc21vX2xvZ19pbmZvLT5jYXRbaV0ubG9nbGV2ZWw7CisJfQorCisJLyogZ2xvYmFsIHNldHRpbmdzICovCisJdGFyZ2V0LT51c2VfY29sb3IgPSAxOworCXRhcmdldC0+cHJpbnRfdGltZXN0YW1wID0gMDsKKworCS8qIGdsb2JhbCBsb2cgbGV2ZWwgKi8KKwl0YXJnZXQtPmxvZ2xldmVsID0gMDsKKwlyZXR1cm4gdGFyZ2V0OworfQorCitzdHJ1Y3QgbG9nX3RhcmdldCAqbG9nX3RhcmdldF9jcmVhdGVfc3RkZXJyKHZvaWQpCit7CisvKiBzaW5jZSBDODkvQzk5IHNheXMgc3RkZXJyIGlzIGEgbWFjcm8sIHdlIGNhbiBzYWZlbHkgZG8gdGhpcyEgKi8KKyNpZmRlZiBzdGRlcnIKKwlzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyZ2V0OworCisJdGFyZ2V0ID0gbG9nX3RhcmdldF9jcmVhdGUoKTsKKwlpZiAoIXRhcmdldCkKKwkJcmV0dXJuIE5VTEw7CisKKwl0YXJnZXQtPnRndF9zdGRvdXQub3V0ID0gc3RkZXJyOworCXRhcmdldC0+b3V0cHV0ID0gX3N0ZGVycl9vdXRwdXQ7CisJcmV0dXJuIHRhcmdldDsKKyNlbHNlCisJcmV0dXJuIE5VTEw7CisjZW5kaWYgLyogc3RkZXJyICovCit9CisKK2NvbnN0IGNoYXIgKmxvZ192dHlfbGV2ZWxfc3RyaW5nKHN0cnVjdCBsb2dfaW5mbyAqaW5mbykKK3sKKwljb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nICp2czsKKwl1bnNpZ25lZCBpbnQgbGVuID0gMzsgLyogKClcMCAqLworCWNoYXIgKnN0cjsKKworCWZvciAodnMgPSBsb2dsZXZlbF9zdHJzOyB2cy0+dmFsdWUgfHwgdnMtPnN0cjsgdnMrKykKKwkJbGVuICs9IHN0cmxlbih2cy0+c3RyKSArIDE7CisKKwlzdHIgPSB0YWxsb2NfemVyb19zaXplKE5VTEwsIGxlbik7CisJaWYgKCFzdHIpCisJCXJldHVybiBOVUxMOworCisJc3RyWzBdID0gJygnOworCWZvciAodnMgPSBsb2dsZXZlbF9zdHJzOyB2cy0+dmFsdWUgfHwgdnMtPnN0cjsgdnMrKykgeworCQlzdHJjYXQoc3RyLCB2cy0+c3RyKTsKKwkJc3RyY2F0KHN0ciwgInwiKTsKKwl9CisJc3RyW3N0cmxlbihzdHIpLTFdID0gJyknOworCisJcmV0dXJuIHN0cjsKK30KKworY29uc3QgY2hhciAqbG9nX3Z0eV9jYXRlZ29yeV9zdHJpbmcoc3RydWN0IGxvZ19pbmZvICppbmZvKQoreworCXVuc2lnbmVkIGludCBsZW4gPSAzOwkvKiAiKClcMCIgKi8KKwl1bnNpZ25lZCBpbnQgaTsKKwljaGFyICpzdHI7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5mby0+bnVtX2NhdDsgaSsrKQorCQlsZW4gKz0gc3RybGVuKGluZm8tPmNhdFtpXS5uYW1lKSArIDE7CisKKwlzdHIgPSB0YWxsb2NfemVyb19zaXplKE5VTEwsIGxlbik7CisJaWYgKCFzdHIpCisJCXJldHVybiBOVUxMOworCisJc3RyWzBdID0gJygnOworCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5udW1fY2F0OyBpKyspIHsKKwkJc3RyY2F0KHN0ciwgaW5mby0+Y2F0W2ldLm5hbWUrMSk7CisJCXN0cmNhdChzdHIsICJ8Iik7CisJfQorCXN0cltzdHJsZW4oc3RyKS0xXSA9ICcpJzsKKworCXJldHVybiBzdHI7Cit9CisKK3ZvaWQgbG9nX2luaXQoY29uc3Qgc3RydWN0IGxvZ19pbmZvICpjYXQpCit7CisJdGFsbF9sb2dfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KE5VTEwsIDEsICJsb2dnaW5nIik7CisJb3Ntb19sb2dfaW5mbyA9IGNhdDsKK30KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL3NyYy9tc2diLmMgYi9saWJvc21vY29yZS9zcmMvbXNnYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MGUyZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9zcmMvbXNnYi5jCkBAIC0wLDAgKzEsOTAgQEAKKy8qIChDKSAyMDA4IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisvLyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisvLyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisKK3ZvaWQgKnRhbGxfbXNnYl9jdHg7CisKK3N0cnVjdCBtc2diICptc2diX2FsbG9jKHVpbnQxNl90IHNpemUsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IG1zZ2IgKm1zZzsKKworCW1zZyA9IF90YWxsb2NfemVybyh0YWxsX21zZ2JfY3R4LCBzaXplb2YoKm1zZykgKyBzaXplLCBuYW1lKTsKKworCWlmICghbXNnKSB7CisJCS8vTE9HUChEUlNMLCBMT0dMX0ZBVEFMLCAidW5hYmxlIHRvIGFsbG9jYXRlIG1zZ2JcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltc2ctPmRhdGFfbGVuID0gc2l6ZTsKKwltc2ctPmxlbiA9IDA7CisJbXNnLT5kYXRhID0gbXNnLT5fZGF0YTsKKwltc2ctPmhlYWQgPSBtc2ctPl9kYXRhOworCW1zZy0+dGFpbCA9IG1zZy0+X2RhdGE7CisKKwlyZXR1cm4gbXNnOworfQorCit2b2lkIG1zZ2JfZnJlZShzdHJ1Y3QgbXNnYiAqbSkKK3sKKwl0YWxsb2NfZnJlZShtKTsKK30KKwordm9pZCBtc2diX2VucXVldWUoc3RydWN0IGxsaXN0X2hlYWQgKnF1ZXVlLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCWxsaXN0X2FkZF90YWlsKCZtc2ctPmxpc3QsIHF1ZXVlKTsKK30KKworc3RydWN0IG1zZ2IgKm1zZ2JfZGVxdWV1ZShzdHJ1Y3QgbGxpc3RfaGVhZCAqcXVldWUpCit7CisJc3RydWN0IGxsaXN0X2hlYWQgKmxoOworCisJaWYgKGxsaXN0X2VtcHR5KHF1ZXVlKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlsaCA9IHF1ZXVlLT5uZXh0OworCWxsaXN0X2RlbChsaCk7CisJCisJcmV0dXJuIGxsaXN0X2VudHJ5KGxoLCBzdHJ1Y3QgbXNnYiwgbGlzdCk7Cit9CisKK3ZvaWQgbXNnYl9yZXNldChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCW1zZy0+bGVuID0gMDsKKwltc2ctPmRhdGEgPSBtc2ctPl9kYXRhOworCW1zZy0+aGVhZCA9IG1zZy0+X2RhdGE7CisJbXNnLT50YWlsID0gbXNnLT5fZGF0YTsKKworCW1zZy0+dHJ4ID0gTlVMTDsKKwltc2ctPmxjaGFuID0gTlVMTDsKKwltc2ctPmwyaCA9IE5VTEw7CisJbXNnLT5sM2ggPSBOVUxMOworCW1zZy0+bDRoID0gTlVMTDsKKworCW1lbXNldCgmbXNnLT5jYiwgMCwgc2l6ZW9mKG1zZy0+Y2IpKTsKK30KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL3NyYy9yYXRlX2N0ci5jIGIvbGlib3Ntb2NvcmUvc3JjL3JhdGVfY3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU4YjVjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm9zbW9jb3JlL3NyYy9yYXRlX2N0ci5jCkBAIC0wLDAgKzEsMTI4IEBACisvKiB1dGlsaXR5IHJvdXRpbmVzIGZvciBrZWVwaW5nIGNvbnRlcnMgYWJvdXQgZXZlbnRzIGFuZCB0aGUgZXZlbnQgcmF0ZXMgKi8KKworLyogKEMpIDIwMDktMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3V0aWxzLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGltZXIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9yYXRlX2N0ci5oPgorCitzdGF0aWMgTExJU1RfSEVBRChyYXRlX2N0cl9ncm91cHMpOworCitzdGF0aWMgdm9pZCAqdGFsbF9yYXRlX2N0cl9jdHg7CisKK3N0cnVjdCByYXRlX2N0cl9ncm91cCAqcmF0ZV9jdHJfZ3JvdXBfYWxsb2Modm9pZCAqY3R4LAorCQkJCQkgICAgY29uc3Qgc3RydWN0IHJhdGVfY3RyX2dyb3VwX2Rlc2MgKmRlc2MsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgaWR4KQoreworCXVuc2lnbmVkIGludCBzaXplOworCXN0cnVjdCByYXRlX2N0cl9ncm91cCAqZ3JvdXA7CisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCByYXRlX2N0cl9ncm91cCkgKworCQkJZGVzYy0+bnVtX2N0ciAqIHNpemVvZihzdHJ1Y3QgcmF0ZV9jdHIpOworCisJaWYgKCFjdHgpCisJCWN0eCA9IHRhbGxfcmF0ZV9jdHJfY3R4OworCisJZ3JvdXAgPSB0YWxsb2NfemVyb19zaXplKGN0eCwgc2l6ZSk7CisJaWYgKCFncm91cCkKKwkJcmV0dXJuIE5VTEw7CisKKwlncm91cC0+ZGVzYyA9IGRlc2M7CisJZ3JvdXAtPmlkeCA9IGlkeDsKKworCWxsaXN0X2FkZCgmZ3JvdXAtPmxpc3QsICZyYXRlX2N0cl9ncm91cHMpOworCisJcmV0dXJuIGdyb3VwOworfQorCit2b2lkIHJhdGVfY3RyX2dyb3VwX2ZyZWUoc3RydWN0IHJhdGVfY3RyX2dyb3VwICpncnApCit7CisJbGxpc3RfZGVsKCZncnAtPmxpc3QpOworCXRhbGxvY19mcmVlKGdycCk7Cit9CisKK3ZvaWQgcmF0ZV9jdHJfYWRkKHN0cnVjdCByYXRlX2N0ciAqY3RyLCBpbnQgaW5jKQoreworCWN0ci0+Y3VycmVudCArPSBpbmM7Cit9CisKK3N0YXRpYyB2b2lkIGludGVydmFsX2V4cGlyZWQoc3RydWN0IHJhdGVfY3RyICpjdHIsIGVudW0gcmF0ZV9jdHJfaW50diBpbnR2KQoreworCS8qIGNhbGN1bGF0ZSByYXRlIG92ZXIgbGFzdCBpbnRlcnZhbCAqLworCWN0ci0+aW50dltpbnR2XS5yYXRlID0gY3RyLT5jdXJyZW50IC0gY3RyLT5pbnR2W2ludHZdLmxhc3Q7CisJLyogc2F2ZSBjdXJyZW50IGNvdW50ZXIgZm9yIG5leHQgaW50ZXJ2YWwgKi8KKwljdHItPmludHZbaW50dl0ubGFzdCA9IGN0ci0+Y3VycmVudDsKKworCS8qIHVwZGF0ZSB0aGUgcmF0ZSBvZiB0aGUgbmV4dCBiaWdnZXIgaW50ZXJ2YWwuICBUaGlzIHdpbGwKKwkgKiBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoYXQgbmV4dCBsYXJnZXIgaW50ZXJ2YWwgZXhwaXJlcyAqLworCWlmIChpbnR2ICsgMSA8IEFSUkFZX1NJWkUoY3RyLT5pbnR2KSkKKwkJY3RyLT5pbnR2W2ludHYrMV0ucmF0ZSArPSBjdHItPmludHZbaW50dl0ucmF0ZTsKK30KKworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHJhdGVfY3RyX3RpbWVyOworc3RhdGljIHVpbnQ2NF90IHRpbWVyX3RpY2tzOworCisvKiBUaGUgb25lLXNlY29uZCBpbnRlcnZhbCBoYXMgZXhwaXJlZCAqLworc3RhdGljIHZvaWQgcmF0ZV9jdHJfZ3JvdXBfaW50dihzdHJ1Y3QgcmF0ZV9jdHJfZ3JvdXAgKmdycCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBncnAtPmRlc2MtPm51bV9jdHI7IGkrKykgeworCQlzdHJ1Y3QgcmF0ZV9jdHIgKmN0ciA9ICZncnAtPmN0cltpXTsKKworCQlpbnRlcnZhbF9leHBpcmVkKGN0ciwgUkFURV9DVFJfSU5UVl9TRUMpOworCQlpZiAoKHRpbWVyX3RpY2tzICUgNjApID09IDApCisJCQlpbnRlcnZhbF9leHBpcmVkKGN0ciwgUkFURV9DVFJfSU5UVl9NSU4pOworCQlpZiAoKHRpbWVyX3RpY2tzICUgKDYwKjYwKSkgPT0gMCkKKwkJCWludGVydmFsX2V4cGlyZWQoY3RyLCBSQVRFX0NUUl9JTlRWX0hPVVIpOworCQlpZiAoKHRpbWVyX3RpY2tzICUgKDI0KjYwKjYwKSkgPT0gMCkKKwkJCWludGVydmFsX2V4cGlyZWQoY3RyLCBSQVRFX0NUUl9JTlRWX0RBWSk7CisJfQorfQorCitzdGF0aWMgdm9pZCByYXRlX2N0cl90aW1lcl9jYih2b2lkICpkYXRhKQoreworCXN0cnVjdCByYXRlX2N0cl9ncm91cCAqY3RyZzsKKworCS8qIEluY3JlbWVudCBudW1iZXIgb2YgdGlja3MgYmVmb3JlIHdlIGNhbGN1bGF0ZSBpbnRlcnZhbHMsCisJICogYXMgYSBjb3VudGVyIHZhbHVlIG9mIDAgd291bGQgYWxyZWFkeSB3cmFwIGFsbCBjb3VudGVycyAqLworCXRpbWVyX3RpY2tzKys7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjdHJnLCAmcmF0ZV9jdHJfZ3JvdXBzLCBsaXN0KQorCQlyYXRlX2N0cl9ncm91cF9pbnR2KGN0cmcpOworCisJYnNjX3NjaGVkdWxlX3RpbWVyKCZyYXRlX2N0cl90aW1lciwgMSwgMCk7Cit9CisKK2ludCByYXRlX2N0cl9pbml0KHZvaWQgKnRhbGxfY3R4KQoreworCXRhbGxfcmF0ZV9jdHJfY3R4ID0gdGFsbF9jdHg7CisJcmF0ZV9jdHJfdGltZXIuY2IgPSByYXRlX2N0cl90aW1lcl9jYjsKKwlic2Nfc2NoZWR1bGVfdGltZXIoJnJhdGVfY3RyX3RpbWVyLCAxLCAwKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvc3JjL3JzbC5jIGIvbGlib3Ntb2NvcmUvc3JjL3JzbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMDJkMzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9zcmMvcnNsLmMKQEAgLTAsMCArMSwzMjkgQEAKKy8qIEdTTSBSYWRpbyBTaWduYWxsaW5nIExpbmsgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZSAKKyAqIDNHUFAgVFMgMDguNTggdmVyc2lvbiA4LjYuMCBSZWxlYXNlIDE5OTkgLyBFVFNJIFRTIDEwMCA1OTYgVjguNi4wICovCisKKy8qIChDKSAyMDA4LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGVycm5vLmg+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+CisKK3N0YXRpYyBjaGFyIG5hbWVidWZbMjU1XTsKK2NvbnN0IGNoYXIgKmdldF92YWx1ZV9zdHJpbmcoY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyAqdnMsIHVpbnQzMl90IHZhbCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7OyBpKyspIHsKKwkJaWYgKHZzW2ldLnZhbHVlID09IDAgJiYgdnNbaV0uc3RyID09IE5VTEwpCisJCQlicmVhazsKKwkJaWYgKHZzW2ldLnZhbHVlID09IHZhbCkKKwkJCXJldHVybiB2c1tpXS5zdHI7CisJfQorCisJc25wcmludGYobmFtZWJ1Ziwgc2l6ZW9mKG5hbWVidWYpLCAidW5rbm93biAweCV4IiwgdmFsKTsKKwlyZXR1cm4gbmFtZWJ1ZjsKK30KKworaW50IGdldF9zdHJpbmdfdmFsdWUoY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyAqdnMsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7OyBpKyspIHsKKwkJaWYgKHZzW2ldLnZhbHVlID09IDAgJiYgdnNbaV0uc3RyID09IE5VTEwpCisJCQlicmVhazsKKwkJaWYgKCFzdHJjYXNlY21wKHZzW2ldLnN0ciwgc3RyKSkKKwkJCXJldHVybiB2c1tpXS52YWx1ZTsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK2NoYXIgYmNkMmNoYXIodWludDhfdCBiY2QpCit7CisJaWYgKGJjZCA8IDB4YSkKKwkJcmV0dXJuICcwJyArIGJjZDsKKwllbHNlCisJCXJldHVybiAnQScgKyAoYmNkIC0gMHhhKTsKK30KKworLyogb25seSB3b3JrcyBmb3IgbnVtYmVycyBpbiBhc2NjaSAqLwordWludDhfdCBjaGFyMmJjZChjaGFyIGMpCit7CisJcmV0dXJuIGMgLSAweDMwOworfQpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvc3JjL3Z0eS9NYWtlZmlsZS5hbSBiL2xpYm9zbW9jb3JlL3NyYy92dHkvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMxMGEwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm9zbW9jb3JlL3NyYy92dHkvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMSBAQAorIyBUaGlzIGlzIF9OT1RfIHRoZSBsaWJyYXJ5IHJlbGVhc2UgdmVyc2lvbiwgaXQncyBhbiBBUEkgdmVyc2lvbi4KKyMgUGxlYXNlIHJlYWQgQ2hhcHRlciA2ICJMaWJyYXJ5IGludGVyZmFjZSB2ZXJzaW9ucyIgb2YgdGhlIGxpYnRvb2wgZG9jdW1lbnRhdGlvbiBiZWZvcmUgbWFraW5nIGFueSBtb2RpZmljYXRpb24KK0xJQlZFUlNJT049MDowOjAKKworSU5DTFVERVMgPSAkKGFsbF9pbmNsdWRlcykgLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUKK0FNX0NGTEFHUyA9IC1mUElDIC1XYWxsCisKK2xpYl9MVExJQlJBUklFUyA9IGxpYm9zbW92dHkubGEKKworbGlib3Ntb3Z0eV9sYV9TT1VSQ0VTID0gYnVmZmVyLmMgY29tbWFuZC5jIHZ0eS5jIHZlY3Rvci5jIHV0aWxzLmMgXAorCQkJdGVsbmV0X2ludGVyZmFjZS5jIGxvZ2dpbmdfdnR5LmMKZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL3NyYy92dHkvYnVmZmVyLmMgYi9saWJvc21vY29yZS9zcmMvdnR5L2J1ZmZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NjU1YjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9zcmMvdnR5L2J1ZmZlci5jCkBAIC0wLDAgKzEsNDYzIEBACisvKgorICogQnVmZmVyaW5nIG9mIG91dHB1dCBhbmQgaW5wdXQuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggS3VuaWhpcm8gSXNoaWd1cm8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgWmVicmEuCisgKgorICogR05VIFplYnJhIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBHTlUgWmVicmEgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBaZWJyYTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9zbW9jb20vdnR5L2J1ZmZlci5oPgorI2luY2x1ZGUgPG9zbW9jb20vdnR5L3Z0eS5oPgorCisvKiBCdWZmZXIgbWFzdGVyLiAqLworc3RydWN0IGJ1ZmZlciB7CisJLyogRGF0YSBsaXN0LiAqLworCXN0cnVjdCBidWZmZXJfZGF0YSAqaGVhZDsKKwlzdHJ1Y3QgYnVmZmVyX2RhdGEgKnRhaWw7CisKKwkvKiBTaXplIG9mIGVhY2ggYnVmZmVyX2RhdGEgY2h1bmsuICovCisJc2l6ZV90IHNpemU7Cit9OworCisvKiBEYXRhIGNvbnRhaW5lci4gKi8KK3N0cnVjdCBidWZmZXJfZGF0YSB7CisJc3RydWN0IGJ1ZmZlcl9kYXRhICpuZXh0OworCisJLyogTG9jYXRpb24gdG8gYWRkIG5ldyBkYXRhLiAqLworCXNpemVfdCBjcDsKKworCS8qIFBvaW50ZXIgdG8gZGF0YSBub3QgeWV0IGZsdXNoZWQuICovCisJc2l6ZV90IHNwOworCisJLyogQWN0dWFsIGRhdGEgc3RyZWFtICh2YXJpYWJsZSBsZW5ndGgpLiAqLworCXVuc2lnbmVkIGNoYXIgZGF0YVswXTsJLyogcmVhbCBkaW1lbnNpb24gaXMgYnVmZmVyLT5zaXplICovCit9OworCisvKiBJdCBzaG91bGQgYWx3YXlzIGJlIHRydWUgdGhhdDogMCA8PSBzcCA8PSBjcCA8PSBzaXplICovCisKKy8qIERlZmF1bHQgYnVmZmVyIHNpemUgKHVzZWQgaWYgbm9uZSBzcGVjaWZpZWQpLiAgSXQgaXMgcm91bmRlZCB1cCB0byB0aGUKKyAgIG5leHQgcGFnZSBib3VuZGVyeS4gKi8KKyNkZWZpbmUgQlVGRkVSX1NJWkVfREVGQVVMVAkJNDA5NgorCisjZGVmaW5lIEJVRkZFUl9EQVRBX0ZSRUUoRCkgdGFsbG9jX2ZyZWUoKEQpKQorCisvKiBNYWtlIG5ldyBidWZmZXIuICovCitzdHJ1Y3QgYnVmZmVyICpidWZmZXJfbmV3KHZvaWQgKmN0eCwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGJ1ZmZlciAqYjsKKworCWIgPSB0YWxsb2NfemVybyhjdHgsIHN0cnVjdCBidWZmZXIpOworCisJaWYgKHNpemUpCisJCWItPnNpemUgPSBzaXplOworCWVsc2UgeworCQlzdGF0aWMgc2l6ZV90IGRlZmF1bHRfc2l6ZTsKKwkJaWYgKCFkZWZhdWx0X3NpemUpIHsKKwkJCWxvbmcgcGdzeiA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTsKKwkJCWRlZmF1bHRfc2l6ZSA9CisJCQkgICAgKCgoKEJVRkZFUl9TSVpFX0RFRkFVTFQgLSAxKSAvIHBnc3opICsgMSkgKiBwZ3N6KTsKKwkJfQorCQliLT5zaXplID0gZGVmYXVsdF9zaXplOworCX0KKworCXJldHVybiBiOworfQorCisvKiBGcmVlIGJ1ZmZlci4gKi8KK3ZvaWQgYnVmZmVyX2ZyZWUoc3RydWN0IGJ1ZmZlciAqYikKK3sKKwlidWZmZXJfcmVzZXQoYik7CisJdGFsbG9jX2ZyZWUoYik7Cit9CisKKy8qIE1ha2Ugc3RyaW5nIGNsb25lLiAqLworY2hhciAqYnVmZmVyX2dldHN0cihzdHJ1Y3QgYnVmZmVyICpiKQoreworCXNpemVfdCB0b3RsZW4gPSAwOworCXN0cnVjdCBidWZmZXJfZGF0YSAqZGF0YTsKKwljaGFyICpzOworCWNoYXIgKnA7CisKKwlmb3IgKGRhdGEgPSBiLT5oZWFkOyBkYXRhOyBkYXRhID0gZGF0YS0+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/IEJVRkZFUl9QRU5ESU5HIDogQlVGRkVSX0VNUFRZOworfQpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvc3JjL3Z0eS9jb21tYW5kLmMgYi9saWJvc21vY29yZS9zcmMvdnR5L2NvbW1hbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWFmYTVjCi0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvc3JjL3Z0eS9jb21tYW5kLmMKQEAgLTAsMCArMSwzMTc3IEBACisvKgorICAgJElkOiBjb21tYW5kLmMsdiAxLjQ3IDIwMDUvMDQvMjUgMTY6MjY6NDIgcGF1bCBFeHAgJAorCisgICBDb21tYW5kIGludGVycHJldGVyIHJvdXRpbmUgZm9yIHZpcnR1YWwgdGVybWluYWwgW2FrYSBUZWxldFlwZV0KKyAgIENvcHlyaWdodCAoQykgMTk5NywgOTgsIDk5IEt1bmloaXJvIElzaGlndXJvCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBaZWJyYS4KKworR05VIFplYnJhIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCitieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91cgorb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworR05VIFplYnJhIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggR05VIFplYnJhOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKK0Jvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNkZWZpbmUgX1hPUEVOX1NPVVJDRQorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgPG9zbW9jb20vdnR5L3ZlY3Rvci5oPgorI2luY2x1ZGUgPG9zbW9jb20vdnR5L3Z0eS5oPgorI2luY2x1ZGUgPG9zbW9jb20vdnR5L2NvbW1hbmQuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisjZGVmaW5lIENPTkZJR0ZJTEVfTUFTSyAwMjIKKwordm9pZCAqdGFsbF92dHlfY21kX2N0eDsKKworLyogQ29tbWFuZCB2ZWN0b3Igd2hpY2ggaW5jbHVkZXMgc29tZSBsZXZlbCBvZiBjb21tYW5kIGxpc3RzLiBOb3JtYWxseQorICAgZWFjaCBkYWVtb24gbWFpbnRhaW5zIGVhY2ggb3duIGNtZHZlYy4gKi8KK3ZlY3RvciBjbWR2ZWM7CisKKy8qIEhvc3QgaW5mb3JtYXRpb24gc3RydWN0dXJlLiAqLworc3RydWN0IGhvc3QgaG9zdDsKKworLyogU3RhbmRhcmQgY29tbWFuZCBub2RlIHN0cnVjdHVyZXMuICovCitzdHJ1Y3QgY21kX25vZGUgYXV0aF9ub2RlID0geworCUFVVEhfTk9ERSwKKwkiUGFzc3dvcmQ6ICIsCit9OworCitzdHJ1Y3QgY21kX25vZGUgdmlld19ub2RlID0geworCVZJRVdfTk9ERSwKKwkiJXM+ICIsCit9OworCitzdHJ1Y3QgY21kX25vZGUgYXV0aF9lbmFibGVfbm9kZSA9IHsKKwlBVVRIX0VOQUJMRV9OT0RFLAorCSJQYXNzd29yZDogIiwKK307CisKK3N0cnVjdCBjbWRfbm9kZSBlbmFibGVfbm9kZSA9IHsKKwlFTkFCTEVfTk9ERSwKKwkiJXMjICIsCit9OworCitzdHJ1Y3QgY21kX25vZGUgY29uZmlnX25vZGUgPSB7CisJQ09ORklHX05PREUsCisJIiVzKGNvbmZpZykjICIsCisJMQorfTsKKworLyogRGVmYXVsdCBtb3RkIHN0cmluZy4gKi8KK2NvbnN0IGNoYXIgKmRlZmF1bHRfbW90ZCA9ICIiOworCisvKiBUaGlzIGlzIGNhbGxlZCBmcm9tIG1haW4gd2hlbiBhIGRhZW1vbiBpcyBpbnZva2VkIHdpdGggLXYgb3IgLS12ZXJzaW9uLiAqLwordm9pZCBwcmludF92ZXJzaW9uKGludCBwcmludF9jb3B5cmlnaHQpCit7CisJcHJpbnRmKCIlcyB2ZXJzaW9uICVzXG4iLCBob3N0LmFwcF9pbmZvLT5uYW1lLCBob3N0LmFwcF9pbmZvLT52ZXJzaW9uKTsKKwlpZiAocHJpbnRfY29weXJpZ2h0KQorCQlwcmludGYoIlxuJXNcbiIsIGhvc3QuYXBwX2luZm8tPmNvcHlyaWdodCk7Cit9CisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gdG8gY29uY2F0ZW5hdGUgYXJndiBhcmd1bWVudCBpbnRvIGEgc2luZ2xlIHN0cmluZworICAgd2l0aCBpbnNlcnRpbmcgJyAnIGNoYXJhY3RlciBiZXR3ZWVuIGVhY2ggYXJndW1lbnQuICAqLworY2hhciAqYXJndl9jb25jYXQoY29uc3QgY2hhciAqKmFyZ3YsIGludCBhcmdjLCBpbnQgc2hpZnQpCit7CisJaW50IGk7CisJc2l6ZV90IGxlbjsKKwljaGFyICpzdHI7CisJY2hhciAqcDsKKworCWxlbiA9IDA7CisJZm9yIChpID0gc2hpZnQ7IGkgPCBhcmdjOyBpKyspCisJCWxlbiArPSBzdHJsZW4oYXJndltpXSkgKyAxOworCWlmICghbGVuKQorCQlyZXR1cm4gTlVMTDsKKwlwID0gc3RyID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X2NtZF9jdHgsIGxlbiwgImFydmdfY29uY2F0Iik7CisJZm9yIChpID0gc2hpZnQ7IGkgPCBhcmdjOyBpKyspIHsKKwkJc2l6ZV90IGFyZ2xlbjsKKwkJbWVtY3B5KHAsIGFyZ3ZbaV0sIChhcmdsZW4gPSBzdHJsZW4oYXJndltpXSkpKTsKKwkJcCArPSBhcmdsZW47CisJCSpwKysgPSAnICc7CisJfQorCSoocCAtIDEpID0gJ1wwJzsKKwlyZXR1cm4gc3RyOworfQorCisvKiBJbnN0YWxsIHRvcCBub2RlIG9mIGNvbW1hbmQgdmVjdG9yLiAqLwordm9pZCBpbnN0YWxsX25vZGUoc3RydWN0IGNtZF9ub2RlICpub2RlLCBpbnQgKCpmdW5jKSAoc3RydWN0IHZ0eSAqKSkKK3sKKwl2ZWN0b3Jfc2V0X2luZGV4KGNtZHZlYywgbm9kZS0+bm9kZSwgbm9kZSk7CisJbm9kZS0+ZnVuYyA9IGZ1bmM7CisJbm9kZS0+Y21kX3ZlY3RvciA9IHZlY3Rvcl9pbml0KFZFQ1RPUl9NSU5fU0laRSk7Cit9CisKKy8qIENvbXBhcmUgdHdvIGNvbW1hbmQncyBzdHJpbmcuICBVc2VkIGluIHNvcnRfbm9kZSAoKS4gKi8KK3N0YXRpYyBpbnQgY21wX25vZGUoY29uc3Qgdm9pZCAqcCwgY29uc3Qgdm9pZCAqcSkKK3sKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKmEgPSAqKHN0cnVjdCBjbWRfZWxlbWVudCAqKilwOworCXN0cnVjdCBjbWRfZWxlbWVudCAqYiA9ICooc3RydWN0IGNtZF9lbGVtZW50ICoqKXE7CisKKwlyZXR1cm4gc3RyY21wKGEtPnN0cmluZywgYi0+c3RyaW5nKTsKK30KKworc3RhdGljIGludCBjbXBfZGVzYyhjb25zdCB2b2lkICpwLCBjb25zdCB2b2lkICpxKQoreworCXN0cnVjdCBkZXNjICphID0gKihzdHJ1Y3QgZGVzYyAqKilwOworCXN0cnVjdCBkZXNjICpiID0gKihzdHJ1Y3QgZGVzYyAqKilxOworCisJcmV0dXJuIHN0cmNtcChhLT5jbWQsIGItPmNtZCk7Cit9CisKKy8qIFNvcnQgZWFjaCBub2RlJ3MgY29tbWFuZCBlbGVtZW50IGFjY29yZGluZyB0byBjb21tYW5kIHN0cmluZy4gKi8KK3ZvaWQgc29ydF9ub2RlKCkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgajsKKwlzdHJ1Y3QgY21kX25vZGUgKmNub2RlOworCXZlY3RvciBkZXNjdmVjOworCXN0cnVjdCBjbWRfZWxlbWVudCAqY21kX2VsZW1lbnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWR2ZWMpOyBpKyspCisJCWlmICgoY25vZGUgPSB2ZWN0b3Jfc2xvdChjbWR2ZWMsIGkpKSAhPSBOVUxMKSB7CisJCQl2ZWN0b3IgY21kX3ZlY3RvciA9IGNub2RlLT5jbWRfdmVjdG9yOworCQkJcXNvcnQoY21kX3ZlY3Rvci0+aW5kZXgsIHZlY3Rvcl9hY3RpdmUoY21kX3ZlY3RvciksCisJCQkgICAgICBzaXplb2Yodm9pZCAqKSwgY21wX25vZGUpOworCisJCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShjbWRfdmVjdG9yKTsgaisrKQorCQkJCWlmICgoY21kX2VsZW1lbnQgPQorCQkJCSAgICAgdmVjdG9yX3Nsb3QoY21kX3ZlY3RvciwgaikpICE9IE5VTEwKKwkJCQkgICAgJiYgdmVjdG9yX2FjdGl2ZShjbWRfZWxlbWVudC0+c3RydmVjKSkgeworCQkJCQlkZXNjdmVjID0KKwkJCQkJICAgIHZlY3Rvcl9zbG90KGNtZF9lbGVtZW50LT5zdHJ2ZWMsCisJCQkJCQkJdmVjdG9yX2FjdGl2ZQorCQkJCQkJCShjbWRfZWxlbWVudC0+c3RydmVjKSAtCisJCQkJCQkJMSk7CisJCQkJCXFzb3J0KGRlc2N2ZWMtPmluZGV4LAorCQkJCQkgICAgICB2ZWN0b3JfYWN0aXZlKGRlc2N2ZWMpLAorCQkJCQkgICAgICBzaXplb2Yodm9pZCAqKSwgY21wX2Rlc2MpOworCQkJCX0KKwkJfQorfQorCisvKiBCcmVha2luZyB1cCBzdHJpbmcgaW50byBlYWNoIGNvbW1hbmQgcGllY2UuIEkgYXNzdW1lIGdpdmVuCisgICBjaGFyYWN0ZXIgaXMgc2VwYXJhdGVkIGJ5IGEgc3BhY2UgY2hhcmFjdGVyLiBSZXR1cm4gdmFsdWUgaXMgYQorICAgdmVjdG9yIHdoaWNoIGluY2x1ZGVzIGNoYXIgKiogZGF0YSBlbGVtZW50LiAqLwordmVjdG9yIGNtZF9tYWtlX3N0cnZlYyhjb25zdCBjaGFyICpzdHJpbmcpCit7CisJY29uc3QgY2hhciAqY3AsICpzdGFydDsKKwljaGFyICp0b2tlbjsKKwlpbnQgc3RybGVuOworCXZlY3RvciBzdHJ2ZWM7CisKKwlpZiAoc3RyaW5nID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJY3AgPSBzdHJpbmc7CisKKwkvKiBTa2lwIHdoaXRlIHNwYWNlcy4gKi8KKwl3aGlsZSAoaXNzcGFjZSgoaW50KSpjcCkgJiYgKmNwICE9ICdcMCcpCisJCWNwKys7CisKKwkvKiBSZXR1cm4gaWYgdGhlcmUgaXMgb25seSB3aGl0ZSBzcGFjZXMgKi8KKwlpZiAoKmNwID09ICdcMCcpCisJCXJldHVybiBOVUxMOworCisJaWYgKCpjcCA9PSAnIScgfHwgKmNwID09ICcjJykKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBQcmVwYXJlIHJldHVybiB2ZWN0b3IuICovCisJc3RydmVjID0gdmVjdG9yX2luaXQoVkVDVE9SX01JTl9TSVpFKTsKKworCS8qIENvcHkgZWFjaCBjb21tYW5kIHBpZWNlIGFuZCBzZXQgaW50byB2ZWN0b3IuICovCisJd2hpbGUgKDEpIHsKKwkJc3RhcnQgPSBjcDsKKwkJd2hpbGUgKCEoaXNzcGFjZSgoaW50KSpjcCkgfHwgKmNwID09ICdccicgfHwgKmNwID09ICdcbicpICYmCisJCSAgICAgICAqY3AgIT0gJ1wwJykKKwkJCWNwKys7CisJCXN0cmxlbiA9IGNwIC0gc3RhcnQ7CisJCXRva2VuID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X2NtZF9jdHgsIHN0cmxlbiArIDEsICJtYWtlX3N0cnZlYyIpOworCQltZW1jcHkodG9rZW4sIHN0YXJ0LCBzdHJsZW4pOworCQkqKHRva2VuICsgc3RybGVuKSA9ICdcMCc7CisJCXZlY3Rvcl9zZXQoc3RydmVjLCB0b2tlbik7CisKKwkJd2hpbGUgKChpc3NwYWNlKChpbnQpKmNwKSB8fCAqY3AgPT0gJ1xuJyB8fCAqY3AgPT0gJ1xyJykgJiYKKwkJICAgICAgICpjcCAhPSAnXDAnKQorCQkJY3ArKzsKKworCQlpZiAoKmNwID09ICdcMCcpCisJCQlyZXR1cm4gc3RydmVjOworCX0KK30KKworLyogRnJlZSBhbGxvY2F0ZWQgc3RyaW5nIHZlY3Rvci4gKi8KK3ZvaWQgY21kX2ZyZWVfc3RydmVjKHZlY3RvciB2KQoreworCXVuc2lnbmVkIGludCBpOworCWNoYXIgKmNwOworCisJaWYgKCF2KQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2KTsgaSsrKQorCQlpZiAoKGNwID0gdmVjdG9yX3Nsb3QodiwgaSkpICE9IE5VTEwpCisJCQl0YWxsb2NfZnJlZShjcCk7CisKKwl2ZWN0b3JfZnJlZSh2KTsKK30KKworLyogRmV0Y2ggbmV4dCBkZXNjcmlwdGlvbi4gIFVzZWQgaW4gY21kX21ha2VfZGVzY3ZlYygpLiAqLworc3RhdGljIGNoYXIgKmNtZF9kZXNjX3N0cihjb25zdCBjaGFyICoqc3RyaW5nKQoreworCWNvbnN0IGNoYXIgKmNwLCAqc3RhcnQ7CisJY2hhciAqdG9rZW47CisJaW50IHN0cmxlbjsKKworCWNwID0gKnN0cmluZzsKKworCWlmIChjcCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIFNraXAgd2hpdGUgc3BhY2VzLiAqLworCXdoaWxlIChpc3NwYWNlKChpbnQpKmNwKSAmJiAqY3AgIT0gJ1wwJykKKwkJY3ArKzsKKworCS8qIFJldHVybiBpZiB0aGVyZSBpcyBvbmx5IHdoaXRlIHNwYWNlcyAqLworCWlmICgqY3AgPT0gJ1wwJykKKwkJcmV0dXJuIE5VTEw7CisKKwlzdGFydCA9IGNwOworCisJd2hpbGUgKCEoKmNwID09ICdccicgfHwgKmNwID09ICdcbicpICYmICpjcCAhPSAnXDAnKQorCQljcCsrOworCisJc3RybGVuID0gY3AgLSBzdGFydDsKKwl0b2tlbiA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV9jbWRfY3R4LCBzdHJsZW4gKyAxLCAiY21kX2Rlc2Nfc3RyIik7CisJbWVtY3B5KHRva2VuLCBzdGFydCwgc3RybGVuKTsKKwkqKHRva2VuICsgc3RybGVuKSA9ICdcMCc7CisKKwkqc3RyaW5nID0gY3A7CisKKwlyZXR1cm4gdG9rZW47Cit9CisKKy8qIE5ldyBzdHJpbmcgdmVjdG9yLiAqLworc3RhdGljIHZlY3RvciBjbWRfbWFrZV9kZXNjdmVjKGNvbnN0IGNoYXIgKnN0cmluZywgY29uc3QgY2hhciAqZGVzY3N0cikKK3sKKwlpbnQgbXVsdGlwbGUgPSAwOworCWNvbnN0IGNoYXIgKnNwOworCWNoYXIgKnRva2VuOworCWludCBsZW47CisJY29uc3QgY2hhciAqY3A7CisJY29uc3QgY2hhciAqZHA7CisJdmVjdG9yIGFsbHZlYzsKKwl2ZWN0b3Igc3RydmVjID0gTlVMTDsKKwlzdHJ1Y3QgZGVzYyAqZGVzYzsKKworCWNwID0gc3RyaW5nOworCWRwID0gZGVzY3N0cjsKKworCWlmIChjcCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWFsbHZlYyA9IHZlY3Rvcl9pbml0KFZFQ1RPUl9NSU5fU0laRSk7CisKKwl3aGlsZSAoMSkgeworCQl3aGlsZSAoaXNzcGFjZSgoaW50KSpjcCkgJiYgKmNwICE9ICdcMCcpCisJCQljcCsrOworCisJCWlmICgqY3AgPT0gJygnKSB7CisJCQltdWx0aXBsZSA9IDE7CisJCQljcCsrOworCQl9CisJCWlmICgqY3AgPT0gJyknKSB7CisJCQltdWx0aXBsZSA9IDA7CisJCQljcCsrOworCQl9CisJCWlmICgqY3AgPT0gJ3wnKSB7CisJCQlpZiAoIW11bHRpcGxlKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJDb21tYW5kIHBhcnNlIGVycm9yITogJXNcbiIsCisJCQkJCXN0cmluZyk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCWNwKys7CisJCX0KKworCQl3aGlsZSAoaXNzcGFjZSgoaW50KSpjcCkgJiYgKmNwICE9ICdcMCcpCisJCQljcCsrOworCisJCWlmICgqY3AgPT0gJygnKSB7CisJCQltdWx0aXBsZSA9IDE7CisJCQljcCsrOworCQl9CisKKwkJaWYgKCpjcCA9PSAnXDAnKQorCQkJcmV0dXJuIGFsbHZlYzsKKworCQlzcCA9IGNwOworCisJCXdoaWxlICghCisJCSAgICAgICAoaXNzcGFjZSgoaW50KSpjcCkgfHwgKmNwID09ICdccicgfHwgKmNwID09ICdcbicKKwkJCXx8ICpjcCA9PSAnKScgfHwgKmNwID09ICd8JykgJiYgKmNwICE9ICdcMCcpCisJCQljcCsrOworCisJCWxlbiA9IGNwIC0gc3A7CisKKwkJdG9rZW4gPSBfdGFsbG9jX3plcm8odGFsbF92dHlfY21kX2N0eCwgbGVuICsgMSwgImNtZF9tYWtlX2Rlc2N2ZWMiKTsKKwkJbWVtY3B5KHRva2VuLCBzcCwgbGVuKTsKKwkJKih0b2tlbiArIGxlbikgPSAnXDAnOworCisJCWRlc2MgPSB0YWxsb2NfemVybyh0YWxsX3Z0eV9jbWRfY3R4LCBzdHJ1Y3QgZGVzYyk7CisJCWRlc2MtPmNtZCA9IHRva2VuOworCQlkZXNjLT5zdHIgPSBjbWRfZGVzY19zdHIoJmRwKTsKKworCQlpZiAobXVsdGlwbGUpIHsKKwkJCWlmIChtdWx0aXBsZSA9PSAxKSB7CisJCQkJc3RydmVjID0gdmVjdG9yX2luaXQoVkVDVE9SX01JTl9TSVpFKTsKKwkJCQl2ZWN0b3Jfc2V0KGFsbHZlYywgc3RydmVjKTsKKwkJCX0KKwkJCW11bHRpcGxlKys7CisJCX0gZWxzZSB7CisJCQlzdHJ2ZWMgPSB2ZWN0b3JfaW5pdChWRUNUT1JfTUlOX1NJWkUpOworCQkJdmVjdG9yX3NldChhbGx2ZWMsIHN0cnZlYyk7CisJCX0KKwkJdmVjdG9yX3NldChzdHJ2ZWMsIGRlc2MpOworCX0KK30KKworLyogQ291bnQgbWFuZGFudG9yeSBzdHJpbmcgdmVjdG9yIHNpemUuICBUaGlzIGlzIHRvIGRldGVybWluZSBpbnB1dGVkCisgICBjb21tYW5kIGhhcyBlbm91Z2ggY29tbWFuZCBsZW5ndGguICovCitzdGF0aWMgaW50IGNtZF9jbWRzaXplKHZlY3RvciBzdHJ2ZWMpCit7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHNpemUgPSAwOworCXZlY3RvciBkZXNjdmVjOworCXN0cnVjdCBkZXNjICpkZXNjOworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoc3RydmVjKTsgaSsrKQorCQlpZiAoKGRlc2N2ZWMgPSB2ZWN0b3Jfc2xvdChzdHJ2ZWMsIGkpKSAhPSBOVUxMKSB7CisJCQlpZiAoKHZlY3Rvcl9hY3RpdmUoZGVzY3ZlYykpID09IDEKKwkJCSAgICAmJiAoZGVzYyA9IHZlY3Rvcl9zbG90KGRlc2N2ZWMsIDApKSAhPSBOVUxMKSB7CisJCQkJaWYgKGRlc2MtPmNtZCA9PSBOVUxMIHx8IENNRF9PUFRJT04oZGVzYy0+Y21kKSkKKwkJCQkJcmV0dXJuIHNpemU7CisJCQkJZWxzZQorCQkJCQlzaXplKys7CisJCQl9IGVsc2UKKwkJCQlzaXplKys7CisJCX0KKwlyZXR1cm4gc2l6ZTsKK30KKworLyogUmV0dXJuIHByb21wdCBjaGFyYWN0ZXIgb2Ygc3BlY2lmaWVkIG5vZGUuICovCitjb25zdCBjaGFyICpjbWRfcHJvbXB0KGVudW0gbm9kZV90eXBlIG5vZGUpCit7CisJc3RydWN0IGNtZF9ub2RlICpjbm9kZTsKKworCWNub2RlID0gdmVjdG9yX3Nsb3QoY21kdmVjLCBub2RlKTsKKwlyZXR1cm4gY25vZGUtPnByb21wdDsKK30KKworLyogSW5zdGFsbCBhIGNvbW1hbmQgaW50byBhIG5vZGUuICovCit2b2lkIGluc3RhbGxfZWxlbWVudChlbnVtIG5vZGVfdHlwZSBudHlwZSwgc3RydWN0IGNtZF9lbGVtZW50ICpjbWQpCit7CisJc3RydWN0IGNtZF9ub2RlICpjbm9kZTsKKworCWNub2RlID0gdmVjdG9yX3Nsb3QoY21kdmVjLCBudHlwZSk7CisKKwlpZiAoY25vZGUgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJDb21tYW5kIG5vZGUgJWQgZG9lc24ndCBleGlzdCwgcGxlYXNlIGNoZWNrIGl0XG4iLAorCQkJbnR5cGUpOworCQlleGl0KDEpOworCX0KKworCXZlY3Rvcl9zZXQoY25vZGUtPmNtZF92ZWN0b3IsIGNtZCk7CisKKwljbWQtPnN0cnZlYyA9IGNtZF9tYWtlX2Rlc2N2ZWMoY21kLT5zdHJpbmcsIGNtZC0+ZG9jKTsKKwljbWQtPmNtZHNpemUgPSBjbWRfY21kc2l6ZShjbWQtPnN0cnZlYyk7Cit9CisKKy8qIEluc3RhbGwgYSBjb21tYW5kIGludG8gVklFVyBhbmQgRU5BQkxFIG5vZGUgKi8KK3ZvaWQgaW5zdGFsbF9lbGVtZW50X3ZlKHN0cnVjdCBjbWRfZWxlbWVudCAqY21kKQoreworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsIGNtZCk7CisJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCBjbWQpOworfQorCisjaWZkZWYgVlRZX0NSWVBUX1BXCitzdGF0aWMgdW5zaWduZWQgY2hhciBpdG9hNjRbXSA9CisgICAgIi4vMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOworCitzdGF0aWMgdm9pZCB0bzY0KGNoYXIgKnMsIGxvbmcgdiwgaW50IG4pCit7CisJd2hpbGUgKC0tbiA+PSAwKSB7CisJCSpzKysgPSBpdG9hNjRbdiAmIDB4M2ZdOworCQl2ID4+PSA2OworCX0KK30KKworc3RhdGljIGNoYXIgKnplbmNyeXB0KGNvbnN0IGNoYXIgKnBhc3N3ZCkKK3sKKwljaGFyIHNhbHRbNl07CisJc3RydWN0IHRpbWV2YWwgdHY7CisJY2hhciAqY3J5cHQoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworCisJZ2V0dGltZW9mZGF5KCZ0diwgMCk7CisKKwl0bzY0KCZzYWx0WzBdLCByYW5kb20oKSwgMyk7CisJdG82NCgmc2FsdFszXSwgdHYudHZfdXNlYywgMyk7CisJc2FsdFs1XSA9ICdcMCc7CisKKwlyZXR1cm4gY3J5cHQocGFzc3dkLCBzYWx0KTsKK30KKyNlbmRpZgorCisvKiBUaGlzIGZ1bmN0aW9uIHdyaXRlIGNvbmZpZ3VyYXRpb24gb2YgdGhpcyBob3N0LiAqLworc3RhdGljIGludCBjb25maWdfd3JpdGVfaG9zdChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaWYgKGhvc3QubmFtZSkKKwkJdnR5X291dCh2dHksICJob3N0bmFtZSAlcyVzIiwgaG9zdC5uYW1lLCBWVFlfTkVXTElORSk7CisKKwlpZiAoaG9zdC5lbmNyeXB0KSB7CisJCWlmIChob3N0LnBhc3N3b3JkX2VuY3J5cHQpCisJCQl2dHlfb3V0KHZ0eSwgInBhc3N3b3JkIDggJXMlcyIsIGhvc3QucGFzc3dvcmRfZW5jcnlwdCwKKwkJCQlWVFlfTkVXTElORSk7CisJCWlmIChob3N0LmVuYWJsZV9lbmNyeXB0KQorCQkJdnR5X291dCh2dHksICJlbmFibGUgcGFzc3dvcmQgOCAlcyVzIiwKKwkJCQlob3N0LmVuYWJsZV9lbmNyeXB0LCBWVFlfTkVXTElORSk7CisJfSBlbHNlIHsKKwkJaWYgKGhvc3QucGFzc3dvcmQpCisJCQl2dHlfb3V0KHZ0eSwgInBhc3N3b3JkICVzJXMiLCBob3N0LnBhc3N3b3JkLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJaWYgKGhvc3QuZW5hYmxlKQorCQkJdnR5X291dCh2dHksICJlbmFibGUgcGFzc3dvcmQgJXMlcyIsIGhvc3QuZW5hYmxlLAorCQkJCVZUWV9ORVdMSU5FKTsKKwl9CisKKwlpZiAoaG9zdC5hZHZhbmNlZCkKKwkJdnR5X291dCh2dHksICJzZXJ2aWNlIGFkdmFuY2VkLXZ0eSVzIiwgVlRZX05FV0xJTkUpOworCisJaWYgKGhvc3QuZW5jcnlwdCkKKwkJdnR5X291dCh2dHksICJzZXJ2aWNlIHBhc3N3b3JkLWVuY3J5cHRpb24lcyIsIFZUWV9ORVdMSU5FKTsKKworCWlmIChob3N0LmxpbmVzID49IDApCisJCXZ0eV9vdXQodnR5LCAic2VydmljZSB0ZXJtaW5hbC1sZW5ndGggJWQlcyIsIGhvc3QubGluZXMsCisJCQlWVFlfTkVXTElORSk7CisKKwlpZiAoaG9zdC5tb3RkZmlsZSkKKwkJdnR5X291dCh2dHksICJiYW5uZXIgbW90ZCBmaWxlICVzJXMiLCBob3N0Lm1vdGRmaWxlLAorCQkJVlRZX05FV0xJTkUpOworCWVsc2UgaWYgKCFob3N0Lm1vdGQpCisJCXZ0eV9vdXQodnR5LCAibm8gYmFubmVyIG1vdGQlcyIsIFZUWV9ORVdMSU5FKTsKKworCXJldHVybiAxOworfQorCisvKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciBnZXR0aW5nIGNvbW1hbmQgdmVjdG9yLiAqLworc3RhdGljIHZlY3RvciBjbWRfbm9kZV92ZWN0b3IodmVjdG9yIHYsIGVudW0gbm9kZV90eXBlIG50eXBlKQoreworCXN0cnVjdCBjbWRfbm9kZSAqY25vZGUgPSB2ZWN0b3Jfc2xvdCh2LCBudHlwZSk7CisJcmV0dXJuIGNub2RlLT5jbWRfdmVjdG9yOworfQorCisvKiBDb21wbGV0aW9uIG1hdGNoIHR5cGVzLiAqLworZW51bSBtYXRjaF90eXBlIHsKKwlub19tYXRjaCwKKwlleHRlbmRfbWF0Y2gsCisJaXB2NF9wcmVmaXhfbWF0Y2gsCisJaXB2NF9tYXRjaCwKKwlpcHY2X3ByZWZpeF9tYXRjaCwKKwlpcHY2X21hdGNoLAorCXJhbmdlX21hdGNoLAorCXZhcmFyZ19tYXRjaCwKKwlwYXJ0bHlfbWF0Y2gsCisJZXhhY3RfbWF0Y2gKK307CisKK3N0YXRpYyBlbnVtIG1hdGNoX3R5cGUgY21kX2lwdjRfbWF0Y2goY29uc3QgY2hhciAqc3RyKQoreworCWNvbnN0IGNoYXIgKnNwOworCWludCBkb3RzID0gMCwgbnVtcyA9IDA7CisJY2hhciBidWZbNF07CisKKwlpZiAoc3RyID09IE5VTEwpCisJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisKKwlmb3IgKDs7KSB7CisJCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKwkJc3AgPSBzdHI7CisJCXdoaWxlICgqc3RyICE9ICdcMCcpIHsKKwkJCWlmICgqc3RyID09ICcuJykgeworCQkJCWlmIChkb3RzID49IDMpCisJCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJCWlmICgqKHN0ciArIDEpID09ICcuJykKKwkJCQkJcmV0dXJuIG5vX21hdGNoOworCisJCQkJaWYgKCooc3RyICsgMSkgPT0gJ1wwJykKKwkJCQkJcmV0dXJuIHBhcnRseV9tYXRjaDsKKworCQkJCWRvdHMrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghaXNkaWdpdCgoaW50KSpzdHIpKQorCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJc3RyKys7CisJCX0KKworCQlpZiAoc3RyIC0gc3AgPiAzKQorCQkJcmV0dXJuIG5vX21hdGNoOworCisJCXN0cm5jcHkoYnVmLCBzcCwgc3RyIC0gc3ApOworCQlpZiAoYXRvaShidWYpID4gMjU1KQorCQkJcmV0dXJuIG5vX21hdGNoOworCisJCW51bXMrKzsKKworCQlpZiAoKnN0ciA9PSAnXDAnKQorCQkJYnJlYWs7CisKKwkJc3RyKys7CisJfQorCisJaWYgKG51bXMgPCA0KQorCQlyZXR1cm4gcGFydGx5X21hdGNoOworCisJcmV0dXJuIGV4YWN0X21hdGNoOworfQorCitzdGF0aWMgZW51bSBtYXRjaF90eXBlIGNtZF9pcHY0X3ByZWZpeF9tYXRjaChjb25zdCBjaGFyICpzdHIpCit7CisJY29uc3QgY2hhciAqc3A7CisJaW50IGRvdHMgPSAwOworCWNoYXIgYnVmWzRdOworCisJaWYgKHN0ciA9PSBOVUxMKQorCQlyZXR1cm4gcGFydGx5X21hdGNoOworCisJZm9yICg7OykgeworCQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJCXNwID0gc3RyOworCQl3aGlsZSAoKnN0ciAhPSAnXDAnICYmICpzdHIgIT0gJy8nKSB7CisJCQlpZiAoKnN0ciA9PSAnLicpIHsKKwkJCQlpZiAoZG90cyA9PSAzKQorCQkJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJCQlpZiAoKihzdHIgKyAxKSA9PSAnLicgfHwgKihzdHIgKyAxKSA9PSAnLycpCisJCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJCWlmICgqKHN0ciArIDEpID09ICdcMCcpCisJCQkJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisKKwkJCQlkb3RzKys7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICghaXNkaWdpdCgoaW50KSpzdHIpKQorCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJc3RyKys7CisJCX0KKworCQlpZiAoc3RyIC0gc3AgPiAzKQorCQkJcmV0dXJuIG5vX21hdGNoOworCisJCXN0cm5jcHkoYnVmLCBzcCwgc3RyIC0gc3ApOworCQlpZiAoYXRvaShidWYpID4gMjU1KQorCQkJcmV0dXJuIG5vX21hdGNoOworCisJCWlmIChkb3RzID09IDMpIHsKKwkJCWlmICgqc3RyID09ICcvJykgeworCQkJCWlmICgqKHN0ciArIDEpID09ICdcMCcpCisJCQkJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisKKwkJCQlzdHIrKzsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAoKnN0ciA9PSAnXDAnKQorCQkJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisJCX0KKworCQlpZiAoKnN0ciA9PSAnXDAnKQorCQkJcmV0dXJuIHBhcnRseV9tYXRjaDsKKworCQlzdHIrKzsKKwl9CisKKwlzcCA9IHN0cjsKKwl3aGlsZSAoKnN0ciAhPSAnXDAnKSB7CisJCWlmICghaXNkaWdpdCgoaW50KSpzdHIpKQorCQkJcmV0dXJuIG5vX21hdGNoOworCisJCXN0cisrOworCX0KKworCWlmIChhdG9pKHNwKSA+IDMyKQorCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwlyZXR1cm4gZXhhY3RfbWF0Y2g7Cit9CisKKyNkZWZpbmUgSVBWNl9BRERSX1NUUgkJIjAxMjM0NTY3ODlhYmNkZWZBQkNERUY6LiUiCisjZGVmaW5lIElQVjZfUFJFRklYX1NUUgkJIjAxMjM0NTY3ODlhYmNkZWZBQkNERUY6LiUvIgorI2RlZmluZSBTVEFURV9TVEFSVAkJMQorI2RlZmluZSBTVEFURV9DT0xPTgkJMgorI2RlZmluZSBTVEFURV9ET1VCTEUJCTMKKyNkZWZpbmUgU1RBVEVfQUREUgkJNAorI2RlZmluZSBTVEFURV9ET1QgICAgICAgICAgICAgICA1CisjZGVmaW5lIFNUQVRFX1NMQVNICQk2CisjZGVmaW5lIFNUQVRFX01BU0sJCTcKKworI2lmZGVmIEhBVkVfSVBWNgorCitzdGF0aWMgZW51bSBtYXRjaF90eXBlIGNtZF9pcHY2X21hdGNoKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpbnQgc3RhdGUgPSBTVEFURV9TVEFSVDsKKwlpbnQgY29sb25zID0gMCwgbnVtcyA9IDAsIGRvdWJsZV9jb2xvbiA9IDA7CisJY29uc3QgY2hhciAqc3AgPSBOVUxMOworCXN0cnVjdCBzb2NrYWRkcl9pbjYgc2luNl9kdW1teTsKKwlpbnQgcmV0OworCisJaWYgKHN0ciA9PSBOVUxMKQorCQlyZXR1cm4gcGFydGx5X21hdGNoOworCisJaWYgKHN0cnNwbihzdHIsIElQVjZfQUREUl9TVFIpICE9IHN0cmxlbihzdHIpKQorCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkvKiB1c2UgaW5ldF9wdG9uIHRoYXQgaGFzIGEgYmV0dGVyIHN1cHBvcnQsCisJICogZm9yIGV4YW1wbGUgaW5ldF9wdG9uIGNhbiBzdXBwb3J0IHRoZSBhdXRvbWF0aWMgYWRkcmVzc2VzOgorCSAqICA6OjEuMi4zLjQKKwkgKi8KKwlyZXQgPSBpbmV0X3B0b24oQUZfSU5FVDYsIHN0ciwgJnNpbjZfZHVtbXkuc2luNl9hZGRyKTsKKworCWlmIChyZXQgPT0gMSkKKwkJcmV0dXJuIGV4YWN0X21hdGNoOworCisJd2hpbGUgKCpzdHIgIT0gJ1wwJykgeworCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgU1RBVEVfU1RBUlQ6CisJCQlpZiAoKnN0ciA9PSAnOicpIHsKKwkJCQlpZiAoKihzdHIgKyAxKSAhPSAnOicgJiYgKihzdHIgKyAxKSAhPSAnXDAnKQorCQkJCQlyZXR1cm4gbm9fbWF0Y2g7CisJCQkJY29sb25zLS07CisJCQkJc3RhdGUgPSBTVEFURV9DT0xPTjsKKwkJCX0gZWxzZSB7CisJCQkJc3AgPSBzdHI7CisJCQkJc3RhdGUgPSBTVEFURV9BRERSOworCQkJfQorCisJCQljb250aW51ZTsKKwkJY2FzZSBTVEFURV9DT0xPTjoKKwkJCWNvbG9ucysrOworCQkJaWYgKCooc3RyICsgMSkgPT0gJzonKQorCQkJCXN0YXRlID0gU1RBVEVfRE9VQkxFOworCQkJZWxzZSB7CisJCQkJc3AgPSBzdHIgKyAxOworCQkJCXN0YXRlID0gU1RBVEVfQUREUjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNUQVRFX0RPVUJMRToKKwkJCWlmIChkb3VibGVfY29sb24pCisJCQkJcmV0dXJuIG5vX21hdGNoOworCisJCQlpZiAoKihzdHIgKyAxKSA9PSAnOicpCisJCQkJcmV0dXJuIG5vX21hdGNoOworCQkJZWxzZSB7CisJCQkJaWYgKCooc3RyICsgMSkgIT0gJ1wwJykKKwkJCQkJY29sb25zKys7CisJCQkJc3AgPSBzdHIgKyAxOworCQkJCXN0YXRlID0gU1RBVEVfQUREUjsKKwkJCX0KKworCQkJZG91YmxlX2NvbG9uKys7CisJCQludW1zKys7CisJCQlicmVhazsKKwkJY2FzZSBTVEFURV9BRERSOgorCQkJaWYgKCooc3RyICsgMSkgPT0gJzonIHx8ICooc3RyICsgMSkgPT0gJ1wwJykgeworCQkJCWlmIChzdHIgLSBzcCA+IDMpCisJCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJCW51bXMrKzsKKwkJCQlzdGF0ZSA9IFNUQVRFX0NPTE9OOworCQkJfQorCQkJaWYgKCooc3RyICsgMSkgPT0gJy4nKQorCQkJCXN0YXRlID0gU1RBVEVfRE9UOworCQkJYnJlYWs7CisJCWNhc2UgU1RBVEVfRE9UOgorCQkJc3RhdGUgPSBTVEFURV9BRERSOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCWlmIChudW1zID4gOCkKKwkJCXJldHVybiBub19tYXRjaDsKKworCQlpZiAoY29sb25zID4gNykKKwkJCXJldHVybiBub19tYXRjaDsKKworCQlzdHIrKzsKKwl9CisKKyNpZiAwCisJaWYgKG51bXMgPCAxMSkKKwkJcmV0dXJuIHBhcnRseV9tYXRjaDsKKyNlbmRpZgkJCQkvKiAwICovCisKKwlyZXR1cm4gZXhhY3RfbWF0Y2g7Cit9CisKK3N0YXRpYyBlbnVtIG1hdGNoX3R5cGUgY21kX2lwdjZfcHJlZml4X21hdGNoKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpbnQgc3RhdGUgPSBTVEFURV9TVEFSVDsKKwlpbnQgY29sb25zID0gMCwgbnVtcyA9IDAsIGRvdWJsZV9jb2xvbiA9IDA7CisJaW50IG1hc2s7CisJY29uc3QgY2hhciAqc3AgPSBOVUxMOworCWNoYXIgKmVuZHB0ciA9IE5VTEw7CisKKwlpZiAoc3RyID09IE5VTEwpCisJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisKKwlpZiAoc3Ryc3BuKHN0ciwgSVBWNl9QUkVGSVhfU1RSKSAhPSBzdHJsZW4oc3RyKSkKKwkJcmV0dXJuIG5vX21hdGNoOworCisJd2hpbGUgKCpzdHIgIT0gJ1wwJyAmJiBzdGF0ZSAhPSBTVEFURV9NQVNLKSB7CisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBTVEFURV9TVEFSVDoKKwkJCWlmICgqc3RyID09ICc6JykgeworCQkJCWlmICgqKHN0ciArIDEpICE9ICc6JyAmJiAqKHN0ciArIDEpICE9ICdcMCcpCisJCQkJCXJldHVybiBub19tYXRjaDsKKwkJCQljb2xvbnMtLTsKKwkJCQlzdGF0ZSA9IFNUQVRFX0NPTE9OOworCQkJfSBlbHNlIHsKKwkJCQlzcCA9IHN0cjsKKwkJCQlzdGF0ZSA9IFNUQVRFX0FERFI7CisJCQl9CisKKwkJCWNvbnRpbnVlOworCQljYXNlIFNUQVRFX0NPTE9OOgorCQkJY29sb25zKys7CisJCQlpZiAoKihzdHIgKyAxKSA9PSAnLycpCisJCQkJcmV0dXJuIG5vX21hdGNoOworCQkJZWxzZSBpZiAoKihzdHIgKyAxKSA9PSAnOicpCisJCQkJc3RhdGUgPSBTVEFURV9ET1VCTEU7CisJCQllbHNlIHsKKwkJCQlzcCA9IHN0ciArIDE7CisJCQkJc3RhdGUgPSBTVEFURV9BRERSOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU1RBVEVfRE9VQkxFOgorCQkJaWYgKGRvdWJsZV9jb2xvbikKKwkJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJCWlmICgqKHN0ciArIDEpID09ICc6JykKKwkJCQlyZXR1cm4gbm9fbWF0Y2g7CisJCQllbHNlIHsKKwkJCQlpZiAoKihzdHIgKyAxKSAhPSAnXDAnICYmICooc3RyICsgMSkgIT0gJy8nKQorCQkJCQljb2xvbnMrKzsKKwkJCQlzcCA9IHN0ciArIDE7CisKKwkJCQlpZiAoKihzdHIgKyAxKSA9PSAnLycpCisJCQkJCXN0YXRlID0gU1RBVEVfU0xBU0g7CisJCQkJZWxzZQorCQkJCQlzdGF0ZSA9IFNUQVRFX0FERFI7CisJCQl9CisKKwkJCWRvdWJsZV9jb2xvbisrOworCQkJbnVtcyArPSAxOworCQkJYnJlYWs7CisJCWNhc2UgU1RBVEVfQUREUjoKKwkJCWlmICgqKHN0ciArIDEpID09ICc6JyB8fCAqKHN0ciArIDEpID09ICcuJworCQkJICAgIHx8ICooc3RyICsgMSkgPT0gJ1wwJyB8fCAqKHN0ciArIDEpID09ICcvJykgeworCQkJCWlmIChzdHIgLSBzcCA+IDMpCisJCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJCWZvciAoOyBzcCA8PSBzdHI7IHNwKyspCisJCQkJCWlmICgqc3AgPT0gJy8nKQorCQkJCQkJcmV0dXJuIG5vX21hdGNoOworCisJCQkJbnVtcysrOworCisJCQkJaWYgKCooc3RyICsgMSkgPT0gJzonKQorCQkJCQlzdGF0ZSA9IFNUQVRFX0NPTE9OOworCQkJCWVsc2UgaWYgKCooc3RyICsgMSkgPT0gJy4nKQorCQkJCQlzdGF0ZSA9IFNUQVRFX0RPVDsKKwkJCQllbHNlIGlmICgqKHN0ciArIDEpID09ICcvJykKKwkJCQkJc3RhdGUgPSBTVEFURV9TTEFTSDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNUQVRFX0RPVDoKKwkJCXN0YXRlID0gU1RBVEVfQUREUjsKKwkJCWJyZWFrOworCQljYXNlIFNUQVRFX1NMQVNIOgorCQkJaWYgKCooc3RyICsgMSkgPT0gJ1wwJykKKwkJCQlyZXR1cm4gcGFydGx5X21hdGNoOworCisJCQlzdGF0ZSA9IFNUQVRFX01BU0s7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKG51bXMgPiAxMSkKKwkJCXJldHVybiBub19tYXRjaDsKKworCQlpZiAoY29sb25zID4gNykKKwkJCXJldHVybiBub19tYXRjaDsKKworCQlzdHIrKzsKKwl9CisKKwlpZiAoc3RhdGUgPCBTVEFURV9NQVNLKQorCQlyZXR1cm4gcGFydGx5X21hdGNoOworCisJbWFzayA9IHN0cnRvbChzdHIsICZlbmRwdHIsIDEwKTsKKwlpZiAoKmVuZHB0ciAhPSAnXDAnKQorCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwlpZiAobWFzayA8IDAgfHwgbWFzayA+IDEyOCkKKwkJcmV0dXJuIG5vX21hdGNoOworCisvKiBJIGRvbid0IGtub3cgd2h5IG1hc2sgPCAxMyBtYWtlcyBjb21tYW5kIG1hdGNoIHBhcnRseS4KKyAgIEZvcmdpdmUgbWUgdG8gbWFrZSB0aGlzIGNvbW1lbnRzLiBJIFdhbnQgdG8gc2V0IHN0YXRpYyBkZWZhdWx0IHJvdXRlCisgICBiZWNhdXNlIG9mIGxhY2sgb2YgZnVuY3Rpb24gdG8gb3JpZ2luYXRlIGRlZmF1bHQgaW4gb3NwZjZkOyBzb3JyeQorICAgICAgIHlhc3UKKyAgaWYgKG1hc2sgPCAxMykKKyAgICByZXR1cm4gcGFydGx5X21hdGNoOworKi8KKworCXJldHVybiBleGFjdF9tYXRjaDsKK30KKworI2VuZGlmCQkJCS8qIEhBVkVfSVBWNiAgKi8KKworI2RlZmluZSBERUNJTUFMX1NUUkxFTl9NQVggMTAKKworc3RhdGljIGludCBjbWRfcmFuZ2VfbWF0Y2goY29uc3QgY2hhciAqcmFuZ2UsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwljaGFyICpwOworCWNoYXIgYnVmW0RFQ0lNQUxfU1RSTEVOX01BWCArIDFdOworCWNoYXIgKmVuZHB0ciA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBtaW4sIG1heCwgdmFsOworCisJaWYgKHN0ciA9PSBOVUxMKQorCQlyZXR1cm4gMTsKKworCXZhbCA9IHN0cnRvdWwoc3RyLCAmZW5kcHRyLCAxMCk7CisJaWYgKCplbmRwdHIgIT0gJ1wwJykKKwkJcmV0dXJuIDA7CisKKwlyYW5nZSsrOworCXAgPSBzdHJjaHIocmFuZ2UsICctJyk7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJaWYgKHAgLSByYW5nZSA+IERFQ0lNQUxfU1RSTEVOX01BWCkKKwkJcmV0dXJuIDA7CisJc3RybmNweShidWYsIHJhbmdlLCBwIC0gcmFuZ2UpOworCWJ1ZltwIC0gcmFuZ2VdID0gJ1wwJzsKKwltaW4gPSBzdHJ0b3VsKGJ1ZiwgJmVuZHB0ciwgMTApOworCWlmICgqZW5kcHRyICE9ICdcMCcpCisJCXJldHVybiAwOworCisJcmFuZ2UgPSBwICsgMTsKKwlwID0gc3RyY2hyKHJhbmdlLCAnPicpOworCWlmIChwID09IE5VTEwpCisJCXJldHVybiAwOworCWlmIChwIC0gcmFuZ2UgPiBERUNJTUFMX1NUUkxFTl9NQVgpCisJCXJldHVybiAwOworCXN0cm5jcHkoYnVmLCByYW5nZSwgcCAtIHJhbmdlKTsKKwlidWZbcCAtIHJhbmdlXSA9ICdcMCc7CisJbWF4ID0gc3RydG91bChidWYsICZlbmRwdHIsIDEwKTsKKwlpZiAoKmVuZHB0ciAhPSAnXDAnKQorCQlyZXR1cm4gMDsKKworCWlmICh2YWwgPCBtaW4gfHwgdmFsID4gbWF4KQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCisvKiBNYWtlIGNvbXBsZXRpb24gbWF0Y2ggYW5kIHJldHVybiBtYXRjaCB0eXBlIGZsYWcuICovCitzdGF0aWMgZW51bSBtYXRjaF90eXBlCitjbWRfZmlsdGVyX2J5X2NvbXBsZXRpb24oY2hhciAqY29tbWFuZCwgdmVjdG9yIHYsIHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwljb25zdCBjaGFyICpzdHI7CisJc3RydWN0IGNtZF9lbGVtZW50ICpjbWRfZWxlbWVudDsKKwllbnVtIG1hdGNoX3R5cGUgbWF0Y2hfdHlwZTsKKwl2ZWN0b3IgZGVzY3ZlYzsKKwlzdHJ1Y3QgZGVzYyAqZGVzYzsKKworCW1hdGNoX3R5cGUgPSBub19tYXRjaDsKKworCS8qIElmIGNvbW1hbmQgYW5kIGNtZF9lbGVtZW50IHN0cmluZyBkb2VzIG5vdCBtYXRjaCBzZXQgTlVMTCB0byB2ZWN0b3IgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2KTsgaSsrKQorCQlpZiAoKGNtZF9lbGVtZW50ID0gdmVjdG9yX3Nsb3QodiwgaSkpICE9IE5VTEwpIHsKKwkJCWlmIChpbmRleCA+PSB2ZWN0b3JfYWN0aXZlKGNtZF9lbGVtZW50LT5zdHJ2ZWMpKQorCQkJCXZlY3Rvcl9zbG90KHYsIGkpID0gTlVMTDsKKwkJCWVsc2UgeworCQkJCXVuc2lnbmVkIGludCBqOworCQkJCWludCBtYXRjaGVkID0gMDsKKworCQkJCWRlc2N2ZWMgPQorCQkJCSAgICB2ZWN0b3Jfc2xvdChjbWRfZWxlbWVudC0+c3RydmVjLCBpbmRleCk7CisKKwkJCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShkZXNjdmVjKTsgaisrKQorCQkJCQlpZiAoKGRlc2MgPSB2ZWN0b3Jfc2xvdChkZXNjdmVjLCBqKSkpIHsKKwkJCQkJCXN0ciA9IGRlc2MtPmNtZDsKKworCQkJCQkJaWYgKENNRF9WQVJBUkcoc3RyKSkgeworCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkgICAgdmFyYXJnX21hdGNoKQorCQkJCQkJCQltYXRjaF90eXBlID0KKwkJCQkJCQkJICAgIHZhcmFyZ19tYXRjaDsKKwkJCQkJCQltYXRjaGVkKys7CisJCQkJCQl9IGVsc2UgaWYgKENNRF9SQU5HRShzdHIpKSB7CisJCQkJCQkJaWYgKGNtZF9yYW5nZV9tYXRjaAorCQkJCQkJCSAgICAoc3RyLCBjb21tYW5kKSkgeworCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJCSAgICByYW5nZV9tYXRjaCkKKwkJCQkJCQkJCW1hdGNoX3R5cGUKKwkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkgICAgcmFuZ2VfbWF0Y2g7CisKKwkJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJCX0KKwkJCQkJCX0KKyNpZmRlZiBIQVZFX0lQVjYKKwkJCQkJCWVsc2UgaWYgKENNRF9JUFY2KHN0cikpIHsKKwkJCQkJCQlpZiAoY21kX2lwdjZfbWF0Y2gKKwkJCQkJCQkgICAgKGNvbW1hbmQpKSB7CisJCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkJICAgIGlwdjZfbWF0Y2gpCisJCQkJCQkJCQltYXRjaF90eXBlCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIGlwdjZfbWF0Y2g7CisKKwkJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSBpZiAoQ01EX0lQVjZfUFJFRklYKHN0cikpIHsKKwkJCQkJCQlpZiAoY21kX2lwdjZfcHJlZml4X21hdGNoKGNvbW1hbmQpKSB7CisJCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkJICAgIGlwdjZfcHJlZml4X21hdGNoKQorCQkJCQkJCQkJbWF0Y2hfdHlwZQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICBpcHY2X3ByZWZpeF9tYXRjaDsKKworCQkJCQkJCQltYXRjaGVkKys7CisJCQkJCQkJfQorCQkJCQkJfQorI2VuZGlmCQkJCS8qIEhBVkVfSVBWNiAgKi8KKwkJCQkJCWVsc2UgaWYgKENNRF9JUFY0KHN0cikpIHsKKwkJCQkJCQlpZiAoY21kX2lwdjRfbWF0Y2gKKwkJCQkJCQkgICAgKGNvbW1hbmQpKSB7CisJCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkJICAgIGlwdjRfbWF0Y2gpCisJCQkJCQkJCQltYXRjaF90eXBlCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIGlwdjRfbWF0Y2g7CisKKwkJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSBpZiAoQ01EX0lQVjRfUFJFRklYKHN0cikpIHsKKwkJCQkJCQlpZiAoY21kX2lwdjRfcHJlZml4X21hdGNoKGNvbW1hbmQpKSB7CisJCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkJICAgIGlwdjRfcHJlZml4X21hdGNoKQorCQkJCQkJCQkJbWF0Y2hfdHlwZQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICBpcHY0X3ByZWZpeF9tYXRjaDsKKwkJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZQorCQkJCQkJCS8qIENoZWNrIGlzIHRoaXMgcG9pbnQncyBhcmd1bWVudCBvcHRpb25hbCA/ICovCisJCQkJCQlpZiAoQ01EX09QVElPTihzdHIpCisJCQkJCQkJICAgIHx8CisJCQkJCQkJICAgIENNRF9WQVJJQUJMRShzdHIpKSB7CisJCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAorCQkJCQkJCSAgICBleHRlbmRfbWF0Y2gpCisJCQkJCQkJCW1hdGNoX3R5cGUgPQorCQkJCQkJCQkgICAgZXh0ZW5kX21hdGNoOworCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCX0gZWxzZQorCQkJCQkJICAgIGlmIChzdHJuY21wCisJCQkJCQkJKGNvbW1hbmQsIHN0ciwKKwkJCQkJCQkgc3RybGVuKGNvbW1hbmQpKSA9PQorCQkJCQkJCTApIHsKKwkJCQkJCQlpZiAoc3RyY21wKGNvbW1hbmQsIHN0cikKKwkJCQkJCQkgICAgPT0gMCkKKwkJCQkJCQkJbWF0Y2hfdHlwZSA9CisJCQkJCQkJCSAgICBleGFjdF9tYXRjaDsKKwkJCQkJCQllbHNlIHsKKwkJCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAorCQkJCQkJCQkgICAgcGFydGx5X21hdGNoKQorCQkJCQkJCQkJbWF0Y2hfdHlwZQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICBwYXJ0bHlfbWF0Y2g7CisJCQkJCQkJfQorCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCWlmICghbWF0Y2hlZCkKKwkJCQkJdmVjdG9yX3Nsb3QodiwgaSkgPSBOVUxMOworCQkJfQorCQl9CisJcmV0dXJuIG1hdGNoX3R5cGU7Cit9CisKKy8qIEZpbHRlciB2ZWN0b3IgYnkgY29tbWFuZCBjaGFyYWN0ZXIgd2l0aCBpbmRleC4gKi8KK3N0YXRpYyBlbnVtIG1hdGNoX3R5cGUKK2NtZF9maWx0ZXJfYnlfc3RyaW5nKGNoYXIgKmNvbW1hbmQsIHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJdW5zaWduZWQgaW50IGk7CisJY29uc3QgY2hhciAqc3RyOworCXN0cnVjdCBjbWRfZWxlbWVudCAqY21kX2VsZW1lbnQ7CisJZW51bSBtYXRjaF90eXBlIG1hdGNoX3R5cGU7CisJdmVjdG9yIGRlc2N2ZWM7CisJc3RydWN0IGRlc2MgKmRlc2M7CisKKwltYXRjaF90eXBlID0gbm9fbWF0Y2g7CisKKwkvKiBJZiBjb21tYW5kIGFuZCBjbWRfZWxlbWVudCBzdHJpbmcgZG9lcyBub3QgbWF0Y2ggc2V0IE5VTEwgdG8gdmVjdG9yICovCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUodik7IGkrKykKKwkJaWYgKChjbWRfZWxlbWVudCA9IHZlY3Rvcl9zbG90KHYsIGkpKSAhPSBOVUxMKSB7CisJCQkvKiBJZiBnaXZlbiBpbmRleCBpcyBiaWdnZXIgdGhhbiBtYXggc3RyaW5nIHZlY3RvciBvZiBjb21tYW5kLAorCQkJICAgc2V0IE5VTEwgKi8KKwkJCWlmIChpbmRleCA+PSB2ZWN0b3JfYWN0aXZlKGNtZF9lbGVtZW50LT5zdHJ2ZWMpKQorCQkJCXZlY3Rvcl9zbG90KHYsIGkpID0gTlVMTDsKKwkJCWVsc2UgeworCQkJCXVuc2lnbmVkIGludCBqOworCQkJCWludCBtYXRjaGVkID0gMDsKKworCQkJCWRlc2N2ZWMgPQorCQkJCSAgICB2ZWN0b3Jfc2xvdChjbWRfZWxlbWVudC0+c3RydmVjLCBpbmRleCk7CisKKwkJCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShkZXNjdmVjKTsgaisrKQorCQkJCQlpZiAoKGRlc2MgPSB2ZWN0b3Jfc2xvdChkZXNjdmVjLCBqKSkpIHsKKwkJCQkJCXN0ciA9IGRlc2MtPmNtZDsKKworCQkJCQkJaWYgKENNRF9WQVJBUkcoc3RyKSkgeworCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkgICAgdmFyYXJnX21hdGNoKQorCQkJCQkJCQltYXRjaF90eXBlID0KKwkJCQkJCQkJICAgIHZhcmFyZ19tYXRjaDsKKwkJCQkJCQltYXRjaGVkKys7CisJCQkJCQl9IGVsc2UgaWYgKENNRF9SQU5HRShzdHIpKSB7CisJCQkJCQkJaWYgKGNtZF9yYW5nZV9tYXRjaAorCQkJCQkJCSAgICAoc3RyLCBjb21tYW5kKSkgeworCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJCSAgICByYW5nZV9tYXRjaCkKKwkJCQkJCQkJCW1hdGNoX3R5cGUKKwkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkgICAgcmFuZ2VfbWF0Y2g7CisJCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCQl9CisJCQkJCQl9CisjaWZkZWYgSEFWRV9JUFY2CisJCQkJCQllbHNlIGlmIChDTURfSVBWNihzdHIpKSB7CisJCQkJCQkJaWYgKGNtZF9pcHY2X21hdGNoCisJCQkJCQkJICAgIChjb21tYW5kKSA9PQorCQkJCQkJCSAgICBleGFjdF9tYXRjaCkgeworCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJCSAgICBpcHY2X21hdGNoKQorCQkJCQkJCQkJbWF0Y2hfdHlwZQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICBpcHY2X21hdGNoOworCQkJCQkJCQltYXRjaGVkKys7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIGlmIChDTURfSVBWNl9QUkVGSVgoc3RyKSkgeworCQkJCQkJCWlmIChjbWRfaXB2Nl9wcmVmaXhfbWF0Y2goY29tbWFuZCkgPT0gZXhhY3RfbWF0Y2gpIHsKKwkJCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAorCQkJCQkJCQkgICAgaXB2Nl9wcmVmaXhfbWF0Y2gpCisJCQkJCQkJCQltYXRjaF90eXBlCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIGlwdjZfcHJlZml4X21hdGNoOworCQkJCQkJCQltYXRjaGVkKys7CisJCQkJCQkJfQorCQkJCQkJfQorI2VuZGlmCQkJCS8qIEhBVkVfSVBWNiAgKi8KKwkJCQkJCWVsc2UgaWYgKENNRF9JUFY0KHN0cikpIHsKKwkJCQkJCQlpZiAoY21kX2lwdjRfbWF0Y2gKKwkJCQkJCQkgICAgKGNvbW1hbmQpID09CisJCQkJCQkJICAgIGV4YWN0X21hdGNoKSB7CisJCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkJICAgIGlwdjRfbWF0Y2gpCisJCQkJCQkJCQltYXRjaF90eXBlCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIGlwdjRfbWF0Y2g7CisJCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgaWYgKENNRF9JUFY0X1BSRUZJWChzdHIpKSB7CisJCQkJCQkJaWYgKGNtZF9pcHY0X3ByZWZpeF9tYXRjaChjb21tYW5kKSA9PSBleGFjdF9tYXRjaCkgeworCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJCSAgICBpcHY0X3ByZWZpeF9tYXRjaCkKKwkJCQkJCQkJCW1hdGNoX3R5cGUKKwkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkgICAgaXB2NF9wcmVmaXhfbWF0Y2g7CisJCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgaWYgKENNRF9PUFRJT04oc3RyKQorCQkJCQkJCSAgIHx8IENNRF9WQVJJQUJMRShzdHIpKQorCQkJCQkJeworCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkgICAgZXh0ZW5kX21hdGNoKQorCQkJCQkJCQltYXRjaF90eXBlID0KKwkJCQkJCQkJICAgIGV4dGVuZF9tYXRjaDsKKwkJCQkJCQltYXRjaGVkKys7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWlmIChzdHJjbXAoY29tbWFuZCwgc3RyKQorCQkJCQkJCSAgICA9PSAwKSB7CisJCQkJCQkJCW1hdGNoX3R5cGUgPQorCQkJCQkJCQkgICAgZXhhY3RfbWF0Y2g7CisJCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQlpZiAoIW1hdGNoZWQpCisJCQkJCXZlY3Rvcl9zbG90KHYsIGkpID0gTlVMTDsKKwkJCX0KKwkJfQorCXJldHVybiBtYXRjaF90eXBlOworfQorCisvKiBDaGVjayBhbWJpZ3VvdXMgbWF0Y2ggKi8KK3N0YXRpYyBpbnQKK2lzX2NtZF9hbWJpZ3VvdXMoY2hhciAqY29tbWFuZCwgdmVjdG9yIHYsIGludCBpbmRleCwgZW51bSBtYXRjaF90eXBlIHR5cGUpCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IGo7CisJY29uc3QgY2hhciAqc3RyID0gTlVMTDsKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZF9lbGVtZW50OworCWNvbnN0IGNoYXIgKm1hdGNoZWQgPSBOVUxMOworCXZlY3RvciBkZXNjdmVjOworCXN0cnVjdCBkZXNjICpkZXNjOworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUodik7IGkrKykKKwkJaWYgKChjbWRfZWxlbWVudCA9IHZlY3Rvcl9zbG90KHYsIGkpKSAhPSBOVUxMKSB7CisJCQlpbnQgbWF0Y2ggPSAwOworCisJCQlkZXNjdmVjID0gdmVjdG9yX3Nsb3QoY21kX2VsZW1lbnQtPnN0cnZlYywgaW5kZXgpOworCisJCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShkZXNjdmVjKTsgaisrKQorCQkJCWlmICgoZGVzYyA9IHZlY3Rvcl9zbG90KGRlc2N2ZWMsIGopKSkgeworCQkJCQllbnVtIG1hdGNoX3R5cGUgcmV0OworCisJCQkJCXN0ciA9IGRlc2MtPmNtZDsKKworCQkJCQlzd2l0Y2ggKHR5cGUpIHsKKwkJCQkJY2FzZSBleGFjdF9tYXRjaDoKKwkJCQkJCWlmICghCisJCQkJCQkgICAgKENNRF9PUFRJT04oc3RyKQorCQkJCQkJICAgICB8fCBDTURfVkFSSUFCTEUoc3RyKSkKKyYmIHN0cmNtcChjb21tYW5kLCBzdHIpID09IDApCisJCQkJCQkJbWF0Y2grKzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIHBhcnRseV9tYXRjaDoKKwkJCQkJCWlmICghCisJCQkJCQkgICAgKENNRF9PUFRJT04oc3RyKQorCQkJCQkJICAgICB8fCBDTURfVkFSSUFCTEUoc3RyKSkKKyYmIHN0cm5jbXAoY29tbWFuZCwgc3RyLCBzdHJsZW4oY29tbWFuZCkpID09IDApIHsKKwkJCQkJCQlpZiAobWF0Y2hlZAorCQkJCQkJCSAgICAmJiBzdHJjbXAobWF0Y2hlZCwKKwkJCQkJCQkJICAgICAgc3RyKSAhPSAwKQorCQkJCQkJCQlyZXR1cm4gMTsJLyogVGhlcmUgaXMgYW1iaWd1b3VzIG1hdGNoLiAqLworCQkJCQkJCWVsc2UKKwkJCQkJCQkJbWF0Y2hlZCA9IHN0cjsKKwkJCQkJCQltYXRjaCsrOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgcmFuZ2VfbWF0Y2g6CisJCQkJCQlpZiAoY21kX3JhbmdlX21hdGNoCisJCQkJCQkgICAgKHN0ciwgY29tbWFuZCkpIHsKKwkJCQkJCQlpZiAobWF0Y2hlZAorCQkJCQkJCSAgICAmJiBzdHJjbXAobWF0Y2hlZCwKKwkJCQkJCQkJICAgICAgc3RyKSAhPSAwKQorCQkJCQkJCQlyZXR1cm4gMTsKKwkJCQkJCQllbHNlCisJCQkJCQkJCW1hdGNoZWQgPSBzdHI7CisJCQkJCQkJbWF0Y2grKzsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworI2lmZGVmIEhBVkVfSVBWNgorCQkJCQljYXNlIGlwdjZfbWF0Y2g6CisJCQkJCQlpZiAoQ01EX0lQVjYoc3RyKSkKKwkJCQkJCQltYXRjaCsrOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgaXB2Nl9wcmVmaXhfbWF0Y2g6CisJCQkJCQlpZiAoKHJldCA9CisJCQkJCQkgICAgIGNtZF9pcHY2X3ByZWZpeF9tYXRjaAorCQkJCQkJICAgICAoY29tbWFuZCkpICE9IG5vX21hdGNoKSB7CisJCQkJCQkJaWYgKHJldCA9PSBwYXJ0bHlfbWF0Y2gpCisJCQkJCQkJCXJldHVybiAyOwkvKiBUaGVyZSBpcyBpbmNvbXBsZXRlIG1hdGNoLiAqLworCisJCQkJCQkJbWF0Y2grKzsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworI2VuZGlmCQkJCS8qIEhBVkVfSVBWNiAqLworCQkJCQljYXNlIGlwdjRfbWF0Y2g6CisJCQkJCQlpZiAoQ01EX0lQVjQoc3RyKSkKKwkJCQkJCQltYXRjaCsrOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgaXB2NF9wcmVmaXhfbWF0Y2g6CisJCQkJCQlpZiAoKHJldCA9CisJCQkJCQkgICAgIGNtZF9pcHY0X3ByZWZpeF9tYXRjaAorCQkJCQkJICAgICAoY29tbWFuZCkpICE9IG5vX21hdGNoKSB7CisJCQkJCQkJaWYgKHJldCA9PSBwYXJ0bHlfbWF0Y2gpCisJCQkJCQkJCXJldHVybiAyOwkvKiBUaGVyZSBpcyBpbmNvbXBsZXRlIG1hdGNoLiAqLworCisJCQkJCQkJbWF0Y2grKzsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIGV4dGVuZF9tYXRjaDoKKwkJCQkJCWlmIChDTURfT1BUSU9OKHN0cikKKwkJCQkJCSAgICB8fCBDTURfVkFSSUFCTEUoc3RyKSkKKwkJCQkJCQltYXRjaCsrOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2Ugbm9fbWF0Y2g6CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCWlmICghbWF0Y2gpCisJCQkJdmVjdG9yX3Nsb3QodiwgaSkgPSBOVUxMOworCQl9CisJcmV0dXJuIDA7Cit9CisKKy8qIElmIHNyYyBtYXRjaGVzIGRzdCByZXR1cm4gZHN0IHN0cmluZywgb3RoZXJ3aXNlIHJldHVybiBOVUxMICovCitzdGF0aWMgY29uc3QgY2hhciAqY21kX2VudHJ5X2Z1bmN0aW9uKGNvbnN0IGNoYXIgKnNyYywgY29uc3QgY2hhciAqZHN0KQoreworCS8qIFNraXAgdmFyaWFibGUgYXJndW1lbnRzLiAqLworCWlmIChDTURfT1BUSU9OKGRzdCkgfHwgQ01EX1ZBUklBQkxFKGRzdCkgfHwgQ01EX1ZBUkFSRyhkc3QpIHx8CisJICAgIENNRF9JUFY0KGRzdCkgfHwgQ01EX0lQVjRfUFJFRklYKGRzdCkgfHwgQ01EX1JBTkdFKGRzdCkpCisJCXJldHVybiBOVUxMOworCisJLyogSW4gY2FzZSBvZiAnY29tbWFuZCBcdCcsIGdpdmVuIHNyYyBpcyBOVUxMIHN0cmluZy4gKi8KKwlpZiAoc3JjID09IE5VTEwpCisJCXJldHVybiBkc3Q7CisKKwkvKiBNYXRjaGVkIHdpdGggaW5wdXQgc3RyaW5nLiAqLworCWlmIChzdHJuY21wKHNyYywgZHN0LCBzdHJsZW4oc3JjKSkgPT0gMCkKKwkJcmV0dXJuIGRzdDsKKworCXJldHVybiBOVUxMOworfQorCisvKiBJZiBzcmMgbWF0Y2hlcyBkc3QgcmV0dXJuIGRzdCBzdHJpbmcsIG90aGVyd2lzZSByZXR1cm4gTlVMTCAqLworLyogVGhpcyB2ZXJzaW9uIHdpbGwgcmV0dXJuIHRoZSBkc3Qgc3RyaW5nIGFsd2F5cyBpZiBpdCBpcworICAgQ01EX1ZBUklBQkxFIGZvciAnPycga2V5IHByb2Nlc3NpbmcgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpjbWRfZW50cnlfZnVuY3Rpb25fZGVzYyhjb25zdCBjaGFyICpzcmMsIGNvbnN0IGNoYXIgKmRzdCkKK3sKKwlpZiAoQ01EX1ZBUkFSRyhkc3QpKQorCQlyZXR1cm4gZHN0OworCisJaWYgKENNRF9SQU5HRShkc3QpKSB7CisJCWlmIChjbWRfcmFuZ2VfbWF0Y2goZHN0LCBzcmMpKQorCQkJcmV0dXJuIGRzdDsKKwkJZWxzZQorCQkJcmV0dXJuIE5VTEw7CisJfQorI2lmZGVmIEhBVkVfSVBWNgorCWlmIChDTURfSVBWNihkc3QpKSB7CisJCWlmIChjbWRfaXB2Nl9tYXRjaChzcmMpKQorCQkJcmV0dXJuIGRzdDsKKwkJZWxzZQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKENNRF9JUFY2X1BSRUZJWChkc3QpKSB7CisJCWlmIChjbWRfaXB2Nl9wcmVmaXhfbWF0Y2goc3JjKSkKKwkJCXJldHVybiBkc3Q7CisJCWVsc2UKKwkJCXJldHVybiBOVUxMOworCX0KKyNlbmRpZgkJCQkvKiBIQVZFX0lQVjYgKi8KKworCWlmIChDTURfSVBWNChkc3QpKSB7CisJCWlmIChjbWRfaXB2NF9tYXRjaChzcmMpKQorCQkJcmV0dXJuIGRzdDsKKwkJZWxzZQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKENNRF9JUFY0X1BSRUZJWChkc3QpKSB7CisJCWlmIChjbWRfaXB2NF9wcmVmaXhfbWF0Y2goc3JjKSkKKwkJCXJldHVybiBkc3Q7CisJCWVsc2UKKwkJCXJldHVybiBOVUxMOworCX0KKworCS8qIE9wdGlvbmFsIG9yIHZhcmlhYmxlIGNvbW1hbmRzIGFsd2F5cyBtYXRjaCBvbiAnPycgKi8KKwlpZiAoQ01EX09QVElPTihkc3QpIHx8IENNRF9WQVJJQUJMRShkc3QpKQorCQlyZXR1cm4gZHN0OworCisJLyogSW4gY2FzZSBvZiAnY29tbWFuZCBcdCcsIGdpdmVuIHNyYyBpcyBOVUxMIHN0cmluZy4gKi8KKwlpZiAoc3JjID09IE5VTEwpCisJCXJldHVybiBkc3Q7CisKKwlpZiAoc3RybmNtcChzcmMsIGRzdCwgc3RybGVuKHNyYykpID09IDApCisJCXJldHVybiBkc3Q7CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKK30KKworLyogQ2hlY2sgc2FtZSBzdHJpbmcgZWxlbWVudCBleGlzdGVuY2UuICBJZiBpdCBpc24ndCB0aGVyZSByZXR1cm4KKyAgICAxLiAqLworc3RhdGljIGludCBjbWRfdW5pcXVlX3N0cmluZyh2ZWN0b3IgdiwgY29uc3QgY2hhciAqc3RyKQoreworCXVuc2lnbmVkIGludCBpOworCWNoYXIgKm1hdGNoOworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUodik7IGkrKykKKwkJaWYgKChtYXRjaCA9IHZlY3Rvcl9zbG90KHYsIGkpKSAhPSBOVUxMKQorCQkJaWYgKHN0cmNtcChtYXRjaCwgc3RyKSA9PSAwKQorCQkJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKiBDb21wYXJlIHN0cmluZyB0byBkZXNjcmlwdGlvbiB2ZWN0b3IuICBJZiB0aGVyZSBpcyBzYW1lIHN0cmluZworICAgcmV0dXJuIDEgZWxzZSByZXR1cm4gMC4gKi8KK3N0YXRpYyBpbnQgZGVzY191bmlxdWVfc3RyaW5nKHZlY3RvciB2LCBjb25zdCBjaGFyICpzdHIpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGRlc2MgKmRlc2M7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2KTsgaSsrKQorCQlpZiAoKGRlc2MgPSB2ZWN0b3Jfc2xvdCh2LCBpKSkgIT0gTlVMTCkKKwkJCWlmIChzdHJjbXAoZGVzYy0+Y21kLCBzdHIpID09IDApCisJCQkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY21kX3RyeV9kb19zaG9ydGN1dChlbnVtIG5vZGVfdHlwZSBub2RlLCBjaGFyICpmaXJzdF93b3JkKQoreworCWlmIChmaXJzdF93b3JkICE9IE5VTEwgJiYKKwkgICAgbm9kZSAhPSBBVVRIX05PREUgJiYKKwkgICAgbm9kZSAhPSBWSUVXX05PREUgJiYKKwkgICAgbm9kZSAhPSBBVVRIX0VOQUJMRV9OT0RFICYmCisJICAgIG5vZGUgIT0gRU5BQkxFX05PREUgJiYgMCA9PSBzdHJjbXAoImRvIiwgZmlyc3Rfd29yZCkpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisvKiAnPycgZGVzY3JpYmUgY29tbWFuZCBzdXBwb3J0LiAqLworc3RhdGljIHZlY3RvcgorY21kX2Rlc2NyaWJlX2NvbW1hbmRfcmVhbCh2ZWN0b3IgdmxpbmUsIHN0cnVjdCB2dHkgKnZ0eSwgaW50ICpzdGF0dXMpCit7CisJdW5zaWduZWQgaW50IGk7CisJdmVjdG9yIGNtZF92ZWN0b3I7CisjZGVmaW5lIElOSVRfTUFUQ0hWRUNfU0laRSAxMAorCXZlY3RvciBtYXRjaHZlYzsKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZF9lbGVtZW50OworCXVuc2lnbmVkIGludCBpbmRleDsKKwlpbnQgcmV0OworCWVudW0gbWF0Y2hfdHlwZSBtYXRjaDsKKwljaGFyICpjb21tYW5kOworCXN0YXRpYyBzdHJ1Y3QgZGVzYyBkZXNjX2NyID0geyAiPGNyPiIsICIiIH07CisKKwkvKiBTZXQgaW5kZXguICovCisJaWYgKHZlY3Rvcl9hY3RpdmUodmxpbmUpID09IDApIHsKKwkJKnN0YXR1cyA9IENNRF9FUlJfTk9fTUFUQ0g7CisJCXJldHVybiBOVUxMOworCX0gZWxzZQorCQlpbmRleCA9IHZlY3Rvcl9hY3RpdmUodmxpbmUpIC0gMTsKKworCS8qIE1ha2UgY29weSB2ZWN0b3Igb2YgY3VycmVudCBub2RlJ3MgY29tbWFuZCB2ZWN0b3IuICovCisJY21kX3ZlY3RvciA9IHZlY3Rvcl9jb3B5KGNtZF9ub2RlX3ZlY3RvcihjbWR2ZWMsIHZ0eS0+bm9kZSkpOworCisJLyogUHJlcGFyZSBtYXRjaCB2ZWN0b3IgKi8KKwltYXRjaHZlYyA9IHZlY3Rvcl9pbml0KElOSVRfTUFUQ0hWRUNfU0laRSk7CisKKwkvKiBGaWx0ZXIgY29tbWFuZHMuICovCisJLyogT25seSB3b3JkcyBwcmVjZWRlcyBjdXJyZW50IHdvcmQgd2lsbCBiZSBjaGVja2VkIGluIHRoaXMgbG9vcC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW5kZXg7IGkrKykKKwkJaWYgKChjb21tYW5kID0gdmVjdG9yX3Nsb3QodmxpbmUsIGkpKSkgeworCQkJbWF0Y2ggPQorCQkJICAgIGNtZF9maWx0ZXJfYnlfY29tcGxldGlvbihjb21tYW5kLCBjbWRfdmVjdG9yLCBpKTsKKworCQkJaWYgKG1hdGNoID09IHZhcmFyZ19tYXRjaCkgeworCQkJCXN0cnVjdCBjbWRfZWxlbWVudCAqY21kX2VsZW1lbnQ7CisJCQkJdmVjdG9yIGRlc2N2ZWM7CisJCQkJdW5zaWduZWQgaW50IGosIGs7CisKKwkJCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShjbWRfdmVjdG9yKTsgaisrKQorCQkJCQlpZiAoKGNtZF9lbGVtZW50ID0KKwkJCQkJICAgICB2ZWN0b3Jfc2xvdChjbWRfdmVjdG9yLCBqKSkgIT0gTlVMTAorCQkJCQkgICAgJiYKKwkJCQkJICAgICh2ZWN0b3JfYWN0aXZlCisJCQkJCSAgICAgKGNtZF9lbGVtZW50LT5zdHJ2ZWMpKSkgeworCQkJCQkJZGVzY3ZlYyA9CisJCQkJCQkgICAgdmVjdG9yX3Nsb3QoY21kX2VsZW1lbnQtPgorCQkJCQkJCQlzdHJ2ZWMsCisJCQkJCQkJCXZlY3Rvcl9hY3RpdmUKKwkJCQkJCQkJKGNtZF9lbGVtZW50LT4KKwkJCQkJCQkJIHN0cnZlYykgLSAxKTsKKwkJCQkJCWZvciAoayA9IDA7CisJCQkJCQkgICAgIGsgPCB2ZWN0b3JfYWN0aXZlKGRlc2N2ZWMpOworCQkJCQkJICAgICBrKyspIHsKKwkJCQkJCQlzdHJ1Y3QgZGVzYyAqZGVzYyA9CisJCQkJCQkJICAgIHZlY3Rvcl9zbG90KGRlc2N2ZWMsCisJCQkJCQkJCQlrKTsKKwkJCQkJCQl2ZWN0b3Jfc2V0KG1hdGNodmVjLAorCQkJCQkJCQkgICBkZXNjKTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJdmVjdG9yX3NldChtYXRjaHZlYywgJmRlc2NfY3IpOworCQkJCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCisJCQkJcmV0dXJuIG1hdGNodmVjOworCQkJfQorCisJCQlpZiAoKHJldCA9CisJCQkgICAgIGlzX2NtZF9hbWJpZ3VvdXMoY29tbWFuZCwgY21kX3ZlY3RvciwgaSwKKwkJCQkJICAgICAgbWF0Y2gpKSA9PSAxKSB7CisJCQkJdmVjdG9yX2ZyZWUoY21kX3ZlY3Rvcik7CisJCQkJKnN0YXR1cyA9IENNRF9FUlJfQU1CSUdVT1VTOworCQkJCXJldHVybiBOVUxMOworCQkJfSBlbHNlIGlmIChyZXQgPT0gMikgeworCQkJCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCQkJCSpzdGF0dXMgPSBDTURfRVJSX05PX01BVENIOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisKKwkvKiBQcmVwYXJlIG1hdGNoIHZlY3RvciAqLworCS8qICBtYXRjaHZlYyA9IHZlY3Rvcl9pbml0IChJTklUX01BVENIVkVDX1NJWkUpOyAqLworCisJLyogTWFrZSBzdXJlIHRoYXQgY21kX3ZlY3RvciBpcyBmaWx0ZXJlZCBiYXNlZCBvbiBjdXJyZW50IHdvcmQgKi8KKwljb21tYW5kID0gdmVjdG9yX3Nsb3QodmxpbmUsIGluZGV4KTsKKwlpZiAoY29tbWFuZCkKKwkJbWF0Y2ggPSBjbWRfZmlsdGVyX2J5X2NvbXBsZXRpb24oY29tbWFuZCwgY21kX3ZlY3RvciwgaW5kZXgpOworCisJLyogTWFrZSBkZXNjcmlwdGlvbiB2ZWN0b3IuICovCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoY21kX3ZlY3Rvcik7IGkrKykKKwkJaWYgKChjbWRfZWxlbWVudCA9IHZlY3Rvcl9zbG90KGNtZF92ZWN0b3IsIGkpKSAhPSBOVUxMKSB7CisJCQljb25zdCBjaGFyICpzdHJpbmcgPSBOVUxMOworCQkJdmVjdG9yIHN0cnZlYyA9IGNtZF9lbGVtZW50LT5zdHJ2ZWM7CisKKwkJCS8qIGlmIGNvbW1hbmQgaXMgTlVMTCwgaW5kZXggbWF5IGJlIGVxdWFsIHRvIHZlY3Rvcl9hY3RpdmUgKi8KKwkJCWlmIChjb21tYW5kICYmIGluZGV4ID49IHZlY3Rvcl9hY3RpdmUoc3RydmVjKSkKKwkJCQl2ZWN0b3Jfc2xvdChjbWRfdmVjdG9yLCBpKSA9IE5VTEw7CisJCQllbHNlIHsKKwkJCQkvKiBDaGVjayBpZiBjb21tYW5kIGlzIGNvbXBsZXRlZC4gKi8KKwkJCQlpZiAoY29tbWFuZCA9PSBOVUxMCisJCQkJICAgICYmIGluZGV4ID09IHZlY3Rvcl9hY3RpdmUoc3RydmVjKSkgeworCQkJCQlzdHJpbmcgPSAiPGNyPiI7CisJCQkJCWlmICghZGVzY191bmlxdWVfc3RyaW5nCisJCQkJCSAgICAobWF0Y2h2ZWMsIHN0cmluZykpCisJCQkJCQl2ZWN0b3Jfc2V0KG1hdGNodmVjLCAmZGVzY19jcik7CisJCQkJfSBlbHNlIHsKKwkJCQkJdW5zaWduZWQgaW50IGo7CisJCQkJCXZlY3RvciBkZXNjdmVjID0KKwkJCQkJICAgIHZlY3Rvcl9zbG90KHN0cnZlYywgaW5kZXgpOworCQkJCQlzdHJ1Y3QgZGVzYyAqZGVzYzsKKworCQkJCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShkZXNjdmVjKTsKKwkJCQkJICAgICBqKyspCisJCQkJCQlpZiAoKGRlc2MgPQorCQkJCQkJICAgICB2ZWN0b3Jfc2xvdChkZXNjdmVjLCBqKSkpIHsKKwkJCQkJCQlzdHJpbmcgPQorCQkJCQkJCSAgICBjbWRfZW50cnlfZnVuY3Rpb25fZGVzYworCQkJCQkJCSAgICAoY29tbWFuZCwKKwkJCQkJCQkgICAgIGRlc2MtPmNtZCk7CisJCQkJCQkJaWYgKHN0cmluZykgeworCQkJCQkJCQkvKiBVbmlxdWVuZXNzIGNoZWNrICovCisJCQkJCQkJCWlmICghZGVzY191bmlxdWVfc3RyaW5nKG1hdGNodmVjLCBzdHJpbmcpKQorCQkJCQkJCQkJdmVjdG9yX3NldAorCQkJCQkJCQkJICAgIChtYXRjaHZlYywKKwkJCQkJCQkJCSAgICAgZGVzYyk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCisJaWYgKHZlY3Rvcl9zbG90KG1hdGNodmVjLCAwKSA9PSBOVUxMKSB7CisJCXZlY3Rvcl9mcmVlKG1hdGNodmVjKTsKKwkJKnN0YXR1cyA9IENNRF9FUlJfTk9fTUFUQ0g7CisJfSBlbHNlCisJCSpzdGF0dXMgPSBDTURfU1VDQ0VTUzsKKworCXJldHVybiBtYXRjaHZlYzsKK30KKwordmVjdG9yIGNtZF9kZXNjcmliZV9jb21tYW5kKHZlY3RvciB2bGluZSwgc3RydWN0IHZ0eSAqIHZ0eSwgaW50ICpzdGF0dXMpCit7CisJdmVjdG9yIHJldDsKKworCWlmIChjbWRfdHJ5X2RvX3Nob3J0Y3V0KHZ0eS0+bm9kZSwgdmVjdG9yX3Nsb3QodmxpbmUsIDApKSkgeworCQllbnVtIG5vZGVfdHlwZSBvbm9kZTsKKwkJdmVjdG9yIHNoaWZ0ZWRfdmxpbmU7CisJCXVuc2lnbmVkIGludCBpbmRleDsKKworCQlvbm9kZSA9IHZ0eS0+bm9kZTsKKwkJdnR5LT5ub2RlID0gRU5BQkxFX05PREU7CisJCS8qIFdlIGNhbiB0cnkgaXQgb24gZW5hYmxlIG5vZGUsIGNvcycgdGhlIHZ0eSBpcyBhdXRoZW50aWNhdGVkICovCisKKwkJc2hpZnRlZF92bGluZSA9IHZlY3Rvcl9pbml0KHZlY3Rvcl9jb3VudCh2bGluZSkpOworCQkvKiB1c2UgbWVtY3B5PyAqLworCQlmb3IgKGluZGV4ID0gMTsgaW5kZXggPCB2ZWN0b3JfYWN0aXZlKHZsaW5lKTsgaW5kZXgrKykgeworCQkJdmVjdG9yX3NldF9pbmRleChzaGlmdGVkX3ZsaW5lLCBpbmRleCAtIDEsCisJCQkJCSB2ZWN0b3JfbG9va3VwKHZsaW5lLCBpbmRleCkpOworCQl9CisKKwkJcmV0ID0gY21kX2Rlc2NyaWJlX2NvbW1hbmRfcmVhbChzaGlmdGVkX3ZsaW5lLCB2dHksIHN0YXR1cyk7CisKKwkJdmVjdG9yX2ZyZWUoc2hpZnRlZF92bGluZSk7CisJCXZ0eS0+bm9kZSA9IG9ub2RlOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiBjbWRfZGVzY3JpYmVfY29tbWFuZF9yZWFsKHZsaW5lLCB2dHksIHN0YXR1cyk7Cit9CisKKy8qIENoZWNrIExDRCBvZiBtYXRjaGVkIGNvbW1hbmQuICovCitzdGF0aWMgaW50IGNtZF9sY2QoY2hhciAqKm1hdGNoZWQpCit7CisJaW50IGk7CisJaW50IGo7CisJaW50IGxjZCA9IC0xOworCWNoYXIgKnMxLCAqczI7CisJY2hhciBjMSwgYzI7CisKKwlpZiAobWF0Y2hlZFswXSA9PSBOVUxMIHx8IG1hdGNoZWRbMV0gPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAxOyBtYXRjaGVkW2ldICE9IE5VTEw7IGkrKykgeworCQlzMSA9IG1hdGNoZWRbaSAtIDFdOworCQlzMiA9IG1hdGNoZWRbaV07CisKKwkJZm9yIChqID0gMDsgKGMxID0gczFbal0pICYmIChjMiA9IHMyW2pdKTsgaisrKQorCQkJaWYgKGMxICE9IGMyKQorCQkJCWJyZWFrOworCisJCWlmIChsY2QgPCAwKQorCQkJbGNkID0gajsKKwkJZWxzZSB7CisJCQlpZiAobGNkID4gaikKKwkJCQlsY2QgPSBqOworCQl9CisJfQorCXJldHVybiBsY2Q7Cit9CisKKy8qIENvbW1hbmQgbGluZSBjb21wbGV0aW9uIHN1cHBvcnQuICovCitzdGF0aWMgY2hhciAqKmNtZF9jb21wbGV0ZV9jb21tYW5kX3JlYWwodmVjdG9yIHZsaW5lLCBzdHJ1Y3QgdnR5ICp2dHksCisJCQkJCWludCAqc3RhdHVzKQoreworCXVuc2lnbmVkIGludCBpOworCXZlY3RvciBjbWRfdmVjdG9yID0gdmVjdG9yX2NvcHkoY21kX25vZGVfdmVjdG9yKGNtZHZlYywgdnR5LT5ub2RlKSk7CisjZGVmaW5lIElOSVRfTUFUQ0hWRUNfU0laRSAxMAorCXZlY3RvciBtYXRjaHZlYzsKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZF9lbGVtZW50OworCXVuc2lnbmVkIGludCBpbmRleDsKKwljaGFyICoqbWF0Y2hfc3RyOworCXN0cnVjdCBkZXNjICpkZXNjOworCXZlY3RvciBkZXNjdmVjOworCWNoYXIgKmNvbW1hbmQ7CisJaW50IGxjZDsKKworCWlmICh2ZWN0b3JfYWN0aXZlKHZsaW5lKSA9PSAwKSB7CisJCSpzdGF0dXMgPSBDTURfRVJSX05PX01BVENIOworCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UKKwkJaW5kZXggPSB2ZWN0b3JfYWN0aXZlKHZsaW5lKSAtIDE7CisKKwkvKiBGaXJzdCwgZmlsdGVyIGJ5IHByZWNlZWRpbmcgY29tbWFuZCBzdHJpbmcgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW5kZXg7IGkrKykKKwkJaWYgKChjb21tYW5kID0gdmVjdG9yX3Nsb3QodmxpbmUsIGkpKSkgeworCQkJZW51bSBtYXRjaF90eXBlIG1hdGNoOworCQkJaW50IHJldDsKKworCQkJLyogRmlyc3QgdHJ5IGNvbXBsZXRpb24gbWF0Y2gsIGlmIHRoZXJlIGlzIGV4YWN0bHkgbWF0Y2ggcmV0dXJuIDEgKi8KKwkJCW1hdGNoID0KKwkJCSAgICBjbWRfZmlsdGVyX2J5X2NvbXBsZXRpb24oY29tbWFuZCwgY21kX3ZlY3RvciwgaSk7CisKKwkJCS8qIElmIHRoZXJlIGlzIGV4YWN0IG1hdGNoIHRoZW4gZmlsdGVyIGFtYmlndW91cyBtYXRjaCBlbHNlIGNoZWNrCisJCQkgICBhbWJpZ3VvdXNuZXNzLiAqLworCQkJaWYgKChyZXQgPQorCQkJICAgICBpc19jbWRfYW1iaWd1b3VzKGNvbW1hbmQsIGNtZF92ZWN0b3IsIGksCisJCQkJCSAgICAgIG1hdGNoKSkgPT0gMSkgeworCQkJCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCQkJCSpzdGF0dXMgPSBDTURfRVJSX0FNQklHVU9VUzsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCS8qCisJCQkgICBlbHNlIGlmIChyZXQgPT0gMikKKwkJCSAgIHsKKwkJCSAgIHZlY3Rvcl9mcmVlIChjbWRfdmVjdG9yKTsKKwkJCSAgICpzdGF0dXMgPSBDTURfRVJSX05PX01BVENIOworCQkJICAgcmV0dXJuIE5VTEw7CisJCQkgICB9CisJCQkgKi8KKwkJfQorCisJLyogUHJlcGFyZSBtYXRjaCB2ZWN0b3IuICovCisJbWF0Y2h2ZWMgPSB2ZWN0b3JfaW5pdChJTklUX01BVENIVkVDX1NJWkUpOworCisJLyogTm93IHdlIGdvdCBpbnRvIGNvbXBsZXRpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWRfdmVjdG9yKTsgaSsrKQorCQlpZiAoKGNtZF9lbGVtZW50ID0gdmVjdG9yX3Nsb3QoY21kX3ZlY3RvciwgaSkpKSB7CisJCQljb25zdCBjaGFyICpzdHJpbmc7CisJCQl2ZWN0b3Igc3RydmVjID0gY21kX2VsZW1lbnQtPnN0cnZlYzsKKworCQkJLyogQ2hlY2sgZmllbGQgbGVuZ3RoICovCisJCQlpZiAoaW5kZXggPj0gdmVjdG9yX2FjdGl2ZShzdHJ2ZWMpKQorCQkJCXZlY3Rvcl9zbG90KGNtZF92ZWN0b3IsIGkpID0gTlVMTDsKKwkJCWVsc2UgeworCQkJCXVuc2lnbmVkIGludCBqOworCisJCQkJZGVzY3ZlYyA9IHZlY3Rvcl9zbG90KHN0cnZlYywgaW5kZXgpOworCQkJCWZvciAoaiA9IDA7IGogPCB2ZWN0b3JfYWN0aXZlKGRlc2N2ZWMpOyBqKyspCisJCQkJCWlmICgoZGVzYyA9IHZlY3Rvcl9zbG90KGRlc2N2ZWMsIGopKSkgeworCQkJCQkJaWYgKChzdHJpbmcgPSBjbWRfZW50cnlfZnVuY3Rpb24odmVjdG9yX3Nsb3QodmxpbmUsIGluZGV4KSwgZGVzYy0+Y21kKSkpCisJCQkJCQkJaWYgKGNtZF91bmlxdWVfc3RyaW5nIChtYXRjaHZlYywgc3RyaW5nKSkKKwkJCQkJCQkJdmVjdG9yX3NldCAobWF0Y2h2ZWMsIHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgc3RyaW5nKSk7CisJCQkJCX0KKwkJCX0KKwkJfQorCisJLyogV2UgZG9uJ3QgbmVlZCBjbWRfdmVjdG9yIGFueSBtb3JlLiAqLworCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCisJLyogTm8gbWF0Y2hlZCBjb21tYW5kICovCisJaWYgKHZlY3Rvcl9zbG90KG1hdGNodmVjLCAwKSA9PSBOVUxMKSB7CisJCXZlY3Rvcl9mcmVlKG1hdGNodmVjKTsKKworCQkvKiBJbiBjYXNlIG9mICdjb21tYW5kIFx0JyBwYXR0ZXJuLiAgRG8geW91IG5lZWQgJz8nIGNvbW1hbmQgYXQKKwkJICAgdGhlIGVuZCBvZiB0aGUgbGluZS4gKi8KKwkJaWYgKHZlY3Rvcl9zbG90KHZsaW5lLCBpbmRleCkgPT0gJ1wwJykKKwkJCSpzdGF0dXMgPSBDTURfRVJSX05PVEhJTkdfVE9ETzsKKwkJZWxzZQorCQkJKnN0YXR1cyA9IENNRF9FUlJfTk9fTUFUQ0g7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIE9ubHkgb25lIG1hdGNoZWQgKi8KKwlpZiAodmVjdG9yX3Nsb3QobWF0Y2h2ZWMsIDEpID09IE5VTEwpIHsKKwkJbWF0Y2hfc3RyID0gKGNoYXIgKiopbWF0Y2h2ZWMtPmluZGV4OworCQl2ZWN0b3Jfb25seV93cmFwcGVyX2ZyZWUobWF0Y2h2ZWMpOworCQkqc3RhdHVzID0gQ01EX0NPTVBMRVRFX0ZVTExfTUFUQ0g7CisJCXJldHVybiBtYXRjaF9zdHI7CisJfQorCS8qIE1ha2UgaXQgc3VyZSBsYXN0IGVsZW1lbnQgaXMgTlVMTC4gKi8KKwl2ZWN0b3Jfc2V0KG1hdGNodmVjLCBOVUxMKTsKKworCS8qIENoZWNrIExDRCBvZiBtYXRjaGVkIHN0cmluZ3MuICovCisJaWYgKHZlY3Rvcl9zbG90KHZsaW5lLCBpbmRleCkgIT0gTlVMTCkgeworCQlsY2QgPSBjbWRfbGNkKChjaGFyICoqKW1hdGNodmVjLT5pbmRleCk7CisKKwkJaWYgKGxjZCkgeworCQkJaW50IGxlbiA9IHN0cmxlbih2ZWN0b3Jfc2xvdCh2bGluZSwgaW5kZXgpKTsKKworCQkJaWYgKGxlbiA8IGxjZCkgeworCQkJCWNoYXIgKmxjZHN0cjsKKworCQkJCWxjZHN0ciA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV9jbWRfY3R4LCBsY2QgKyAxLAorCQkJCQkJICAgICAgImNvbXBsZXRlLWxjZHN0ciIpOworCQkJCW1lbWNweShsY2RzdHIsIG1hdGNodmVjLT5pbmRleFswXSwgbGNkKTsKKwkJCQlsY2RzdHJbbGNkXSA9ICdcMCc7CisKKwkJCQkvKiBtYXRjaF9zdHIgPSAoY2hhciAqKikgJmxjZHN0cjsgKi8KKworCQkJCS8qIEZyZWUgbWF0Y2h2ZWMuICovCisJCQkJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUobWF0Y2h2ZWMpOyBpKyspIHsKKwkJCQkJaWYgKHZlY3Rvcl9zbG90KG1hdGNodmVjLCBpKSkKKwkJCQkJCXRhbGxvY19mcmVlKHZlY3Rvcl9zbG90KG1hdGNodmVjLCBpKSk7CisJCQkJfQorCQkJCXZlY3Rvcl9mcmVlKG1hdGNodmVjKTsKKworCQkJCS8qIE1ha2UgbmV3IG1hdGNodmVjLiAqLworCQkJCW1hdGNodmVjID0gdmVjdG9yX2luaXQoSU5JVF9NQVRDSFZFQ19TSVpFKTsKKwkJCQl2ZWN0b3Jfc2V0KG1hdGNodmVjLCBsY2RzdHIpOworCQkJCW1hdGNoX3N0ciA9IChjaGFyICoqKW1hdGNodmVjLT5pbmRleDsKKwkJCQl2ZWN0b3Jfb25seV93cmFwcGVyX2ZyZWUobWF0Y2h2ZWMpOworCisJCQkJKnN0YXR1cyA9IENNRF9DT01QTEVURV9NQVRDSDsKKwkJCQlyZXR1cm4gbWF0Y2hfc3RyOworCQkJfQorCQl9CisJfQorCisJbWF0Y2hfc3RyID0gKGNoYXIgKiopbWF0Y2h2ZWMtPmluZGV4OworCXZlY3Rvcl9vbmx5X3dyYXBwZXJfZnJlZShtYXRjaHZlYyk7CisJKnN0YXR1cyA9IENNRF9DT01QTEVURV9MSVNUX01BVENIOworCXJldHVybiBtYXRjaF9zdHI7Cit9CisKK2NoYXIgKipjbWRfY29tcGxldGVfY29tbWFuZCh2ZWN0b3IgdmxpbmUsIHN0cnVjdCB2dHkgKnZ0eSwgaW50ICpzdGF0dXMpCit7CisJY2hhciAqKnJldDsKKworCWlmIChjbWRfdHJ5X2RvX3Nob3J0Y3V0KHZ0eS0+bm9kZSwgdmVjdG9yX3Nsb3QodmxpbmUsIDApKSkgeworCQllbnVtIG5vZGVfdHlwZSBvbm9kZTsKKwkJdmVjdG9yIHNoaWZ0ZWRfdmxpbmU7CisJCXVuc2lnbmVkIGludCBpbmRleDsKKworCQlvbm9kZSA9IHZ0eS0+bm9kZTsKKwkJdnR5LT5ub2RlID0gRU5BQkxFX05PREU7CisJCS8qIFdlIGNhbiB0cnkgaXQgb24gZW5hYmxlIG5vZGUsIGNvcycgdGhlIHZ0eSBpcyBhdXRoZW50aWNhdGVkICovCisKKwkJc2hpZnRlZF92bGluZSA9IHZlY3Rvcl9pbml0KHZlY3Rvcl9jb3VudCh2bGluZSkpOworCQkvKiB1c2UgbWVtY3B5PyAqLworCQlmb3IgKGluZGV4ID0gMTsgaW5kZXggPCB2ZWN0b3JfYWN0aXZlKHZsaW5lKTsgaW5kZXgrKykgeworCQkJdmVjdG9yX3NldF9pbmRleChzaGlmdGVkX3ZsaW5lLCBpbmRleCAtIDEsCisJCQkJCSB2ZWN0b3JfbG9va3VwKHZsaW5lLCBpbmRleCkpOworCQl9CisKKwkJcmV0ID0gY21kX2NvbXBsZXRlX2NvbW1hbmRfcmVhbChzaGlmdGVkX3ZsaW5lLCB2dHksIHN0YXR1cyk7CisKKwkJdmVjdG9yX2ZyZWUoc2hpZnRlZF92bGluZSk7CisJCXZ0eS0+bm9kZSA9IG9ub2RlOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiBjbWRfY29tcGxldGVfY29tbWFuZF9yZWFsKHZsaW5lLCB2dHksIHN0YXR1cyk7Cit9CisKKy8qIHJldHVybiBwYXJlbnQgbm9kZSAqLworLyogTVVTVCBldmVudHVhbGx5IGNvbnZlcmdlIG9uIENPTkZJR19OT0RFICovCitlbnVtIG5vZGVfdHlwZSB2dHlfZ29fcGFyZW50KHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlhc3NlcnQodnR5LT5ub2RlID4gQ09ORklHX05PREUpOworCisJaWYgKGhvc3QuYXBwX2luZm8tPmdvX3BhcmVudF9jYikKKwkJaG9zdC5hcHBfaW5mby0+Z29fcGFyZW50X2NiKHZ0eSk7CisJZWxzZQorCQl2dHktPm5vZGUgPSBDT05GSUdfTk9ERTsKKworCXJldHVybiB2dHktPm5vZGU7Cit9CisKKy8qIEV4ZWN1dGUgY29tbWFuZCBieSBhcmd1bWVudCB2bGluZSB2ZWN0b3IuICovCitzdGF0aWMgaW50CitjbWRfZXhlY3V0ZV9jb21tYW5kX3JlYWwodmVjdG9yIHZsaW5lLCBzdHJ1Y3QgdnR5ICp2dHksCisJCQkgc3RydWN0IGNtZF9lbGVtZW50ICoqY21kKQoreworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCBpbmRleDsKKwl2ZWN0b3IgY21kX3ZlY3RvcjsKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZF9lbGVtZW50OworCXN0cnVjdCBjbWRfZWxlbWVudCAqbWF0Y2hlZF9lbGVtZW50OworCXVuc2lnbmVkIGludCBtYXRjaGVkX2NvdW50LCBpbmNvbXBsZXRlX2NvdW50OworCWludCBhcmdjOworCWNvbnN0IGNoYXIgKmFyZ3ZbQ01EX0FSR0NfTUFYXTsKKwllbnVtIG1hdGNoX3R5cGUgbWF0Y2ggPSAwOworCWludCB2YXJmbGFnOworCWNoYXIgKmNvbW1hbmQ7CisKKwkvKiBNYWtlIGNvcHkgb2YgY29tbWFuZCBlbGVtZW50cy4gKi8KKwljbWRfdmVjdG9yID0gdmVjdG9yX2NvcHkoY21kX25vZGVfdmVjdG9yKGNtZHZlYywgdnR5LT5ub2RlKSk7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB2ZWN0b3JfYWN0aXZlKHZsaW5lKTsgaW5kZXgrKykKKwkJaWYgKChjb21tYW5kID0gdmVjdG9yX3Nsb3QodmxpbmUsIGluZGV4KSkpIHsKKwkJCWludCByZXQ7CisKKwkJCW1hdGNoID0KKwkJCSAgICBjbWRfZmlsdGVyX2J5X2NvbXBsZXRpb24oY29tbWFuZCwgY21kX3ZlY3RvciwKKwkJCQkJCSAgICAgaW5kZXgpOworCisJCQlpZiAobWF0Y2ggPT0gdmFyYXJnX21hdGNoKQorCQkJCWJyZWFrOworCisJCQlyZXQgPQorCQkJICAgIGlzX2NtZF9hbWJpZ3VvdXMoY29tbWFuZCwgY21kX3ZlY3RvciwgaW5kZXgsIG1hdGNoKTsKKworCQkJaWYgKHJldCA9PSAxKSB7CisJCQkJdmVjdG9yX2ZyZWUoY21kX3ZlY3Rvcik7CisJCQkJcmV0dXJuIENNRF9FUlJfQU1CSUdVT1VTOworCQkJfSBlbHNlIGlmIChyZXQgPT0gMikgeworCQkJCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCQkJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCQkJfQorCQl9CisKKwkvKiBDaGVjayBtYXRjaGVkIGNvdW50LiAqLworCW1hdGNoZWRfZWxlbWVudCA9IE5VTEw7CisJbWF0Y2hlZF9jb3VudCA9IDA7CisJaW5jb21wbGV0ZV9jb3VudCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWRfdmVjdG9yKTsgaSsrKQorCQlpZiAoKGNtZF9lbGVtZW50ID0gdmVjdG9yX3Nsb3QoY21kX3ZlY3RvciwgaSkpKSB7CisJCQlpZiAobWF0Y2ggPT0gdmFyYXJnX21hdGNoCisJCQkgICAgfHwgaW5kZXggPj0gY21kX2VsZW1lbnQtPmNtZHNpemUpIHsKKwkJCQltYXRjaGVkX2VsZW1lbnQgPSBjbWRfZWxlbWVudDsKKyNpZiAwCisJCQkJcHJpbnRmKCJERUJVRzogJXNcbiIsIGNtZF9lbGVtZW50LT5zdHJpbmcpOworI2VuZGlmCisJCQkJbWF0Y2hlZF9jb3VudCsrOworCQkJfSBlbHNlIHsKKwkJCQlpbmNvbXBsZXRlX2NvdW50Kys7CisJCQl9CisJCX0KKworCS8qIEZpbmlzaCBvZiB1c2luZyBjbWRfdmVjdG9yLiAqLworCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCisJLyogVG8gZXhlY3V0ZSBjb21tYW5kLCBtYXRjaGVkX2NvdW50IG11c3QgYmUgMS4gKi8KKwlpZiAobWF0Y2hlZF9jb3VudCA9PSAwKSB7CisJCWlmIChpbmNvbXBsZXRlX2NvdW50KQorCQkJcmV0dXJuIENNRF9FUlJfSU5DT01QTEVURTsKKwkJZWxzZQorCQkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisJfQorCisJaWYgKG1hdGNoZWRfY291bnQgPiAxKQorCQlyZXR1cm4gQ01EX0VSUl9BTUJJR1VPVVM7CisKKwkvKiBBcmd1bWVudCB0cmVhdG1lbnQgKi8KKwl2YXJmbGFnID0gMDsKKwlhcmdjID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKHZsaW5lKTsgaSsrKSB7CisJCWlmICh2YXJmbGFnKQorCQkJYXJndlthcmdjKytdID0gdmVjdG9yX3Nsb3QodmxpbmUsIGkpOworCQllbHNlIHsKKwkJCXZlY3RvciBkZXNjdmVjID0KKwkJCSAgICB2ZWN0b3Jfc2xvdChtYXRjaGVkX2VsZW1lbnQtPnN0cnZlYywgaSk7CisKKwkJCWlmICh2ZWN0b3JfYWN0aXZlKGRlc2N2ZWMpID09IDEpIHsKKwkJCQlzdHJ1Y3QgZGVzYyAqZGVzYyA9IHZlY3Rvcl9zbG90KGRlc2N2ZWMsIDApOworCisJCQkJaWYgKENNRF9WQVJBUkcoZGVzYy0+Y21kKSkKKwkJCQkJdmFyZmxhZyA9IDE7CisKKwkJCQlpZiAodmFyZmxhZyB8fCBDTURfVkFSSUFCTEUoZGVzYy0+Y21kKQorCQkJCSAgICB8fCBDTURfT1BUSU9OKGRlc2MtPmNtZCkpCisJCQkJCWFyZ3ZbYXJnYysrXSA9IHZlY3Rvcl9zbG90KHZsaW5lLCBpKTsKKwkJCX0gZWxzZQorCQkJCWFyZ3ZbYXJnYysrXSA9IHZlY3Rvcl9zbG90KHZsaW5lLCBpKTsKKwkJfQorCisJCWlmIChhcmdjID49IENNRF9BUkdDX01BWCkKKwkJCXJldHVybiBDTURfRVJSX0VYRUVEX0FSR0NfTUFYOworCX0KKworCS8qIEZvciB2dHlzaCBleGVjdXRpb24uICovCisJaWYgKGNtZCkKKwkJKmNtZCA9IG1hdGNoZWRfZWxlbWVudDsKKworCWlmIChtYXRjaGVkX2VsZW1lbnQtPmRhZW1vbikKKwkJcmV0dXJuIENNRF9TVUNDRVNTX0RBRU1PTjsKKworCS8qIEV4ZWN1dGUgbWF0Y2hlZCBjb21tYW5kLiAqLworCXJldHVybiAoKm1hdGNoZWRfZWxlbWVudC0+ZnVuYykgKG1hdGNoZWRfZWxlbWVudCwgdnR5LCBhcmdjLCBhcmd2KTsKK30KKworaW50CitjbWRfZXhlY3V0ZV9jb21tYW5kKHZlY3RvciB2bGluZSwgc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgY21kX2VsZW1lbnQgKipjbWQsCisJCSAgICBpbnQgdnR5c2gpCit7CisJaW50IHJldCwgc2F2ZWRfcmV0LCB0cmllZCA9IDA7CisJZW51bSBub2RlX3R5cGUgb25vZGU7CisJdm9pZCAqb2luZGV4OworCisJb25vZGUgPSB2dHktPm5vZGU7CisJb2luZGV4ID0gdnR5LT5pbmRleDsKKworCWlmIChjbWRfdHJ5X2RvX3Nob3J0Y3V0KHZ0eS0+bm9kZSwgdmVjdG9yX3Nsb3QodmxpbmUsIDApKSkgeworCQl2ZWN0b3Igc2hpZnRlZF92bGluZTsKKwkJdW5zaWduZWQgaW50IGluZGV4OworCisJCXZ0eS0+bm9kZSA9IEVOQUJMRV9OT0RFOworCQkvKiBXZSBjYW4gdHJ5IGl0IG9uIGVuYWJsZSBub2RlLCBjb3MnIHRoZSB2dHkgaXMgYXV0aGVudGljYXRlZCAqLworCisJCXNoaWZ0ZWRfdmxpbmUgPSB2ZWN0b3JfaW5pdCh2ZWN0b3JfY291bnQodmxpbmUpKTsKKwkJLyogdXNlIG1lbWNweT8gKi8KKwkJZm9yIChpbmRleCA9IDE7IGluZGV4IDwgdmVjdG9yX2FjdGl2ZSh2bGluZSk7IGluZGV4KyspIHsKKwkJCXZlY3Rvcl9zZXRfaW5kZXgoc2hpZnRlZF92bGluZSwgaW5kZXggLSAxLAorCQkJCQkgdmVjdG9yX2xvb2t1cCh2bGluZSwgaW5kZXgpKTsKKwkJfQorCisJCXJldCA9IGNtZF9leGVjdXRlX2NvbW1hbmRfcmVhbChzaGlmdGVkX3ZsaW5lLCB2dHksIGNtZCk7CisKKwkJdmVjdG9yX2ZyZWUoc2hpZnRlZF92bGluZSk7CisJCXZ0eS0+bm9kZSA9IG9ub2RlOworCQlyZXR1cm4gcmV0OworCX0KKworCXNhdmVkX3JldCA9IHJldCA9IGNtZF9leGVjdXRlX2NvbW1hbmRfcmVhbCh2bGluZSwgdnR5LCBjbWQpOworCisJaWYgKHZ0eXNoKQorCQlyZXR1cm4gc2F2ZWRfcmV0OworCisJLyogVGhpcyBhc3N1bWVzIGFsbCBub2RlcyBhYm92ZSBDT05GSUdfTk9ERSBhcmUgY2hpbGRzIG9mIENPTkZJR19OT0RFICovCisJd2hpbGUgKHJldCAhPSBDTURfU1VDQ0VTUyAmJiByZXQgIT0gQ01EX1dBUk5JTkcKKwkgICAgICAgJiYgdnR5LT5ub2RlID4gQ09ORklHX05PREUpIHsKKwkJdnR5X2dvX3BhcmVudCh2dHkpOworCQlyZXQgPSBjbWRfZXhlY3V0ZV9jb21tYW5kX3JlYWwodmxpbmUsIHZ0eSwgY21kKTsKKwkJdHJpZWQgPSAxOworCQlpZiAocmV0ID09IENNRF9TVUNDRVNTIHx8IHJldCA9PSBDTURfV0FSTklORykgeworCQkJLyogc3VjY2VzZnVsbCBjb21tYW5kLCBsZWF2ZSB0aGUgbm9kZSBhcyBpcyAqLworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKwkvKiBubyBjb21tYW5kIHN1Y2NlZWRlZCwgcmVzZXQgdGhlIHZ0eSB0byB0aGUgb3JpZ2luYWwgbm9kZSBhbmQKKwkgICByZXR1cm4gdGhlIGVycm9yIGZvciB0aGlzIG5vZGUgKi8KKwlpZiAodHJpZWQpIHsKKwkJdnR5LT5ub2RlID0gb25vZGU7CisJCXZ0eS0+aW5kZXggPSBvaW5kZXg7CisJfQorCXJldHVybiBzYXZlZF9yZXQ7Cit9CisKKy8qIEV4ZWN1dGUgY29tbWFuZCBieSBhcmd1bWVudCByZWFkbGluZS4gKi8KK2ludAorY21kX2V4ZWN1dGVfY29tbWFuZF9zdHJpY3QodmVjdG9yIHZsaW5lLCBzdHJ1Y3QgdnR5ICp2dHksCisJCQkgICBzdHJ1Y3QgY21kX2VsZW1lbnQgKipjbWQpCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IGluZGV4OworCXZlY3RvciBjbWRfdmVjdG9yOworCXN0cnVjdCBjbWRfZWxlbWVudCAqY21kX2VsZW1lbnQ7CisJc3RydWN0IGNtZF9lbGVtZW50ICptYXRjaGVkX2VsZW1lbnQ7CisJdW5zaWduZWQgaW50IG1hdGNoZWRfY291bnQsIGluY29tcGxldGVfY291bnQ7CisJaW50IGFyZ2M7CisJY29uc3QgY2hhciAqYXJndltDTURfQVJHQ19NQVhdOworCWludCB2YXJmbGFnOworCWVudW0gbWF0Y2hfdHlwZSBtYXRjaCA9IDA7CisJY2hhciAqY29tbWFuZDsKKworCS8qIE1ha2UgY29weSBvZiBjb21tYW5kIGVsZW1lbnQgKi8KKwljbWRfdmVjdG9yID0gdmVjdG9yX2NvcHkoY21kX25vZGVfdmVjdG9yKGNtZHZlYywgdnR5LT5ub2RlKSk7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB2ZWN0b3JfYWN0aXZlKHZsaW5lKTsgaW5kZXgrKykKKwkJaWYgKChjb21tYW5kID0gdmVjdG9yX3Nsb3QodmxpbmUsIGluZGV4KSkpIHsKKwkJCWludCByZXQ7CisKKwkJCW1hdGNoID0gY21kX2ZpbHRlcl9ieV9zdHJpbmcodmVjdG9yX3Nsb3QodmxpbmUsIGluZGV4KSwKKwkJCQkJCSAgICAgY21kX3ZlY3RvciwgaW5kZXgpOworCisJCQkvKiBJZiBjb21tYW5kIG1lZXRzICcuVkFSQVJHJyB0aGVuIGZpbmlzaCBtYXRjaGluZy4gKi8KKwkJCWlmIChtYXRjaCA9PSB2YXJhcmdfbWF0Y2gpCisJCQkJYnJlYWs7CisKKwkJCXJldCA9CisJCQkgICAgaXNfY21kX2FtYmlndW91cyhjb21tYW5kLCBjbWRfdmVjdG9yLCBpbmRleCwgbWF0Y2gpOworCQkJaWYgKHJldCA9PSAxKSB7CisJCQkJdmVjdG9yX2ZyZWUoY21kX3ZlY3Rvcik7CisJCQkJcmV0dXJuIENNRF9FUlJfQU1CSUdVT1VTOworCQkJfQorCQkJaWYgKHJldCA9PSAyKSB7CisJCQkJdmVjdG9yX2ZyZWUoY21kX3ZlY3Rvcik7CisJCQkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisJCQl9CisJCX0KKworCS8qIENoZWNrIG1hdGNoZWQgY291bnQuICovCisJbWF0Y2hlZF9lbGVtZW50ID0gTlVMTDsKKwltYXRjaGVkX2NvdW50ID0gMDsKKwlpbmNvbXBsZXRlX2NvdW50ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWRfdmVjdG9yKTsgaSsrKQorCQlpZiAodmVjdG9yX3Nsb3QoY21kX3ZlY3RvciwgaSkgIT0gTlVMTCkgeworCQkJY21kX2VsZW1lbnQgPSB2ZWN0b3Jfc2xvdChjbWRfdmVjdG9yLCBpKTsKKworCQkJaWYgKG1hdGNoID09IHZhcmFyZ19tYXRjaAorCQkJICAgIHx8IGluZGV4ID49IGNtZF9lbGVtZW50LT5jbWRzaXplKSB7CisJCQkJbWF0Y2hlZF9lbGVtZW50ID0gY21kX2VsZW1lbnQ7CisJCQkJbWF0Y2hlZF9jb3VudCsrOworCQkJfSBlbHNlCisJCQkJaW5jb21wbGV0ZV9jb3VudCsrOworCQl9CisKKwkvKiBGaW5pc2ggb2YgdXNpbmcgY21kX3ZlY3Rvci4gKi8KKwl2ZWN0b3JfZnJlZShjbWRfdmVjdG9yKTsKKworCS8qIFRvIGV4ZWN1dGUgY29tbWFuZCwgbWF0Y2hlZF9jb3VudCBtdXN0IGJlIDEuICovCisJaWYgKG1hdGNoZWRfY291bnQgPT0gMCkgeworCQlpZiAoaW5jb21wbGV0ZV9jb3VudCkKKwkJCXJldHVybiBDTURfRVJSX0lOQ09NUExFVEU7CisJCWVsc2UKKwkJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCX0KKworCWlmIChtYXRjaGVkX2NvdW50ID4gMSkKKwkJcmV0dXJuIENNRF9FUlJfQU1CSUdVT1VTOworCisJLyogQXJndW1lbnQgdHJlYXRtZW50ICovCisJdmFyZmxhZyA9IDA7CisJYXJnYyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2bGluZSk7IGkrKykgeworCQlpZiAodmFyZmxhZykKKwkJCWFyZ3ZbYXJnYysrXSA9IHZlY3Rvcl9zbG90KHZsaW5lLCBpKTsKKwkJZWxzZSB7CisJCQl2ZWN0b3IgZGVzY3ZlYyA9CisJCQkgICAgdmVjdG9yX3Nsb3QobWF0Y2hlZF9lbGVtZW50LT5zdHJ2ZWMsIGkpOworCisJCQlpZiAodmVjdG9yX2FjdGl2ZShkZXNjdmVjKSA9PSAxKSB7CisJCQkJc3RydWN0IGRlc2MgKmRlc2MgPSB2ZWN0b3Jfc2xvdChkZXNjdmVjLCAwKTsKKworCQkJCWlmIChDTURfVkFSQVJHKGRlc2MtPmNtZCkpCisJCQkJCXZhcmZsYWcgPSAxOworCisJCQkJaWYgKHZhcmZsYWcgfHwgQ01EX1ZBUklBQkxFKGRlc2MtPmNtZCkKKwkJCQkgICAgfHwgQ01EX09QVElPTihkZXNjLT5jbWQpKQorCQkJCQlhcmd2W2FyZ2MrK10gPSB2ZWN0b3Jfc2xvdCh2bGluZSwgaSk7CisJCQl9IGVsc2UKKwkJCQlhcmd2W2FyZ2MrK10gPSB2ZWN0b3Jfc2xvdCh2bGluZSwgaSk7CisJCX0KKworCQlpZiAoYXJnYyA+PSBDTURfQVJHQ19NQVgpCisJCQlyZXR1cm4gQ01EX0VSUl9FWEVFRF9BUkdDX01BWDsKKwl9CisKKwkvKiBGb3IgdnR5c2ggZXhlY3V0aW9uLiAqLworCWlmIChjbWQpCisJCSpjbWQgPSBtYXRjaGVkX2VsZW1lbnQ7CisKKwlpZiAobWF0Y2hlZF9lbGVtZW50LT5kYWVtb24pCisJCXJldHVybiBDTURfU1VDQ0VTU19EQUVNT047CisKKwkvKiBOb3cgZXhlY3V0ZSBtYXRjaGVkIGNvbW1hbmQgKi8KKwlyZXR1cm4gKCptYXRjaGVkX2VsZW1lbnQtPmZ1bmMpIChtYXRjaGVkX2VsZW1lbnQsIHZ0eSwgYXJnYywgYXJndik7Cit9CisKKy8qIENvbmZpZ3JhdGlvbiBtYWtlIGZyb20gZmlsZS4gKi8KK2ludCBjb25maWdfZnJvbV9maWxlKHN0cnVjdCB2dHkgKnZ0eSwgRklMRSAqIGZwKQoreworCWludCByZXQ7CisJdmVjdG9yIHZsaW5lOworCisJd2hpbGUgKGZnZXRzKHZ0eS0+YnVmLCBWVFlfQlVGU0laLCBmcCkpIHsKKwkJdmxpbmUgPSBjbWRfbWFrZV9zdHJ2ZWModnR5LT5idWYpOworCisJCS8qIEluIGNhc2Ugb2YgY29tbWVudCBsaW5lICovCisJCWlmICh2bGluZSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCS8qIEV4ZWN1dGUgY29uZmlndXJhdGlvbiBjb21tYW5kIDogdGhpcyBpcyBzdHJpY3QgbWF0Y2ggKi8KKwkJcmV0ID0gY21kX2V4ZWN1dGVfY29tbWFuZF9zdHJpY3QodmxpbmUsIHZ0eSwgTlVMTCk7CisKKwkJLyogVHJ5IGFnYWluIHdpdGggc2V0dGluZyBub2RlIHRvIENPTkZJR19OT0RFICovCisJCXdoaWxlIChyZXQgIT0gQ01EX1NVQ0NFU1MgJiYgcmV0ICE9IENNRF9XQVJOSU5HCisJCSAgICAgICAmJiByZXQgIT0gQ01EX0VSUl9OT1RISU5HX1RPRE8KKwkJICAgICAgICYmIHZ0eS0+bm9kZSAhPSBDT05GSUdfTk9ERSkgeworCQkJdnR5X2dvX3BhcmVudCh2dHkpOworCQkJcmV0ID0gY21kX2V4ZWN1dGVfY29tbWFuZF9zdHJpY3QodmxpbmUsIHZ0eSwgTlVMTCk7CisJCX0KKworCQljbWRfZnJlZV9zdHJ2ZWModmxpbmUpOworCisJCWlmIChyZXQgIT0gQ01EX1NVQ0NFU1MgJiYgcmV0ICE9IENNRF9XQVJOSU5HCisJCSAgICAmJiByZXQgIT0gQ01EX0VSUl9OT1RISU5HX1RPRE8pCisJCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIENvbmZpZ3JhdGlvbiBmcm9tIHRlcm1pbmFsICovCitERUZVTihjb25maWdfdGVybWluYWwsCisgICAgICBjb25maWdfdGVybWluYWxfY21kLAorICAgICAgImNvbmZpZ3VyZSB0ZXJtaW5hbCIsCisgICAgICAiQ29uZmlndXJhdGlvbiBmcm9tIHZ0eSBpbnRlcmZhY2VcbiIgIkNvbmZpZ3VyYXRpb24gdGVybWluYWxcbiIpCit7CisJaWYgKHZ0eV9jb25maWdfbG9jayh2dHkpKQorCQl2dHktPm5vZGUgPSBDT05GSUdfTk9ERTsKKwllbHNlIHsKKwkJdnR5X291dCh2dHksICJWVFkgY29uZmlndXJhdGlvbiBpcyBsb2NrZWQgYnkgb3RoZXIgVlRZJXMiLAorCQkJVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogRW5hYmxlIGNvbW1hbmQgKi8KK0RFRlVOKGVuYWJsZSwgY29uZmlnX2VuYWJsZV9jbWQsICJlbmFibGUiLCAiVHVybiBvbiBwcml2aWxlZ2VkIG1vZGUgY29tbWFuZFxuIikKK3sKKwkvKiBJZiBlbmFibGUgcGFzc3dvcmQgaXMgTlVMTCwgY2hhbmdlIHRvIEVOQUJMRV9OT0RFICovCisJaWYgKChob3N0LmVuYWJsZSA9PSBOVUxMICYmIGhvc3QuZW5hYmxlX2VuY3J5cHQgPT0gTlVMTCkgfHwKKwkgICAgdnR5LT50eXBlID09IFZUWV9TSEVMTF9TRVJWKQorCQl2dHktPm5vZGUgPSBFTkFCTEVfTk9ERTsKKwllbHNlCisJCXZ0eS0+bm9kZSA9IEFVVEhfRU5BQkxFX05PREU7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIERpc2FibGUgY29tbWFuZCAqLworREVGVU4oZGlzYWJsZSwKKyAgICAgIGNvbmZpZ19kaXNhYmxlX2NtZCwgImRpc2FibGUiLCAiVHVybiBvZmYgcHJpdmlsZWdlZCBtb2RlIGNvbW1hbmRcbiIpCit7CisJaWYgKHZ0eS0+bm9kZSA9PSBFTkFCTEVfTk9ERSkKKwkJdnR5LT5ub2RlID0gVklFV19OT0RFOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogRG93biB2dHkgbm9kZSBsZXZlbC4gKi8KK2dERUZVTihjb25maWdfZXhpdCwKKyAgICAgIGNvbmZpZ19leGl0X2NtZCwgImV4aXQiLCAiRXhpdCBjdXJyZW50IG1vZGUgYW5kIGRvd24gdG8gcHJldmlvdXMgbW9kZVxuIikKK3sKKwlzd2l0Y2ggKHZ0eS0+bm9kZSkgeworCWNhc2UgVklFV19OT0RFOgorCWNhc2UgRU5BQkxFX05PREU6CisJCWlmICgwKQkJLy92dHlfc2hlbGwgKHZ0eSkpCisJCQlleGl0KDApOworCQllbHNlCisJCQl2dHktPnN0YXR1cyA9IFZUWV9DTE9TRTsKKwkJYnJlYWs7CisJY2FzZSBDT05GSUdfTk9ERToKKwkJdnR5LT5ub2RlID0gRU5BQkxFX05PREU7CisJCXZ0eV9jb25maWdfdW5sb2NrKHZ0eSk7CisJCWJyZWFrOworCWNhc2UgVlRZX05PREU6CisJCXZ0eS0+bm9kZSA9IENPTkZJR19OT0RFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBFbmQgb2YgY29uZmlndXJhdGlvbi4gKi8KKyAgICBnREVGVU4oY29uZmlnX2VuZCwKKyAgICAgIGNvbmZpZ19lbmRfY21kLCAiZW5kIiwgIkVuZCBjdXJyZW50IG1vZGUgYW5kIGNoYW5nZSB0byBlbmFibGUgbW9kZS4iKQoreworCXN3aXRjaCAodnR5LT5ub2RlKSB7CisJY2FzZSBWSUVXX05PREU6CisJY2FzZSBFTkFCTEVfTk9ERToKKwkJLyogTm90aGluZyB0byBkby4gKi8KKwkJYnJlYWs7CisJY2FzZSBDT05GSUdfTk9ERToKKwljYXNlIFZUWV9OT0RFOgorCQl2dHlfY29uZmlnX3VubG9jayh2dHkpOworCQl2dHktPm5vZGUgPSBFTkFCTEVfTk9ERTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogU2hvdyB2ZXJzaW9uLiAqLworREVGVU4oc2hvd192ZXJzaW9uLAorICAgICAgc2hvd192ZXJzaW9uX2NtZCwgInNob3cgdmVyc2lvbiIsIFNIT1dfU1RSICJEaXNwbGF5cyBwcm9ncmFtIHZlcnNpb25cbiIpCit7CisJdnR5X291dCh2dHksICIlcyAlcyAoJXMpLiVzIiwgaG9zdC5hcHBfaW5mby0+bmFtZSwKKwkJaG9zdC5hcHBfaW5mby0+dmVyc2lvbiwKKwkJaG9zdC5hcHBfaW5mby0+bmFtZSA/IGhvc3QuYXBwX2luZm8tPm5hbWUgOiAiIiwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiJXMlcyIsIGhvc3QuYXBwX2luZm8tPmNvcHlyaWdodCwgVlRZX05FV0xJTkUpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBIZWxwIGRpc3BsYXkgZnVuY3Rpb24gZm9yIGFsbCBub2RlLiAqLworZ0RFRlVOKGNvbmZpZ19oZWxwLAorICAgICAgY29uZmlnX2hlbHBfY21kLCAiaGVscCIsICJEZXNjcmlwdGlvbiBvZiB0aGUgaW50ZXJhY3RpdmUgaGVscCBzeXN0ZW1cbiIpCit7CisJdnR5X291dCh2dHksCisJCSJUaGlzIFZUWSBwcm92aWRlcyBhZHZhbmNlZCBoZWxwIGZlYXR1cmVzLiAgV2hlbiB5b3UgbmVlZCBoZWxwLCVzXAorYW55dGltZSBhdCB0aGUgY29tbWFuZCBsaW5lIHBsZWFzZSBwcmVzcyAnPycuJXNcCislc1wKK0lmIG5vdGhpbmcgbWF0Y2hlcywgdGhlIGhlbHAgbGlzdCB3aWxsIGJlIGVtcHR5IGFuZCB5b3UgbXVzdCBiYWNrdXAlc1wKKyB1bnRpbCBlbnRlcmluZyBhICc/JyBzaG93cyB0aGUgYXZhaWxhYmxlIG9wdGlvbnMuJXNcCitUd28gc3R5bGVzIG9mIGhlbHAgYXJlIHByb3ZpZGVkOiVzXAorMS4gRnVsbCBoZWxwIGlzIGF2YWlsYWJsZSB3aGVuIHlvdSBhcmUgcmVhZHkgdG8gZW50ZXIgYSVzXAorY29tbWFuZCBhcmd1bWVudCAoZS5nLiAnc2hvdyA/JykgYW5kIGRlc2NyaWJlcyBlYWNoIHBvc3NpYmxlJXNcCithcmd1bWVudC4lc1wKKzIuIFBhcnRpYWwgaGVscCBpcyBwcm92aWRlZCB3aGVuIGFuIGFiYnJldmlhdGVkIGFyZ3VtZW50IGlzIGVudGVyZWQlc1wKKyAgIGFuZCB5b3Ugd2FudCB0byBrbm93IHdoYXQgYXJndW1lbnRzIG1hdGNoIHRoZSBpbnB1dCVzXAorICAgKGUuZy4gJ3Nob3cgbWU/Jy4pJXMlcyIsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsCisJCVZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIEhlbHAgZGlzcGxheSBmdW5jdGlvbiBmb3IgYWxsIG5vZGUuICovCitnREVGVU4oY29uZmlnX2xpc3QsIGNvbmZpZ19saXN0X2NtZCwgImxpc3QiLCAiUHJpbnQgY29tbWFuZCBsaXN0XG4iKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBjbWRfbm9kZSAqY25vZGUgPSB2ZWN0b3Jfc2xvdChjbWR2ZWMsIHZ0eS0+bm9kZSk7CisJc3RydWN0IGNtZF9lbGVtZW50ICpjbWQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbm9kZS0+Y21kX3ZlY3Rvcik7IGkrKykKKwkJaWYgKChjbWQgPSB2ZWN0b3Jfc2xvdChjbm9kZS0+Y21kX3ZlY3RvciwgaSkpICE9IE5VTEwKKwkJICAgICYmICEoY21kLT5hdHRyID09IENNRF9BVFRSX0RFUFJFQ0FURUQKKwkJCSB8fCBjbWQtPmF0dHIgPT0gQ01EX0FUVFJfSElEREVOKSkKKwkJCXZ0eV9vdXQodnR5LCAiICAlcyVzIiwgY21kLT5zdHJpbmcsIFZUWV9ORVdMSU5FKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIFdyaXRlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBpbnRvIGZpbGUuICovCitERUZVTihjb25maWdfd3JpdGVfZmlsZSwKKyAgICAgIGNvbmZpZ193cml0ZV9maWxlX2NtZCwKKyAgICAgICJ3cml0ZSBmaWxlIiwKKyAgICAgICJXcml0ZSBydW5uaW5nIGNvbmZpZ3VyYXRpb24gdG8gbWVtb3J5LCBuZXR3b3JrLCBvciB0ZXJtaW5hbFxuIgorICAgICAgIldyaXRlIHRvIGNvbmZpZ3VyYXRpb24gZmlsZVxuIikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgZmQ7CisJc3RydWN0IGNtZF9ub2RlICpub2RlOworCWNoYXIgKmNvbmZpZ19maWxlOworCWNoYXIgKmNvbmZpZ19maWxlX3RtcCA9IE5VTEw7CisJY2hhciAqY29uZmlnX2ZpbGVfc2F2ID0gTlVMTDsKKwlzdHJ1Y3QgdnR5ICpmaWxlX3Z0eTsKKworCS8qIENoZWNrIGFuZCBzZWUgaWYgd2UgYXJlIG9wZXJhdGluZyB1bmRlciB2dHlzaCBjb25maWd1cmF0aW9uICovCisJaWYgKGhvc3QuY29uZmlnID09IE5VTEwpIHsKKwkJdnR5X291dCh2dHksICJDYW4ndCBzYXZlIHRvIGNvbmZpZ3VyYXRpb24gZmlsZSwgdXNpbmcgdnR5c2guJXMiLAorCQkJVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJLyogR2V0IGZpbGVuYW1lLiAqLworCWNvbmZpZ19maWxlID0gaG9zdC5jb25maWc7CisKKwljb25maWdfZmlsZV9zYXYgPQorCSAgICBfdGFsbG9jX3plcm8odGFsbF92dHlfY21kX2N0eCwKKwkJCSBzdHJsZW4oY29uZmlnX2ZpbGUpICsgc3RybGVuKENPTkZfQkFDS1VQX0VYVCkgKyAxLAorCQkJICJjb25maWdfZmlsZV9zYXYiKTsKKwlzdHJjcHkoY29uZmlnX2ZpbGVfc2F2LCBjb25maWdfZmlsZSk7CisJc3RyY2F0KGNvbmZpZ19maWxlX3NhdiwgQ09ORl9CQUNLVVBfRVhUKTsKKworCWNvbmZpZ19maWxlX3RtcCA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV9jbWRfY3R4LCBzdHJsZW4oY29uZmlnX2ZpbGUpICsgOCwKKwkJCQkJImNvbmZpZ19maWxlX3RtcCIpOworCXNwcmludGYoY29uZmlnX2ZpbGVfdG1wLCAiJXMuWFhYWFhYIiwgY29uZmlnX2ZpbGUpOworCisJLyogT3BlbiBmaWxlIHRvIGNvbmZpZ3VyYXRpb24gd3JpdGUuICovCisJZmQgPSBta3N0ZW1wKGNvbmZpZ19maWxlX3RtcCk7CisJaWYgKGZkIDwgMCkgeworCQl2dHlfb3V0KHZ0eSwgIkNhbid0IG9wZW4gY29uZmlndXJhdGlvbiBmaWxlICVzLiVzIiwKKwkJCWNvbmZpZ19maWxlX3RtcCwgVlRZX05FV0xJTkUpOworCQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV90bXApOworCQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV9zYXYpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJLyogTWFrZSB2dHkgZm9yIGNvbmZpZ3VyYXRpb24gZmlsZS4gKi8KKwlmaWxlX3Z0eSA9IHZ0eV9uZXcoKTsKKwlmaWxlX3Z0eS0+ZmQgPSBmZDsKKwlmaWxlX3Z0eS0+dHlwZSA9IFZUWV9GSUxFOworCisJLyogQ29uZmlnIGZpbGUgaGVhZGVyIHByaW50LiAqLworCXZ0eV9vdXQoZmlsZV92dHksICIhXG4hICVzICglcykgY29uZmlndXJhdGlvbiBzYXZlZCBmcm9tIHZ0eVxuISIsCisJCWhvc3QuYXBwX2luZm8tPm5hbWUsIGhvc3QuYXBwX2luZm8tPnZlcnNpb24pOworCS8vdnR5X3RpbWVfcHJpbnQgKGZpbGVfdnR5LCAxKTsKKwl2dHlfb3V0KGZpbGVfdnR5LCAiIVxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWR2ZWMpOyBpKyspCisJCWlmICgobm9kZSA9IHZlY3Rvcl9zbG90KGNtZHZlYywgaSkpICYmIG5vZGUtPmZ1bmMpIHsKKwkJCWlmICgoKm5vZGUtPmZ1bmMpIChmaWxlX3Z0eSkpCisJCQkJdnR5X291dChmaWxlX3Z0eSwgIiFcbiIpOworCQl9CisJdnR5X2Nsb3NlKGZpbGVfdnR5KTsKKworCWlmICh1bmxpbmsoY29uZmlnX2ZpbGVfc2F2KSAhPSAwKQorCQlpZiAoZXJybm8gIT0gRU5PRU5UKSB7CisJCQl2dHlfb3V0KHZ0eSwKKwkJCQkiQ2FuJ3QgdW5saW5rIGJhY2t1cCBjb25maWd1cmF0aW9uIGZpbGUgJXMuJXMiLAorCQkJCWNvbmZpZ19maWxlX3NhdiwgVlRZX05FV0xJTkUpOworCQkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfc2F2KTsKKwkJCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3RtcCk7CisJCQl1bmxpbmsoY29uZmlnX2ZpbGVfdG1wKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCWlmIChsaW5rKGNvbmZpZ19maWxlLCBjb25maWdfZmlsZV9zYXYpICE9IDApIHsKKwkJdnR5X291dCh2dHksICJDYW4ndCBiYWNrdXAgb2xkIGNvbmZpZ3VyYXRpb24gZmlsZSAlcy4lcyIsCisJCQljb25maWdfZmlsZV9zYXYsIFZUWV9ORVdMSU5FKTsKKwkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfc2F2KTsKKwkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfdG1wKTsKKwkJdW5saW5rKGNvbmZpZ19maWxlX3RtcCk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisJc3luYygpOworCWlmICh1bmxpbmsoY29uZmlnX2ZpbGUpICE9IDApIHsKKwkJdnR5X291dCh2dHksICJDYW4ndCB1bmxpbmsgY29uZmlndXJhdGlvbiBmaWxlICVzLiVzIiwKKwkJCWNvbmZpZ19maWxlLCBWVFlfTkVXTElORSk7CisJCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3Nhdik7CisJCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3RtcCk7CisJCXVubGluayhjb25maWdfZmlsZV90bXApOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCWlmIChsaW5rKGNvbmZpZ19maWxlX3RtcCwgY29uZmlnX2ZpbGUpICE9IDApIHsKKwkJdnR5X291dCh2dHksICJDYW4ndCBzYXZlIGNvbmZpZ3VyYXRpb24gZmlsZSAlcy4lcyIsIGNvbmZpZ19maWxlLAorCQkJVlRZX05FV0xJTkUpOworCQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV9zYXYpOworCQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV90bXApOworCQl1bmxpbmsoY29uZmlnX2ZpbGVfdG1wKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwl1bmxpbmsoY29uZmlnX2ZpbGVfdG1wKTsKKwlzeW5jKCk7CisKKwl0YWxsb2NfZnJlZShjb25maWdfZmlsZV9zYXYpOworCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3RtcCk7CisKKwlpZiAoY2htb2QoY29uZmlnX2ZpbGUsIDA2NjYgJiB+Q09ORklHRklMRV9NQVNLKSAhPSAwKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2FuJ3QgY2htb2QgY29uZmlndXJhdGlvbiBmaWxlICVzOiAlcyAoJWQpLiVzIiwKKwkJCWNvbmZpZ19maWxlLCBzdHJlcnJvcihlcnJubyksIGVycm5vLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwl2dHlfb3V0KHZ0eSwgIkNvbmZpZ3VyYXRpb24gc2F2ZWQgdG8gJXMlcyIsIGNvbmZpZ19maWxlLCBWVFlfTkVXTElORSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitBTElBUyhjb25maWdfd3JpdGVfZmlsZSwKKyAgICAgIGNvbmZpZ193cml0ZV9jbWQsCisgICAgICAid3JpdGUiLCAiV3JpdGUgcnVubmluZyBjb25maWd1cmF0aW9uIHRvIG1lbW9yeSwgbmV0d29yaywgb3IgdGVybWluYWxcbiIpCisKKyAgICBBTElBUyhjb25maWdfd3JpdGVfZmlsZSwKKyAgICAgIGNvbmZpZ193cml0ZV9tZW1vcnlfY21kLAorICAgICAgIndyaXRlIG1lbW9yeSIsCisgICAgICAiV3JpdGUgcnVubmluZyBjb25maWd1cmF0aW9uIHRvIG1lbW9yeSwgbmV0d29yaywgb3IgdGVybWluYWxcbiIKKyAgICAgICJXcml0ZSBjb25maWd1cmF0aW9uIHRvIHRoZSBmaWxlIChzYW1lIGFzIHdyaXRlIGZpbGUpXG4iKQorCisgICAgQUxJQVMoY29uZmlnX3dyaXRlX2ZpbGUsCisgICAgICBjb3B5X3J1bm5pbmdjb25maWdfc3RhcnR1cGNvbmZpZ19jbWQsCisgICAgICAiY29weSBydW5uaW5nLWNvbmZpZyBzdGFydHVwLWNvbmZpZyIsCisgICAgICAiQ29weSBjb25maWd1cmF0aW9uXG4iCisgICAgICAiQ29weSBydW5uaW5nIGNvbmZpZyB0by4uLiBcbiIKKyAgICAgICJDb3B5IHJ1bm5pbmcgY29uZmlnIHRvIHN0YXJ0dXAgY29uZmlnIChzYW1lIGFzIHdyaXRlIGZpbGUpXG4iKQorCisvKiBXcml0ZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gaW50byB0aGUgdGVybWluYWwuICovCisgICAgREVGVU4oY29uZmlnX3dyaXRlX3Rlcm1pbmFsLAorICAgICAgY29uZmlnX3dyaXRlX3Rlcm1pbmFsX2NtZCwKKyAgICAgICJ3cml0ZSB0ZXJtaW5hbCIsCisgICAgICAiV3JpdGUgcnVubmluZyBjb25maWd1cmF0aW9uIHRvIG1lbW9yeSwgbmV0d29yaywgb3IgdGVybWluYWxcbiIKKyAgICAgICJXcml0ZSB0byB0ZXJtaW5hbFxuIikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgY21kX25vZGUgKm5vZGU7CisKKwlpZiAodnR5LT50eXBlID09IFZUWV9TSEVMTF9TRVJWKSB7CisJCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKGNtZHZlYyk7IGkrKykKKwkJCWlmICgobm9kZSA9IHZlY3Rvcl9zbG90KGNtZHZlYywgaSkpICYmIG5vZGUtPmZ1bmMKKwkJCSAgICAmJiBub2RlLT52dHlzaCkgeworCQkJCWlmICgoKm5vZGUtPmZ1bmMpICh2dHkpKQorCQkJCQl2dHlfb3V0KHZ0eSwgIiElcyIsIFZUWV9ORVdMSU5FKTsKKwkJCX0KKwl9IGVsc2UgeworCQl2dHlfb3V0KHZ0eSwgIiVzQ3VycmVudCBjb25maWd1cmF0aW9uOiVzIiwgVlRZX05FV0xJTkUsCisJCQlWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAiISVzIiwgVlRZX05FV0xJTkUpOworCisJCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKGNtZHZlYyk7IGkrKykKKwkJCWlmICgobm9kZSA9IHZlY3Rvcl9zbG90KGNtZHZlYywgaSkpICYmIG5vZGUtPmZ1bmMpIHsKKwkJCQlpZiAoKCpub2RlLT5mdW5jKSAodnR5KSkKKwkJCQkJdnR5X291dCh2dHksICIhJXMiLCBWVFlfTkVXTElORSk7CisJCQl9CisJCXZ0eV9vdXQodnR5LCAiZW5kJXMiLCBWVFlfTkVXTElORSk7CisJfQorCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogV3JpdGUgY3VycmVudCBjb25maWd1cmF0aW9uIGludG8gdGhlIHRlcm1pbmFsLiAqLworQUxJQVMoY29uZmlnX3dyaXRlX3Rlcm1pbmFsLAorICAgICAgc2hvd19ydW5uaW5nX2NvbmZpZ19jbWQsCisgICAgICAic2hvdyBydW5uaW5nLWNvbmZpZyIsIFNIT1dfU1RSICJydW5uaW5nIGNvbmZpZ3VyYXRpb25cbiIpCisKKy8qIFdyaXRlIHN0YXJ0dXAgY29uZmlndXJhdGlvbiBpbnRvIHRoZSB0ZXJtaW5hbC4gKi8KKyAgICBERUZVTihzaG93X3N0YXJ0dXBfY29uZmlnLAorICAgICAgc2hvd19zdGFydHVwX2NvbmZpZ19jbWQsCisgICAgICAic2hvdyBzdGFydHVwLWNvbmZpZyIsIFNIT1dfU1RSICJDb250ZW50ZXMgb2Ygc3RhcnR1cCBjb25maWd1cmF0aW9uXG4iKQoreworCWNoYXIgYnVmW0JVRlNJWl07CisJRklMRSAqY29uZnA7CisKKwljb25mcCA9IGZvcGVuKGhvc3QuY29uZmlnLCAiciIpOworCWlmIChjb25mcCA9PSBOVUxMKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2FuJ3Qgb3BlbiBjb25maWd1cmF0aW9uIGZpbGUgWyVzXSVzIiwKKwkJCWhvc3QuY29uZmlnLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwl3aGlsZSAoZmdldHMoYnVmLCBCVUZTSVosIGNvbmZwKSkgeworCQljaGFyICpjcCA9IGJ1ZjsKKworCQl3aGlsZSAoKmNwICE9ICdccicgJiYgKmNwICE9ICdcbicgJiYgKmNwICE9ICdcMCcpCisJCQljcCsrOworCQkqY3AgPSAnXDAnOworCisJCXZ0eV9vdXQodnR5LCAiJXMlcyIsIGJ1ZiwgVlRZX05FV0xJTkUpOworCX0KKworCWZjbG9zZShjb25mcCk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIEhvc3RuYW1lIGNvbmZpZ3VyYXRpb24gKi8KK0RFRlVOKGNvbmZpZ19ob3N0bmFtZSwKKyAgICAgIGhvc3RuYW1lX2NtZCwKKyAgICAgICJob3N0bmFtZSBXT1JEIiwKKyAgICAgICJTZXQgc3lzdGVtJ3MgbmV0d29yayBuYW1lXG4iICJUaGlzIHN5c3RlbSdzIG5ldHdvcmsgbmFtZVxuIikKK3sKKwlpZiAoIWlzYWxwaGEoKGludCkqYXJndlswXSkpIHsKKwkJdnR5X291dCh2dHksICJQbGVhc2Ugc3BlY2lmeSBzdHJpbmcgc3RhcnRpbmcgd2l0aCBhbHBoYWJldCVzIiwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWlmIChob3N0Lm5hbWUpCisJCXRhbGxvY19mcmVlKGhvc3QubmFtZSk7CisKKwlob3N0Lm5hbWUgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY29uZmlnX25vX2hvc3RuYW1lLAorICAgICAgbm9faG9zdG5hbWVfY21kLAorICAgICAgIm5vIGhvc3RuYW1lIFtIT1NUTkFNRV0iLAorICAgICAgTk9fU1RSICJSZXNldCBzeXN0ZW0ncyBuZXR3b3JrIG5hbWVcbiIgIkhvc3QgbmFtZSBvZiB0aGlzIHJvdXRlclxuIikKK3sKKwlpZiAoaG9zdC5uYW1lKQorCQl0YWxsb2NfZnJlZShob3N0Lm5hbWUpOworCWhvc3QubmFtZSA9IE5VTEw7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBWVFkgaW50ZXJmYWNlIHBhc3N3b3JkIHNldC4gKi8KK0RFRlVOKGNvbmZpZ19wYXNzd29yZCwgcGFzc3dvcmRfY21kLAorICAgICAgInBhc3N3b3JkICg4fCkgV09SRCIsCisgICAgICAiQXNzaWduIHRoZSB0ZXJtaW5hbCBjb25uZWN0aW9uIHBhc3N3b3JkXG4iCisgICAgICAiU3BlY2lmaWVzIGEgSElEREVOIHBhc3N3b3JkIHdpbGwgZm9sbG93XG4iCisgICAgICAiZHVtbXkgc3RyaW5nIFxuIiAiVGhlIEhJRERFTiBsaW5lIHBhc3N3b3JkIHN0cmluZ1xuIikKK3sKKwkvKiBBcmd1bWVudCBjaGVjay4gKi8KKwlpZiAoYXJnYyA9PSAwKSB7CisJCXZ0eV9vdXQodnR5LCAiUGxlYXNlIHNwZWNpZnkgcGFzc3dvcmQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAoYXJnYyA9PSAyKSB7CisJCWlmICgqYXJndlswXSA9PSAnOCcpIHsKKwkJCWlmIChob3N0LnBhc3N3b3JkKQorCQkJCXRhbGxvY19mcmVlKGhvc3QucGFzc3dvcmQpOworCQkJaG9zdC5wYXNzd29yZCA9IE5VTEw7CisJCQlpZiAoaG9zdC5wYXNzd29yZF9lbmNyeXB0KQorCQkJCXRhbGxvY19mcmVlKGhvc3QucGFzc3dvcmRfZW5jcnlwdCk7CisJCQlob3N0LnBhc3N3b3JkX2VuY3J5cHQgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIGFyZ3ZbMV0pOworCQkJcmV0dXJuIENNRF9TVUNDRVNTOworCQl9IGVsc2UgeworCQkJdnR5X291dCh2dHksICJVbmtub3duIGVuY3J5cHRpb24gdHlwZS4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCX0KKworCWlmICghaXNhbG51bSgoaW50KSphcmd2WzBdKSkgeworCQl2dHlfb3V0KHZ0eSwKKwkJCSJQbGVhc2Ugc3BlY2lmeSBzdHJpbmcgc3RhcnRpbmcgd2l0aCBhbHBoYW51bWVyaWMlcyIsCisJCQlWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAoaG9zdC5wYXNzd29yZCkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5wYXNzd29yZCk7CisJaG9zdC5wYXNzd29yZCA9IE5VTEw7CisKKyNpZmRlZiBWVFlfQ1JZUFRfUFcKKwlpZiAoaG9zdC5lbmNyeXB0KSB7CisJCWlmIChob3N0LnBhc3N3b3JkX2VuY3J5cHQpCisJCQl0YWxsb2NfZnJlZShob3N0LnBhc3N3b3JkX2VuY3J5cHQpOworCQlob3N0LnBhc3N3b3JkX2VuY3J5cHQgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIHplbmNyeXB0KGFyZ3ZbMF0pKTsKKwl9IGVsc2UKKyNlbmRpZgorCQlob3N0LnBhc3N3b3JkID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCBhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworQUxJQVMoY29uZmlnX3Bhc3N3b3JkLCBwYXNzd29yZF90ZXh0X2NtZCwKKyAgICAgICJwYXNzd29yZCBMSU5FIiwKKyAgICAgICJBc3NpZ24gdGhlIHRlcm1pbmFsIGNvbm5lY3Rpb24gcGFzc3dvcmRcbiIKKyAgICAgICJUaGUgVU5FTkNSWVBURUQgKGNsZWFydGV4dCkgbGluZSBwYXNzd29yZFxuIikKKworLyogVlRZIGVuYWJsZSBwYXNzd29yZCBzZXQuICovCisgICAgREVGVU4oY29uZmlnX2VuYWJsZV9wYXNzd29yZCwgZW5hYmxlX3Bhc3N3b3JkX2NtZCwKKyAgICAgICJlbmFibGUgcGFzc3dvcmQgKDh8KSBXT1JEIiwKKyAgICAgICJNb2RpZnkgZW5hYmxlIHBhc3N3b3JkIHBhcmFtZXRlcnNcbiIKKyAgICAgICJBc3NpZ24gdGhlIHByaXZpbGVnZWQgbGV2ZWwgcGFzc3dvcmRcbiIKKyAgICAgICJTcGVjaWZpZXMgYSBISURERU4gcGFzc3dvcmQgd2lsbCBmb2xsb3dcbiIKKyAgICAgICJkdW1teSBzdHJpbmcgXG4iICJUaGUgSElEREVOICdlbmFibGUnIHBhc3N3b3JkIHN0cmluZ1xuIikKK3sKKwkvKiBBcmd1bWVudCBjaGVjay4gKi8KKwlpZiAoYXJnYyA9PSAwKSB7CisJCXZ0eV9vdXQodnR5LCAiUGxlYXNlIHNwZWNpZnkgcGFzc3dvcmQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwkvKiBDcnlwdCB0eXBlIGlzIHNwZWNpZmllZC4gKi8KKwlpZiAoYXJnYyA9PSAyKSB7CisJCWlmICgqYXJndlswXSA9PSAnOCcpIHsKKwkJCWlmIChob3N0LmVuYWJsZSkKKwkJCQl0YWxsb2NfZnJlZShob3N0LmVuYWJsZSk7CisJCQlob3N0LmVuYWJsZSA9IE5VTEw7CisKKwkJCWlmIChob3N0LmVuYWJsZV9lbmNyeXB0KQorCQkJCXRhbGxvY19mcmVlKGhvc3QuZW5hYmxlX2VuY3J5cHQpOworCQkJaG9zdC5lbmFibGVfZW5jcnlwdCA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgYXJndlsxXSk7CisKKwkJCXJldHVybiBDTURfU1VDQ0VTUzsKKwkJfSBlbHNlIHsKKwkJCXZ0eV9vdXQodnR5LCAiVW5rbm93biBlbmNyeXB0aW9uIHR5cGUuJXMiLCBWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwl9CisKKwlpZiAoIWlzYWxudW0oKGludCkqYXJndlswXSkpIHsKKwkJdnR5X291dCh2dHksCisJCQkiUGxlYXNlIHNwZWNpZnkgc3RyaW5nIHN0YXJ0aW5nIHdpdGggYWxwaGFudW1lcmljJXMiLAorCQkJVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKGhvc3QuZW5hYmxlKQorCQl0YWxsb2NfZnJlZShob3N0LmVuYWJsZSk7CisJaG9zdC5lbmFibGUgPSBOVUxMOworCisJLyogUGxhaW4gcGFzc3dvcmQgaW5wdXQuICovCisjaWZkZWYgVlRZX0NSWVBUX1BXCisJaWYgKGhvc3QuZW5jcnlwdCkgeworCQlpZiAoaG9zdC5lbmFibGVfZW5jcnlwdCkKKwkJCXRhbGxvY19mcmVlKGhvc3QuZW5hYmxlX2VuY3J5cHQpOworCQlob3N0LmVuYWJsZV9lbmNyeXB0ID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCB6ZW5jcnlwdChhcmd2WzBdKSk7CisJfSBlbHNlCisjZW5kaWYKKwkJaG9zdC5lbmFibGUgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitBTElBUyhjb25maWdfZW5hYmxlX3Bhc3N3b3JkLAorICAgICAgZW5hYmxlX3Bhc3N3b3JkX3RleHRfY21kLAorICAgICAgImVuYWJsZSBwYXNzd29yZCBMSU5FIiwKKyAgICAgICJNb2RpZnkgZW5hYmxlIHBhc3N3b3JkIHBhcmFtZXRlcnNcbiIKKyAgICAgICJBc3NpZ24gdGhlIHByaXZpbGVnZWQgbGV2ZWwgcGFzc3dvcmRcbiIKKyAgICAgICJUaGUgVU5FTkNSWVBURUQgKGNsZWFydGV4dCkgJ2VuYWJsZScgcGFzc3dvcmRcbiIpCisKKy8qIFZUWSBlbmFibGUgcGFzc3dvcmQgZGVsZXRlLiAqLworICAgIERFRlVOKG5vX2NvbmZpZ19lbmFibGVfcGFzc3dvcmQsIG5vX2VuYWJsZV9wYXNzd29yZF9jbWQsCisgICAgICAibm8gZW5hYmxlIHBhc3N3b3JkIiwKKyAgICAgIE5PX1NUUgorICAgICAgIk1vZGlmeSBlbmFibGUgcGFzc3dvcmQgcGFyYW1ldGVyc1xuIgorICAgICAgIkFzc2lnbiB0aGUgcHJpdmlsZWdlZCBsZXZlbCBwYXNzd29yZFxuIikKK3sKKwlpZiAoaG9zdC5lbmFibGUpCisJCXRhbGxvY19mcmVlKGhvc3QuZW5hYmxlKTsKKwlob3N0LmVuYWJsZSA9IE5VTEw7CisKKwlpZiAoaG9zdC5lbmFibGVfZW5jcnlwdCkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5lbmFibGVfZW5jcnlwdCk7CisJaG9zdC5lbmFibGVfZW5jcnlwdCA9IE5VTEw7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKyNpZmRlZiBWVFlfQ1JZUFRfUFcKK0RFRlVOKHNlcnZpY2VfcGFzc3dvcmRfZW5jcnlwdCwKKyAgICAgIHNlcnZpY2VfcGFzc3dvcmRfZW5jcnlwdF9jbWQsCisgICAgICAic2VydmljZSBwYXNzd29yZC1lbmNyeXB0aW9uIiwKKyAgICAgICJTZXQgdXAgbWlzY2VsbGFuZW91cyBzZXJ2aWNlXG4iICJFbmFibGUgZW5jcnlwdGVkIHBhc3N3b3Jkc1xuIikKK3sKKwlpZiAoaG9zdC5lbmNyeXB0KQorCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisKKwlob3N0LmVuY3J5cHQgPSAxOworCisJaWYgKGhvc3QucGFzc3dvcmQpIHsKKwkJaWYgKGhvc3QucGFzc3dvcmRfZW5jcnlwdCkKKwkJCXRhbGxvY19mcmVlKGhvc3QucGFzc3dvcmRfZW5jcnlwdCk7CisJCWhvc3QucGFzc3dvcmRfZW5jcnlwdCA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgemVuY3J5cHQoaG9zdC5wYXNzd29yZCkpOworCX0KKwlpZiAoaG9zdC5lbmFibGUpIHsKKwkJaWYgKGhvc3QuZW5hYmxlX2VuY3J5cHQpCisJCQl0YWxsb2NfZnJlZShob3N0LmVuYWJsZV9lbmNyeXB0KTsKKwkJaG9zdC5lbmFibGVfZW5jcnlwdCA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgemVuY3J5cHQoaG9zdC5lbmFibGUpKTsKKwl9CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5vX3NlcnZpY2VfcGFzc3dvcmRfZW5jcnlwdCwKKyAgICAgIG5vX3NlcnZpY2VfcGFzc3dvcmRfZW5jcnlwdF9jbWQsCisgICAgICAibm8gc2VydmljZSBwYXNzd29yZC1lbmNyeXB0aW9uIiwKKyAgICAgIE5PX1NUUiAiU2V0IHVwIG1pc2NlbGxhbmVvdXMgc2VydmljZVxuIiAiRW5hYmxlIGVuY3J5cHRlZCBwYXNzd29yZHNcbiIpCit7CisJaWYgKCFob3N0LmVuY3J5cHQpCisJCXJldHVybiBDTURfU1VDQ0VTUzsKKworCWhvc3QuZW5jcnlwdCA9IDA7CisKKwlpZiAoaG9zdC5wYXNzd29yZF9lbmNyeXB0KQorCQl0YWxsb2NfZnJlZShob3N0LnBhc3N3b3JkX2VuY3J5cHQpOworCWhvc3QucGFzc3dvcmRfZW5jcnlwdCA9IE5VTEw7CisKKwlpZiAoaG9zdC5lbmFibGVfZW5jcnlwdCkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5lbmFibGVfZW5jcnlwdCk7CisJaG9zdC5lbmFibGVfZW5jcnlwdCA9IE5VTEw7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisjZW5kaWYKKworREVGVU4oY29uZmlnX3Rlcm1pbmFsX2xlbmd0aCwgY29uZmlnX3Rlcm1pbmFsX2xlbmd0aF9jbWQsCisgICAgICAidGVybWluYWwgbGVuZ3RoIDwwLTUxMj4iLAorICAgICAgIlNldCB0ZXJtaW5hbCBsaW5lIHBhcmFtZXRlcnNcbiIKKyAgICAgICJTZXQgbnVtYmVyIG9mIGxpbmVzIG9uIGEgc2NyZWVuXG4iCisgICAgICAiTnVtYmVyIG9mIGxpbmVzIG9uIHNjcmVlbiAoMCBmb3Igbm8gcGF1c2luZylcbiIpCit7CisJaW50IGxpbmVzOworCWNoYXIgKmVuZHB0ciA9IE5VTEw7CisKKwlsaW5lcyA9IHN0cnRvbChhcmd2WzBdLCAmZW5kcHRyLCAxMCk7CisJaWYgKGxpbmVzIDwgMCB8fCBsaW5lcyA+IDUxMiB8fCAqZW5kcHRyICE9ICdcMCcpIHsKKwkJdnR5X291dCh2dHksICJsZW5ndGggaXMgbWFsZm9ybWVkJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisJdnR5LT5saW5lcyA9IGxpbmVzOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjb25maWdfdGVybWluYWxfbm9fbGVuZ3RoLCBjb25maWdfdGVybWluYWxfbm9fbGVuZ3RoX2NtZCwKKyAgICAgICJ0ZXJtaW5hbCBubyBsZW5ndGgiLAorICAgICAgIlNldCB0ZXJtaW5hbCBsaW5lIHBhcmFtZXRlcnNcbiIKKyAgICAgIE5PX1NUUiAiU2V0IG51bWJlciBvZiBsaW5lcyBvbiBhIHNjcmVlblxuIikKK3sKKwl2dHktPmxpbmVzID0gLTE7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihzZXJ2aWNlX3Rlcm1pbmFsX2xlbmd0aCwgc2VydmljZV90ZXJtaW5hbF9sZW5ndGhfY21kLAorICAgICAgInNlcnZpY2UgdGVybWluYWwtbGVuZ3RoIDwwLTUxMj4iLAorICAgICAgIlNldCB1cCBtaXNjZWxsYW5lb3VzIHNlcnZpY2VcbiIKKyAgICAgICJTeXN0ZW0gd2lkZSB0ZXJtaW5hbCBsZW5ndGggY29uZmlndXJhdGlvblxuIgorICAgICAgIk51bWJlciBvZiBsaW5lcyBvZiBWVFkgKDAgbWVhbnMgbm8gbGluZSBjb250cm9sKVxuIikKK3sKKwlpbnQgbGluZXM7CisJY2hhciAqZW5kcHRyID0gTlVMTDsKKworCWxpbmVzID0gc3RydG9sKGFyZ3ZbMF0sICZlbmRwdHIsIDEwKTsKKwlpZiAobGluZXMgPCAwIHx8IGxpbmVzID4gNTEyIHx8ICplbmRwdHIgIT0gJ1wwJykgeworCQl2dHlfb3V0KHZ0eSwgImxlbmd0aCBpcyBtYWxmb3JtZWQlcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwlob3N0LmxpbmVzID0gbGluZXM7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5vX3NlcnZpY2VfdGVybWluYWxfbGVuZ3RoLCBub19zZXJ2aWNlX3Rlcm1pbmFsX2xlbmd0aF9jbWQsCisgICAgICAibm8gc2VydmljZSB0ZXJtaW5hbC1sZW5ndGggWzwwLTUxMj5dIiwKKyAgICAgIE5PX1NUUgorICAgICAgIlNldCB1cCBtaXNjZWxsYW5lb3VzIHNlcnZpY2VcbiIKKyAgICAgICJTeXN0ZW0gd2lkZSB0ZXJtaW5hbCBsZW5ndGggY29uZmlndXJhdGlvblxuIgorICAgICAgIk51bWJlciBvZiBsaW5lcyBvZiBWVFkgKDAgbWVhbnMgbm8gbGluZSBjb250cm9sKVxuIikKK3sKKwlob3N0LmxpbmVzID0gLTE7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTl9ISURERU4oZG9fZWNobywKKwkgICAgIGVjaG9fY21kLAorCSAgICAgImVjaG8gLk1FU1NBR0UiLAorCSAgICAgIkVjaG8gYSBtZXNzYWdlIGJhY2sgdG8gdGhlIHZ0eVxuIiAiVGhlIG1lc3NhZ2UgdG8gZWNob1xuIikKK3sKKwljaGFyICptZXNzYWdlOworCisJdnR5X291dCh2dHksICIlcyVzIiwKKwkJKChtZXNzYWdlID0KKwkJICBhcmd2X2NvbmNhdChhcmd2LCBhcmdjLCAwKSkgPyBtZXNzYWdlIDogIiIpLCBWVFlfTkVXTElORSk7CisJaWYgKG1lc3NhZ2UpCisJCXRhbGxvY19mcmVlKG1lc3NhZ2UpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworI2lmIDAKK0RFRlVOKGNvbmZpZ19sb2dtc2csCisgICAgICBjb25maWdfbG9nbXNnX2NtZCwKKyAgICAgICJsb2dtc2cgIiBMT0dfTEVWRUxTICIgLk1FU1NBR0UiLAorICAgICAgIlNlbmQgYSBtZXNzYWdlIHRvIGVuYWJsZWQgbG9nZ2luZyBkZXN0aW5hdGlvbnNcbiIKKyAgICAgIExPR19MRVZFTF9ERVNDICJUaGUgbWVzc2FnZSB0byBzZW5kXG4iKQoreworCWludCBsZXZlbDsKKwljaGFyICptZXNzYWdlOworCisJaWYgKChsZXZlbCA9IGxldmVsX21hdGNoKGFyZ3ZbMF0pKSA9PSBaTE9HX0RJU0FCTEVEKQorCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKKworCXpsb2coTlVMTCwgbGV2ZWwsCisJICAgICAoKG1lc3NhZ2UgPSBhcmd2X2NvbmNhdChhcmd2LCBhcmdjLCAxKSkgPyBtZXNzYWdlIDogIiIpKTsKKwlpZiAobWVzc2FnZSkKKwkJdGFsbG9jX2ZyZWUobWVzc2FnZSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihzaG93X2xvZ2dpbmcsCisgICAgICBzaG93X2xvZ2dpbmdfY21kLAorICAgICAgInNob3cgbG9nZ2luZyIsIFNIT1dfU1RSICJTaG93IGN1cnJlbnQgbG9nZ2luZyBjb25maWd1cmF0aW9uXG4iKQoreworCXN0cnVjdCB6bG9nICp6bCA9IHpsb2dfZGVmYXVsdDsKKworCXZ0eV9vdXQodnR5LCAiU3lzbG9nIGxvZ2dpbmc6ICIpOworCWlmICh6bC0+bWF4bHZsW1pMT0dfREVTVF9TWVNMT0ddID09IFpMT0dfRElTQUJMRUQpCisJCXZ0eV9vdXQodnR5LCAiZGlzYWJsZWQiKTsKKwllbHNlCisJCXZ0eV9vdXQodnR5LCAibGV2ZWwgJXMsIGZhY2lsaXR5ICVzLCBpZGVudCAlcyIsCisJCQl6bG9nX3ByaW9yaXR5W3psLT5tYXhsdmxbWkxPR19ERVNUX1NZU0xPR11dLAorCQkJZmFjaWxpdHlfbmFtZSh6bC0+ZmFjaWxpdHkpLCB6bC0+aWRlbnQpOworCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisKKwl2dHlfb3V0KHZ0eSwgIlN0ZG91dCBsb2dnaW5nOiAiKTsKKwlpZiAoemwtPm1heGx2bFtaTE9HX0RFU1RfU1RET1VUXSA9PSBaTE9HX0RJU0FCTEVEKQorCQl2dHlfb3V0KHZ0eSwgImRpc2FibGVkIik7CisJZWxzZQorCQl2dHlfb3V0KHZ0eSwgImxldmVsICVzIiwKKwkJCXpsb2dfcHJpb3JpdHlbemwtPm1heGx2bFtaTE9HX0RFU1RfU1RET1VUXV0pOworCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisKKwl2dHlfb3V0KHZ0eSwgIk1vbml0b3IgbG9nZ2luZzogIik7CisJaWYgKHpsLT5tYXhsdmxbWkxPR19ERVNUX01PTklUT1JdID09IFpMT0dfRElTQUJMRUQpCisJCXZ0eV9vdXQodnR5LCAiZGlzYWJsZWQiKTsKKwllbHNlCisJCXZ0eV9vdXQodnR5LCAibGV2ZWwgJXMiLAorCQkJemxvZ19wcmlvcml0eVt6bC0+bWF4bHZsW1pMT0dfREVTVF9NT05JVE9SXV0pOworCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisKKwl2dHlfb3V0KHZ0eSwgIkZpbGUgbG9nZ2luZzogIik7CisJaWYgKCh6bC0+bWF4bHZsW1pMT0dfREVTVF9GSUxFXSA9PSBaTE9HX0RJU0FCTEVEKSB8fCAhemwtPmZwKQorCQl2dHlfb3V0KHZ0eSwgImRpc2FibGVkIik7CisJZWxzZQorCQl2dHlfb3V0KHZ0eSwgImxldmVsICVzLCBmaWxlbmFtZSAlcyIsCisJCQl6bG9nX3ByaW9yaXR5W3psLT5tYXhsdmxbWkxPR19ERVNUX0ZJTEVdXSwKKwkJCXpsLT5maWxlbmFtZSk7CisJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKworCXZ0eV9vdXQodnR5LCAiUHJvdG9jb2wgbmFtZTogJXMlcyIsCisJCXpsb2dfcHJvdG9fbmFtZXNbemwtPnByb3RvY29sXSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiUmVjb3JkIHByaW9yaXR5OiAlcyVzIiwKKwkJKHpsLT5yZWNvcmRfcHJpb3JpdHkgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKSwgVlRZX05FV0xJTkUpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjb25maWdfbG9nX3N0ZG91dCwKKyAgICAgIGNvbmZpZ19sb2dfc3Rkb3V0X2NtZCwKKyAgICAgICJsb2cgc3Rkb3V0IiwgIkxvZ2dpbmcgY29udHJvbFxuIiAiU2V0IHN0ZG91dCBsb2dnaW5nIGxldmVsXG4iKQoreworCXpsb2dfc2V0X2xldmVsKE5VTEwsIFpMT0dfREVTVF9TVERPVVQsIHpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY29uZmlnX2xvZ19zdGRvdXRfbGV2ZWwsCisgICAgICBjb25maWdfbG9nX3N0ZG91dF9sZXZlbF9jbWQsCisgICAgICAibG9nIHN0ZG91dCAiIExPR19MRVZFTFMsCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iICJTZXQgc3Rkb3V0IGxvZ2dpbmcgbGV2ZWxcbiIgTE9HX0xFVkVMX0RFU0MpCit7CisJaW50IGxldmVsOworCisJaWYgKChsZXZlbCA9IGxldmVsX21hdGNoKGFyZ3ZbMF0pKSA9PSBaTE9HX0RJU0FCTEVEKQorCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKKwl6bG9nX3NldF9sZXZlbChOVUxMLCBaTE9HX0RFU1RfU1RET1VULCBsZXZlbCk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihub19jb25maWdfbG9nX3N0ZG91dCwKKyAgICAgIG5vX2NvbmZpZ19sb2dfc3Rkb3V0X2NtZCwKKyAgICAgICJubyBsb2cgc3Rkb3V0IFtMRVZFTF0iLAorICAgICAgTk9fU1RSICJMb2dnaW5nIGNvbnRyb2xcbiIgIkNhbmNlbCBsb2dnaW5nIHRvIHN0ZG91dFxuIiAiTG9nZ2luZyBsZXZlbFxuIikKK3sKKwl6bG9nX3NldF9sZXZlbChOVUxMLCBaTE9HX0RFU1RfU1RET1VULCBaTE9HX0RJU0FCTEVEKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNvbmZpZ19sb2dfbW9uaXRvciwKKyAgICAgIGNvbmZpZ19sb2dfbW9uaXRvcl9jbWQsCisgICAgICAibG9nIG1vbml0b3IiLAorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIiAiU2V0IHRlcm1pbmFsIGxpbmUgKG1vbml0b3IpIGxvZ2dpbmcgbGV2ZWxcbiIpCit7CisJemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX01PTklUT1IsIHpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY29uZmlnX2xvZ19tb25pdG9yX2xldmVsLAorICAgICAgY29uZmlnX2xvZ19tb25pdG9yX2xldmVsX2NtZCwKKyAgICAgICJsb2cgbW9uaXRvciAiIExPR19MRVZFTFMsCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iCisgICAgICAiU2V0IHRlcm1pbmFsIGxpbmUgKG1vbml0b3IpIGxvZ2dpbmcgbGV2ZWxcbiIgTE9HX0xFVkVMX0RFU0MpCit7CisJaW50IGxldmVsOworCisJaWYgKChsZXZlbCA9IGxldmVsX21hdGNoKGFyZ3ZbMF0pKSA9PSBaTE9HX0RJU0FCTEVEKQorCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKKwl6bG9nX3NldF9sZXZlbChOVUxMLCBaTE9HX0RFU1RfTU9OSVRPUiwgbGV2ZWwpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obm9fY29uZmlnX2xvZ19tb25pdG9yLAorICAgICAgbm9fY29uZmlnX2xvZ19tb25pdG9yX2NtZCwKKyAgICAgICJubyBsb2cgbW9uaXRvciBbTEVWRUxdIiwKKyAgICAgIE5PX1NUUgorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIgorICAgICAgIkRpc2FibGUgdGVybWluYWwgbGluZSAobW9uaXRvcikgbG9nZ2luZ1xuIiAiTG9nZ2luZyBsZXZlbFxuIikKK3sKKwl6bG9nX3NldF9sZXZlbChOVUxMLCBaTE9HX0RFU1RfTU9OSVRPUiwgWkxPR19ESVNBQkxFRCk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgaW50IHNldF9sb2dfZmlsZShzdHJ1Y3QgdnR5ICp2dHksIGNvbnN0IGNoYXIgKmZuYW1lLCBpbnQgbG9nbGV2ZWwpCit7CisJaW50IHJldDsKKwljaGFyICpwID0gTlVMTDsKKwljb25zdCBjaGFyICpmdWxscGF0aDsKKworCS8qIFBhdGggZGV0ZWN0aW9uLiAqLworCWlmICghSVNfRElSRUNUT1JZX1NFUCgqZm5hbWUpKSB7CisJCWNoYXIgY3dkW01BWFBBVEhMRU4gKyAxXTsKKwkJY3dkW01BWFBBVEhMRU5dID0gJ1wwJzsKKworCQlpZiAoZ2V0Y3dkKGN3ZCwgTUFYUEFUSExFTikgPT0gTlVMTCkgeworCQkJemxvZ19lcnIoImNvbmZpZ19sb2dfZmlsZTogVW5hYmxlIHRvIGFsbG9jIG1lbSEiKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCisJCWlmICgocCA9IF90YWxsb2NfemVybyh0YWxsX3ZjbWRfY3R4LAorCQkJCSAgICAgIHN0cmxlbihjd2QpICsgc3RybGVuKGZuYW1lKSArIDIpLAorCQkJCSAgICAgICJzZXRfbG9nX2ZpbGUiKQorCQkgICAgPT0gTlVMTCkgeworCQkJemxvZ19lcnIoImNvbmZpZ19sb2dfZmlsZTogVW5hYmxlIHRvIGFsbG9jIG1lbSEiKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQlzcHJpbnRmKHAsICIlcy8lcyIsIGN3ZCwgZm5hbWUpOworCQlmdWxscGF0aCA9IHA7CisJfSBlbHNlCisJCWZ1bGxwYXRoID0gZm5hbWU7CisKKwlyZXQgPSB6bG9nX3NldF9maWxlKE5VTEwsIGZ1bGxwYXRoLCBsb2dsZXZlbCk7CisKKwlpZiAocCkKKwkJdGFsbG9jX2ZyZWUocCk7CisKKwlpZiAoIXJldCkgeworCQl2dHlfb3V0KHZ0eSwgImNhbid0IG9wZW4gbG9nZmlsZSAlc1xuIiwgZm5hbWUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKGhvc3QubG9nZmlsZSkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5sb2dmaWxlKTsKKworCWhvc3QubG9nZmlsZSA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgZm5hbWUpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjb25maWdfbG9nX2ZpbGUsCisgICAgICBjb25maWdfbG9nX2ZpbGVfY21kLAorICAgICAgImxvZyBmaWxlIEZJTEVOQU1FIiwKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIgIkxvZ2dpbmcgdG8gZmlsZVxuIiAiTG9nZ2luZyBmaWxlbmFtZVxuIikKK3sKKwlyZXR1cm4gc2V0X2xvZ19maWxlKHZ0eSwgYXJndlswXSwgemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCk7Cit9CisKK0RFRlVOKGNvbmZpZ19sb2dfZmlsZV9sZXZlbCwKKyAgICAgIGNvbmZpZ19sb2dfZmlsZV9sZXZlbF9jbWQsCisgICAgICAibG9nIGZpbGUgRklMRU5BTUUgIiBMT0dfTEVWRUxTLAorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIgorICAgICAgIkxvZ2dpbmcgdG8gZmlsZVxuIiAiTG9nZ2luZyBmaWxlbmFtZVxuIiBMT0dfTEVWRUxfREVTQykKK3sKKwlpbnQgbGV2ZWw7CisKKwlpZiAoKGxldmVsID0gbGV2ZWxfbWF0Y2goYXJndlsxXSkpID09IFpMT0dfRElTQUJMRUQpCisJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCXJldHVybiBzZXRfbG9nX2ZpbGUodnR5LCBhcmd2WzBdLCBsZXZlbCk7Cit9CisKK0RFRlVOKG5vX2NvbmZpZ19sb2dfZmlsZSwKKyAgICAgIG5vX2NvbmZpZ19sb2dfZmlsZV9jbWQsCisgICAgICAibm8gbG9nIGZpbGUgW0ZJTEVOQU1FXSIsCisgICAgICBOT19TVFIKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIgIkNhbmNlbCBsb2dnaW5nIHRvIGZpbGVcbiIgIkxvZ2dpbmcgZmlsZSBuYW1lXG4iKQoreworCXpsb2dfcmVzZXRfZmlsZShOVUxMKTsKKworCWlmIChob3N0LmxvZ2ZpbGUpCisJCXRhbGxvY19mcmVlKGhvc3QubG9nZmlsZSk7CisKKwlob3N0LmxvZ2ZpbGUgPSBOVUxMOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitBTElBUyhub19jb25maWdfbG9nX2ZpbGUsCisgICAgICBub19jb25maWdfbG9nX2ZpbGVfbGV2ZWxfY21kLAorICAgICAgIm5vIGxvZyBmaWxlIEZJTEVOQU1FIExFVkVMIiwKKyAgICAgIE5PX1NUUgorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIgorICAgICAgIkNhbmNlbCBsb2dnaW5nIHRvIGZpbGVcbiIgIkxvZ2dpbmcgZmlsZSBuYW1lXG4iICJMb2dnaW5nIGxldmVsXG4iKQorCisgICAgREVGVU4oY29uZmlnX2xvZ19zeXNsb2csCisgICAgICBjb25maWdfbG9nX3N5c2xvZ19jbWQsCisgICAgICAibG9nIHN5c2xvZyIsICJMb2dnaW5nIGNvbnRyb2xcbiIgIlNldCBzeXNsb2cgbG9nZ2luZyBsZXZlbFxuIikKK3sKKwl6bG9nX3NldF9sZXZlbChOVUxMLCBaTE9HX0RFU1RfU1lTTE9HLCB6bG9nX2RlZmF1bHQtPmRlZmF1bHRfbHZsKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNvbmZpZ19sb2dfc3lzbG9nX2xldmVsLAorICAgICAgY29uZmlnX2xvZ19zeXNsb2dfbGV2ZWxfY21kLAorICAgICAgImxvZyBzeXNsb2cgIiBMT0dfTEVWRUxTLAorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIiAiU2V0IHN5c2xvZyBsb2dnaW5nIGxldmVsXG4iIExPR19MRVZFTF9ERVNDKQoreworCWludCBsZXZlbDsKKworCWlmICgobGV2ZWwgPSBsZXZlbF9tYXRjaChhcmd2WzBdKSkgPT0gWkxPR19ESVNBQkxFRCkKKwkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisJemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX1NZU0xPRywgbGV2ZWwpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU5fREVQUkVDQVRFRChjb25maWdfbG9nX3N5c2xvZ19mYWNpbGl0eSwKKwkJIGNvbmZpZ19sb2dfc3lzbG9nX2ZhY2lsaXR5X2NtZCwKKwkJICJsb2cgc3lzbG9nIGZhY2lsaXR5ICIgTE9HX0ZBQ0lMSVRJRVMsCisJCSAiTG9nZ2luZyBjb250cm9sXG4iCisJCSAiTG9nZ2luZyBnb2VzIHRvIHN5c2xvZ1xuIgorCQkgIihEZXByZWNhdGVkKSBGYWNpbGl0eSBwYXJhbWV0ZXIgZm9yIHN5c2xvZyBtZXNzYWdlc1xuIgorCQkgTE9HX0ZBQ0lMSVRZX0RFU0MpCit7CisJaW50IGZhY2lsaXR5OworCisJaWYgKChmYWNpbGl0eSA9IGZhY2lsaXR5X21hdGNoKGFyZ3ZbMF0pKSA8IDApCisJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCisJemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX1NZU0xPRywgemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCk7CisJemxvZ19kZWZhdWx0LT5mYWNpbGl0eSA9IGZhY2lsaXR5OworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obm9fY29uZmlnX2xvZ19zeXNsb2csCisgICAgICBub19jb25maWdfbG9nX3N5c2xvZ19jbWQsCisgICAgICAibm8gbG9nIHN5c2xvZyBbTEVWRUxdIiwKKyAgICAgIE5PX1NUUiAiTG9nZ2luZyBjb250cm9sXG4iICJDYW5jZWwgbG9nZ2luZyB0byBzeXNsb2dcbiIgIkxvZ2dpbmcgbGV2ZWxcbiIpCit7CisJemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX1NZU0xPRywgWkxPR19ESVNBQkxFRCk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitBTElBUyhub19jb25maWdfbG9nX3N5c2xvZywKKyAgICAgIG5vX2NvbmZpZ19sb2dfc3lzbG9nX2ZhY2lsaXR5X2NtZCwKKyAgICAgICJubyBsb2cgc3lzbG9nIGZhY2lsaXR5ICIgTE9HX0ZBQ0lMSVRJRVMsCisgICAgICBOT19TVFIKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIKKyAgICAgICJMb2dnaW5nIGdvZXMgdG8gc3lzbG9nXG4iCisgICAgICAiRmFjaWxpdHkgcGFyYW1ldGVyIGZvciBzeXNsb2cgbWVzc2FnZXNcbiIgTE9HX0ZBQ0lMSVRZX0RFU0MpCisKKyAgICBERUZVTihjb25maWdfbG9nX2ZhY2lsaXR5LAorICAgICAgY29uZmlnX2xvZ19mYWNpbGl0eV9jbWQsCisgICAgICAibG9nIGZhY2lsaXR5ICIgTE9HX0ZBQ0lMSVRJRVMsCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iCisgICAgICAiRmFjaWxpdHkgcGFyYW1ldGVyIGZvciBzeXNsb2cgbWVzc2FnZXNcbiIgTE9HX0ZBQ0lMSVRZX0RFU0MpCit7CisJaW50IGZhY2lsaXR5OworCisJaWYgKChmYWNpbGl0eSA9IGZhY2lsaXR5X21hdGNoKGFyZ3ZbMF0pKSA8IDApCisJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCXpsb2dfZGVmYXVsdC0+ZmFjaWxpdHkgPSBmYWNpbGl0eTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5vX2NvbmZpZ19sb2dfZmFjaWxpdHksCisgICAgICBub19jb25maWdfbG9nX2ZhY2lsaXR5X2NtZCwKKyAgICAgICJubyBsb2cgZmFjaWxpdHkgW0ZBQ0lMSVRZXSIsCisgICAgICBOT19TVFIKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIKKyAgICAgICJSZXNldCBzeXNsb2cgZmFjaWxpdHkgdG8gZGVmYXVsdCAoZGFlbW9uKVxuIiAiU3lzbG9nIGZhY2lsaXR5XG4iKQoreworCXpsb2dfZGVmYXVsdC0+ZmFjaWxpdHkgPSBMT0dfREFFTU9OOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU5fREVQUkVDQVRFRChjb25maWdfbG9nX3RyYXAsCisJCSBjb25maWdfbG9nX3RyYXBfY21kLAorCQkgImxvZyB0cmFwICIgTE9HX0xFVkVMUywKKwkJICJMb2dnaW5nIGNvbnRyb2xcbiIKKwkJICIoRGVwcmVjYXRlZCkgU2V0IGxvZ2dpbmcgbGV2ZWwgYW5kIGRlZmF1bHQgZm9yIGFsbCBkZXN0aW5hdGlvbnNcbiIKKwkJIExPR19MRVZFTF9ERVNDKQoreworCWludCBuZXdfbGV2ZWw7CisJaW50IGk7CisKKwlpZiAoKG5ld19sZXZlbCA9IGxldmVsX21hdGNoKGFyZ3ZbMF0pKSA9PSBaTE9HX0RJU0FCTEVEKQorCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKKworCXpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwgPSBuZXdfbGV2ZWw7CisJZm9yIChpID0gMDsgaSA8IFpMT0dfTlVNX0RFU1RTOyBpKyspCisJCWlmICh6bG9nX2RlZmF1bHQtPm1heGx2bFtpXSAhPSBaTE9HX0RJU0FCTEVEKQorCQkJemxvZ19kZWZhdWx0LT5tYXhsdmxbaV0gPSBuZXdfbGV2ZWw7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTl9ERVBSRUNBVEVEKG5vX2NvbmZpZ19sb2dfdHJhcCwKKwkJIG5vX2NvbmZpZ19sb2dfdHJhcF9jbWQsCisJCSAibm8gbG9nIHRyYXAgW0xFVkVMXSIsCisJCSBOT19TVFIKKwkJICJMb2dnaW5nIGNvbnRyb2xcbiIKKwkJICJQZXJtaXQgYWxsIGxvZ2dpbmcgaW5mb3JtYXRpb25cbiIgIkxvZ2dpbmcgbGV2ZWxcbiIpCit7CisJemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCA9IExPR19ERUJVRzsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNvbmZpZ19sb2dfcmVjb3JkX3ByaW9yaXR5LAorICAgICAgY29uZmlnX2xvZ19yZWNvcmRfcHJpb3JpdHlfY21kLAorICAgICAgImxvZyByZWNvcmQtcHJpb3JpdHkiLAorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIgorICAgICAgIkxvZyB0aGUgcHJpb3JpdHkgb2YgdGhlIG1lc3NhZ2Ugd2l0aGluIHRoZSBtZXNzYWdlXG4iKQoreworCXpsb2dfZGVmYXVsdC0+cmVjb3JkX3ByaW9yaXR5ID0gMTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5vX2NvbmZpZ19sb2dfcmVjb3JkX3ByaW9yaXR5LAorICAgICAgbm9fY29uZmlnX2xvZ19yZWNvcmRfcHJpb3JpdHlfY21kLAorICAgICAgIm5vIGxvZyByZWNvcmQtcHJpb3JpdHkiLAorICAgICAgTk9fU1RSCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iCisgICAgICAiRG8gbm90IGxvZyB0aGUgcHJpb3JpdHkgb2YgdGhlIG1lc3NhZ2Ugd2l0aGluIHRoZSBtZXNzYWdlXG4iKQoreworCXpsb2dfZGVmYXVsdC0+cmVjb3JkX3ByaW9yaXR5ID0gMDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisjZW5kaWYKKworREVGVU4oYmFubmVyX21vdGRfZmlsZSwKKyAgICAgIGJhbm5lcl9tb3RkX2ZpbGVfY21kLAorICAgICAgImJhbm5lciBtb3RkIGZpbGUgW0ZJTEVdIiwKKyAgICAgICJTZXQgYmFubmVyXG4iICJCYW5uZXIgZm9yIG1vdGRcbiIgIkJhbm5lciBmcm9tIGEgZmlsZVxuIiAiRmlsZW5hbWVcbiIpCit7CisJaWYgKGhvc3QubW90ZGZpbGUpCisJCXRhbGxvY19mcmVlKGhvc3QubW90ZGZpbGUpOworCWhvc3QubW90ZGZpbGUgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihiYW5uZXJfbW90ZF9kZWZhdWx0LAorICAgICAgYmFubmVyX21vdGRfZGVmYXVsdF9jbWQsCisgICAgICAiYmFubmVyIG1vdGQgZGVmYXVsdCIsCisgICAgICAiU2V0IGJhbm5lciBzdHJpbmdcbiIgIlN0cmluZ3MgZm9yIG1vdGRcbiIgIkRlZmF1bHQgc3RyaW5nXG4iKQoreworCWhvc3QubW90ZCA9IGRlZmF1bHRfbW90ZDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5vX2Jhbm5lcl9tb3RkLAorICAgICAgbm9fYmFubmVyX21vdGRfY21kLAorICAgICAgIm5vIGJhbm5lciBtb3RkIiwgTk9fU1RSICJTZXQgYmFubmVyIHN0cmluZ1xuIiAiU3RyaW5ncyBmb3IgbW90ZFxuIikKK3sKKwlob3N0Lm1vdGQgPSBOVUxMOworCWlmIChob3N0Lm1vdGRmaWxlKQorCQl0YWxsb2NfZnJlZShob3N0Lm1vdGRmaWxlKTsKKwlob3N0Lm1vdGRmaWxlID0gTlVMTDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIFNldCBjb25maWcgZmlsZW5hbWUuICBDYWxsZWQgZnJvbSB2dHkuYyAqLwordm9pZCBob3N0X2NvbmZpZ19zZXQoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJaG9zdC5jb25maWcgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIGZpbGVuYW1lKTsKK30KKwordm9pZCBpbnN0YWxsX2RlZmF1bHQoZW51bSBub2RlX3R5cGUgbm9kZSkKK3sKKwlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJmNvbmZpZ19oZWxwX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfbGlzdF9jbWQpOworCisJaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfd3JpdGVfdGVybWluYWxfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJmNvbmZpZ193cml0ZV9maWxlX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfd3JpdGVfbWVtb3J5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfd3JpdGVfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJnNob3dfcnVubmluZ19jb25maWdfY21kKTsKK30KKworLyogSW5pdGlhbGl6ZSBjb21tYW5kIGludGVyZmFjZS4gSW5zdGFsbCBiYXNpYyBub2RlcyBhbmQgY29tbWFuZHMuICovCit2b2lkIGNtZF9pbml0KGludCB0ZXJtaW5hbCkKK3sKKwkvKiBBbGxvY2F0ZSBpbml0aWFsIHRvcCB2ZWN0b3Igb2YgY29tbWFuZHMuICovCisJY21kdmVjID0gdmVjdG9yX2luaXQoVkVDVE9SX01JTl9TSVpFKTsKKworCS8qIERlZmF1bHQgaG9zdCB2YWx1ZSBzZXR0aW5ncy4gKi8KKwlob3N0Lm5hbWUgPSBOVUxMOworCWhvc3QucGFzc3dvcmQgPSBOVUxMOworCWhvc3QuZW5hYmxlID0gTlVMTDsKKwlob3N0LmxvZ2ZpbGUgPSBOVUxMOworCWhvc3QuY29uZmlnID0gTlVMTDsKKwlob3N0LmxpbmVzID0gLTE7CisJaG9zdC5tb3RkID0gZGVmYXVsdF9tb3RkOworCWhvc3QubW90ZGZpbGUgPSBOVUxMOworCisJLyogSW5zdGFsbCB0b3Agbm9kZXMuICovCisJaW5zdGFsbF9ub2RlKCZ2aWV3X25vZGUsIE5VTEwpOworCWluc3RhbGxfbm9kZSgmZW5hYmxlX25vZGUsIE5VTEwpOworCWluc3RhbGxfbm9kZSgmYXV0aF9ub2RlLCBOVUxMKTsKKwlpbnN0YWxsX25vZGUoJmF1dGhfZW5hYmxlX25vZGUsIE5VTEwpOworCWluc3RhbGxfbm9kZSgmY29uZmlnX25vZGUsIGNvbmZpZ193cml0ZV9ob3N0KTsKKworCS8qIEVhY2ggbm9kZSdzIGJhc2ljIGNvbW1hbmRzLiAqLworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X3ZlcnNpb25fY21kKTsKKwlpZiAodGVybWluYWwpIHsKKwkJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmNvbmZpZ19saXN0X2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZjb25maWdfZXhpdF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmY29uZmlnX2hlbHBfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmNvbmZpZ19lbmFibGVfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmNvbmZpZ190ZXJtaW5hbF9sZW5ndGhfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmNvbmZpZ190ZXJtaW5hbF9ub19sZW5ndGhfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmVjaG9fY21kKTsKKwl9CisKKwlpZiAodGVybWluYWwpIHsKKwkJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmY29uZmlnX2V4aXRfY21kKTsKKwkJaW5zdGFsbF9kZWZhdWx0KEVOQUJMRV9OT0RFKTsKKwkJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmY29uZmlnX2Rpc2FibGVfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmY29uZmlnX3Rlcm1pbmFsX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudCAoRU5BQkxFX05PREUsICZjb3B5X3J1bm5pbmdjb25maWdfc3RhcnR1cGNvbmZpZ19jbWQpOworCX0KKwlpbnN0YWxsX2VsZW1lbnQgKEVOQUJMRV9OT0RFLCAmc2hvd19zdGFydHVwX2NvbmZpZ19jbWQpOworCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJnNob3dfdmVyc2lvbl9jbWQpOworCisJaWYgKHRlcm1pbmFsKSB7CisJCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJmNvbmZpZ190ZXJtaW5hbF9sZW5ndGhfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmY29uZmlnX3Rlcm1pbmFsX25vX2xlbmd0aF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsICZlY2hvX2NtZCk7CisKKwkJaW5zdGFsbF9kZWZhdWx0KENPTkZJR19OT0RFKTsKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmY29uZmlnX2V4aXRfY21kKTsKKwl9CisKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZob3N0bmFtZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJm5vX2hvc3RuYW1lX2NtZCk7CisKKwlpZiAodGVybWluYWwpIHsKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmcGFzc3dvcmRfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmcGFzc3dvcmRfdGV4dF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZlbmFibGVfcGFzc3dvcmRfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmZW5hYmxlX3Bhc3N3b3JkX3RleHRfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmbm9fZW5hYmxlX3Bhc3N3b3JkX2NtZCk7CisKKyNpZmRlZiBWVFlfQ1JZUFRfUFcKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmc2VydmljZV9wYXNzd29yZF9lbmNyeXB0X2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJm5vX3NlcnZpY2VfcGFzc3dvcmRfZW5jcnlwdF9jbWQpOworI2VuZGlmCisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJmJhbm5lcl9tb3RkX2RlZmF1bHRfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmYmFubmVyX21vdGRfZmlsZV9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZub19iYW5uZXJfbW90ZF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZzZXJ2aWNlX3Rlcm1pbmFsX2xlbmd0aF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZub19zZXJ2aWNlX3Rlcm1pbmFsX2xlbmd0aF9jbWQpOworCisJfQorCXNyYW5kKHRpbWUoTlVMTCkpOworfQpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvc3JjL3Z0eS9sb2dnaW5nX3Z0eS5jIGIvbGlib3Ntb2NvcmUvc3JjL3Z0eS9sb2dnaW5nX3Z0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NmQ3OWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9zcmMvdnR5L2xvZ2dpbmdfdnR5LmMKQEAgLTAsMCArMSwzNDcgQEAKKy8qIE9wZW5CU0MgbG9nZ2luZyBoZWxwZXIgZm9yIHRoZSBWVFkgKi8KKy8qIChDKSAyMDA5LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA5LTIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9sb2dnaW5nLmg+CisKKy8vI2luY2x1ZGUgPG9wZW5ic2MvdnR5Lmg+CisKKyNpbmNsdWRlIDxvc21vY29tL3Z0eS9jb21tYW5kLmg+CisjaW5jbHVkZSA8b3Ntb2NvbS92dHkvYnVmZmVyLmg+CisjaW5jbHVkZSA8b3Ntb2NvbS92dHkvdnR5Lmg+CisjaW5jbHVkZSA8b3Ntb2NvbS92dHkvdGVsbmV0X2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPG9zbW9jb20vdnR5L2xvZ2dpbmcuaD4KKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBsb2dfaW5mbyAqb3Ntb19sb2dfaW5mbzsKKworc3RhdGljIHZvaWQgX3Z0eV9vdXRwdXQoc3RydWN0IGxvZ190YXJnZXQgKnRndCwgY29uc3QgY2hhciAqbGluZSkKK3sKKwlzdHJ1Y3QgdnR5ICp2dHkgPSB0Z3QtPnRndF92dHkudnR5OworCXZ0eV9vdXQodnR5LCAiJXMiLCBsaW5lKTsKKwkvKiBUaGlzIGlzIGFuIHVnbHkgaGFjaywgYnV0IHRoZXJlIGlzIG5vIGVhc3kgd2F5Li4uICovCisJaWYgKHN0cmNocihsaW5lLCAnXG4nKSkKKwkJdnR5X291dCh2dHksICJcciIpOworfQorCitzdHJ1Y3QgbG9nX3RhcmdldCAqbG9nX3RhcmdldF9jcmVhdGVfdnR5KHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyZ2V0OworCisJdGFyZ2V0ID0gbG9nX3RhcmdldF9jcmVhdGUoKTsKKwlpZiAoIXRhcmdldCkKKwkJcmV0dXJuIE5VTEw7CisKKwl0YXJnZXQtPnRndF92dHkudnR5ID0gdnR5OworCXRhcmdldC0+b3V0cHV0ID0gX3Z0eV9vdXRwdXQ7CisJcmV0dXJuIHRhcmdldDsKK30KKworREVGVU4oZW5hYmxlX2xvZ2dpbmcsCisgICAgICBlbmFibGVfbG9nZ2luZ19jbWQsCisgICAgICAibG9nZ2luZyBlbmFibGUiLAorCUxPR0dJTkdfU1RSCisgICAgICAiRW5hYmxlcyBsb2dnaW5nIHRvIHRoaXMgdnR5XG4iKQoreworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubjsKKworCWNvbm4gPSAoc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICopIHZ0eS0+cHJpdjsKKwlpZiAoY29ubi0+ZGJnKSB7CisJCXZ0eV9vdXQodnR5LCAiTG9nZ2luZyBhbHJlYWR5IGVuYWJsZWQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwljb25uLT5kYmcgPSBsb2dfdGFyZ2V0X2NyZWF0ZV92dHkodnR5KTsKKwlpZiAoIWNvbm4tPmRiZykKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCisJbG9nX2FkZF90YXJnZXQoY29ubi0+ZGJnKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGxvZ2dpbmdfZmx0cl9hbGwsCisgICAgICBsb2dnaW5nX2ZsdHJfYWxsX2NtZCwKKyAgICAgICJsb2dnaW5nIGZpbHRlciBhbGwgKDB8MSkiLAorCUxPR0dJTkdfU1RSIEZJTFRFUl9TVFIKKwkiRG8geW91IHdhbnQgdG8gbG9nIGFsbCBtZXNzYWdlcz9cbiIKKwkiT25seSBwcmludCBtZXNzYWdlcyBtYXRjaGVkIGJ5IG90aGVyIGZpbHRlcnNcbiIKKwkiQnlwYXNzIGZpbHRlciBhbmQgcHJpbnQgYWxsIG1lc3NhZ2VzXG4iKQoreworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubjsKKworCWNvbm4gPSAoc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICopIHZ0eS0+cHJpdjsKKwlpZiAoIWNvbm4tPmRiZykgeworCQl2dHlfb3V0KHZ0eSwgIkxvZ2dpbmcgd2FzIG5vdCBlbmFibGVkLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJbG9nX3NldF9hbGxfZmlsdGVyKGNvbm4tPmRiZywgYXRvaShhcmd2WzBdKSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihsb2dnaW5nX3VzZV9jbHIsCisgICAgICBsb2dnaW5nX3VzZV9jbHJfY21kLAorICAgICAgImxvZ2dpbmcgY29sb3IgKDB8MSkiLAorCUxPR0dJTkdfU1RSICJDb25maWd1cmUgY29sb3ItcHJpbnRpbmcgZm9yIGxvZyBtZXNzYWdlc1xuIgorICAgICAgIkRvbid0IHVzZSBjb2xvciBmb3IgcHJpbnRpbmcgbWVzc2FnZXNcbiIKKyAgICAgICJVc2UgY29sb3IgZm9yIHByaW50aW5nIG1lc3NhZ2VzXG4iKQoreworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubjsKKworCWNvbm4gPSAoc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICopIHZ0eS0+cHJpdjsKKwlpZiAoIWNvbm4tPmRiZykgeworCQl2dHlfb3V0KHZ0eSwgIkxvZ2dpbmcgd2FzIG5vdCBlbmFibGVkLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJbG9nX3NldF91c2VfY29sb3IoY29ubi0+ZGJnLCBhdG9pKGFyZ3ZbMF0pKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGxvZ2dpbmdfcHJudF90aW1lc3RhbXAsCisgICAgICBsb2dnaW5nX3BybnRfdGltZXN0YW1wX2NtZCwKKyAgICAgICJsb2dnaW5nIHRpbWVzdGFtcCAoMHwxKSIsCisJTE9HR0lOR19TVFIgIkNvbmZpZ3VyZSBsb2cgbWVzc2FnZSB0aW1lc3RhbXBpbmdcbiIKKwkiRG9uJ3QgcHJlZml4IGVhY2ggbG9nIG1lc3NhZ2VcbiIKKwkiUHJlZml4IGVhY2ggbG9nIG1lc3NhZ2Ugd2l0aCBjdXJyZW50IHRpbWVzdGFtcFxuIikKK3sKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm47CisKKwljb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqKSB2dHktPnByaXY7CisJaWYgKCFjb25uLT5kYmcpIHsKKwkJdnR5X291dCh2dHksICJMb2dnaW5nIHdhcyBub3QgZW5hYmxlZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWxvZ19zZXRfcHJpbnRfdGltZXN0YW1wKGNvbm4tPmRiZywgYXRvaShhcmd2WzBdKSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBGSVhNRTogdGhvc2UgaGF2ZSB0byBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgbG9nIGxldmVscyBhbmQgY2F0ZWdvcmllcyAqLworI2RlZmluZSBWVFlfREVCVUdfQ0FURUdPUklFUyAiKHJsbHxjY3xtbXxycnxyc2x8bm18c21zfHBhZ3xtbmNjfGlucHxtaXxtaWJ8bXV4fG1lYXN8c2NjcHxtc2N8bWdjcHxob3xkYnxyZWZ8Z3Byc3xuc3xic3NncHxsbGN8c25kY3B8YWxsKSIKKyNkZWZpbmUgQ0FURUdPUklFU19IRUxQCVwKKwkiQS1iaXMgUmFkaW8gTGluayBMYXllciAoUkxMKVxuIgkJCVwKKwkiTGF5ZXIzIENhbGwgQ29udHJvbCAoQ0MpXG4iCQkJCVwKKwkiTGF5ZXIzIE1vYmlsaXR5IE1hbmFnZW1lbnQgKE1NKVxuIgkJCVwKKwkiTGF5ZXIzIFJhZGlvIFJlc291cmNlIChSUilcbiIJCQkJXAorCSJBLWJpcyBSYWRpbyBTaWduYWxsaW5nIExpbmsgKFJTTClcbiIJCQlcCisJIkEtYmlzIE5ldHdvcmsgTWFuYWdlbWVudCAvIE8mTSAoTk0vT01MKVxuIgkJXAorCSJMYXllcjMgU2hvcnQgTWVzc2FnYWdpbmcgU2VydmljZSAoU01TKVxuIgkJXAorCSJQYWdpbmcgU3Vic3lzdGVtXG4iCQkJCQlcCisJIk1OQ0MgQVBJIGZvciBDYWxsIENvbnRyb2wgYXBwbGljYXRpb25cbiIJCVwKKwkiQS1iaXMgSW5wdXQgU3Vic3lzdGVtXG4iCQkJCVwKKwkiQS1iaXMgSW5wdXQgRHJpdmVyIGZvciBTaWduYWxsaW5nXG4iCQkJXAorCSJBLWJpcyBJbnB1dCBEcml2ZXIgZm9yIEItQ2hhbm5lbCAodm9pY2UgZGF0YSlcbiIJXAorCSJBLWJpcyBCLUNoYW5uZWwgLyBTdWItY2hhbm5lbCBNdWx0aXBsZXhlclxuIgkJXAorCSJSYWRpbyBNZWFzdXJlbWVudHNcbiIJCQkJCVwKKwkiU0NDUFxuIgkJCQkJCVwKKwkiTW9iaWxlIFN3aXRjaGluZyBDZW50ZXJcbiIJCQkJXAorCSJNZWRpYSBHYXRld2F5IENvbnRyb2wgUHJvdG9jb2xcbiIJCQlcCisJIkhhbmQtb3ZlclxuIgkJCQkJCVwKKwkiRGF0YWJhc2UgTGF5ZXJcbiIJCQkJCVwKKwkiUmVmZXJlbmNlIENvdW50aW5nXG4iCQkJCQlcCisJIkdQUlMgQ29yZVxuIgkJCQkJCVwKKwkiR1BSUyBOZXR3b3JrIFNlcnZpY2UgKE5TKVxuIgkJCQlcCisJIkdQUlMgQlNTIEdhdGV3YXkgUHJvdG9jb2wgKEJTU0dQKVxuIgkJCVwKKwkiR1BSUyBMb2dpY2FsIExpbmsgQ29udHJvbCBQcm90b2NvbCAoTExDKVxuIgkJXAorCSJHUFJTIFN1Yi1OZXR3b3JrIERlcGVuZGVudCBDb250cm9sIFByb3RvY29sIChTTkRDUClcbiIJXAorCSJHbG9iYWwgc2V0dGluZyBmb3IgYWxsIHN1YnN5dGVtc1xuIgorCisjZGVmaW5lIFZUWV9ERUJVR19MRVZFTFMgIihldmVyeXRoaW5nfGRlYnVnfGluZm98bm90aWNlfGVycm9yfGZhdGFsKSIKKyNkZWZpbmUgTEVWRUxTX0hFTFAJXAorCSJMb2cgc2ltcGx5IGV2ZXJ5dGhpbmdcbiIJCQkJXAorCSJMb2cgZGVidWcgbWVzc2FnZXMgYW5kIGhpZ2hlciBsZXZlbHNcbiIJCVwKKwkiTG9nIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMgYW5kIGhpZ2hlciBsZXZlbHNcbiIJXAorCSJMb2cgbm90aWNhYmxlIG1lc3NhZ2VzIGFuZCBoaWdoZXIgbGV2ZWxzXG4iCQlcCisJIkxvZyBlcnJvciBtZXNzYWdlcyBhbmQgaGlnaGVyIGxldmVsc1xuIgkJXAorCSJMb2cgb25seSBmYXRhbCBtZXNzYWdlc1xuIgorREVGVU4obG9nZ2luZ19sZXZlbCwKKyAgICAgIGxvZ2dpbmdfbGV2ZWxfY21kLAorICAgICAgImxvZ2dpbmcgbGV2ZWwgIiBWVFlfREVCVUdfQ0FURUdPUklFUyAiICIgVlRZX0RFQlVHX0xFVkVMUywKKyAgICAgIExPR0dJTkdfU1RSCisgICAgICAiU2V0IHRoZSBsb2cgbGV2ZWwgZm9yIGEgc3BlY2lmaWVkIGNhdGVnb3J5XG4iCisgICAgICBDQVRFR09SSUVTX0hFTFAKKyAgICAgIExFVkVMU19IRUxQKQoreworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubjsKKwlpbnQgY2F0ZWdvcnkgPSBsb2dfcGFyc2VfY2F0ZWdvcnkoYXJndlswXSk7CisJaW50IGxldmVsID0gbG9nX3BhcnNlX2xldmVsKGFyZ3ZbMV0pOworCisJY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OworCWlmICghY29ubi0+ZGJnKSB7CisJCXZ0eV9vdXQodnR5LCAiTG9nZ2luZyB3YXMgbm90IGVuYWJsZWQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAobGV2ZWwgPCAwKSB7CisJCXZ0eV9vdXQodnR5LCAiSW52YWxpZCBsZXZlbCBgJXMnJXMiLCBhcmd2WzFdLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwkvKiBDaGVjayBmb3Igc3BlY2lhbCBjYXNlIHdoZXJlIHdlIHdhbnQgdG8gc2V0IGdsb2JhbCBsb2cgbGV2ZWwgKi8KKwlpZiAoIXN0cmNtcChhcmd2WzBdLCAiYWxsIikpIHsKKwkJbG9nX3NldF9sb2dfbGV2ZWwoY29ubi0+ZGJnLCBsZXZlbCk7CisJCXJldHVybiBDTURfU1VDQ0VTUzsKKwl9CisKKwlpZiAoY2F0ZWdvcnkgPCAwKSB7CisJCXZ0eV9vdXQodnR5LCAiSW52YWxpZCBjYXRlZ29yeSBgJXMnJXMiLCBhcmd2WzBdLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwljb25uLT5kYmctPmNhdGVnb3JpZXNbY2F0ZWdvcnldLmVuYWJsZWQgPSAxOworCWNvbm4tPmRiZy0+Y2F0ZWdvcmllc1tjYXRlZ29yeV0ubG9nbGV2ZWwgPSBsZXZlbDsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obG9nZ2luZ19zZXRfY2F0ZWdvcnlfbWFzaywKKyAgICAgIGxvZ2dpbmdfc2V0X2NhdGVnb3J5X21hc2tfY21kLAorICAgICAgImxvZ2dpbmcgc2V0IGxvZyBtYXNrIE1BU0siLAorCUxPR0dJTkdfU1RSCisgICAgICAiRGVjaWRlIHdoaWNoIGNhdGVnb3JpZXMgdG8gb3V0cHV0LlxuIikKK3sKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm47CisKKwljb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqKSB2dHktPnByaXY7CisJaWYgKCFjb25uLT5kYmcpIHsKKwkJdnR5X291dCh2dHksICJMb2dnaW5nIHdhcyBub3QgZW5hYmxlZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWxvZ19wYXJzZV9jYXRlZ29yeV9tYXNrKGNvbm4tPmRiZywgYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihkaWFibGVfbG9nZ2luZywKKyAgICAgIGRpc2FibGVfbG9nZ2luZ19jbWQsCisgICAgICAibG9nZ2luZyBkaXNhYmxlIiwKKwlMT0dHSU5HX1NUUgorICAgICAgIkRpc2FibGVzIGxvZ2dpbmcgdG8gdGhpcyB2dHlcbiIpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOworCisJY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OworCWlmICghY29ubi0+ZGJnKSB7CisJCXZ0eV9vdXQodnR5LCAiTG9nZ2luZyB3YXMgbm90IGVuYWJsZWQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlsb2dfZGVsX3RhcmdldChjb25uLT5kYmcpOworCXRhbGxvY19mcmVlKGNvbm4tPmRiZyk7CisJY29ubi0+ZGJnID0gTlVMTDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIHZ0eV9wcmludF9sb2d0YXJnZXQoc3RydWN0IHZ0eSAqdnR5LCBjb25zdCBzdHJ1Y3QgbG9nX2luZm8gKmluZm8sCisJCQkJY29uc3Qgc3RydWN0IGxvZ190YXJnZXQgKnRndCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCXZ0eV9vdXQodnR5LCAiIEdsb2JhbCBMb2dsZXZlbDogJXMlcyIsCisJCWxvZ19sZXZlbF9zdHIodGd0LT5sb2dsZXZlbCksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBVc2UgY29sb3I6ICVzLCBQcmludCBUaW1lc3RhbXA6ICVzJXMiLAorCQl0Z3QtPnVzZV9jb2xvciA/ICJPbiIgOiAiT2ZmIiwKKwkJdGd0LT5wcmludF90aW1lc3RhbXAgPyAiT24iIDogIk9mZiIsIFZUWV9ORVdMSU5FKTsKKworCXZ0eV9vdXQodnR5LCAiIExvZyBMZXZlbCBzcGVjaWZpYyBpbmZvcm1hdGlvbjolcyIsIFZUWV9ORVdMSU5FKTsKKworCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5udW1fY2F0OyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IGxvZ19jYXRlZ29yeSAqY2F0ID0gJnRndC0+Y2F0ZWdvcmllc1tpXTsKKwkJdnR5X291dCh2dHksICIgICUtMTBzICUtMTBzICUtOHMgJXMlcyIsCisJCQlpbmZvLT5jYXRbaV0ubmFtZSsxLCBsb2dfbGV2ZWxfc3RyKGNhdC0+bG9nbGV2ZWwpLAorCQkJY2F0LT5lbmFibGVkID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIiwKKyAJCQlpbmZvLT5jYXRbaV0uZGVzY3JpcHRpb24sCisJCQlWVFlfTkVXTElORSk7CisJfQorfQorCisjZGVmaW5lIFNIT1dfTE9HX1NUUiAiU2hvdyBjdXJyZW50IGxvZ2dpbmcgY29uZmlndXJhdGlvblxuIgorCitERUZVTihzaG93X2xvZ2dpbmdfdnR5LAorICAgICAgc2hvd19sb2dnaW5nX3Z0eV9jbWQsCisgICAgICAic2hvdyBsb2dnaW5nIHZ0eSIsCisJU0hPV19TVFIgU0hPV19MT0dfU1RSCisJIlNob3cgY3VycmVudCBsb2dnaW5nIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgdnR5XG4iKQoreworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubjsKKworCWNvbm4gPSAoc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICopIHZ0eS0+cHJpdjsKKwlpZiAoIWNvbm4tPmRiZykgeworCQl2dHlfb3V0KHZ0eSwgIkxvZ2dpbmcgd2FzIG5vdCBlbmFibGVkLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCXZ0eV9wcmludF9sb2d0YXJnZXQodnR5LCBvc21vX2xvZ19pbmZvLCBjb25uLT5kYmcpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitnREVGVU4oY2ZnX2Rlc2NyaXB0aW9uLCBjZmdfZGVzY3JpcHRpb25fY21kLAorCSJkZXNjcmlwdGlvbiAuVEVYVCIsCisJIlNhdmUgaHVtYW4tcmVhZGFibGUgZGVjcmlwdGlvbiBvZiB0aGUgb2JqZWN0XG4iKQoreworCWNoYXIgKipkcHRyID0gdnR5LT5pbmRleF9zdWI7CisKKwlpZiAoIWRwdHIpIHsKKwkJdnR5X291dCh2dHksICJ2dHktPmluZGV4X3N1YiA9PSBOVUxMJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwkqZHB0ciA9IGFyZ3ZfY29uY2F0KGFyZ3YsIGFyZ2MsIDApOworCWlmICghZHB0cikKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitnREVGVU4oY2ZnX25vX2Rlc2NyaXB0aW9uLCBjZmdfbm9fZGVzY3JpcHRpb25fY21kLAorCSJubyBkZXNjcmlwdGlvbiIsCisJTk9fU1RSCisJIlJlbW92ZSBkZXNjcmlwdGlvbiBvZiB0aGUgb2JqZWN0XG4iKQoreworCWNoYXIgKipkcHRyID0gdnR5LT5pbmRleF9zdWI7CisKKwlpZiAoIWRwdHIpIHsKKwkJdnR5X291dCh2dHksICJ2dHktPmluZGV4X3N1YiA9PSBOVUxMJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAoKmRwdHIpIHsKKwkJdGFsbG9jX2ZyZWUoKmRwdHIpOworCQkqZHB0ciA9IE5VTEw7CisJfQorCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCit2b2lkIGxvZ2dpbmdfdnR5X2FkZF9jbWRzKCkKK3sKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJmVuYWJsZV9sb2dnaW5nX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50X3ZlKCZkaXNhYmxlX2xvZ2dpbmdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJmxvZ2dpbmdfZmx0cl9hbGxfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJmxvZ2dpbmdfdXNlX2Nscl9jbWQpOworCWluc3RhbGxfZWxlbWVudF92ZSgmbG9nZ2luZ19wcm50X3RpbWVzdGFtcF9jbWQpOworCWluc3RhbGxfZWxlbWVudF92ZSgmbG9nZ2luZ19zZXRfY2F0ZWdvcnlfbWFza19jbWQpOworCWluc3RhbGxfZWxlbWVudF92ZSgmbG9nZ2luZ19sZXZlbF9jbWQpOworCWluc3RhbGxfZWxlbWVudF92ZSgmc2hvd19sb2dnaW5nX3Z0eV9jbWQpOworfQpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvc3JjL3Z0eS90ZWxuZXRfaW50ZXJmYWNlLmMgYi9saWJvc21vY29yZS9zcmMvdnR5L3RlbG5ldF9pbnRlcmZhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDY5MDk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvc3JjL3Z0eS90ZWxuZXRfaW50ZXJmYWNlLmMKQEAgLTAsMCArMSwyMDMgQEAKKy8qIG1pbmltYWxpc3RpYyB0ZWxuZXQvbmV0d29yayBpbnRlcmZhY2UgaXQgbWlnaHQgdHVybiBpbnRvIGEgd2lyZSBpbnRlcmZhY2UgKi8KKy8qIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPG9zbW9jb20vdnR5L3RlbG5ldF9pbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxvc21vY29tL3Z0eS9idWZmZXIuaD4KKworLyogcGVyIGNvbm5lY3Rpb24gZGF0YSAqLworTExJU1RfSEVBRChhY3RpdmVfY29ubmVjdGlvbnMpOworCitzdGF0aWMgdm9pZCAqdGFsbF90ZWxuZXRfY3R4OworCisvKiBwZXIgbmV0d29yayBkYXRhICovCitzdGF0aWMgaW50IHRlbG5ldF9uZXdfY29ubmVjdGlvbihzdHJ1Y3QgYnNjX2ZkICpmZCwgdW5zaWduZWQgaW50IHdoYXQpOworCitzdGF0aWMgc3RydWN0IGJzY19mZCBzZXJ2ZXJfc29ja2V0ID0geworCS53aGVuCSAgICA9IEJTQ19GRF9SRUFELAorCS5jYgkgICAgPSB0ZWxuZXRfbmV3X2Nvbm5lY3Rpb24sCisJLnByaXZfbnIgICAgPSAwLAorfTsKKworaW50IHRlbG5ldF9pbml0KHZvaWQgKnRhbGxfY3R4LCB2b2lkICpwcml2LCBpbnQgcG9ydCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc29ja19hZGRyOworCWludCBmZCwgcmMsIG9uID0gMTsKKworCXRhbGxfdGVsbmV0X2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2N0eCwgMSwKKwkJCQkJICAgICAidGVsbmV0X2Nvbm5lY3Rpb24iKTsKKworCWZkID0gc29ja2V0KFBGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCk7CisKKwlpZiAoZmQgPCAwKSB7CisJCUxPR1AoMCwgTE9HTF9FUlJPUiwgIlRlbG5ldCBpbnRlcmZhY2Ugc29ja2V0IGNyZWF0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiBmZDsKKwl9CisKKwlzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZvbiwgc2l6ZW9mKG9uKSk7CisKKwltZW1zZXQoJnNvY2tfYWRkciwgMCwgc2l6ZW9mKHNvY2tfYWRkcikpOworCXNvY2tfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlzb2NrX2FkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKwlzb2NrX2FkZHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0xPT1BCQUNLKTsKKworCXJjID0gYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciopJnNvY2tfYWRkciwgc2l6ZW9mKHNvY2tfYWRkcikpOworCWlmIChiaW5kIDwgMCkgeworCQlMT0dQKDAsIExPR0xfRVJST1IsICJUZWxuZXQgaW50ZXJmYWNlIGZhaWxlZCB0byBiaW5kXG4iKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSBsaXN0ZW4oZmQsIDApOworCWlmIChyYyA8IDApIHsKKwkJTE9HUCgwLCBMT0dMX0VSUk9SLCAiVGVsbmV0IGludGVyZmFjZSBmYWlsZWQgdG8gbGlzdGVuXG4iKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gcmM7CisJfQorCisJc2VydmVyX3NvY2tldC5kYXRhID0gcHJpdjsKKwlzZXJ2ZXJfc29ja2V0LmZkID0gZmQ7CisJYnNjX3JlZ2lzdGVyX2ZkKCZzZXJ2ZXJfc29ja2V0KTsKKworCXJldHVybiAwOworfQorCitleHRlcm4gY29uc3QgY2hhciAqb3BlbmJzY19jb3B5cmlnaHQ7CisKK3N0YXRpYyB2b2lkIHByaW50X3dlbGNvbWUoaW50IGZkKQoreworCWludCByZXQ7CisJc3RhdGljIGNoYXIgKm1zZyA9CisJCSJXZWxjb21lIHRvIHRoZSBPcGVuQlNDIENvbnRyb2wgaW50ZXJmYWNlXG4iOworCisJcmV0ID0gd3JpdGUoZmQsIG1zZywgc3RybGVuKG1zZykpOworCXJldCA9IHdyaXRlKGZkLCBvcGVuYnNjX2NvcHlyaWdodCwgc3RybGVuKG9wZW5ic2NfY29weXJpZ2h0KSk7Cit9CisKK2ludCB0ZWxuZXRfY2xvc2VfY2xpZW50KHN0cnVjdCBic2NfZmQgKmZkKQoreworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24qKWZkLT5kYXRhOworCisJY2xvc2UoZmQtPmZkKTsKKwlic2NfdW5yZWdpc3Rlcl9mZChmZCk7CisKKwlpZiAoY29ubi0+ZGJnKSB7CisJCWxvZ19kZWxfdGFyZ2V0KGNvbm4tPmRiZyk7CisJCXRhbGxvY19mcmVlKGNvbm4tPmRiZyk7CisJfQorCisJbGxpc3RfZGVsKCZjb25uLT5lbnRyeSk7CisJdGFsbG9jX2ZyZWUoY29ubik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2xpZW50X2RhdGEoc3RydWN0IGJzY19mZCAqZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubiA9IGZkLT5kYXRhOworCWludCByYyA9IDA7CisKKwlpZiAod2hhdCAmIEJTQ19GRF9SRUFEKSB7CisJCWNvbm4tPmZkLndoZW4gJj0gfkJTQ19GRF9SRUFEOworCQlyYyA9IHZ0eV9yZWFkKGNvbm4tPnZ0eSk7CisJfQorCisJLyogdnR5IG1pZ2h0IGhhdmUgYmVlbiBjbG9zZWQgZnJvbSB2aXRoaW4gdnR5X3JlYWQoKSAqLworCWlmICghY29ubi0+dnR5KQorCQlyZXR1cm4gcmM7CisKKwlpZiAod2hhdCAmIEJTQ19GRF9XUklURSkgeworCQlyYyA9IGJ1ZmZlcl9mbHVzaF9hbGwoY29ubi0+dnR5LT5vYnVmLCBmZC0+ZmQpOworCQlpZiAocmMgPT0gQlVGRkVSX0VNUFRZKQorCQkJY29ubi0+ZmQud2hlbiAmPSB+QlNDX0ZEX1dSSVRFOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB0ZWxuZXRfbmV3X2Nvbm5lY3Rpb24oc3RydWN0IGJzY19mZCAqZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc29ja2FkZHI7CisJc29ja2xlbl90IGxlbiA9IHNpemVvZihzb2NrYWRkcik7CisJaW50IG5ld19jb25uZWN0aW9uID0gYWNjZXB0KGZkLT5mZCwgKHN0cnVjdCBzb2NrYWRkciopJnNvY2thZGRyLCAmbGVuKTsKKworCWlmIChuZXdfY29ubmVjdGlvbiA8IDApIHsKKwkJTE9HUCgwLCBMT0dMX0VSUk9SLCAidGVsbmV0IGFjY2VwdCBmYWlsZWRcbiIpOworCQlyZXR1cm4gbmV3X2Nvbm5lY3Rpb247CisJfQorCisJY29ubmVjdGlvbiA9IHRhbGxvY196ZXJvKHRhbGxfdGVsbmV0X2N0eCwgc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uKTsKKwljb25uZWN0aW9uLT5wcml2ID0gZmQtPmRhdGE7CisJY29ubmVjdGlvbi0+ZmQuZGF0YSA9IGNvbm5lY3Rpb247CisJY29ubmVjdGlvbi0+ZmQuZmQgPSBuZXdfY29ubmVjdGlvbjsKKwljb25uZWN0aW9uLT5mZC53aGVuID0gQlNDX0ZEX1JFQUQ7CisJY29ubmVjdGlvbi0+ZmQuY2IgPSBjbGllbnRfZGF0YTsKKwlic2NfcmVnaXN0ZXJfZmQoJmNvbm5lY3Rpb24tPmZkKTsKKwlsbGlzdF9hZGRfdGFpbCgmY29ubmVjdGlvbi0+ZW50cnksICZhY3RpdmVfY29ubmVjdGlvbnMpOworCisJcHJpbnRfd2VsY29tZShuZXdfY29ubmVjdGlvbik7CisKKwljb25uZWN0aW9uLT52dHkgPSB2dHlfY3JlYXRlKG5ld19jb25uZWN0aW9uLCBjb25uZWN0aW9uKTsKKwlpZiAoIWNvbm5lY3Rpb24tPnZ0eSkgeworCQlMT0dQKDAsIExPR0xfRVJST1IsICJjb3VsZG4ndCBjcmVhdGUgVlRZXG4iKTsKKwkJY2xvc2UobmV3X2Nvbm5lY3Rpb24pOworCQl0YWxsb2NfZnJlZShjb25uZWN0aW9uKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisvKiBjYWxsYmFjayBmcm9tIFZUWSBjb2RlICovCit2b2lkIHZ0eV9ldmVudChlbnVtIGV2ZW50IGV2ZW50LCBpbnQgc29jaywgc3RydWN0IHZ0eSAqdnR5KQoreworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IHZ0eS0+cHJpdjsKKwlzdHJ1Y3QgYnNjX2ZkICpiZmQgPSAmY29ubmVjdGlvbi0+ZmQ7CisKKwlpZiAodnR5LT50eXBlICE9IFZUWV9URVJNKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBWVFlfUkVBRDoKKwkJYmZkLT53aGVuIHw9IEJTQ19GRF9SRUFEOworCQlicmVhazsKKwljYXNlIFZUWV9XUklURToKKwkJYmZkLT53aGVuIHw9IEJTQ19GRF9XUklURTsKKwkJYnJlYWs7CisJY2FzZSBWVFlfQ0xPU0VEOgorCQkvKiB2dHkgbGF5ZXIgaXMgYWJvdXQgdG8gZnJlZSgpIHZ0eSAqLworCQljb25uZWN0aW9uLT52dHkgPSBOVUxMOworCQl0ZWxuZXRfY2xvc2VfY2xpZW50KGJmZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvc3JjL3Z0eS91dGlscy5jIGIvbGlib3Ntb2NvcmUvc3JjL3Z0eS91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNjM1MjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9zcmMvdnR5L3V0aWxzLmMKQEAgLTAsMCArMSw1MCBAQAorLyogdXRpbGl0eSByb3V0aW5lcyBmb3IgcHJpbnRpbmcgY29tbW9uIG9iamVjdHMgaW4gdGhlIE9zbW9jb20gd29ybGQgKi8KKworLyogKEMpIDIwMDktMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RpbWVyLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvcmF0ZV9jdHIuaD4KKworI2luY2x1ZGUgPG9zbW9jb20vdnR5L3Z0eS5oPgorCit2b2lkIHZ0eV9vdXRfcmF0ZV9jdHJfZ3JvdXAoc3RydWN0IHZ0eSAqdnR5LCBjb25zdCBjaGFyICpwcmVmaXgsCisJCQkgICAgc3RydWN0IHJhdGVfY3RyX2dyb3VwICpjdHJnKQoreworCXVuc2lnbmVkIGludCBpOworCisJdnR5X291dCh2dHksICIlcyVzOiVzIiwgcHJlZml4LCBjdHJnLT5kZXNjLT5ncm91cF9kZXNjcmlwdGlvbiwgVlRZX05FV0xJTkUpOworCWZvciAoaSA9IDA7IGkgPCBjdHJnLT5kZXNjLT5udW1fY3RyOyBpKyspIHsKKwkJc3RydWN0IHJhdGVfY3RyICpjdHIgPSAmY3RyZy0+Y3RyW2ldOworCQl2dHlfb3V0KHZ0eSwgIiAlcyVzOiAlOCIgUFJJdTY0ICIgIgorCQkJIiglIiBQUkl1NjQgIi9zICUiIFBSSXU2NCAiL20gJSIgUFJJdTY0ICIvaCAlIiBQUkl1NjQgIi9kKSVzIiwKKwkJCXByZWZpeCwgY3RyZy0+ZGVzYy0+Y3RyX2Rlc2NbaV0uZGVzY3JpcHRpb24sIGN0ci0+Y3VycmVudCwKKwkJCWN0ci0+aW50dltSQVRFX0NUUl9JTlRWX1NFQ10ucmF0ZSwKKwkJCWN0ci0+aW50dltSQVRFX0NUUl9JTlRWX01JTl0ucmF0ZSwKKwkJCWN0ci0+aW50dltSQVRFX0NUUl9JTlRWX0hPVVJdLnJhdGUsCisJCQljdHItPmludHZbUkFURV9DVFJfSU5UVl9EQVldLnJhdGUsCisJCQlWVFlfTkVXTElORSk7CisJfTsKK30KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL3NyYy92dHkvdmVjdG9yLmMgYi9saWJvc21vY29yZS9zcmMvdnR5L3ZlY3Rvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNDMxNjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9zcmMvdnR5L3ZlY3Rvci5jCkBAIC0wLDAgKzEsMTkyIEBACisvKiBHZW5lcmljIHZlY3RvciBpbnRlcmZhY2Ugcm91dGluZQorICogQ29weXJpZ2h0IChDKSAxOTk3IEt1bmloaXJvIElzaGlndXJvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIFplYnJhLgorICoKKyAqIEdOVSBaZWJyYSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogR05VIFplYnJhIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgWmVicmE7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgKiAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvbS92dHkvdmVjdG9yLmg+CisjaW5jbHVkZSA8b3Ntb2NvbS92dHkvdnR5Lmg+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+aW5kZXhbaV0gIT0gTlVMTCkKKwkJCWNvdW50Kys7CisKKwlyZXR1cm4gY291bnQ7Cit9CmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9zcmMvdnR5L3Z0eS5jIGIvbGlib3Ntb2NvcmUvc3JjL3Z0eS92dHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjE3YWJmCi0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvc3JjL3Z0eS92dHkuYwpAQCAtMCwwICsxLDE2ODMgQEAKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKworI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKKyNpbmNsdWRlIDxhcnBhL3RlbG5ldC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvbS92dHkvdnR5Lmg+CisjaW5jbHVkZSA8b3Ntb2NvbS92dHkvY29tbWFuZC5oPgorI2luY2x1ZGUgPG9zbW9jb20vdnR5L2J1ZmZlci5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisjZGVmaW5lIFNZU0NPTkZESVIgIi91c3IvbG9jYWwvZXRjIgorCisvKiBvdXIgY2FsbGJhY2ssIGxvY2F0ZWQgaW4gdGVsbmV0X2ludGVyZmFjZS5jICovCit2b2lkIHZ0eV9ldmVudChlbnVtIGV2ZW50IGV2ZW50LCBpbnQgc29jaywgc3RydWN0IHZ0eSAqdnR5KTsKKworZXh0ZXJuIHN0cnVjdCBob3N0IGhvc3Q7CisKKy8qIFZlY3RvciB3aGljaCBzdG9yZSBlYWNoIHZ0eSBzdHJ1Y3R1cmUuICovCitzdGF0aWMgdmVjdG9yIHZ0eXZlYzsKKwordmVjdG9yIFZ2dHlfc2Vydl90aHJlYWQ7CisKK2NoYXIgKnZ0eV9jd2QgPSBOVUxMOworCisvKiBDb25maWd1cmUgbG9jay4gKi8KK3N0YXRpYyBpbnQgdnR5X2NvbmZpZzsKKworc3RhdGljIGludCBub19wYXNzd29yZF9jaGVjayA9IDE7CisKK3ZvaWQgKnRhbGxfdnR5X2N0eDsKKworc3RhdGljIHZvaWQgdnR5X2NsZWFyX2J1ZihzdHJ1Y3QgdnR5ICp2dHkpCit7CisJbWVtc2V0KHZ0eS0+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+IDAgJiYgdnR5LT5idWZbdnR5LT5jcCAtIDFdID09ICcgJykKKwkJdnR5X2JhY2t3YXJkX2NoYXIodnR5KTsKKworCXdoaWxlICh2dHktPmNwID4gMCAmJiB2dHktPmJ1Zlt2dHktPmNwIC0gMV0gIT0gJyAnKQorCQl2dHlfYmFja3dhcmRfY2hhcih2dHkpOworfQorCisvKiBXaGVuICdeRCcgaXMgdHlwZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSB3ZSBtb3ZlIHRvIHRoZSBkb3duCisgICBsZXZlbC4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9kb3duX2xldmVsKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCS8qIEZJWE1FOiB3ZSBuZWVkIHRvIGNhbGwgdGhlIGV4aXQgZnVuY3Rpb24gb2YgdGhlIHNwZWNpZmljIG5vZGUKKwkgKiBpbiBxdWVzdGlvbiwgbm90IHRoaXMgZ2VuZXJpYyBvbmUgdGhhdCBkb2Vzbid0IGtub3cgYWxsIG5vZGVzICovCisJKCpjb25maWdfZXhpdF9jbWQuZnVuYykgKE5VTEwsIHZ0eSwgMCwgTlVMTCk7CisJdnR5X3Byb21wdCh2dHkpOworCXZ0eS0+Y3AgPSAwOworfQorCisvKiBXaGVuICdeWicgaXMgcmVjZWl2ZWQgZnJvbSB2dHksIG1vdmUgZG93biB0byB0aGUgZW5hYmxlIG1vZGUuICovCitzdGF0aWMgdm9pZCB2dHlfZW5kX2NvbmZpZyhzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKworCS8qIEZJWE1FOiB3ZSBuZWVkIHRvIGNhbGwgdGhlIGV4aXQgZnVuY3Rpb24gb2YgdGhlIHNwZWNpZmljIG5vZGUKKwkgKiBpbiBxdWVzdGlvbiwgbm90IHRoaXMgZ2VuZXJpYyBvbmUgdGhhdCBkb2Vzbid0IGtub3cgYWxsIG5vZGVzICovCisJc3dpdGNoICh2dHktPm5vZGUpIHsKKwljYXNlIFZJRVdfTk9ERToKKwljYXNlIEVOQUJMRV9OT0RFOgorCQkvKiBOb3RoaW5nIHRvIGRvLiAqLworCQlicmVhazsKKwljYXNlIENPTkZJR19OT0RFOgorCWNhc2UgVlRZX05PREU6CisJCXZ0eV9jb25maWdfdW5sb2NrKHZ0eSk7CisJCXZ0eS0+bm9kZSA9IEVOQUJMRV9OT0RFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBVbmtub3duIG5vZGUsIHdlIGhhdmUgdG8gaWdub3JlIGl0LiAqLworCQlicmVhazsKKwl9CisKKwl2dHlfcHJvbXB0KHZ0eSk7CisJdnR5LT5jcCA9IDA7Cit9CisKKy8qIERlbGV0ZSBhIGNoYXJjdGVyIGF0IHRoZSBjdXJyZW50IHBvaW50LiAqLworc3RhdGljIHZvaWQgdnR5X2RlbGV0ZV9jaGFyKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgaTsKKwlpbnQgc2l6ZTsKKworCWlmICh2dHktPm5vZGUgPT0gQVVUSF9OT0RFIHx8IHZ0eS0+bm9kZSA9PSBBVVRIX0VOQUJMRV9OT0RFKQorCQlyZXR1cm47CisKKwlpZiAodnR5LT5sZW5ndGggPT0gMCkgeworCQl2dHlfZG93bl9sZXZlbCh2dHkpOworCQlyZXR1cm47CisJfQorCisJaWYgKHZ0eS0+Y3AgPT0gdnR5LT5sZW5ndGgpCisJCXJldHVybjsJCS8qIGNvbXBsZXRpb24gbmVlZCBoZXJlPyAqLworCisJc2l6ZSA9IHZ0eS0+bGVuZ3RoIC0gdnR5LT5jcDsKKworCXZ0eS0+bGVuZ3RoLS07CisJbWVtbW92ZSgmdnR5LT5idWZbdnR5LT5jcF0sICZ2dHktPmJ1Zlt2dHktPmNwICsgMV0sIHNpemUgLSAxKTsKKwl2dHktPmJ1Zlt2dHktPmxlbmd0aF0gPSAnXDAnOworCisJdnR5X3dyaXRlKHZ0eSwgJnZ0eS0+YnVmW3Z0eS0+Y3BdLCBzaXplIC0gMSk7CisJdnR5X3dyaXRlKHZ0eSwgJnRlbG5ldF9zcGFjZV9jaGFyLCAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCXZ0eV93cml0ZSh2dHksICZ0ZWxuZXRfYmFja3dhcmRfY2hhciwgMSk7Cit9CisKKy8qIERlbGV0ZSBhIGNoYXJhY3RlciBiZWZvcmUgdGhlIHBvaW50LiAqLworc3RhdGljIHZvaWQgdnR5X2RlbGV0ZV9iYWNrd2FyZF9jaGFyKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpZiAodnR5LT5jcCA9PSAwKQorCQlyZXR1cm47CisKKwl2dHlfYmFja3dhcmRfY2hhcih2dHkpOworCXZ0eV9kZWxldGVfY2hhcih2dHkpOworfQorCisvKiBLaWxsIHJlc3Qgb2YgbGluZSBmcm9tIGN1cnJlbnQgcG9pbnQuICovCitzdGF0aWMgdm9pZCB2dHlfa2lsbF9saW5lKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgaTsKKwlpbnQgc2l6ZTsKKworCXNpemUgPSB2dHktPmxlbmd0aCAtIHZ0eS0+Y3A7CisKKwlpZiAoc2l6ZSA9PSAwKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQl2dHlfd3JpdGUodnR5LCAmdGVsbmV0X3NwYWNlX2NoYXIsIDEpOworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCXZ0eV93cml0ZSh2dHksICZ0ZWxuZXRfYmFja3dhcmRfY2hhciwgMSk7CisKKwltZW1zZXQoJnZ0eS0+YnVmW3Z0eS0+Y3BdLCAwLCBzaXplKTsKKwl2dHktPmxlbmd0aCA9IHZ0eS0+Y3A7Cit9CisKKy8qIEtpbGwgbGluZSBmcm9tIHRoZSBiZWdpbm5pbmcuICovCitzdGF0aWMgdm9pZCB2dHlfa2lsbF9saW5lX2Zyb21fYmVnaW5uaW5nKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl2dHlfYmVnaW5uaW5nX29mX2xpbmUodnR5KTsKKwl2dHlfa2lsbF9saW5lKHZ0eSk7Cit9CisKKy8qIERlbGV0ZSBhIHdvcmQgYmVmb3JlIHRoZSBwb2ludC4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9mb3J3YXJkX2tpbGxfd29yZChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJd2hpbGUgKHZ0eS0+Y3AgIT0gdnR5LT5sZW5ndGggJiYgdnR5LT5idWZbdnR5LT5jcF0gPT0gJyAnKQorCQl2dHlfZGVsZXRlX2NoYXIodnR5KTsKKwl3aGlsZSAodnR5LT5jcCAhPSB2dHktPmxlbmd0aCAmJiB2dHktPmJ1Zlt2dHktPmNwXSAhPSAnICcpCisJCXZ0eV9kZWxldGVfY2hhcih2dHkpOworfQorCisvKiBEZWxldGUgYSB3b3JkIGJlZm9yZSB0aGUgcG9pbnQuICovCitzdGF0aWMgdm9pZCB2dHlfYmFja3dhcmRfa2lsbF93b3JkKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl3aGlsZSAodnR5LT5jcCA+IDAgJiYgdnR5LT5idWZbdnR5LT5jcCAtIDFdID09ICcgJykKKwkJdnR5X2RlbGV0ZV9iYWNrd2FyZF9jaGFyKHZ0eSk7CisJd2hpbGUgKHZ0eS0+Y3AgPiAwICYmIHZ0eS0+YnVmW3Z0eS0+Y3AgLSAxXSAhPSAnICcpCisJCXZ0eV9kZWxldGVfYmFja3dhcmRfY2hhcih2dHkpOworfQorCisvKiBUcmFuc3Bvc2UgY2hhcnMgYmVmb3JlIG9yIGF0IHRoZSBwb2ludC4gKi8KK3N0YXRpYyB2b2lkIHZ0eV90cmFuc3Bvc2VfY2hhcnMoc3RydWN0IHZ0eSAqdnR5KQoreworCWNoYXIgYzEsIGMyOworCisJLyogSWYgbGVuZ3RoIGlzIHNob3J0IG9yIHBvaW50IGlzIG5lYXIgYnkgdGhlIGJlZ2lubmluZyBvZiBsaW5lIHRoZW4KKwkgICByZXR1cm4uICovCisJaWYgKHZ0eS0+bGVuZ3RoIDwgMiB8fCB2dHktPmNwIDwgMSkKKwkJcmV0dXJuOworCisJLyogSW4gY2FzZSBvZiBwb2ludCBpcyBsb2NhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuICovCisJaWYgKHZ0eS0+Y3AgPT0gdnR5LT5sZW5ndGgpIHsKKwkJYzEgPSB2dHktPmJ1Zlt2dHktPmNwIC0gMV07CisJCWMyID0gdnR5LT5idWZbdnR5LT5jcCAtIDJdOworCisJCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7CisJCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7CisJCXZ0eV9zZWxmX2luc2VydF9vdmVyd3JpdGUodnR5LCBjMSk7CisJCXZ0eV9zZWxmX2luc2VydF9vdmVyd3JpdGUodnR5LCBjMik7CisJfSBlbHNlIHsKKwkJYzEgPSB2dHktPmJ1Zlt2dHktPmNwXTsKKwkJYzIgPSB2dHktPmJ1Zlt2dHktPmNwIC0gMV07CisKKwkJdnR5X2JhY2t3YXJkX2NoYXIodnR5KTsKKwkJdnR5X3NlbGZfaW5zZXJ0X292ZXJ3cml0ZSh2dHksIGMxKTsKKwkJdnR5X3NlbGZfaW5zZXJ0X292ZXJ3cml0ZSh2dHksIGMyKTsKKwl9Cit9CisKKy8qIERvIGNvbXBsZXRpb24gYXQgdnR5IGludGVyZmFjZS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9jb21wbGV0ZV9jb21tYW5kKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgaTsKKwlpbnQgcmV0OworCWNoYXIgKiptYXRjaGVkID0gTlVMTDsKKwl2ZWN0b3IgdmxpbmU7CisKKwlpZiAodnR5LT5ub2RlID09IEFVVEhfTk9ERSB8fCB2dHktPm5vZGUgPT0gQVVUSF9FTkFCTEVfTk9ERSkKKwkJcmV0dXJuOworCisJdmxpbmUgPSBjbWRfbWFrZV9zdHJ2ZWModnR5LT5idWYpOworCWlmICh2bGluZSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBJbiBjYXNlIG9mICdoZWxwIFx0Jy4gKi8KKwlpZiAoaXNzcGFjZSgoaW50KXZ0eS0+YnVmW3Z0eS0+bGVuZ3RoIC0gMV0pKQorCQl2ZWN0b3Jfc2V0KHZsaW5lLCAnXDAnKTsKKworCW1hdGNoZWQgPSBjbWRfY29tcGxldGVfY29tbWFuZCh2bGluZSwgdnR5LCAmcmV0KTsKKworCWNtZF9mcmVlX3N0cnZlYyh2bGluZSk7CisKKwl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCXN3aXRjaCAocmV0KSB7CisJY2FzZSBDTURfRVJSX0FNQklHVU9VUzoKKwkJdnR5X291dCh2dHksICIlJSBBbWJpZ3VvdXMgY29tbWFuZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJdnR5X3Byb21wdCh2dHkpOworCQl2dHlfcmVkcmF3X2xpbmUodnR5KTsKKwkJYnJlYWs7CisJY2FzZSBDTURfRVJSX05PX01BVENIOgorCQkvKiB2dHlfb3V0ICh2dHksICIlJSBUaGVyZSBpcyBubyBtYXRjaGVkIGNvbW1hbmQuJXMiLCBWVFlfTkVXTElORSk7ICovCisJCXZ0eV9wcm9tcHQodnR5KTsKKwkJdnR5X3JlZHJhd19saW5lKHZ0eSk7CisJCWJyZWFrOworCWNhc2UgQ01EX0NPTVBMRVRFX0ZVTExfTUFUQ0g6CisJCXZ0eV9wcm9tcHQodnR5KTsKKwkJdnR5X3JlZHJhd19saW5lKHZ0eSk7CisJCXZ0eV9iYWNrd2FyZF9wdXJlX3dvcmQodnR5KTsKKwkJdnR5X2luc2VydF93b3JkX292ZXJ3cml0ZSh2dHksIG1hdGNoZWRbMF0pOworCQl2dHlfc2VsZl9pbnNlcnQodnR5LCAnICcpOworCQl0YWxsb2NfZnJlZShtYXRjaGVkWzBdKTsKKwkJYnJlYWs7CisJY2FzZSBDTURfQ09NUExFVEVfTUFUQ0g6CisJCXZ0eV9wcm9tcHQodnR5KTsKKwkJdnR5X3JlZHJhd19saW5lKHZ0eSk7CisJCXZ0eV9iYWNrd2FyZF9wdXJlX3dvcmQodnR5KTsKKwkJdnR5X2luc2VydF93b3JkX292ZXJ3cml0ZSh2dHksIG1hdGNoZWRbMF0pOworCQl0YWxsb2NfZnJlZShtYXRjaGVkWzBdKTsKKwkJYnJlYWs7CisJY2FzZSBDTURfQ09NUExFVEVfTElTVF9NQVRDSDoKKwkJZm9yIChpID0gMDsgbWF0Y2hlZFtpXSAhPSBOVUxMOyBpKyspIHsKKwkJCWlmIChpICE9IDAgJiYgKChpICUgNikgPT0gMCkpCisJCQkJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKwkJCXZ0eV9vdXQodnR5LCAiJS0xMHMgIiwgbWF0Y2hlZFtpXSk7CisJCQl0YWxsb2NfZnJlZShtYXRjaGVkW2ldKTsKKwkJfQorCQl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCisJCXZ0eV9wcm9tcHQodnR5KTsKKwkJdnR5X3JlZHJhd19saW5lKHZ0eSk7CisJCWJyZWFrOworCWNhc2UgQ01EX0VSUl9OT1RISU5HX1RPRE86CisJCXZ0eV9wcm9tcHQodnR5KTsKKwkJdnR5X3JlZHJhd19saW5lKHZ0eSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlpZiAobWF0Y2hlZCkKKwkJdmVjdG9yX29ubHlfaW5kZXhfZnJlZShtYXRjaGVkKTsKK30KKworc3RhdGljIHZvaWQKK3Z0eV9kZXNjcmliZV9mb2xkKHN0cnVjdCB2dHkgKnZ0eSwgaW50IGNtZF93aWR0aCwKKwkJICB1bnNpZ25lZCBpbnQgZGVzY193aWR0aCwgc3RydWN0IGRlc2MgKmRlc2MpCit7CisJY2hhciAqYnVmOworCWNvbnN0IGNoYXIgKmNtZCwgKnA7CisJaW50IHBvczsKKworCWNtZCA9IGRlc2MtPmNtZFswXSA9PSAnLicgPyBkZXNjLT5jbWQgKyAxIDogZGVzYy0+Y21kOworCisJaWYgKGRlc2Nfd2lkdGggPD0gMCkgeworCQl2dHlfb3V0KHZ0eSwgIiAgJS0qcyAgJXMlcyIsIGNtZF93aWR0aCwgY21kLCBkZXNjLT5zdHIsCisJCQlWVFlfTkVXTElORSk7CisJCXJldHVybjsKKwl9CisKKwlidWYgPSBfdGFsbG9jX3plcm8odnR5LCBzdHJsZW4oZGVzYy0+c3RyKSArIDEsICJkZXNjcmliZV9mb2xkIik7CisJaWYgKCFidWYpCisJCXJldHVybjsKKworCWZvciAocCA9IGRlc2MtPnN0cjsgc3RybGVuKHApID4gZGVzY193aWR0aDsgcCArPSBwb3MgKyAxKSB7CisJCWZvciAocG9zID0gZGVzY193aWR0aDsgcG9zID4gMDsgcG9zLS0pCisJCQlpZiAoKihwICsgcG9zKSA9PSAnICcpCisJCQkJYnJlYWs7CisKKwkJaWYgKHBvcyA9PSAwKQorCQkJYnJlYWs7CisKKwkJc3RybmNweShidWYsIHAsIHBvcyk7CisJCWJ1Zltwb3NdID0gJ1wwJzsKKwkJdnR5X291dCh2dHksICIgICUtKnMgICVzJXMiLCBjbWRfd2lkdGgsIGNtZCwgYnVmLCBWVFlfTkVXTElORSk7CisKKwkJY21kID0gIiI7CisJfQorCisJdnR5X291dCh2dHksICIgICUtKnMgICVzJXMiLCBjbWRfd2lkdGgsIGNtZCwgcCwgVlRZX05FV0xJTkUpOworCisJdGFsbG9jX2ZyZWUoYnVmKTsKK30KKworLyogRGVzY3JpYmUgbWF0Y2hlZCBjb21tYW5kIGZ1bmN0aW9uLiAqLworc3RhdGljIHZvaWQgdnR5X2Rlc2NyaWJlX2NvbW1hbmQoc3RydWN0IHZ0eSAqdnR5KQoreworCWludCByZXQ7CisJdmVjdG9yIHZsaW5lOworCXZlY3RvciBkZXNjcmliZTsKKwl1bnNpZ25lZCBpbnQgaSwgd2lkdGgsIGRlc2Nfd2lkdGg7CisJc3RydWN0IGRlc2MgKmRlc2MsICpkZXNjX2NyID0gTlVMTDsKKworCXZsaW5lID0gY21kX21ha2Vfc3RydmVjKHZ0eS0+YnVmKTsKKworCS8qIEluIGNhc2Ugb2YgJz4gPycuICovCisJaWYgKHZsaW5lID09IE5VTEwpIHsKKwkJdmxpbmUgPSB2ZWN0b3JfaW5pdCgxKTsKKwkJdmVjdG9yX3NldCh2bGluZSwgJ1wwJyk7CisJfSBlbHNlIGlmIChpc3NwYWNlKChpbnQpdnR5LT5idWZbdnR5LT5sZW5ndGggLSAxXSkpCisJCXZlY3Rvcl9zZXQodmxpbmUsICdcMCcpOworCisJZGVzY3JpYmUgPSBjbWRfZGVzY3JpYmVfY29tbWFuZCh2bGluZSwgdnR5LCAmcmV0KTsKKworCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisKKwkvKiBBbWJpZ3VvdXMgZXJyb3IuICovCisJc3dpdGNoIChyZXQpIHsKKwljYXNlIENNRF9FUlJfQU1CSUdVT1VTOgorCQljbWRfZnJlZV9zdHJ2ZWModmxpbmUpOworCQl2dHlfb3V0KHZ0eSwgIiUlIEFtYmlndW91cyBjb21tYW5kLiVzIiwgVlRZX05FV0xJTkUpOworCQl2dHlfcHJvbXB0KHZ0eSk7CisJCXZ0eV9yZWRyYXdfbGluZSh2dHkpOworCQlyZXR1cm47CisJCWJyZWFrOworCWNhc2UgQ01EX0VSUl9OT19NQVRDSDoKKwkJY21kX2ZyZWVfc3RydmVjKHZsaW5lKTsKKwkJdnR5X291dCh2dHksICIlJSBUaGVyZSBpcyBubyBtYXRjaGVkIGNvbW1hbmQuJXMiLCBWVFlfTkVXTElORSk7CisJCXZ0eV9wcm9tcHQodnR5KTsKKwkJdnR5X3JlZHJhd19saW5lKHZ0eSk7CisJCXJldHVybjsKKwkJYnJlYWs7CisJfQorCisJLyogR2V0IHdpZHRoIG9mIGNvbW1hbmQgc3RyaW5nLiAqLworCXdpZHRoID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShkZXNjcmliZSk7IGkrKykKKwkJaWYgKChkZXNjID0gdmVjdG9yX3Nsb3QoZGVzY3JpYmUsIGkpKSAhPSBOVUxMKSB7CisJCQl1bnNpZ25lZCBpbnQgbGVuOworCisJCQlpZiAoZGVzYy0+Y21kWzBdID09ICdcMCcpCisJCQkJY29udGludWU7CisKKwkJCWxlbiA9IHN0cmxlbihkZXNjLT5jbWQpOworCQkJaWYgKGRlc2MtPmNtZFswXSA9PSAnLicpCisJCQkJbGVuLS07CisKKwkJCWlmICh3aWR0aCA8IGxlbikKKwkJCQl3aWR0aCA9IGxlbjsKKwkJfQorCisJLyogR2V0IHdpZHRoIG9mIGRlc2NyaXB0aW9uIHN0cmluZy4gKi8KKwlkZXNjX3dpZHRoID0gdnR5LT53aWR0aCAtICh3aWR0aCArIDYpOworCisJLyogUHJpbnQgb3V0IGRlc2NyaXB0aW9uLiAqLworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKGRlc2NyaWJlKTsgaSsrKQorCQlpZiAoKGRlc2MgPSB2ZWN0b3Jfc2xvdChkZXNjcmliZSwgaSkpICE9IE5VTEwpIHsKKwkJCWlmIChkZXNjLT5jbWRbMF0gPT0gJ1wwJykKKwkJCQljb250aW51ZTsKKworCQkJaWYgKHN0cmNtcChkZXNjLT5jbWQsICI8Y3I+IikgPT0gMCkgeworCQkJCWRlc2NfY3IgPSBkZXNjOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoIWRlc2MtPnN0cikKKwkJCQl2dHlfb3V0KHZ0eSwgIiAgJS1zJXMiLAorCQkJCQlkZXNjLT5jbWRbMF0gPT0KKwkJCQkJJy4nID8gZGVzYy0+Y21kICsgMSA6IGRlc2MtPmNtZCwKKwkJCQkJVlRZX05FV0xJTkUpOworCQkJZWxzZSBpZiAoZGVzY193aWR0aCA+PSBzdHJsZW4oZGVzYy0+c3RyKSkKKwkJCQl2dHlfb3V0KHZ0eSwgIiAgJS0qcyAgJXMlcyIsIHdpZHRoLAorCQkJCQlkZXNjLT5jbWRbMF0gPT0KKwkJCQkJJy4nID8gZGVzYy0+Y21kICsgMSA6IGRlc2MtPmNtZCwKKwkJCQkJZGVzYy0+c3RyLCBWVFlfTkVXTElORSk7CisJCQllbHNlCisJCQkJdnR5X2Rlc2NyaWJlX2ZvbGQodnR5LCB3aWR0aCwgZGVzY193aWR0aCwgZGVzYyk7CisKKyNpZiAwCisJCQl2dHlfb3V0KHZ0eSwgIiAgJS0qcyAlcyVzIiwgd2lkdGgKKwkJCQlkZXNjLT5jbWRbMF0gPT0gJy4nID8gZGVzYy0+Y21kICsgMSA6IGRlc2MtPmNtZCwKKwkJCQlkZXNjLT5zdHIgPyBkZXNjLT5zdHIgOiAiIiwgVlRZX05FV0xJTkUpOworI2VuZGlmCQkJCS8qIDAgKi8KKwkJfQorCisJaWYgKChkZXNjID0gZGVzY19jcikpIHsKKwkJaWYgKCFkZXNjLT5zdHIpCisJCQl2dHlfb3V0KHZ0eSwgIiAgJS1zJXMiLAorCQkJCWRlc2MtPmNtZFswXSA9PSAnLicgPyBkZXNjLT5jbWQgKyAxIDogZGVzYy0+Y21kLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJZWxzZSBpZiAoZGVzY193aWR0aCA+PSBzdHJsZW4oZGVzYy0+c3RyKSkKKwkJCXZ0eV9vdXQodnR5LCAiICAlLSpzICAlcyVzIiwgd2lkdGgsCisJCQkJZGVzYy0+Y21kWzBdID09ICcuJyA/IGRlc2MtPmNtZCArIDEgOiBkZXNjLT5jbWQsCisJCQkJZGVzYy0+c3RyLCBWVFlfTkVXTElORSk7CisJCWVsc2UKKwkJCXZ0eV9kZXNjcmliZV9mb2xkKHZ0eSwgd2lkdGgsIGRlc2Nfd2lkdGgsIGRlc2MpOworCX0KKworCWNtZF9mcmVlX3N0cnZlYyh2bGluZSk7CisJdmVjdG9yX2ZyZWUoZGVzY3JpYmUpOworCisJdnR5X3Byb21wdCh2dHkpOworCXZ0eV9yZWRyYXdfbGluZSh2dHkpOworfQorCisvKiBeQyBzdG9wIGN1cnJlbnQgaW5wdXQgYW5kIGRvIG5vdCBhZGQgY29tbWFuZCBsaW5lIHRvIHRoZSBoaXN0b3J5LiAqLworc3RhdGljIHZvaWQgdnR5X3N0b3BfaW5wdXQoc3RydWN0IHZ0eSAqdnR5KQoreworCXZ0eS0+Y3AgPSB2dHktPmxlbmd0aCA9IDA7CisJdnR5X2NsZWFyX2J1Zih2dHkpOworCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisKKwlzd2l0Y2ggKHZ0eS0+bm9kZSkgeworCWNhc2UgVklFV19OT0RFOgorCWNhc2UgRU5BQkxFX05PREU6CisJCS8qIE5vdGhpbmcgdG8gZG8uICovCisJCWJyZWFrOworCWNhc2UgQ09ORklHX05PREU6CisJY2FzZSBWVFlfTk9ERToKKwkJdnR5X2NvbmZpZ191bmxvY2sodnR5KTsKKwkJdnR5LT5ub2RlID0gRU5BQkxFX05PREU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIFVua25vd24gbm9kZSwgd2UgaGF2ZSB0byBpZ25vcmUgaXQuICovCisJCWJyZWFrOworCX0KKwl2dHlfcHJvbXB0KHZ0eSk7CisKKwkvKiBTZXQgaGlzdG9yeSBwb2ludGVyIHRvIHRoZSBsYXRlc3Qgb25lLiAqLworCXZ0eS0+aHAgPSB2dHktPmhpbmRleDsKK30KKworI2RlZmluZSBDT05UUk9MKFgpICAoKFgpIC0gJ0AnKQorI2RlZmluZSBWVFlfTk9STUFMICAgICAwCisjZGVmaW5lIFZUWV9QUkVfRVNDQVBFIDEKKyNkZWZpbmUgVlRZX0VTQ0FQRSAgICAgMgorCisvKiBFc2NhcGUgY2hhcmFjdGVyIGNvbW1hbmQgbWFwLiAqLworc3RhdGljIHZvaWQgdnR5X2VzY2FwZV9tYXAodW5zaWduZWQgY2hhciBjLCBzdHJ1Y3QgdnR5ICp2dHkpCit7CisJc3dpdGNoIChjKSB7CisJY2FzZSAoJ0EnKToKKwkJdnR5X3ByZXZpb3VzX2xpbmUodnR5KTsKKwkJYnJlYWs7CisJY2FzZSAoJ0InKToKKwkJdnR5X25leHRfbGluZSh2dHkpOworCQlicmVhazsKKwljYXNlICgnQycpOgorCQl2dHlfZm9yd2FyZF9jaGFyKHZ0eSk7CisJCWJyZWFrOworCWNhc2UgKCdEJyk6CisJCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCS8qIEdvIGJhY2sgdG8gbm9ybWFsIG1vZGUuICovCisJdnR5LT5lc2NhcGUgPSBWVFlfTk9STUFMOworfQorCisvKiBRdWl0IHByaW50IG91dCB0byB0aGUgYnVmZmVyLiAqLworc3RhdGljIHZvaWQgdnR5X2J1ZmZlcl9yZXNldChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJYnVmZmVyX3Jlc2V0KHZ0eS0+b2J1Zik7CisJdnR5X3Byb21wdCh2dHkpOworCXZ0eV9yZWRyYXdfbGluZSh2dHkpOworfQorCisvKiBSZWFkIGRhdGEgdmlhIHZ0eSBzb2NrZXQuICovCitpbnQgdnR5X3JlYWQoc3RydWN0IHZ0eSAqdnR5KQoreworCWludCBpOworCWludCBuYnl0ZXM7CisJdW5zaWduZWQgY2hhciBidWZbVlRZX1JFQURfQlVGU0laXTsKKworCWludCB2dHlfc29jayA9IHZ0eS0+ZmQ7CisKKwkvKiBSZWFkIHJhdyBkYXRhIGZyb20gc29ja2V0ICovCisJaWYgKChuYnl0ZXMgPSByZWFkKHZ0eS0+ZmQsIGJ1ZiwgVlRZX1JFQURfQlVGU0laKSkgPD0gMCkgeworCQlpZiAobmJ5dGVzIDwgMCkgeworCQkJaWYgKEVSUk5PX0lPX1JFVFJZKGVycm5vKSkgeworCQkJCXZ0eV9ldmVudChWVFlfUkVBRCwgdnR5X3NvY2ssIHZ0eSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJYnVmZmVyX3Jlc2V0KHZ0eS0+b2J1Zik7CisJCXZ0eS0+c3RhdHVzID0gVlRZX0NMT1NFOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBuYnl0ZXM7IGkrKykgeworCQlpZiAoYnVmW2ldID09IElBQykgeworCQkJaWYgKCF2dHktPmlhYykgeworCQkJCXZ0eS0+aWFjID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSB7CisJCQkJdnR5LT5pYWMgPSAwOworCQkJfQorCQl9CisKKwkJaWYgKHZ0eS0+aWFjX3NiX2luX3Byb2dyZXNzICYmICF2dHktPmlhYykgeworCQkJaWYgKHZ0eS0+c2JfbGVuIDwgc2l6ZW9mKHZ0eS0+c2JfYnVmKSkKKwkJCQl2dHktPnNiX2J1Zlt2dHktPnNiX2xlbl0gPSBidWZbaV07CisJCQl2dHktPnNiX2xlbisrOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAodnR5LT5pYWMpIHsKKwkJCS8qIEluIGNhc2Ugb2YgdGVsbmV0IGNvbW1hbmQgKi8KKwkJCWludCByZXQgPSAwOworCQkJcmV0ID0gdnR5X3RlbG5ldF9vcHRpb24odnR5LCBidWYgKyBpLCBuYnl0ZXMgLSBpKTsKKwkJCXZ0eS0+aWFjID0gMDsKKwkJCWkgKz0gcmV0OworCQkJY29udGludWU7CisJCX0KKworCQlpZiAodnR5LT5zdGF0dXMgPT0gVlRZX01PUkUpIHsKKwkJCXN3aXRjaCAoYnVmW2ldKSB7CisJCQljYXNlIENPTlRST0woJ0MnKToKKwkJCWNhc2UgJ3EnOgorCQkJY2FzZSAnUSc6CisJCQkJdnR5X2J1ZmZlcl9yZXNldCh2dHkpOworCQkJCWJyZWFrOworI2lmIDAJCQkJLyogTW9yZSBsaW5lIGRvZXMgbm90IHdvcmsgZm9yICJzaG93IGlwIGJncCIuICAqLworCQkJY2FzZSAnXG4nOgorCQkJY2FzZSAnXHInOgorCQkJCXZ0eS0+c3RhdHVzID0gVlRZX01PUkVMSU5FOworCQkJCWJyZWFrOworI2VuZGlmCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQkvKiBFc2NhcGUgY2hhcmFjdGVyLiAqLworCQlpZiAodnR5LT5lc2NhcGUgPT0gVlRZX0VTQ0FQRSkgeworCQkJdnR5X2VzY2FwZV9tYXAoYnVmW2ldLCB2dHkpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBQcmUtZXNjYXBlIHN0YXR1cy4gKi8KKwkJaWYgKHZ0eS0+ZXNjYXBlID09IFZUWV9QUkVfRVNDQVBFKSB7CisJCQlzd2l0Y2ggKGJ1ZltpXSkgeworCQkJY2FzZSAnWyc6CisJCQkJdnR5LT5lc2NhcGUgPSBWVFlfRVNDQVBFOworCQkJCWJyZWFrOworCQkJY2FzZSAnYic6CisJCQkJdnR5X2JhY2t3YXJkX3dvcmQodnR5KTsKKwkJCQl2dHktPmVzY2FwZSA9IFZUWV9OT1JNQUw7CisJCQkJYnJlYWs7CisJCQljYXNlICdmJzoKKwkJCQl2dHlfZm9yd2FyZF93b3JkKHZ0eSk7CisJCQkJdnR5LT5lc2NhcGUgPSBWVFlfTk9STUFMOworCQkJCWJyZWFrOworCQkJY2FzZSAnZCc6CisJCQkJdnR5X2ZvcndhcmRfa2lsbF93b3JkKHZ0eSk7CisJCQkJdnR5LT5lc2NhcGUgPSBWVFlfTk9STUFMOworCQkJCWJyZWFrOworCQkJY2FzZSBDT05UUk9MKCdIJyk6CisJCQljYXNlIDB4N2Y6CisJCQkJdnR5X2JhY2t3YXJkX2tpbGxfd29yZCh2dHkpOworCQkJCXZ0eS0+ZXNjYXBlID0gVlRZX05PUk1BTDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJdnR5LT5lc2NhcGUgPSBWVFlfTk9STUFMOworCQkJCWJyZWFrOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQlzd2l0Y2ggKGJ1ZltpXSkgeworCQljYXNlIENPTlRST0woJ0EnKToKKwkJCXZ0eV9iZWdpbm5pbmdfb2ZfbGluZSh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnQicpOgorCQkJdnR5X2JhY2t3YXJkX2NoYXIodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ0MnKToKKwkJCXZ0eV9zdG9wX2lucHV0KHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdEJyk6CisJCQl2dHlfZGVsZXRlX2NoYXIodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ0UnKToKKwkJCXZ0eV9lbmRfb2ZfbGluZSh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnRicpOgorCQkJdnR5X2ZvcndhcmRfY2hhcih2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnSCcpOgorCQljYXNlIDB4N2Y6CisJCQl2dHlfZGVsZXRlX2JhY2t3YXJkX2NoYXIodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ0snKToKKwkJCXZ0eV9raWxsX2xpbmUodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ04nKToKKwkJCXZ0eV9uZXh0X2xpbmUodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ1AnKToKKwkJCXZ0eV9wcmV2aW91c19saW5lKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdUJyk6CisJCQl2dHlfdHJhbnNwb3NlX2NoYXJzKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdVJyk6CisJCQl2dHlfa2lsbF9saW5lX2Zyb21fYmVnaW5uaW5nKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdXJyk6CisJCQl2dHlfYmFja3dhcmRfa2lsbF93b3JkKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdaJyk6CisJCQl2dHlfZW5kX2NvbmZpZyh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgJ1xuJzoKKwkJY2FzZSAnXHInOgorCQkJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKwkJCXZ0eV9leGVjdXRlKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSAnXHQnOgorCQkJdnR5X2NvbXBsZXRlX2NvbW1hbmQodnR5KTsKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJCWlmICh2dHktPm5vZGUgPT0gQVVUSF9OT0RFCisJCQkgICAgfHwgdnR5LT5ub2RlID09IEFVVEhfRU5BQkxFX05PREUpCisJCQkJdnR5X3NlbGZfaW5zZXJ0KHZ0eSwgYnVmW2ldKTsKKwkJCWVsc2UKKwkJCQl2dHlfZGVzY3JpYmVfY29tbWFuZCh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgJ1wwMzMnOgorCQkJaWYgKGkgKyAxIDwgbmJ5dGVzICYmIGJ1ZltpICsgMV0gPT0gJ1snKSB7CisJCQkJdnR5LT5lc2NhcGUgPSBWVFlfRVNDQVBFOworCQkJCWkrKzsKKwkJCX0gZWxzZQorCQkJCXZ0eS0+ZXNjYXBlID0gVlRZX1BSRV9FU0NBUEU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmIChidWZbaV0gPiAzMSAmJiBidWZbaV0gPCAxMjcpCisJCQkJdnR5X3NlbGZfaW5zZXJ0KHZ0eSwgYnVmW2ldKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogQ2hlY2sgc3RhdHVzLiAqLworCWlmICh2dHktPnN0YXR1cyA9PSBWVFlfQ0xPU0UpCisJCXZ0eV9jbG9zZSh2dHkpOworCWVsc2UgeworCQl2dHlfZXZlbnQoVlRZX1dSSVRFLCB2dHlfc29jaywgdnR5KTsKKwkJdnR5X2V2ZW50KFZUWV9SRUFELCB2dHlfc29jaywgdnR5KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFJlYWQgdXAgY29uZmlndXJhdGlvbiBmaWxlICovCitzdGF0aWMgaW50Cit2dHlfcmVhZF9maWxlKEZJTEUgKmNvbmZwLCB2b2lkICpwcml2KQoreworCWludCByZXQ7CisJc3RydWN0IHZ0eSAqdnR5OworCisJdnR5ID0gdnR5X25ldygpOworCXZ0eS0+ZmQgPSAwOworCXZ0eS0+dHlwZSA9IFZUWV9GSUxFOworCXZ0eS0+bm9kZSA9IENPTkZJR19OT0RFOworCXZ0eS0+cHJpdiA9IHByaXY7CisKKwlyZXQgPSBjb25maWdfZnJvbV9maWxlKHZ0eSwgY29uZnApOworCisJaWYgKHJldCAhPSBDTURfU1VDQ0VTUykgeworCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIENNRF9FUlJfQU1CSUdVT1VTOgorCQkJZnByaW50ZihzdGRlcnIsICJBbWJpZ3VvdXMgY29tbWFuZC5cbiIpOworCQkJYnJlYWs7CisJCWNhc2UgQ01EX0VSUl9OT19NQVRDSDoKKwkJCWZwcmludGYoc3RkZXJyLCAiVGhlcmUgaXMgbm8gc3VjaCBjb21tYW5kLlxuIik7CisJCQlicmVhazsKKwkJfQorCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yIG9jY3VycmVkIGR1cmluZyByZWFkaW5nIGJlbG93ICIKKwkJCSJsaW5lOlxuJXNcbiIsIHZ0eS0+YnVmKTsKKwkJdnR5X2Nsb3NlKHZ0eSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXZ0eV9jbG9zZSh2dHkpOworCXJldHVybiAwOworfQorCisvKiBDcmVhdGUgbmV3IHZ0eSBzdHJ1Y3R1cmUuICovCitzdHJ1Y3QgdnR5ICoKK3Z0eV9jcmVhdGUgKGludCB2dHlfc29jaywgdm9pZCAqcHJpdikKK3sKKyAgc3RydWN0IHZ0eSAqdnR5OworCisJc3RydWN0IHRlcm1pb3MgdDsKKworCXRjZ2V0YXR0cih2dHlfc29jaywgJnQpOworCWNmbWFrZXJhdygmdCk7CisJdGNzZXRhdHRyKHZ0eV9zb2NrLCBUQ1NBTk9XLCAmdCk7CisKKyAgLyogQWxsb2NhdGUgbmV3IHZ0eSBzdHJ1Y3R1cmUgYW5kIHNldCB1cCBkZWZhdWx0IHZhbHVlcy4gKi8KKyAgdnR5ID0gdnR5X25ldyAoKTsKKyAgdnR5LT5mZCA9IHZ0eV9zb2NrOworICB2dHktPnByaXYgPSBwcml2OworICB2dHktPnR5cGUgPSBWVFlfVEVSTTsKKyAgaWYgKG5vX3Bhc3N3b3JkX2NoZWNrKQorICAgIHsKKyAgICAgIGlmIChob3N0LmFkdmFuY2VkKQorCXZ0eS0+bm9kZSA9IEVOQUJMRV9OT0RFOworICAgICAgZWxzZQorCXZ0eS0+bm9kZSA9IFZJRVdfTk9ERTsKKyAgICB9CisgIGVsc2UKKyAgICB2dHktPm5vZGUgPSBBVVRIX05PREU7CisgIHZ0eS0+ZmFpbCA9IDA7CisgIHZ0eS0+Y3AgPSAwOworICB2dHlfY2xlYXJfYnVmICh2dHkpOworICB2dHktPmxlbmd0aCA9IDA7CisgIG1lbXNldCAodnR5LT5oaXN0LCAwLCBzaXplb2YgKHZ0eS0+aGlzdCkpOworICB2dHktPmhwID0gMDsKKyAgdnR5LT5oaW5kZXggPSAwOworICB2ZWN0b3Jfc2V0X2luZGV4ICh2dHl2ZWMsIHZ0eV9zb2NrLCB2dHkpOworICB2dHktPnN0YXR1cyA9IFZUWV9OT1JNQUw7CisgIGlmIChob3N0LmxpbmVzID49IDApCisgICAgdnR5LT5saW5lcyA9IGhvc3QubGluZXM7CisgIGVsc2UKKyAgICB2dHktPmxpbmVzID0gLTE7CisKKyAgaWYgKCEgbm9fcGFzc3dvcmRfY2hlY2spCisgICAgeworICAgICAgLyogVnR5IGlzIG5vdCBhdmFpbGFibGUgaWYgcGFzc3dvcmQgaXNuJ3Qgc2V0LiAqLworICAgICAgaWYgKGhvc3QucGFzc3dvcmQgPT0gTlVMTCAmJiBob3N0LnBhc3N3b3JkX2VuY3J5cHQgPT0gTlVMTCkKKwl7CisJICB2dHlfb3V0ICh2dHksICJWdHkgcGFzc3dvcmQgaXMgbm90IHNldC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkgIHZ0eS0+c3RhdHVzID0gVlRZX0NMT1NFOworCSAgdnR5X2Nsb3NlICh2dHkpOworCSAgcmV0dXJuIE5VTEw7CisJfQorICAgIH0KKworICAvKiBTYXkgaGVsbG8gdG8gdGhlIHdvcmxkLiAqLworICB2dHlfaGVsbG8gKHZ0eSk7CisgIGlmICghIG5vX3Bhc3N3b3JkX2NoZWNrKQorICAgIHZ0eV9vdXQgKHZ0eSwgIiVzVXNlciBBY2Nlc3MgVmVyaWZpY2F0aW9uJXMlcyIsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUpOworCisgIC8qIFNldHRpbmcgdXAgdGVybWluYWwuICovCisgIHZ0eV93aWxsX2VjaG8gKHZ0eSk7CisgIHZ0eV93aWxsX3N1cHByZXNzX2dvX2FoZWFkICh2dHkpOworCisgIHZ0eV9kb250X2xpbmVtb2RlICh2dHkpOworICB2dHlfZG9fd2luZG93X3NpemUgKHZ0eSk7CisgIC8qIHZ0eV9kb250X2xmbG93X2FoZWFkICh2dHkpOyAqLworCisgIHZ0eV9wcm9tcHQgKHZ0eSk7CisKKyAgLyogQWRkIHJlYWQvd3JpdGUgdGhyZWFkLiAqLworICB2dHlfZXZlbnQgKFZUWV9XUklURSwgdnR5X3NvY2ssIHZ0eSk7CisgIHZ0eV9ldmVudCAoVlRZX1JFQUQsIHZ0eV9zb2NrLCB2dHkpOworCisgIHJldHVybiB2dHk7Cit9CisKK0RFRlVOKGNvbmZpZ193aG8sIGNvbmZpZ193aG9fY21kLCAid2hvIiwgIkRpc3BsYXkgd2hvIGlzIG9uIHZ0eVxuIikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgdnR5ICp2OworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUodnR5dmVjKTsgaSsrKQorCQlpZiAoKHYgPSB2ZWN0b3Jfc2xvdCh2dHl2ZWMsIGkpKSAhPSBOVUxMKQorCQkJdnR5X291dCh2dHksICIlc3Z0eVslZF0gJXMiLAorCQkJCXYtPmNvbmZpZyA/ICIqIiA6ICIgIiwgaSwgVlRZX05FV0xJTkUpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogTW92ZSB0byB2dHkgY29uZmlndXJhdGlvbiBtb2RlLiAqLworREVGVU4obGluZV92dHksCisgICAgICBsaW5lX3Z0eV9jbWQsCisgICAgICAibGluZSB2dHkiLCAiQ29uZmlndXJlIGEgdGVybWluYWwgbGluZVxuIiAiVmlydHVhbCB0ZXJtaW5hbFxuIikKK3sKKwl2dHktPm5vZGUgPSBWVFlfTk9ERTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIHZ0eSBsb2dpbi4gKi8KK0RFRlVOKHZ0eV9sb2dpbiwgdnR5X2xvZ2luX2NtZCwgImxvZ2luIiwgIkVuYWJsZSBwYXNzd29yZCBjaGVja2luZ1xuIikKK3sKKwlub19wYXNzd29yZF9jaGVjayA9IDA7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihub192dHlfbG9naW4sCisgICAgICBub192dHlfbG9naW5fY21kLCAibm8gbG9naW4iLCBOT19TVFIgIkVuYWJsZSBwYXNzd29yZCBjaGVja2luZ1xuIikKK3sKKwlub19wYXNzd29yZF9jaGVjayA9IDE7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihzZXJ2aWNlX2FkdmFuY2VkX3Z0eSwKKyAgICAgIHNlcnZpY2VfYWR2YW5jZWRfdnR5X2NtZCwKKyAgICAgICJzZXJ2aWNlIGFkdmFuY2VkLXZ0eSIsCisgICAgICAiU2V0IHVwIG1pc2NlbGxhbmVvdXMgc2VydmljZVxuIiAiRW5hYmxlIGFkdmFuY2VkIG1vZGUgdnR5IGludGVyZmFjZVxuIikKK3sKKwlob3N0LmFkdmFuY2VkID0gMTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5vX3NlcnZpY2VfYWR2YW5jZWRfdnR5LAorICAgICAgbm9fc2VydmljZV9hZHZhbmNlZF92dHlfY21kLAorICAgICAgIm5vIHNlcnZpY2UgYWR2YW5jZWQtdnR5IiwKKyAgICAgIE5PX1NUUgorICAgICAgIlNldCB1cCBtaXNjZWxsYW5lb3VzIHNlcnZpY2VcbiIgIkVuYWJsZSBhZHZhbmNlZCBtb2RlIHZ0eSBpbnRlcmZhY2VcbiIpCit7CisJaG9zdC5hZHZhbmNlZCA9IDA7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTih0ZXJtaW5hbF9tb25pdG9yLAorICAgICAgdGVybWluYWxfbW9uaXRvcl9jbWQsCisgICAgICAidGVybWluYWwgbW9uaXRvciIsCisgICAgICAiU2V0IHRlcm1pbmFsIGxpbmUgcGFyYW1ldGVyc1xuIgorICAgICAgIkNvcHkgZGVidWcgb3V0cHV0IHRvIHRoZSBjdXJyZW50IHRlcm1pbmFsIGxpbmVcbiIpCit7CisJdnR5LT5tb25pdG9yID0gMTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHRlcm1pbmFsX25vX21vbml0b3IsCisgICAgICB0ZXJtaW5hbF9ub19tb25pdG9yX2NtZCwKKyAgICAgICJ0ZXJtaW5hbCBubyBtb25pdG9yIiwKKyAgICAgICJTZXQgdGVybWluYWwgbGluZSBwYXJhbWV0ZXJzXG4iCisgICAgICBOT19TVFIgIkNvcHkgZGVidWcgb3V0cHV0IHRvIHRoZSBjdXJyZW50IHRlcm1pbmFsIGxpbmVcbiIpCit7CisJdnR5LT5tb25pdG9yID0gMDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHNob3dfaGlzdG9yeSwKKyAgICAgIHNob3dfaGlzdG9yeV9jbWQsCisgICAgICAic2hvdyBoaXN0b3J5IiwgU0hPV19TVFIgIkRpc3BsYXkgdGhlIHNlc3Npb24gY29tbWFuZCBoaXN0b3J5XG4iKQoreworCWludCBpbmRleDsKKworCWZvciAoaW5kZXggPSB2dHktPmhpbmRleCArIDE7IGluZGV4ICE9IHZ0eS0+aGluZGV4OykgeworCQlpZiAoaW5kZXggPT0gVlRZX01BWEhJU1QpIHsKKwkJCWluZGV4ID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHZ0eS0+aGlzdFtpbmRleF0gIT0gTlVMTCkKKwkJCXZ0eV9vdXQodnR5LCAiICAlcyVzIiwgdnR5LT5oaXN0W2luZGV4XSwgVlRZX05FV0xJTkUpOworCisJCWluZGV4Kys7CisJfQorCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBEaXNwbGF5IGN1cnJlbnQgY29uZmlndXJhdGlvbi4gKi8KK3N0YXRpYyBpbnQgdnR5X2NvbmZpZ193cml0ZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdnR5X291dCh2dHksICJsaW5lIHZ0eSVzIiwgVlRZX05FV0xJTkUpOworCisJLyogbG9naW4gKi8KKwlpZiAobm9fcGFzc3dvcmRfY2hlY2spCisJCXZ0eV9vdXQodnR5LCAiIG5vIGxvZ2luJXMiLCBWVFlfTkVXTElORSk7CisKKwl2dHlfb3V0KHZ0eSwgIiElcyIsIFZUWV9ORVdMSU5FKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RydWN0IGNtZF9ub2RlIHZ0eV9ub2RlID0geworCVZUWV9OT0RFLAorCSIlcyhjb25maWctbGluZSkjICIsCisJMSwKK307CisKKy8qIFJlc2V0IGFsbCBWVFkgc3RhdHVzLiAqLwordm9pZCB2dHlfcmVzZXQoKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCB2dHkgKnZ0eTsKKwlzdHJ1Y3QgdGhyZWFkICp2dHlfc2Vydl90aHJlYWQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2dHl2ZWMpOyBpKyspCisJCWlmICgodnR5ID0gdmVjdG9yX3Nsb3QodnR5dmVjLCBpKSkgIT0gTlVMTCkgeworCQkJYnVmZmVyX3Jlc2V0KHZ0eS0+b2J1Zik7CisJCQl2dHktPnN0YXR1cyA9IFZUWV9DTE9TRTsKKwkJCXZ0eV9jbG9zZSh2dHkpOworCQl9CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShWdnR5X3NlcnZfdGhyZWFkKTsgaSsrKQorCQlpZiAoKHZ0eV9zZXJ2X3RocmVhZCA9CisJCSAgICAgdmVjdG9yX3Nsb3QoVnZ0eV9zZXJ2X3RocmVhZCwgaSkpICE9IE5VTEwpIHsKKwkJCS8vdGhyZWFkX2NhbmNlbCAodnR5X3NlcnZfdGhyZWFkKTsKKwkJCXZlY3Rvcl9zbG90KFZ2dHlfc2Vydl90aHJlYWQsIGkpID0gTlVMTDsKKwkJCWNsb3NlKGkpOworCQl9Cit9CisKK3N0YXRpYyB2b2lkIHZ0eV9zYXZlX2N3ZCh2b2lkKQoreworCWNoYXIgY3dkW01BWFBBVEhMRU5dOworCWNoYXIgKmMgOworCisJYyA9IGdldGN3ZChjd2QsIE1BWFBBVEhMRU4pOworCisJaWYgKCFjKSB7CisJCWlmIChjaGRpcihTWVNDT05GRElSKSAhPSAwKQorCQkgICAgcGVycm9yKCJjaGRpciBmYWlsZWQiKTsKKwkJaWYgKGdldGN3ZChjd2QsIE1BWFBBVEhMRU4pID09IE5VTEwpCisJCSAgICBwZXJyb3IoImdldGN3ZCBmYWlsZWQiKTsKKwl9CisKKwl2dHlfY3dkID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X2N0eCwgc3RybGVuKGN3ZCkgKyAxLCAic2F2ZV9jd2QiKTsKKwlzdHJjcHkodnR5X2N3ZCwgY3dkKTsKK30KKworY2hhciAqdnR5X2dldF9jd2QoKQoreworCXJldHVybiB2dHlfY3dkOworfQorCitpbnQgdnR5X3NoZWxsX3NlcnYoc3RydWN0IHZ0eSAqdnR5KQoreworCXJldHVybiB2dHktPnR5cGUgPT0gVlRZX1NIRUxMX1NFUlYgPyAxIDogMDsKK30KKwordm9pZCB2dHlfaW5pdF92dHlzaCgpCit7CisJdnR5dmVjID0gdmVjdG9yX2luaXQoVkVDVE9SX01JTl9TSVpFKTsKK30KKworZXh0ZXJuIHZvaWQgKnRhbGxfYnNjX2N0eDsKKy8qIEluc3RhbGwgdnR5J3Mgb3duIGNvbW1hbmRzIGxpa2UgYHdobycgY29tbWFuZC4gKi8KK3ZvaWQgdnR5X2luaXQoc3RydWN0IHZ0eV9hcHBfaW5mbyAqYXBwX2luZm8pCit7CisJdGFsbF92dHlfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KGFwcF9pbmZvLT50YWxsX2N0eCwgMCwgInZ0eSIpOworCXRhbGxfdnR5X3ZlY19jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF92dHlfY3R4LCAwLCAidnR5X3ZlY3RvciIpOworCXRhbGxfdnR5X2NtZF9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF92dHlfY3R4LCAwLCAidnR5X2NvbW1hbmQiKTsKKworCWNtZF9pbml0KDEpOworCisJaG9zdC5hcHBfaW5mbyA9IGFwcF9pbmZvOworCisJLyogRm9yIGZ1cnRoZXIgY29uZmlndXJhdGlvbiByZWFkLCBwcmVzZXJ2ZSBjdXJyZW50IGRpcmVjdG9yeS4gKi8KKwl2dHlfc2F2ZV9jd2QoKTsKKworCXZ0eXZlYyA9IHZlY3Rvcl9pbml0KFZFQ1RPUl9NSU5fU0laRSk7CisKKwkvKiBJbnN0YWxsIGJncCB0b3Agbm9kZS4gKi8KKwlpbnN0YWxsX25vZGUoJnZ0eV9ub2RlLCB2dHlfY29uZmlnX3dyaXRlKTsKKworCWluc3RhbGxfZWxlbWVudF92ZSgmY29uZmlnX3dob19jbWQpOworCWluc3RhbGxfZWxlbWVudF92ZSgmc2hvd19oaXN0b3J5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmbGluZV92dHlfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZzZXJ2aWNlX2FkdmFuY2VkX3Z0eV9jbWQpOworCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJm5vX3NlcnZpY2VfYWR2YW5jZWRfdnR5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmc2hvd19oaXN0b3J5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmdGVybWluYWxfbW9uaXRvcl9jbWQpOworCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJnRlcm1pbmFsX25vX21vbml0b3JfY21kKTsKKworCWluc3RhbGxfZGVmYXVsdChWVFlfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KFZUWV9OT0RFLCAmdnR5X2xvZ2luX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZUWV9OT0RFLCAmbm9fdnR5X2xvZ2luX2NtZCk7Cit9CisKK2ludCB2dHlfcmVhZF9jb25maWdfZmlsZShjb25zdCBjaGFyICpmaWxlX25hbWUsIHZvaWQgKnByaXYpCit7CisJRklMRSAqY2ZpbGU7CisJaW50IHJjOworCisJY2ZpbGUgPSBmb3BlbihmaWxlX25hbWUsICJyIik7CisJaWYgKCFjZmlsZSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlyYyA9IHZ0eV9yZWFkX2ZpbGUoY2ZpbGUsIHByaXYpOworCWZjbG9zZShjZmlsZSk7CisKKwlob3N0X2NvbmZpZ19zZXQoZmlsZV9uYW1lKTsKKworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL3NyYy93cml0ZV9xdWV1ZS5jIGIvbGlib3Ntb2NvcmUvc3JjL3dyaXRlX3F1ZXVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE4YThjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm9zbW9jb3JlL3NyYy93cml0ZV9xdWV1ZS5jCkBAIC0wLDAgKzEsODggQEAKKy8qIEdlbmVyaWMgd3JpdGUgcXVldWUgaW1wbGVtZW50YXRpb24gKi8KKy8qCisgKiAoQykgMjAxMCBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlcgorICogKEMpIDIwMTAgYnkgT24tV2F2ZXMKKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9zbW9jb3JlL3dyaXRlX3F1ZXVlLmg+CisKK2ludCB3cml0ZV9xdWV1ZV9iZmRfY2Ioc3RydWN0IGJzY19mZCAqZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCXN0cnVjdCB3cml0ZV9xdWV1ZSAqcXVldWU7CisKKwlxdWV1ZSA9IGNvbnRhaW5lcl9vZihmZCwgc3RydWN0IHdyaXRlX3F1ZXVlLCBiZmQpOworCisJaWYgKHdoYXQgJiBCU0NfRkRfUkVBRCkKKwkJcXVldWUtPnJlYWRfY2IoZmQpOworCisJaWYgKHdoYXQgJiBCU0NfRkRfRVhDRVBUKQorCQlxdWV1ZS0+ZXhjZXB0X2NiKGZkKTsKKworCWlmICh3aGF0ICYgQlNDX0ZEX1dSSVRFKSB7CisJCXN0cnVjdCBtc2diICptc2c7CisKKwkJZmQtPndoZW4gJj0gfkJTQ19GRF9XUklURTsKKwkJbXNnID0gbXNnYl9kZXF1ZXVlKCZxdWV1ZS0+bXNnX3F1ZXVlKTsKKwkJaWYgKCFtc2cpCisJCQlyZXR1cm4gLTE7CisKKwkJLS1xdWV1ZS0+Y3VycmVudF9sZW5ndGg7CisJCXF1ZXVlLT53cml0ZV9jYihmZCwgbXNnKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisKKwkJaWYgKCFsbGlzdF9lbXB0eSgmcXVldWUtPm1zZ19xdWV1ZSkpCisJCQlmZC0+d2hlbiB8PSBCU0NfRkRfV1JJVEU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgd3JpdGVfcXVldWVfaW5pdChzdHJ1Y3Qgd3JpdGVfcXVldWUgKnF1ZXVlLCBpbnQgbWF4X2xlbmd0aCkKK3sKKwlxdWV1ZS0+bWF4X2xlbmd0aCA9IG1heF9sZW5ndGg7CisJcXVldWUtPmN1cnJlbnRfbGVuZ3RoID0gMDsKKwlxdWV1ZS0+cmVhZF9jYiA9IE5VTEw7CisJcXVldWUtPndyaXRlX2NiID0gTlVMTDsKKwlxdWV1ZS0+YmZkLmNiID0gd3JpdGVfcXVldWVfYmZkX2NiOworCUlOSVRfTExJU1RfSEVBRCgmcXVldWUtPm1zZ19xdWV1ZSk7Cit9CisKK2ludCB3cml0ZV9xdWV1ZV9lbnF1ZXVlKHN0cnVjdCB3cml0ZV9xdWV1ZSAqcXVldWUsIHN0cnVjdCBtc2diICpkYXRhKQoreworLy8JaWYgKHF1ZXVlLT5jdXJyZW50X2xlbmd0aCArIDEgPj0gcXVldWUtPm1heF9sZW5ndGgpCisvLwkJTE9HUChETVNDLCBMT0dMX0VSUk9SLCAiVGhlIHF1ZXVlIGlzIGZ1bGwuIERyb3BwaW5nIG5vdCB5ZXQgaW1wbGVtZW50ZWQuXG4iKTsKKworCSsrcXVldWUtPmN1cnJlbnRfbGVuZ3RoOworCW1zZ2JfZW5xdWV1ZSgmcXVldWUtPm1zZ19xdWV1ZSwgZGF0YSk7CisJcXVldWUtPmJmZC53aGVuIHw9IEJTQ19GRF9XUklURTsKKworCXJldHVybiAwOworfQorCit2b2lkIHdyaXRlX3F1ZXVlX2NsZWFyKHN0cnVjdCB3cml0ZV9xdWV1ZSAqcXVldWUpCit7CisJd2hpbGUgKCFsbGlzdF9lbXB0eSgmcXVldWUtPm1zZ19xdWV1ZSkpIHsKKwkJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfZGVxdWV1ZSgmcXVldWUtPm1zZ19xdWV1ZSk7CisJCW1zZ2JfZnJlZShtc2cpOworCX0KKworCXF1ZXVlLT5jdXJyZW50X2xlbmd0aCA9IDA7CisJcXVldWUtPmJmZC53aGVuICY9IH5CU0NfRkRfV1JJVEU7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9NYWtlZmlsZS5hbSBiL2xpYm9zbW9jb3JlL3Rlc3RzL01ha2VmaWxlLmFtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9NYWtlZmlsZS5hbQpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvdGVzdHMvTWFrZWZpbGUuYW0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Ntcy9NYWtlZmlsZS5hbSBiL2xpYm9zbW9jb3JlL3Rlc3RzL3Ntcy9NYWtlZmlsZS5hbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvc21zL01ha2VmaWxlLmFtCnJlbmFtZSB0byBsaWJvc21vY29yZS90ZXN0cy9zbXMvTWFrZWZpbGUuYW0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Ntcy9zbXNfdGVzdC5jIGIvbGlib3Ntb2NvcmUvdGVzdHMvc21zL3Ntc190ZXN0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL3Ntcy9zbXNfdGVzdC5jCnJlbmFtZSB0byBsaWJvc21vY29yZS90ZXN0cy9zbXMvc21zX3Rlc3QuYwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGltZXIvTWFrZWZpbGUuYW0gYi9saWJvc21vY29yZS90ZXN0cy90aW1lci9NYWtlZmlsZS5hbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvdGltZXIvTWFrZWZpbGUuYW0KcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3Rlc3RzL3RpbWVyL01ha2VmaWxlLmFtCmRpZmYgLS1naXQgYS90ZXN0cy90aW1lci90aW1lcl90ZXN0LmMgYi9saWJvc21vY29yZS90ZXN0cy90aW1lci90aW1lcl90ZXN0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL3RpbWVyL3RpbWVyX3Rlc3QuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvdGVzdHMvdGltZXIvdGltZXJfdGVzdC5jCmRpZmYgLS1naXQgYS9saW51eC1rZXJuZWwvbGludXgtMi42LjI3LjQtbWlzZG4tYWJpcy5kaWZmIGIvbGludXgta2VybmVsL2xpbnV4LTIuNi4yNy40LW1pc2RuLWFiaXMuZGlmZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjkxZWRhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgta2VybmVsL2xpbnV4LTIuNi4yNy40LW1pc2RuLWFiaXMuZGlmZgpAQCAtMCwwICsxLDE0NCBAQAorZGlmZiAtTnJ1IC0tZXhjbHVkZS1mcm9tIC9zdW5iZWFtL2hvbWUvbGFmb3JnZS9zY3JpcHRzL2RvbnRkaWZmIGxpbnV4LTIuNi4yNy40LWNsZWFuL2RyaXZlcnMvaXNkbi9tSVNETi9sYXllcjIuYyBsaW51eC0yLjYuMjcuNC9kcml2ZXJzL2lzZG4vbUlTRE4vbGF5ZXIyLmMKKy0tLSBsaW51eC0yLjYuMjcuNC1jbGVhbi9kcml2ZXJzL2lzZG4vbUlTRE4vbGF5ZXIyLmMJMjAwOC0xMC0yNiAwMDowNTowNy4wMDAwMDAwMDAgKzAyMDAKKysrKyBsaW51eC0yLjYuMjcuNC9kcml2ZXJzL2lzZG4vbUlTRE4vbGF5ZXIyLmMJMjAwOC0xMi0yMyAxNjoxNjoyOS4wMDAwMDAwMDAgKzAxMDAKK0BAIC05NCw4ICs5NCwxMCBAQAorIAlzdHJ1Y3QgbGF5ZXIyICpsMiA9IGZpLT51c2VyZGF0YTsKKyAJdmFfbGlzdCB2YTsKKyAKKysjaWYgMAorIAlpZiAoISgqZGVidWcgJiBERUJVR19MMl9GU00pKQorIAkJcmV0dXJuOworKyNlbmRpZgorIAl2YV9zdGFydCh2YSwgZm10KTsKKyAJcHJpbnRrKEtFUk5fREVCVUcgImwyICh0ZWkgJWQpOiAiLCBsMi0+dGVpKTsKKyAJdnByaW50ayhmbXQsIHZhKTsKK0BAIC04ODIsNiArODg0LDggQEAKKyAJbDItPnZhID0gMDsKKyAJbDItPnZyID0gMDsKKyAJbDItPnNvdyA9IDA7CisrCWwyLT5zYXBpID0gc2tiLT5kYXRhWzBdID4+IDI7CisrCXNldF9jaGFubmVsX2FkZHJlc3MoJmwyLT5jaCwgbDItPnNhcGksIGwyLT50ZWkpOworIAljbGVhcl9leGNlcHRpb24obDIpOworIAlzZW5kX3VmcmFtZShsMiwgTlVMTCwgVUEgfCBnZXRfUG9sbEZsYWcobDIsIHNrYiksIFJTUCk7CisgCW1JU0ROX0ZzbUNoYW5nZVN0YXRlKGZpLCBTVF9MMl83KTsKK0BAIC04OTgsNiArOTAyLDcgQEAKKyAJc3RydWN0IGxheWVyMiAqbDIgPSBmaS0+dXNlcmRhdGE7CisgCXN0cnVjdCBza19idWZmICpza2IgPSBhcmc7CisgCisrCXByaW50ayhLRVJOX0RFQlVHICJsMl9zZW5kX1VBKClcbiIpOworIAlzZW5kX3VmcmFtZShsMiwgc2tiLCBVQSB8IGdldF9Qb2xsRmxhZyhsMiwgc2tiKSwgUlNQKTsKKyB9CisgCitAQCAtOTMxLDYgKzkzNiw4IEBACisgCWwyLT52YSA9IDA7CisgCWwyLT52ciA9IDA7CisgCWwyLT5zb3cgPSAwOworKwlsMi0+c2FwaSA9IHNrYi0+ZGF0YVswXSA+PiAyOworKwlzZXRfY2hhbm5lbF9hZGRyZXNzKCZsMi0+Y2gsIGwyLT5zYXBpLCBsMi0+dGVpKTsKKyAJbUlTRE5fRnNtQ2hhbmdlU3RhdGUoZmksIFNUX0wyXzcpOworIAlzdG9wX3QyMDAobDIsIDMpOworIAltSVNETl9Gc21SZXN0YXJ0VGltZXIoJmwyLT50MjAzLCBsMi0+VDIwMywgRVZfTDJfVDIwMywgTlVMTCwgMyk7CitAQCAtOTgyLDYgKzk4OSw4IEBACisgCX0gZWxzZSBpZiAobDItPnZzICE9IGwyLT52YSkgeworIAkJc2tiX3F1ZXVlX3B1cmdlKCZsMi0+aV9xdWV1ZSk7CisgCQlwciA9IERMX0VTVEFCTElTSF9JTkQ7CisrCQkvL2wyLT5zYXBpID0gc2tiLT5kYXRhWzBdID4+IDI7CisrCQkvL3NldF9jaGFubmVsX2FkZHJlc3MoJmwyLT5jaCwgbDItPnNhcGksIGwyLT50ZWkpOworIAl9CisgCXN0b3BfdDIwMChsMiwgNSk7CisgCWwyLT52ciA9IDA7CitAQCAtMTg0MSwxMSArMTg1MCwxNCBAQAorIAl1X2ludAlsOworIAlpbnQJYyA9IDA7CisgCisrCXByaW50ayhLRVJOX0RFQlVHICJwaF9kYXRhX2luZGljYXRpb24gMHgleCAweCV4IDB4JXhcbiIsIGRhdGFwWzBdLCBkYXRhcFsxXSwgZGF0YXBbMl0pOworKworIAlsID0gbDJhZGRyc2l6ZShsMik7CisgCWlmIChza2ItPmxlbiA8PSBsKSB7CisgCQltSVNETl9Gc21FdmVudCgmbDItPmwybSwgRVZfTDJfRlJBTUVfRVJST1IsICh2b2lkICopICdOJyk7CisgCQlyZXR1cm4gcmV0OworIAl9CisrI2lmIDAKKyAJaWYgKHRlc3RfYml0KEZMR19MQVBELCAmbDItPmZsYWcpKSB7IC8qIE1heWJlIG5vdCBuZWVkZWQgKi8KKyAJCXBzYXBpID0gKmRhdGFwKys7CisgCQlwdGVpID0gKmRhdGFwKys7CitAQCAtMTg3NSw2ICsxODg3LDcgQEAKKyAJCQlyZXR1cm4gMDsKKyAJCX0KKyAJfSBlbHNlCisrI2VuZGlmCisgCQlkYXRhcCArPSBsOworIAlpZiAoISgqZGF0YXAgJiAxKSkgewkvKiBJLUZyYW1lICovCisgCQljID0gaWZyYW1lX2Vycm9yKGwyLCBza2IpOworQEAgLTE4OTAsNiArMTkwMyw3IEBACisgCQkJcmV0ID0gbUlTRE5fRnNtRXZlbnQoJmwyLT5sMm0sIEVWX0wyX1VJLCBza2IpOworIAl9IGVsc2UgaWYgKElzU0FCTUUoZGF0YXAsIGwyKSkgeworIAkJYyA9IHVubnVtX2Vycm9yKGwyLCBza2IsIENNRCk7CisrCQlwcmludGsoS0VSTl9ERUJVRyAiSXNTQUJNRSgpIHJldHVybmVkIHRydWUsIHVubnVtX2Vycm9yPSVkXG4iLCBjKTsKKyAJCWlmICghYykKKyAJCQlyZXQgPSBtSVNETl9Gc21FdmVudCgmbDItPmwybSwgRVZfTDJfU0FCTUUsIHNrYik7CisgCX0gZWxzZSBpZiAoSXNVQShkYXRhcCkpIHsKK0BAIC0yMDg3LDcgKzIxMDEsNyBAQAorIAkJdGVzdF9hbmRfc2V0X2JpdChGTEdfTEFQRCwgJmwyLT5mbGFnKTsKKyAJCXRlc3RfYW5kX3NldF9iaXQoRkxHX0xBUERfTkVULCAmbDItPmZsYWcpOworIAkJdGVzdF9hbmRfc2V0X2JpdChGTEdfTU9EMTI4LCAmbDItPmZsYWcpOworLQkJbDItPnNhcGkgPSAwOworKwkJbDItPnNhcGkgPSA2MjsKKyAJCWwyLT5tYXhsZW4gPSBNQVhfREZSQU1FX0xFTjsKKyAJCWlmICh0ZXN0X2JpdChPUFRJT05fTDJfUE1YLCAmb3B0aW9ucykpCisgCQkJbDItPndpbmRvdyA9IDc7CitkaWZmIC1OcnUgLS1leGNsdWRlLWZyb20gL3N1bmJlYW0vaG9tZS9sYWZvcmdlL3NjcmlwdHMvZG9udGRpZmYgbGludXgtMi42LjI3LjQtY2xlYW4vZHJpdmVycy9pc2RuL21JU0ROL3RlaS5jIGxpbnV4LTIuNi4yNy40L2RyaXZlcnMvaXNkbi9tSVNETi90ZWkuYworLS0tIGxpbnV4LTIuNi4yNy40LWNsZWFuL2RyaXZlcnMvaXNkbi9tSVNETi90ZWkuYwkyMDA4LTEwLTI2IDAwOjA1OjA3LjAwMDAwMDAwMCArMDIwMAorKysrIGxpbnV4LTIuNi4yNy40L2RyaXZlcnMvaXNkbi9tSVNETi90ZWkuYwkyMDA4LTEyLTIzIDE2OjMyOjU5LjAwMDAwMDAwMCArMDEwMAorQEAgLTgzMCwxOCArODMwLDI5IEBACisgCWludAkJdGVpLCByaTsKKyAJc3RydWN0IGxheWVyMgkqbDI7CisgCisrCXByaW50ayhLRVJOX0RFQlVHICJuZXcgdGVpIHJlcXVlc3Q6IHRlaT0lZFxuIiwgZHBbM10gPj4gMSk7CisrCisgCXJpID0gZHBbMF0gPDwgODsKKyAJcmkgKz0gZHBbMV07CistCWlmICghbWdyLT51cCkKKy0JCWdvdG8gZGVuaWVkOworLQl0ZWkgPSBnZXRfZnJlZV90ZWkobWdyKTsKKy0JaWYgKHRlaSA8IDApIHsKKy0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOk5vIGZyZWUgdGVpXG4iLCBfX2Z1bmNfXyk7CisrCWlmICghbWdyLT51cCkgeworKwkJcHJpbnRrKEtFUk5fREVCVUcgIm1nci0+dXAgPT0gTlVMTFxuIik7CisgCQlnb3RvIGRlbmllZDsKKyAJfQorKwlpZiAoZHBbM10gIT0gMHhmZikgeworKwkJLyogVGhpcyBpcyBhIFRFSSByZXF1ZXN0IGFjY29yZGluZyB0byAzR1BQIFRTIDA4LjU2IDYuMS4xMS4yICovCisrCQl0ZWkgPSBkcFszXSA+PiAxOworKwl9IGVsc2UgeworKwkJdGVpID0gZ2V0X2ZyZWVfdGVpKG1ncik7CisrCQlpZiAodGVpIDwgMCkgeworKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOk5vIGZyZWUgdGVpXG4iLCBfX2Z1bmNfXyk7CisrCQkJZ290byBkZW5pZWQ7CisrCQl9CisrCX0KKyAJbDIgPSBjcmVhdGVfbmV3X3RlaShtZ3IsIHRlaSk7CistCWlmICghbDIpCisrCWlmICghbDIpIHsKKysJCXByaW50ayhLRVJOX0RFQlVHICJjcmVhdGVfbmV3X3RlaSA9PSBOVUxMXG4iKTsKKyAJCWdvdG8gZGVuaWVkOworKwl9CisgCWVsc2UKKyAJCW1JU0ROX0ZzbUV2ZW50KCZsMi0+dG0tPnRlaV9tLCBFVl9BU1NJR05fUkVRLCBkcCk7CisgCXJldHVybjsKK0BAIC0xMTU5LDEyICsxMTcwLDE0IEBACisgCQlyZXR1cm4gLUVOT1RDT05OOworIAlpZiAoc2tiLT5sZW4gIT0gMykKKyAJCXJldHVybiAtRU5PVENPTk47CisrI2lmIDAKKyAJaWYgKHNrYi0+ZGF0YVswXSAhPSAwKQorIAkJLyogb25seSBTQVBJIDAgY29tbWFuZCAqLworIAkJcmV0dXJuIC1FTk9UQ09OTjsKKysjZW5kaWYKKyAJaWYgKCEoc2tiLT5kYXRhWzFdICYgMSkpIC8qIGludmFsaWQgRUExICovCisgCQlyZXR1cm4gLUVJTlZBTDsKKy0JdGVpID0gc2tiLT5kYXRhWzFdID4+IDA7CisrCXRlaSA9IHNrYi0+ZGF0YVsxXSA+PiAxOworIAlpZiAodGVpID4gNjMpIC8qIG5vdCBhIGZpeGVkIHRlaSAqLworIAkJcmV0dXJuIC1FTk9UQ09OTjsKKyAJaWYgKChza2ItPmRhdGFbMl0gJiB+MHgxMCkgIT0gU0FCTUUpCmRpZmYgLS1naXQgYS9saW51eC1rZXJuZWwvbGludXgtMi42LjMwLWhmY211bHRpLW11bHRpYnRzLnBhdGNoIGIvbGludXgta2VybmVsL2xpbnV4LTIuNi4zMC1oZmNtdWx0aS1tdWx0aWJ0cy5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjk0ZDM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgta2VybmVsL2xpbnV4LTIuNi4zMC1oZmNtdWx0aS1tdWx0aWJ0cy5wYXRjaApAQCAtMCwwICsxLDQ4NiBAQAorVGhpcyBleHBlcmltZW50YWwgcGF0Y2ggc3BsaXRzIG9uZSBFMSBjYXJkIGludG8gdGhyZWUgdmlydHVhbCBjYXJkcywKKworVFMgMSwyLDMsNCw1IGlzIGNhcmQgMAorVFMgNiw3LDgsOSwxMCBpcyBjYXJkIDEKK1RTIDExLDEyLDEzLDE0IGlzIGNhcmQgMgorCitUaGlzIGFsbG93cyB5b3UgdG8gcnVuIG9uZSBMMiBURUkgaGFuZGxlciBvbiBlYWNoIG9mIHRoZSB2aXJ0dWFsIGNhcmRzLAord2hpY2ggaXMgcmVxdWlyZWQgaWYgeW91IHdhbnQgdG8gcnVuIG11bHRpcGxlIEJUUyBvbiBhIHNpbmdsZSBFMSBsaW5rLgorCitUaGFua3MgdG8gQW5kcmVhcyBFdmVyc2JlcmcgZm9yIHRoaXMgcGF0Y2guCisKK2RpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjX211bHRpLmggYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjX211bHRpLmgKK2luZGV4IDBjNzczODYuLjAyZGQ0YTEgMTAwNjQ0CistLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjX211bHRpLmgKKysrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNfbXVsdGkuaAorQEAgLTIwOSwxNCArMjA5LDE3IEBAIHN0cnVjdCBoZmNfbXVsdGkgeworIAl1X2xvbmcJCWxlZHN0YXRlOyAvKiBzYXZlIGxhc3Qgc3RhdGUgb2YgbGVkcyAqLworIAlpbnQJCW9wdGljYWxzdXBwb3J0OyAvKiBoYXMgdGhlIGUxIGJvYXJkICovCisgCQkJCQkvKiBhbiBvcHRpY2FsIEludGVyZmFjZSAqLworLQlpbnQJCWRzbG90OwkvKiBjaGFubmVsICMgb2YgZC1jaGFubmVsIChFMSkgZGVmYXVsdCAxNiAqLworKworKwl1X2ludAkJYm1hc2tbMzJdOyAvKiBiaXRtYXNrIG9mIGJjaGFubmVscyBmb3IgcG9ydCAqLworKwl1X2NoYXIJCWRudW1bMzJdOyAvKiBhcnJheSBvZiB1c2VkIGRjaGFubmVsIG51bWJlcnMgZm9yIHBvcnQgKi8KKysJdV9jaGFyCQljcmVhdGVkWzMyXTsgLyogd2hhdCBwb3J0IGlzIGNyZWF0ZWQgKi8KKysJdV9pbnQJCWFjdGl2aXR5WzMyXTsgCS8qIGlmIHRoZXJlIGlzIGFueSBhY3Rpb24gb24gdGhpcyAqLworKwkJCQkJLyogcG9ydCAod2lsbCBiZSBjbGVhcmVkIGFmdGVyICovCisrCQkJCQkvKiBzaG93aW5nIGxlZC1zdGF0ZXMpICovCisgCisgCXVfbG9uZwkJd2Rjb3VudDsgCS8qIGV2ZXJ5IDUwMCBtcyB3ZSBuZWVkIHRvICovCisgCQkJCQkvKiBzZW5kIHRoZSB3YXRjaGRvZyBhIHNpZ25hbCAqLworIAl1X2NoYXIJCXdkYnl0ZTsgLyogd2F0Y2hkb2cgdG9nZ2xlIGJ5dGUgKi8KKy0JdV9pbnQJCWFjdGl2aXR5WzhdOyAJLyogaWYgdGhlcmUgaXMgYW55IGFjdGlvbiBvbiB0aGlzICovCistCQkJCQkvKiBwb3J0ICh3aWxsIGJlIGNsZWFyZWQgYWZ0ZXIgKi8KKy0JCQkJCS8qIHNob3dpbmcgbGVkLXN0YXRlcykgKi8KKyAJaW50CQllMV9zdGF0ZTsgLyoga2VlcCB0cmFjayBvZiBsYXN0IHN0YXRlICovCisgCWludAkJZTFfZ2V0Y2xvY2s7IC8qIGlmIHN5bmMgaXMgcmV0cmlldmVkIGZyb20gaW50ZXJmYWNlICovCisgCWludAkJc3luY3Jvbml6ZWQ7IC8qIGtlZXAgdHJhY2sgb2YgZXhpc3Rpbmcgc3luYyBpbnRlcmZhY2UgKi8KK0BAIC0yMzMsNyArMjM2LDYgQEAgc3RydWN0IGhmY19tdWx0aSB7CisgCSAqIHRoZSBiY2gtPmNoYW5uZWwgaXMgZXF1dmFsZW50IHRvIHRoZSBoZmMtY2hhbm5lbAorIAkgKi8KKyAJc3RydWN0IGhmY19jaGFuCWNoYW5bMzJdOworLQl1X2NoYXIJCWNyZWF0ZWRbOF07IC8qIHdoYXQgcG9ydCBpcyBjcmVhdGVkICovCisgCXNpZ25lZCBjaGFyCXNsb3Rfb3duZXJbMjU2XTsgLyogb3duZXIgY2hhbm5lbCBvZiBzbG90ICovCisgfTsKKyAKK2RpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjbXVsdGkuYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNtdWx0aS5jCitpbmRleCBlMWRhYjMwLi40ZmUyZDI3IDEwMDY0NAorLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY211bHRpLmMKKysrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNtdWx0aS5jCitAQCAtMTYxOSw4ICsxNjE5LDggQEAgaGZjbXVsdGlfbGVkcyhzdHJ1Y3QgaGZjX211bHRpICpoYykKKyAJCSAqIGxlZnQgcmVkOiAgICAgICBmcmFtZSBzeW5jLCBidXQgbm8gTDEKKyAJCSAqIHJpZ2h0IGdyZWVuOiAgICBMMiBhY3RpdmUKKyAJCSAqLworLQkJaWYgKGhjLT5jaGFuW2hjLT5kc2xvdF0uc3luYyAhPSAyKSB7IC8qIG5vIGZyYW1lIHN5bmMgKi8KKy0JCQlpZiAoaGMtPmNoYW5baGMtPmRzbG90XS5kY2gtPmRldi5ELnByb3RvY29sCisrCQlpZiAoaGMtPmNoYW5baGMtPmRudW1bMF1dLnN5bmMgIT0gMikgeyAvKiBubyBmcmFtZSBzeW5jICovCisrCQkJaWYgKGhjLT5jaGFuW2hjLT5kbnVtWzBdXS5kY2gtPmRldi5ELnByb3RvY29sCisgCQkJCSE9IElTRE5fUF9OVF9FMSkgeworIAkJCQlsZWRbMF0gPSAxOworIAkJCQlsZWRbMV0gPSAxOworQEAgLTI0MjgsNTUgKzI0MjgsNTYgQEAgaGFuZGxlX3RpbWVyX2lycShzdHJ1Y3QgaGZjX211bHRpICpoYykKKyAJCQl9CisgCQl9CisgCWlmIChoYy0+Y3R5cGUgPT0gSEZDX1RZUEVfRTEgJiYgaGMtPmNyZWF0ZWRbMF0pIHsKKy0JCWRjaCA9IGhjLT5jaGFuW2hjLT5kc2xvdF0uZGNoOworLQkJaWYgKHRlc3RfYml0KEhGQ19DRkdfUkVQT1JUX0xPUywgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKSkgeworKyN3YXJuaW5nIHRvZG86IHB1dCBpbnRlcmZhY2UgcGFyYW1ldGVycyB0byBoYworKwkJZGNoID0gaGMtPmNoYW5baGMtPmRudW1bMF1dLmRjaDsKKysJCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX1JFUE9SVF9MT1MsICZoYy0+Y2hhbltoYy0+ZG51bVswXV0uY2ZnKSkgeworIAkJCS8qIExPUyAqLworIAkJCXRlbXAgPSBIRkNfaW5iX25vZGVidWcoaGMsIFJfU1lOQ19TVEEpICYgVl9TSUdfTE9TOworLQkJCWlmICghdGVtcCAmJiBoYy0+Y2hhbltoYy0+ZHNsb3RdLmxvcykKKysJCQlpZiAoIXRlbXAgJiYgaGMtPmNoYW5baGMtPmRudW1bMF1dLmxvcykKKyAJCQkJc2lnbmFsX3N0YXRlX3VwKGRjaCwgTDFfU0lHTkFMX0xPU19PTiwKKyAJCQkJICAgICJMT1MgZGV0ZWN0ZWQiKTsKKy0JCQlpZiAodGVtcCAmJiAhaGMtPmNoYW5baGMtPmRzbG90XS5sb3MpCisrCQkJaWYgKHRlbXAgJiYgIWhjLT5jaGFuW2hjLT5kbnVtWzBdXS5sb3MpCisgCQkJCXNpZ25hbF9zdGF0ZV91cChkY2gsIEwxX1NJR05BTF9MT1NfT0ZGLAorIAkJCQkgICAgIkxPUyBnb25lIik7CistCQkJaGMtPmNoYW5baGMtPmRzbG90XS5sb3MgPSB0ZW1wOworKwkJCWhjLT5jaGFuW2hjLT5kbnVtWzBdXS5sb3MgPSB0ZW1wOworIAkJfQorLQkJaWYgKHRlc3RfYml0KEhGQ19DRkdfUkVQT1JUX0FJUywgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKSkgeworKwkJaWYgKHRlc3RfYml0KEhGQ19DRkdfUkVQT1JUX0FJUywgJmhjLT5jaGFuW2hjLT5kbnVtWzBdXS5jZmcpKSB7CisgCQkJLyogQUlTICovCisgCQkJdGVtcCA9IEhGQ19pbmJfbm9kZWJ1ZyhoYywgUl9TWU5DX1NUQSkgJiBWX0FJUzsKKy0JCQlpZiAoIXRlbXAgJiYgaGMtPmNoYW5baGMtPmRzbG90XS5haXMpCisrCQkJaWYgKCF0ZW1wICYmIGhjLT5jaGFuW2hjLT5kbnVtWzBdXS5haXMpCisgCQkJCXNpZ25hbF9zdGF0ZV91cChkY2gsIEwxX1NJR05BTF9BSVNfT04sCisgCQkJCSAgICAiQUlTIGRldGVjdGVkIik7CistCQkJaWYgKHRlbXAgJiYgIWhjLT5jaGFuW2hjLT5kc2xvdF0uYWlzKQorKwkJCWlmICh0ZW1wICYmICFoYy0+Y2hhbltoYy0+ZG51bVswXV0uYWlzKQorIAkJCQlzaWduYWxfc3RhdGVfdXAoZGNoLCBMMV9TSUdOQUxfQUlTX09GRiwKKyAJCQkJICAgICJBSVMgZ29uZSIpOworLQkJCWhjLT5jaGFuW2hjLT5kc2xvdF0uYWlzID0gdGVtcDsKKysJCQloYy0+Y2hhbltoYy0+ZG51bVswXV0uYWlzID0gdGVtcDsKKyAJCX0KKy0JCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX1JFUE9SVF9TTElQLCAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpKSB7CisrCQlpZiAodGVzdF9iaXQoSEZDX0NGR19SRVBPUlRfU0xJUCwgJmhjLT5jaGFuW2hjLT5kbnVtWzBdXS5jZmcpKSB7CisgCQkJLyogU0xJUCAqLworIAkJCXRlbXAgPSBIRkNfaW5iX25vZGVidWcoaGMsIFJfU0xJUCkgJiBWX0ZPU0xJUF9SWDsKKy0JCQlpZiAoIXRlbXAgJiYgaGMtPmNoYW5baGMtPmRzbG90XS5zbGlwX3J4KQorKwkJCWlmICghdGVtcCAmJiBoYy0+Y2hhbltoYy0+ZG51bVswXV0uc2xpcF9yeCkKKyAJCQkJc2lnbmFsX3N0YXRlX3VwKGRjaCwgTDFfU0lHTkFMX1NMSVBfUlgsCisgCQkJCSAgICAiIGJpdCBTTElQIGRldGVjdGVkIFJYIik7CistCQkJaGMtPmNoYW5baGMtPmRzbG90XS5zbGlwX3J4ID0gdGVtcDsKKysJCQloYy0+Y2hhbltoYy0+ZG51bVswXV0uc2xpcF9yeCA9IHRlbXA7CisgCQkJdGVtcCA9IEhGQ19pbmJfbm9kZWJ1ZyhoYywgUl9TTElQKSAmIFZfRk9TTElQX1RYOworLQkJCWlmICghdGVtcCAmJiBoYy0+Y2hhbltoYy0+ZHNsb3RdLnNsaXBfdHgpCisrCQkJaWYgKCF0ZW1wICYmIGhjLT5jaGFuW2hjLT5kbnVtWzBdXS5zbGlwX3R4KQorIAkJCQlzaWduYWxfc3RhdGVfdXAoZGNoLCBMMV9TSUdOQUxfU0xJUF9UWCwKKyAJCQkJICAgICIgYml0IFNMSVAgZGV0ZWN0ZWQgVFgiKTsKKy0JCQloYy0+Y2hhbltoYy0+ZHNsb3RdLnNsaXBfdHggPSB0ZW1wOworKwkJCWhjLT5jaGFuW2hjLT5kbnVtWzBdXS5zbGlwX3R4ID0gdGVtcDsKKyAJCX0KKy0JCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX1JFUE9SVF9SREksICZoYy0+Y2hhbltoYy0+ZHNsb3RdLmNmZykpIHsKKysJCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX1JFUE9SVF9SREksICZoYy0+Y2hhbltoYy0+ZG51bVswXV0uY2ZnKSkgeworIAkJCS8qIFJESSAqLworIAkJCXRlbXAgPSBIRkNfaW5iX25vZGVidWcoaGMsIFJfUlhfU0wwXzApICYgVl9BOworLQkJCWlmICghdGVtcCAmJiBoYy0+Y2hhbltoYy0+ZHNsb3RdLnJkaSkKKysJCQlpZiAoIXRlbXAgJiYgaGMtPmNoYW5baGMtPmRudW1bMF1dLnJkaSkKKyAJCQkJc2lnbmFsX3N0YXRlX3VwKGRjaCwgTDFfU0lHTkFMX1JESV9PTiwKKyAJCQkJICAgICJSREkgZGV0ZWN0ZWQiKTsKKy0JCQlpZiAodGVtcCAmJiAhaGMtPmNoYW5baGMtPmRzbG90XS5yZGkpCisrCQkJaWYgKHRlbXAgJiYgIWhjLT5jaGFuW2hjLT5kbnVtWzBdXS5yZGkpCisgCQkJCXNpZ25hbF9zdGF0ZV91cChkY2gsIEwxX1NJR05BTF9SRElfT0ZGLAorIAkJCQkgICAgIlJESSBnb25lIik7CistCQkJaGMtPmNoYW5baGMtPmRzbG90XS5yZGkgPSB0ZW1wOworKwkJCWhjLT5jaGFuW2hjLT5kbnVtWzBdXS5yZGkgPSB0ZW1wOworIAkJfQorIAkJdGVtcCA9IEhGQ19pbmJfbm9kZWJ1ZyhoYywgUl9KQVRUX0RJUik7CistCQlzd2l0Y2ggKGhjLT5jaGFuW2hjLT5kc2xvdF0uc3luYykgeworKwkJc3dpdGNoIChoYy0+Y2hhbltoYy0+ZG51bVswXV0uc3luYykgeworIAkJY2FzZSAwOgorIAkJCWlmICgodGVtcCAmIDB4NjApID09IDB4NjApIHsKKyAJCQkJaWYgKGRlYnVnICYgREVCVUdfSEZDTVVMVElfU1lOQykKK0BAIC0yNDg1LDEwICsyNDg2LDEwIEBAIGhhbmRsZV90aW1lcl9pcnEoc3RydWN0IGhmY19tdWx0aSAqaGMpCisgCQkJCQkgICAgImluIGNsb2NrIHN5bmNcbiIsCisgCQkJCQkgICAgX19mdW5jX18sIGhjLT5pZCk7CisgCQkJCUhGQ19vdXRiKGhjLCBSX1JYX09GRiwKKy0JCQkJICAgIGhjLT5jaGFuW2hjLT5kc2xvdF0uaml0dGVyIHwgVl9SWF9JTklUKTsKKysJCQkJICAgIGhjLT5jaGFuW2hjLT5kbnVtWzBdXS5qaXR0ZXIgfCBWX1JYX0lOSVQpOworIAkJCQlIRkNfb3V0YihoYywgUl9UWF9PRkYsCistCQkJCSAgICBoYy0+Y2hhbltoYy0+ZHNsb3RdLmppdHRlciB8IFZfUlhfSU5JVCk7CistCQkJCWhjLT5jaGFuW2hjLT5kc2xvdF0uc3luYyA9IDE7CisrCQkJCSAgICBoYy0+Y2hhbltoYy0+ZG51bVswXV0uaml0dGVyIHwgVl9SWF9JTklUKTsKKysJCQkJaGMtPmNoYW5baGMtPmRudW1bMF1dLnN5bmMgPSAxOworIAkJCQlnb3RvIGNoZWNrX2ZyYW1lc3luYzsKKyAJCQl9CisgCQkJYnJlYWs7CitAQCAtMjQ5OSw3ICsyNTAwLDcgQEAgaGFuZGxlX3RpbWVyX2lycShzdHJ1Y3QgaGZjX211bHRpICpoYykKKyAJCQkJCSAgICAiJXM6IChpZD0lZCkgRTEgIgorIAkJCQkJICAgICJsb3N0IGNsb2NrIHN5bmNcbiIsCisgCQkJCQkgICAgX19mdW5jX18sIGhjLT5pZCk7CistCQkJCWhjLT5jaGFuW2hjLT5kc2xvdF0uc3luYyA9IDA7CisrCQkJCWhjLT5jaGFuW2hjLT5kbnVtWzBdXS5zeW5jID0gMDsKKyAJCQkJYnJlYWs7CisgCQkJfQorIGNoZWNrX2ZyYW1lc3luYzoKK0BAIC0yNTEwLDcgKzI1MTEsNyBAQCBjaGVja19mcmFtZXN5bmM6CisgCQkJCQkgICAgIiVzOiAoaWQ9JWQpIEUxICIKKyAJCQkJCSAgICAibm93IGluIGZyYW1lIHN5bmNcbiIsCisgCQkJCQkgICAgX19mdW5jX18sIGhjLT5pZCk7CistCQkJCWhjLT5jaGFuW2hjLT5kc2xvdF0uc3luYyA9IDI7CisrCQkJCWhjLT5jaGFuW2hjLT5kbnVtWzBdXS5zeW5jID0gMjsKKyAJCQl9CisgCQkJYnJlYWs7CisgCQljYXNlIDI6CitAQCAtMjUyMCw3ICsyNTIxLDcgQEAgY2hlY2tfZnJhbWVzeW5jOgorIAkJCQkJICAgICIlczogKGlkPSVkKSBFMSBsb3N0ICIKKyAJCQkJCSAgICAiY2xvY2sgJiBmcmFtZSBzeW5jXG4iLAorIAkJCQkJICAgIF9fZnVuY19fLCBoYy0+aWQpOworLQkJCQloYy0+Y2hhbltoYy0+ZHNsb3RdLnN5bmMgPSAwOworKwkJCQloYy0+Y2hhbltoYy0+ZG51bVswXV0uc3luYyA9IDA7CisgCQkJCWJyZWFrOworIAkJCX0KKyAJCQl0ZW1wID0gSEZDX2luYl9ub2RlYnVnKGhjLCBSX1NZTkNfU1RBKTsKK0BAIC0yNTMwLDcgKzI1MzEsNyBAQCBjaGVja19mcmFtZXN5bmM6CisgCQkJCQkgICAgIiVzOiAoaWQ9JWQpIEUxICIKKyAJCQkJCSAgICAibG9zdCBmcmFtZSBzeW5jXG4iLAorIAkJCQkJICAgIF9fZnVuY19fLCBoYy0+aWQpOworLQkJCQloYy0+Y2hhbltoYy0+ZHNsb3RdLnN5bmMgPSAxOworKwkJCQloYy0+Y2hhbltoYy0+ZG51bVswXV0uc3luYyA9IDE7CisgCQkJfQorIAkJCWJyZWFrOworIAkJfQorQEAgLTI3NDYsNyArMjc0Nyw4IEBAIGhmY211bHRpX2ludGVycnVwdChpbnQgaW50bm8sIHZvaWQgKmRldl9pZCkKKyAJCWlmIChyX2lycV9taXNjICYgVl9TVEFfSVJRKSB7CisgCQkJaWYgKGhjLT5jdHlwZSA9PSBIRkNfVFlQRV9FMSkgeworIAkJCQkvKiBzdGF0ZSBtYWNoaW5lICovCistCQkJCWRjaCA9IGhjLT5jaGFuW2hjLT5kc2xvdF0uZGNoOworKyN3YXJuaW5nIHRvZG8KKysJCQkJZGNoID0gaGMtPmNoYW5baGMtPmRudW1bMF1dLmRjaDsKKyAJCQkJZTFfc3luY3N0YSA9IEhGQ19pbmJfbm9kZWJ1ZyhoYywgUl9TWU5DX1NUQSk7CisgCQkJCWlmICh0ZXN0X2JpdChIRkNfQ0hJUF9QTFhTRCwgJmhjLT5jaGlwKQorIAkJCQkgJiYgaGMtPmUxX2dldGNsb2NrKSB7CitAQCAtMjc2OCw3ICsyNzcwLDE1IEBAIGhmY211bHRpX2ludGVycnVwdChpbnQgaW50bm8sIHZvaWQgKmRldl9pZCkKKyAJCQkJfQorIAkJCQlkY2gtPnN0YXRlID0gSEZDX2luYl9ub2RlYnVnKGhjLCBSX0UxX1JEX1NUQSkKKyAJCQkJCSYgMHg3OworKyN3YXJuaW5nIHRvZG8gaGFjayEhISBicm9hZGNhc3Qgc3RhdGUgY2hhbmdlISEhCisrCQkJCWRjaCA9IGhjLT5jaGFuW2hjLT5kbnVtWzBdXS5kY2g7CisgCQkJCXNjaGVkdWxlX2V2ZW50KGRjaCwgRkxHX1BIQ0hBTkdFKTsKKysJCQkJZGNoID0gaGMtPmNoYW5baGMtPmRudW1bMV1dLmRjaDsKKysJCQkJZGNoLT5zdGF0ZSA9IEhGQ19pbmJfbm9kZWJ1ZyhoYywgUl9FMV9SRF9TVEEpCisrCQkJCQkmIDB4NzsKKysJCQkJc2NoZWR1bGVfZXZlbnQoZGNoLCBGTEdfUEhDSEFOR0UpOworKworKworIAkJCQlpZiAoZGVidWcgJiBERUJVR19IRkNNVUxUSV9TVEFURSkKKyAJCQkJCXByaW50ayhLRVJOX0RFQlVHCisgCQkJCQkgICAgIiVzOiBFMSAoaWQ9JWQpIG5ld3N0YXRlICV4XG4iLAorQEAgLTM4NTEsMzEgKzM4NjEsMzUgQEAgaGZjbXVsdGlfaW5pdG1vZGUoc3RydWN0IGRjaGFubmVsICpkY2gpCisgCWlmIChkZWJ1ZyAmIERFQlVHX0hGQ01VTFRJX0lOSVQpCisgCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGVudGVyZWRcbiIsIF9fZnVuY19fKTsKKyAKKysJaSA9IGRjaC0+c2xvdDsKKysJcHQgPSBoYy0+Y2hhbltpXS5wb3J0OworIAlpZiAoaGMtPmN0eXBlID09IEhGQ19UWVBFX0UxKSB7CistCQloYy0+Y2hhbltoYy0+ZHNsb3RdLnNsb3RfdHggPSAtMTsKKy0JCWhjLT5jaGFuW2hjLT5kc2xvdF0uc2xvdF9yeCA9IC0xOworLQkJaGMtPmNoYW5baGMtPmRzbG90XS5jb25mID0gLTE7CistCQlpZiAoaGMtPmRzbG90KSB7CistCQkJbW9kZV9oZmNtdWx0aShoYywgaGMtPmRzbG90LCBkY2gtPmRldi5ELnByb3RvY29sLAorKwkJLyogRTEgKi8KKysjd2FybmluZyB0b2RvOiBkb24nJ3QgZG8gaXQgaWYgZG51bSA9PSAwCisrCQloYy0+Y2hhbltoYy0+ZG51bVtwdF1dLnNsb3RfdHggPSAtMTsKKysJCWhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uc2xvdF9yeCA9IC0xOworKwkJaGMtPmNoYW5baGMtPmRudW1bcHRdXS5jb25mID0gLTE7CisrCQlpZiAoaGMtPmRudW1bcHRdKSB7CisrCQkJbW9kZV9oZmNtdWx0aShoYywgZGNoLT5zbG90LCBkY2gtPmRldi5ELnByb3RvY29sLAorIAkJCQktMSwgMCwgLTEsIDApOworIAkJCWRjaC0+dGltZXIuZnVuY3Rpb24gPSAodm9pZCAqKSBoZmNtdWx0aV9kYnVzeV90aW1lcjsKKyAJCQlkY2gtPnRpbWVyLmRhdGEgPSAobG9uZykgZGNoOworIAkJCWluaXRfdGltZXIoJmRjaC0+dGltZXIpOworIAkJfQorIAkJZm9yIChpID0gMTsgaSA8PSAzMTsgaSsrKSB7CistCQkJaWYgKGkgPT0gaGMtPmRzbG90KQorKwkJCWlmICghKCgxIDw8IGkpICYgaGMtPmJtYXNrW3B0XSkpIC8qIHNraXAgdW51c2VkIGNoYW5uZWwgKi8KKyAJCQkJY29udGludWU7CisgCQkJaGMtPmNoYW5baV0uc2xvdF90eCA9IC0xOworIAkJCWhjLT5jaGFuW2ldLnNsb3RfcnggPSAtMTsKKyAJCQloYy0+Y2hhbltpXS5jb25mID0gLTE7CisgCQkJbW9kZV9oZmNtdWx0aShoYywgaSwgSVNETl9QX05PTkUsIC0xLCAwLCAtMSwgMCk7CisgCQl9CistCQkvKiBFMSAqLworLQkJaWYgKHRlc3RfYml0KEhGQ19DRkdfUkVQT1JUX0xPUywgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKSkgeworKyN3YXJuaW5nIHRvZG8gKGdsb2JhbCkKKysJCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX1JFUE9SVF9MT1MsICZoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNmZykpIHsKKyAJCQlIRkNfb3V0YihoYywgUl9MT1MwLCAyNTUpOyAvKiAyIG1zICovCisgCQkJSEZDX291dGIoaGMsIFJfTE9TMSwgMjU1KTsgLyogNTEyIG1zICovCisgCQl9CistCQlpZiAodGVzdF9iaXQoSEZDX0NGR19PUFRJQ0FMLCAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpKSB7CisrCQlpZiAodGVzdF9iaXQoSEZDX0NGR19PUFRJQ0FMLCAmaGMtPmNoYW5baGMtPmRudW1bcHRdXS5jZmcpKSB7CisgCQkJSEZDX291dGIoaGMsIFJfUlgwLCAwKTsKKyAJCQloYy0+aHcucl90eDAgPSAwIHwgVl9PVVRfRU47CisgCQl9IGVsc2UgeworQEAgLTM4ODgsMTIgKzM5MDIsMTIgQEAgaGZjbXVsdGlfaW5pdG1vZGUoc3RydWN0IGRjaGFubmVsICpkY2gpCisgCQlIRkNfb3V0YihoYywgUl9UWF9GUjAsIDB4MDApOworIAkJSEZDX291dGIoaGMsIFJfVFhfRlIxLCAweGY4KTsKKyAKKy0JCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX0NSQzQsICZoYy0+Y2hhbltoYy0+ZHNsb3RdLmNmZykpCisrCQlpZiAodGVzdF9iaXQoSEZDX0NGR19DUkM0LCAmaGMtPmNoYW5baGMtPmRudW1bcHRdXS5jZmcpKQorIAkJCUhGQ19vdXRiKGhjLCBSX1RYX0ZSMiwgVl9UWF9NRiB8IFZfVFhfRSB8IFZfTkVHX0UpOworIAorIAkJSEZDX291dGIoaGMsIFJfUlhfRlIwLCBWX0FVVE9fUkVTWU5DIHwgVl9BVVRPX1JFQ08gfCAwKTsKKyAKKy0JCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX0NSQzQsICZoYy0+Y2hhbltoYy0+ZHNsb3RdLmNmZykpCisrCQlpZiAodGVzdF9iaXQoSEZDX0NGR19DUkM0LCAmaGMtPmNoYW5baGMtPmRudW1bcHRdXS5jZmcpKQorIAkJCUhGQ19vdXRiKGhjLCBSX1JYX0ZSMSwgVl9SWF9NRiB8IFZfUlhfTUZfU1lOQyk7CisgCisgCQlpZiAoZGNoLT5kZXYuRC5wcm90b2NvbCA9PSBJU0ROX1BfTlRfRTEpIHsKK0BAIC0zOTU3LDcgKzM5NzEsNyBAQCBoZmNtdWx0aV9pbml0bW9kZShzdHJ1Y3QgZGNoYW5uZWwgKmRjaCkKKyAJCQlwbHhzZF9jaGVja3N5bmMoaGMsIDApOworIAkJfQorIAl9IGVsc2UgeworLQkJaSA9IGRjaC0+c2xvdDsKKysJCS8qIFNUICovCisgCQloYy0+Y2hhbltpXS5zbG90X3R4ID0gLTE7CisgCQloYy0+Y2hhbltpXS5zbG90X3J4ID0gLTE7CisgCQloYy0+Y2hhbltpXS5jb25mID0gLTE7CitAQCAtMzk3Myw4ICszOTg3LDYgQEAgaGZjbXVsdGlfaW5pdG1vZGUoc3RydWN0IGRjaGFubmVsICpkY2gpCisgCQloYy0+Y2hhbltpIC0gMV0uc2xvdF9yeCA9IC0xOworIAkJaGMtPmNoYW5baSAtIDFdLmNvbmYgPSAtMTsKKyAJCW1vZGVfaGZjbXVsdGkoaGMsIGkgLSAxLCBJU0ROX1BfTk9ORSwgLTEsIDAsIC0xLCAwKTsKKy0JCS8qIFNUICovCistCQlwdCA9IGhjLT5jaGFuW2ldLnBvcnQ7CisgCQkvKiBzZWxlY3QgaW50ZXJmYWNlICovCisgCQlIRkNfb3V0YihoYywgUl9TVF9TRUwsIHB0KTsKKyAJCS8qIHVuZG9jdW1lbnRlZDogZGVsYXkgYWZ0ZXIgUl9TVF9TRUwgKi8KK0BAIC00NTU3LDYgKzQ1NjksOCBAQCByZWxlYXNlX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBkY2hhbm5lbCAqZGNoKQorIAkJfQorIAkJLyogZnJlZSBjaGFubmVscyAqLworIAkJZm9yIChpID0gMDsgaSA8PSAzMTsgaSsrKSB7CisrCQkJaWYgKCEoKDEgPDwgaSkgJiBoYy0+Ym1hc2tbcHRdKSkgLyogc2tpcCB1bnVzZWQgY2hhbm5lbCAqLworKwkJCQljb250aW51ZTsKKyAJCQlpZiAoaGMtPmNoYW5baV0uYmNoKSB7CisgCQkJCWlmIChkZWJ1ZyAmIERFQlVHX0hGQ01VTFRJX0lOSVQpCisgCQkJCQlwcmludGsoS0VSTl9ERUJVRworQEAgLTQ2ODAsMTIgKzQ2OTQsMTMgQEAgcmVsZWFzZV9jYXJkKHN0cnVjdCBoZmNfbXVsdGkgKmhjKQorIH0KKyAKKyBzdGF0aWMgaW50CistaW5pdF9lMV9wb3J0KHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBzdHJ1Y3QgaG1fbWFwICptKQorK2luaXRfZTFfcG9ydChzdHJ1Y3QgaGZjX211bHRpICpoYywgc3RydWN0IGhtX21hcCAqbSwgaW50IHB0KQorIHsKKyAJc3RydWN0IGRjaGFubmVsCSpkY2g7CisgCXN0cnVjdCBiY2hhbm5lbAkqYmNoOworIAlpbnQJCWNoLCByZXQgPSAwOworIAljaGFyCQluYW1lW01JU0ROX01BWF9JRExFTl07CisrCWludAkJYmNvdW50ID0gMDsKKyAKKyAJZGNoID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRjaGFubmVsKSwgR0ZQX0tFUk5FTCk7CisgCWlmICghZGNoKQorQEAgLTQ2OTgsMTMgKzQ3MTMsMTIgQEAgaW5pdF9lMV9wb3J0KHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBzdHJ1Y3QgaG1fbWFwICptKQorIAkgICAgKDEgPDwgKElTRE5fUF9CX0hETEMgJiBJU0ROX1BfQl9NQVNLKSk7CisgCWRjaC0+ZGV2LkQuc2VuZCA9IGhhbmRsZV9kbXNnOworIAlkY2gtPmRldi5ELmN0cmwgPSBoZmNtX2RjdHJsOworLQlkY2gtPmRldi5ucmJjaGFuID0gKGhjLT5kc2xvdCkgPyAzMCA6IDMxOworLQlkY2gtPnNsb3QgPSBoYy0+ZHNsb3Q7CistCWhjLT5jaGFuW2hjLT5kc2xvdF0uZGNoID0gZGNoOworLQloYy0+Y2hhbltoYy0+ZHNsb3RdLnBvcnQgPSAwOworLQloYy0+Y2hhbltoYy0+ZHNsb3RdLm50X3RpbWVyID0gLTE7CisrCWRjaC0+c2xvdCA9IGhjLT5kbnVtW3B0XTsKKysJaGMtPmNoYW5baGMtPmRudW1bcHRdXS5kY2ggPSBkY2g7CisrCWhjLT5jaGFuW2hjLT5kbnVtW3B0XV0ucG9ydCA9IHB0OworKwloYy0+Y2hhbltoYy0+ZG51bVtwdF1dLm50X3RpbWVyID0gLTE7CisgCWZvciAoY2ggPSAxOyBjaCA8PSAzMTsgY2grKykgeworLQkJaWYgKGNoID09IGhjLT5kc2xvdCkgLyogc2tpcCBkY2hhbm5lbCAqLworKwkJaWYgKCEoKDEgPDwgY2gpICYgaGMtPmJtYXNrW3B0XSkpIC8qIHNraXAgdW51c2VkIGNoYW5uZWwgKi8KKyAJCQljb250aW51ZTsKKyAJCWJjaCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBiY2hhbm5lbCksIEdGUF9LRVJORUwpOworIAkJaWYgKCFiY2gpIHsKK0BAIC00NzMzLDcgKzQ3NDcsMTAgQEAgaW5pdF9lMV9wb3J0KHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBzdHJ1Y3QgaG1fbWFwICptKQorIAkJaGMtPmNoYW5bY2hdLmJjaCA9IGJjaDsKKyAJCWhjLT5jaGFuW2NoXS5wb3J0ID0gMDsKKyAJCXNldF9jaGFubmVsbWFwKGJjaC0+bnIsIGRjaC0+ZGV2LmNoYW5uZWxtYXApOworKwkJYmNvdW50Kys7CisgCX0KKysJZGNoLT5kZXYubnJiY2hhbiA9IGJjb3VudDsKKysjd2FybmluZyB0b2RvOiBtdXN0IGJlIHNldCBnbG9iYWxseSwgYW5kIG11c3QgYmUgYSBzZXBlcmF0ZSBmdW5jdGlvbgorIAkvKiBzZXQgb3B0aWNhbCBsaW5lIHR5cGUgKi8KKyAJaWYgKHBvcnRbUG9ydF9jbnRdICYgMHgwMDEpIHsKKyAJCWlmICghbS0+b3B0aWNhbHN1cHBvcnQpICB7CitAQCAtNDc0OSw3ICs0NzY2LDcgQEAgaW5pdF9lMV9wb3J0KHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBzdHJ1Y3QgaG1fbWFwICptKQorIAkJCQkgICAgX19mdW5jX18sCisgCQkJCSAgICBIRkNfY250ICsgMSwgMSk7CisgCQkJdGVzdF9hbmRfc2V0X2JpdChIRkNfQ0ZHX09QVElDQUwsCistCQkJICAgICZoYy0+Y2hhbltoYy0+ZHNsb3RdLmNmZyk7CisrCQkJICAgICZoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNmZyk7CisgCQl9CisgCX0KKyAJLyogc2V0IExPUyByZXBvcnQgKi8KK0BAIC00NzU5LDcgKzQ3NzYsNyBAQCBpbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0pCisgCQkJICAgICJMT1MgcmVwb3J0OiBjYXJkKCVkKSBwb3J0KCVkKVxuIiwKKyAJCQkgICAgX19mdW5jX18sIEhGQ19jbnQgKyAxLCAxKTsKKyAJCXRlc3RfYW5kX3NldF9iaXQoSEZDX0NGR19SRVBPUlRfTE9TLAorLQkJICAgICZoYy0+Y2hhbltoYy0+ZHNsb3RdLmNmZyk7CisrCQkgICAgJmhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uY2ZnKTsKKyAJfQorIAkvKiBzZXQgQUlTIHJlcG9ydCAqLworIAlpZiAocG9ydFtQb3J0X2NudF0gJiAweDAwOCkgeworQEAgLTQ3NjgsNyArNDc4NSw3IEBAIGluaXRfZTFfcG9ydChzdHJ1Y3QgaGZjX211bHRpICpoYywgc3RydWN0IGhtX21hcCAqbSkKKyAJCQkgICAgIkFJUyByZXBvcnQ6IGNhcmQoJWQpIHBvcnQoJWQpXG4iLAorIAkJCSAgICBfX2Z1bmNfXywgSEZDX2NudCArIDEsIDEpOworIAkJdGVzdF9hbmRfc2V0X2JpdChIRkNfQ0ZHX1JFUE9SVF9BSVMsCistCQkgICAgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKTsKKysJCSAgICAmaGMtPmNoYW5baGMtPmRudW1bcHRdXS5jZmcpOworIAl9CisgCS8qIHNldCBTTElQIHJlcG9ydCAqLworIAlpZiAocG9ydFtQb3J0X2NudF0gJiAweDAxMCkgeworQEAgLTQ3NzgsNyArNDc5NSw3IEBAIGluaXRfZTFfcG9ydChzdHJ1Y3QgaGZjX211bHRpICpoYywgc3RydWN0IGhtX21hcCAqbSkKKyAJCQkgICAgImNhcmQoJWQpIHBvcnQoJWQpXG4iLAorIAkJCSAgICBfX2Z1bmNfXywgSEZDX2NudCArIDEsIDEpOworIAkJdGVzdF9hbmRfc2V0X2JpdChIRkNfQ0ZHX1JFUE9SVF9TTElQLAorLQkJICAgICZoYy0+Y2hhbltoYy0+ZHNsb3RdLmNmZyk7CisrCQkgICAgJmhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uY2ZnKTsKKyAJfQorIAkvKiBzZXQgUkRJIHJlcG9ydCAqLworIAlpZiAocG9ydFtQb3J0X2NudF0gJiAweDAyMCkgeworQEAgLTQ3ODgsNyArNDgwNSw3IEBAIGluaXRfZTFfcG9ydChzdHJ1Y3QgaGZjX211bHRpICpoYywgc3RydWN0IGhtX21hcCAqbSkKKyAJCQkgICAgImNhcmQoJWQpIHBvcnQoJWQpXG4iLAorIAkJCSAgICBfX2Z1bmNfXywgSEZDX2NudCArIDEsIDEpOworIAkJdGVzdF9hbmRfc2V0X2JpdChIRkNfQ0ZHX1JFUE9SVF9SREksCistCQkgICAgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKTsKKysJCSAgICAmaGMtPmNoYW5baGMtPmRudW1bcHRdXS5jZmcpOworIAl9CisgCS8qIHNldCBDUkMtNCBNb2RlICovCisgCWlmICghKHBvcnRbUG9ydF9jbnRdICYgMHgxMDApKSB7CitAQCAtNDc5Nyw3ICs0ODE0LDcgQEAgaW5pdF9lMV9wb3J0KHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBzdHJ1Y3QgaG1fbWFwICptKQorIAkJCQkiIGNhcmQoJWQpIHBvcnQoJWQpXG4iLAorIAkJCQlfX2Z1bmNfXywgSEZDX2NudCArIDEsIDEpOworIAkJdGVzdF9hbmRfc2V0X2JpdChIRkNfQ0ZHX0NSQzQsCistCQkgICAgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKTsKKysJCSAgICAmaGMtPmNoYW5baGMtPmRudW1bcHRdXS5jZmcpOworIAl9IGVsc2UgeworIAkJaWYgKGRlYnVnICYgREVCVUdfSEZDTVVMVElfSU5JVCkKKyAJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFBPUlQgdHVybiBvZmYgQ1JDNCIKK0BAIC00ODI5LDIwICs0ODQ2LDIzIEBAIGluaXRfZTFfcG9ydChzdHJ1Y3QgaGZjX211bHRpICpoYywgc3RydWN0IGhtX21hcCAqbSkKKyAJfQorIAkvKiBzZXQgZWxhc3RpYyBqaXR0ZXIgYnVmZmVyICovCisgCWlmIChwb3J0W1BvcnRfY250XSAmIDB4MzAwMCkgeworLQkJaGMtPmNoYW5baGMtPmRzbG90XS5qaXR0ZXIgPSAocG9ydFtQb3J0X2NudF0+PjEyKSAmIDB4MzsKKysJCWhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uaml0dGVyID0gKHBvcnRbUG9ydF9jbnRdPj4xMikgJiAweDM7CisgCQlpZiAoZGVidWcgJiBERUJVR19IRkNNVUxUSV9JTklUKQorIAkJCXByaW50ayhLRVJOX0RFQlVHCisgCQkJICAgICIlczogUE9SVCBzZXQgZWxhc3RpYyAiCisgCQkJICAgICJidWZmZXIgdG8gJWQ6IGNhcmQoJWQpIHBvcnQoJWQpXG4iLAorLQkJCSAgICBfX2Z1bmNfXywgaGMtPmNoYW5baGMtPmRzbG90XS5qaXR0ZXIsCisrCQkJICAgIF9fZnVuY19fLCBoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmppdHRlciwKKyAJCQkgICAgSEZDX2NudCArIDEsIDEpOworIAl9IGVsc2UKKy0JCWhjLT5jaGFuW2hjLT5kc2xvdF0uaml0dGVyID0gMjsgLyogZGVmYXVsdCAqLworLQlzbnByaW50ZihuYW1lLCBNSVNETl9NQVhfSURMRU4gLSAxLCAiaGZjLWUxLiVkIiwgSEZDX2NudCArIDEpOworKwkJaGMtPmNoYW5baGMtPmRudW1bcHRdXS5qaXR0ZXIgPSAyOyAvKiBkZWZhdWx0ICovCisrCWlmIChoYy0+cG9ydHMgPiAxKQorKwkJc25wcmludGYobmFtZSwgTUlTRE5fTUFYX0lETEVOIC0gMSwgImhmYy1lMS4lZC0lZCIsIEhGQ19jbnQgKyAxLCBwdCsxKTsKKysJZWxzZQorKwkJc25wcmludGYobmFtZSwgTUlTRE5fTUFYX0lETEVOIC0gMSwgImhmYy1lMS4lZCIsIEhGQ19jbnQgKyAxKTsKKyAJcmV0ID0gbUlTRE5fcmVnaXN0ZXJfZGV2aWNlKCZkY2gtPmRldiwgJmhjLT5wY2lfZGV2LT5kZXYsIG5hbWUpOworIAlpZiAocmV0KQorIAkJZ290byBmcmVlX2NoYW47CistCWhjLT5jcmVhdGVkWzBdID0gMTsKKysJaGMtPmNyZWF0ZWRbcHRdID0gMTsKKyAJcmV0dXJuIHJldDsKKyBmcmVlX2NoYW46CisgCXJlbGVhc2VfcG9ydChoYywgZGNoKTsKK0BAIC01MDA5LDE4ICs1MDI5LDMwIEBAIGhmY211bHRpX2luaXQoc3RydWN0IGhtX21hcCAqbSwgc3RydWN0IHBjaV9kZXYgKnBkZXYsCisgCWhjLT5pZCA9IEhGQ19jbnQ7CisgCWhjLT5wY20gPSBwY21bSEZDX2NudF07CisgCWhjLT5pb19tb2RlID0gaW9tb2RlW0hGQ19jbnRdOworKyN3YXJuaW5nIHRvZG86IHJld29yayBtb2R1bGUgcGFyYW1ldGVycyBmb3IgY3VzdG9taXppbmcgZTEgZnJhZ21lbnRzLi4uLiB5ZWEsIGxldCcncyBjYWxsIGl0OiBmcmFnbWVudHMKKyAJaWYgKGRzbG90W0hGQ19jbnRdIDwgMCAmJiBoYy0+Y3R5cGUgPT0gSEZDX1RZUEVfRTEpIHsKKy0JCWhjLT5kc2xvdCA9IDA7CisrCQloYy0+ZG51bVswXSA9IDA7CisgCQlwcmludGsoS0VSTl9JTkZPICJIRkMtRTEgY2FyZCBoYXMgZGlzYWJsZWQgRC1jaGFubmVsLCBidXQgIgorIAkJCSIzMSBCLWNoYW5uZWxzXG4iKTsKKyAJfQorIAlpZiAoZHNsb3RbSEZDX2NudF0gPiAwICYmIGRzbG90W0hGQ19jbnRdIDwgMzIKKyAJICAgICYmIGhjLT5jdHlwZSA9PSBIRkNfVFlQRV9FMSkgeworLQkJaGMtPmRzbG90ID0gZHNsb3RbSEZDX2NudF07CisrCQloYy0+ZG51bVswXSA9IGRzbG90W0hGQ19jbnRdOworIAkJcHJpbnRrKEtFUk5fSU5GTyAiSEZDLUUxIGNhcmQgaGFzIGFsdGVybmF0aW5nIEQtY2hhbm5lbCBvbiAiCisgCQkJInRpbWUgc2xvdCAlZFxuIiwgZHNsb3RbSEZDX2NudF0pOworIAl9IGVsc2UKKy0JCWhjLT5kc2xvdCA9IDE2OworKwkJaGMtPmRudW1bMF0gPSAxNjsKKysKKysjd2FybmluZyB0b2RvIEhBQ0shISEganVzdCBhIHNtYWxsIG1hcCBvZiB0d28gImZyYWdtZW50cyIKKysJaWYgKGhjLT5jdHlwZSA9PSBIRkNfVFlQRV9FMSkgeworKwkJaGMtPmRudW1bMF0gPSAxOworKwkJaGMtPmJtYXNrWzBdID0gMHgwMDAwMDAzYzsKKysJCWhjLT5kbnVtWzFdID0gNjsKKysJCWhjLT5ibWFza1sxXSA9IDB4MDAwMDA3ODA7CisrCQloYy0+ZG51bVsyXSA9IDExOworKwkJaGMtPmJtYXNrWzJdID0gMHgwMDAwNzgwMDsKKysJCWhjLT5wb3J0cyA9IDM7CisrCX0KKyAKKyAJLyogc2V0IGNoaXAgc3BlY2lmaWMgZmVhdHVyZXMgKi8KKyAJaGMtPm1hc3RlcmNsayA9IC0xOworQEAgLTUxMDMsNyArNTEzNSw3IEBAIGhmY211bHRpX2luaXQoc3RydWN0IGhtX21hcCAqbSwgc3RydWN0IHBjaV9kZXYgKnBkZXYsCisgCQkJZ290byBmcmVlX2NhcmQ7CisgCQl9CisgCQlpZiAoaGMtPmN0eXBlID09IEhGQ19UWVBFX0UxKQorLQkJCXJldF9lcnIgPSBpbml0X2UxX3BvcnQoaGMsIG0pOworKwkJCXJldF9lcnIgPSBpbml0X2UxX3BvcnQoaGMsIG0sIHB0KTsKKyAJCWVsc2UKKyAJCQlyZXRfZXJyID0gaW5pdF9tdWx0aV9wb3J0KGhjLCBwdCk7CisgCQlpZiAoZGVidWcgJiBERUJVR19IRkNNVUxUSV9JTklUKQorQEAgLTUxMTUsMTAgKzUxNDcsMTQgQEAgaGZjbXVsdGlfaW5pdChzdHJ1Y3QgaG1fbWFwICptLCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKyAJCWlmIChyZXRfZXJyKSB7CisgCQkJd2hpbGUgKHB0KSB7IC8qIHJlbGVhc2UgYWxyZWFkeSByZWdpc3RlcmVkIHBvcnRzICovCisgCQkJCXB0LS07CistCQkJCXJlbGVhc2VfcG9ydChoYywgaGMtPmNoYW5bKHB0IDw8IDIpICsgMl0uZGNoKTsKKysJCQkJaWYgKGhjLT5jdHlwZSA9PSBIRkNfVFlQRV9FMSkKKysJCQkJCXJlbGVhc2VfcG9ydChoYywgaGMtPmNoYW5baGMtPmRudW1bcHRdXS5kY2gpOworKwkJCQllbHNlCisrCQkJCQlyZWxlYXNlX3BvcnQoaGMsIGhjLT5jaGFuWyhwdCA8PCAyKSArIDJdLmRjaCk7CisgCQkJfQorIAkJCWdvdG8gZnJlZV9jYXJkOworIAkJfQorKyN3YXJuaW5nIHRvZG86IGNvdW50IGl0IHJpZ2h0LCBhZGQgYWRkaXRpb25hbCAiZnJhZ21lbnQiIGNvdW50ZXIuLi4KKyAJCVBvcnRfY250Kys7CisgCX0KKyAKZGlmZiAtLWdpdCBhL29wZW5ic2MvLmdpdGlnbm9yZSBiL29wZW5ic2MvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTY4MTE0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNDggQEAKKyoubworKi5hCisuZGVwcworTWFrZWZpbGUKK01ha2VmaWxlLmluCitic2Njb25maWcuaAorYnNjY29uZmlnLmguaW4KK29wZW5ic2MucGMKK2JzY19oYWNrCitic2NfbXNjX2lwCitic2NfbWdjcAorKi4qfgorKi5zdz8KKworI2NvbmZpZ3VyZQorYWNsb2NhbC5tNAorYXV0b200dGUuY2FjaGUvCitjb25maWcubG9nCitjb25maWcuc3RhdHVzCitjb25maWd1cmUKK2RlcGNvbXAKK2luc3RhbGwtc2gKK21pc3NpbmcKK3N0YW1wLWgxCisKKyMgZ2l0LXZlcnNpb24tZ2VuIG1hZ2ljCisudGFyYmFsbC12ZXJzaW9uCisudmVyc2lvbgorCisKKyMgYXBwcyBhbmQgYXBwIGRhdGEKK2hsci5zcWxpdGUzCiticzExX2NvbmZpZworaXBhY2Nlc3MtY29uZmlnCitpcGFjY2Vzcy1maW5kCitpcGFjY2Vzcy1maXJtd2FyZQoraXBhY2Nlc3MtcHJveHkKK2lzZG5zeW5jCisKKyN0ZXN0cwordGVzdHMvY2hhbm5lbC9jaGFubmVsX3Rlc3QKK3Rlc3RzL2RiL2RiX3Rlc3QKK3Rlc3RzL2RlYnVnL2RlYnVnX3Rlc3QKK3Rlc3RzL2dzbTA0MDgvZ3NtMDQwOF90ZXN0Cit0ZXN0cy9zY2NwL3NjY3BfdGVzdAordGVzdHMvc21zL3Ntc190ZXN0Cit0ZXN0cy90aW1lci90aW1lcl90ZXN0CisKZGlmZiAtLWdpdCBhL29wZW5ic2MvQVVUSE9SUyBiL29wZW5ic2MvQVVUSE9SUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWY2MGU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9BVVRIT1JTCkBAIC0wLDAgKzEsNyBAQAorSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KK0hvbGdlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CitKYW4gTHVlYmJlIDxqbHVlYmJlQGRlYmlhbi5vcmc+CitTdGVmYW4gU2NobWlkdCA8c3RlZmFuQGRhdGVuZnJlaWhhZmVuLm9yZz4KK0RhbmllbCBXaWxsbWFubiA8ZGFuaWVsQHRvdGFsdWViZXJ3YWNodW5nLmRlPgorQW5kcmVhcyBFdmVyc2JlcmcgPEFuZHJlYXMuRXZlcnNiZXJnQHZlcnNhdGVsLmRlPgorU3lsdmFpbiBNdW5hdXQgPDI0NnRudEBnbWFpbC5jb20+CmRpZmYgLS1naXQgYS9DT1BZSU5HIGIvb3BlbmJzYy9DT1BZSU5HCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gQ09QWUlORwpjb3B5IHRvIG9wZW5ic2MvQ09QWUlORwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9NYWtlZmlsZS5hbSBiL29wZW5ic2MvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNlMTFjZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMyBAQAorQVVUT01BS0VfT1BUSU9OUyA9IGZvcmVpZ24gZGlzdC1iemlwMiAxLjYKKworSU5DTFVERVMgPSAkKGFsbF9pbmNsdWRlcykgLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUKK1NVQkRJUlMgPSBpbmNsdWRlIHNyYyB0ZXN0cworCitwa2djb25maWdkaXIgPSAkKGxpYmRpcikvcGtnY29uZmlnCitwa2djb25maWdfREFUQSA9IG9wZW5ic2MucGMgbGlic2NjcC5wYworCitCVUlMVF9TT1VSQ0VTID0gJCh0b3Bfc3JjZGlyKS8udmVyc2lvbgorJCh0b3Bfc3JjZGlyKS8udmVyc2lvbjoKKwllY2hvICQoVkVSU0lPTikgPiAkQC10ICYmIG12ICRALXQgJEAKK2Rpc3QtaG9vazoKKwllY2hvICQoVkVSU0lPTikgPiAkKGRpc3RkaXIpLy50YXJiYWxsLXZlcnNpb24KZGlmZiAtLWdpdCBhL29wZW5ic2MvUkVBRE1FIGIvb3BlbmJzYy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMWZmNAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvUkVBRE1FCkBAIC0wLDAgKzEsMzIgQEAKK0Fib3V0IE9wZW5CU0MKKz09PT09PT09PT09PT0KKworT3BlbkJTQyBpcyBhIG1pbmltYWxpc3RpYyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgR1NNIE5ldHdvcmssIHdpdGgKK3BhcnRpY3VsYXIgZW1waGFzaXMgb24gdGhlIGZ1bmN0aW9uYWxpdHkgdHlwaWNhbGx5IHByb3ZpZGVkIGJ5IHRoZSBCU0MsCitNU0MsIEhMUiwgVkxSIGFuZCBTTVNDLgorCitJdHMgY3VycmVudGx5IHN1cHBvcnRlZCBpbnRlcmZhY2VzIHRvd2FyZHMgdGhlIEJUUyBhcmU6CisKKyAqIENsYXNzaWMgQS1iaXMgb3ZlciBFMSB1c2luZyBhIG1JU0ROIGJhc2VkIEUxIGludGVyZmFjZS4gSW4gb3RoZXIKKyAgIHdvcmRzLCB5b3UgY2FuIGNvbm5lY3QgZXhpc3RpbmcgR1NNIEJhc2UgVHJhbnNjZWl2ZXIgU3RhdGlvbiAoQlRTKQorICAgdGhyb3VnaCBFMSB0byBPcGVuQlNDLiAgU28gZmFyLCB3ZSBoYXZlIG9ubHkgdGVzdGVkIHRoZSBTaWVtZW5zIEJTLTExCisgICBUZXN0IHJlcG9ydHMgd2l0aCBvdGhlciBCVFMgYXJlIG11Y2ggYXBwcmVjaWF0ZWQhCisKKyAqIEEtYmlzIG92ZXIgSVAgYXMgdXNlZCBieSB0aGUgaXAuYWNjZXNzIG5hbm9CVFMgcHJvZHVjdCBmYW1pbHkKKworWW91IGNhbiBmaW5kIHRoZSBwcm9qZWN0IGRvY3VtZW50YXRpb24gYXQgaHR0cDovL29wZW5ic2MuZ251bW9ua3Mub3JnLworCitUaGlzIHByb2plY3QgaXMgc3RpbGwgaW4gaXRzIGVhcmx5IGRheXMsIGFuZCB0aGVyZSBhcmUgbG90cyBvZiBhcmVhcyB3aGVyZSBpdAorZG9lc24ndCBiZWhhdmUgYXMgcGVyIEdTTSBzcGVjLgorCisJSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKworCitsaWJvc21vY29yZQorPT09PT09PT09PT0KKworUGxlYXNlIG5vdGUgdGhhdCBhcyBvZiBNYXJjaCAyMDEwLCBPcGVuQlNDIGhhcyBhIGRlcGVuZGVuY3kgdG8gYSBsaWJyYXJ5CitjYWxsZWQgImxpYm9zbW9jb3JlIi4gIFlvdSBjYW4gb2J0YWluIHRoYXQgbGlicmFyeSBmcm9tCisKKwlnaXQ6Ly9naXQub3Ntb2NvbS5vcmcvbGlib3Ntb2NvcmUuZ2l0CisKZGlmZiAtLWdpdCBhL29wZW5ic2MvY29uZmlndXJlLmluIGIvb3BlbmJzYy9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUyZjRmMAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvY29uZmlndXJlLmluCkBAIC0wLDAgKzEsNjMgQEAKK2RubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0CitBQ19JTklUKFtvcGVuYnNjXSwKKwltNF9lc3lzY21kKFsuL2dpdC12ZXJzaW9uLWdlbiAudGFyYmFsbC12ZXJzaW9uXSksCisJW29wZW5ic2MtZGV2ZWxAbGlzdHMub3BlbmJzYy5vcmddKQorCitBTV9JTklUX0FVVE9NQUtFKFtkaXN0LWJ6aXAyXSkKKworZG5sIGtlcm5lbCBzdHlsZSBjb21waWxlIG1lc3NhZ2VzCittNF9pZmRlZihbQU1fU0lMRU5UX1JVTEVTXSwgW0FNX1NJTEVOVF9SVUxFUyhbeWVzXSldKQorCitkbmwgY2hlY2tzIGZvciBwcm9ncmFtcworQUNfUFJPR19NQUtFX1NFVAorQUNfUFJPR19DQworQUNfUFJPR19JTlNUQUxMCitBQ19QUk9HX1JBTkxJQgorCitkbmwgY2hlY2tzIGZvciBsaWJyYXJpZXMKK0FDX1NFQVJDSF9MSUJTKGNyeXB0LCBjcnlwdCwKKyAgICBbTElCQ1JZUFQ9Ii1sY3J5cHQiOyBBQ19ERUZJTkUoW1ZUWV9DUllQVF9QV10sIFtdLCBbVXNlIGNyeXB0IGZ1bmN0aW9uYWxpdHkgb2YgdnR5Ll0pXSkKK0FDX1NFQVJDSF9MSUJTKGd0cF9uZXcsIGd0cCwKKyAgICBbTElCQ1JZUFQ9Ii1sZ3RwIjsgQUNfU1VCU1QoW0dQUlNfTElCR1RQXSwgWzFdKV0pCisKK0FNX0NPTkRJVElPTkFMKEhBVkVfTElCR1RQLCB0ZXN0ICJ4JEdQUlNfTElCR1RQIiAhPSAieCIpCisKK1BLR19DSEVDS19NT0RVTEVTKExJQk9TTU9DT1JFLCBsaWJvc21vY29yZSA+PSAwLjEuNikKK1BLR19DSEVDS19NT0RVTEVTKExJQk9TTU9WVFksIGxpYm9zbW92dHkgPj0gMC4xLjYpCisKK2RubCBjaGVja3MgZm9yIGhlYWRlciBmaWxlcworQUNfSEVBREVSX1NUREMKKworZG5sIENoZWNrcyBmb3IgdHlwZWRlZnMsIHN0cnVjdHVyZXMgYW5kIGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljcworCisjIFRoZSBmb2xsb3dpbmcgdGVzdCBpcyB0YWtlbiBmcm9tIFdlYktpdCdzIHdlYmtpdC5tNAorc2F2ZWRfQ0ZMQUdTPSIkQ0ZMQUdTIgorQ0ZMQUdTPSIkQ0ZMQUdTIC1mdmlzaWJpbGl0eT1oaWRkZW4gIgorQUNfTVNHX0NIRUNLSU5HKFtpZiAke0NDfSBzdXBwb3J0cyAtZnZpc2liaWxpdHk9aGlkZGVuXSkKK0FDX0NPTVBJTEVfSUZFTFNFKFtjaGFyIGZvbztdLAorICAgICAgWyBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgICAgICBTWU1CT0xfVklTSUJJTElUWT0iLWZ2aXNpYmlsaXR5PWhpZGRlbiJdLAorICAgICAgICBBQ19NU0dfUkVTVUxUKFtub10pKQorQ0ZMQUdTPSIkc2F2ZWRfQ0ZMQUdTIgorQUNfU1VCU1QoU1lNQk9MX1ZJU0lCSUxJVFkpCisKKworZG5sIEdlbmVyYXRlIHRoZSBvdXRwdXQKK0FNX0NPTkZJR19IRUFERVIoYnNjY29uZmlnLmgpCisKK0FDX09VVFBVVCgKKyAgICBvcGVuYnNjLnBjCisgICAgbGlic2NjcC5wYworICAgIGluY2x1ZGUvb3BlbmJzYy9NYWtlZmlsZQorICAgIGluY2x1ZGUvc2NjcC9NYWtlZmlsZQorICAgIGluY2x1ZGUvTWFrZWZpbGUKKyAgICBzcmMvTWFrZWZpbGUKKyAgICBzcmMvaXBhY2Nlc3MvTWFrZWZpbGUKKyAgICBzcmMvZ3Bycy9NYWtlZmlsZQorICAgIHRlc3RzL01ha2VmaWxlCisgICAgdGVzdHMvZGVidWcvTWFrZWZpbGUKKyAgICB0ZXN0cy9nc20wNDA4L01ha2VmaWxlCisgICAgdGVzdHMvZGIvTWFrZWZpbGUKKyAgICB0ZXN0cy9jaGFubmVsL01ha2VmaWxlCisgICAgdGVzdHMvc2NjcC9NYWtlZmlsZQorICAgIE1ha2VmaWxlKQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9jb250cmliL2J0LnB5IGIvb3BlbmJzYy9jb250cmliL2J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFiMTExZWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2NvbnRyaWIvYnQucHkKQEAgLTAsMCArMSwzMyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKK2ltcG9ydCBvcworCitmID0gb3BlbigidW5iYWxhbmNlZCIpCitsaW5lcyA9IFtdCitmb3IgbGluZSBpbiBmOgorICAgIGxpbmVzLmFwcGVuZChsaW5lKQorCitmaWxlbmFtZXMgPSB7fQorCitvdXRwdXQgPSBbXQorZm9yIGxpbmUgaW4gbGluZXM6CisgICAgaWYgIlsweCIgaW4gbGluZToKKyAgICAgICAgc3RhcnQgPSBsaW5lLmZpbmQoIlsiKQorICAgICAgICBlbmQgPSBsaW5lLmZpbmQoIl0iKQorICAgICAgICBhZGRyID0gbGluZVtzdGFydCsxOmVuZF0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmlsZSA9IGZpbGVuYW1lc1thZGRyXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByID0gb3MucG9wZW4oImFkZHIybGluZSAtZnMgLWUgLi9ic2NfaGFjayAlcyIgJSBhZGRyKQorICAgICAgICAgICAgYWxsID0gci5yZWFkKCkucmVwbGFjZSgiXG4iLCAiLCIpCisgICAgICAgICAgICBmaWxlID0gYWxsCisgICAgICAgICAgICBmaWxlbmFtZXNbYWRkcl0gPSBmaWxlCisKKyAgICAgICAgbGluZSA9IGxpbmUucmVwbGFjZShhZGRyLCBmaWxlKQorICAgIG91dHB1dC5hcHBlbmQobGluZSkKKworZyA9IG9wZW4oInVuYmFsYW5jZWQuMiIsICJ3IikKK2cud3JpdGUoIiIuam9pbihvdXRwdXQpKQorCisKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9jb250cmliL2NvbnZlcnRfdG9fZW51bS5weSBiL29wZW5ic2MvY29udHJpYi9jb252ZXJ0X3RvX2VudW0ucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmNkNmYyYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvY29udHJpYi9jb252ZXJ0X3RvX2VudW0ucHkKQEAgLTAsMCArMSwzNyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyMKKyMgQ29udmVydCBFVFNJIGRvY3VtZW50cyB0byBhbiBlbnVtCisjCisKK2ltcG9ydCByZSwgc3lzCisKK2RlZiBjb252ZXJ0KHN0cmluZyk6CisgICAgc3RyaW5nID0gc3RyaW5nLnN0cmlwKCkucmVwbGFjZSgiICIsICIiKS5yanVzdCg4LCAiMCIpCisgICAgdmFyID0gMAorICAgIG9mZnNldCA9IDcKKyAgICBmb3IgY2hhciBpbiBzdHJpbmc6CisgICAgICAgIGFzc2VydCBvZmZzZXQgPj0gMAorICAgICAgICB2YXIgPSB2YXIgfCAoaW50KGNoYXIpIDw8IG9mZnNldCkKKyAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IC0gMQorCisgICAgcmV0dXJuIHZhcgorCitkZWYgc3RyaW5nKG5hbWUpOgorICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoIiAiLCAiXyIpCisgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnIicsICIiKQorICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJy8nLCAnXycpCisgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnKCcsICdfJykKKyAgICBuYW1lID0gbmFtZS5yZXBsYWNlKCcpJywgJ18nKQorICAgIHJldHVybiAiJXNfJXMiICUgKHN5cy5hcmd2WzJdLCBuYW1lLnVwcGVyKCkpCisKK2ZpbGUgPSBvcGVuKHN5cy5hcmd2WzFdKQorCisKK2ZvciBsaW5lIGluIGZpbGU6CisgICAgbSA9IHJlLm1hdGNoKHIiWyBcdF0qKD9QPHZhbHVlPlswMSBdKylbIF0rKD9QPG5hbWU+W2EtekEtWiAvMC05KCldKykiLCBsaW5lWzotMV0pCisKKyAgICBpZiBtOgorICAgICAgICBwcmludCAiXHQlc1x0XHQ9ICVkLCIgJSAoc3RyaW5nKG0uZ3JvdXBkaWN0KClbIm5hbWUiXSksIGNvbnZlcnQobS5ncm91cGRpY3QoKVsidmFsdWUiXSkpCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQgbGluZVs6LTFdCmRpZmYgLS1naXQgYS9vcGVuYnNjL2NvbnRyaWIvbWdjcF9zZXJ2ZXIucHkgYi9vcGVuYnNjL2NvbnRyaWIvbWdjcF9zZXJ2ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDVjNDg5ZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvY29udHJpYi9tZ2NwX3NlcnZlci5weQpAQCAtMCwwICsxLDYwIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgU2ltcGxlIHNlcnZlciBmb3IgbWdjcC4uLiBzZW5kIGF1ZGl0LCByZWNlaXZlIHJlc3BvbnNlLi4KKworaW1wb3J0IHNvY2tldCwgdGltZQorCitNR0NQX0dBVEVXQVlfUE9SVCA9IDI0MjcKK01HQ1BfQ0FMTEFHRU5UX1BPUlQgPSAyNzI3CisKK3JzaXBfcmVzcCA9ICIiIjIwMCAzMjEzMjEzMzJcclxuIiIiCithdWRpdF9wYWNrZXQgPSAiIiJBVUVQICVkIDEzQG1ndyBNR0NQIDEuMFxyXG4iIiIKK2NyY3hfcGFja2V0ID0gIiIiQ1JDWCAlZCAxNEBtZ3cgTUdDUCAxLjBcclxuQzogNGE4NGFkNWQyNWZcclxuTDogcDoyMCwgYTpHU00tRUZSLCBudDpJTlxyXG5NOiByZWN2b25seVxyXG4iIiIKK2RsY3hfcGFja2V0ID0gIiIiRExDWCAlZCAxNEBtZ3cgTUdDUCAxLjBcclxuQzogNGE4NGFkNWQyNWZcclxuSTogJWRcclxuIiIiCittZGN4X3BhY2tldCA9ICIiIk1EQ1ggJWQgMTRAbWd3IE1HQ1AgMS4wXHJcbkM6IDRhODRhZDVkMjVmXHJcbkk6ICVkXHJcbkw6IHA6MjAsIGE6R1NNLUVGUiwgbnQ6SU5cclxuTTogcmVjdm9ubHlcclxuXHJcbnY9MFxyXG5vPS0gMjU4Njk2NDc3IDAgSU4gSVA0IDE3Mi4xNi4xLjEwN1xyXG5zPS1cclxuYz1JTiBJUDQgMTcyLjE2LjEuMTA3XHJcbnQ9MCAwXHJcbm09YXVkaW8gNjY2NiBSVFAvQVZQIDEyN1xyXG5hPXJ0cG1hcDoxMjcgR1NNLUVGUi84MDAwLzFcclxuYT1wdGltZToyMFxyXG5hPXJlY3Zvbmx5XHJcbm09aW1hZ2UgNDQwMiB1ZHB0bCB0MzhcclxuYT1UMzhGYXhWZXJzaW9uOjBcclxuYT1UMzhNYXhCaXRSYXRlOjE0NDAwXHJcbiIiIgorCitkZWYgaGV4ZHVtcChzcmMsIGxlbmd0aD04KToKKyAgICAiIiJSZWNpcGUgaXMgZnJvbSBodHRwOi8vY29kZS5hY3RpdmVzdGF0ZS5jb20vcmVjaXBlcy8xNDI4MTIvIiIiCisgICAgcmVzdWx0ID0gW10KKyAgICBkaWdpdHMgPSA0IGlmIGlzaW5zdGFuY2Uoc3JjLCB1bmljb2RlKSBlbHNlIDIKKyAgICBmb3IgaSBpbiB4cmFuZ2UoMCwgbGVuKHNyYyksIGxlbmd0aCk6CisgICAgICAgcyA9IHNyY1tpOmkrbGVuZ3RoXQorICAgICAgIGhleGEgPSBiJyAnLmpvaW4oWyIlMCpYIiAlIChkaWdpdHMsIG9yZCh4KSkgIGZvciB4IGluIHNdKQorICAgICAgIHRleHQgPSBiJycuam9pbihbeCBpZiAweDIwIDw9IG9yZCh4KSA8IDB4N0YgZWxzZSBiJy4nICBmb3IgeCBpbiBzXSkKKyAgICAgICByZXN1bHQuYXBwZW5kKCBiIiUwNFggICAlLSpzICAgJXMiICUgKGksIGxlbmd0aCooZGlnaXRzICsgMSksIGhleGEsIHRleHQpICkKKyAgICByZXR1cm4gYidcbicuam9pbihyZXN1bHQpCisKK3NlcnZlcl9zb2NrZXQgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19ER1JBTSkKK3NlcnZlcl9zb2NrZXQuYmluZCgoIjEyNy4wLjAuMSIsIE1HQ1BfQ0FMTEFHRU5UX1BPUlQpKQorc2VydmVyX3NvY2tldC5zZXRibG9ja2luZygxKQorCitsYXN0X2NpID0gMQorZGVmIHNlbmRfYW5kX3JlY2VpdmUocGFja2V0KToKKyAgICBnbG9iYWwgbGFzdF9jaQorICAgIHNlcnZlcl9zb2NrZXQuc2VuZHRvKHBhY2tldCwgKCIxMjcuMC4wLjEiLCBNR0NQX0dBVEVXQVlfUE9SVCkpCisgICAgdHJ5OgorICAgICAgICBkYXRhLCBhZGRyID0gc2VydmVyX3NvY2tldC5yZWN2ZnJvbSg0MDk2KQorCisgICAgICAgICMgYXR0ZW1wdCB0byBzdG9yZSB0aGUgQ0kgb2YgdGhlIHJlc3BvbnNlCisgICAgICAgIGxpc3QgPSBkYXRhLnNwbGl0KCJcbiIpCisgICAgICAgIGZvciBpdGVtIGluIGxpc3Q6CisgICAgICAgICAgIGlmIGl0ZW0uc3RhcnRzd2l0aCgiSTogIik6CisgICAgICAgICAgICAgICBsYXN0X2NpID0gaW50KGl0ZW1bMzpdKQorCisgICAgICAgIHByaW50IGhleGR1bXAoZGF0YSksIGFkZHIKKyAgICBleGNlcHQgc29ja2V0LmVycm9yLCBlOgorICAgICAgICBwcmludCBlCisgICAgICAgIHBhc3MKKworZGVmIGdlbmVyYXRlX3RpZCgpOgorICAgIGltcG9ydCByYW5kb20KKyAgICByZXR1cm4gcmFuZG9tLnJhbmRpbnQoMCwgNjUxMjMpCisKKworCit3aGlsZSBUcnVlOgorICAgIHNlbmRfYW5kX3JlY2VpdmUoYXVkaXRfcGFja2V0ICUgZ2VuZXJhdGVfdGlkKCkpCisgICAgc2VuZF9hbmRfcmVjZWl2ZShjcmN4X3BhY2tldCAlIGdlbmVyYXRlX3RpZCgpICkKKyAgICBzZW5kX2FuZF9yZWNlaXZlKG1kY3hfcGFja2V0ICUgKGdlbmVyYXRlX3RpZCgpLCBsYXN0X2NpKSkKKyAgICBzZW5kX2FuZF9yZWNlaXZlKGRsY3hfcGFja2V0ICUgKGdlbmVyYXRlX3RpZCgpLCBsYXN0X2NpKSkKKworICAgIHRpbWUuc2xlZXAoMykKZGlmZiAtLWdpdCBhL29wZW5ic2MvZG9jL0JTMTEtT01MLnR4dCBiL29wZW5ic2MvZG9jL0JTMTEtT01MLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWMzMjk5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9kb2MvQlMxMS1PTUwudHh0CkBAIC0wLDAgKzEsMzEgQEAKK1RoZSBTaWVtZW5zIEJTLTExIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBHU00gMTIuMjEgT01MIG9wZXJhdGlvbnM6CisKKworQ1JFQVRFIE9CSkVDVAorCithYmlzX29tX2ZvbV9oZHIub2JqX2NsYXNzIGNhbiBiZSAKK0EzOgorQTU6IEFMQ08sIEJCU0lHLCBDQ0xLLCBHUFNVLCBMSSwgUEEKK0E4OiBFbnZhQlRTRQorQTk6IEJQT1JUCisKK3RoZSBhYmlzX29tX29ial9pbnN0LnRyeF9uciBmaWVsZCBpbmRpY2F0ZXMgdGhlIGluZGV4IG9mIG9iamVjdCwgd2hlcmVhcyB0aGUKK2FiaXNfb21fZm9tX2hkci5idHNfbnIgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCisKK2VudW0gYWJpc19iczExX29ianR5cGUgeworCUJTMTFfT0JKX0FMQ08JCT0gMHgwMSwKKwlCUzExX09CSl9CQlNJRwkJPSAweDAyLAkvKiBvYmpfY2xhc3M6IDAsMSAqLworCUJTMTFfT0JKX1RSWDEJCT0gMHgwMywJLyogb25seSBERUFDVElWQVRFIFRSWDEgKi8KKwlCUzExX09CSl9DQ0xLCQk9IDB4MDQsCisJQlMxMV9PQkpfR1BTVQkJPSAweDA2LAorCUJTMTFfT0JKX0xJCQk9IDB4MDcsCisJQlMxMV9PQkpfUEEJCT0gMHgwOSwJLyogb2JqX2NsYXNzOiAwLCAxKi8KK307CisKK0luIGNhc2Ugb2YgQ1JFQVRFIEVOVkFCVFNFLCB0aGUgYWJpc19vbV9vYmpfaW5zdC50cnhfbnIgaW5kaWNhdGVzIHRoZSBFbnZhQlRTRXgKK251bWJlci4KKworSW4gY2FzZSBvZiBBOSAoQ1JFQUVURSBCUE9SVCksIHRoZSBhYmlzX29tX29ial9pbnN0LmJ0c19uciBpbmRpY2F0ZXMgd2hpY2ggQlBPUlQKK3NoYWxsIGJlIHVzZWQuCisKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9kb2MvY2FsbC1yb3V0aW5nLnR4dCBiL29wZW5ic2MvZG9jL2NhbGwtcm91dGluZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQwMmY5ZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvZG9jL2NhbGwtcm91dGluZy50eHQKQEAgLTAsMCArMSwyNSBAQAorQ2FsbCByb3V0aW5nIGluIE9wZW5CU0MKKworRmxvdyBvZiBldmVudHM6CisKKyAjIE1PIGNhbGwgaW5pdGlhdGVkIGJ5IE1TLCBDSEFOTkVMIFJRRCwgSU1NRURJQVRFIEFTU0lHTgorICMgTVMgc2VuZHMgQ0MgU0VUVVAgbWVzc2FnZSwgd2UgYXNzdW1lIGFscmVhZHkgb24gVENIL0ggRkFDQ0gKKyAjIE9wZW5CU0MgZG9lcyBhIHN1YnNjcmliZXIgbG9va3VwIGJhc2VkIG9uIHRoZSB0YXJnZXQgZXh0ZW5zaW9uCisgICogSWYgYSBzdWJzY3JpYmVyIGlzIGZvdW5kOgorICAgIyBzZW5kIENBTEwgUFJPQ0VFRElORyBtZXNzYWdlIHRvIE1PCisgICAjIHBhZ2UgdGhlIE1UIHN1YnNjcmliZXIgYW5kIGFzayBpdEkgdG8gYXNrIGZvciBUQ0gvSAorICAgIyBvbmNlIHBhZ2luZyBjb21wbGV0ZXMsIHdlIGhhdmUgdGhlIFRDSC9IIGZvciB0aGUgTVQgZW5kCisgICAjIHNlbmQgU0VUVVAgdG8gTVQKKyAgICMgcmVjZWl2ZSBDQUxMIENPTkZJUk1FRCBmcm9tIE1UCisgICAjIHNldC11cCB0aGUgVFJBVSBtdXggbWFwcGluZyBiZXR3ZWVuIHRoZSBFMSBzdWJzbG90cyBmb3IgYm90aCBUQ0gvSAorICAgIyByZWNlaXZlIEFMRVJUSU5HIGZyb20gTVQsIHJvdXRlIEFMRVJUSU5HIHRvIE1PCisgICAjIHJlY2VpdmUgQ09OTkVDVCBmcm9tIE1ULCBjb25maXJtIHRvIE1UIHdpdGggQ09OTkVDVF9BQ0sKKyAgICMgc2VuZCBhIENPTk5FQ1QgbWVzc2FnZSB0byBNTywgcmVjZWl2ZSBDT05ORUNUX0FDSyBmcm9tIE1PCisgKiBJZiBzdWJzY3JpYmVyIGlzIG5vdCBmb3VuZDoKKyAgIyBzZW5kIFJFTEVBU0UgQ09NUExFVEUgd2l0aCBhcHJvcHJpYXRlIGNhdXNlIHRvIE1PICgxOiB1bmFsbG9hY2F0ZWQgMzogbm8gcm91dGUpCisgIAorCisKK1Rob3VnaHRzIGFib3V0IFJSL01NOgorCisqIHdlIGFsbG9jYXRlIFJSL01NIGVudGl0aWVzIG9uIGRlbWFuZCwgd2hlbiB3ZSBuZWVkIHRoZW0KZGlmZiAtLWdpdCBhL29wZW5ic2MvZG9jL2NoYW5uZWxfcmVsZWFzZS50eHQgYi9vcGVuYnNjL2RvYy9jaGFubmVsX3JlbGVhc2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhY2YwOWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2RvYy9jaGFubmVsX3JlbGVhc2UudHh0CkBAIC0wLDAgKzEsNzQgQEAKKworR1NNIDA0LjA4IDcuMS43IC8gOS4xLjcJCVJSIENIQU5ORUwgUkVMRVNFCisKK1JTTCAwOC41OCAzLjQgLyA/CQlSTEwgTGluayBSZWxlYXNlIFJlcXVlc3QKKworUlNMIDA4LjU4IDQuNiAvIDguNC41CQlERUFDVGl2YXRlIFNBQ0NICisJKiBEZWFjdGl2YXRlIFNBQ0NIIGFjY29yZGluZyB0byBDaGFubmVsIFJlbGVhc2UgUHJvYyAwNC4wOAorCSogdG8gYmUgc2VudCBhZnRlciBSUiBDSEFOTkVMIFJFTEVBU0UgaXMgc2VudCB0byBNUworCitSU0wgMDguNTggNC43IC8gOC40LjE0CQlSRiBDSEFObmVsIFJFTGVhc2UKKwkqIHRlbGxzIHRoZSBCVFMgdG8gcmVsZWFzZSBhIHJhZGlvIGNoYW5uZWwKKwkqICJ3aGVuIGFuIGFjdGl2YXRlZCByYWRpbyBjaGFubmVsIGlzIG5vIGxvbmdlciBuZWVkZWQiCisJKiBCVFMgcmVzcG9uZHMgd2l0aCBSRiBDSEFObmVsIFJFTGVhc2UgQUNLbm93bGVkZ2UKKworCitHU00gMDQuMDggMy40LjEzOiBSUiBjb25uZWN0aW9uIHJlbGVhc2UgcHJvY2VkdXJlCisKKyogbmV0d29yayBzZW5kcyBSUiBDSEFOTkVMIFJFTEVBU0UgdG8gTVMgb24gdGhlIERDQ0gKKyAgKiBzdGFydCBUMzEwOQorICAqIGRlYWN0aXZhdGUgU0FDQ0gKKyogTVMgZGlzY29ubmVjdHMgbWFpbiBzaWduYWxsaW5nIGxpbmsgKGJ5IHNlbmRpbmcgRElTQykKKyAgKiBhbGwgb3RoZXIgZGF0YSBsaW5rcyBhcmUgZGlzY29ubmVjdGVkIGJ5IGxvY2FsIGVuZCBsaW5rIHJlbGVhc2UKKyogbmV0d29yayByZWNlaXZlcyBESVNDIChCVFMgc2VuZHMgUkxMIFJFTCBJTkQgdG8gQlNDKQorICAqIHN0b3AgVDMxMDkKKyAgKiBzdGFydCBUMzExMSAKKyogd2hlbiBUMzExMSB0aW1lcyBvdXQsIHRoZSBuZXR3b3JrIGNhbiByZXVzZSB0aGUgY2hhbm5scworKiBpZiBUMzEwOSB0aW1lcyBvdXQsIHRoZSBuZXR3b3JrIGRlYWN0aXZhdGVzIHRoZSBjaGFubmVscyAKKyAgYW5kIGNhbiByZXVzZSB0aGVtCisgICogdGhpcyBwcm9iYWJseSBtZWFucyBzaW1wbHkgUkYgQ0hBTm5lbCBSRUxlYXNlCisKKworPT0gSW1wbGVtZW50YXRpb24gaW4gT3BlbkJTQyA9PQorCitjaGFuX2FsbG9jLmM6bGNoYW5fYXV0b19yZWxlYXNlKCkKKwkqIGNoZWNrcyBpZiB1c2UgY291bnQgc3RpbGwgPiAwIChhYm9ydCkKKwkqIGNhbGxzIGdzbTQ4X3NlbmRfcnJfcmVsZWFzZSgpCisJCSogd2hpY2ggY2FsbHMgcnNsX2RlYWN0X3NhY2NoKCkKKwkqIGNhbGxzIHJzbF9yZWxlYXNlX3JlcXVlc3QoKQorCQkqIHdoaWNoIHNlbmRzIFJMTCBMaW5rIFJlbGVhc2UgcmVxdWVzdAorCQorUlggb2YgUkVMZWFzZSBJTkRpY2F0aW9uOgorCSogY2FsbCByc2xfcmZfY2hhbl9yZWxlYXNlKCkgKHNlbmQgUkZfQ0hBTl9SRUwpCisKK1JYIG9mIFJFTGVhc2UgQ09ORmltZW06CisJKiBjYWxsIHJzbF9yZl9jaGFuX3JlbGVhc2UoKSAoc2VuZCBSRl9DSEFOX1JFTCkKKworKiBSWCBvZiBSRl9DSEFOX1JFTF9BQ0sKKwkqIGNhbGwgbGNoYW5fZnJlZSgpCisJCSogc3Vic2NyX3B1dCgpCisJCSogZGVsZXRlIHJlbGVhc2VfdGltZXIKKworCis9PT0gSW50ZWdyYXRpb24gd2l0aCBTTVMgPT09CisKKyogUlggb2YgQ1BfRVJST1Igb3IgdW5pbXBsZW1lbnRlZCBNVAorCSogdHJpZ2dlciB0cmFuc19mcmVlKCkgd2hpY2ggd2lsbCBsY2hhbl9hdXRvX3JlbGVhc2UoKQorCisqIENQIFRDMSogZXhwaXJlZCB3aGlsZSB3YWl0aW5nIGZvciBDUC1BQ0sKKwkqIHRyaWdnZXIgdHJhbnNfZnJlZSgpIHdoaWNoIHdpbGwgbGNoYW5fYXV0b19yZWxlYXNlKCkKKworKiBSWCBvZiBSUF9FUlJPUgorCSogdHJpZ2dlciB0cmFuc19mcmVlKCkgd2hpY2ggd2lsbCBsY2hhbl9hdXRvX3JlbGVhc2UoKQorCQorKiBUWCBvZiBDUC1BQ0sgaW4gTVQgREVMSVZFUgorCSogdHJpZ2dlciB0cmFuc19mcmVlKCkgd2hpY2ggd2lsbCBsY2hhbl9hdXRvX3JlbGVhc2UoKQorCisqIFJYIG9mIENQLUFDSyBpbiBNTyBTVUJNSVQKKwkqIHRyaWdnZXIgdHJhbnNfZnJlZSgpIHdoaWNoIHdpbGwgbGNoYW5fYXV0b19yZWxlYXNlKCkKKwkKKyogUlggb2YgUlAtQUNLIGluIE1UIERFTElWRVIgKGFuZCBubyBtb3JlIG1lc3NhZ2VzKQorCSogdHJpZ2dlciByc2xfcmVsZWFzZV9yZXF1ZXN0KCkgZm9yIFNBUEkzCisKKyogUlggb2YgUlAtU01NQSBpbiBNVCBERUxJVkVSIChhbmQgbm8gbW9yZSBtZXNzYWdlcykKKwkqIHRyaWdnZXIgcnNsX3JlbGVhc2VfcmVxdWVzdCgpIGZvciBTQVBJMwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9kb2MvZTEtZGF0YS1tb2RlbC50eHQgYi9vcGVuYnNjL2RvYy9lMS1kYXRhLW1vZGVsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTk0ZmU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9kb2MvZTEtZGF0YS1tb2RlbC50eHQKQEAgLTAsMCArMSwxNzIgQEAKK0UxIHJlbGF0ZWQgZGF0YSBtb2RlbAorCitUaGlzIGRhdGEgbW9kZWwgZGVzY3JpYmVzIHRoZSBwaHlzaWNhbCByZWxhdGlvbnNoaXAgb2YgdGhlIGluZGl2aWR1YWwKK3BhcnRzIGluIHRoZSBuZXR3b3JrLCBpdCBpcyBub3QgdGhlIGxvZ2ljYWwvcHJvdG9jb2wgc2lkZSBvZiB0aGUgR1NNCituZXR3b3JrLgorCitBIEJUUyBpcyBjb25uZWN0ZWQgdG8gdGhlIEJTQyBieSBzb21lIHBoeXNpY2FsIGxpbmsuICBJdCBjb3VsZCBiZSBhbiBhY3R1YWwKK0UxIGxpbmssIGJ1dCBpdCBjb3VsZCBhbHNvIGJlIGFiaXMtb3Zlci1JUCB3aXRoIGEgbWl4dHVyZSBvZiBUQ1AgYW5kIFJUUC9VRFAuCisKK1RvIGZ1cnRoZXIgY29tcGxpY2F0ZSB0aGUgZmFjdCwgbXVsdGlwbGUgQlRTIGNhbiBzaGFyZSBvbmUgc3VjaCBweXNpY2FsCitsaW5rLiAgT24gYSBzaW5nbGUgRTEgbGluZSwgd2UgY2FuIGVhc2lseSBhY2NvbW9kYXRlIHVwIHRvIHRocmVlIEJUUyB3aXRoCit0d28gVFJYIGVhY2guCisKK1RodXMsIGl0IGlzIGJlc3QgZm9yIE9wZW5CU0MgdG8gaGF2ZSBzb21lIGtpbmQgb2YgYWJzdHJhY3Rpb24gbGF5ZXIuICBUaGUgQlNDJ3MKK3ZpZXcgb2YgYSBCVFMgY29ubmVjdGVkIHRvIGl0LiAgV2UgY2FsbCB0aGlzICdidHNfbGluaycuICBBIGJ0c19saW5rIGNhbiBiZQorKiBhbGwgdGhlIFRDUCBhbmQgVURQIHN0cmVhbXMgb2YgYSBBYmlzLW92ZXItSVAgQlRTCisqIGEgc2V0IG9mIEUxIHRpbWVzbG90cyBmb3IgT01MLCBSU0wgYW5kIFRSQVUgY29ubmVjdGlvbnMgb24gYSBFMSBsaW5rCisqIGEgc2VyaWFsIGxpbmUgZXhjbHVzaXZlbHkgdXNlZCBmb3IgT01MIG1lc3NhZ2VzIChULUxpbmspCisKK0EgYnRzX2xpbmsgY2FuIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgT3BlbkJTQyBjb3JlIGF0IHJ1bnRpbWUuCisKK3N0cnVjdCB0cnhfbGluayB7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7Cit9OworCitzdHJ1Y3QgYnRzX2xpbmsgeworCXN0cnVjdCBnc21fYnRzICpidHM7CisJc3RydWN0IHRyeF9saW5rIHRyeF9saW5rc1tOVU1fVFJYXTsKK307CisKK0ludGVyZmFjZSBmcm9tIHN0YWNrIHRvIGlucHV0IGNvcmU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitpbnQgYWJpc19yc2xfc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKKwlzZW5kIGEgbWVzc2FnZSB0aHJvdWdoIGEgUlNMIGxpbmsgdG8gdGhlIFRSWCBzcGVjaWZpZWQgYnkgdGhlIGNhbGxlciBpbgorCW1zZy0+dHJ4LgorCitpbnQgYWJpc19yc2xfcmN2bXNnKHN0cnVjdCBtc2diICptc2cpOworCXJlY2VpdmUgYSBtZXNzYWdlIGZyb20gYSBSU0wgbGluayBmcm9tIHRoZSBUUlggc3BlY2lmaWVkIGJ5IHRoZQorCWNhbGxlciBpbiBtc2ctPnRyeC4KKworaW50IGFiaXNfbm1fc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKKwlzZW5kIGEgbWVzc2FnZSB0aHJvdWdoIGEgT01MIGxpbmsgdG8gdGhlIEJUUyBzcGVjaWZpZWQgYnkgdGhlIGNhbGxlciBpbgorCW1zZy0+dHJ4LT5idHMuICBUaGUgY2FsbGVyIGNhbiBqdXN0IHVzZSBidHMtPmMwIHRvIGdldCB0aGUgZmlyc3QgVFJYCisJaW4gYSBCVFMuIChPTUwgbWVzc2FnZXMgYXJlIG5vdCByZWFsbHkgc2VudCB0byBhIFRSWCBidXQgdG8gdGhlIEJUUykKKworaW50IGFiaXNfbm1fcmN2bXNnKHN0cnVjdCBtc2diICptc2cpOworCXJlY2VpdmUgYSBtZXNzYWdlIGZyb20gYSBPTUwgbGluayBmcm9tIHRoZSBCVFMgc3BlY2lmaWVkIGJ5IHRoZSBjYWxsZXIKKwlpbiBtc2ctPnRyeC0+YnRzLiAgVGhlIGNhbGxlciBjYW4ganVzdCB1c2UgYnRzLT5jMCB0byBnZXQgdGhlIGZpcnN0CisJVFJYIGluIGEgQlRTLgorCitpbnQgYWJpc19saW5rX2V2ZW50KGludCBldmVudCwgdm9pZCAqZGF0YSk7CisJc2lnbmFsIHNvbWUgZXZlbnQgKHN1Y2ggYXMgbGF5ZXIgMSBjb25uZWN0L2Rpc2Nvbm5lY3QpIGZyb20gdGhlCisJaW5wdXQgY29yZSB0byB0aGUgc3RhY2suCisKK2ludCBzdWJjaF9kZW11eF9pbihteCwgY29uc3QgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4pOworCXJlY2VpdmUgJ2xlbicgYnl0ZXMgZnJvbSBhIGdpdmVuIEUxIHRpbWVzbG90IChUUkFVIGZyYW1lcykKKworaW50IHN1YmNoYW5fbXV4X291dChteCwgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4pOworCW9idGFpbiAnbGVuJyBieXRlcyBvZiBvdXRwdXQgZGF0YSB0byBiZSBzZW50IG9uIEUxIHRpbWVzbG90CisKK0ludHJmYWNlIGJ5IElucHV0IENvcmUgZm9yIElucHV0IFBsdWdpbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworaW50IGJ0c2xpbmtfcmVnaXN0ZXJfcGx1Z2luKCk7CisKKworQ29uZmlndXJhdGlvbiBmb3IgdGhlIEUxIGlucHV0IG1vZHVsZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitCVFMKKwlCVFMgbnVtYmVyCisJbnVtYmVyIG9mIFRSWAorCU9NTCBsaW5rCisJCUUxIGxpbmUgbnVtYmVyCisJCXRpbWVzbG90IG51bWJlcgorCQlbc3Vic2xvdCBudW1iZXJdCisJCVNBUEkKKwkJVEVJCisJZm9yIGVhY2ggVFJYCisJCVJTTCBsaW5rCisJCQlFMSBsaW5lIG51bWJlcgorCQkJdGltZXNsb3QgbnVtYmVyCisJCQlbc3Vic2xvdCBudW1iZXJdCisJCQlTQVBJCisJCQlURUkKKwkJZm9yIGVhY2ggVFMKKwkJCUUxIGxpbmUgbnVtYmVyCisJCQl0aW1lc2xvdCBudW1iZXIKKwkJCXN1YnNsb3QgbnVtYmVyCisKKworRTEgaW5wdXQgbW9kdWxlIGRhdGEgbW9kZWwKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCitlbnVtIGUxaW5wX3NpZ25fdHlwZSB7CisJRTFJTlBfU0lHTl9OT05FLAorCUUxSU5QX1NJR05fT01MLAorCUUxSU5QX1NJR05fUlNMLAorfTsKKworc3RydWN0IGUxaW5wX3NpZ25fbGluayB7CisJLyogbGlzdCBvZiBzaWduYWxsaW5nIGxpbmtzICovCisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKworCWVudW0gZTFpbnBfc2lnbl90eXBlIHR5cGU7CisKKwkvKiB0cnggZm9yIG1zZy0+dHJ4IG9mIHJlY2VpdmVkIG1zZ3MgKi8JCisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisKKwkvKiBtc2diIHF1ZXVlIG9mIHRvLWJlLXRyYW5zbWl0dGVkIG1zZ3MgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCB0eF9saXN0OworCisJLyogU0FQSSBhbmQgVEVJIG9uIHRoZSBFMSBUUyAqLworCXVfaW50OF90IHNhcGk7CisJdV9pbnQ4X3QgdGVpOworfQorCitlbnVtIGUxaW5wX3RzX3R5cGUgeworCUUxSU5QX1RTX1RZUEVfTk9ORSwKKwlFMUlOUF9UU19UWVBFX1NJR04sCisJRTFJTlBfVFNfVFlQRV9UUkFVLAorfTsKKworLyogQSB0aW1lc2xvdCBpbiB0aGUgRTEgaW50ZXJmYWNlICovCitzdHJ1Y3QgZTFpbnBfdHMgeworCWVudW0gZTFpbnBfdHNfdHlwZSB0eXBlOworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBsbGlzdF9oZWFkIHNpZ25fbGlua3M7CisJCX0gc2lnbjsKKwkJc3RydWN0IHsKKwkJCS8qIHN1YmNoYW5uZWwgZGVtdXhlciBmb3IgZnJhbWVzIGZyb20gRTEgKi8KKwkJCXN0cnVjdCBzdWJjaF9kZW11eCBkZW11eDsKKwkJCS8qIHN1YmNoYW5uZWwgbXV4ZXIgZm9yIGZyYW1lcyB0byBFMSAqLworCQkJc3RydWN0IHN1YmNoX211eCBtdXg7CisJCX0gdHJhdTsKKwl9OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCS8qIG1JU0ROIGRyaXZlciBoYXMgb25lIGZkIGZvciBlYWNoIHRzICovCisJCQlzdHJ1Y3QgYnNjX2ZkOworCQl9IG1pc2RuOworCX0gZHJpdmVyOworfTsKKworc3RydWN0IGUxaW5wX2xpbmUgeworCXVuc2lnbmVkIGludCBudW07CisJY2hhciAqbmFtZTsKKworCXN0cnVjdCBlMWlucF90cyB0c1tOUl9FMV9UU107CisKKwljaGFyICplMWlucF9kcml2ZXI7CisJdm9pZCAqZHJpdmVyX2RhdGE7Cit9OworCisvKiBDYWxsIGZyb20gdGhlIFN0YWNrOiBjb25maWd1cmF0aW9uIG9mIHRoaXMgVFMgaGFzIGNoYW5nZWQgKi8KK2ludCBlMWlucF91cGRhdGVfdHMoc3RydWN0IGUxaW5wX3RzICp0cyk7CisKKy8qIFJlY2VpdmUgYSBwYWNrZXQgZnJvbSB0aGUgRTEgZHJpdmVyICovCitpbnQgZTFpbnBfcnhfdHMoc3RydWN0IGUxaW5wX3RzICp0cywgc3RydWN0IG1zZ2IgKm1zZywKKwkJdV9pbnQ4X3QgdGVpLCB1X2ludDhfdCBzYXBpKTsKKworLyogU2VuZCBhIHBhY2tldCwgY2FsbGJhY2sgZnVuY3Rpb24gaW4gdGhlIGRyaXZlciAqLworaW50IGUxZHJpdmVyX3R4X3RzKHN0cnVjdCBlMWlucF90cyAqdHMsIHN0cnVjdCBtc2diICptc2cpCisKKworc3RydWN0IGUxaW5wX2RyaXZlciB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgKCp3YW50X3dyaXRlKShzdHJ1Y3QgZTFpbnBfdHMgKnRzKTsKK307CmRpZmYgLS1naXQgYS9vcGVuYnNjL2RvYy9nc20taG9wcGluZy50eHQgYi9vcGVuYnNjL2RvYy9nc20taG9wcGluZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxMDkzOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvZG9jL2dzbS1ob3BwaW5nLnR4dApAQCAtMCwwICsxLDU0IEBACithY2NvcmRpbmcgdG8gR1NNIDA1LjAyOgorCitnZW5lcmFsIHBhcmFtZXRlcnMgZnJvbSBDQ0NIOgorKiBDQSBjZWxsIGFsbG9jYXRpb24gb2YgQVJGQ04ncyAoU3lzdGVtIEluZm9ybWF0aW9uIC8gQkNDSCkKKyogRk46IFRETUEgZnJhbWUgbnVtYmVyICh0MSx0Mix0MycpIGluIFNDSAorCitzcGVjaWZpYyBwYXJhbWV0ZXJzIGZyb20gY2hhbm5lbCBhc3NpZ25tZW50OgorKiBNQTogbW9iaWxlIGFsbG9jYXRpb24sIGRlZmluZXMgc2V0IG9mIEFSRkNOJ3MsIHVwIHRvIDY0CisqIE1BSU86IGluZGV4CisqIEhTTjogaG9wcGluZyBzZXF1ZW5jZSBnZW5lcmF0b3IgbnVtYmVyICgwLi42NCkKKworCitob3BwaW5nIHNlcXVlbmNlIGdlbmVyYXRpb24gKDYuMi4zKToKKwordV9pbnQ4X3Qgcm50YWJsZVsxMTRdID0geworCSA0OCwgIDk4LCAgNjMsICAgMSwgIDM2LCAgOTUsICA3OCwgMTAyLCAgOTQsICA3MywKKwkgIDAsICA2NCwgIDI1LCAgODEsICA3NiwgIDU5LCAxMjQsICAyMywgMTA0LCAxMDAsCisJMTAxLCAgNDcsIDExOCwgIDg1LCAgMTgsICA1NiwgIDk2LCAgODYsICA1NCwgICAyLAorCSA4MCwgIDM0LCAxMjcsICAxMywgICA2LCAgODksICA1NywgMTAzLCAgMTIsICA3NCwKKwkgNTUsIDExMSwgIDc1LCAgMzgsIDEwOSwgIDcxLCAxMTIsICAyOSwgIDExLCAgODgsCisJIDg3LCAgMTksICAgMywgIDY4LCAxMTAsICAyNiwgIDMzLCAgMzEsICAgOCwgIDQ1LAorCSA4MiwgIDU4LCAgNDAsIDEwNywgIDMyLCAgIDUsIDEwNiwgIDkyLCAgNjIsICA2NywKKwkgNzcsIDEwOCwgMTIyLCAgMzcsICA2MCwgIDY2LCAxMjEsICA0MiwgIDUxLCAxMjYsCisJMTE3LCAxMTQsICAgNCwgIDkwLCAgNDMsICA1MiwgIDUzLCAxMTMsIDEyMCwgIDcyLAorCSAxNiwgIDQ5LCAgIDcsICA3OSwgMTE5LCAgNjEsICAyMiwgIDg0LCAgIDksICA5NywKKwkxMjUsICA5OSwgIDE3LCAxMjMKK307CisKKy8qIG1haT0wIHJlcHJlc2VudHMgbG93ZXN0IEFSRkNOIGluIHRoZSBNQSAqLworCisKK3VfaW50OF90IGhvcHBpbmdfbWFpKHVfaW50OF90IGhzbiwgdV9pbnQzMl90IGZuLCB1X2ludDhfdCBtYWlvLAorCQkgICAgIHVfaW50OF90IHQxLCB1X2ludDhfdCB0MiwgdV9pbnQ4X3QgdDNfKQoreworCXVfaW50OF90IG1haTsKKworCWlmIChoc24gPT0gMCkgLyogY3ljbGljIGhvcHBpbmcgKi8KKwkJbWFpID0gKGZuICsgbWFpbykgJSBuOworCWVsc2UgeworCQl1X2ludDMyX3QgbSwgbV8sIHRfLCBzOworCisJCW0gPSB0MiArIHJudGFibGVbKGhzbiB4b3IgKHQxICUgNjQpKSArIHQzXTsKKwkJbV8gPSBtICUgKDJeTkJJTik7CisJCXRfID0gdDMgJSAoMl5OQklOKTsKKwkJaWYgKG1fIDwgbiB0aGVuKQorCQkJcyA9IG1fOworCQllbHNlCisJCQlzID0gKG1fICsgdF8pICUgbjsKKwkJbWFpID0gKHMgKyBtYWlvKSAlIG47CisJfQorCisJcmV0dXJuIG1haTsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9kb2MvaGFuZG92ZXIudHh0IGIvb3BlbmJzYy9kb2MvaGFuZG92ZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMTllODcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2RvYy9oYW5kb3Zlci50eHQKQEAgLTAsMCArMSw4OSBAQAorSWRlYXMgYWJvdXQgYSBoYW5kb3ZlciBhbGdvcml0aG0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBpcyBtb3N0bHkgYmFzZWQgb24gdGhlIHJlc3VsdHMgcHJlc2VudGVkIGluIENoYXB0ZXIgOCBvZiAiUGVyZm9ybWFuY2UKK0VuaGFuY2VtZW50cyBpbiBhIEZyZXF1ZW5jeSBIb3BwaW5nIEdTTSBOZXR3b3JrIiBieSBUaG9tYXMgVG9mdGVnYWFyZCBOaWVsc2VuCithbmQgSm9lcm9lbiBXaWdhcmQuIAorCisKKz09PSBSZWFzb25zIGZvciBwZXJmb3JtaW5nIGhhbmRvdmVyID09PQorCitTZWN0aW9uIDIuMS4xOiBIYW5kb3ZlciB1c2VkIGluIHRoZWlyIENBUEFDSVRZIHNpbXVsYXRpb246CisKKzEpIEludGVyZmVyZW5jZSBIYW5kb3ZlcgorCitBdmVyYWdlIFJYTEVWIGlzIHNhdGlzZmFjdG9yeSBoaWdoLCBidXQgYXZlcmFnZSBSWFFVQUwgdG9vIGxvdyBpbmRpY2F0ZXMKK2ludGVyZmVyZW5jZSB0byB0aGUgY2hhbm5lbC4gIEhhbmRvdmVyIHNob3VsZCBiZSBtYWRlLgorCisyKSBCYWQgUXVhbGl0eQorCitBdmVyYWdlZCBSWFFVQUwgaXMgbG93ZXIgdGhhbiBhIHRocmVzaG9sZAorCiszKSBMb3cgTGV2ZWwgLyBTaWduYWwgU3RyZW5ndGgKKworQXZlcmFnZSBSWExFViBpcyBsb3dlciB0aGFuIGEgdGhyZXNob2xkCisKKzQpIERpc3RhbmNlIEhhbmRvdmVyCisKK01TIGlzIHRvbyBmYXIgYXdheSBmcm9tIGEgY2VsbCAobWVhc3VyZWQgYnkgVEEpCisKKzUpIFBvd2VyIGJ1ZGdldCAvIEJldHRlciBDZWxsCisKK1JYIExldmVsIG9mIG5laWdoYm9yIGNlbGwgaXMgYXQgbGVhc3QgIkhPIE1hcmdpbiBkQiIgZEIgYmV0dGVyIHRoYW4gdGhlCitjdXJyZW50IHNlcnZpbmcgY2VsbC4KKworPT09IElkZWFsIHBhcmFtZXRlcnMgZm9yIEhPIGFsZ29yaXRobSA9PT0KKworQ2hhcHRlciA4LCBTZWN0aW9uIDIuMiwgVGFibGUgMjQ6CisKK1dpbmRvdyBSWExFViBhdmVyYWdpbmc6CQkxMCBTQUNDSCBmcmFtZXMgKG5vIHdlaWdodGluZykKK1dpbmRvdyBSWFFVQUwgYXZlcmFnaW5nOgkxIFNBQ0NIIGZyYW1lIChubyBhdmVyYWdpbmcpCitMZXZlbCBUaHJlYXNob2xkOgkJMSBvZiB0aGUgbGFzdCAxIEFWLVJYTEVWIHZhbHVlcyA8IC0xMTBkQm0KK1F1YWxpdHkgVGhyZXNob2xkOgkJMyBvZiB0aGUgbGFzdCA0IEFWLVJYUVVBTCB2YWx1ZXMgPj0gNQorSW50ZXJmZXJlbmNlIFRocmVzaG9sZDoJCTEgb2YgdGhlIGxhc3QgQVYtUlhMRVYgPiAtODUgZEJtICYKKwkJCQkzIG9mIHRoZSBsYXN0IDQgQVYtUlhRVUFMIHZhbHVlcyA+PSA1CitQb3dlciBCdWRnZXQ6CQkJTGV2ZWwgb2YgbmVpZ2hib3IgY2VsbCA+IDMgZEIgYmV0dGVyCitQb3dlciBCdWRnZXQgSW50ZXJ2YWw6CQlFdmVyeSA2IFNBQ0NIIGZyYW1lcyAoNiBzZWNvbmRzID8hPykKK0Rpc3RhbmNlIEhhbmRvdmVyOgkJRGlzYWJsZWQKK0V2YWx1YXRpb24gcnVsZSAxOgkJUlhMRVYgb2YgdGhlIGNhbmRpZGF0ZSBjZWxsIGEgdGxlYXN0IC0xMDQgZEJtCitFdmFsdWF0aW9uIHJ1bGUgMjoJCUxldmVsIG9mIGNhbmRpZGF0ZSBjZWxsID4gM2RCIGJldHRlciBvd24gY2VsbAorVGltZXIgU3VjY2Vzc2Z1bCBITzoJCTUgU0FDQ0ggZnJhbWVzCitUaW1lciBVbnN1Y2Nlc3NmdWwgSE86CQkxIFNBQ0NIIGZyYW1lCisKK0luIGEgbm9uLWZyZXF1ZW5jeSBob3BwaW5nIGNhc2UsIFJYUVVBTCB0aHJlc2hvbGQgY2FuIGJlIGRlY3JlYXNlZCB0bworUlhMRVYgPj0gNAorCitXaGVuIGZyZXF1ZW5jeSBob3BwaW5nIGlzIGVuYWJsZWQsIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBwYXJhbWV0ZXJzCitzaG91bGQgYmUgaW50cm9kdWNlZDoKKworKiBObyBpbnRyYS1jZWxsIGhhbmRvdmVyCisqIFVzZSBhIEhPIE1hcmdpbiBvZiAyZEIKKworPT09IEhhbmRvdmVyIENoYW5uZWwgUmVzZXJ2YXRpb24gPT09CisKK0luIGxvYWRlZCBuZXR3b3JrLCBlYWNoIGNlbGwgc2hvdWxkIHJlc2VydmUgc29tZSBjaGFubmVscyBmb3IgaGFuZG92ZXJzLAorcmF0aGVyIHRoYW4gdXNpbmcgYWxsIG9mIHRoZW0gZm9yIG5ldyBjYWxsIGVzdGFibGlzaG1lbnQuICBUaGlzIHJlZHVjZXMgdGhlCituZWVkIHRvIGRyb3AgY2FsbHMgZHVlIHRvIGZhaWxpbmcgaGFuZG92ZXJzLCBhdCB0aGUgZXhwZW5zZSBvZiBmYWlsaW5nIG5ldyBjYWxsCithdHRlbXB0cy4KKworPT09IER5bmFtaWMgSE8gTWFyZ2luID09PQorCitUaGUgaGFuZG92ZXIgbWFyZ2luIChoeXN0ZXJlc2lzKSBzaG91bGQgZGVwZW5kIG9uIHRoZSBSWFFVQUwuIE9wdGltYWwgcmVzdWx0cword2VyZSBhY2hpZXZlZCB3aXRoIHRoZSBmb2xsb3dpbmcgc2V0dGluZ3M6CisqIFJYUVVBTCA8PSA0OiA5IGRCCisqIFJYUVVBTCA9PSA1OiA2IGRCCisqIFJYUVVBTCA+PSA2OiAxIGRCCisKKworCis9PSBBY3R1YWwgSGFuZG92ZXIgb24gYSBwcm90b2NvbCBsZXZlbCA9PQorCitBZnRlciB0aGUgQlNDIGhhcyBkZWNpZGVkIGEgaGFuZG92ZXIgc2hhbGwgYmUgZG9uZSwgaXQgaGFzIHRvCisKKyMgYWxsb2NhdGUgYSBjaGFubmVsIGF0IHRoZSBuZXcgQlRTCisjIGFsbG9jYXRlIGEgaGFuZG92ZXIgcmVmZXJlbmNlCisjIGFjdGl2YXRlIHRoZSBjaGFubmVsIG9uIHRoZSBCVFMgc2lkZSB1c2luZyBSU0wgQ0hBTk5FTCBBQ1RJVkFUSU9OLAorICBpbmRpY2F0aW5nIHRoZSBITyByZWZlcmVuY2UKKyMgQlRTIHJlc3BvbmRzIHdpdGggQ0hBTiBBQ1QgQUNLLCBpbmNsdWRpbmcgR1NNIGZyYW1lIG51bWJlcgorIyBCU0Mgc2VuZHMgMDQuMDggSE8gQ01EIHRvIE1TIHVzaW5nIG9sZCBCVFMKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9kb2Mvb21sLWludGVyZmFjZS50eHQgYi9vcGVuYnNjL2RvYy9vbWwtaW50ZXJmYWNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGRjZmVhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9kb2Mvb21sLWludGVyZmFjZS50eHQKQEAgLTAsMCArMSwyMSBAQAorb21sIGludGVyZmFjZSBkZXNpZ24gbm90ZXMKKworcHJvYmxlbXM6CisKKyogdGhlcmUgaXMgbm8gd2F5IGhvdyB0byB0YWcgYSBjb21tYW5kIHNlbnQgdG8gdGhlIEJUUywgd2l0aCB0aGUgcmVzcG9uc2UKKyAgaGF2aW5nIHRoZSBzYW1lIHRhZyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgY29tbWFuZAorKiB0aGVyZWZvcmUsIHdlIGNhbiBoYXZlIGUuZy4gYm90aCB0aGUgQlNDIGFuZCB0aGUgT01MIGludGVyZmFjZSBzZW5kIGEKKyAgU0VUIEFUVFJJQlVURSBtZXNzYWdlLCB3aGVyZSB0aGUgcmVzcG9uc2VzIHdvdWxkIGVuZCB1cCBhdCB0aGUgd3JvbmcKKyAgcXVlcnkuCisKK3RoZSBvbmx5IHBvc3NpYmxlIHNvbHV0aW9ucyBpIGNhbiBpbWFnaW5lOgorKiBoYXZlIHNvbWUga2luZCBvZiBleGNsdXNpdmUgbG9ja2luZywgd2hlcmUgdGhlIE9NTCBpbnRlcmZhY2UgZ2V0cyBibG9ja2VkCisgIGZyb20gdGhlIEJTQyBhbmQgaXMgZXhjbHVzaXZlbHkgYXNzaWduZWQgdG8gdGhlIE9NTCBjb25zb2xlIHVudGlsIGFsbCBjb21tYW5kcworICBvZiB0aGUgT01MIGNvbnNvbGUgaGF2ZSB0ZXJtaW5hdGVkLiAgVGhpcyBjYW4gZWl0aGVyIGJlIGRvbmUgZXhwbGljaXRseQorICBkeW5hbWljYWxseSBvciBvbiBkZW1hbmQKKworKiB1c2UgdGhlIE9NTCBpbnRlcmZhY2Ugc3luY2hyb25vdXNseSwgaS5lLiBhbHdheXMgd2FpdCBmb3IgdGhlIHJlc3BvbnNlIGZyb20KKyAgdGhlIEJUUyBiZWZvcmUKKworKiB1bmlsYXRlcmFsIC8gdW5zb2xpY2l0ZWQgbWVzc2FnZXMgbmVlZCB0byBiZSBicm9hZGNhc3RlZCB0byBib3RoIHRoZSBCU0MgYW5kCisgIHRoZSBPTUwgY29uc29sZQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9naXQtdmVyc2lvbi1nZW4gYi9vcGVuYnNjL2dpdC12ZXJzaW9uLWdlbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMmFkNGE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9naXQtdmVyc2lvbi1nZW4KQEAgLTAsMCArMSwxNTEgQEAKKyMhL2Jpbi9zaAorIyBQcmludCBhIHZlcnNpb24gc3RyaW5nLgorc2NyaXB0dmVyc2lvbj0yMDEwLTAxLTI4LjAxCisKKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisjIFRoaXMgc2NyaXB0IGlzIGRlcml2ZWQgZnJvbSBHSVQtVkVSU0lPTi1HRU4gZnJvbSBHSVQ6IGh0dHA6Ly9naXQub3IuY3ovLgorIyBJdCBtYXkgYmUgcnVuIHR3byB3YXlzOgorIyAtIGZyb20gYSBnaXQgcmVwb3NpdG9yeSBpbiB3aGljaCB0aGUgImdpdCBkZXNjcmliZSIgY29tbWFuZCBiZWxvdworIyAgIHByb2R1Y2VzIHVzZWZ1bCBvdXRwdXQgKHRodXMgcmVxdWlyaW5nIGF0IGxlYXN0IG9uZSBzaWduZWQgdGFnKQorIyAtIGZyb20gYSBub24tZ2l0LXJlcG8gZGlyZWN0b3J5IGNvbnRhaW5pbmcgYSAudGFyYmFsbC12ZXJzaW9uIGZpbGUsIHdoaWNoCisjICAgcHJlc3VtZXMgdGhpcyBzY3JpcHQgaXMgaW52b2tlZCBsaWtlICIuL2dpdC12ZXJzaW9uLWdlbiAudGFyYmFsbC12ZXJzaW9uIi4KKworIyBJbiBvcmRlciB0byB1c2UgaW50cmEtdmVyc2lvbiBzdHJpbmdzIGluIHlvdXIgcHJvamVjdCwgeW91IHdpbGwgbmVlZCB0d28KKyMgc2VwYXJhdGUgZ2VuZXJhdGVkIHZlcnNpb24gc3RyaW5nIGZpbGVzOgorIworIyAudGFyYmFsbC12ZXJzaW9uIC0gcHJlc2VudCBvbmx5IGluIGEgZGlzdHJpYnV0aW9uIHRhcmJhbGwsIGFuZCBub3QgaW4KKyMgICBhIGNoZWNrZWQtb3V0IHJlcG9zaXRvcnkuICBDcmVhdGVkIHdpdGggY29udGVudHMgdGhhdCB3ZXJlIGxlYXJuZWQgYXQKKyMgICB0aGUgbGFzdCB0aW1lIGF1dG9jb25mIHdhcyBydW4sIGFuZCB1c2VkIGJ5IGdpdC12ZXJzaW9uLWdlbi4gIE11c3Qgbm90CisjICAgYmUgcHJlc2VudCBpbiBlaXRoZXIgJChzcmNkaXIpIG9yICQoYnVpbGRkaXIpIGZvciBnaXQtdmVyc2lvbi1nZW4gdG8KKyMgICBnaXZlIGFjY3VyYXRlIGFuc3dlcnMgZHVyaW5nIG5vcm1hbCBkZXZlbG9wbWVudCB3aXRoIGEgY2hlY2tlZCBvdXQgdHJlZSwKKyMgICBidXQgbXVzdCBiZSBwcmVzZW50IGluIGEgdGFyYmFsbCB3aGVuIHRoZXJlIGlzIG5vIHZlcnNpb24gY29udHJvbCBzeXN0ZW0uCisjICAgVGhlcmVmb3JlLCBpdCBjYW5ub3QgYmUgdXNlZCBpbiBhbnkgZGVwZW5kZW5jaWVzLiAgR05VbWFrZWZpbGUgaGFzCisjICAgaG9va3MgdG8gZm9yY2UgYSByZWNvbmZpZ3VyZSBhdCBkaXN0cmlidXRpb24gdGltZSB0byBnZXQgdGhlIHZhbHVlCisjICAgY29ycmVjdCwgd2l0aG91dCBwZW5hbGl6aW5nIG5vcm1hbCBkZXZlbG9wbWVudCB3aXRoIGV4dHJhIHJlY29uZmlndXJlcy4KKyMKKyMgLnZlcnNpb24gLSBwcmVzZW50IGluIGEgY2hlY2tlZC1vdXQgcmVwb3NpdG9yeSBhbmQgaW4gYSBkaXN0cmlidXRpb24KKyMgICB0YXJiYWxsLiAgVXNhYmxlIGluIGRlcGVuZGVuY2llcywgcGFydGljdWxhcmx5IGZvciBmaWxlcyB0aGF0IGRvbid0CisjICAgd2FudCB0byBkZXBlbmQgb24gY29uZmlnLmggYnV0IGRvIHdhbnQgdG8gdHJhY2sgdmVyc2lvbiBjaGFuZ2VzLgorIyAgIERlbGV0ZSB0aGlzIGZpbGUgcHJpb3IgdG8gYW55IGF1dG9jb25mIHJ1biB3aGVyZSB5b3Ugd2FudCB0byByZWJ1aWxkCisjICAgZmlsZXMgdG8gcGljayB1cCBhIHZlcnNpb24gc3RyaW5nIGNoYW5nZTsgYW5kIGxlYXZlIGl0IHN0YWxlIHRvCisjICAgbWluaW1pemUgcmVidWlsZCB0aW1lIGFmdGVyIHVucmVsYXRlZCBjaGFuZ2VzIHRvIGNvbmZpZ3VyZSBzb3VyY2VzLgorIworIyBJdCBpcyBwcm9iYWJseSB3aXNlIHRvIGFkZCB0aGVzZSB0d28gZmlsZXMgdG8gLmdpdGlnbm9yZSwgc28gdGhhdCB5b3UKKyMgZG9uJ3QgYWNjaWRlbnRhbGx5IGNvbW1pdCBlaXRoZXIgZ2VuZXJhdGVkIGZpbGUuCisjCisjIFVzZSB0aGUgZm9sbG93aW5nIGxpbmUgaW4geW91ciBjb25maWd1cmUuYWMsIHNvIHRoYXQgJChWRVJTSU9OKSB3aWxsCisjIGF1dG9tYXRpY2FsbHkgYmUgdXAtdG8tZGF0ZSBlYWNoIHRpbWUgY29uZmlndXJlIGlzIHJ1biAoYW5kIG5vdGUgdGhhdAorIyBzaW5jZSBjb25maWd1cmUuYWMgbm8gbG9uZ2VyIGluY2x1ZGVzIGEgdmVyc2lvbiBzdHJpbmcsIE1ha2VmaWxlIHJ1bGVzCisjIHNob3VsZCBub3QgZGVwZW5kIG9uIGNvbmZpZ3VyZS5hYyBmb3IgdmVyc2lvbiB1cGRhdGVzKS4KKyMKKyMgQUNfSU5JVChbR05VIHByb2plY3RdLAorIyAgICAgICAgIG00X2VzeXNjbWQoW2J1aWxkLWF1eC9naXQtdmVyc2lvbi1nZW4gLnRhcmJhbGwtdmVyc2lvbl0pLAorIyAgICAgICAgIFtidWctcHJvamVjdEBleGFtcGxlXSkKKyMKKyMgVGhlbiB1c2UgdGhlIGZvbGxvd2luZyBsaW5lcyBpbiB5b3VyIE1ha2VmaWxlLmFtLCBzbyB0aGF0IC52ZXJzaW9uCisjIHdpbGwgYmUgcHJlc2VudCBmb3IgZGVwZW5kZW5jaWVzLCBhbmQgc28gdGhhdCAudGFyYmFsbC12ZXJzaW9uIHdpbGwKKyMgZXhpc3QgaW4gZGlzdHJpYnV0aW9uIHRhcmJhbGxzLgorIworIyBCVUlMVF9TT1VSQ0VTID0gJCh0b3Bfc3JjZGlyKS8udmVyc2lvbgorIyAkKHRvcF9zcmNkaXIpLy52ZXJzaW9uOgorIwllY2hvICQoVkVSU0lPTikgPiAkQC10ICYmIG12ICRALXQgJEAKKyMgZGlzdC1ob29rOgorIwllY2hvICQoVkVSU0lPTikgPiAkKGRpc3RkaXIpLy50YXJiYWxsLXZlcnNpb24KKworY2FzZSAkIyBpbgorICAgIDEpIDs7CisgICAgKikgZWNobyAxPiYyICJVc2FnZTogJDAgXCRzcmNkaXIvLnRhcmJhbGwtdmVyc2lvbiI7IGV4aXQgMTs7Citlc2FjCisKK3RhcmJhbGxfdmVyc2lvbl9maWxlPSQxCitubD0nCisnCisKKyMgRmlyc3Qgc2VlIGlmIHRoZXJlIGlzIGEgdGFyYmFsbC1vbmx5IHZlcnNpb24gZmlsZS4KKyMgdGhlbiB0cnkgImdpdCBkZXNjcmliZSIsIHRoZW4gZGVmYXVsdC4KK2lmIHRlc3QgLWYgJHRhcmJhbGxfdmVyc2lvbl9maWxlCit0aGVuCisgICAgdj1gY2F0ICR0YXJiYWxsX3ZlcnNpb25fZmlsZWAgfHwgZXhpdCAxCisgICAgY2FzZSAkdiBpbgorCSokbmwqKSB2PSA7OyAjIHJlamVjdCBtdWx0aS1saW5lIG91dHB1dAorCVswLTldKikgOzsKKwkqKSB2PSA7OworICAgIGVzYWMKKyAgICB0ZXN0IC16ICIkdiIgXAorCSYmIGVjaG8gIiQwOiBXQVJOSU5HOiAkdGFyYmFsbF92ZXJzaW9uX2ZpbGUgc2VlbXMgdG8gYmUgZGFtYWdlZCIgMT4mMgorZmkKKworaWYgdGVzdCAtbiAiJHYiCit0aGVuCisgICAgOiAjIHVzZSAkdgorZWxpZiB0ZXN0IC1kIC4vLi4vLmdpdCBcCisgICAgJiYgdj1gZ2l0IGRlc2NyaWJlIC0tYWJicmV2PTQgLS1tYXRjaD0ndionIEhFQUQgMj4vZGV2L251bGwgXAorCSAgfHwgZ2l0IGRlc2NyaWJlIC0tYWJicmV2PTQgSEVBRCAyPi9kZXYvbnVsbGAgXAorICAgICYmIGNhc2UgJHYgaW4KKwkgWzAtOV0qKSA7OworCSB2WzAtOV0qKSA7OworCSAqKSAoZXhpdCAxKSA7OworICAgICAgIGVzYWMKK3RoZW4KKyAgICAjIElzIHRoaXMgYSBuZXcgZ2l0IHRoYXQgbGlzdHMgbnVtYmVyIG9mIGNvbW1pdHMgc2luY2UgdGhlIGxhc3QKKyAgICAjIHRhZyBvciB0aGUgcHJldmlvdXMgb2xkZXIgdmVyc2lvbiB0aGF0IGRpZCBub3Q/CisgICAgIyAgIE5ld2VyOiB2Ni4xMC03Ny1nMGY4ZmFlYgorICAgICMgICBPbGRlcjogdjYuMTAtZzBmOGZhZWIKKyAgICBjYXNlICR2IGluCisJKi0qLSopIDogZ2l0IGRlc2NyaWJlIGlzIG9rYXkgdGhyZWUgcGFydCBmbGF2b3IgOzsKKwkqLSopCisJICAgIDogZ2l0IGRlc2NyaWJlIGlzIG9sZGVyIHR3byBwYXJ0IGZsYXZvcgorCSAgICAjIFJlY3JlYXRlIHRoZSBudW1iZXIgb2YgY29tbWl0cyBhbmQgcmV3cml0ZSBzdWNoIHRoYXQgdGhlCisJICAgICMgcmVzdWx0IGlzIHRoZSBzYW1lIGFzIGlmIHdlIHdlcmUgdXNpbmcgdGhlIG5ld2VyIHZlcnNpb24KKwkgICAgIyBvZiBnaXQgZGVzY3JpYmUuCisJICAgIHZ0YWc9YGVjaG8gIiR2IiB8IHNlZCAncy8tLiovLydgCisJICAgIG51bWNvbW1pdHM9YGdpdCByZXYtbGlzdCAiJHZ0YWciLi5IRUFEIHwgd2MgLWxgCisJICAgIHY9YGVjaG8gIiR2IiB8IHNlZCAicy9cKC4qXCktXCguKlwpL1wxLSRudW1jb21taXRzLVwyLyJgOworCSAgICA7OworICAgIGVzYWMKKworICAgICMgQ2hhbmdlIHRoZSBmaXJzdCAnLScgdG8gYSAnLicsIHNvIHZlcnNpb24tY29tcGFyaW5nIHRvb2xzIHdvcmsgcHJvcGVybHkuCisgICAgIyBSZW1vdmUgdGhlICJnIiBpbiBnaXQgZGVzY3JpYmUncyBvdXRwdXQgc3RyaW5nLCB0byBzYXZlIGEgYnl0ZS4KKyAgICB2PWBlY2hvICIkdiIgfCBzZWQgJ3MvLS8uLztzL1woLipcKS1nL1wxLS8nYDsKK2Vsc2UKKyAgICB2PVVOS05PV04KK2ZpCisKK3Y9YGVjaG8gIiR2IiB8c2VkICdzL152Ly8nYAorCisjIERvbid0IGRlY2xhcmUgYSB2ZXJzaW9uICJkaXJ0eSIgbWVyZWx5IGJlY2F1c2UgYSB0aW1lIHN0YW1wIGhhcyBjaGFuZ2VkLgorZ2l0IHN0YXR1cyA+IC9kZXYvbnVsbCAyPiYxCisKK2RpcnR5PWBzaCAtYyAnZ2l0IGRpZmYtaW5kZXggLS1uYW1lLW9ubHkgSEVBRCcgMj4vZGV2L251bGxgIHx8IGRpcnR5PQorY2FzZSAiJGRpcnR5IiBpbgorICAgICcnKSA7OworICAgICopICMgQXBwZW5kIHRoZSBzdWZmaXggb25seSBpZiB0aGVyZSBpc24ndCBvbmUgYWxyZWFkeS4KKwljYXNlICR2IGluCisJICAqLWRpcnR5KSA7OworCSAgKikgdj0iJHYtZGlydHkiIDs7CisJZXNhYyA7OworZXNhYworCisjIE9taXQgdGhlIHRyYWlsaW5nIG5ld2xpbmUsIHNvIHRoYXQgbTRfZXN5c2NtZCBjYW4gdXNlIHRoZSByZXN1bHQgZGlyZWN0bHkuCitlY2hvICIkdiIgfCB0ciAtZCAnXDAxMicKKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC1lbmQ6ICIkIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL2luY2x1ZGUvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRhY2MyMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDMgQEAKK1NVQkRJUlMgPSBvcGVuYnNjIHNjY3AKKworbm9pbnN0X0hFQURFUlMgPSBtSVNETmlmLmggY29tcGF0X2FmX2lzZG4uaApkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL2NvbXBhdF9hZl9pc2RuLmggYi9vcGVuYnNjL2luY2x1ZGUvY29tcGF0X2FmX2lzZG4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmNiZmIzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL2NvbXBhdF9hZl9pc2RuLmgKQEAgLTAsMCArMSwzOSBAQAorI2lmZGVmIE1JU0ROX09MRF9BRl9DT01QQVRJQklMSVRZCisjdW5kZWYgQUZfSVNETgorI3VuZGVmIFBGX0lTRE4KKworZXh0ZXJuCWludAlBRl9JU0ROOworI2RlZmluZSBQRl9JU0ROCUFGX0lTRE4KKworaW50CUFGX0lTRE47CisKKyNlbmRpZgorCitleHRlcm4gdm9pZCBpbml0X2FmX2lzZG4odm9pZCk7CisKKyNpZmRlZiBBRl9DT01QQVRJQklMSVRZX0ZVTkMKKyNpZmRlZiBNSVNETl9PTERfQUZfQ09NUEFUSUJJTElUWQordm9pZCBpbml0X2FmX2lzZG4odm9pZCkKK3sKKwlpbnQJczsKKworCS8qIHRlc3QgZm9yIG5ldyB2YWx1ZSAqLworCUFGX0lTRE4gPSAzNDsKKwlzID0gc29ja2V0KEFGX0lTRE4sIFNPQ0tfUkFXLCBJU0ROX1BfQkFTRSk7CisJaWYgKHMgPj0gMCkgeworCQljbG9zZShzKTsKKwkJcmV0dXJuOworCX0KKwlBRl9JU0ROID0gMjc7CisJcyA9IHNvY2tldChBRl9JU0ROLCBTT0NLX1JBVywgSVNETl9QX0JBU0UpOworCWlmIChzID49IDApIHsKKwkJY2xvc2Uocyk7CisJCXJldHVybjsKKwl9Cit9CisjZWxzZQordm9pZCBpbml0X2FmX2lzZG4odm9pZCkKK3sKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvbUlTRE5pZi5oIGIvb3BlbmJzYy9pbmNsdWRlL21JU0ROaWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTA2NWQyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL21JU0ROaWYuaApAQCAtMCwwICsxLDM4NyBAQAorLyoKKyAqCisgKiBBdXRob3IJS2Fyc3RlbiBLZWlsIDxra2VpbEBub3ZlbGwuY29tPgorICoKKyAqIENvcHlyaWdodCAyMDA4ICBieSBLYXJzdGVuIEtlaWwgPGtrZWlsQG5vdmVsbC5jb20+CisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExFU1NFUiBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgKiB2ZXJzaW9uIDIuMSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTEVTU0VSIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBtSVNETklGX0gKKyNkZWZpbmUgbUlTRE5JRl9ICisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpZmRlZiBsaW51eAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2Vycm5vLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2VuZGlmCisKKy8qCisgKiBBQkkgVmVyc2lvbiAzMiBiaXQKKyAqCisgKiA8OCBiaXQ+IE1ham9yIHZlcnNpb24KKyAqCQktIGNoYW5nZWQgaWYgYW55IGludGVyZmFjZSBiZWNvbWUgYmFja3dhcmRzIGluY29tcGF0aWJsZQorICoKKyAqIDw4IGJpdD4gTWlub3IgdmVyc2lvbgorICogICAgICAgICAgICAgIC0gY2hhbmdlZCBpZiBhbnkgaW50ZXJmYWNlIGlzIGV4dGVuZGVkIGJ1dCBiYWNrd2FyZHMgY29tcGF0aWJsZQorICoKKyAqIDwxNiBiaXQ+IFJlbGVhc2UgbnVtYmVyCisgKiAgICAgICAgICAgICAgLSBzaG91bGQgYmUgaW5jcmVtZW50ZWQgb24gZXZlcnkgY2hlY2tpbgorICovCisjZGVmaW5lCU1JU0ROX01BSk9SX1ZFUlNJT04JMQorI2RlZmluZQlNSVNETl9NSU5PUl9WRVJTSU9OCTEKKyNkZWZpbmUgTUlTRE5fUkVMRUFTRQkJMjAKKworLyogcHJpbWl0aXZlcyBmb3IgaW5mb3JtYXRpb24gZXhjaGFuZ2UKKyAqIGdlbmVyZWxsIGZvcm1hdAorICogPDE2ICBiaXQgIDAgPgorICogPDggIGJpdCBjb21tYW5kPgorICogICAgQklUIDggPSAxIExBWUVSIHByaXZhdGUKKyAqICAgIEJJVCA3ID0gMSBhbnN3ZXIKKyAqICAgIEJJVCA2ID0gMSBEQVRBCisgKiA8OCAgYml0IHRhcmdldCBsYXllciBtYXNrPgorICoKKyAqIExheWVyID0gMDAgaXMgcmVzZXJ2ZWQgZm9yIGdlbmVyYWwgY29tbWFuZHMKKyAgIExheWVyID0gMDEgIEwyIC0+IEhXCisgICBMYXllciA9IDAyICBIVyAtPiBMMgorICAgTGF5ZXIgPSAwNCAgTDMgLT4gTDIKKyAgIExheWVyID0gMDggIEwyIC0+IEwzCisgKiBMYXllciA9IEZGIGlzIHJlc2VydmVkIGZvciBicm9hZGNhc3QgY29tbWFuZHMKKyAqLworCisjZGVmaW5lIE1JU0ROX0NNRE1BU0sJCTB4ZmYwMAorI2RlZmluZSBNSVNETl9MQVlFUk1BU0sJCTB4MDBmZgorCisvKiBnZW5lcmVsbCBjb21tYW5kcyAqLworI2RlZmluZSBPUEVOX0NIQU5ORUwJCTB4MDEwMAorI2RlZmluZSBDTE9TRV9DSEFOTkVMCQkweDAyMDAKKyNkZWZpbmUgQ09OVFJPTF9DSEFOTkVMCQkweDAzMDAKKyNkZWZpbmUgQ0hFQ0tfREFUQQkJMHgwNDAwCisKKy8qIGxheWVyIDIgLT4gbGF5ZXIgMSAqLworI2RlZmluZSBQSF9BQ1RJVkFURV9SRVEJCTB4MDEwMQorI2RlZmluZSBQSF9ERUFDVElWQVRFX1JFUQkweDAyMDEKKyNkZWZpbmUgUEhfREFUQV9SRVEJCTB4MjAwMQorI2RlZmluZSBNUEhfQUNUSVZBVEVfUkVRCTB4MDUwMQorI2RlZmluZSBNUEhfREVBQ1RJVkFURV9SRVEJMHgwNjAxCisjZGVmaW5lIE1QSF9JTkZPUk1BVElPTl9SRVEJMHgwNzAxCisjZGVmaW5lIFBIX0NPTlRST0xfUkVRCQkweDA4MDEKKworLyogbGF5ZXIgMSAtPiBsYXllciAyICovCisjZGVmaW5lIFBIX0FDVElWQVRFX0lORAkJMHgwMTAyCisjZGVmaW5lIFBIX0FDVElWQVRFX0NORgkJMHg0MTAyCisjZGVmaW5lIFBIX0RFQUNUSVZBVEVfSU5ECTB4MDIwMgorI2RlZmluZSBQSF9ERUFDVElWQVRFX0NORgkweDQyMDIKKyNkZWZpbmUgUEhfREFUQV9JTkQJCTB4MjAwMgorI2RlZmluZSBQSF9EQVRBX0VfSU5ECQkweDMwMDIKKyNkZWZpbmUgTVBIX0FDVElWQVRFX0lORAkweDA1MDIKKyNkZWZpbmUgTVBIX0RFQUNUSVZBVEVfSU5ECTB4MDYwMgorI2RlZmluZSBNUEhfSU5GT1JNQVRJT05fSU5ECTB4MDcwMgorI2RlZmluZSBQSF9EQVRBX0NORgkJMHg2MDAyCisjZGVmaW5lIFBIX0NPTlRST0xfSU5ECQkweDA4MDIKKyNkZWZpbmUgUEhfQ09OVFJPTF9DTkYJCTB4NDgwMgorCisvKiBsYXllciAzIC0+IGxheWVyIDIgKi8KKyNkZWZpbmUgRExfRVNUQUJMSVNIX1JFUQkweDEwMDQKKyNkZWZpbmUgRExfUkVMRUFTRV9SRVEJCTB4MTEwNAorI2RlZmluZSBETF9EQVRBX1JFUQkJMHgzMDA0CisjZGVmaW5lIERMX1VOSVREQVRBX1JFUQkJMHgzMTA0CisjZGVmaW5lIERMX0lORk9STUFUSU9OX1JFUQkweDAwMDQKKworLyogbGF5ZXIgMiAtPiBsYXllciAzICovCisjZGVmaW5lIERMX0VTVEFCTElTSF9JTkQJMHgxMDA4CisjZGVmaW5lIERMX0VTVEFCTElTSF9DTkYJMHg1MDA4CisjZGVmaW5lIERMX1JFTEVBU0VfSU5ECQkweDExMDgKKyNkZWZpbmUgRExfUkVMRUFTRV9DTkYJCTB4NTEwOAorI2RlZmluZSBETF9EQVRBX0lORAkJMHgzMDA4CisjZGVmaW5lIERMX1VOSVREQVRBX0lORAkJMHgzMTA4CisjZGVmaW5lIERMX0lORk9STUFUSU9OX0lORAkweDAwMDgKKworLyogaW50ZXJuIGxheWVyIDIgbWFuYWdtZW50ICovCisjZGVmaW5lIE1ETF9BU1NJR05fUkVRCQkweDE4MDQKKyNkZWZpbmUgTURMX0FTU0lHTl9JTkQJCTB4MTkwNAorI2RlZmluZSBNRExfUkVNT1ZFX1JFUQkJMHgxQTA0CisjZGVmaW5lIE1ETF9SRU1PVkVfSU5ECQkweDFCMDQKKyNkZWZpbmUgTURMX1NUQVRVU19VUF9JTkQJMHgxQzA0CisjZGVmaW5lIE1ETF9TVEFUVVNfRE9XTl9JTkQJMHgxRDA0CisjZGVmaW5lIE1ETF9TVEFUVVNfVUlfSU5ECTB4MUUwNAorI2RlZmluZSBNRExfRVJST1JfSU5ECQkweDFGMDQKKyNkZWZpbmUgTURMX0VSUk9SX1JTUAkJMHg1RjA0CisKKy8qIERMX0lORk9STUFUSU9OX0lORCB0eXBlcyAqLworI2RlZmluZSBETF9JTkZPX0wyX0NPTk5FQ1QJMHgwMDAxCisjZGVmaW5lIERMX0lORk9fTDJfUkVNT1ZFRAkweDAwMDIKKworLyogUEhfQ09OVFJPTCB0eXBlcyAqLworLyogVE9VQ0ggVE9ORSBJUyAweDIwWFggIFhYICIwIi4uLiI5IiwgIkEiLCJCIiwiQyIsIkQiLCIqIiwiIyIgKi8KKyNkZWZpbmUgRFRNRl9UT05FX1ZBTAkJMHgyMDAwCisjZGVmaW5lIERUTUZfVE9ORV9NQVNLCQkweDAwN0YKKyNkZWZpbmUgRFRNRl9UT05FX1NUQVJUCQkweDIxMDAKKyNkZWZpbmUgRFRNRl9UT05FX1NUT1AJCTB4MjIwMAorI2RlZmluZSBEVE1GX0hGQ19DT0VGCQkweDQwMDAKKyNkZWZpbmUgRFNQX0NPTkZfSk9JTgkJMHgyNDAzCisjZGVmaW5lIERTUF9DT05GX1NQTElUCQkweDI0MDQKKyNkZWZpbmUgRFNQX1JFQ0VJVkVfT0ZGCQkweDI0MDUKKyNkZWZpbmUgRFNQX1JFQ0VJVkVfT04JCTB4MjQwNgorI2RlZmluZSBEU1BfRUNIT19PTgkJMHgyNDA3CisjZGVmaW5lIERTUF9FQ0hPX09GRgkJMHgyNDA4CisjZGVmaW5lIERTUF9NSVhfT04JCTB4MjQwOQorI2RlZmluZSBEU1BfTUlYX09GRgkJMHgyNDBhCisjZGVmaW5lIERTUF9ERUxBWQkJMHgyNDBiCisjZGVmaW5lIERTUF9KSVRURVIJCTB4MjQwYworI2RlZmluZSBEU1BfVFhEQVRBX09OCQkweDI0MGQKKyNkZWZpbmUgRFNQX1RYREFUQV9PRkYJCTB4MjQwZQorI2RlZmluZSBEU1BfVFhfREVKSVRURVIJCTB4MjQwZgorI2RlZmluZSBEU1BfVFhfREVKX09GRgkJMHgyNDEwCisjZGVmaW5lIERTUF9UT05FX1BBVFRfT04JMHgyNDExCisjZGVmaW5lIERTUF9UT05FX1BBVFRfT0ZGCTB4MjQxMgorI2RlZmluZSBEU1BfVk9MX0NIQU5HRV9UWAkweDI0MTMKKyNkZWZpbmUgRFNQX1ZPTF9DSEFOR0VfUlgJMHgyNDE0CisjZGVmaW5lIERTUF9CRl9FTkFCTEVfS0VZCTB4MjQxNQorI2RlZmluZSBEU1BfQkZfRElTQUJMRQkJMHgyNDE2CisjZGVmaW5lIERTUF9CRl9BQ0NFUFQJCTB4MjQxNgorI2RlZmluZSBEU1BfQkZfUkVKRUNUCQkweDI0MTcKKyNkZWZpbmUgRFNQX1BJUEVMSU5FX0NGRwkweDI0MTgKKyNkZWZpbmUgSEZDX1ZPTF9DSEFOR0VfVFgJMHgyNjAxCisjZGVmaW5lIEhGQ19WT0xfQ0hBTkdFX1JYCTB4MjYwMgorI2RlZmluZSBIRkNfU1BMX0xPT1BfT04JCTB4MjYwMworI2RlZmluZSBIRkNfU1BMX0xPT1BfT0ZGCTB4MjYwNAorCisvKiBEU1BfVE9ORV9QQVRUX09OIHBhcmFtZXRlciAqLworI2RlZmluZSBUT05FX09GRgkJCTB4MDAwMAorI2RlZmluZSBUT05FX0dFUk1BTl9ESUFMVE9ORQkJMHgwMDAxCisjZGVmaW5lIFRPTkVfR0VSTUFOX09MRERJQUxUT05FCQkweDAwMDIKKyNkZWZpbmUgVE9ORV9BTUVSSUNBTl9ESUFMVE9ORQkJMHgwMDAzCisjZGVmaW5lIFRPTkVfR0VSTUFOX0RJQUxQQlgJCTB4MDAwNAorI2RlZmluZSBUT05FX0dFUk1BTl9PTERESUFMUEJYCQkweDAwMDUKKyNkZWZpbmUgVE9ORV9BTUVSSUNBTl9ESUFMUEJYCQkweDAwMDYKKyNkZWZpbmUgVE9ORV9HRVJNQU5fUklOR0lORwkJMHgwMDA3CisjZGVmaW5lIFRPTkVfR0VSTUFOX09MRFJJTkdJTkcJCTB4MDAwOAorI2RlZmluZSBUT05FX0FNRVJJQ0FOX1JJTkdQQlgJCTB4MDAwYgorI2RlZmluZSBUT05FX0dFUk1BTl9SSU5HUEJYCQkweDAwMGMKKyNkZWZpbmUgVE9ORV9HRVJNQU5fT0xEUklOR1BCWAkJMHgwMDBkCisjZGVmaW5lIFRPTkVfQU1FUklDQU5fUklOR0lORwkJMHgwMDBlCisjZGVmaW5lIFRPTkVfR0VSTUFOX0JVU1kJCTB4MDAwZgorI2RlZmluZSBUT05FX0dFUk1BTl9PTERCVVNZCQkweDAwMTAKKyNkZWZpbmUgVE9ORV9BTUVSSUNBTl9CVVNZCQkweDAwMTEKKyNkZWZpbmUgVE9ORV9HRVJNQU5fSEFOR1VQCQkweDAwMTIKKyNkZWZpbmUgVE9ORV9HRVJNQU5fT0xESEFOR1VQCQkweDAwMTMKKyNkZWZpbmUgVE9ORV9BTUVSSUNBTl9IQU5HVVAJCTB4MDAxNAorI2RlZmluZSBUT05FX1NQRUNJQUxfSU5GTwkJMHgwMDE1CisjZGVmaW5lIFRPTkVfR0VSTUFOX0dBU1NFTkJFU0VUWlQJMHgwMDE2CisjZGVmaW5lIFRPTkVfR0VSTUFOX0FVRlNDSEFMVFRPTgkweDAwMTYKKworLyogTVBIX0lORk9STUFUSU9OX0lORCAqLworI2RlZmluZSBMMV9TSUdOQUxfTE9TX09GRgkweDAwMTAKKyNkZWZpbmUgTDFfU0lHTkFMX0xPU19PTgkweDAwMTEKKyNkZWZpbmUgTDFfU0lHTkFMX0FJU19PRkYJMHgwMDEyCisjZGVmaW5lIEwxX1NJR05BTF9BSVNfT04JMHgwMDEzCisjZGVmaW5lIEwxX1NJR05BTF9SRElfT0ZGCTB4MDAxNAorI2RlZmluZSBMMV9TSUdOQUxfUkRJX09OCTB4MDAxNQorI2RlZmluZSBMMV9TSUdOQUxfU0xJUF9SWAkweDAwMjAKKyNkZWZpbmUgTDFfU0lHTkFMX1NMSVBfVFgJMHgwMDIxCisKKy8qCisgKiBwcm90b2NvbCBpZHMKKyAqIEQgY2hhbm5lbCAxLTMxCisgKiBCIGNoYW5uZWwgMzMgLSA2MworICovCisKKyNkZWZpbmUgSVNETl9QX05PTkUJCTAKKyNkZWZpbmUgSVNETl9QX0JBU0UJCTAKKyNkZWZpbmUgSVNETl9QX1RFX1MwCQkweDAxCisjZGVmaW5lIElTRE5fUF9OVF9TMCAgCQkweDAyCisjZGVmaW5lIElTRE5fUF9URV9FMQkJMHgwMworI2RlZmluZSBJU0ROX1BfTlRfRTEgIAkJMHgwNAorI2RlZmluZSBJU0ROX1BfVEVfVVAwCQkweDA1CisjZGVmaW5lIElTRE5fUF9OVF9VUDAJCTB4MDYKKworI2RlZmluZSBJU19JU0ROX1BfVEUocCkgKChwID09IElTRE5fUF9URV9TMCkgfHwgKHAgPT0gSVNETl9QX1RFX0UxKSB8fCBcCisJCQkJKHAgPT0gSVNETl9QX1RFX1VQMCkgfHwgKHAgPT0gSVNETl9QX0xBUERfVEUpKQorI2RlZmluZSBJU19JU0ROX1BfTlQocCkgKChwID09IElTRE5fUF9OVF9TMCkgfHwgKHAgPT0gSVNETl9QX05UX0UxKSB8fCBcCisJCQkJKHAgPT0gSVNETl9QX05UX1VQMCkgfHwgKHAgPT0gSVNETl9QX0xBUERfTlQpKQorI2RlZmluZSBJU19JU0ROX1BfUzAocCkgKChwID09IElTRE5fUF9URV9TMCkgfHwgKHAgPT0gSVNETl9QX05UX1MwKSkKKyNkZWZpbmUgSVNfSVNETl9QX0UxKHApICgocCA9PSBJU0ROX1BfVEVfRTEpIHx8IChwID09IElTRE5fUF9OVF9FMSkpCisjZGVmaW5lIElTX0lTRE5fUF9VUDAocCkgKChwID09IElTRE5fUF9URV9VUDApIHx8IChwID09IElTRE5fUF9OVF9VUDApKQorCisKKyNkZWZpbmUgSVNETl9QX0xBUERfVEUJCTB4MTAKKyNkZWZpbmUJSVNETl9QX0xBUERfTlQJCTB4MTEKKworI2RlZmluZSBJU0ROX1BfQl9NQVNLCQkweDFmCisjZGVmaW5lIElTRE5fUF9CX1NUQVJUCQkweDIwCisKKyNkZWZpbmUgSVNETl9QX0JfUkFXCQkweDIxCisjZGVmaW5lIElTRE5fUF9CX0hETEMJCTB4MjIKKyNkZWZpbmUgSVNETl9QX0JfWDc1U0xQCQkweDIzCisjZGVmaW5lIElTRE5fUF9CX0wyRFRNRgkJMHgyNAorI2RlZmluZSBJU0ROX1BfQl9MMkRTUAkJMHgyNQorI2RlZmluZSBJU0ROX1BfQl9MMkRTUEhETEMJMHgyNgorCisjZGVmaW5lIE9QVElPTl9MMl9QTVgJCTEKKyNkZWZpbmUgT1BUSU9OX0wyX1BUUAkJMgorI2RlZmluZSBPUFRJT05fTDJfRklYRURURUkJMworI2RlZmluZSBPUFRJT05fTDJfQ0xFQU5VUAk0CisKKy8qIHNob3VsZCBiZSBpbiBzeW5jIHdpdGggbGludXgva29iamVjdC5oOktPQkpfTkFNRV9MRU4gKi8KKyNkZWZpbmUgTUlTRE5fTUFYX0lETEVOCQkyMAorCitzdHJ1Y3QgbUlTRE5oZWFkIHsKKwl1bnNpZ25lZCBpbnQJcHJpbTsKKwl1bnNpZ25lZCBpbnQJaWQ7Cit9ICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBNSVNETl9IRUFERVJfTEVOCXNpemVvZihzdHJ1Y3QgbUlTRE5oZWFkKQorI2RlZmluZSBNQVhfREFUQV9TSVpFCQkyMDQ4CisjZGVmaW5lIE1BWF9EQVRBX01FTQkJKE1BWF9EQVRBX1NJWkUgKyBNSVNETl9IRUFERVJfTEVOKQorI2RlZmluZSBNQVhfREZSQU1FX0xFTgkJMjYwCisKKyNkZWZpbmUgTUlTRE5fSURfQUREUl9NQVNLCTB4RkZGRgorI2RlZmluZSBNSVNETl9JRF9URUlfTUFTSwkweEZGMDAKKyNkZWZpbmUgTUlTRE5fSURfU0FQSV9NQVNLCTB4MDBGRgorI2RlZmluZSBNSVNETl9JRF9URUlfQU5ZCTB4N0YwMAorCisjZGVmaW5lIE1JU0ROX0lEX0FOWQkJMHhGRkZGCisjZGVmaW5lIE1JU0ROX0lEX05PTkUJCTB4RkZGRQorCisjZGVmaW5lIEdST1VQX1RFSQkJMTI3CisjZGVmaW5lIFRFSV9TQVBJCQk2MworI2RlZmluZSBDVFJMX1NBUEkJCTAKKworI2RlZmluZSBNSVNETl9NQVhfQ0hBTk5FTAkxMjcKKyNkZWZpbmUgTUlTRE5fQ0hNQVBfU0laRQkoKE1JU0ROX01BWF9DSEFOTkVMICsgMSkgPj4gMykKKworI2RlZmluZSBTT0xfTUlTRE4JMAorCitzdHJ1Y3Qgc29ja2FkZHJfbUlTRE4geworCXNhX2ZhbWlseV90ICAgIGZhbWlseTsKKwl1bnNpZ25lZCBjaGFyCWRldjsKKwl1bnNpZ25lZCBjaGFyCWNoYW5uZWw7CisJdW5zaWduZWQgY2hhcglzYXBpOworCXVuc2lnbmVkIGNoYXIJdGVpOworfTsKKworc3RydWN0IG1JU0ROdmVyc2lvbiB7CisJdW5zaWduZWQgY2hhcgltYWpvcjsKKwl1bnNpZ25lZCBjaGFyCW1pbm9yOworCXVuc2lnbmVkIHNob3J0CXJlbGVhc2U7Cit9OworCisjZGVmaW5lIE1BWF9ERVZJQ0VfSUQgNjMKKworc3RydWN0IG1JU0ROX2RldmluZm8geworCXVfaW50CQkJaWQ7CisJdV9pbnQJCQlEcHJvdG9jb2xzOworCXVfaW50CQkJQnByb3RvY29sczsKKwl1X2ludAkJCXByb3RvY29sOworCXVfY2hhcgkJCWNoYW5uZWxtYXBbTUlTRE5fQ0hNQVBfU0laRV07CisJdV9pbnQJCQlucmJjaGFuOworCWNoYXIJCQluYW1lW01JU0ROX01BWF9JRExFTl07Cit9OworCitzdHJ1Y3QgbUlTRE5fZGV2cmVuYW1lIHsKKwl1X2ludAkJCWlkOworCWNoYXIJCQluYW1lW01JU0ROX01BWF9JRExFTl07Cit9OworCitzdHJ1Y3QgcGhfaW5mb19jaCB7CisJaW50MzJfdCAJCXByb3RvY29sOworCWludDY0X3QJCQlGbGFnczsKK307CisKK3N0cnVjdCBwaF9pbmZvX2RjaCB7CisJc3RydWN0IHBoX2luZm9fY2gJY2g7CisJaW50MTZfdAkJCXN0YXRlOworCWludDE2X3QJCQludW1fYmNoOworfTsKKworc3RydWN0IHBoX2luZm8geworCXN0cnVjdCBwaF9pbmZvX2RjaAlkY2g7CisJc3RydWN0IHBoX2luZm9fY2ggCWJjaFtdOworfTsKKworLyogdGltZXIgZGV2aWNlIGlvY3RsICovCisjZGVmaW5lIElNQUREVElNRVIJX0lPUignSScsIDY0LCBpbnQpCisjZGVmaW5lIElNREVMVElNRVIJX0lPUignSScsIDY1LCBpbnQpCisvKiBzb2NrZXQgaW9jdGxzICovCisjZGVmaW5lCUlNR0VUVkVSU0lPTglfSU9SKCdJJywgNjYsIGludCkKKyNkZWZpbmUJSU1HRVRDT1VOVAlfSU9SKCdJJywgNjcsIGludCkKKyNkZWZpbmUgSU1HRVRERVZJTkZPCV9JT1IoJ0knLCA2OCwgaW50KQorI2RlZmluZSBJTUNUUkxSRVEJX0lPUignSScsIDY5LCBpbnQpCisjZGVmaW5lIElNQ0xFQVJfTDIJX0lPUignSScsIDcwLCBpbnQpCisjZGVmaW5lIElNU0VUREVWTkFNRQlfSU9SKCdJJywgNzEsIHN0cnVjdCBtSVNETl9kZXZyZW5hbWUpCisKK3N0YXRpYyBpbmxpbmUgaW50Cit0ZXN0X2NoYW5uZWxtYXAodV9pbnQgbnIsIHVfY2hhciAqbWFwKQoreworCWlmIChuciA8PSBNSVNETl9NQVhfQ0hBTk5FTCkKKwkJcmV0dXJuIG1hcFtuciA+PiAzXSAmICgxIDw8IChuciAmIDcpKTsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3NldF9jaGFubmVsbWFwKHVfaW50IG5yLCB1X2NoYXIgKm1hcCkKK3sKKwltYXBbbnIgPj4gM10gfD0gKDEgPDwgKG5yICYgNykpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2NsZWFyX2NoYW5uZWxtYXAodV9pbnQgbnIsIHVfY2hhciAqbWFwKQoreworCW1hcFtuciA+PiAzXSAmPSB+KDEgPDwgKG5yICYgNykpOworfQorCisvKiBDT05UUk9MX0NIQU5ORUwgcGFyYW1ldGVycyAqLworI2RlZmluZSBNSVNETl9DVFJMX0dFVE9QCQkweDAwMDAKKyNkZWZpbmUgTUlTRE5fQ1RSTF9MT09QCQkJMHgwMDAxCisjZGVmaW5lIE1JU0ROX0NUUkxfQ09OTkVDVAkJMHgwMDAyCisjZGVmaW5lIE1JU0ROX0NUUkxfRElTQ09OTkVDVAkJMHgwMDA0CisjZGVmaW5lIE1JU0ROX0NUUkxfUENNQ09OTkVDVAkJMHgwMDEwCisjZGVmaW5lIE1JU0ROX0NUUkxfUENNRElTQ09OTkVDVAkweDAwMjAKKyNkZWZpbmUgTUlTRE5fQ1RSTF9TRVRQRUVSCQkweDAwNDAKKyNkZWZpbmUgTUlTRE5fQ1RSTF9VTlNFVFBFRVIJCTB4MDA4MAorI2RlZmluZSBNSVNETl9DVFJMX1JYX09GRgkJMHgwMTAwCisjZGVmaW5lIE1JU0ROX0NUUkxfRklMTF9FTVBUWQkJMHgwMjAwCisjZGVmaW5lIE1JU0ROX0NUUkxfR0VUUEVFUgkJMHgwNDAwCisjZGVmaW5lIE1JU0ROX0NUUkxfSFdfRkVBVFVSRVNfT1AJMHgyMDAwCisjZGVmaW5lIE1JU0ROX0NUUkxfSFdfRkVBVFVSRVMJCTB4MjAwMQorI2RlZmluZSBNSVNETl9DVFJMX0hGQ19PUAkJMHg0MDAwCisjZGVmaW5lIE1JU0ROX0NUUkxfSEZDX1BDTV9DT05OCQkweDQwMDEKKyNkZWZpbmUgTUlTRE5fQ1RSTF9IRkNfUENNX0RJU0MJCTB4NDAwMgorI2RlZmluZSBNSVNETl9DVFJMX0hGQ19DT05GX0pPSU4JMHg0MDAzCisjZGVmaW5lIE1JU0ROX0NUUkxfSEZDX0NPTkZfU1BMSVQJMHg0MDA0CisjZGVmaW5lIE1JU0ROX0NUUkxfSEZDX1JFQ0VJVkVfT0ZGCTB4NDAwNQorI2RlZmluZSBNSVNETl9DVFJMX0hGQ19SRUNFSVZFX09OCTB4NDAwNgorI2RlZmluZSBNSVNETl9DVFJMX0hGQ19FQ0hPQ0FOX09OIAkweDQwMDcKKyNkZWZpbmUgTUlTRE5fQ1RSTF9IRkNfRUNIT0NBTl9PRkYgCTB4NDAwOAorCisKKy8qIHNvY2tldCBvcHRpb25zICovCisjZGVmaW5lIE1JU0ROX1RJTUVfU1RBTVAJCTB4MDAwMQorCitzdHJ1Y3QgbUlTRE5fY3RybF9yZXEgeworCWludAkJb3A7CisJaW50CQljaGFubmVsOworCWludAkJcDE7CisJaW50CQlwMjsKK307CisKKy8qIG11eGVyIG9wdGlvbnMgKi8KKyNkZWZpbmUgTUlTRE5fT1BUX0FMTAkJMQorI2RlZmluZSBNSVNETl9PUFRfVEVJTUdSCTIKKworI2VuZGlmIC8qIG1JU0ROSUZfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTZlOTA3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxNCBAQAorbm9pbnN0X0hFQURFUlMgPSBhYmlzX25tLmggYWJpc19yc2wuaCBkYi5oIGdzbV8wNF8wOC5oIGdzbV9kYXRhLmggXAorCQkgZ3NtX3N1YnNjcmliZXIuaCBnc21fMDRfMTEuaCBkZWJ1Zy5oIHNpZ25hbC5oIFwKKwkJIG1pc2RuLmggY2hhbl9hbGxvYy5oIHBhZ2luZy5oIFwKKwkJIHN1YmNoYW5fZGVtdXguaCB0cmF1X2ZyYW1lLmggZTFfaW5wdXQuaCB0cmF1X211eC5oIFwKKwkJIGlwYWNjZXNzLmggcnMyMzIuaCBvcGVuYnNjZGVmaW5lcy5oIHJ0cF9wcm94eS5oIFwKKwkJIGJzY19ybGwuaCBtbmNjLmggdHJhbnNhY3Rpb24uaCB1c3NkLmggZ3NtXzA0XzgwLmggXAorCQkgc2lsZW50X2NhbGwuaCBtZ2NwLmggbWVhc19yZXAuaCByZXN0X29jdGV0cy5oIFwKKwkJIHN5c3RlbV9pbmZvcm1hdGlvbi5oIGhhbmRvdmVyLmggbWdjcF9pbnRlcm5hbC5oIFwKKwkJIHZ0eS5oIHNvY2tldC5oIFwKKwkJY3JjMjQuaCBncHJzX2Jzc2dwLmggZ3Byc19sbGMuaCBncHJzX25zLmggZ3Byc19nbW0uaCBcCisJCWdiX3Byb3h5LmggZ3Byc19zZ3NuLmggZ3NtXzA0XzA4X2dwcnMuaCBzZ3NuLmgKKworb3BlbmJzY19IRUFERVJTID0gZ3NtXzA0XzA4LmggbWVhc19yZXAuaCBic2NfYXBpLmgKK29wZW5ic2NkaXIgPSAkKGluY2x1ZGVkaXIpL29wZW5ic2MKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2FiaXNfbm0uaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2FiaXNfbm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjBlNGUxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYWJpc19ubS5oCkBAIC0wLDAgKzEsMTczIEBACisvKiBHU00gTmV0d29yayBNYW5hZ2VtZW50IG1lc3NhZ2VzIG9uIHRoZSBBLWJpcyBpbnRlcmZhY2UgCisgKiAzR1BQIFRTIDEyLjIxIHZlcnNpb24gOC4wLjAgUmVsZWFzZSAxOTk5IC8gRVRTSSBUUyAxMDAgNjIzIFY4LjAuMCAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfTk1fSAorI2RlZmluZSBfTk1fSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzEyXzIxLmg+CisKK3N0cnVjdCBjZWxsX2dsb2JhbF9pZCB7CisJdV9pbnQxNl90IG1jYzsKKwl1X2ludDE2X3QgbW5jOworCXVfaW50MTZfdCBsYWM7CisJdV9pbnQxNl90IGNpOworfTsKKworLyogVGhlIEJDQ0ggaW5mbyBmcm9tIGFuIGlwLmFjY2VzcyB0ZXN0LCBpbiBob3N0IGJ5dGUgb3JkZXIKKyAqIGFuZCBhbHJlYWR5IHBhcnNlZC4uLiAqLworc3RydWN0IGlwYWNfYmNjaF9pbmZvIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCisJdV9pbnQxNl90IGluZm9fdHlwZTsKKwl1X2ludDhfdCBmcmVxX3F1YWw7CisJdV9pbnQxNl90IGFyZmNuOworCXVfaW50OF90IHJ4X2xldjsKKwl1X2ludDhfdCByeF9xdWFsOworCWludDE2X3QgZnJlcV9lcnI7CisJdV9pbnQxNl90IGZyYW1lX29mZnNldDsKKwl1X2ludDMyX3QgZnJhbWVfbnJfb2Zmc2V0OworCXVfaW50OF90IGJzaWM7CisJc3RydWN0IGNlbGxfZ2xvYmFsX2lkIGNnaTsKKwl1X2ludDhfdCBiYV9saXN0X3NpMlsxNl07CisJdV9pbnQ4X3QgYmFfbGlzdF9zaTJiaXNbMTZdOworCXVfaW50OF90IGJhX2xpc3Rfc2kydGVyWzE2XTsKKwl1X2ludDhfdCBjYV9saXN0X3NpMVsxNl07Cit9OworCitleHRlcm4gY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uIG5tX2F0dF90bHZkZWY7CisKKy8qIFBVQkxJQyAqLworCitzdHJ1Y3QgbXNnYjsKKworc3RydWN0IGFiaXNfbm1fY2ZnIHsKKwkvKiBjYWxsYmFjayBmb3IgdW5pZGlyZWN0aW9uYWwgcmVwb3J0cyAqLworCWludCAoKnJlcG9ydF9jYikoc3RydWN0IG1zZ2IgKiwKKwkJCSBzdHJ1Y3QgYWJpc19vbV9mb21faGRyICopOworCS8qIGNhbGxiYWNrIGZvciBzb2Z0d2FyZSBhY3RpdmF0ZSByZXF1ZXN0cyBmcm9tIEJUUyAqLworCWludCAoKnN3X2FjdF9yZXEpKHN0cnVjdCBtc2diICopOworfTsKKworZXh0ZXJuIGludCBhYmlzX25tX3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKKworaW50IGFiaXNfbm1fdGx2X3BhcnNlKHN0cnVjdCB0bHZfcGFyc2VkICp0cCwgc3RydWN0IGdzbV9idHMgKmJ0cywgY29uc3QgdV9pbnQ4X3QgKmJ1ZiwgaW50IGxlbik7CitpbnQgYWJpc19ubV9yeChzdHJ1Y3QgbXNnYiAqbXNnKTsKK2ludCBhYmlzX25tX29wc3RhcnQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB1X2ludDhfdCBpMCwgdV9pbnQ4X3QgaTEsIHVfaW50OF90IGkyKTsKK2ludCBhYmlzX25tX2NoZ19hZG1fc3RhdGUoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB1X2ludDhfdCBpMCwKKwkJCSAgdV9pbnQ4X3QgaTEsIHVfaW50OF90IGkyLCBlbnVtIGFiaXNfbm1fYWRtX3N0YXRlIGFkbV9zdGF0ZSk7CitpbnQgYWJpc19ubV9lc3RhYmxpc2hfdGVpKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IHRyeF9uciwKKwkJCSAgdV9pbnQ4X3QgZTFfcG9ydCwgdV9pbnQ4X3QgZTFfdGltZXNsb3QsIHVfaW50OF90IGUxX3N1YnNsb3QsCisJCQkgIHVfaW50OF90IHRlaSk7CitpbnQgYWJpc19ubV9jb25uX3RlcnJfc2lnbihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwKKwkJCSAgIHVfaW50OF90IGUxX3BvcnQsIHVfaW50OF90IGUxX3RpbWVzbG90LCB1X2ludDhfdCBlMV9zdWJzbG90KTsKK2ludCBhYmlzX25tX2Nvbm5fdGVycl90cmFmKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMsCisJCQkgICB1X2ludDhfdCBlMV9wb3J0LCB1X2ludDhfdCBlMV90aW1lc2xvdCwKKwkJCSAgIHVfaW50OF90IGUxX3N1YnNsb3QpOworaW50IGFiaXNfbm1fc2V0X2J0c19hdHRyKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90ICphdHRyLCBpbnQgYXR0cl9sZW4pOworaW50IGFiaXNfbm1fc2V0X3JhZGlvX2F0dHIoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90ICphdHRyLCBpbnQgYXR0cl9sZW4pOworaW50IGFiaXNfbm1fc2V0X2NoYW5uZWxfYXR0cihzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzLCB1X2ludDhfdCBjaGFuX2NvbWIpOworaW50IGFiaXNfbm1fc3dfYWN0X3JlcV9hY2soc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB1X2ludDhfdCBpMSwKKwkJCXVfaW50OF90IGkyLCB1X2ludDhfdCBpMywgaW50IG5hY2ssIHVfaW50OF90ICphdHRyLCBpbnQgYXR0X2xlbik7CitpbnQgYWJpc19ubV9yYXdfbXNnKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBsZW4sIHVfaW50OF90ICptc2cpOworaW50IGFiaXNfbm1fZXZlbnRfcmVwb3J0cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgb24pOworaW50IGFiaXNfbm1fcmVzZXRfcmVzb3VyY2Uoc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgYWJpc19ubV9zb2Z0d2FyZV9sb2FkKHN0cnVjdCBnc21fYnRzICpidHMsIGludCB0cnhfbnIsIGNvbnN0IGNoYXIgKmZuYW1lLAorCQkJICB1X2ludDhfdCB3aW5fc2l6ZSwgaW50IGZvcmNlZCwKKwkJCSAgZ3NtX2NiZm4gKmNiZm4sIHZvaWQgKmNiX2RhdGEpOworaW50IGFiaXNfbm1fc29mdHdhcmVfbG9hZF9zdGF0dXMoc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgYWJpc19ubV9zb2Z0d2FyZV9hY3RpdmF0ZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBjb25zdCBjaGFyICpmbmFtZSwKKwkJCSAgICAgIGdzbV9jYmZuICpjYmZuLCB2b2lkICpjYl9kYXRhKTsKKworaW50IGFiaXNfbm1fY29ubl9tZHJvcF9saW5rKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGUxX3BvcnQwLCB1X2ludDhfdCB0czAsCisJCQkgICAgdV9pbnQ4X3QgZTFfcG9ydDEsIHVfaW50OF90IHRzMSk7CisKK2ludCBhYmlzX25tX3BlcmZvcm1fdGVzdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsCisJCQkgdV9pbnQ4X3QgYnRzX25yLCB1X2ludDhfdCB0cnhfbnIsIHVfaW50OF90IHRzX25yLAorCQkJIHVfaW50OF90IHRlc3RfbnIsIHVfaW50OF90IGF1dG9uX3JlcG9ydCwKKwkJCSB1X2ludDhfdCAqcGh5c19jb25maWcsIHVfaW50MTZfdCBwaHlzX2NvbmZpZ19sZW4pOworCitpbnQgYWJpc19ubV9jaGNvbWI0cGNoYW4oZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBwY2hhbik7CisKKy8qIFNpZW1lbnMgLyBCUy0xMSBzcGVjaWZpYyAqLworaW50IGFiaXNfbm1fYnMxMV9yZXNldF9yZXNvdXJjZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX2JzMTFfZGJfdHJhbnNtaXNzaW9uKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBiZWdpbik7CitpbnQgYWJpc19ubV9iczExX2NyZWF0ZV9vYmplY3Qoc3RydWN0IGdzbV9idHMgKmJ0cywgZW51bSBhYmlzX2JzMTFfb2JqdHlwZSB0eXBlLAorCQkJICB1X2ludDhfdCBpZHgsIHVfaW50OF90IGF0dHJfbGVuLCBjb25zdCB1X2ludDhfdCAqYXR0cik7CitpbnQgYWJpc19ubV9iczExX2NyZWF0ZV9lbnZhQlRTRShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBpZHgpOworaW50IGFiaXNfbm1fYnMxMV9jcmVhdGVfYnBvcnQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgaWR4KTsKK2ludCBhYmlzX25tX2JzMTFfZGVsZXRlX29iamVjdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLAorCQkJCWVudW0gYWJpc19iczExX29ianR5cGUgdHlwZSwgdV9pbnQ4X3QgaWR4KTsKK2ludCBhYmlzX25tX2JzMTFfZGVsZXRlX2Jwb3J0KHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGlkeCk7CitpbnQgYWJpc19ubV9iczExX2Nvbm5fb21sX3RlaShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBlMV9wb3J0LAorCQkJICB1X2ludDhfdCBlMV90aW1lc2xvdCwgdV9pbnQ4X3QgZTFfc3Vic2xvdCwgdV9pbnQ4X3QgdGVpKTsKK2ludCBhYmlzX25tX2JzMTFfZ2V0X29tbF90ZWlfdHMoc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgYWJpc19ubV9iczExX2dldF9zZXJubyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX2JzMTFfc2V0X3RyeF9wb3dlcihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgbGV2ZWwpOworaW50IGFiaXNfbm1fYnMxMV9nZXRfdHJ4X3Bvd2VyKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KTsKK2ludCBhYmlzX25tX2JzMTFfbG9nb24oc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgbGV2ZWwsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBvbik7CitpbnQgYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IG9uKTsKK2ludCBhYmlzX25tX2JzMTFfaW5maWVsZF9sb2dvbihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgb24pOworaW50IGFiaXNfbm1fYnMxMV9zZXRfdHJ4MV9wdyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBjb25zdCBjaGFyICpwYXNzd29yZCk7CitpbnQgYWJpc19ubV9iczExX3NldF9wbGxfbG9ja2VkKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBsb2NrZWQpOworaW50IGFiaXNfbm1fYnMxMV9nZXRfcGxsX21vZGUoc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgYWJpc19ubV9iczExX3NldF9wbGwoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IHZhbHVlKTsKK2ludCBhYmlzX25tX2JzMTFfZ2V0X2NjbGsoc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgYWJpc19ubV9iczExX2dldF9zdGF0ZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX2JzMTFfbG9hZF9zd2woc3RydWN0IGdzbV9idHMgKmJ0cywgY29uc3QgY2hhciAqZm5hbWUsCisJCQkgIHVfaW50OF90IHdpbl9zaXplLCBpbnQgZm9yY2VkLCBnc21fY2JmbiAqY2Jmbik7CitpbnQgYWJpc19ubV9iczExX3NldF9leHRfdGltZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX2JzMTFfc2V0X2Jwb3J0X2xpbmVfY2ZnKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGJwb3J0LCBlbnVtIGFiaXNfYnMxMV9saW5lX2NmZyBsaW5lX2NmZyk7CitpbnQgYWJpc19ubV9iczExX2JzY19kaXNjb25uZWN0KHN0cnVjdCBnc21fYnRzICpidHMsIGludCByZWNvbm5lY3QpOworaW50IGFiaXNfbm1fYnMxMV9yZXN0YXJ0KHN0cnVjdCBnc21fYnRzICpidHMpOworCisvKiBpcC5hY2Nlc3MgbmFub0JUUyBzcGVjaWZpYyBjb21tYW5kcyAqLworaW50IGFiaXNfbm1faXBhY2Nlc3NfbXNnKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG1zZ190eXBlLAorCQkJIHVfaW50OF90IG9ial9jbGFzcywgdV9pbnQ4X3QgYnRzX25yLAorCQkJIHVfaW50OF90IHRyeF9uciwgdV9pbnQ4X3QgdHNfbnIsCisJCQkgdV9pbnQ4X3QgKmF0dHIsIGludCBhdHRyX2xlbik7CitpbnQgYWJpc19ubV9pcGFjY2Vzc19zZXRfbnZhdHRyKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCAqYXR0ciwKKwkJCQlpbnQgYXR0cl9sZW4pOworaW50IGFiaXNfbm1faXBhY2Nlc3NfcmVzdGFydChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCk7CitpbnQgYWJpc19ubV9pcGFjY2Vzc19zZXRfYXR0cihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsCisJCQkJdV9pbnQ4X3QgYnRzX25yLCB1X2ludDhfdCB0cnhfbnIsIHVfaW50OF90IHRzX25yLAorCQkJCXVfaW50OF90ICphdHRyLCB1X2ludDhfdCBhdHRyX2xlbik7CitpbnQgYWJpc19ubV9pcGFjY2Vzc19yc2xfY29ubmVjdChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgCisJCQkJIHVfaW50MzJfdCBpcCwgdV9pbnQxNl90IHBvcnQsIHVfaW50OF90IHN0cmVhbSk7Cit2b2lkIGFiaXNfbm1faXBhY2Nlc3NfY2dpKHVfaW50OF90ICpidWYsIHN0cnVjdCBnc21fYnRzICpidHMpOworaW50IGlwYWNfcGFyc2VfYmNjaF9pbmZvKHN0cnVjdCBpcGFjX2JjY2hfaW5mbyAqYmluZiwgdV9pbnQ4X3QgKmJ1Zik7Citjb25zdCBjaGFyICppcGFjY190ZXN0cmVzX25hbWUodV9pbnQ4X3QgcmVzKTsKKworLyogRnVuY3Rpb25zIGNhbGxpbmcgaW50byBvdGhlciBjb2RlIHBhcnRzICovCitlbnVtIG5tX2V2dCB7CisJRVZUX1NUQVRFQ0hHX09QRVIsCisJRVZUX1NUQVRFQ0hHX0FETSwKK307CitpbnQgbm1fc3RhdGVfZXZlbnQoZW51bSBubV9ldnQgZXZ0LCB1X2ludDhfdCBvYmpfY2xhc3MsIHZvaWQgKm9iaiwKKwkJICAgc3RydWN0IGdzbV9ubV9zdGF0ZSAqb2xkX3N0YXRlLCBzdHJ1Y3QgZ3NtX25tX3N0YXRlICpuZXdfc3RhdGUsCisJCSAgIHN0cnVjdCBhYmlzX29tX29ial9pbnN0ICpvYmpfaW5zdCk7CisKK2NvbnN0IGNoYXIgKm5tX29wc3RhdGVfbmFtZSh1X2ludDhfdCBvcyk7Citjb25zdCBjaGFyICpubV9hdmFpbF9uYW1lKHVfaW50OF90IGF2YWlsKTsKK2ludCBubV9pc19ydW5uaW5nKHN0cnVjdCBnc21fbm1fc3RhdGUgKnMpOworI2VuZGlmIC8qIF9OTV9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9hYmlzX3JzbC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYWJpc19yc2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTY3NzRkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYWJpc19yc2wuaApAQCAtMCwwICsxLDg4IEBACisvKiBHU00gUmFkaW8gU2lnbmFsbGluZyBMaW5rIG1lc3NhZ2VzIG9uIHRoZSBBLWJpcyBpbnRlcmZhY2UgCisgKiAzR1BQIFRTIDA4LjU4IHZlcnNpb24gOC42LjAgUmVsZWFzZSAxOTk5IC8gRVRTSSBUUyAxMDAgNTk2IFY4LjYuMCAqLworCisvKiAoQykgMjAwOCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX1JTTF9ICisjZGVmaW5lIF9SU0xfSAorCisjaW5jbHVkZSA8b3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA4XzU4Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisKK2ludCByc2xfYmNjaF9pbmZvKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCB0eXBlLAorCQkgIGNvbnN0IHVfaW50OF90ICpkYXRhLCBpbnQgbGVuKTsKK2ludCByc2xfc2FjY2hfZmlsbGluZyhzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgdHlwZSwgCisJCSAgICAgIGNvbnN0IHVfaW50OF90ICpkYXRhLCBpbnQgbGVuKTsKK2ludCByc2xfY2hhbl9hY3RpdmF0ZShzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgY2hhbl9uciwKKwkJICAgICAgdV9pbnQ4X3QgYWN0X3R5cGUsCisJCSAgICAgIHN0cnVjdCByc2xfaWVfY2hhbl9tb2RlICpjaGFuX21vZGUsCisJCSAgICAgIHN0cnVjdCByc2xfaWVfY2hhbl9pZGVudCAqY2hhbl9pZGVudCwKKwkJICAgICAgdV9pbnQ4X3QgYnNfcG93ZXIsIHVfaW50OF90IG1zX3Bvd2VyLAorCQkgICAgICB1X2ludDhfdCB0YSk7CitpbnQgcnNsX2NoYW5fYWN0aXZhdGVfbGNoYW4oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGFjdF90eXBlLCAKKwkJCSAgICB1X2ludDhfdCB0YSwgdV9pbnQ4X3QgaG9fcmVmKTsKK2ludCByc2xfY2hhbl9tb2RlX21vZGlmeV9yZXEoc3RydWN0IGdzbV9sY2hhbiAqdHMpOworaW50IHJzbF9lbmNyeXB0aW9uX2NtZChzdHJ1Y3QgbXNnYiAqbXNnKTsKK2ludCByc2xfcGFnaW5nX2NtZChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBwYWdpbmdfZ3JvdXAsIHVfaW50OF90IGxlbiwKKwkJICAgdV9pbnQ4X3QgKm1zX2lkZW50LCB1X2ludDhfdCBjaGFuX25lZWRlZCk7CitpbnQgcnNsX3BhZ2luZ19jbWRfc3Vic2NyKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGNoYW5fbmVlZGVkLAorCQkJIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKK2ludCByc2xfaW1tX2Fzc2lnbl9jbWQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgbGVuLCB1X2ludDhfdCAqdmFsKTsKKworaW50IHJzbF9kYXRhX3JlcXVlc3Qoc3RydWN0IG1zZ2IgKm1zZywgdV9pbnQ4X3QgbGlua19pZCk7CitpbnQgcnNsX2VzdGFibGlzaF9yZXF1ZXN0KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsaW5rX2lkKTsKK2ludCByc2xfcmVsYXNlX3JlcXVlc3Qoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxpbmtfaWQpOworCisvKiBTaWVtZW5zIHZlbmRvci1zcGVjaWZpYyBSU0wgZXh0ZW5zaW9ucyAqLworaW50IHJzbF9zaWVtZW5zX21ycGNpKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBzdHJ1Y3QgcnNsX21ycGNpICptcnBjaSk7CisKKy8qIGlwLmFjY2VzcyBzcGVjZmljIFJTTCBleHRlbnNpb25zICovCitpbnQgcnNsX2lwYWNjX2NyY3goc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworaW50IHJzbF9pcGFjY19tZGN4KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDMyX3QgaXAsCisJCSAgIHVfaW50MTZfdCBwb3J0LCB1X2ludDhfdCBydHBfcGF5bG9hZDIpOworaW50IHJzbF9pcGFjY19tZGN4X3RvX3J0cHNvY2soc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworaW50IHJzbF9pcGFjY19wZGNoX2FjdGl2YXRlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBpbnQgYWN0KTsKKworaW50IGFiaXNfcnNsX3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKKwordW5zaWduZWQgaW50IGdldF9wYWdpbmdfZ3JvdXAodV9pbnQ2NF90IGltc2ksIHVuc2lnbmVkIGludCBic19jY19jaGFucywKKwkJCSAgICAgIGludCBuX3BhZ19ibG9ja3MpOwordW5zaWduZWQgaW50IG5fcGFnX2Jsb2NrcyhpbnQgYnNfY2NjaF9zZGNjaF9jb21iLCB1bnNpZ25lZCBpbnQgYnNfYWdfYmxrc19yZXMpOwordV9pbnQ2NF90IHN0cl90b19pbXNpKGNvbnN0IGNoYXIgKmltc2lfc3RyKTsKK3VfaW50OF90IGxjaGFuMmNoYW5fbnIoY29uc3Qgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworaW50IHJzbF9yZWxlYXNlX3JlcXVlc3Qoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxpbmtfaWQpOworCitpbnQgcnNsX2xjaGFuX3NldF9zdGF0ZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgaW50KTsKKworLyogdG8gYmUgcHJvdmlkZWQgYnkgZXh0ZXJuYWwgY29kZSAqLworaW50IGFiaXNfcnNsX3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZyk7CitpbnQgcnNsX2RlYWN0X3NhY2NoKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKKworLyogQkNDSCByZWxhdGVkIGNvZGUgKi8KK2ludCByc2xfY2NjaF9jb25mX3RvX2JzX2NjX2NoYW5zKGludCBjY2NoX2NvbmYpOworaW50IHJzbF9jY2NoX2NvbmZfdG9fYnNfY2NjaF9zZGNjaF9jb21iKGludCBjY2NoX2NvbmYpOworaW50IHJzbF9udW1iZXJfb2ZfcGFnaW5nX3N1YmNoYW5uZWxzKHN0cnVjdCBnc21fYnRzICpidHMpOworCitpbnQgcnNsX2NoYW5fYnNfcG93ZXJfY3RybChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdW5zaWduZWQgaW50IGZwYywgaW50IGRiKTsKK2ludCByc2xfY2hhbl9tc19wb3dlcl9jdHJsKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1bnNpZ25lZCBpbnQgZnBjLCBpbnQgZGJtKTsKKworI2VuZGlmIC8qIFJTTF9NVF9IICovCisKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2JzY19hcGkuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2JzY19hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWUzNDRmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYnNjX2FwaS5oCkBAIC0wLDAgKzEsNiBAQAorLyogR1NNIDA4LjA4IGxpa2UgQVBJIGZvciBPcGVuQlNDICovCisKKyNpbmNsdWRlICJnc21fZGF0YS5oIgorCisKK2ludCBnc20wODA4X3N1Ym1pdF9kdGFwKHN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uLCBzdHJ1Y3QgbXNnYiAqbXNnLCBpbnQgbGlua19pZCk7CmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ic2NfcmxsLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ic2NfcmxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI4OThkMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2JzY19ybGwuaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIF9CU0NfUkxMX0gKKyNkZWZpbmUgX0JTQ19STExfSAorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorCitlbnVtIGJzY19ybGxyX2luZCB7CisJQlNDX1JMTFJfSU5EX0VTVF9DT05GLAorCUJTQ19STExSX0lORF9SRUxfSU5ELAorCUJTQ19STExSX0lORF9FUlJfSU5ELAorCUJTQ19STExSX0lORF9USU1FT1VULAorfTsKKworaW50IHJsbF9lc3RhYmxpc2goc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxpbmtfaWQsCisJCSAgdm9pZCAoKmNiKShzdHJ1Y3QgZ3NtX2xjaGFuICosIHVfaW50OF90LCB2b2lkICosCisJCQkgICAgIGVudW0gYnNjX3JsbHJfaW5kKSwKKwkJICB2b2lkICpkYXRhKTsKK3ZvaWQgcmxsX2luZGljYXRpb24oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxpbmtfaWQsIHVfaW50OF90IHR5cGUpOworCisjZW5kaWYgLyogX0JTQ19STExfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvY2hhbl9hbGxvYy5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvY2hhbl9hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZjU4NTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9jaGFuX2FsbG9jLmgKQEAgLTAsMCArMSw2NyBAQAorLyogTWFuYWdlbWVudCBmdW5jdGlvbnMgdG8gYWxsb2NhdGUvcmVsZWFzZSBzdHJ1Y3QgZ3NtX2xjaGFuICovCisvKiAoQykgMjAwOCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisjaWZuZGVmIF9DSEFOX0FMTE9DX0gKKyNkZWZpbmUgX0NIQU5fQUxMT0NfSAorCisjaW5jbHVkZSAiZ3NtX3N1YnNjcmliZXIuaCIKKworLyogU3BlY2lhbCBhbGxvY2F0b3IgZm9yIEMwIG9mIEJUUyAqLworc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0c19jMF9hbGxvYyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLAorCQkJCSAgIGVudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgcGNoYW4pOworCisvKiBSZWd1bGFyIHBoeXNpY2FsIGNoYW5uZWwgYWxsb2NhdG9yICovCitzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzX2FsbG9jKHN0cnVjdCBnc21fYnRzICpidHMsCisJCQkJZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBwY2hhbik7CisKKy8qIFJlZ3VsYXIgcGh5c2ljYWwgY2hhbm5lbCAoVFMpICovCit2b2lkIHRzX2ZyZWUoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyk7CisKKy8qIEZpbmQgYW4gYWxsb2NhdGVkIGNoYW5uZWwgKi8KK3N0cnVjdCBnc21fbGNoYW4gKmxjaGFuX2ZpbmQoc3RydWN0IGdzbV9idHMgKmJ0cywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworCisvKiBGaW5kIGFuIGFsbG9jYXRlZCBjaGFubmVsIGZvciBhIHNwZWNpZmllZCBzdWJzY3JpYmVyICovCitzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbl9mb3Jfc3Vic2NyKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKKworLyogQWxsb2NhdGUgYSBsb2dpY2FsIGNoYW5uZWwgKFNEQ0NILCBUQ0gsIC4uLikgKi8KK3N0cnVjdCBnc21fbGNoYW4gKmxjaGFuX2FsbG9jKHN0cnVjdCBnc21fYnRzICpidHMsIGVudW0gZ3NtX2NoYW5fdCB0eXBlKTsKKworLyogRnJlZSBhIGxvZ2ljYWwgY2hhbm5lbCAoU0RDQ0gsIFRDSCwgLi4uKSAqLwordm9pZCBsY2hhbl9mcmVlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKK3ZvaWQgbGNoYW5fcmVzZXQoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworCisvKiBDb25zaWRlciByZWxlYXNpbmcgdGhlIGNoYW5uZWwgKi8KK2ludCBsY2hhbl9hdXRvX3JlbGVhc2Uoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworCitzdHJ1Y3QgbG9hZF9jb3VudGVyIHsKKwl1bnNpZ25lZCBpbnQgdG90YWw7CisJdW5zaWduZWQgaW50IHVzZWQ7Cit9OworCitzdHJ1Y3QgcGNoYW5fbG9hZCB7CisJc3RydWN0IGxvYWRfY291bnRlciBwY2hhbltHU01fUENIQU5fVU5LTk9XTl07Cit9OworCit2b2lkIGJ0c19jaGFuX2xvYWQoc3RydWN0IHBjaGFuX2xvYWQgKmNsLCBjb25zdCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK3ZvaWQgbmV0d29ya19jaGFuX2xvYWQoc3RydWN0IHBjaGFuX2xvYWQgKnBsLCBzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCk7CisKK2ludCB0cnhfaXNfdXNhYmxlKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KTsKKworI2VuZGlmIC8qIF9DSEFOX0FMTE9DX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2NyYzI0LmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9jcmMyNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OGZjYjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9jcmMyNC5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfQ1JDMjRfSAorI2RlZmluZSBfQ1JDMjRfSAorCisjZGVmaW5lIElOSVRfQ1JDMjQJMHhmZmZmZmYKKwordV9pbnQzMl90IGNyYzI0X2NhbGModV9pbnQzMl90IGZjcywgdV9pbnQ4X3QgKmNwLCB1bnNpZ25lZCBpbnQgbGVuKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9kYi5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzgyZWZiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZGIuaApAQCAtMCwwICsxLDc0IEBACisvKiAoQykgMjAwOCBieSBKYW4gTHVlYmJlIDxqbHVlYmJlQGRlYmlhbi5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfREJfSAorI2RlZmluZSBfREJfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisKKy8qIG9uZSB0aW1lIGluaXRpYWxpc2F0aW9uICovCitpbnQgZGJfaW5pdChjb25zdCBjaGFyICpuYW1lKTsKK2ludCBkYl9wcmVwYXJlKCk7CitpbnQgZGJfZmluaSgpOworCisvKiBzdWJzY3JpYmVyIG1hbmFnZW1lbnQgKi8KK3N0cnVjdCBnc21fc3Vic2NyaWJlciogZGJfY3JlYXRlX3N1YnNjcmliZXIoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCSAgICBjaGFyICppbXNpKTsKK3N0cnVjdCBnc21fc3Vic2NyaWJlciogZGJfZ2V0X3N1YnNjcmliZXIoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCSBlbnVtIGdzbV9zdWJzY3JpYmVyX2ZpZWxkIGZpZWxkLAorCQkJCQkgY29uc3QgY2hhciAqc3Vic2NyKTsKK2ludCBkYl9zeW5jX3N1YnNjcmliZXIoc3RydWN0IGdzbV9zdWJzY3JpYmVyKiBzdWJzY3JpYmVyKTsKK2ludCBkYl9zdWJzY3JpYmVyX2FsbG9jX3Rtc2koc3RydWN0IGdzbV9zdWJzY3JpYmVyKiBzdWJzY3JpYmVyKTsKK2ludCBkYl9zdWJzY3JpYmVyX2FsbG9jX2V4dGVuKHN0cnVjdCBnc21fc3Vic2NyaWJlciogc3Vic2NyaWJlcik7CitpbnQgZGJfc3Vic2NyaWJlcl9hbGxvY190b2tlbihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIqIHN1YnNjcmliZXIsIHVfaW50MzJfdCogdG9rZW4pOworaW50IGRiX3N1YnNjcmliZXJfYXNzb2NfaW1laShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIqIHN1YnNjcmliZXIsIGNoYXIgKmltZWkpOworaW50IGRiX3N5bmNfZXF1aXBtZW50KHN0cnVjdCBnc21fZXF1aXBtZW50ICplcXVpcCk7CisKKy8qIGF1dGggaW5mbyAqLworaW50IGdldF9hdXRoaW5mb19ieV9zdWJzY3Ioc3RydWN0IGdzbV9hdXRoX2luZm8gKmFpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworaW50IHNldF9hdXRoaW5mb19mb3Jfc3Vic2NyKHN0cnVjdCBnc21fYXV0aF9pbmZvICphaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CitpbnQgZ2V0X2F1dGh0dXBsZV9ieV9zdWJzY3Ioc3RydWN0IGdzbV9hdXRoX3R1cGxlICphdHVwbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworaW50IHNldF9hdXRodHVwbGVfZm9yX3N1YnNjcihzdHJ1Y3QgZ3NtX2F1dGhfdHVwbGUgKmF0dXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworCisvKiBTTVMgc3RvcmUtYW5kLWZvcndhcmQgKi8KK2ludCBkYl9zbXNfc3RvcmUoc3RydWN0IGdzbV9zbXMgKnNtcyk7CitzdHJ1Y3QgZ3NtX3NtcyAqZGJfc21zX2dldF91bnNlbnQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIHVuc2lnbmVkIGxvbmcgbG9uZyBtaW5faWQpOworc3RydWN0IGdzbV9zbXMgKmRiX3Ntc19nZXRfdW5zZW50X2J5X3N1YnNjcihzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgdW5zaWduZWQgbG9uZyBsb25nIG1pbl9zdWJzY3JfaWQpOworc3RydWN0IGdzbV9zbXMgKmRiX3Ntc19nZXRfdW5zZW50X2Zvcl9zdWJzY3Ioc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworaW50IGRiX3Ntc19tYXJrX3NlbnQoc3RydWN0IGdzbV9zbXMgKnNtcyk7CisKKy8qIEFQRFUgYmxvYiBzdG9yYWdlICovCitpbnQgZGJfYXBkdV9ibG9iX3N0b3JlKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLCAKKwkJCXVfaW50OF90IGFwZHVfaWRfZmxhZ3MsIHVfaW50OF90IGxlbiwKKwkJCXVfaW50OF90ICphcGR1KTsKKworLyogU3RhdGlzdGljcyBjb3VudGVyIHN0b3JhZ2UgKi8KK3N0cnVjdCBjb3VudGVyOworaW50IGRiX3N0b3JlX2NvdW50ZXIoc3RydWN0IGNvdW50ZXIgKmN0cik7CitzdHJ1Y3QgcmF0ZV9jdHJfZ3JvdXA7CitpbnQgZGJfc3RvcmVfcmF0ZV9jdHJfZ3JvdXAoc3RydWN0IHJhdGVfY3RyX2dyb3VwICpjdHJnKTsKKworI2VuZGlmIC8qIF9EQl9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9kZWJ1Zy5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDNhZWRiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZGVidWcuaApAQCAtMCwwICsxLDY5IEBACisjaWZuZGVmIF9ERUJVR19ICisjZGVmaW5lIF9ERUJVR19ICisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorCisjZGVmaW5lIERFQlVHCisjaW5jbHVkZSA8b3Ntb2NvcmUvbG9nZ2luZy5oPgorCisvKiBEZWJ1ZyBBcmVhcyBvZiB0aGUgY29kZSAqLworZW51bSB7CisJRFJMTCwKKwlEQ0MsCisJRE1NLAorCURSUiwKKwlEUlNMLAorCUROTSwKKwlETU5DQywKKwlEU01TLAorCURQQUcsCisJRE1FQVMsCisJRE1JLAorCURNSUIsCisJRE1VWCwKKwlESU5QLAorCURTQ0NQLAorCURNU0MsCisJRE1HQ1AsCisJREhPLAorCUREQiwKKwlEUkVGLAorCURHUFJTLAorCUROUywKKwlEQlNTR1AsCisJRExMQywKKwlEU05EQ1AsCisJRGVidWdfTGFzdEVudHJ5LAorfTsKKworLyogY29udGV4dCAqLworI2RlZmluZSBCU0NfQ1RYX0xDSEFOCTAKKyNkZWZpbmUgQlNDX0NUWF9TVUJTQ1IJMQorI2RlZmluZSBCU0NfQ1RYX0JUUwkyCisjZGVmaW5lIEJTQ19DVFhfU0NDUAkzCisjZGVmaW5lIEJTQ19DVFhfTlNWQwk0CisjZGVmaW5lIEJTQ19DVFhfQlZDCTUKKworLyogdGFyZ2V0ICovCisKK2VudW0geworCS8vREVCVUdfRklMVEVSX0FMTCA9IDEgPDwgMCwKKwlMT0dfRklMVEVSX0lNU0kgPSAxIDw8IDEsCisJTE9HX0ZJTFRFUl9OU1ZDID0gMSA8PCAyLAorCUxPR19GSUxURVJfQlZDICA9IDEgPDwgMywKK307CisKKy8qIHdlIGRvbid0IG5lZWQgYSBoZWFkZXIgZGVwZW5kZW5jeSBmb3IgdGhpcy4uLiAqLworc3RydWN0IGdwcnNfbnN2YzsKK3N0cnVjdCBic3NncF9idmNfY3R4OworCit2b2lkIGxvZ19zZXRfaW1zaV9maWx0ZXIoc3RydWN0IGxvZ190YXJnZXQgKnRhcmdldCwgY29uc3QgY2hhciAqaW1zaSk7Cit2b2lkIGxvZ19zZXRfbnN2Y19maWx0ZXIoc3RydWN0IGxvZ190YXJnZXQgKnRhcmdldCwKKwkJCSBzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjKTsKK3ZvaWQgbG9nX3NldF9idmNfZmlsdGVyKHN0cnVjdCBsb2dfdGFyZ2V0ICp0YXJnZXQsCisJCQlzdHJ1Y3QgYnNzZ3BfYnZjX2N0eCAqYmN0eCk7CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbG9nX2luZm8gbG9nX2luZm87CisKKyNlbmRpZiAvKiBfREVCVUdfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZTFfaW5wdXQuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2UxX2lucHV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEzZDlkNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2UxX2lucHV0LmgKQEAgLTAsMCArMSwxNjggQEAKKyNpZm5kZWYgX0UxX0lOUFVUX0gKKyNkZWZpbmUgX0UxX0lOUFVUX0gKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zdWJjaGFuX2RlbXV4Lmg+CisKKyNkZWZpbmUgTlVNX0UxX1RTICAgMzIKKworZW51bSBlMWlucF9zaWduX3R5cGUgeworCUUxSU5QX1NJR05fTk9ORSwKKwlFMUlOUF9TSUdOX09NTCwKKwlFMUlOUF9TSUdOX1JTTCwKK307Citjb25zdCBjaGFyICplMWlucF9zaWdudHlwZV9uYW1lKGVudW0gZTFpbnBfc2lnbl90eXBlIHRwKTsKKworc3RydWN0IGUxaW5wX3RzOworCitzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rIHsKKwkvKiBsaXN0IG9mIHNpZ25hbGxpbmcgbGlua3MgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCisJLyogdG8gd2hpY2ggdGltZXNsb3QgZG8gd2UgYmVsb25nPyAqLworCXN0cnVjdCBlMWlucF90cyAqdHM7CisKKwllbnVtIGUxaW5wX3NpZ25fdHlwZSB0eXBlOworCisJLyogdHJ4IGZvciBtc2ctPnRyeCBvZiByZWNlaXZlZCBtc2dzICovCQorCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCisJLyogbXNnYiBxdWV1ZSBvZiB0by1iZS10cmFuc21pdHRlZCBtc2dzICovCisJc3RydWN0IGxsaXN0X2hlYWQgdHhfbGlzdDsKKworCS8qIFNBUEkgYW5kIFRFSSBvbiB0aGUgRTEgVFMgKi8KKwl1X2ludDhfdCBzYXBpOworCXVfaW50OF90IHRlaTsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVfaW50OF90IGNoYW5uZWw7CisJCX0gbWlzZG47CisJfSBkcml2ZXI7Cit9OworCitlbnVtIGUxaW5wX3RzX3R5cGUgeworCUUxSU5QX1RTX1RZUEVfTk9ORSwKKwlFMUlOUF9UU19UWVBFX1NJR04sCisJRTFJTlBfVFNfVFlQRV9UUkFVLAorfTsKK2NvbnN0IGNoYXIgKmUxaW5wX3RzdHlwZV9uYW1lKGVudW0gZTFpbnBfdHNfdHlwZSB0cCk7CisKKy8qIEEgdGltZXNsb3QgaW4gdGhlIEUxIGludGVyZmFjZSAqLworc3RydWN0IGUxaW5wX3RzIHsKKwllbnVtIGUxaW5wX3RzX3R5cGUgdHlwZTsKKwlpbnQgbnVtOworCisJLyogdG8gd2hpY2ggbGluZSBkbyB3ZSBiZWxvbmcgPyAqLworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJLyogbGlzdCBvZiBhbGwgc2lnbmFsbGluZyBsaW5rcyBvbiB0aGlzIFRTICovCisJCQlzdHJ1Y3QgbGxpc3RfaGVhZCBzaWduX2xpbmtzOworCQkJLyogdGltZXIgd2hlbiB0byBkZXF1ZXVlIG5leHQgZnJhbWUgKi8KKwkJCXN0cnVjdCB0aW1lcl9saXN0IHR4X3RpbWVyOworCQl9IHNpZ247CisJCXN0cnVjdCB7CisJCQkvKiBzdWJjaGFubmVsIGRlbXV4ZXIgZm9yIGZyYW1lcyBmcm9tIEUxICovCisJCQlzdHJ1Y3Qgc3ViY2hfZGVtdXggZGVtdXg7CisJCQkvKiBzdWJjaGFubmVsIG11eGVyIGZvciBmcmFtZXMgdG8gRTEgKi8KKwkJCXN0cnVjdCBzdWJjaF9tdXggbXV4OworCQl9IHRyYXU7CisJfTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQkvKiBtSVNETiBkcml2ZXIgaGFzIG9uZSBmZCBmb3IgZWFjaCB0cyAqLworCQkJc3RydWN0IGJzY19mZCBmZDsKKwkJfSBtaXNkbjsKKwkJc3RydWN0IHsKKwkJCS8qIGlwLmFjY2VzcyBkcml2ZXIgaGFzIG9uZSBmZCBmb3IgZWFjaCB0cyAqLworCQkJc3RydWN0IGJzY19mZCBmZDsKKwkJfSBpcGFjY2VzczsKKworCX0gZHJpdmVyOworfTsKKworc3RydWN0IGUxaW5wX2RyaXZlciB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKwljb25zdCBjaGFyICpuYW1lOworCWludCAoKndhbnRfd3JpdGUpKHN0cnVjdCBlMWlucF90cyAqdHMpOworfTsJCisKK3N0cnVjdCBlMWlucF9saW5lIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCXVuc2lnbmVkIGludCBudW07CisJY29uc3QgY2hhciAqbmFtZTsKKworCS8qIGFycmF5IG9mIHRpbWVzdGxvdHMgKi8KKwlzdHJ1Y3QgZTFpbnBfdHMgdHNbTlVNX0UxX1RTXTsKKworCXN0cnVjdCBlMWlucF9kcml2ZXIgKmRyaXZlcjsKKwl2b2lkICpkcml2ZXJfZGF0YTsKK307CisKKy8qIHJlZ2lzdGVyIGEgZHJpdmVyIHdpdGggdGhlIEUxIGNvcmUgKi8KK2ludCBlMWlucF9kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IGUxaW5wX2RyaXZlciAqZHJ2KTsKKworLyogcmVnaXN0ZXIgYSBsaW5lIHdpdGggdGhlIEUxIGNvcmUgKi8KK2ludCBlMWlucF9saW5lX3JlZ2lzdGVyKHN0cnVjdCBlMWlucF9saW5lICpsaW5lKTsKKworLyogZW5zdXJlIGEgY2VydGFpbiBsaW5lIGV4aXN0cywgcmV0dXJuIHBvaW50ZXIgdG8gaXQgKi8KK3N0cnVjdCBlMWlucF9saW5lICplMWlucF9saW5lX2dldF9jcmVhdGUodV9pbnQ4X3QgZTFfbnIpOworCisvKiBmaW5kIGEgc2lnbl9saW5rIGZvciBnaXZlbiBURUkgYW5kIFNBUEkgaW4gYSBUUyAqLworc3RydWN0IGUxaW5wX3NpZ25fbGluayAqCitlMWlucF9sb29rdXBfc2lnbl9saW5rKHN0cnVjdCBlMWlucF90cyAqdHMsIHVfaW50OF90IHRlaSwKKwkJCXVfaW50OF90IHNhcGkpOworCisvKiBjcmVhdGUgYSBuZXcgc2lnbmFsbGluZyBsaW5rIGluIGEgRTEgdGltZXNsb3QgKi8KK3N0cnVjdCBlMWlucF9zaWduX2xpbmsgKgorZTFpbnBfc2lnbl9saW5rX2NyZWF0ZShzdHJ1Y3QgZTFpbnBfdHMgKnRzLCBlbnVtIGUxaW5wX3NpZ25fdHlwZSB0eXBlLAorCQkJc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90IHRlaSwKKwkJCXVfaW50OF90IHNhcGkpOworCisvKiBjb25maWd1cmUgYW5kIGluaXRpYWxpemUgb25lIGUxaW5wX3RzICovCitpbnQgZTFpbnBfdHNfY29uZmlnKHN0cnVjdCBlMWlucF90cyAqdHMsIHN0cnVjdCBlMWlucF9saW5lICpsaW5lLAorCQkgICAgZW51bSBlMWlucF90c190eXBlIHR5cGUpOworCisvKiBDYWxsIGZyb20gdGhlIFN0YWNrOiBjb25maWd1cmF0aW9uIG9mIHRoaXMgVFMgaGFzIGNoYW5nZWQgKi8KK2ludCBlMWlucF91cGRhdGVfdHMoc3RydWN0IGUxaW5wX3RzICp0cyk7CisKKy8qIFJlY2VpdmUgYSBwYWNrZXQgZnJvbSB0aGUgRTEgZHJpdmVyICovCitpbnQgZTFpbnBfcnhfdHMoc3RydWN0IGUxaW5wX3RzICp0cywgc3RydWN0IG1zZ2IgKm1zZywKKwkJdV9pbnQ4X3QgdGVpLCB1X2ludDhfdCBzYXBpKTsKKworLyogY2FsbGVkIGJ5IGRyaXZlciBpZiBpdCB3YW50cyB0byB0cmFuc21pdCBvbiBhIGdpdmVuIFRTICovCitzdHJ1Y3QgbXNnYiAqZTFpbnBfdHhfdHMoc3RydWN0IGUxaW5wX3RzICplMWlfdHMsCisJCQkgc3RydWN0IGUxaW5wX3NpZ25fbGluayAqKnNpZ25fbGluayk7CisKKy8qIGNhbGxlZCBieSBkcml2ZXIgaW4gY2FzZSBzb21lIGtpbmQgb2YgbGluayBzdGF0ZSBldmVudCAqLworaW50IGUxaW5wX2V2ZW50KHN0cnVjdCBlMWlucF90cyAqdHMsIGludCBldnQsIHVfaW50OF90IHRlaSwgdV9pbnQ4X3Qgc2FwaSk7CisKKy8qIFdyaXRlIExBUEQgZnJhbWVzIHRvIHRoZSBmZC4gKi8KK3ZvaWQgZTFfc2V0X3BjYXBfZmQoaW50IGZkKTsKKworLyogY2FsbGVkIGJ5IFRSQVUgbXV4ZXIgdG8gb2J0YWluIHRoZSBkZXN0aW5hdGlvbiBtdXggZW50aXR5ICovCitzdHJ1Y3Qgc3ViY2hfbXV4ICplMWlucF9nZXRfbXV4KHVfaW50OF90IGUxX25yLCB1X2ludDhfdCB0c19ucik7CisKK3ZvaWQgZTFpbnBfc2lnbl9saW5rX2Rlc3Ryb3koc3RydWN0IGUxaW5wX3NpZ25fbGluayAqbGluayk7CitpbnQgZTFpbnBfbGluZV91cGRhdGUoc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUpOworCisvKiBlMV9jb25maWcuYyAqLworaW50IGUxX3JlY29uZmlnX3RzKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMpOworaW50IGUxX3JlY29uZmlnX3RyeChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCk7CitpbnQgZTFfcmVjb25maWdfYnRzKHN0cnVjdCBnc21fYnRzICpidHMpOworCitpbnQgaWFfY29uZmlnX2Nvbm5lY3Qoc3RydWN0IGdzbV9idHMgKmJ0cywgc3RydWN0IHNvY2thZGRyX2luICpzaW4pOworaW50IGlwYWNjZXNzX3NldHVwKHN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0KTsKKworZXh0ZXJuIHN0cnVjdCBsbGlzdF9oZWFkIGUxaW5wX2RyaXZlcl9saXN0OworZXh0ZXJuIHN0cnVjdCBsbGlzdF9oZWFkIGUxaW5wX2xpbmVfbGlzdDsKKworI2VuZGlmIC8qIF9FMV9JTlBVVF9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nYl9wcm94eS5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ2JfcHJveHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGRlZDIyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ2JfcHJveHkuaApAQCAtMCwwICsxLDM5IEBACisjaWZuZGVmIF9HQl9QUk9YWV9ICisjZGVmaW5lIF9HQl9QUk9YWV9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19ucy5oPgorI2luY2x1ZGUgPG9zbW9jb20vdnR5L2NvbW1hbmQuaD4KKworc3RydWN0IGdicHJveHlfY29uZmlnIHsKKwkvKiBwYXJzZWQgZnJvbSBjb25maWcgZmlsZSAqLworCXVfaW50MTZfdCBuc2lwX3Nnc25fbnNlaTsKKworCS8qIG1pc2MgKi8KKwlzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2k7Cit9OworCitleHRlcm4gc3RydWN0IGdicHJveHlfY29uZmlnIGdiY2ZnOworZXh0ZXJuIHN0cnVjdCBjbWRfZWxlbWVudCBzaG93X2dicHJveHlfY21kOworCisvKiBnYl9wcm94eV92dHkgLmMgKi8KKworaW50IGdicHJveHlfdnR5X2luaXQodm9pZCk7CitpbnQgZ2Jwcm94eV9wYXJzZV9jb25maWcoY29uc3QgY2hhciAqY29uZmlnX2ZpbGUsIHN0cnVjdCBnYnByb3h5X2NvbmZpZyAqY2ZnKTsKKworCisvKiBnYl9wcm94eS5jICovCisKKy8qIE1haW4gaW5wdXQgZnVuY3Rpb24gZm9yIEdiIHByb3h5ICovCitpbnQgZ2Jwcm94X3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjLCB1aW50MTZfdCBuc19idmNpKTsKKworaW50IGdicHJveF9zaWduYWwodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJICB2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKTsKKworLyogUmVzZXQgYWxsIHBlcnNpc3RlbnQgTlMtVkMncyAqLworaW50IGdicHJveF9yZXNldF9wZXJzaXN0ZW50X25zdmNzKHN0cnVjdCBncHJzX25zX2luc3QgKm5zaSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3Byc19ic3NncC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3Byc19ic3NncC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYjk0NWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ncHJzX2Jzc2dwLmgKQEAgLTAsMCArMSwyMDQgQEAKKyNpZm5kZWYgX0dQUlNfQlNTR1BfSAorI2RlZmluZSBfR1BSU19CU1NHUF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyogU2VjdGlvbiA1LjQuMSAqLworI2RlZmluZSBCVkNJX1NJR05BTExJTkcJMHgwMDAwCisjZGVmaW5lIEJWQ0lfUFRNCTB4MDAwMQorCisvKiBTZWN0aW9uIDExLjMuMjYgLyBUYWJsZSAxMS4yNyAqLworZW51bSBic3NncF9wZHVfdHlwZSB7CisJLyogUERVcyBiZXR3ZWVuIFJMIGFuZCBCU1NHUCBTQVBzICovCisJQlNTR1BfUERVVF9ETF9VTklUREFUQQkJPSAweDAwLAorCUJTU0dQX1BEVVRfVUxfVU5JVERBVEEJCT0gMHgwMSwKKwlCU1NHUF9QRFVUX1JBX0NBUEFCSUxJVFkJPSAweDAyLAorCUJTU0dQX1BEVVRfUFRNX1VOSVREQVRBCQk9IDB4MDMsCisJLyogUERVcyBiZXR3ZWVuIEdNTSBTQVBzICovCisJQlNTR1BfUERVVF9QQUdJTkdfUFMJCT0gMHgwNiwKKwlCU1NHUF9QRFVUX1BBR0lOR19DUwkJPSAweDA3LAorCUJTU0dQX1BEVVRfUkFfQ0FQQV9VRFBBVEUJPSAweDA4LAorCUJTU0dQX1BEVVRfUkFfQ0FQQV9VUERBVEVfQUNLCT0gMHgwOSwKKwlCU1NHUF9QRFVUX1JBRElPX1NUQVRVUwkJPSAweDBhLAorCUJTU0dQX1BEVVRfU1VTUEVORAkJPSAweDBiLAorCUJTU0dQX1BEVVRfU1VTUEVORF9BQ0sJCT0gMHgwYywKKwlCU1NHUF9QRFVUX1NVU1BFTkRfTkFDSwkJPSAweDBkLAorCUJTU0dQX1BEVVRfUkVTVU1FCQk9IDB4MGUsCisJQlNTR1BfUERVVF9SRVNVTUVfQUNLCQk9IDB4MGYsCisJQlNTR1BfUERVVF9SRVNVTUVfTkFDSwkJPSAweDEwLAorCS8qIFBEdXMgYmV0d2VlbiBOTSBTQVBzICovCisJQlNTR1BfUERVVF9CVkNfQkxPQ0sJCT0gMHgyMCwKKwlCU1NHUF9QRFVUX0JWQ19CTE9DS19BQ0sJPSAweDIxLAorCUJTU0dQX1BEVVRfQlZDX1JFU0VUCQk9IDB4MjIsCisJQlNTR1BfUERVVF9CVkNfUkVTRVRfQUNLCT0gMHgyMywKKwlCU1NHUF9QRFVUX0JWQ19VTkJMT0NLCQk9IDB4MjQsCisJQlNTR1BfUERVVF9CVkNfVU5CTE9DS19BQ0sJPSAweDI1LAorCUJTU0dQX1BEVVRfRkxPV19DT05UUk9MX0JWQwk9IDB4MjYsCisJQlNTR1BfUERVVF9GTE9XX0NPTlRST0xfQlZDX0FDSwk9IDB4MjcsCisJQlNTR1BfUERVVF9GTE9XX0NPTlRST0xfTVMJPSAweDI4LAorCUJTU0dQX1BEVVRfRkxPV19DT05UUk9MX01TX0FDSwk9IDB4MjksCisJQlNTR1BfUERVVF9GTFVTSF9MTAkJPSAweDJhLAorCUJTU0dQX1BEVVRfRkxVU0hfTExfQUNLCQk9IDB4MmIsCisJQlNTR1BfUERVVF9MTENfRElTQ0FSRAkJPSAweDJjLAorCUJTU0dQX1BEVVRfU0dTTl9JTlZPS0VfVFJBQ0UJPSAweDQwLAorCUJTU0dQX1BEVVRfU1RBVFVTCQk9IDB4NDEsCisJLyogUERVcyBiZXR3ZWVuIFBGTSBTQVAncyAqLworCUJTU0dQX1BEVVRfRE9XTkxPQURfQlNTX1BGQwk9IDB4NTAsCisJQlNTR1BfUERVVF9DUkVBVEVfQlNTX1BGQwk9IDB4NTEsCisJQlNTR1BfUERVVF9DUkVBVEVfQlNTX1BGQ19BQ0sJPSAweDUyLAorCUJTU0dQX1BEVVRfQ1JFQVRFX0JTU19QRkNfTkFDSwk9IDB4NTMsCisJQlNTR1BfUERVVF9NT0RJRllfQlNTX1BGQwk9IDB4NTQsCisJQlNTR1BfUERVVF9NT0RJRllfQlNTX1BGQ19BQ0sJPSAweDU1LAorCUJTU0dQX1BEVVRfREVMRVRFX0JTU19QRkMJPSAweDU2LAorCUJTU0dQX1BEVVRfREVMRVRFX0JTU19QRkNfQUNLCT0gMHg1NywKK307CisKKy8qIFNlY3Rpb24gMTAuMi4xIGFuZCAxMC4yLjIgKi8KK3N0cnVjdCBic3NncF91ZF9oZHIgeworCXVpbnQ4X3QgcGR1X3R5cGU7CisJdWludDMyX3QgdGxsaTsKKwl1aW50OF90IHFvc19wcm9maWxlWzNdOworCXVpbnQ4X3QgZGF0YVswXTsJLyogVExWJ3MgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBic3NncF9ub3JtYWxfaGRyIHsKKwl1aW50OF90IHBkdV90eXBlOworCXVpbnQ4X3QgZGF0YVswXTsJLyogVExWJ3MgKi8KK307CisKK2VudW0gYnNzZ3BfaWVpX3R5cGUgeworCUJTU0dQX0lFX0FMSUdOTUVOVAkJPSAweDAwLAorCUJTU0dQX0lFX0JNQVhfREVGQVVMVF9NUwk9IDB4MDEsCisJQlNTR1BfSUVfQlNTX0FSRUFfSUQJCT0gMHgwMiwKKwlCU1NHUF9JRV9CVUNLRVRfTEVBS19SQVRFCT0gMHgwMywKKwlCU1NHUF9JRV9CVkNJCQkJPSAweDA0LAorCUJTU0dQX0lFX0JWQ19CVUNLRVRfU0laRQk9IDB4MDUsCisJQlNTR1BfSUVfQlZDX01FQVNVUkVNRU5UCT0gMHgwNiwKKwlCU1NHUF9JRV9DQVVTRQkJCT0gMHgwNywKKwlCU1NHUF9JRV9DRUxMX0lECQk9IDB4MDgsCisJQlNTR1BfSUVfQ0hBTl9ORUVERUQJCT0gMHgwOSwKKwlCU1NHUF9JRV9EUlhfUEFSQU1TCQk9IDB4MGEsCisJQlNTR1BfSUVfRU1MUFBfUFJJTwkJPSAweDBiLAorCUJTU0dQX0lFX0ZMVVNIX0FDVElPTgkJPSAweDBjLAorCUJTU0dQX0lFX0lNU0kJCQk9IDB4MGQsCisJQlNTR1BfSUVfTExDX1BEVQkJPSAweDBlLAorCUJTU0dQX0lFX0xMQ19GUkFNRVNfRElTQ0FSREVECT0gMHgwZiwKKwlCU1NHUF9JRV9MT0NBVElPTl9BUkVBCQk9IDB4MTAsCisJQlNTR1BfSUVfTU9CSUxFX0lECQk9IDB4MTEsCisJQlNTR1BfSUVfTVNfQlVDS0VUX1NJWkUJCT0gMHgxMiwKKwlCU1NHUF9JRV9NU19SQURJT19BQ0NFU1NfQ0FQCT0gMHgxMywKKwlCU1NHUF9JRV9PTUNfSUQJCQk9IDB4MTQsCisJQlNTR1BfSUVfUERVX0lOX0VSUk9SCQk9IDB4MTUsCisJQlNTR1BfSUVfUERVX0xJRkVUSU1FCQk9IDB4MTYsCisJQlNTR1BfSUVfUFJJT1JJVFkJCT0gMHgxNywKKwlCU1NHUF9JRV9RT1NfUFJPRklMRQkJPSAweDE4LAorCUJTU0dQX0lFX1JBRElPX0NBVVNFCQk9IDB4MTksCisJQlNTR1BfSUVfUkFfQ0FQX1VQRF9DQVVTRQk9IDB4MWEsCisJQlNTR1BfSUVfUk9VVEVJTkdfQVJFQQkJPSAweDFiLAorCUJTU0dQX0lFX1JfREVGQVVMVF9NUwkJPSAweDFjLAorCUJTU0dQX0lFX1NVU1BFTkRfUkVGX05SCQk9IDB4MWQsCisJQlNTR1BfSUVfVEFHCQkJPSAweDFlLAorCUJTU0dQX0lFX1RMTEkJCQk9IDB4MWYsCisJQlNTR1BfSUVfVE1TSQkJCT0gMHgyMCwKKwlCU1NHUF9JRV9UUkFDRV9SRUZFUkVOQwkJPSAweDIxLAorCUJTU0dQX0lFX1RSQUNFX1RZUEUJCT0gMHgyMiwKKwlCU1NHUF9JRV9UUkFOU0FDVElPTl9JRAkJPSAweDIzLAorCUJTU0dQX0lFX1RSSUdHRVJfSUQJCT0gMHgyNCwKKwlCU1NHUF9JRV9OVU1fT0NUX0FGRgkJPSAweDI1LAorCUJTU0dQX0lFX0xTQV9JRF9MSVNUCQk9IDB4MjYsCisJQlNTR1BfSUVfTFNBX0lORk9STUFUSU9OCT0gMHgyNywKKwlCU1NHUF9JRV9QQUNLRVRfRkxPV19JRAkJPSAweDI4LAorCUJTU0dQX0lFX1BBQ0tFVF9GTE9XX1RJTUVSCT0gMHgyOSwKKwlCU1NHUF9JRV9BR0dfQlNTX1FPU19QUk9GSUxFCT0gMHgzYSwKKwlCU1NHUF9JRV9GRUFUVVJFX0JJVE1BUAkJPSAweDNiLAorCUJTU0dQX0lFX0JVQ0tFVF9GVUxMX1JBVElPCT0gMHgzYywKKwlCU1NHUF9JRV9TRVJWSUNFX1VUUkFOX0NDTwk9IDB4M2QsCit9OworCisvKiBTZWN0aW9uIDExLjMuOCAvIFRhYmxlIDExLjEwOiBDYXVzZSBjb2RpbmcgKi8KK2VudW0gZ3Byc19ic3NncF9jYXVzZSB7CisJQlNTR1BfQ0FVU0VfUFJPQ19PVkVSTE9BRAk9IDB4MDAsCisJQlNTR1BfQ0FVU0VfRVFVSVBfRkFJTAkJPSAweDAxLAorCUJTU0dQX0NBVVNFX1RSQVNJVF9ORVRfRkFJTAk9IDB4MDIsCisJQlNTR1BfQ0FVU0VfQ0FQQV9HUkVBVEVSXzBLUEJTCT0gMHgwMywKKwlCU1NHUF9DQVVTRV9VTktOT1dOX01TCQk9IDB4MDQsCisJQlNTR1BfQ0FVU0VfVU5LTk9XTl9CVkNJCT0gMHgwNSwKKwlCU1NHUF9DQVVTRV9DRUxMX1RSQUZfQ09ORwk9IDB4MDYsCisJQlNTR1BfQ0FVU0VfU0dTTl9DT05HCQk9IDB4MDcsCisJQlNTR1BfQ0FVU0VfT01MX0lOVEVSVgkJPSAweDA4LAorCUJTU0dQX0NBVVNFX0JWQ0lfQkxPQ0tFRAk9IDB4MDksCisJQlNTR1BfQ0FVU0VfUEZDX0NSRUFURV9GQUlMCT0gMHgwYSwKKwlCU1NHUF9DQVVTRV9TRU1fSU5DT1JSX1BEVQk9IDB4MjAsCisJQlNTR1BfQ0FVU0VfSU5WX01BTkRfSU5GCT0gMHgyMSwKKwlCU1NHUF9DQVVTRV9NSVNTSU5HX01BTkRfSUUJPSAweDIyLAorCUJTU0dQX0NBVVNFX01JU1NJTkdfQ09ORF9JRQk9IDB4MjMsCisJQlNTR1BfQ0FVU0VfVU5FWFBfQ09ORF9JRQk9IDB4MjQsCisJQlNTR1BfQ0FVU0VfQ09ORF9JRV9FUlIJCT0gMHgyNSwKKwlCU1NHUF9DQVVTRV9QRFVfSU5DT01QX1NUQVRFCT0gMHgyNiwKKwlCU1NHUF9DQVVTRV9QUk9UT19FUlJfVU5TUEVDCT0gMHgyNywKKwlCU1NHUF9DQVVTRV9QRFVfSU5DT01QX0ZFQVQJPSAweDI4LAorfTsKKworLyogT3VyIGltcGxlbWVudGF0aW9uICovCisKKy8qIGdwcnNfYnNzZ3BfdXRpbC5jICovCitleHRlcm4gc3RydWN0IGdwcnNfbnNfaW5zdCAqYnNzZ3BfbnNpOworc3RydWN0IG1zZ2IgKmJzc2dwX21zZ2JfYWxsb2Modm9pZCk7Citjb25zdCBjaGFyICpic3NncF9jYXVzZV9zdHIoZW51bSBncHJzX2Jzc2dwX2NhdXNlIGNhdXNlKTsKKy8qIFRyYW5zbWl0IGEgc2ltcGxlIHJlc3BvbnNlIHN1Y2ggYXMgQkxPQ0svVU5CTE9DSy9SRVNFVCBBQ0svTkFDSyAqLworaW50IGJzc2dwX3R4X3NpbXBsZV9idmNpKHVpbnQ4X3QgcGR1X3R5cGUsIHVpbnQxNl90IG5zZWksCisJCQkgdWludDE2X3QgYnZjaSwgdWludDE2X3QgbnNfYnZjaSk7CisvKiBDaGFwdGVyIDEwLjQuMTQ6IFN0YXR1cyAqLworaW50IGJzc2dwX3R4X3N0YXR1cyh1aW50OF90IGNhdXNlLCB1aW50MTZfdCAqYnZjaSwgc3RydWN0IG1zZ2IgKm9yaWdfbXNnKTsKKworLyogZ3Byc19ic3NncC5jICovCisKKyNkZWZpbmUgQlZDX1NfQkxPQ0tFRAkweDAwMDEKKworLyogVGhlIHBlci1CVFMgY29udGV4dCB0aGF0IHdlIGtlZXAgb24gdGhlIFNHU04gc2lkZSBvZiB0aGUgQlNTR1AgbGluayAqLworc3RydWN0IGJzc2dwX2J2Y19jdHggeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwkvKiBwYXJzZWQgUkEgSUQgYW5kIENlbGwgSUQgb2YgdGhlIHJlbW90ZSBCVFMgKi8KKwlzdHJ1Y3QgZ3Byc19yYV9pZCByYV9pZDsKKwl1aW50MTZfdCBjZWxsX2lkOworCisJLyogTlNFSSBhbmQgQlZDSSBvZiB1bmRlcmx5aW5nIEdiIGxpbmsuICBUb2dldGhlciB0aGV5CisJICogdW5pcXVlbHkgaWRlbnRpZnkgYSBsaW5rIHRvIGEgQlRTICg1LjQuNCkgKi8KKwl1aW50MTZfdCBidmNpOworCXVpbnQxNl90IG5zZWk7CisKKwl1aW50MzJfdCBzdGF0ZTsKKworCXN0cnVjdCByYXRlX2N0cl9ncm91cCAqY3RyZzsKKworCS8qIHdlIG1pZ2h0IHdhbnQgdG8gYWRkIHRoaXMgYXMgYSBzaG9ydGN1dCBsYXRlciwgYXZvaWRpbmcgdGhlIE5TVkMKKwkgKiBsb29rdXAgZm9yIGV2ZXJ5IHBhY2tldCwgc2ltaWxhciB0byBhIHJvdXRpbmcgY2FjaGUgKi8KKwkvL3N0cnVjdCBncHJzX25zdmMgKm5zdmM7Cit9OworZXh0ZXJuIHN0cnVjdCBsbGlzdF9oZWFkIGJzc2dwX2J2Y19jdHh0czsKKy8qIEZpbmQgYSBCVFMgQ29udGV4dCBiYXNlZCBvbiBwYXJzZWQgUkEgSUQgYW5kIENlbGwgSUQgKi8KK3N0cnVjdCBic3NncF9idmNfY3R4ICpidHNjdHhfYnlfcmFpZF9jaWQoY29uc3Qgc3RydWN0IGdwcnNfcmFfaWQgKnJhaWQsIHVpbnQxNl90IGNpZCk7CisvKiBGaW5kIGEgQlRTIGNvbnRleHQgYmFzZWQgb24gQlZDSStOU0VJIHR1cGxlICovCitzdHJ1Y3QgYnNzZ3BfYnZjX2N0eCAqYnRzY3R4X2J5X2J2Y2lfbnNlaSh1aW50MTZfdCBidmNpLCB1aW50MTZfdCBuc2VpKTsKKworI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorCisvKiBCU1NHUC1VTC1VTklUREFUQS5pbmQgKi8KK2ludCBncHJzX2Jzc2dwX3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKKworLyogQlNTR1AtREwtVU5JVERBVEEucmVxICovCitpbnQgZ3Byc19ic3NncF90eF9kbF91ZChzdHJ1Y3QgbXNnYiAqbXNnKTsKKwordWludDE2X3QgYnNzZ3BfcGFyc2VfY2VsbF9pZChzdHJ1Y3QgZ3Byc19yYV9pZCAqcmFpZCwgY29uc3QgdWludDhfdCAqYnVmKTsKKworLyogV3JhcHBlciBhcm91bmQgVExWIHBhcnNlciB0byBwYXJzZSBCU1NHUCBJRXMgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGJzc2dwX3Rsdl9wYXJzZShzdHJ1Y3QgdGx2X3BhcnNlZCAqdHAsIHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbikKK3sKKwlyZXR1cm4gdGx2X3BhcnNlKHRwLCAmdHZsdl9hdHRfZGVmLCBidWYsIGxlbiwgMCwgMCk7Cit9CisKKy8qIGdwcnNfYnNzZ3BfdnR5LmMgKi8KK2ludCBncHJzX2Jzc2dwX3Z0eV9pbml0KHZvaWQpOworCisjZW5kaWYgLyogX0dQUlNfQlNTR1BfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3Byc19nbW0uaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dwcnNfZ21tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQwM2RkOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dwcnNfZ21tLmgKQEAgLTAsMCArMSwxMSBAQAorI2lmbmRlZiBfR1BSU19HTU1fSAorI2RlZmluZSBfR1BSU19HTU1fSAorCitpbnQgZ3NtNDhfdHhfZ3NtX2FjdF9wZHBfcmVqKHN0cnVjdCBzZ3NuX21tX2N0eCAqbW0sIHVpbnQ4X3QgdGlkLAorCQkJICAgICB1aW50OF90IGNhdXNlLCB1aW50OF90IHBjb19sZW4sIHVpbnQ4X3QgKnBjb192KTsKK2ludCBnc200OF90eF9nc21fYWN0X3BkcF9hY2Moc3RydWN0IHNnc25fcGRwX2N0eCAqcGRwKTsKK2ludCBnc200OF90eF9nc21fZGVhY3RfcGRwX2FjYyhzdHJ1Y3Qgc2dzbl9wZHBfY3R4ICpwZHApOworCitpbnQgZ3NtMDQwOF9ncHJzX3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKKworI2VuZGlmIC8qIF9HUFJTX0dNTV9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ncHJzX2xsYy5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3Byc19sbGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWViYWEyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3Byc19sbGMuaApAQCAtMCwwICsxLDEwNyBAQAorI2lmbmRlZiBfR1BSU19MTENfSAorI2RlZmluZSBfR1BSU19MTENfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIFNlY3Rpb24gNC43IExMQyBMYXllciBTdHJ1Y3R1cmUgKi8KK2VudW0gZ3Byc19sbGNfc2FwaSB7CisJR1BSU19TQVBJX0dNTQkJPSAxLAorCUdQUlNfU0FQSV9UT00yCQk9IDIsCisJR1BSU19TQVBJX1NORENQMwk9IDMsCisJR1BSU19TQVBJX1NORENQNQk9IDUsCisJR1BSU19TQVBJX1NNUwkJPSA3LAorCUdQUlNfU0FQSV9UT004CQk9IDgsCisJR1BSU19TQVBJX1NORENQOQk9IDksCisJR1BSU19TQVBJX1NORENQMTEJPSAxMSwKK307CisKKy8qIFNlY3Rpb24gNi40IENvbW1hbmRzIGFuZCBSZXNwb25zZXMgKi8KK2VudW0gZ3Byc19sbGNfdV9jbWQgeworCUdQUlNfTExDX1VfRE1fUkVTUAkJPSAweDAxLAorCUdQUlNfTExDX1VfRElTQ19DTUQJCT0gMHgwNCwKKwlHUFJTX0xMQ19VX1VBX1JFU1AJCT0gMHgwNiwKKwlHUFJTX0xMQ19VX1NBQk1fQ01ECQk9IDB4MDcsCisJR1BSU19MTENfVV9GUk1SX1JFU1AJCT0gMHgwOCwKKwlHUFJTX0xMQ19VX1hJRAkJCT0gMHgwYiwKKwlHUFJTX0xMQ19VX05VTExfQ01ECQk9IDB4MDAsCit9OworCisvKiBUUyAwNC42NCBTZWN0aW9uIDcuMS4yIFRhYmxlIDc6IExMQyBsYXllciBwcmltaXRpdmVzIChHTU0vU05EQ1AvU01TL1RPTSkgKi8KKy8qIFRTIDA0LjY1IFNlY3Rpb24gNS4xLjIgVGFibGUgMjogU2VydmljZSBwcmltaXRpdmVzIHVzZWQgYnkgU05EQ1AgKi8KK2VudW0gZ3Byc19sbGNfcHJpbWl0aXZlIHsKKwkvKiBHTU0gPC0+IExMTUUgKi8KKwlMTEdNTV9BU1NJR05fUkVRLAkvKiBHTU0gdGVsbHMgdXMgbmV3IFRMTEk6IFRMTEkgb2xkLCBUTExJIG5ldywgS2MsIENpcGhBbGcgKi8KKwlMTEdNTV9SRVNFVF9SRVEsCS8qIEdNTSB0ZWxscyB1cyB0byBwZXJmb3JtIFhJRCBuZWdvdGlhdGlvbjogVExMSSAqLworCUxMR01NX1JFU0VUX0NORiwJLyogTExDIGluZm9ybXMgR01NIHRoYXQgWElEIGhhcyBjb21wbGV0ZWQ6IFRMTEkgKi8KKwlMTEdNTV9TVVNQRU5EX1JFUSwJLyogR01NIHRlbGxzIHVzIE1TIGhhcyBzdXNwZW5kZWQ6IFRMTEksIFBhZ2UgKi8KKwlMTEdNTV9SRVNVTUVfUkVRLAkvKiBHTU0gdGVsbHMgdXMgTVMgaGFzIHJlc3VtZWQ6IFRMTEkgKi8KKwlMTEdNTV9QQUdFX0lORCwJCS8qIExMQyBhc2tzIEdNTSB0byBwYWdlIE1TOiBUTExJICovCisJTExHTU1fSU9WX1JFUSwJCS8qIEdNTSB0ZWxscyB1cyB0byBwZXJmb3JtIFhJRDogVExMSSAqLworCUxMR01NX1NUQVRVU19JTkQsCS8qIExMQyBpbmZvcm1zIEdNTSBhYm91dCBlcnJvcjogVExMSSwgQ2F1c2UgKi8KKwkvKiBMTEUgPC0+IChHTU0vU05EQ1AvU01TL1RPTSkgKi8KKwlMTF9SRVNFVF9JTkQsCQkvKiBUTExJICovCisJTExfRVNUQUJMSVNIX1JFUSwJLyogVExMSSwgWElEIFJlcSAqLworCUxMX0VTVEFCTElTSF9JTkQsCS8qIFRMTEksIFhJRCBSZXEsIE4yMDEtSSwgTjIwMS1VICovCisJTExfRVNUQUJMSVNIX1JFU1AsCS8qIFRMTEksIFhJRCBOZWdvdGlhdGVkICovCisJTExfRVNUQUJMSVNIX0NPTkYsCS8qIFRMTEksIFhJRCBOZWcsIE4yMDEtaSwgTjIwMS1VICovCisJTExfUkVMRUFTRV9SRVEsCQkvKiBUTExJLCBMb2NhbCAqLworCUxMX1JFTEVBU0VfSU5ELAkJLyogVExMSSwgQ2F1c2UgKi8KKwlMTF9SRUxFQVNFX0NPTkYsCS8qIFRMTEkgKi8KKwlMTF9YSURfUkVRLAkJLyogVExMSSwgWElEIFJlcXVlc3RlZCAqLworCUxMX1hJRF9JTkQsCQkvKiBUTExJLCBYSUQgUmVxLCBOMjAxLUksIE4yMDEtVSAqLworCUxMX1hJRF9SRVNQLAkJLyogVExMSSwgWElEIE5lZ290aWF0ZWQgKi8KKwlMTF9YSURfQ09ORiwJCS8qIFRMTEksIFhJRCBOZWcsIE4yMDEtSSwgTjIwMS1VICovCisJTExfREFUQV9SRVEsCQkvKiBUTExJLCBTTi1QRFUsIFJlZiwgUW9TLCBSYWRpbyBQcmlvLCBDaXBoICovCisJTExfREFUQV9JTkQsCQkvKiBUTExJLCBTTi1QRFUgKi8KKwlMTF9EQVRBX0NPTkYsCQkvKiBUTExJLCBSZWYgKi8KKwlMTF9VTklUREFUQV9SRVEsCS8qIFRMTEksIFNOLVBEVSwgUmVmLCBRb1MsIFJhZGlvIFByaW8sIENpcGggKi8KKwlMTF9VTklUREFUQV9JTkQsCS8qIFRMTEksIFNOLVBEVSAqLworCUxMX1NUQVRVU19JTkQsCQkvKiBUTExJLCBDYXVzZSAqLworfTsKKworLyogU2VjdGlvbiA0LjUuMiBMb2dpY2FsIExpbmsgU3RhdGVzICsgQW5uZXggQy4yICovCitlbnVtIGdwcnNfbGxjX2xsX3N0YXRlIHsKKwlHUFJTX0xMU19VTkFTU0lHTkVECT0gMSwJLyogTm8gVExMSSB5ZXQgKi8KKwlHUFJTX0xMU19BU1NJR05FRF9BRE0JPSAyLAkvKiBUTExJIGFzc2lnbmVkICovCisJR1BSU19MTFNfTE9DQUxfRVNUCT0gMywJLyogTG9jYWwgRXN0YWJsaXNobWVudCAqLworCUdQUlNfTExTX1JFTU9URV9FU1QJPSA0LAkvKiBSZW1vdGUgRXN0YWJsaXNobWVudCAqLworCUdQUlNfTExTX0FCTQkJPSA1LAorCUdQUlNfTExTX0xPQ0FMX1JFTAk9IDYsCS8qIExvY2FsIFJlbGVhc2UgKi8KKwlHUFJTX0xMU19USU1FUl9SRUMgCT0gNywJLyogVGltZXIgUmVjb3ZlcnkgKi8KK307CisKKy8qIFNlY3Rpb24gNC43LjE6IExvZ2ljYWwgTGluayBFbnRpdHk6IE9uZSBwZXIgRExDSSAoVExMSSArIFNBUEkpICovCitzdHJ1Y3QgZ3Byc19sbGNfbGxlIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCisJc3RydWN0IHRpbWVyX2xpc3QgdDIwMDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0MjAxOwkvKiB3YWl0IGZvciBhY2tub3dsZWRnZW1lbnQgKi8KKworCWVudW0gZ3Byc19sbGNfbGxfc3RhdGUgc3RhdGU7CisKKwl1aW50MzJfdCB0bGxpOworCXVpbnQzMl90IHNhcGk7CisKKwl1aW50OF90IHZfc2VudDsKKwl1aW50OF90IHZfYWNrOworCXVpbnQ4X3Qgdl9yZWN2OworCisJdW5zaWduZWQgaW50IG4yMDA7CisJdW5zaWduZWQgaW50IHJldHJhbnNfY3RyOworCisJLyogb3ZlciB3aGljaCBCU1NHUCBCVFMgY3R4IGRvIHdlIG5lZWQgdG8gdHJhbnNtaXQgKi8KKwl1aW50MTZfdCBidmNpOworCXVpbnQxNl90IG5zZWk7Cit9OworCitleHRlcm4gc3RydWN0IGxsaXN0X2hlYWQgZ3Byc19sbGNfbGxlczsKKworLyogQlNTR1AtVUwtVU5JVERBVEEuaW5kICovCitpbnQgZ3Byc19sbGNfcmN2bXNnKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCB0bHZfcGFyc2VkICp0dik7CisKKy8qIExMLVVOSVREQVRBLnJlcSAqLworaW50IGdwcnNfbGxjX3R4X3VpKHN0cnVjdCBtc2diICptc2csIHVpbnQ4X3Qgc2FwaSwgaW50IGNvbW1hbmQpOworCitpbnQgZ3Byc19sbGNfdnR5X2luaXQodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3Byc19ucy5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3Byc19ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNWU3ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ncHJzX25zLmgKQEAgLTAsMCArMSwyMzIgQEAKKyNpZm5kZWYgX0dQUlNfTlNfSAorI2RlZmluZSBfR1BSU19OU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyogR1BSUyBOZXR3b3JrcyBTZXJ2aWNlIChOUykgbWVzc2FnZXMgb24gdGhlIEdiIGludGVyZmFjZQorICogM0dQUCBUUyAwOC4xNiB2ZXJzaW9uIDguMC4xIFJlbGVhc2UgMTk5OSAvIEVUU0kgVFMgMTAxIDI5OSBWOC4wLjEgKDIwMDItMDUpCisgKiAzR1BQIFRTIDQ4LjAxNiB2ZXJzaW9uIDYuNS4wIFJlbGVhc2UgNiAvIEVUU0kgVFMgMTQ4IDAxNiBWNi41LjAgKDIwMDUtMTEpICovCisKK3N0cnVjdCBncHJzX25zX2hkciB7CisJdWludDhfdCBwZHVfdHlwZTsKKwl1aW50OF90IGRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBUUyAwOC4xNiwgU2VjdGlvbiAxMC4zLjcsIFRhYmxlIDE0ICovCitlbnVtIG5zX3BkdV90eXBlIHsKKwlOU19QRFVUX1VOSVREQVRBCT0gMHgwMCwKKwlOU19QRFVUX1JFU0VUCQk9IDB4MDIsCisJTlNfUERVVF9SRVNFVF9BQ0sJPSAweDAzLAorCU5TX1BEVVRfQkxPQ0sJCT0gMHgwNCwKKwlOU19QRFVUX0JMT0NLX0FDSwk9IDB4MDUsCisJTlNfUERVVF9VTkJMT0NLCQk9IDB4MDYsCisJTlNfUERVVF9VTkJMT0NLX0FDSwk9IDB4MDcsCisJTlNfUERVVF9TVEFUVVMJCT0gMHgwOCwKKwlOU19QRFVUX0FMSVZFCQk9IDB4MGEsCisJTlNfUERVVF9BTElWRV9BQ0sJPSAweDBiLAorCS8qIFRTIDQ4LjAxNiBTZWN0aW9uIDEwLjMuNywgVGFibGUgMTAuMy43LjEgKi8KKwlTTlNfUERVVF9BQ0sJCT0gMHgwYywKKwlTTlNfUERVVF9BREQJCT0gMHgwZCwKKwlTTlNfUERVVF9DSEFOR0VfV0VJR0hUCT0gMHgwZSwKKwlTTlNfUERVVF9DT05GSUcJCT0gMHgwZiwKKwlTTlNfUERVVF9DT05GSUdfQUNLCT0gMHgxMCwKKwlTTlNfUERVVF9ERUxFVEUJCT0gMHgxMSwKKwlTTlNfUERVVF9TSVpFCQk9IDB4MTIsCisJU05TX1BEVVRfU0laRV9BQ0sJPSAweDEzLAorfTsKKworLyogVFMgMDguMTYsIFNlY3Rpb24gMTAuMywgVGFibGUgMTIgKi8KK2VudW0gbnNfY3RybF9pZSB7CisJTlNfSUVfQ0FVU0UJCT0gMHgwMCwKKwlOU19JRV9WQ0kJCT0gMHgwMSwKKwlOU19JRV9QRFUJCT0gMHgwMiwKKwlOU19JRV9CVkNJCQk9IDB4MDMsCisJTlNfSUVfTlNFSQkJPSAweDA0LAorCS8qIFRTIDQ4LjAxNiBTZWN0aW9uIDEwLjMsIFRhYmxlIDEwLjMuMSAqLworCU5TX0lFX0lQdjRfTElTVAkJPSAweDA1LAorCU5TX0lFX0lQdjZfTElTVAkJPSAweDA2LAorCU5TX0lFX01BWF9OUl9OU1ZDCT0gMHgwNywKKwlOU19JRV9JUHY0X0VQX05SCT0gMHgwOCwKKwlOU19JRV9JUHY2X0VQX05SCT0gMHgwOSwKKwlOU19JRV9SRVNFVF9GTEFHCT0gMHgwYSwKKwlOU19JRV9JUF9BRERSCQk9IDB4MGIsCit9OworCisvKiBUUyAwOC4xNiwgU2VjdGlvbiAxMC4zLjIsIFRhYmxlIDEzICovCitlbnVtIG5zX2NhdXNlIHsKKwlOU19DQVVTRV9UUkFOU0lUX0ZBSUwJCT0gMHgwMCwKKwlOU19DQVVTRV9PTV9JTlRFUlZFTlRJT04JPSAweDAxLAorCU5TX0NBVVNFX0VRVUlQX0ZBSUwJCT0gMHgwMiwKKwlOU19DQVVTRV9OU1ZDX0JMT0NLRUQJCT0gMHgwMywKKwlOU19DQVVTRV9OU1ZDX1VOS05PV04JCT0gMHgwNCwKKwlOU19DQVVTRV9CVkNJX1VOS05PV04JCT0gMHgwNSwKKwlOU19DQVVTRV9TRU1fSU5DT1JSX1BEVQkJPSAweDA4LAorCU5TX0NBVVNFX1BEVV9JTkNPTVBfUFNUQVRFCT0gMHgwYSwKKwlOU19DQVVTRV9QUk9UT19FUlJfVU5TUEVDCT0gMHgwYiwKKwlOU19DQVVTRV9JTlZBTF9FU1NFTlRfSUUJPSAweDBjLAorCU5TX0NBVVNFX01JU1NJTkdfRVNTRU5UX0lFCT0gMHgwZCwKKwkvKiBUUyA0OC4wMTYgU2VjdGlvbiAxMC4zLjIsIFRhYmxlIDEwLjMuMi4xICovCisJTlNfQ0FVU0VfSU5WQUxfTlJfSVB2NF9FUAk9IDB4MGUsCisJTlNfQ0FVU0VfSU5WQUxfTlJfSVB2Nl9FUAk9IDB4MGYsCisJTlNfQ0FVU0VfSU5WQUxfTlJfTlNfVkMJCT0gMHgxMCwKKwlOU19DQVVTRV9JTlZBTF9XRUlHSAkJPSAweDExLAorCU5TX0NBVVNFX1VOS05fSVBfRVAJCT0gMHgxMiwKKwlOU19DQVVTRV9VTktOX0lQX0FERFIJCT0gMHgxMywKKwlOU19DQVVTRV9VTktOX0lQX1RFU1RfRkFJTEVECT0gMHgxNCwKK307CisKKy8qIE91ciBJbXBsZW1lbnRhdGlvbiAqLworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGltZXIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKworI2RlZmluZSBOU19USU1FUlNfQ09VTlQgNworI2RlZmluZSBOU19USU1FUlMgIih0bnMtYmxvY2t8dG5zLWJsb2NrLXJldHJpZXN8dG5zLXJlc2V0fHRucy1yZXNldC1yZXRyaWVzfHRucy10ZXN0fHRucy1hbGl2ZXx0bnMtYWxpdmUtcmV0cmllcykiCisjZGVmaW5lIE5TX1RJTUVSU19IRUxQCVwKKwkiKHVuKWJsb2NraW5nIFRpbWVyIChUbnMtYmxvY2spIHRpbWVvdXRcbiIJCVwKKwkiKHVuKWJsb2NraW5nIFRpbWVyIChUbnMtYmxvY2spIG51bWJlciBvZiByZXRyaWVzXG4iCVwKKwkiUmVzZXQgVGltZXIgKFRucy1yZXNldCkgdGltZW91dFxuIgkJCVwKKwkiUmVzZXQgVGltZXIgKFRucy1yZXNldCkgbnVtYmVyIG9mIHJldHJpZXNcbiIJCVwKKwkiVGVzdCBUaW1lciAoVG5zLXRlc3QpIHRpbWVvdXRcbiIJCQlcCisKK2VudW0gbnNfdGltZW91dCB7CisJTlNfVE9VVF9UTlNfQkxPQ0ssCisJTlNfVE9VVF9UTlNfQkxPQ0tfUkVUUklFUywKKwlOU19UT1VUX1ROU19SRVNFVCwKKwlOU19UT1VUX1ROU19SRVNFVF9SRVRSSUVTLAorCU5TX1RPVVRfVE5TX1RFU1QsCisJTlNfVE9VVF9UTlNfQUxJVkUsCisJTlNfVE9VVF9UTlNfQUxJVkVfUkVUUklFUywKK307CisKKyNkZWZpbmUgTlNFX1NfQkxPQ0tFRAkweDAwMDEKKyNkZWZpbmUgTlNFX1NfQUxJVkUJMHgwMDAyCisKK2VudW0gZ3Byc19uc19sbCB7CisJR1BSU19OU19MTF9VRFAsCisJR1BSU19OU19MTF9FMSwKKwlHUFJTX05TX0xMX0ZSX0dSRSwKK307CisKK2VudW0gZ3Byc19uc19ldnQgeworCUdQUlNfTlNfRVZUX1VOSVRfREFUQSwKK307CisKK3N0cnVjdCBncHJzX25zdmM7Cit0eXBlZGVmIGludCBncHJzX25zX2NiX3QoZW51bSBncHJzX25zX2V2dCBldmVudCwgc3RydWN0IGdwcnNfbnN2YyAqbnN2YywKKwkJCSBzdHJ1Y3QgbXNnYiAqbXNnLCB1aW50MTZfdCBidmNpKTsKKworLyogQW4gaW5zdGFuY2Ugb2YgdGhlIE5TIHByb3RvY29sIHN0YWNrICovCitzdHJ1Y3QgZ3Byc19uc19pbnN0IHsKKwkvKiBjYWxsYmFjayB0byB0aGUgdXNlciBmb3IgaW5jb21pbmcgVU5JVCBEQVRBIElORCAqLworCWdwcnNfbnNfY2JfdCAqY2I7CisKKwkvKiBsaW5rZWQgbGlzdHMgb2YgYWxsIE5TVkMgaW4gdGhpcyBpbnN0YW5jZSAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGdwcnNfbnN2Y3M7CisKKwkvKiBhIE5TVkMgb2JqZWN0IHRoYXQncyBuZWVkZWQgdG8gZGVhbCB3aXRoIHBhY2tldHMgZm9yIHVua25vd24gTlNWQyAqLworCXN0cnVjdCBncHJzX25zdmMgKnVua25vd25fbnN2YzsKKworCXVpbnQxNl90IHRpbWVvdXRbTlNfVElNRVJTX0NPVU5UXTsKKworCS8qIE5TLW92ZXItSVAgc3BlY2lmaWMgYml0cyAqLworCXN0cnVjdCB7CisJCXN0cnVjdCBic2NfZmQgZmQ7CisJCXVpbnQzMl90IGxvY2FsX2lwOworCQl1aW50MTZfdCBsb2NhbF9wb3J0OworCX0gbnNpcDsKKwkvKiBOUy1vdmVyLUZSLW92ZXItR1JFLW92ZXItSVAgc3BlY2lmaWMgYml0cyAqLworCXN0cnVjdCB7CisJCXN0cnVjdCBic2NfZmQgZmQ7CisJCXVpbnQzMl90IGxvY2FsX2lwOworCQlpbnQgZW5hYmxlZDoxOworCX0gZnJncmU7Cit9OworCitlbnVtIG5zdmNfdGltZXJfbW9kZSB7CisJLyogc3RhbmRhcmQgdGltZXJzICovCisJTlNWQ19USU1FUl9UTlNfVEVTVCwKKwlOU1ZDX1RJTUVSX1ROU19BTElWRSwKKwlOU1ZDX1RJTUVSX1ROU19SRVNFVCwKKwlfTlNWQ19USU1FUl9OUiwKK307CisKK3N0cnVjdCBncHJzX25zdmMgeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpOworCisJdWludDE2X3QgbnNlaTsJCS8qIGVuZC10by1lbmQgc2lnbmlmaWNhbmNlICovCisJdWludDE2X3QgbnN2Y2k7CS8qIHVuaXF1ZWx5IGlkZW50aWZpZXMgTlMtVkMgYXQgU0dTTiAqLworCisJdWludDMyX3Qgc3RhdGU7CisJdWludDMyX3QgcmVtb3RlX3N0YXRlOworCisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJZW51bSBuc3ZjX3RpbWVyX21vZGUgdGltZXJfbW9kZTsKKwlpbnQgYWxpdmVfcmV0cmllczsKKworCXVuc2lnbmVkIGludCByZW1vdGVfZW5kX2lzX3Nnc246MTsKKwl1bnNpZ25lZCBpbnQgcGVyc2lzdGVudDoxOworCisJc3RydWN0IHJhdGVfY3RyX2dyb3VwICpjdHJnOworCisJLyogd2hpY2ggbGluay1sYXllciBhcmUgd2UgYmFzZWQgb24/ICovCisJZW51bSBncHJzX25zX2xsIGxsOworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHNvY2thZGRyX2luIGJ0c19hZGRyOworCQl9IGlwOworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHNvY2thZGRyX2luIGJ0c19hZGRyOworCQl9IGZyZ3JlOworCX07Cit9OworCisvKiBDcmVhdGUgYSBuZXcgTlMgcHJvdG9jb2wgaW5zdGFuY2UgKi8KK3N0cnVjdCBncHJzX25zX2luc3QgKmdwcnNfbnNfaW5zdGFudGlhdGUoZ3Byc19uc19jYl90ICpjYik7CisKKy8qIERlc3Ryb3kgYSBOUyBwcm90b2NvbCBpbnN0YW5jZSAqLwordm9pZCBncHJzX25zX2Rlc3Ryb3koc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpKTsKKworLyogTGlzdGVuIGZvciBpbmNvbWluZyBHUFJTIHBhY2tldHMgdmlhIE5TL1VEUCAqLworaW50IGdwcnNfbnNfbnNpcF9saXN0ZW4oc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpKTsKKworc3RydWN0IHNvY2thZGRyX2luOworCisvKiBtYWluIGZ1bmN0aW9uIGZvciBoaWdoZXIgbGF5ZXJzIChCU1NHUCkgdG8gc2VuZCBOUyBtZXNzYWdlcyAqLworaW50IGdwcnNfbnNfc2VuZG1zZyhzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2ksIHN0cnVjdCBtc2diICptc2cpOworCitpbnQgZ3Byc19uc190eF9yZXNldChzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjLCB1aW50OF90IGNhdXNlKTsKK2ludCBncHJzX25zX3R4X2Jsb2NrKHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHVpbnQ4X3QgY2F1c2UpOworaW50IGdwcnNfbnNfdHhfdW5ibG9jayhzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjKTsKKworLyogTGlzdGVuIGZvciBpbmNvbWluZyBHUFJTIHBhY2tldHMgdmlhIE5TL0ZSL0dSRSAqLworaW50IGdwcnNfbnNfZnJncmVfbGlzdGVuKHN0cnVjdCBncHJzX25zX2luc3QgKm5zaSk7CisKKy8qIEVzdGFibGlzaCBhIGNvbm5lY3Rpb24gKGZyb20gdGhlIEJTUykgdG8gdGhlIFNHU04gKi8KK3N0cnVjdCBncHJzX25zdmMgKm5zaXBfY29ubmVjdChzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2ksCisJCQkJc3RydWN0IHNvY2thZGRyX2luICpkZXN0LCB1aW50MTZfdCBuc2VpLAorCQkJCXVpbnQxNl90IG5zdmNpKTsKKworc3RydWN0IGdwcnNfbnN2YyAqbnN2Y19jcmVhdGUoc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpLCB1aW50MTZfdCBuc3ZjaSk7Cit2b2lkIG5zdmNfZGVsZXRlKHN0cnVjdCBncHJzX25zdmMgKm5zdmMpOworc3RydWN0IGdwcnNfbnN2YyAqbnN2Y19ieV9uc2VpKHN0cnVjdCBncHJzX25zX2luc3QgKm5zaSwgdWludDE2X3QgbnNlaSk7CitzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjX2J5X25zdmNpKHN0cnVjdCBncHJzX25zX2luc3QgKm5zaSwgdWludDE2X3QgbnN2Y2kpOworCisvKiBJbml0aWF0ZSBhIFJFU0VUIHByb2NlZHVyZSAoaW5jbHVkaW5nIHRpbWVyIHN0YXJ0LCAuLi4pKi8KK3ZvaWQgZ3Byc19uc3ZjX3Jlc2V0KHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHVpbnQ4X3QgY2F1c2UpOworCisvKiBBZGQgTlMtc3BlY2lmaWMgVlRZIHN0dWZmICovCitpbnQgZ3Byc19uc192dHlfaW5pdChzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2kpOworCisjZGVmaW5lIE5TX0FMTE9DX1NJWkUJMTAyNAorI2RlZmluZSBOU19BTExPQ19IRUFEUk9PTSAyMAorc3RhdGljIGlubGluZSBzdHJ1Y3QgbXNnYiAqZ3Byc19uc19tc2diX2FsbG9jKHZvaWQpCit7CisJcmV0dXJuIG1zZ2JfYWxsb2NfaGVhZHJvb20oTlNfQUxMT0NfU0laRSwgTlNfQUxMT0NfSEVBRFJPT00sICJHUFJTL05TIik7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3Byc19uc19mcmdyZS5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3Byc19uc19mcmdyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiY2Q0M2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ncHJzX25zX2ZyZ3JlLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIF9HUFJTX05TX0ZSR1JFX0gKKyNkZWZpbmUgX0dQUlNfTlNfRlJHUkVfSAorCitpbnQgZ3Byc19uc19mcmdyZV9zZW5kbXNnKHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHN0cnVjdCBtc2diICptc2cpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dwcnNfc2dzbi5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3Byc19zZ3NuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBjMmE1NgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dwcnNfc2dzbi5oCkBAIC0wLDAgKzEsMTgzIEBACisjaWZuZGVmIF9HUFJTX1NHU05fSAorI2RlZmluZSBfR1BSU19TR1NOX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL2dzbTQ4Lmg+CisKKyNkZWZpbmUgR1NNX0lNU0lfTEVOR1RIIDE3CisjZGVmaW5lIEdTTV9JTUVJX0xFTkdUSCAxNworI2RlZmluZSBHU01fRVhURU5TSU9OX0xFTkdUSCAxNQorCisvKiBUUyAwNC4wOCA0LjEuMy4zIEdNTSBtb2JpbGl0eSBtYW5hZ2VtZW50IHN0YXRlcyBvbiB0aGUgbmV0d29yayBzaWRlICovCitlbnVtIGdwcnNfbW1fc3RhdGUgeworCUdNTV9ERVJFR0lTVEVSRUQsCQkvKiA0LjEuMy4zLjEuMSAqLworCUdNTV9DT01NT05fUFJPQ19JTklULAkJLyogNC4xLjMuMy4xLjIgKi8KKwlHTU1fUkVHSVNURVJFRF9OT1JNQUwsCQkvKiA0LjEuMy4zLjIuMSAqLworCUdNTV9SRUdJU1RFUkVEX1NVU1BFTkRFRCwJLyogNC4xLjMuMy4yLjIgKi8KKwlHTU1fREVSRUdJU1RFUkVEX0lOSVQsCQkvKiA0LjEuMy4zLjEuNCAqLworfTsKKworZW51bSBncHJzX2NpcGhfYWxnbyB7CisJR1BSU19BTEdPX0dFQTAsCisJR1BSU19BTEdPX0dFQTEsCisJR1BSU19BTEdPX0dFQTIsCit9OworCitlbnVtIGdyc19tbV9jdHIgeworCUdNTV9DVFJfUEtUU19TSUdfSU4sCisJR01NX0NUUl9QS1RTX1NJR19PVVQsCisJR01NX0NUUl9QS1RTX1VEQVRBX0lOLAorCUdNTV9DVFJfUEtUU19VREFUQV9PVVQsCisJR01NX0NUUl9CWVRFU19VREFUQV9JTiwKKwlHTU1fQ1RSX0JZVEVTX1VEQVRBX09VVCwKKwlHTU1fQ1RSX1BEUF9DVFhfQUNULAorCUdNTV9DVFJfU1VTUEVORCwKKwlHTU1fQ1RSX1BBR0lOR19QUywKKwlHTU1fQ1RSX1BBR0lOR19DUywKKwlHTU1fQ1RSX1JBX1VQREFURSwKK307CisKKyNkZWZpbmUgTVNfUkFESU9fQUNDRVNTX0NBUEEKKworLyogQWNjb3JkaW5nIHRvIFRTIDAzLjYwLCBUYWJsZSA1OiBTR1NOIE1NIGFuZCBQRFAgQ29udGV4dHMgKi8KKy8qIEV4dGVuZGVkIGJ5IDNHUFAgVFMgMjMuMDYwLCBUYWJsZSA2OiBTR1NOIE1NIGFuZCBQRFAgQ29udGV4dHMgKi8KK3N0cnVjdCBzZ3NuX21tX2N0eCB7CisJc3RydWN0IGxsaXN0X2hlYWQJbGlzdDsKKworCWNoYXIgCQkJaW1zaVtHU01fSU1TSV9MRU5HVEhdOworCWVudW0gZ3Byc19tbV9zdGF0ZQltbV9zdGF0ZTsKKwl1aW50MzJfdCAJCXBfdG1zaTsKKwl1aW50MzJfdCAJCXBfdG1zaV9zaWc7CisJY2hhciAJCQlpbWVpW0dTTV9JTUVJX0xFTkdUSF07CisJLyogT3B0OiBTb2Z0d2FyZSBWZXJzaW9uIE51bWJiZXIgLyBUUyAyMy4xOTUgKi8KKwljaGFyIAkJCW1zaXNkbltHU01fRVhURU5TSU9OX0xFTkdUSF07CisJc3RydWN0IGdwcnNfcmFfaWQJcmE7CisJdWludDE2X3QJCWNlbGxfaWQ7CisJdWludDMyX3QJCWNlbGxfaWRfYWdlOworCXVpbnQxNl90CQlzYWM7CS8qIEl1OiBTZXJ2aWNlIEFyZWEgQ29kZSAqLworCXVpbnQzMl90CQlzYWNfYWdlOy8qIEl1OiBTZXJ2aWNlIEFyZWEgQ29kZSBhZ2UgKi8KKwkvKiBWTFIgbnVtYmVyICovCisJdWludDMyX3QJCW5ld19zZ3NuX2FkZHI7CisJLyogQXV0aGVudGljYXRpb24gVHJpcGxldHMgKi8KKwkvKiBLYyAqLworCS8qIEl1OiBDSywgSUssIEtTSSAqLworCS8qIENLU04gKi8KKwllbnVtIGdwcnNfY2lwaF9hbGdvCWNpcGhfYWxnbzsKKwlzdHJ1Y3QgeworCQl1aW50OF90CWJ1ZlsxNF07CS8qIDEwLjUuNS4xMmEgKi8KKwkJdWludDhfdAlsZW47CisJfSBtc19yYWRpb19hY2Nlc3NfY2FwYTsKKwlzdHJ1Y3QgeworCQl1aW50OF90CWJ1Zls0XTsJCS8qIDEwLjUuNS4xMiAqLworCQl1aW50OF90CWxlbjsKKwl9IG1zX25ldHdvcmtfY2FwYTsKKwl1aW50MTZfdAkJZHJ4X3Bhcm1zOworCWludAkJCW1ucmc7CS8qIE1TIHJlcG9ydGVkIHRvIEhMUj8gKi8KKwlpbnQJCQluZ2FmOwkvKiBNUyByZXBvcnRlZCB0byBNU0MvVkxSPyAqLworCWludAkJCXBwZjsJLyogcGFnaW5nIGZvciBHUFJTICsgbm9uLUdQUlM/ICovCisJLyogU01TIFBhcmFtZXRlcnMgKi8KKwlpbnQJCQlyZWNvdmVyeTsKKwl1aW50OF90CQkJcmFkaW9fcHJpb19zbXM7CisKKwlzdHJ1Y3QgbGxpc3RfaGVhZAlwZHBfbGlzdDsKKworCS8qIEFkZGl0aW9uYWwgYml0cyBub3QgcHJlc2VudCBpbiB0aGUgR1NNIFRTICovCisJdWludDMyX3QJCXRsbGk7CisJdWludDE2X3QJCW5zZWk7CisJdWludDE2X3QJCWJ2Y2k7CisJc3RydWN0IHJhdGVfY3RyX2dyb3VwCSpjdHJnOworCXN0cnVjdCB0aW1lcl9saXN0CXRpbWVyOworCXVuc2lnbmVkIGludAkJVDsKK307CisKKy8qIGxvb2stdXAgYSBTR1NOIE1NIGNvbnRleHQgYmFzZWQgb24gVExMSSArIFJBSSAqLworc3RydWN0IHNnc25fbW1fY3R4ICpzZ3NuX21tX2N0eF9ieV90bGxpKHVpbnQzMl90IHRsbGksCisJCQkJCWNvbnN0IHN0cnVjdCBncHJzX3JhX2lkICpyYWlkKTsKK3N0cnVjdCBzZ3NuX21tX2N0eCAqc2dzbl9tbV9jdHhfYnlfcHRtc2kodWludDMyX3QgdG1zaSk7CitzdHJ1Y3Qgc2dzbl9tbV9jdHggKnNnc25fbW1fY3R4X2J5X2ltc2koY29uc3QgY2hhciAqaW1zaSk7CisKKy8qIEFsbG9jYXRlIGEgbmV3IFNHU04gTU0gY29udGV4dCAqLworc3RydWN0IHNnc25fbW1fY3R4ICpzZ3NuX21tX2N0eF9hbGxvYyh1aW50MzJfdCB0bGxpLAorCQkJCQljb25zdCBzdHJ1Y3QgZ3Byc19yYV9pZCAqcmFpZCk7CisKKworZW51bSBwZHBfY3R4X3N0YXRlIHsKKwlQRFBfU1RBVEVfTk9ORSwKKwlQRFBfU1RBVEVfQ1JfUkVRLAorCVBEUF9TVEFURV9DUl9DT05GLAorfTsKKworZW51bSBwZHBfdHlwZSB7CisJUERQX1RZUEVfTk9ORSwKKwlQRFBfVFlQRV9FVFNJX1BQUCwKKwlQRFBfVFlQRV9JQU5BX0lQdjQsCisJUERQX1RZUEVfSUFOQV9JUHY2LAorfTsKKworc3RydWN0IHNnc25fcGRwX2N0eCB7CisJc3RydWN0IGxsaXN0X2hlYWQJbGlzdDsJLyogbGlzdF9oZWFkIGZvciBtbWN0eC0+cGRwX2xpc3QgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZAlnX2xpc3Q7CS8qIGxpc3RfaGVhZCBmb3IgZ2xvYmFsIGxpc3QgKi8KKwlzdHJ1Y3Qgc2dzbl9tbV9jdHgJKm1tOwkvKiBiYWNrIHBvaW50ZXIgdG8gTU0gQ1RYICovCisJc3RydWN0IHNnc25fZ2dzbl9jdHgJKmdnc247CS8qIHdoaWNoIEdHU04gc2VydmVzIHRoaXMgUERQICovCisKKwkvL3Vuc2lnbmVkIGludAkJaWQ7CisJc3RydWN0IHBkcF90CQkqbGliOwkvKiBwb2ludGVyIHRvIGxpYmd0cCBQRFAgY3R4ICovCisJZW51bSBwZHBfY3R4X3N0YXRlCXN0YXRlOworCWVudW0gcGRwX3R5cGUJCXR5cGU7CisJdWludDMyX3QJCWFkZHJlc3M7CisJY2hhciAJCQkqYXBuX3N1YnNjcmliZWQ7CisJLy9jaGFyIAkJCSphcG5fdXNlZDsKKwl1aW50MTZfdAkJbnNhcGk7CS8qIFNORENQICovCisJdWludDE2X3QJCXNhcGk7CS8qIExMQyAqLworCXVpbnQ4X3QJCQl0aTsJLyogdHJhbnNhY3Rpb24gaWRlbnRpZmllciAqLworCWludAkJCXZwbG1uX2FsbG93ZWQ7CisJdWludDMyX3QJCXFvc19wcm9maWxlX3N1YnNjcjsKKwkvL3VpbnQzMl90CQlxb3NfcHJvZmlsZV9yZXE7CisJLy91aW50MzJfdAkJcW9zX3Byb2ZpbGVfbmVnOworCXVpbnQ4X3QJCQlyYWRpb19wcmlvOworCXVpbnQzMl90CQl0eF9ucGR1X25yOworCXVpbnQzMl90CQlyeF9ucGR1X25yOworCXVpbnQzMl90CQl0eF9ndHBfc25kOworCXVpbnQzMl90CQlyeF9ndHBfc251OworCS8vdWludDMyX3QJCWNoYXJnaW5nX2lkOworCWludAkJCXJlb3JkZXJpbmdfcmVxZDsKK307CisKKworc3RydWN0IHNnc25fcGRwX2N0eCAqc2dzbl9wZHBfY3R4X2J5X25zYXBpKGNvbnN0IHN0cnVjdCBzZ3NuX21tX2N0eCAqbW0sCisJCQkJCSAgIHVpbnQ4X3QgbnNhcGkpOworc3RydWN0IHNnc25fcGRwX2N0eCAqc2dzbl9wZHBfY3R4X2J5X3RpZChjb25zdCBzdHJ1Y3Qgc2dzbl9tbV9jdHggKm1tLAorCQkJCQkgdWludDhfdCB0aWQpOworc3RydWN0IHNnc25fcGRwX2N0eCAqc2dzbl9wZHBfY3R4X2FsbG9jKHN0cnVjdCBzZ3NuX21tX2N0eCAqbW0sCisJCQkJCXVpbnQ4X3QgbnNhcGkpOwordm9pZCBzZ3NuX3BkcF9jdHhfZnJlZShzdHJ1Y3Qgc2dzbl9wZHBfY3R4ICpwZHApOworCisKK3N0cnVjdCBzZ3NuX2dnc25fY3R4IHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCXVpbnQzMl90IGlkOworCXVuc2lnbmVkIGludCBndHBfdmVyc2lvbjsKKwlzdHJ1Y3QgaW5fYWRkciByZW1vdGVfYWRkcjsKKwlzdHJ1Y3QgZ3NuX3QgKmdzbjsKK307CitzdHJ1Y3Qgc2dzbl9nZ3NuX2N0eCAqc2dzbl9nZ3NuX2N0eF9hbGxvYyh1aW50MzJfdCBpZCk7CitzdHJ1Y3Qgc2dzbl9nZ3NuX2N0eCAqc2dzbl9nZ3NuX2N0eF9ieV9pZCh1aW50MzJfdCBpZCk7CitzdHJ1Y3Qgc2dzbl9nZ3NuX2N0eCAqc2dzbl9nZ3NuX2N0eF9maW5kX2FsbG9jKHVpbnQzMl90IGlkKTsKKworc3RydWN0IGFwbl9jdHggeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHNnc25fZ2dzbl9jdHggKmdnc247CisJY2hhciAqbmFtZTsKKwljaGFyICpkZXNjcmlwdGlvbjsKK307CisKK2V4dGVybiBzdHJ1Y3QgbGxpc3RfaGVhZCBzZ3NuX21tX2N0eHRzOworZXh0ZXJuIHN0cnVjdCBsbGlzdF9oZWFkIHNnc25fZ2dzbl9jdHh0czsKK2V4dGVybiBzdHJ1Y3QgbGxpc3RfaGVhZCBzZ3NuX2Fwbl9jdHh0czsKK2V4dGVybiBzdHJ1Y3QgbGxpc3RfaGVhZCBzZ3NuX3BkcF9jdHh0czsKKwordWludDMyX3Qgc2dzbl9hbGxvY19wdG1zaSh2b2lkKTsKKworI2VuZGlmIC8qIF9HUFJTX1NHU05fSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzA4LmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fMDRfMDguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDJlMjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzA4LmgKQEAgLTAsMCArMSw2NCBAQAorI2lmbmRlZiBfR1NNXzA0XzA4X0gKKyNkZWZpbmUgX0dTTV8wNF8wOF9ICisKKyNpbmNsdWRlIDxvcGVuYnNjL21lYXNfcmVwLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9wcm90b2NvbC9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc200OC5oPgorCitzdHJ1Y3QgbXNnYjsKK3N0cnVjdCBnc21fYnRzOworc3RydWN0IGdzbV9zdWJzY3JpYmVyOworc3RydWN0IGdzbV9uZXR3b3JrOworc3RydWN0IGdzbV90cmFuczsKKworI2RlZmluZSBHU000OF9BTExPQ19TSVpFCTEwMjQKKyNkZWZpbmUgR1NNNDhfQUxMT0NfSEVBRFJPT00JMTI4CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1zZ2IgKmdzbTQ4X21zZ2JfYWxsb2Modm9pZCkKK3sKKwlyZXR1cm4gbXNnYl9hbGxvY19oZWFkcm9vbShHU000OF9BTExPQ19TSVpFLCBHU000OF9BTExPQ19IRUFEUk9PTSwKKwkJCQkgICAiR1NNIDA0LjA4Iik7Cit9CisKKy8qIGNvbmZpZyBvcHRpb25zIGNvbnRyb2xsaW5nIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGxvd2VyIGxldmVzICovCit2b2lkIGdzbTA0MDhfYWxsb3dfZXZlcnlvbmUoaW50IGFsbG93KTsKKworaW50IGdzbTA0MDhfcmN2bXNnKHN0cnVjdCBtc2diICptc2csIHVfaW50OF90IGxpbmtfaWQpOworZW51bSBnc21fY2hhbl90IGdldF9jdHlwZV9ieV9jaHJlcShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCByYSwgaW50IG5lY2kpOworZW51bSBnc21fY2hyZXFfcmVhc29uX3QgZ2V0X3JlYXNvbl9ieV9jaHJlcShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCByYSwgaW50IG5lY2kpOworCitpbnQgZ3NtNDhfdHhfbW1faW5mbyhzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7CitpbnQgZ3NtNDhfdHhfbW1fYXV0aF9yZXEoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90ICpyYW5kLCBpbnQga2V5X3NlcSk7CitpbnQgZ3NtNDhfdHhfbW1fYXV0aF9yZWooc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworaW50IGdzbTQ4X3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV90cmFucyAqdHJhbnMpOworCitpbnQgZ3NtNDhfc2VuZF9ycl9yZWxlYXNlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKK2ludCBnc200OF9zZW5kX3JyX2NpcGhfbW9kZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgaW50IHdhbnRfaW1laXN2KTsKK2ludCBnc200OF9zZW5kX3JyX2FwcF9pbmZvKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBhcGR1X2lkLAorCQkJICAgdV9pbnQ4X3QgYXBkdV9sZW4sIGNvbnN0IHVfaW50OF90ICphcGR1KTsKK2ludCBnc200OF9zZW5kX3JyX2Fzc19jbWQoc3RydWN0IGdzbV9sY2hhbiAqZGVzdF9sY2hhbiwgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IHBvd2VyX2NsYXNzKTsKK2ludCBnc200OF9zZW5kX2hvX2NtZChzdHJ1Y3QgZ3NtX2xjaGFuICpvbGRfbGNoYW4sIHN0cnVjdCBnc21fbGNoYW4gKm5ld19sY2hhbiwKKwkJICAgICAgdV9pbnQ4X3QgcG93ZXJfY29tbWFuZCwgdV9pbnQ4X3QgaG9fcmVmKTsKKworaW50IGJzY191cHF1ZXVlKHN0cnVjdCBnc21fbmV0d29yayAqbmV0KTsKKworaW50IG1uY2Nfc2VuZChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgaW50IG1zZ190eXBlLCB2b2lkICphcmcpOworCisvKiBjb252ZXJ0IGEgQVNDSUkgcGhvbmUgbnVtYmVyIHRvIGNhbGwtY29udHJvbCBCQ0QgKi8KK2ludCBlbmNvZGVfYmNkX251bWJlcih1X2ludDhfdCAqYmNkX2x2LCB1X2ludDhfdCBtYXhfbGVuLAorCQkgICAgICBpbnQgaF9sZW4sIGNvbnN0IGNoYXIgKmlucHV0KTsKK2ludCBkZWNvZGVfYmNkX251bWJlcihjaGFyICpvdXRwdXQsIGludCBvdXRwdXRfbGVuLCBjb25zdCB1X2ludDhfdCAqYmNkX2x2LAorCQkgICAgICBpbnQgaF9sZW4pOworCitpbnQgc2VuZF9zaWVtZW5zX21ycGNpKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCAqY2xhc3NtYXJrMl9sdik7CitpbnQgZ3NtNDhfZXh0cmFjdF9taSh1aW50OF90ICpjbGFzc21hcmsyLCBpbnQgbGVuZ3RoLCBjaGFyICptaV9zdHJpbmcsIHVpbnQ4X3QgKm1pX3R5cGUpOworaW50IGdzbTQ4X3BhZ2luZ19leHRyYWN0X21pKHN0cnVjdCBnc200OF9wYWdfcmVzcCAqcGFnLCBpbnQgbGVuZ3RoLCBjaGFyICptaV9zdHJpbmcsIHVfaW50OF90ICptaV90eXBlKTsKK2ludCBnc200OF9oYW5kbGVfcGFnaW5nX3Jlc3Aoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworCitpbnQgZ3NtNDhfbGNoYW5fbW9kaWZ5KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsY2hhbl9tb2RlKTsKK2ludCBnc200OF9yeF9ycl9tb2RpZl9hY2soc3RydWN0IG1zZ2IgKm1zZyk7CitpbnQgZ3NtNDhfcGFyc2VfbWVhc19yZXAoc3RydWN0IGdzbV9tZWFzX3JlcCAqcmVwLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF8wOF9ncHJzLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fMDRfMDhfZ3Bycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MzNlMmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fMDRfMDhfZ3Bycy5oCkBAIC0wLDAgKzEsMzYzIEBACisjaWZuZGVmIF9HU000OF9HUFJTX0gKKyNkZWZpbmUgX0dTTTQ4X0dQUlNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzA4Lmg+CisKKy8qIFRhYmxlIDEwLjQgLyAxMC40YSwgR1BSUyBNb2JpbGl0eSBNYW5hZ2VtZW50IChHTU0pICovCisjZGVmaW5lIEdTTTQ4X01UX0dNTV9BVFRBQ0hfUkVRCQkweDAxCisjZGVmaW5lIEdTTTQ4X01UX0dNTV9BVFRBQ0hfQUNLCQkweDAyCisjZGVmaW5lIEdTTTQ4X01UX0dNTV9BVFRBQ0hfQ09NUEwJMHgwMworI2RlZmluZSBHU000OF9NVF9HTU1fQVRUQUNIX1JFSgkJMHgwNAorI2RlZmluZSBHU000OF9NVF9HTU1fREVUQUNIX1JFUQkJMHgwNQorI2RlZmluZSBHU000OF9NVF9HTU1fREVUQUNIX0FDSwkJMHgwNgorCisjZGVmaW5lIEdTTTQ4X01UX0dNTV9SQV9VUERfUkVRCQkweDA4CisjZGVmaW5lIEdTTTQ4X01UX0dNTV9SQV9VUERfQUNLCQkweDA5CisjZGVmaW5lIEdTTTQ4X01UX0dNTV9SQV9VUERfQ09NUEwJMHgwYQorI2RlZmluZSBHU000OF9NVF9HTU1fUkFfVVBEX1JFSgkJMHgwYgorCisjZGVmaW5lIEdTTTQ4X01UX0dNTV9QVE1TSV9SRUFMTF9DTUQJMHgxMAorI2RlZmluZSBHU000OF9NVF9HTU1fUFRNU0lfUkVBTExfQ09NUEwJMHgxMQorI2RlZmluZSBHU000OF9NVF9HTU1fQVVUSF9DSVBIX1JFUQkweDEyCisjZGVmaW5lIEdTTTQ4X01UX0dNTV9BVVRIX0NJUEhfUkVTUAkweDEzCisjZGVmaW5lIEdTTTQ4X01UX0dNTV9BVVRIX0NJUEhfUkVKCTB4MTQKKyNkZWZpbmUgR1NNNDhfTVRfR01NX0lEX1JFUQkJMHgxNQorI2RlZmluZSBHU000OF9NVF9HTU1fSURfUkVTUAkJMHgxNgorI2RlZmluZSBHU000OF9NVF9HTU1fU1RBVFVTCQkweDIwCisjZGVmaW5lIEdTTTQ4X01UX0dNTV9JTkZPCQkweDIxCisKKy8qIFRhYmxlIDEwLjRhLCBHUFJTIFNlc3Npb24gTWFuYWdlbWVudCAoR1NNKSAqLworI2RlZmluZSBHU000OF9NVF9HU01fQUNUX1BEUF9SRVEJMHg0MQorI2RlZmluZSBHU000OF9NVF9HU01fQUNUX1BEUF9BQ0sJMHg0MgorI2RlZmluZSBHU000OF9NVF9HU01fQUNUX1BEUF9SRUoJMHg0MworI2RlZmluZSBHU000OF9NVF9HU01fUkVRX1BEUF9BQ1QJMHg0NAorI2RlZmluZSBHU000OF9NVF9HU01fUkVRX1BEUF9BQ1RfUkVKCTB4NDUKKyNkZWZpbmUgR1NNNDhfTVRfR1NNX0RFQUNUX1BEUF9SRVEJMHg0NgorI2RlZmluZSBHU000OF9NVF9HU01fREVBQ1RfUERQX0FDSwkweDQ3CisjZGVmaW5lIEdTTTQ4X01UX0dTTV9BQ1RfQUFfUERQX1JFUQkweDUwCisjZGVmaW5lIEdTTTQ4X01UX0dTTV9BQ1RfQUFfUERQX0FDSwkweDUxCisjZGVmaW5lIEdTTTQ4X01UX0dTTV9BQ1RfQUFfUERQX1JFSgkweDUyCisjZGVmaW5lIEdTTTQ4X01UX0dTTV9ERUFDVF9BQV9QRFBfUkVRCTB4NTMKKyNkZWZpbmUgR1NNNDhfTVRfR1NNX0RFQUNUX0FBX1BEUF9BQ0sJMHg1NAorI2RlZmluZSBHU000OF9NVF9HU01fU1RBVFVTCQkweDU1CisKKy8qIENoYXB0ZXIgMTAuNS41LjIgLyBUYWJsZSAxMC41LjEzNSAqLworI2RlZmluZSBHUFJTX0FUVF9UX0FUVEFDSAkJMQorI2RlZmluZSBHUFJTX0FUVF9UX0FUVF9XSElMRV9JTVNJCTIKKyNkZWZpbmUgR1BSU19BVFRfVF9DT01CSU5FRAkJMworCisvKiBDaGFwdGVyIDEwLjUuNS41IC8gVGFibGUgMTAuNS4xMzggKi8KKyNkZWZpbmUgR1BSU19ERVRfVF9NT19HUFJTCQkxCisjZGVmaW5lIEdQUlNfREVUX1RfTU9fSU1TSQkJMgorI2RlZmluZSBHUFJTX0RFVF9UX01PX0NPTUJJTkVECQkzCisvKiBOZXR3b3JrIHRvIE1TIGRpcmVjdGlvbiAqLworI2RlZmluZSBHUFJTX0RFVF9UX01UX1JFQVRUX1JFUQkJMQorI2RlZmluZSBHUFJTX0RFVF9UX01UX1JFQVRUX05PVFJFUQkyCisjZGVmaW5lIEdQUlNfREVUX1RfTVRfSU1TSQkJMworCisvKiBDaGFwdGVyIDEwLjUuNS4xOCAvIFRhYmxlIDEwNS4xNTAgKi8KKyNkZWZpbmUgR1BSU19VUERfVF9SQQkJCTAKKyNkZWZpbmUgR1BSU19VUERfVF9SQV9MQQkJMQorI2RlZmluZSBHUFJTX1VQRF9UX1JBX0xBX0lNU0lfQVRUCTIKKyNkZWZpbmUgR1BSU19VUERfVF9QRVJJT0RJQwkJMworCitlbnVtIGdzbTQ4X2dwcnNfaWVfbW0geworCUdTTTQ4X0lFX0dNTV9USU1FUl9SRUFEWQk9IDB4MTcsCS8qIDEwLjUuNy4zICovCisJR1NNNDhfSUVfR01NX0FMTE9DX1BUTVNJCT0gMHgxOCwJLyogMTAuNS4xLjQgKi8KKwlHU000OF9JRV9HTU1fUFRNU0lfU0lHCQk9IDB4MTksCS8qIDEwLjUuNS44ICovCisJR1NNNDhfSUVfR01NX0FVVEhfUkFORAkJPSAweDIxLAkvKiAxMC41LjMuMSAqLworCUdTTTQ4X0lFX0dNTV9BVVRIX1NSRVMJCT0gMHgyMiwJLyogMTAuNS4zLjIgKi8KKwlHU000OF9JRV9HTU1fSU1FSVNWCQk9IDB4MjMsCS8qIDEwLjUuMS40ICovCisJR1NNNDhfSUVfR01NX0RSWF9QQVJBTQkJPSAweDI3LAkvKiAxMC41LjUuNiAqLworCUdTTTQ4X0lFX0dNTV9NU19ORVRfQ0FQQQk9IDB4MzEsCS8qIDEwLjUuNS4xMiAqLworfTsKKworZW51bSBnc200OF9ncHJzX2llX3NtIHsKKwlHU000OF9JRV9HU01fQVBOCQk9IDB4MjgsCS8qIDEwLjUuNi4xICovCisJR1NNNDhfSUVfR1NNX1BST1RPX0NPTkZfT1BUCT0gMHgyNywJLyogMTAuNS42LjMgKi8KKwlHU000OF9JRV9HU01fUERQX0FERFIJCT0gMHgyYiwgLyogMTAuNS42LjQgKi8KKwlHU000OF9JRV9HU01fQUFfVE1SCQk9IDB4MjksCS8qIDEwLjUuNy4zICovCisJR1NNNDhfSUVfR1NNX05BTUVfRlVMTAkJPSAweDQzLCAvKiAxMC41LjMuNWEgKi8KKwlHU000OF9JRV9HU01fTkFNRV9TSE9SVAkJPSAweDQ1LCAvKiAxMC41LjMuNWEgKi8KKwlHU000OF9JRV9HU01fVElNRVpPTkUJCT0gMHg0NiwgLyogMTAuNS4zLjggKi8KKwlHU000OF9JRV9HU01fVVRDX0FORF9UWgkJPSAweDQ3LCAvKiAxMC41LjMuOSAqLworCUdTTTQ4X0lFX0dTTV9MU0FfSUQJCT0gMHg0OCwgLyogMTAuNS4zLjExICovCisKKwkvKiBGYWtlIElFcyB0aGF0IGFyZSBub3QgcHJlc2VudCBvbiB0aGUgTGF5ZXIzIGFpciBpbnRlcmZhY2UsCisJICogYnV0IHdoaWNoIHdlIHVzZSB0byBzaW1wbGlmeSBpbnRlcm5hbCBBUElzICovCisJT1NNT19JRV9HU01fUkVRX1FPUwkJPSAweGZkLAorCU9TTU9fSUVfR1NNX1JFUV9QRFBfQUREUgk9IDB4ZmUsCit9OworCisvKiBDaGFwdGVyIDkuNC4xNSAvIFRhYmxlIDkuNC4xNSAqLworc3RydWN0IGdzbTQ4X3JhX3VwZF9hY2sgeworCXVpbnQ4X3QgZm9yY2Vfc3RieTo0LAkvKiAxMC41LjUuNyAqLworCQkgdXBkX3Jlc3VsdDo0OwkvKiAxMC41LjUuMTcgKi8KKwl1aW50OF90IHJhX3VwZF90aW1lcjsJLyogMTAuNS43LjMgKi8KKwlzdHJ1Y3QgZ3NtNDhfcmFfaWQgcmFfaWQ7IC8qIDEwLjUuNS4xNSAqLworCXVpbnQ4X3QgZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIENoYXB0ZXIgMTAuNS43LjMgKi8KK2VudW0gZ3NtNDhfZ3Byc190bXJfdW5pdCB7CisJR1BSU19UTVJfMlNFQ09ORFMJPSAwIDw8IDUsCisJR1BSU19UTVJfTUlOVVRFCQk9IDEgPDwgNSwKKwlHUFJTX1RNUl82TUlOVVRFCT0gMiA8PCA1LAorCUdQUlNfVE1SX0RFQUNUSVZBVEVECT0gMyA8PCA1LAorfTsKKworLyogQ2hhcHRlciA5LjQuMiAvIFRhYmxlIDkuNC4yICovCitzdHJ1Y3QgZ3NtNDhfYXR0YWNoX2FjayB7CisJdWludDhfdCBhdHRfcmVzdWx0OjQsCS8qIDEwLjUuNS43ICovCisJCSBmb3JjZV9zdGJ5OjQ7CS8qIDEwLjUuNS4xICovCisJdWludDhfdCByYV91cGRfdGltZXI7CS8qIDEwLjUuNy4zICovCisJdWludDhfdCByYWRpb19wcmlvOwkvKiAxMC41LjcuMiAqLworCXN0cnVjdCBnc200OF9yYV9pZCByYV9pZDsgLyogMTAuNS41LjE1ICovCisJdWludDhfdCBkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogQ2hhcHRlciA5LjUuMSAvIFRhYmxlIDkuNS4xICovCitzdHJ1Y3QgZ3NtNDhfYWN0X3BkcF9jdHhfcmVxIHsKKwl1aW50OF90IHJlcV9uc2FwaTsKKwl1aW50OF90IHJlcV9sbGNfc2FwaTsKKwl1aW50OF90IGRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBDaGFwdGVyIDEwLjUuNS4xNCAvIFRhYmxlIDEwLjUuMTQ3ICovCitlbnVtIGdzbTQ4X2dtbV9jYXVzZSB7CisJR01NX0NBVVNFX0lNU0lfVU5LTk9XTgkJPSAweDAyLAorCUdNTV9DQVVTRV9JTExFR0FMX01TCQk9IDB4MDMsCisJR01NX0NBVVNFX0lMTEVHQUxfTUUJCT0gMHgwNiwKKwlHTU1fQ0FVU0VfR1BSU19OT1RBTExPV0VECT0gMHgwNywKKwlHTU1fQ0FVU0VfR1BSU19PVEhFUl9OT1RBTExPV0VECT0gMHgwOCwKKwlHTU1fQ0FVU0VfTVNfSURfTk9UX0RFUklWRUQJPSAweDA5LAorCUdNTV9DQVVTRV9JTVBMX0RFVEFDSEVECQk9IDB4MGEsCisJR01NX0NBVVNFX1BMTU5fTk9UQUxMT1dFRAk9IDB4MGIsCisJR01NX0NBVVNFX0xBX05PVEFMTE9XRUQJCT0gMHgwYywKKwlHTU1fQ0FVU0VfUk9BTUlOR19OT1RBTExPV0VECT0gMHgwZCwKKwlHTU1fQ0FVU0VfTk9fR1BSU19QTE1OCQk9IDB4MGUsCisJR01NX0NBVVNFX01TQ19URU1QX05PVFJFQUNICT0gMHgxMCwKKwlHTU1fQ0FVU0VfTkVUX0ZBSUwJCT0gMHgxMSwKKwlHTU1fQ0FVU0VfQ09OR0VTVElPTgkJPSAweDE2LAorCUdNTV9DQVVTRV9TRU1fSU5DT1JSX01TRwk9IDB4NWYsCisJR01NX0NBVVNFX0lOVl9NQU5EX0lORk8JCT0gMHg2MCwKKwlHTU1fQ0FVU0VfTVNHVF9OT1RFWElTVF9OT1RJTVBMCT0gMHg2MSwKKwlHTU1fQ0FVU0VfTVNHVF9JTkNPTVBfUF9TVEFURQk9IDB4NjIsCisJR01NX0NBVVNFX0lFX05PVEVYSVNUX05PVElNUEwJPSAweDYzLAorCUdNTV9DQVVTRV9DT05EX0lFX0VSUgkJPSAweDY0LAorCUdNTV9DQVVTRV9NU0dfSU5DT01QX1BfU1RBVEUJPSAweDY1LAorCUdNTV9DQVVTRV9QUk9UT19FUlJfVU5TUEVDCT0gMHg2ZiwKK307CisKKy8qIENoYXB0ZXIgMTAuNC42LjYgLyBUYWJsZSAxMC41LjE1NyAqLworZW51bSBnc200OF9nc21fY2F1c2UgeworCUdTTV9DQVVTRV9JTlNVRkZfUlNSQwkJPSAweDFhLAorCUdTTV9DQVVTRV9NSVNTSU5HX0FQTgkJPSAweDFiLAorCUdTTV9DQVVTRV9VTktOT1dOX1BEUAkJPSAweDFjLAorCUdTTV9DQVVTRV9BVVRIX0ZBSUxFRAkJPSAweDFkLAorCUdTTV9DQVVTRV9BQ1RfUkVKX0dHU04JCT0gMHgxZSwKKwlHU01fQ0FVU0VfQUNUX1JFSl9VTlNQRUMJPSAweDFmLAorCUdTTV9DQVVTRV9TRVJWX09QVF9OT1RTVVBQCT0gMHgyMCwKKwlHU01fQ0FVU0VfUkVRX1NFUlZfT1BUX05PVFNVQgk9IDB4MjEsCisJR1NNX0NBVVNFX1NFUlZfT1BUX1RFTVBfT09PCT0gMHgyMiwKKwlHU01fQ0FVU0VfTlNBUElfSU5fVVNFCQk9IDB4MjMsCisJR1NNX0NBVVNFX0RFQUNUX1JFR1VMQVIJCT0gMHgyNCwKKwlHU01fQ0FVU0VfUU9TX05PVF9BQ0NFUFRFRAk9IDB4MjUsCisJR1NNX0NBVVNFX05FVF9GQUlMCQk9IDB4MjYsCisJR1NNX0NBVVNFX1JFQUNUX1JRRAkJPSAweDI3LAorCUdTTV9DQVVTRV9GRUFUVVJFX05PVFNVUFAJPSAweDI4LAorCUdTTV9DQVVTRV9JTlZBTElEX1RSQU5TX0lECT0gMHg1MSwKKwlHU01fQ0FVU0VfU0VNX0lOQ09SUl9NU0cJPSAweDVmLAorCUdTTV9DQVVTRV9JTlZfTUFORF9JTkZPCQk9IDB4NjAsCisJR1NNX0NBVVNFX01TR1RfTk9URVhJU1RfTk9USU1QTAk9IDB4NjEsCisJR1NNX0NBVVNFX01TR1RfSU5DT01QX1BfU1RBVEUJPSAweDYyLAorCUdTTV9DQVVTRV9JRV9OT1RFWElTVF9OT1RJTVBMCT0gMHg2MywKKwlHU01fQ0FVU0VfQ09ORF9JRV9FUlIJCT0gMHg2NCwKKwlHU01fQ0FVU0VfTVNHX0lOQ09NUF9QX1NUQVRFCT0gMHg2NSwKKwlHU01fQ0FVU0VfUFJPVE9fRVJSX1VOU1BFQwk9IDB4NmYsCit9OworCisvKiBTZWN0aW9uIDYuMS4yLjI6IFNlc3Npb24gbWFuYWdlbWVudCBzdGF0ZXMgb24gdGhlIG5ldHdvcmsgc2lkZSAqLworZW51bSBnc200OF9wZHBfc3RhdGUgeworCVBEUF9TX0lOQUNUSVZFLAorCVBEUF9TX0FDVElWRV9QRU5ESU5HLAorCVBEUF9TX0FDVElWRSwKKwlQRFBfU19JTkFDVElWRV9QRU5ESU5HLAorCVBEUF9TX01PRElGWV9QRU5ESU5HLAorfTsKKworLyogVGFibGUgMTAuNS4xNTUvM0dQUCBUUyAyNC4wMDggKi8KK2VudW0gZ3NtNDhfcGRwX3R5cGVfb3JnIHsKKwlQRFBfVFlQRV9PUkdfRVRTSQkJPSAweDAwLAorCVBEUF9UWVBFX09SR19JRVRGCQk9IDB4MDEsCit9OworZW51bSBnc200OF9wZHBfdHlwZV9uciB7CisJUERQX1RZUEVfTl9FVFNJX1JFU0VSVkVECT0gMHgwMCwKKwlQRFBfVFlQRV9OX0VUU0lfUFBQCQk9IDB4MDEsCisJUERQX1RZUEVfTl9JRVRGX0lQdjQJCT0gMHgyMSwKKwlQRFBfVFlQRV9OX0lFVEZfSVB2NgkJPSAweDU3LAorfTsKKworLyogRmlndXJlIDEwLjUuMTM4LzI0LjAwOCAvIENoYXB0ZXIgMTAuNS42LjUgKi8KK2VudW0gZ3NtNDhfcW9zX3JlbGlhYl9jbGFzcyB7CisJR1NNNDhfUU9TX1JDX0xMQ19BQ0tfUkxDX0FDS19EQVRBX1BST1QJPSAyLAorCUdTTTQ4X1FPU19SQ19MTENfVU5fUkxDX0FDS19EQVRBX1BST1QJPSAzLAorCUdTTTQ4X1FPU19SQ19MTENfVU5fUkxDX1VOX1BST1RfREFUQQk9IDQsCisJR1NNNDhfUU9TX1JDX0xMQ19VTl9STENfVU5fREFUQV9VTgk9IDUsCit9OworCisvKiBGaWd1cmUgMTAuNS4xMzgvMjQuMDA4IC8gQ2hhcHRlciAxMC41LjYuNSAqLworZW51bSBnc200OF9xb3NfcHJlY2VkX2NsYXNzIHsKKwlHU000OF9RT1NfUENfSElHSAk9IDEsCisJR1NNNDhfUU9TX1BDX05PUk1BTAk9IDIsCisJR1NNNDhfUU9TX1BDX0xPVwk9IDMsCit9OworCisvKiBGaWd1cmUgMTAuNS4xMzgvMjQuMDA4IC8gQ2hhcHRlciAxMC41LjYuNSAqLworZW51bSBnc200OF9xb3NfcGVha190cHV0IHsKKwlHU000OF9RT1NfUEVBS19UUFVUXzEwMDBicHMJPSAxLAorCUdTTTQ4X1FPU19QRUFLX1RQVVRfMjAwMGJwcwk9IDIsCisJR1NNNDhfUU9TX1BFQUtfVFBVVF80MDAwYnBzCT0gMywKKwlHU000OF9RT1NfUEVBS19UUFVUXzgwMDBicHMJPSA0LAorCUdTTTQ4X1FPU19QRUFLX1RQVVRfMTYwMDBicHMJPSA1LAorCUdTTTQ4X1FPU19QRUFLX1RQVVRfMzIwMDBicHMJPSA2LAorCUdTTTQ4X1FPU19QRUFLX1RQVVRfNjQwMDBicHMJPSA3LAorCUdTTTQ4X1FPU19QRUFLX1RQVVRfMTI4MDAwYnBzCT0gOCwKKwlHU000OF9RT1NfUEVBS19UUFVUXzI1NjAwMGJwcwk9IDksCit9OworCisvKiBGaWd1cmUgMTAuNS4xMzgvMjQuMDA4IC8gQ2hhcHRlciAxMC41LjYuNSAqLworZW51bSBnc200OF9xb3NfbWVhbl90cHV0IHsKKwlHU000OF9RT1NfTUVBTl9UUFVUXzEwMGJwaAk9IDEsCisJR1NNNDhfUU9TX01FQU5fVFBVVF8yMDBicGgJPSAyLAorCUdTTTQ4X1FPU19NRUFOX1RQVVRfNTAwYnBoCT0gMywKKwlHU000OF9RT1NfTUVBTl9UUFVUXzEwMDBicGgJPSA0LAorCUdTTTQ4X1FPU19NRUFOX1RQVVRfMjAwMGJwaAk9IDUsCisJR1NNNDhfUU9TX01FQU5fVFBVVF81MDAwYnBoCT0gNiwKKwlHU000OF9RT1NfTUVBTl9UUFVUXzEwMDAwYnBoCT0gNywKKwlHU000OF9RT1NfTUVBTl9UUFVUXzIwMDAwYnBoCT0gOCwKKwlHU000OF9RT1NfTUVBTl9UUFVUXzUwMDAwYnBoCT0gOSwKKwlHU000OF9RT1NfTUVBTl9UUFVUXzEwMGticGgJPSAxMCwKKwlHU000OF9RT1NfTUVBTl9UUFVUXzIwMGticGgJPSAxMSwKKwlHU000OF9RT1NfTUVBTl9UUFVUXzUwMGticGgJPSAweGMsCisJR1NNNDhfUU9TX01FQU5fVFBVVF8xTWJwaAk9IDB4ZCwKKwlHU000OF9RT1NfTUVBTl9UUFVUXzJNYnBoCT0gMHhlLAorCUdTTTQ4X1FPU19NRUFOX1RQVVRfNU1icGgJPSAweGYsCisJR1NNNDhfUU9TX01FQU5fVFBVVF8xME1icGgJPSAweDEwLAorCUdTTTQ4X1FPU19NRUFOX1RQVVRfMjBNYnBoCT0gMHgxMSwKKwlHU000OF9RT1NfTUVBTl9UUFVUXzUwTWJwaAk9IDB4MTIsCisJR1NNNDhfUU9TX01FQU5fVFBVVF9CRVNUX0VGRk9SVAk9IDB4MWYsCit9OworCisvKiBGaWd1cmUgMTAuNS4xMzgvMjQuMDA4IC8gQ2hhcHRlciAxMC41LjYuNSAqLworZW51bSBnc200OF9xb3NfZXJyX3NkdSB7CisJR1NNNDhfUU9TX0VSUlNEVV9OT0RFVEVDVAk9IDEsCisJR1NNNDhfUU9TX0VSUlNEVV9ZRVMJCT0gMiwKKwlHU000OF9RT1NfRVJSU0RVX05PCQk9IDMsCit9OworCisvKiBGaWd1cmUgMTAuNS4xMzgvMjQuMDA4IC8gQ2hhcHRlciAxMC41LjYuNSAqLworZW51bSBnc200OF9xb3NfZGVsaXZfb3JkZXIgeworCUdTTTQ4X1FPU19ET19PUkRFUkVECQk9IDEsCisJR1NNNDhfUU9TX0RPX1VOT1JERVJFRAkJPSAyLAorfTsKKworLyogRmlndXJlIDEwLjUuMTM4LzI0LjAwOCAvIENoYXB0ZXIgMTAuNS42LjUgKi8KK2VudW0gZ3NtNDhfcW9zX3RyYWZfY2xhc3MgeworCUdTTTQ4X1FPU19UQ19DT05WRVJTQVRJT05BTAk9IDEsCisJR1NNNDhfUU9TX1RDX1NUUkVBTUlORwkJPSAyLAorCUdTTTQ4X1FPU19UQ19JTlRFUkFDVElWRQk9IDMsCisJR1NNNDhfUU9TX1RDX0JBQ0tHUk9VTkQJCT0gNCwKK307CisKKy8qIEZpZ3VyZSAxMC41LjEzOC8yNC4wMDggLyBDaGFwdGVyIDEwLjUuNi41ICovCitlbnVtIGdzbTQ4X3Fvc19tYXhfc2R1X3NpemUgeworCS8qIHZhbHVlcyBiZWxvdyBpbiAxMCBvY3RldCBncmFudWxhcml0eSAqLworCUdTTTQ4X1FPU19NQVhTRFVfMTUwMgkJPSAweDk3LAorCUdTTTQ4X1FPU19NQVhTRFVfMTUxMAkJPSAweDk4LAorCUdTTTQ4X1FPU19NQVhTRFVfMTUyMAkJPSAweDk5LAorfTsKKworLyogRmlndXJlIDEwLjUuMTM4LzI0LjAwOCAvIENoYXB0ZXIgMTAuNS42LjUgKi8KK2VudW0gZ3NtNDhfcW9zX21heF9iaXRyYXRlIHsKKwlHU000OF9RT1NfTUJSQVRFXzFrCQk9IDB4MDEsCisJR1NNNDhfUU9TX01CUkFURV82M2sJCT0gMHgzZiwKKwlHU000OF9RT1NfTUJSQVRFXzY0awkJPSAweDQwLAorCUdTTTQ4X1FPU19NQlJBVEVfNTY4awkJPSAweDdmLAorCUdTTTQ4X1FPU19NQlJBVEVfNTc2awkJPSAweDgwLAorCUdTTTQ4X1FPU19NQlJBVEVfODY0MGsJCT0gMHhmZSwKKwlHU000OF9RT1NfTUJSQVRFXzBrCQk9IDB4ZmYsCit9OworCisvKiBGaWd1cmUgMTAuNS4xMzgvMjQuMDA4IC8gQ2hhcHRlciAxMC41LjYuNSAqLworZW51bSBnc200OF9xb3NfcmVzaWRfYmVyIHsKKwlHU000OF9RT1NfUkJFUl81ZV8yCQk9IDB4MDEsCisJR1NNNDhfUU9TX1JCRVJfMWVfMgkJPSAweDAyLAorCUdTTTQ4X1FPU19SQkVSXzVlXzMJCT0gMHgwMywKKwlHU000OF9RT1NfUkJFUl80ZV8zCQk9IDB4MDQsCisJR1NNNDhfUU9TX1JCRVJfMWVfMwkJPSAweDA1LAorCUdTTTQ4X1FPU19SQkVSXzFlXzQJCT0gMHgwNiwKKwlHU000OF9RT1NfUkJFUl8xZV81CQk9IDB4MDcsCisJR1NNNDhfUU9TX1JCRVJfMWVfNgkJPSAweDA4LAorCUdTTTQ4X1FPU19SQkVSXzZlXzgJCT0gMHgwOSwKK307CisKKy8qIEZpZ3VyZSAxMC41LjEzOC8yNC4wMDggLyBDaGFwdGVyIDEwLjUuNi41ICovCitlbnVtIGdzbTQ4X3Fvc19zZHVfZXJyIHsKKwlHU000OF9RT1NfU0VSUl8xZV8yCQk9IDB4MDEsCisJR1NNNDhfUU9TX1NFUlJfN2VfMgkJPSAweDAyLAorCUdTTTQ4X1FPU19TRVJSXzFlXzMJCT0gMHgwMywKKwlHU000OF9RT1NfU0VSUl8xZV80CQk9IDB4MDQsCisJR1NNNDhfUU9TX1NFUlJfMWVfNQkJPSAweDA1LAorCUdTTTQ4X1FPU19TRVJSXzFlXzYJCT0gMHgwNiwKKwlHU000OF9RT1NfU0VSUl8xZV8xCQk9IDB4MDcsCit9OworCisvKiBGaWd1cmUgMTAuNS4xMzgvMjQuMDA4IC8gQ2hhcHRlciAxMC41LjYuNSAqLworc3RydWN0IGdzbTQ4X3FvcyB7CisJLyogb2N0ZXQgMyAqLworCXVpbnQ4X3QgcmVsaWFiX2NsYXNzOjM7CisJdWludDhfdCBkZWxheV9jbGFzczozOworCXVpbnQ4X3Qgc3BhcmU6MjsKKwkvKiBvY3RldCA0ICovCisJdWludDhfdCBwcmVjZWRfY2xhc3M6MzsKKwl1aW50OF90IHNwYXJlMjoxOworCXVpbnQ4X3QgcGVha190cHV0OjQ7CisJLyogb2N0ZXQgNSAqLworCXVpbnQ4X3QgbWVhbl90cHV0OjU7CisJdWludDhfdCBzcGFyZTM6MzsKKwkvKiBvY3RldCA2ICovCisJdWludDhfdCBkZWxpdl9lcnJfc2R1OjM7CisJdWludDhfdCBkZWxpdl9vcmRlcjoyOworCXVpbnQ4X3QgdHJhZl9jbGFzczozOworCS8qIG9jdGV0IDcgKi8KKwl1aW50OF90IG1heF9zZHVfc2l6ZTsKKwkvKiBvY3RldCA4ICovCisJdWludDhfdCBtYXhfYml0cmF0ZV91cDsKKwkvKiBvY3RldCA5ICovCisJdWludDhfdCBtYXhfYml0cmF0ZV9kb3duOworCS8qIG9jdGV0IDEwICovCisJdWludDhfdCBzZHVfZXJyX3JhdGlvOjQ7CisJdWludDhfdCByZXNpZF9iZXI6NDsKKwkvKiBvY3RldCAxMSAqLworCXVpbnQ4X3QgaGFuZGxpbmdfcHJpbzoyOworCXVpbnQ4X3QgeGZlcl9kZWxheTo2OworCS8qIG9jdGV0IDEyICovCisJdWludDhfdCBndWFyX2JpdHJhdGVfdXA7CisJLyogb2N0ZXQgMTMgKi8KKwl1aW50OF90IGd1YXJfYml0cmF0ZV9kb3duOworCS8qIG9jdGV0IDE0ICovCisJdWludDhfdCBzcmNfc3RhdHNfZGVzYzo0OworCXVpbnQ4X3Qgc2lnX2luZDoxOworCXVpbnQ4X3Qgc3BhcmU1OjM7CisJLyogb2N0ZXQgMTUgKi8KKwl1aW50OF90IG1heF9iaXRyYXRlX2Rvd25fZXh0OworCS8qIG9jdGV0IDE2ICovCisJdWludDhfdCBndWFyX2JpdHJhdGVfZG93bl9leHQ7Cit9OworCisKK2ludCBncHJzX3RsbGlfdHlwZSh1aW50MzJfdCB0bGxpKTsKKworI2VuZGlmIC8qIF9HU000OF9HUFJTX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF8xMS5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEyN2FmMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF8xMS5oCkBAIC0wLDAgKzEsMzYgQEAKKyNpZm5kZWYgX0dTTV8wNF8xMV9ICisjZGVmaW5lIF9HU01fMDRfMTFfSAorCisjaW5jbHVkZSA8b3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzExLmg+CisKKy8qIFNNUyBkZWxpdmVyIFBEVSAqLworc3RydWN0IHNtc19kZWxpdmVyIHsKKwl1X2ludDhfdCBtdGk6MjsJCS8qIG1lc3NhZ2UgdHlwZSBpbmRpY2F0b3IgKi8KKwl1X2ludDhfdCBtbXM6MTsJCS8qIG1vcmUgbWVzc2FnZXMgdG8gc2VuZCAqLworCXVfaW50OF90IHJwOjE7CQkvKiByZXBseSBwYXRoICovCisJdV9pbnQ4X3QgdWRoaToxOwkvKiB1c2VyIGRhdGEgaGVhZGVyIGluZGljYXRvciAqLworCXVfaW50OF90IHNyaToxOwkJLyogc3RhdHVzIHJlcG9ydCBpbmRpY2F0aW9uICovCisJdV9pbnQ4X3QgKm9yaWdfYWRkcjsJLyogb3JpZ2luYXRpbmcgYWRkcmVzcyAqLworCXVfaW50OF90IHBpZDsJCS8qIHByb3RvY29sIGlkZW50aWZpZXIgKi8KKwl1X2ludDhfdCBkY3M7CQkvKiBkYXRhIGNvZGluZyBzY2hlbWUgKi8KKwkJCQkvKiBzZXJ2aWNlIGNlbnRyZSB0aW1lIHN0YW1wICovCisJdV9pbnQ4X3QgdWRfbGVuOwkvKiB1c2VyIGRhdGEgbGVuZ3RoICovCisJdV9pbnQ4X3QgKnVzZXJfZGF0YTsJLyogdXNlciBkYXRhICovCisKKwl1X2ludDhfdCBtc2dfcmVmOwkvKiBtZXNzYWdlIHJlZmVyZW5jZSAqLworCXVfaW50OF90ICpzbXNjOworfTsKKworc3RydWN0IG1zZ2I7CisKK2ludCBnc20wNDExX3Jjdl9zbXMoc3RydWN0IG1zZ2IgKm1zZywgdV9pbnQ4X3QgbGlua19pZCk7CisKK2ludCBnc200MTFfc2VuZF9zbXNfbGNoYW4oc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm4sIHN0cnVjdCBnc21fc21zICpzbXMpOworCitzdHJ1Y3QgZ3NtX3NtcyAqc21zX2FsbG9jKHZvaWQpOwordm9pZCBzbXNfZnJlZShzdHJ1Y3QgZ3NtX3NtcyAqc21zKTsKKwordm9pZCBfZ3NtNDExX3Ntc190cmFuc19mcmVlKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKTsKK2ludCBnc200MTFfc2VuZF9zbXNfc3Vic2NyKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJICAgc3RydWN0IGdzbV9zbXMgKnNtcyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF84MC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzgwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhYjFjNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF84MC5oCkBAIC0wLDAgKzEsMjIgQEAKKyNpZm5kZWYgX0dTTV8wNF84MF9ICisjZGVmaW5lIF9HU01fMDRfODBfSAorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF84MC5oPgorCisjZGVmaW5lIE1BWF9MRU5fVVNTRF9TVFJJTkcJMzEKKworc3RydWN0IHVzc2RfcmVxdWVzdCB7CisJCQljaGFyIHRleHRbTUFYX0xFTl9VU1NEX1NUUklORyArIDFdOworCQkJdV9pbnQ4X3QgdHJhbnNhY3Rpb25faWQ7CisJCQl1X2ludDhfdCBpbnZva2VfaWQ7Cit9OworCitpbnQgZ3NtMDQ4MF9kZWNvZGVfdXNzZF9yZXF1ZXN0KGNvbnN0IHN0cnVjdCBtc2diICptc2csIAorCQkJCXN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcXVlc3QpOyAKK2ludCBnc20wNDgwX3NlbmRfdXNzZF9yZXNwb25zZShjb25zdCBzdHJ1Y3QgbXNnYiAqaW5fbXNnLCBjb25zdCBjaGFyKiByZXNwb25zZV90ZXh0LCAKKwkJCQkJCWNvbnN0IHN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSk7CitpbnQgZ3NtMDQ4MF9zZW5kX3Vzc2RfcmVqZWN0KGNvbnN0IHN0cnVjdCBtc2diICptc2csIAorCQkJCWNvbnN0IHN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcXVlc3QpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV9kYXRhLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZDQzZDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fZGF0YS5oCkBAIC0wLDAgKzEsNzU4IEBACisjaWZuZGVmIF9HU01fREFUQV9ICisjZGVmaW5lIF9HU01fREFUQV9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyB7CisJR1NNX1BDSEFOX05PTkUsCisJR1NNX1BDSEFOX0NDQ0gsCisJR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0LAorCUdTTV9QQ0hBTl9UQ0hfRiwKKwlHU01fUENIQU5fVENIX0gsCisJR1NNX1BDSEFOX1NEQ0NIOF9TQUNDSDhDLAorCUdTTV9QQ0hBTl9QRENILAkJLyogR1BSUyBQRENIICovCisJR1NNX1BDSEFOX1RDSF9GX1BEQ0gsCS8qIFRDSC9GIGlmIHVzZWQsIFBEQ0ggb3RoZXJ3aXNlICovCisJR1NNX1BDSEFOX1VOS05PV04sCit9OworCitlbnVtIGdzbV9jaGFuX3QgeworCUdTTV9MQ0hBTl9OT05FLAorCUdTTV9MQ0hBTl9TRENDSCwKKwlHU01fTENIQU5fVENIX0YsCisJR1NNX0xDSEFOX1RDSF9ILAorCUdTTV9MQ0hBTl9VTktOT1dOLAorfTsKKworLyogUlJMUCBtb2RlIG9mIG9wZXJhdGlvbiAqLworZW51bSBycmxwX21vZGUgeworCVJSTFBfTU9ERV9OT05FLAorCVJSTFBfTU9ERV9NU19CQVNFRCwKKwlSUkxQX01PREVfTVNfUFJFRiwKKwlSUkxQX01PREVfQVNTX1BSRUYsCit9OworCisvKiBDaGFubmVsIFJlcXVlc3QgcmVhc29uICovCitlbnVtIGdzbV9jaHJlcV9yZWFzb25fdCB7CisJR1NNX0NIUkVRX1JFQVNPTl9FTUVSRywKKwlHU01fQ0hSRVFfUkVBU09OX1BBRywKKwlHU01fQ0hSRVFfUkVBU09OX0NBTEwsCisJR1NNX0NIUkVRX1JFQVNPTl9MT0NBVElPTl9VUEQsCisJR1NNX0NIUkVRX1JFQVNPTl9PVEhFUiwKK307CisKKyNpbmNsdWRlIDxvc21vY29yZS90aW1lci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbW5jYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2JpdHZlYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3N0YXRpc3RpY3MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvc21vY29yZS91dGlscy5oPgorCisjZGVmaW5lIFRSWF9OUl9UUwk4CisjZGVmaW5lIFRTX01BWF9MQ0hBTgk4CisKKyNkZWZpbmUgSEFSRENPREVEX0FSRkNOIDEyMworI2RlZmluZSBIQVJEQ09ERURfVFNDCTcKKyNkZWZpbmUgSEFSRENPREVEX0JTSUMJMHgzZgkvKiBOQ0MgPSA3IC8gQkNDID0gNyAqLworCisvKiBmb3IgbXVsdGktZHJvcCBjb25maWcgKi8KKyNkZWZpbmUgSEFSRENPREVEX0JUUzBfVFMJMQorI2RlZmluZSBIQVJEQ09ERURfQlRTMV9UUwk2CisjZGVmaW5lIEhBUkRDT0RFRF9CVFMyX1RTCTExCisKK2VudW0gZ3NtX2hvb2tzIHsKKwlHU01fSE9PS19OTV9TV0xPQUQsCisJR1NNX0hPT0tfUlJfUEFHSU5HLAorfTsKKworZW51bSBnc21fcGFnaW5nX2V2ZW50IHsKKwlHU01fUEFHSU5HX1NVQ0NFRURFRCwKKwlHU01fUEFHSU5HX0VYUElSRUQsCisJR1NNX1BBR0lOR19PT00sCit9OworCitlbnVtIGJ0c19ncHJzX21vZGUgeworCUJUU19HUFJTX05PTkUgPSAwLAorCUJUU19HUFJTX0dQUlMgPSAxLAorCUJUU19HUFJTX0VHUFJTID0gMiwKK307CisKKy8qIHRoZSBkYXRhIHN0cnVjdHVyZSBzdG9yZWQgaW4gbXNnYi0+Y2IgZm9yIG9wZW5ic2MgYXBwcyAqLworc3RydWN0IG9wZW5ic2NfbXNnYl9jYiB7CisJdW5zaWduZWQgY2hhciAqYnNzZ3BoOworCXVuc2lnbmVkIGNoYXIgKmxsY2g7CisKKwkvKiBDZWxsIElkZW50aWZpZXIgKi8KKwl1bnNpZ25lZCBjaGFyICpic3NncF9jZWxsX2lkOworCisJLyogSWRlbnRpZmllcnMgb2YgYSBCVFMsIGVxdWFsIHRvICdzdHJ1Y3QgYnNzZ3BfYnRzX2N0eCcgKi8KKwl1X2ludDE2X3QgbnNlaTsKKwl1X2ludDE2X3QgYnZjaTsKKworCS8qIElkZW50aWZpZXIgb2YgYSBNUyAoaW5zaWRlIEJUUyksIGVxdWFsIHRvICdzdHJ1Y3Qgc2dzbl9tbV9jdHgnICovCisJdV9pbnQzMl90IHRsbGk7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworI2RlZmluZSBPQlNDX01TR0JfQ0IoX19tc2diKQkoKHN0cnVjdCBvcGVuYnNjX21zZ2JfY2IgKikmKChfX21zZ2IpLT5jYlswXSkpCisjZGVmaW5lIG1zZ2JfdGxsaShfX3gpCQlPQlNDX01TR0JfQ0IoX194KS0+dGxsaQorI2RlZmluZSBtc2diX25zZWkoX194KQkJT0JTQ19NU0dCX0NCKF9feCktPm5zZWkKKyNkZWZpbmUgbXNnYl9idmNpKF9feCkJCU9CU0NfTVNHQl9DQihfX3gpLT5idmNpCisjZGVmaW5lIG1zZ2JfZ21taChfX3gpCQkoX194KS0+bDNoCisjZGVmaW5lIG1zZ2JfYnNzZ3BoKF9feCkJT0JTQ19NU0dCX0NCKF9feCktPmJzc2dwaAorI2RlZmluZSBtc2diX2Jzc2dwX2xlbihfX3gpCSgoX194KS0+dGFpbCAtICh1aW50OF90ICopbXNnYl9ic3NncGgoX194KSkKKyNkZWZpbmUgbXNnYl9iY2lkKF9feCkJCU9CU0NfTVNHQl9DQihfX3gpLT5ic3NncF9jZWxsX2lkCisjZGVmaW5lIG1zZ2JfbGxjaChfX3gpCQlPQlNDX01TR0JfQ0IoX194KS0+bGxjaAorCitzdHJ1Y3QgbXNnYjsKK3R5cGVkZWYgaW50IGdzbV9jYmZuKHVuc2lnbmVkIGludCBob29rbnVtLAorCQkgICAgIHVuc2lnbmVkIGludCBldmVudCwKKwkJICAgICBzdHJ1Y3QgbXNnYiAqbXNnLAorCQkgICAgIHZvaWQgKmRhdGEsIHZvaWQgKnBhcmFtKTsKKworLyoKKyAqIFVzZSB0aGUgY2hhbm5lbC4gQXMgc2lkZSBlZmZlY3QgdGhlIGxjaGFubmVsIHJlY3ljbGUgdGltZXIKKyAqIHdpbGwgYmUgc3RhcnRlZC4KKyAqLworI2RlZmluZSBMQ0hBTl9SRUxFQVNFX1RJTUVPVVQgMjAsIDAKKyNkZWZpbmUgdXNlX3N1YnNjcl9jb24oY29uKSBcCisJZG8gewkoY29uKS0+dXNlX2NvdW50Kys7IFwKKwkJREVCVUdQKERSRUYsICJsY2hhbiAoYnRzPSVkLHRyeD0lZCx0cz0lZCxjaD0lZCkgaW5jcmVhc2VzIHVzYWdlIHRvOiAlZFxuIiwgXAorCQkJKGNvbiktPmxjaGFuLT50cy0+dHJ4LT5idHMtPm5yLCAoY29uKS0+bGNoYW4tPnRzLT50cngtPm5yLCAoY29uKS0+bGNoYW4tPnRzLT5uciwgXAorCQkJKGNvbiktPmxjaGFuLT5uciwgKGNvbiktPnVzZV9jb3VudCk7IFwKKwkJYnNjX3NjaGVkdWxlX3RpbWVyKCYoY29uKS0+cmVsZWFzZV90aW1lciwgTENIQU5fUkVMRUFTRV9USU1FT1VUKTsgfSB3aGlsZSgwKTsKKworI2RlZmluZSBwdXRfc3Vic2NyX2Nvbihjb24pIFwKKwlkbyB7IChjb24pLT51c2VfY291bnQtLTsgXAorCQlERUJVR1AoRFJFRiwgImxjaGFuIChidHM9JWQsdHJ4PSVkLHRzPSVkLGNoPSVkKSBkZWNyZWFzZXMgdXNhZ2UgdG86ICVkXG4iLCBcCisJCQkoY29uKS0+bGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIChjb24pLT5sY2hhbi0+dHMtPnRyeC0+bnIsIChjb24pLT5sY2hhbi0+dHMtPm5yLCBcCisJCQkoY29uKS0+bGNoYW4tPm5yLCAoY29uKS0+dXNlX2NvdW50KTsgXAorCX0gd2hpbGUoMCk7CisKKworLyogUmVhbCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBjb250YWluaW5nIEtpICovCitlbnVtIGdzbV9hdXRoX2FsZ28geworCUFVVEhfQUxHT19OT05FLAorCUFVVEhfQUxHT19YT1IsCisJQVVUSF9BTEdPX0NPTVAxMjh2MSwKK307CisKK3N0cnVjdCBnc21fYXV0aF9pbmZvIHsKKwllbnVtIGdzbV9hdXRoX2FsZ28gYXV0aF9hbGdvOworCXVuc2lnbmVkIGludCBhM2E4X2tpX2xlbjsKKwl1X2ludDhfdCBhM2E4X2tpWzE2XTsKK307CisKK3N0cnVjdCBnc21fYXV0aF90dXBsZSB7CisJaW50IHVzZV9jb3VudDsKKwlpbnQga2V5X3NlcTsKKwl1X2ludDhfdCByYW5kWzE2XTsKKwl1X2ludDhfdCBzcmVzWzRdOworCXVfaW50OF90IGtjWzhdOworfTsKKworCitzdHJ1Y3QgZ3NtX2xjaGFuOworc3RydWN0IGdzbV9zdWJzY3JpYmVyOworc3RydWN0IGdzbV9tbmNjOworc3RydWN0IHJ0cF9zb2NrZXQ7CisKKy8qIE5ldHdvcmsgTWFuYWdlbWVudCBTdGF0ZSAqLworc3RydWN0IGdzbV9ubV9zdGF0ZSB7CisJdV9pbnQ4X3Qgb3BlcmF0aW9uYWw7CisJdV9pbnQ4X3QgYWRtaW5pc3RyYXRpdmU7CisJdV9pbnQ4X3QgYXZhaWxhYmlsaXR5OworfTsKKworLyoKKyAqIExPQ0FUSU9OIFVQREFUSU5HIFJFUVVFU1Qgc3RhdGUKKyAqCisgKiBPdXIgY3VycmVudCBvcGVyYXRpb24gaXM6CisgKgktIEdldCBpbWVpL3Rtc2kKKyAqCS0gQWNjZXB0L1JlamVjdCBhY2NvcmRpbmcgdG8gZ2xvYmFsIHBvbGljeQorICovCitzdHJ1Y3QgZ3NtX2xvY191cGRhdGluZ19vcGVyYXRpb24geworICAgICAgICBzdHJ1Y3QgdGltZXJfbGlzdCB1cGRhdGluZ190aW1lcjsKKwl1bnNpZ25lZCBpbnQgd2FpdGluZ19mb3JfaW1zaSA6IDE7CisJdW5zaWduZWQgaW50IHdhaXRpbmdfZm9yX2ltZWkgOiAxOworfTsKKworLyogTWF4aW11bSBudW1iZXIgb2YgbmVpZ2hib3IgY2VsbHMgd2hvc2UgYXZlcmFnZSB3ZSB0cmFjayAqLworI2RlZmluZSBNQVhfTkVJR0hfTUVBUwkJMTAKKy8qIE1heGltdW0gc2l6ZSBvZiB0aGUgYXZlcmFnaW5nIHdpbmRvdyBmb3IgbmVpZ2hib3IgY2VsbHMgKi8KKyNkZWZpbmUgTUFYX1dJTl9ORUlHSF9BVkcJMTAKKworLyogcHJvY2Vzc2VkIG5laWdoYm9yIG1lYXN1cmVtZW50cyBmb3Igb25lIGNlbGwgKi8KK3N0cnVjdCBuZWlnaF9tZWFzX3Byb2MgeworCXVfaW50MTZfdCBhcmZjbjsKKwl1X2ludDhfdCBic2ljOworCXVfaW50OF90IHJ4bGV2W01BWF9XSU5fTkVJR0hfQVZHXTsKKwl1bnNpZ25lZCBpbnQgcnhsZXZfY250OworCXVfaW50OF90IGxhc3Rfc2Vlbl9ucjsKK307CisKKyNkZWZpbmUgTUFYX0E1X0tFWV9MRU4JKDEyOC84KQorI2RlZmluZSBSU0xfRU5DX0FMR19BNSh4KQkoeCsxKQorCisvKiBpcyB0aGUgZGF0YSBsaW5rIGVzdGFibGlzaGVkPyB3aG8gZXN0YWJsaXNoZWQgaXQ/ICovCisjZGVmaW5lIExDSEFOX1NBUElfVU5VU0VECTAKKyNkZWZpbmUgTENIQU5fU0FQSV9NUwkJMQorI2RlZmluZSBMQ0hBTl9TQVBJX05FVAkJMgorCisvKiBzdGF0ZSBvZiBhIGxvZ2ljYWwgY2hhbm5lbCAqLworZW51bSBnc21fbGNoYW5fc3RhdGUgeworCUxDSEFOX1NfTk9ORSwJCS8qIGNoYW5uZWwgaXMgbm90IGFjdGl2ZSAqLworCUxDSEFOX1NfQUNUX1JFUSwJLyogY2hhbm5lbCBhY3RpdmF0aW4gcmVxdWVzdGVkICovCisJTENIQU5fU19BQ1RJVkUsCQkvKiBjaGFubmVsIGlzIGFjdGl2ZSBhbmQgb3BlcmF0aW9uYWwgKi8KKwlMQ0hBTl9TX1JFTF9SRVEsCS8qIGNoYW5uZWwgcmVsZWFzZSBoYXMgYmVlbiByZXF1ZXN0ZWQgKi8KKwlMQ0hBTl9TX0lOQUNUSVZFLAkvKiBjaGFubmVsIGlzIHNldCBpbmFjdGl2ZSAqLworfTsKKworLyogdGhlIHBlciBzdWJzY3JpYmVyIGRhdGEgZm9yIGxjaGFuICovCitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiB7CisJLyogVG8gd2hvbSB3ZSBhcmUgYWxsb2NhdGVkIGF0IHRoZSBtb21lbnQgKi8KKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCS8qIFRpbWVyIHN0YXJ0ZWQgdG8gcmVsZWFzZSB0aGUgY2hhbm5lbCAqLworCXN0cnVjdCB0aW1lcl9saXN0IHJlbGVhc2VfdGltZXI7CisKKwkvKgorCSAqIE9wZXJhdGlvbnMgdGhhdCBoYXZlIGEgc3RhdGUgYW5kIG1pZ2h0IGJlIHBlbmRpbmcKKwkgKi8KKwlzdHJ1Y3QgZ3NtX2xvY191cGRhdGluZ19vcGVyYXRpb24gKmxvY19vcGVyYXRpb247CisKKwkvKiB1c2UgY291bnQuIGhvdyBtYW55IHVzZXJzIHVzZSB0aGlzIGNoYW5uZWwgKi8KKwl1bnNpZ25lZCBpbnQgdXNlX2NvdW50OworCisJLyogQXJlIHdlIHBhcnQgb2YgYSBzcGVjaWFsICJzaWxlbnQiIGNhbGwgKi8KKwlpbnQgc2lsZW50X2NhbGw7CisKKwkvKiBiYWNrIHBvaW50ZXJzICovCisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisJc3RydWN0IGdzbV9idHMgKmJ0czsKK307CisKK3N0cnVjdCBnc21fbGNoYW4geworCS8qIFRoZSBUUyB0aGF0IHdlJ3JlIHBhcnQgb2YgKi8KKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzOworCS8qIFRoZSBsb2dpY2FsIHN1YnNsb3QgbnVtYmVyIGluIHRoZSBUUyAqLworCXVfaW50OF90IG5yOworCS8qIFRoZSBsb2dpY2FsIGNoYW5uZWwgdHlwZSAqLworCWVudW0gZ3NtX2NoYW5fdCB0eXBlOworCS8qIFJTTCBjaGFubmVsIG1vZGUgKi8KKwllbnVtIHJzbF9jbW9kX3NwZCByc2xfY21vZGU7CisJLyogSWYgVENILCB0cmFmZmljIGNoYW5uZWwgbW9kZSAqLworCWVudW0gZ3NtNDhfY2hhbl9tb2RlIHRjaF9tb2RlOworCS8qIFN0YXRlICovCisJZW51bSBnc21fbGNoYW5fc3RhdGUgc3RhdGU7CisJLyogUG93ZXIgbGV2ZWxzIGZvciBNUyBhbmQgQlRTICovCisJdV9pbnQ4X3QgYnNfcG93ZXI7CisJdV9pbnQ4X3QgbXNfcG93ZXI7CisJLyogRW5jcnlwdGlvbiBpbmZvcm1hdGlvbiAqLworCXN0cnVjdCB7CisJCXVfaW50OF90IGFsZ19pZDsKKwkJdV9pbnQ4X3Qga2V5X2xlbjsKKwkJdV9pbnQ4X3Qga2V5W01BWF9BNV9LRVlfTEVOXTsKKwl9IGVuY3I7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCBUMzEwMTsKKworCS8qIEFNUiBiaXRzICovCisJc3RydWN0IGdzbTQ4X211bHRpX3JhdGVfY29uZiBtcl9jb25mOworCQorCS8qIEVzdGFibGlzaGVkIGRhdGEgbGluayBsYXllciBzZXJ2aWNlcyAqLworCXVfaW50OF90IHNhcGlzWzhdOworCisJLyogY2FjaGUgb2YgbGFzdCBtZWFzdXJlbWVudCByZXBvcnRzIG9uIHRoaXMgbGNoYW4gKi8KKwlzdHJ1Y3QgZ3NtX21lYXNfcmVwIG1lYXNfcmVwWzZdOworCWludCBtZWFzX3JlcF9pZHg7CisKKwkvKiB0YWJsZSBvZiBuZWlnaGJvciBjZWxsIG1lYXN1cmVtZW50cyAqLworCXN0cnVjdCBuZWlnaF9tZWFzX3Byb2MgbmVpZ2hfbWVhc1tNQVhfTkVJR0hfTUVBU107CisKKwlzdHJ1Y3QgeworCQl1X2ludDMyX3QgYm91bmRfaXA7CisJCXVfaW50MzJfdCBjb25uZWN0X2lwOworCQl1X2ludDE2X3QgYm91bmRfcG9ydDsKKwkJdV9pbnQxNl90IGNvbm5lY3RfcG9ydDsKKwkJdV9pbnQxNl90IGNvbm5faWQ7CisJCXVfaW50OF90IHJ0cF9wYXlsb2FkOworCQl1X2ludDhfdCBydHBfcGF5bG9hZDI7CisJCXVfaW50OF90IHNwZWVjaF9tb2RlOworCQlzdHJ1Y3QgcnRwX3NvY2tldCAqcnRwX3NvY2tldDsKKwl9IGFiaXNfaXA7CisKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiBjb25uOworfTsKKworc3RydWN0IGdzbV9lMV9zdWJzbG90IHsKKwkvKiBOdW1iZXIgb2YgRTEgbGluayAqLworCXVfaW50OF90CWUxX25yOworCS8qIE51bWJlciBvZiBFMSBUUyBpbnNpZGUgRTEgbGluayAqLworCXVfaW50OF90CWUxX3RzOworCS8qIFN1Yi1zbG90IHdpdGhpbiB0aGUgRTEgVFMsIDB4ZmYgaWYgZnVsbCBUUyAqLworCXVfaW50OF90CWUxX3RzX3NzOworfTsKKworI2RlZmluZSBUU19GX1BEQ0hfTU9ERQkweDEwMDAKKy8qIE9uZSBUaW1lc2xvdCBpbiBhIFRSWCAqLworc3RydWN0IGdzbV9idHNfdHJ4X3RzIHsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwkvKiBudW1iZXIgb2YgdGhpcyB0aW1lc2xvdCBhdCB0aGUgVFJYICovCisJdV9pbnQ4X3QgbnI7CisKKwllbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIHBjaGFuOworCisJdW5zaWduZWQgaW50IGZsYWdzOworCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7CisJc3RydWN0IHRsdl9wYXJzZWQgbm1fYXR0cjsKKwl1X2ludDhfdCBubV9jaGFuX2NvbWI7CisKKwkvKiBUbyB3aGljaCBFMSBzdWJzbG90IGFyZSB3ZSBjb25uZWN0ZWQgKi8KKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgZTFfbGluazsKKworCXN0cnVjdCBnc21fbGNoYW4gbGNoYW5bVFNfTUFYX0xDSEFOXTsKK307CisKKy8qIE9uZSBUUlggaW4gYSBCVFMgKi8KK3N0cnVjdCBnc21fYnRzX3RyeCB7CisJLyogbGlzdCBoZWFkZXIgaW4gYnRzLT50cnhfbGlzdCAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCS8qIG51bWJlciBvZiB0aGlzIFRSWCBpbiB0aGUgQlRTICovCisJdV9pbnQ4X3QgbnI7CisJLyogaHVtYW4gcmVhZGFibGUgbmFtZSAvIGRlc2NyaXB0aW9uICovCisJY2hhciAqZGVzY3JpcHRpb247CisJLyogaG93IGRvIHdlIHRhbGsgUlNMIHdpdGggdGhpcyBUUlg/ICovCisJc3RydWN0IGdzbV9lMV9zdWJzbG90IHJzbF9lMV9saW5rOworCXVfaW50OF90IHJzbF90ZWk7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqcnNsX2xpbms7CisKKwlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworCXN0cnVjdCB0bHZfcGFyc2VkIG5tX2F0dHI7CisJc3RydWN0IHsKKwkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwl9IGJiX3RyYW5zYzsKKworCXVfaW50MTZfdCBhcmZjbjsKKwlpbnQgbm9taW5hbF9wb3dlcjsJCS8qIGluIGRCbSAqLworCXVuc2lnbmVkIGludCBtYXhfcG93ZXJfcmVkOwkvKiBpbiBhY3R1YWwgZEIgKi8KKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCB7CisJCQkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwkJCX0gYmJzaWc7CisJCQlzdHJ1Y3QgeworCQkJCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7CisJCQl9IHBhOworCQl9IGJzMTE7CisJfTsKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgdHNbVFJYX05SX1RTXTsKK307CisKK2VudW0gZ3NtX2J0c190eXBlIHsKKwlHU01fQlRTX1RZUEVfVU5LTk9XTiwKKwlHU01fQlRTX1RZUEVfQlMxMSwKKwlHU01fQlRTX1RZUEVfTkFOT0JUUywKK307CisKK3N0cnVjdCBnc21fYnRzX21vZGVsIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCisJZW51bSBnc21fYnRzX3R5cGUgdHlwZTsKKwljb25zdCBjaGFyICpuYW1lOworCisJc3RydWN0IHRsdl9kZWZpbml0aW9uIG5tX2F0dF90bHZkZWY7Cit9OworCisvKioKKyAqIEEgcGVuZGluZyBwYWdpbmcgcmVxdWVzdCAKKyAqLworc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCB7CisJLyogbGlzdF9oZWFkIGZvciBsaXN0IG9mIGFsbCBwYWdpbmcgcmVxdWVzdHMgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBlbnRyeTsKKwkvKiB0aGUgc3Vic2NyaWJlciB3aGljaCB3ZSdyZSBwYWdpbmcuIExhdGVyIGdzbV9wYWdpbmdfcmVxdWVzdAorCSAqIHNob3VsZCBwcm9iYWJseSBiZWNvbWUgYSBwYXJ0IG9mIHRoZSBnc21fc3Vic2NyaWJlciBzdHJ1Y3Q/ICovCisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisJLyogYmFjay1wb2ludGVyIHRvIHRoZSBCVFMgb24gd2hpY2ggd2UgYXJlIHBhZ2luZyAqLworCXN0cnVjdCBnc21fYnRzICpidHM7CisJLyogd2hhdCBraW5kIG9mIGNoYW5uZWwgdHlwZSBkbyB3ZSBhc2sgdGhlIE1TIHRvIGVzdGFibGlzaCAqLworCWludCBjaGFuX3R5cGU7CisKKwkvKiBUaW1lciAzMTEzOiBob3cgbG9uZyBkbyB3ZSB0cnkgdG8gcGFnZT8gKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBUMzExMzsKKworCS8qIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBpbiBjYXNlIHBhZ2luZyBjb21wbGV0ZXMgKi8KKwlnc21fY2JmbiAqY2JmbjsKKwl2b2lkICpjYmZuX3BhcmFtOworfTsKKworLyoKKyAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHBhZ2luZyBzdGF0dXMgb2Ygb25lIEJUUy4gSXQKKyAqIGluY2x1ZGVzIGEgbnVtYmVyIG9mIHBlbmRpbmcgcmVxdWVzdHMsIGEgYmFjayBwb2ludGVyCisgKiB0byB0aGUgZ3NtX2J0cywgYSB0aW1lciBhbmQgc29tZSBtb3JlIHN0YXRlLgorICovCitzdHJ1Y3QgZ3NtX2J0c19wYWdpbmdfc3RhdGUgeworCS8qIHBlbmRpbmcgcmVxdWVzdHMgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBwZW5kaW5nX3JlcXVlc3RzOworCXN0cnVjdCBnc21fYnRzICpidHM7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCB3b3JrX3RpbWVyOworCisJLyogbG9hZCAqLworCXVfaW50MTZfdCBhdmFpbGFibGVfc2xvdHM7Cit9OworCitzdHJ1Y3QgZ3NtX2VudmFidHNlIHsKKwlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworfTsKKworc3RydWN0IGdzbV9idHNfZ3Byc19uc3ZjIHsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCS8qIGRhdGEgcmVhZCB2aWEgVlRZIGNvbmZpZyBmaWxlLCB0byBjb25maWd1cmUgdGhlIEJUUworCSAqIHZpYSBPTUwgZnJvbSBCU0MgKi8KKwlpbnQgaWQ7CisJdV9pbnQxNl90IG5zdmNpOworCXVfaW50MTZfdCBsb2NhbF9wb3J0OwkvKiBvbiB0aGUgQlRTICovCisJdV9pbnQxNl90IHJlbW90ZV9wb3J0OwkvKiBvbiB0aGUgU0dTTiAqLworCXVfaW50MzJfdCByZW1vdGVfaXA7CS8qIG9uIHRoZSBTR1NOICovCisKKwlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworfTsKKworLyogT25lIEJUUyAqLworc3RydWN0IGdzbV9idHMgeworCS8qIGxpc3QgaGVhZGVyIGluIG5ldC0+YnRzX2xpc3QgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXR3b3JrOworCS8qIG51bWJlciBvZiB0aHMgQlRTIGluIG5ldHdvcmsgKi8KKwl1X2ludDhfdCBucjsKKwkvKiBodW1hbiByZWFkYWJsZSBuYW1lIC8gZGVzY3JpcHRpb24gKi8KKwljaGFyICpkZXNjcmlwdGlvbjsKKwkvKiBDZWxsIElkZW50aXR5ICovCisJdV9pbnQxNl90IGNlbGxfaWRlbnRpdHk7CisJLyogbG9jYXRpb24gYXJlYSBjb2RlIG9mIHRoaXMgQlRTICovCisJdV9pbnQxNl90IGxvY2F0aW9uX2FyZWFfY29kZTsKKwkvKiBUcmFpbmluZyBTZXF1ZW5jZSBDb2RlICovCisJdV9pbnQ4X3QgdHNjOworCS8qIEJhc2UgU3RhdGlvbiBJZGVudGlmaWNhdGlvbiBDb2RlIChCU0lDKSAqLworCXVfaW50OF90IGJzaWM7CisJLyogdHlwZSBvZiBCVFMgKi8KKwllbnVtIGdzbV9idHNfdHlwZSB0eXBlOworCXN0cnVjdCBnc21fYnRzX21vZGVsICptb2RlbDsKKwllbnVtIGdzbV9iYW5kIGJhbmQ7CisJLyogc2hvdWxkIHRoZSBjaGFubmVsIGFsbG9jYXRvciBhbGxvY2F0ZSBjaGFubmVscyBmcm9tIGhpZ2ggVFJYIHRvIFRSWDAsCisJICogcmF0aGVyIHRoYW4gc3RhcnRpbmcgZnJvbSBUUlgwIGFuZCBnbyB1cHdhcmRzPyAqLworCWludCBjaGFuX2FsbG9jX3JldmVyc2U7CisJLyogbWF4aW11bSBUeCBwb3dlciB0aGF0IHRoZSBNUyBpcyBwZXJtaXR0ZWQgdG8gdXNlIGluIHRoaXMgY2VsbCAqLworCWludCBtc19tYXhfcG93ZXI7CisKKwkvKiBob3cgZG8gd2UgdGFsayBPTUwgd2l0aCB0aGlzIFRSWD8gKi8KKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3Qgb21sX2UxX2xpbms7CisJdV9pbnQ4X3Qgb21sX3RlaTsKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpvbWxfbGluazsKKworCS8qIEFiaXMgbmV0d29yayBtYW5hZ2VtZW50IE8mTSBoYW5kbGUgKi8KKwlzdHJ1Y3QgYWJpc19ubV9oICpubWg7CisJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCBubV9hdHRyOworCisJLyogbnVtYmVyIG9mIHRoaXMgQlRTIG9uIGdpdmVuIEUxIGxpbmsgKi8KKwl1X2ludDhfdCBidHNfbnI7CisKKwkvKiBwYWdpbmcgc3RhdGUgYW5kIGNvbnRyb2wgKi8KKwlzdHJ1Y3QgZ3NtX2J0c19wYWdpbmdfc3RhdGUgcGFnaW5nOworCisJLyogQ0NDSCBpcyBvbiBDMCAqLworCXN0cnVjdCBnc21fYnRzX3RyeCAqYzA7CisKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworCX0gc2l0ZV9tZ3I7CisKKwkvKiBwYXJhbWV0ZXJzIGZyb20gd2hpY2ggd2UgYnVpbGQgU1lTVEVNIElORk9STUFUSU9OICovCisJc3RydWN0IHsKKwkJc3RydWN0IGdzbTQ4X3JhY2hfY29udHJvbCByYWNoX2NvbnRyb2w7CisJCXVfaW50OF90IG5jY19wZXJtaXR0ZWQ7CisJCXN0cnVjdCBnc200OF9jZWxsX3NlbF9wYXIgY2VsbF9zZWxfcGFyOworCQlzdHJ1Y3QgZ3NtNDhfY2VsbF9vcHRpb25zIGNlbGxfb3B0aW9uczsKKwkJc3RydWN0IGdzbTQ4X2NvbnRyb2xfY2hhbm5lbF9kZXNjciBjaGFuX2Rlc2M7CisJCXN0cnVjdCBiaXR2ZWMgbmVpZ2hfbGlzdDsKKwkJc3RydWN0IGJpdHZlYyBjZWxsX2FsbG9jOworCQlzdHJ1Y3QgeworCQkJLyogYml0bWFzayBsYXJnZSBlbm91Z2ggZm9yIGFsbCBwb3NzaWJsZSBBUkZDTidzICovCisJCQl1X2ludDhfdCBuZWlnaF9saXN0WzEwMjQvOF07CisJCQl1X2ludDhfdCBjZWxsX2FsbG9jWzEwMjQvOF07CisJCX0gZGF0YTsKKwl9IHNpX2NvbW1vbjsKKworCS8qIGlwLmFjY2Vzc3MgVW5pdCBJRCdzIGhhdmUgU2l0ZS9CVFMvVFJYIGxheW91dCAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVfaW50MTZfdCBzaXRlX2lkOworCQkJdV9pbnQxNl90IGJ0c19pZDsKKwkJCXVfaW50MzJfdCBmbGFnczsKKwkJfSBpcF9hY2Nlc3M7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgeworCQkJCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7CisJCQl9IGNjbGs7CisJCQlzdHJ1Y3QgeworCQkJCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7CisJCQl9IHJhY2s7CisJCQlzdHJ1Y3QgZ3NtX2VudmFidHNlIGVudmFidHNlWzRdOworCQl9IGJzMTE7CisJfTsKKworCS8qIE5vdCBlbnRpcmVseSBzdXJlIGhvdyBpcC5hY2Nlc3Mgc3BlY2lmaWMgdGhpcyBpcyAqLworCXN0cnVjdCB7CisJCWVudW0gYnRzX2dwcnNfbW9kZSBtb2RlOworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwkJCXVfaW50MTZfdCBuc2VpOworCQkJdWludDhfdCB0aW1lcls3XTsKKwkJfSBuc2U7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworCQkJdV9pbnQxNl90IGJ2Y2k7CisJCQl1aW50OF90IHRpbWVyWzExXTsKKwkJfSBjZWxsOworCQlzdHJ1Y3QgZ3NtX2J0c19ncHJzX25zdmMgbnN2Y1syXTsKKwkJdV9pbnQ4X3QgcmFjOworCX0gZ3ByczsKKworCS8qIFJBQ0ggTk0gdmFsdWVzICovCisJaW50IHJhY2hfYl90aHJlc2g7CisJaW50IHJhY2hfbGRhdmdfc2xvdHM7CisJCisJLyogdHJhbnNjZWl2ZXJzICovCisJaW50IG51bV90cng7CisJc3RydWN0IGxsaXN0X2hlYWQgdHJ4X2xpc3Q7Cit9OworCisvKiBTb21lIHN0YXRpc3RpY3Mgb2Ygb3VyIG5ldHdvcmsgKi8KK3N0cnVjdCBnc21uZXRfc3RhdHMgeworCXN0cnVjdCB7CisJCXN0cnVjdCBjb3VudGVyICp0b3RhbDsKKwkJc3RydWN0IGNvdW50ZXIgKm5vX2NoYW5uZWw7CisJfSBjaHJlcTsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgY291bnRlciAqYXR0ZW1wdGVkOworCQlzdHJ1Y3QgY291bnRlciAqbm9fY2hhbm5lbDsJLyogbm8gY2hhbm5lbCBhdmFpbGFibGUgKi8KKwkJc3RydWN0IGNvdW50ZXIgKnRpbWVvdXQ7CQkvKiBUMzEwMyB0aW1lb3V0ICovCisJCXN0cnVjdCBjb3VudGVyICpjb21wbGV0ZWQ7CS8qIEhPIENPTVBMIHJlY2VpdmVkICovCisJCXN0cnVjdCBjb3VudGVyICpmYWlsZWQ7CQkvKiBITyBGQUlMIHJlY2VpdmVkICovCisJfSBoYW5kb3ZlcjsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgY291bnRlciAqYXR0YWNoOworCQlzdHJ1Y3QgY291bnRlciAqbm9ybWFsOworCQlzdHJ1Y3QgY291bnRlciAqcGVyaW9kaWM7CisJCXN0cnVjdCBjb3VudGVyICpkZXRhY2g7CisJfSBsb2NfdXBkX3R5cGU7CisJc3RydWN0IHsKKwkJc3RydWN0IGNvdW50ZXIgKnJlamVjdDsKKwkJc3RydWN0IGNvdW50ZXIgKmFjY2VwdDsKKwl9IGxvY191cGRfcmVzcDsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgY291bnRlciAqYXR0ZW1wdGVkOworCQlzdHJ1Y3QgY291bnRlciAqZGV0YWNoZWQ7CisJCXN0cnVjdCBjb3VudGVyICpjb21wbGV0ZWQ7CisJCXN0cnVjdCBjb3VudGVyICpleHBpcmVkOworCX0gcGFnaW5nOworCXN0cnVjdCB7CisJCXN0cnVjdCBjb3VudGVyICpzdWJtaXR0ZWQ7IC8qIE1PIFNNUyBzdWJtaXNzaW9ucyAqLworCQlzdHJ1Y3QgY291bnRlciAqbm9fcmVjZWl2ZXI7CisJCXN0cnVjdCBjb3VudGVyICpkZWxpdmVyZWQ7IC8qIE1UIFNNUyBkZWxpdmVyaWVzICovCisJCXN0cnVjdCBjb3VudGVyICpycF9lcnJfbWVtOworCQlzdHJ1Y3QgY291bnRlciAqcnBfZXJyX290aGVyOworCX0gc21zOworCXN0cnVjdCB7CisJCXN0cnVjdCBjb3VudGVyICpkaWFsbGVkOwkvKiB0b3RhbCBudW1iZXIgb2YgZGlhbGxlZCBjYWxscyAqLworCQlzdHJ1Y3QgY291bnRlciAqYWxlcnRlZDsJLyogd2UgYWxlcnRlZCB0aGUgb3RoZXIgZW5kICovCisJCXN0cnVjdCBjb3VudGVyICpjb25uZWN0ZWQ7LyogaG93IG1hbnkgY2FsbHMgd2VyZSBhY2NlcHRlZCAqLworCX0gY2FsbDsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgY291bnRlciAqcmZfZmFpbDsKKwkJc3RydWN0IGNvdW50ZXIgKnJsbF9lcnI7CisJfSBjaGFuOworCXN0cnVjdCB7CisJCXN0cnVjdCBjb3VudGVyICpvbWxfZmFpbDsKKwkJc3RydWN0IGNvdW50ZXIgKnJzbF9mYWlsOworCX0gYnRzOworfTsKKworZW51bSBnc21fYXV0aF9wb2xpY3kgeworCUdTTV9BVVRIX1BPTElDWV9DTE9TRUQsIC8qIG9ubHkgc3Vic2NyaWJlcnMgYXV0aG9yaXplZCBpbiBEQiAqLworCUdTTV9BVVRIX1BPTElDWV9BQ0NFUFRfQUxMLCAvKiBhY2NlcHQgZXZlcnlvbmUsIGV2ZW4gaWYgbm90IGF1dGhvcml6ZWQgaW4gREIgKi8KKwlHU01fQVVUSF9QT0xJQ1lfVE9LRU4sIC8qIGFjY2VwdCBmaXJzdCwgc2VuZCB0b2tlbiBwZXIgc21zLCB0aGVuIHJldm9rZSBhdXRob3JpemF0aW9uICovCit9OworCisjZGVmaW5lIEdTTV9UMzEwMV9ERUZBVUxUIDEwCisjZGVmaW5lIEdTTV9UMzExM19ERUZBVUxUIDYwCisKK3N0cnVjdCBnc21fbmV0d29yayB7CisJLyogZ2xvYmFsIHBhcmFtZXRlcnMgKi8KKwl1X2ludDE2X3QgY291bnRyeV9jb2RlOworCXVfaW50MTZfdCBuZXR3b3JrX2NvZGU7CisJY2hhciAqbmFtZV9sb25nOworCWNoYXIgKm5hbWVfc2hvcnQ7CisJZW51bSBnc21fYXV0aF9wb2xpY3kgYXV0aF9wb2xpY3k7CisJZW51bSBnc200OF9yZWplY3RfdmFsdWUgcmVqZWN0X2NhdXNlOworCWludCBhNV9lbmNyeXB0aW9uOworCWludCBuZWNpOworCWludCBzZW5kX21tX2luZm87CisJc3RydWN0IHsKKwkJaW50IGFjdGl2ZTsKKwkJLyogV2luZG93IFJYTEVWIGF2ZXJhZ2luZyAqLworCQl1bnNpZ25lZCBpbnQgd2luX3J4bGV2X2F2ZzsJLyogbnVtYmVyIG9mIFNBQ0NIIGZyYW1lcyAqLworCQkvKiBXaW5kb3cgUlhRVUFMIGF2ZXJhZ2luZyAqLworCQl1bnNpZ25lZCBpbnQgd2luX3J4cXVhbF9hdmc7CS8qIG51bWJlciBvZiBTQUNDSCBmcmFtZXMgKi8KKwkJLyogV2luZG93IFJYTEVWIG5laWdoYm91cmluZyBjZWxscyBhdmVyYWdpbmcgKi8KKwkJdW5zaWduZWQgaW50IHdpbl9yeGxldl9hdmdfbmVpZ2g7IC8qIG51bWJlciBvZiBTQUNDSCBmcmFtZXMgKi8KKworCQkvKiBob3cgb2Z0ZW4gc2hvdWxkIHdlIGNoZWNrIGZvciBwb3dlciBidWRnZXQgSE8gKi8KKwkJdW5zaWduZWQgaW50IHB3cl9pbnRlcnZhbDsJLyogU0FDQ0ggZnJhbWVzICovCisJCS8qIGhvdyBtdWNoIGJldHRlciBkb2VzIGEgbmVpZ2hib3IgY2VsbCBoYXZlIHRvIGJlID8gKi8KKwkJdW5zaWduZWQgaW50IHB3cl9oeXN0ZXJlc2lzOwkvKiBkQm0gKi8KKwkJLyogbWF4aW11bSBkaXN0YWNuZSBiZWZvcmUgd2UgdHJ5IGEgaGFuZG92ZXIgKi8KKwkJdW5zaWduZWQgaW50IG1heF9kaXN0YW5jZTsJLyogVEEgdmFsdWVzICovCisJfSBoYW5kb3ZlcjsKKworCXN0cnVjdCBnc21uZXRfc3RhdHMgc3RhdHM7CisKKwkvKiBsYXllciA0ICovCisJaW50ICgqbW5jY19yZWN2KSAoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGludCBtc2dfdHlwZSwgdm9pZCAqYXJnKTsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCB1cHF1ZXVlOworCXN0cnVjdCBsbGlzdF9oZWFkIHRyYW5zX2xpc3Q7CisKKwl1bnNpZ25lZCBpbnQgbnVtX2J0czsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBidHNfbGlzdDsKKworCS8qIHRpbWVyIHZhbHVlcyAqLworCWludCBUMzEwMTsKKwlpbnQgVDMxMDM7CisJaW50IFQzMTA1OworCWludCBUMzEwNzsKKwlpbnQgVDMxMDk7CisJaW50IFQzMTExOworCWludCBUMzExMzsKKwlpbnQgVDMxMTU7CisJaW50IFQzMTE3OworCWludCBUMzExOTsKKwlpbnQgVDMxNDE7CisKKwkvKiBSYWRpbyBSZXNvdXJjZSBMb2NhdGlvbiBQcm90b2NvbCAoVFMgMDQuMzEpICovCisJc3RydWN0IHsKKwkJZW51bSBycmxwX21vZGUgbW9kZTsKKwl9IHJybHA7Cit9OworCisjZGVmaW5lIFNNU19IRFJfU0laRQkxMjgKKyNkZWZpbmUgU01TX1RFWFRfU0laRQkyNTYKK3N0cnVjdCBnc21fc21zIHsKKwl1bnNpZ25lZCBsb25nIGxvbmcgaWQ7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzZW5kZXI7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpyZWNlaXZlcjsKKworCXVuc2lnbmVkIGxvbmcgdmFsaWRpdHlfbWludXRlczsKKwl1X2ludDhfdCByZXBseV9wYXRoX3JlcTsKKwl1X2ludDhfdCBzdGF0dXNfcmVwX3JlcTsKKwl1X2ludDhfdCB1ZF9oZHJfaW5kOworCXVfaW50OF90IHByb3RvY29sX2lkOworCXVfaW50OF90IGRhdGFfY29kaW5nX3NjaGVtZTsKKwl1X2ludDhfdCBtc2dfcmVmOworCWNoYXIgZGVzdF9hZGRyWzIwKzFdOwkvKiBEQSBMViBpcyAxMiBieXRlcyBtYXgsIGkuZS4gMTAgYnl0ZXMKKwkJCQkgKiBCQ0QgPT0gMjAgYnl0ZXMgc3RyaW5nICovCisJdV9pbnQ4X3QgdXNlcl9kYXRhX2xlbjsKKwl1X2ludDhfdCB1c2VyX2RhdGFbU01TX1RFWFRfU0laRV07CisKKwljaGFyIHRleHRbU01TX1RFWFRfU0laRV07Cit9OworCisKK3N0cnVjdCBnc21fbmV0d29yayAqZ3NtX25ldHdvcmtfaW5pdCh1X2ludDE2X3QgY291bnRyeV9jb2RlLCB1X2ludDE2X3QgbmV0d29ya19jb2RlLAorCQkJCSAgICAgaW50ICgqbW5jY19yZWN2KShzdHJ1Y3QgZ3NtX25ldHdvcmsgKiwgaW50LCB2b2lkICopKTsKK3N0cnVjdCBnc21fYnRzICpnc21fYnRzX2FsbG9jKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBlbnVtIGdzbV9idHNfdHlwZSB0eXBlLAorCQkJICAgICAgdV9pbnQ4X3QgdHNjLCB1X2ludDhfdCBic2ljKTsKK3N0cnVjdCBnc21fYnRzX3RyeCAqZ3NtX2J0c190cnhfYWxsb2Moc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgZ3NtX3NldF9idHNfdHlwZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBlbnVtIGdzbV9idHNfdHlwZSB0eXBlKTsKKworc3RydWN0IGdzbV9idHMgKmdzbV9idHNfbnVtKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBpbnQgbnVtKTsKKworLyogR2V0IHJlZmVyZW5jZSB0byBhIG5laWdoYm9yIGNlbGwgb24gYSBnaXZlbiBCQ0NIIEFSRkNOICovCitzdHJ1Y3QgZ3NtX2J0cyAqZ3NtX2J0c19uZWlnaGJvcihjb25zdCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzLAorCQkJCSB1X2ludDE2X3QgYXJmY24sIHVfaW50OF90IGJzaWMpOworCitzdHJ1Y3QgZ3NtX2J0c190cnggKmdzbV9idHNfdHJ4X251bShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgbnVtKTsKKworY29uc3QgY2hhciAqZ3NtX3BjaGFuX25hbWUoZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBjKTsKK2VudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgZ3NtX3BjaGFuX3BhcnNlKGNvbnN0IGNoYXIgKm5hbWUpOworY29uc3QgY2hhciAqZ3NtX2xjaGFudF9uYW1lKGVudW0gZ3NtX2NoYW5fdCBjKTsKK2NvbnN0IGNoYXIgKmdzbV9jaHJlcV9uYW1lKGVudW0gZ3NtX2NocmVxX3JlYXNvbl90IGMpOworY2hhciAqZ3NtX3RyeF9uYW1lKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KTsKK2NoYXIgKmdzbV90c19uYW1lKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMpOworY2hhciAqZ3NtX2xjaGFuX25hbWUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworY29uc3QgY2hhciAqZ3NtX2xjaGFuc19uYW1lKGVudW0gZ3NtX2xjaGFuX3N0YXRlIHMpOworCitlbnVtIGdzbV9lMV9ldmVudCB7CisJRVZUX0UxX05PTkUsCisJRVZUX0UxX1RFSV9VUCwKKwlFVlRfRTFfVEVJX0ROLAorfTsKKwordm9pZCBzZXRfdHNfZTFsaW5rKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMsIHVfaW50OF90IGUxX25yLAorCQkgICB1X2ludDhfdCBlMV90cywgdV9pbnQ4X3QgZTFfdHNfc3MpOworZW51bSBnc21fYnRzX3R5cGUgcGFyc2VfYnRzdHlwZShjb25zdCBjaGFyICphcmcpOworY29uc3QgY2hhciAqYnRzdHlwZTJzdHIoZW51bSBnc21fYnRzX3R5cGUgdHlwZSk7CitzdHJ1Y3QgZ3NtX2J0c190cnggKmdzbV9idHNfdHJ4X2J5X25yKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBucik7CitzdHJ1Y3QgZ3NtX2J0cyAqZ3NtX2J0c19ieV9sYWMoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIHVuc2lnbmVkIGludCBsYWMsCisJCQkJc3RydWN0IGdzbV9idHMgKnN0YXJ0X2J0cyk7CisKK2V4dGVybiB2b2lkICp0YWxsX2JzY19jdHg7CitleHRlcm4gaW50IGlwYWNjX3J0cF9kaXJlY3Q7CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2lwYWNjZXNzX2J0cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN3aXRjaCAoYnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfTkFOT0JUUzoKKwkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19zaWVtZW5zX2J0cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN3aXRjaCAoYnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworZW51bSBnc21fYXV0aF9wb2xpY3kgZ3NtX2F1dGhfcG9saWN5X3BhcnNlKGNvbnN0IGNoYXIgKmFyZyk7Citjb25zdCBjaGFyICpnc21fYXV0aF9wb2xpY3lfbmFtZShlbnVtIGdzbV9hdXRoX3BvbGljeSBwb2xpY3kpOworCitlbnVtIHJybHBfbW9kZSBycmxwX21vZGVfcGFyc2UoY29uc3QgY2hhciAqYXJnKTsKK2NvbnN0IGNoYXIgKnJybHBfbW9kZV9uYW1lKGVudW0gcnJscF9tb2RlIG1vZGUpOworCitlbnVtIGJ0c19ncHJzX21vZGUgYnRzX2dwcnNfbW9kZV9wYXJzZShjb25zdCBjaGFyICphcmcpOworY29uc3QgY2hhciAqYnRzX2dwcnNfbW9kZV9uYW1lKGVudW0gYnRzX2dwcnNfbW9kZSBtb2RlKTsKKwordm9pZCBnc21fdHJ4X2xvY2tfcmYoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIGludCBsb2NrZWQpOworCitpbnQgZ3NtNDhfcmFfaWRfYnlfYnRzKHVfaW50OF90ICpidWYsIHN0cnVjdCBnc21fYnRzICpidHMpOwordm9pZCBncHJzX3JhX2lkX2J5X2J0cyhzdHJ1Y3QgZ3Byc19yYV9pZCAqcmFpZCwgc3RydWN0IGdzbV9idHMgKmJ0cyk7CitzdHJ1Y3QgZ3NtX21lYXNfcmVwICpsY2hhbl9uZXh0X21lYXNfcmVwKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKKworaW50IGdzbV9idHNfbW9kZWxfcmVnaXN0ZXIoc3RydWN0IGdzbV9idHNfbW9kZWwgKm1vZGVsKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fc3Vic2NyaWJlci5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjUzOTk2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaApAQCAtMCwwICsxLDk1IEBACisjaWZuZGVmIF9HU01fU1VCU0NSX0gKKyNkZWZpbmUgX0dTTV9TVUJTQ1JfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSAiZ3NtX2RhdGEuaCIKKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKworI2RlZmluZSBHU01fSU1FSV9MRU5HVEggMTcKKyNkZWZpbmUgR1NNX0lNU0lfTEVOR1RIIDE3CisjZGVmaW5lIEdTTV9OQU1FX0xFTkdUSCAxMjgKKworI2RlZmluZSBHU01fRVhURU5TSU9OX0xFTkdUSCAxNSAvKiBNU0lTRE4gY2FuIG9ubHkgYmUgMTUgZGlnaXRzIGxlbmd0aCAqLworI2RlZmluZSBHU01fTUlOX0VYVEVOIDIwMDAwCisjZGVmaW5lIEdTTV9NQVhfRVhURU4gNDk5OTkKKworLyogcmVzZXJ2ZWQgYWNjb3JkaW5nIHRvIEdTTSAwMy4wMyDCpyAyLjQgKi8KKyNkZWZpbmUgR1NNX1JFU0VSVkVEX1RNU0kgICAweEZGRkZGRkZGCisKKworI2RlZmluZSBHU01fU1VCU0NSSUJFUl9GSVJTVF9DT05UQUNUCTB4MDAwMDAwMDEKKyNkZWZpbmUgdG1zaV9mcm9tX3N0cmluZyhzdHIpIHN0cnRvdWwoc3RyLCBOVUxMLCAxMCkKKworc3RydWN0IGdzbV9lcXVpcG1lbnQgeworCWxvbmcgbG9uZyB1bnNpZ25lZCBpbnQgaWQ7CisJY2hhciBpbWVpW0dTTV9JTUVJX0xFTkdUSF07CisJY2hhciBuYW1lW0dTTV9OQU1FX0xFTkdUSF07CisKKwlzdHJ1Y3QgZ3NtNDhfY2xhc3NtYXJrMSBjbGFzc21hcmsxOworCXVfaW50OF90IGNsYXNzbWFyazJfbGVuOworCXVfaW50OF90IGNsYXNzbWFyazJbM107CisJdV9pbnQ4X3QgY2xhc3NtYXJrM19sZW47CisJdV9pbnQ4X3QgY2xhc3NtYXJrM1sxNF07Cit9OworCitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgeworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0OworCWxvbmcgbG9uZyB1bnNpZ25lZCBpbnQgaWQ7CisJY2hhciBpbXNpW0dTTV9JTVNJX0xFTkdUSF07CisJdV9pbnQzMl90IHRtc2k7CisJdV9pbnQxNl90IGxhYzsKKwljaGFyIG5hbWVbR1NNX05BTUVfTEVOR1RIXTsKKwljaGFyIGV4dGVuc2lvbltHU01fRVhURU5TSU9OX0xFTkdUSF07CisJaW50IGF1dGhvcml6ZWQ7CisKKwkvKiBUZW1wb3JhcnkgZmllbGQgd2hpY2ggaXMgbm90IHN0b3JlZCBpbiB0aGUgREIvSExSICovCisJdV9pbnQzMl90IGZsYWdzOworCisJLyogRXZlcnkgdXNlciBjYW4gb25seSBoYXZlIG9uZSBlcXVpcG1lbnQgaW4gdXNlIGF0IGFueSBnaXZlbgorCSAqIHBvaW50IGluIHRpbWUgKi8KKwlzdHJ1Y3QgZ3NtX2VxdWlwbWVudCBlcXVpcG1lbnQ7CisKKwkvKiBmb3IgaW50ZXJuYWwgbWFuYWdlbWVudCAqLworCWludCB1c2VfY291bnQ7CisJc3RydWN0IGxsaXN0X2hlYWQgZW50cnk7CisKKwkvKiBwZW5kaW5nIHJlcXVlc3RzICovCisJaW50IGluX2NhbGxiYWNrOworCXN0cnVjdCBsbGlzdF9oZWFkIHJlcXVlc3RzOworfTsKKworZW51bSBnc21fc3Vic2NyaWJlcl9maWVsZCB7CisJR1NNX1NVQlNDUklCRVJfSU1TSSwKKwlHU01fU1VCU0NSSUJFUl9UTVNJLAorCUdTTV9TVUJTQ1JJQkVSX0VYVEVOU0lPTiwKKwlHU01fU1VCU0NSSUJFUl9JRCwKK307CisKK2VudW0gZ3NtX3N1YnNjcmliZXJfdXBkYXRlX3JlYXNvbiB7CisJR1NNX1NVQlNDUklCRVJfVVBEQVRFX0FUVEFDSEVELAorCUdTTV9TVUJTQ1JJQkVSX1VQREFURV9ERVRBQ0hFRCwKKwlHU01fU1VCU0NSSUJFUl9VUERBVEVfRVFVSVBNRU5ULAorfTsKKworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfZ2V0KHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX3B1dChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcl9nZXRfYnlfdG1zaShzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJICB1X2ludDMyX3QgdG1zaSk7CitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcl9nZXRfYnlfaW1zaShzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJICBjb25zdCBjaGFyICppbXNpKTsKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX2dldF9ieV9leHRlbnNpb24oc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCSAgICAgICBjb25zdCBjaGFyICpleHQpOworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfZ2V0X2J5X2lkKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LAorCQkJCQl1bnNpZ25lZCBsb25nIGxvbmcgaWQpOworaW50IHN1YnNjcl91cGRhdGUoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgcmVhc29uKTsKK3ZvaWQgc3Vic2NyX3B1dF9jaGFubmVsKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKK3ZvaWQgc3Vic2NyX2dldF9jaGFubmVsKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsIGdzbV9jYmZuICpjYmZuLCB2b2lkICpwYXJhbSk7CisKK2NoYXIgKnN1YnNjcl9uYW1lKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKKworLyogaW50ZXJuYWwgKi8KK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX2FsbG9jKHZvaWQpOworZXh0ZXJuIHN0cnVjdCBsbGlzdF9oZWFkIGFjdGl2ZV9zdWJzY3JpYmVyczsKKworI2VuZGlmIC8qIF9HU01fU1VCU0NSX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2hhbmRvdmVyLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9oYW5kb3Zlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYjFiMDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9oYW5kb3Zlci5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfSEFORE9WRVJfSAorI2RlZmluZSBfSEFORE9WRVJfSAorLyogSGFuZCBvdmVyIHRoZSBzcGVjaWZpZWQgbG9naWNhbCBjaGFubmVsIHRvIHRoZSBzcGVjaWZpZWQgbmV3IEJUUy4KKyAqIFRoaXMgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSBhY3R1YWwgaGFuZG92ZXIgYWxnb3JpdGhtLAorICogYWZ0ZXIgaXQgaGFzIGRlY2lkZWQgaXQgd2FudHMgdG8gaW5pdGlhdGUgSE8gdG8gYSBzcGVjaWZpYyBCVFMgKi8KK2ludCBic2NfaGFuZG92ZXJfc3RhcnQoc3RydWN0IGdzbV9sY2hhbiAqb2xkX2xjaGFuLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKKworI2VuZGlmIC8qIF9IQU5ET1ZFUl9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9pcGFjY2Vzcy5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvaXBhY2Nlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGRkZmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvaXBhY2Nlc3MuaApAQCAtMCwwICsxLDEwOSBAQAorI2lmbmRlZiBfSVBBQ0NFU1NfSAorI2RlZmluZSBfSVBBQ0NFU1NfSAorCisjaW5jbHVkZSAiZTFfaW5wdXQuaCIKKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKworI2RlZmluZSBJUEFfVENQX1BPUlRfT01MCTMwMDIKKyNkZWZpbmUgSVBBX1RDUF9QT1JUX1JTTAkzMDAzCisKK3N0cnVjdCBpcGFjY2Vzc19oZWFkIHsKKwl1X2ludDE2X3QgbGVuOwkvKiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KKwl1X2ludDhfdCBwcm90bzsKKwl1X2ludDhfdCBkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK2VudW0gaXBhY2Nlc3NfcHJvdG8geworCUlQQUNfUFJPVE9fUlNMCQk9IDB4MDAsCisJSVBBQ19QUk9UT19JUEFDQ0VTUwk9IDB4ZmUsCisJSVBBQ19QUk9UT19TQ0NQCQk9IDB4ZmQsCisJSVBBQ19QUk9UT19PTUwJCT0gMHhmZiwKK307CisKK2VudW0gaXBhY2Nlc3NfbXNndHlwZSB7CisJSVBBQ19NU0dUX1BJTkcJCT0gMHgwMCwKKwlJUEFDX01TR1RfUE9ORwkJPSAweDAxLAorCUlQQUNfTVNHVF9JRF9HRVQJPSAweDA0LAorCUlQQUNfTVNHVF9JRF9SRVNQCT0gMHgwNSwKKwlJUEFDX01TR1RfSURfQUNLCT0gMHgwNiwKK307CisKK2VudW0gaXBhY2Nlc3NfaWRfdGFncyB7CisJSVBBQ19JRFRBR19TRVJOUgkJPSAweDAwLAorCUlQQUNfSURUQUdfVU5JVE5BTUUJCT0gMHgwMSwKKwlJUEFDX0lEVEFHX0xPQ0FUSU9OMQkJPSAweDAyLAorCUlQQUNfSURUQUdfTE9DQVRJT04yCQk9IDB4MDMsCisJSVBBQ19JRFRBR19FUVVJUFZFUlMJCT0gMHgwNCwKKwlJUEFDX0lEVEFHX1NXVkVSU0lPTgkJPSAweDA1LAorCUlQQUNfSURUQUdfSVBBRERSCQk9IDB4MDYsCisJSVBBQ19JRFRBR19NQUNBRERSCQk9IDB4MDcsCisJSVBBQ19JRFRBR19VTklUCQkJPSAweDA4LAorfTsKKworaW50IGlwYWNjZXNzX2Nvbm5lY3Qoc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUsIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2EpOworCisvKgorICogbWV0aG9kcyBmb3IgcGFyc2luZyBhbmQgc2VuZGluZyBhIG1lc3NhZ2UKKyAqLworaW50IGlwYWNjZXNzX3Jjdm1zZ19iYXNlKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBic2NfZmQgKmJmZCk7CitzdHJ1Y3QgbXNnYiAqaXBhY2Nlc3NfcmVhZF9tc2coc3RydWN0IGJzY19mZCAqYmZkLCBpbnQgKmVycm9yKTsKK3ZvaWQgaXBhY2Nlc3NfcHJlcGVuZF9oZWFkZXIoc3RydWN0IG1zZ2IgKm1zZywgaW50IHByb3RvKTsKK2ludCBpcGFjY2Vzc19zZW5kX2lkX2FjayhpbnQgZmQpOworaW50IGlwYWNjZXNzX3NlbmRfaWRfcmVxKGludCBmZCk7CisKK2ludCBpcGFjY2Vzc19pZHRhZ19wYXJzZShzdHJ1Y3QgdGx2X3BhcnNlZCAqZGVjLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pOworCitpbnQgaXBhY2Nlc3NfZHJvcF9vbWwoc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgaXBhY2Nlc3NfZHJvcF9yc2woc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpOworCisvKgorICogRmlybXdhcmUgc3BlY2lmaWMgaGVhZGVyCisgKi8KK3N0cnVjdCBzZHBfZmlybXdhcmUgeworCWNoYXIgbWFnaWNbNF07CisJY2hhciBtb3JlX21hZ2ljWzJdOworCXVfaW50MTZfdCBtb3JlX21vcmVfbWFnaWM7CisJdV9pbnQzMl90IGhlYWRlcl9sZW5ndGg7CisJdV9pbnQzMl90IGZpbGVfbGVuZ3RoOworCWNoYXIgc3dfcGFydFsyMF07CisJY2hhciB0ZXh0MVs2NF07CisJY2hhciB0aW1lWzEyXTsKKwljaGFyIGRhdGVbMTRdOworCWNoYXIgdGV4dDJbMTBdOworCWNoYXIgdmVyc2lvblsyMF07CisJdV9pbnQxNl90IHRhYmxlX29mZnNldDsKKwkvKiBzdHVmZiBpIGRvbid0IGtub3cgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzZHBfaGVhZGVyX2VudHJ5IHsKKwl1X2ludDE2X3Qgc29tZXRoaW5nMTsKKwljaGFyIHRleHQxWzY0XTsKKwljaGFyIHRpbWVbMTJdOworCWNoYXIgZGF0ZVsxNF07CisJY2hhciB0ZXh0MlsxMF07CisJY2hhciB2ZXJzaW9uWzIwXTsKKwl1X2ludDMyX3QgbGVuZ3RoOworCXVfaW50MzJfdCBhZGRyMTsKKwl1X2ludDMyX3QgYWRkcjI7CisJdV9pbnQzMl90IHN0YXJ0OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNkcF9oZWFkZXJfaXRlbSB7CisJc3RydWN0IHNkcF9oZWFkZXJfZW50cnkgaGVhZGVyX2VudHJ5OworCXN0cnVjdCBsbGlzdF9oZWFkIGVudHJ5OworCW9mZl90IGFic29sdXRlX29mZnNldDsKK307CisKK3N0cnVjdCBzZHBfaGVhZGVyIHsKKwlzdHJ1Y3Qgc2RwX2Zpcm13YXJlIGZpcm13YXJlX2luZm87CisKKwkvKiBmb3IgbW9yZV9tYWdpYyBhIGxpc3Qgb2Ygc2RwX2hlYWRlcl9lbnRyeV9saXN0ICovCisJc3RydWN0IGxsaXN0X2hlYWQgaGVhZGVyX2xpc3Q7CisKKwkvKiB0aGUgZW50cnkgb2YgdGhlIHNkcF9oZWFkZXIgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBlbnRyeTsKK307CisKK2ludCBpcGFjY2Vzc19hbmFseXplX2ZpbGUoaW50IGZkLCBjb25zdCB1bnNpZ25lZCBpbnQgc3Rfc2l6ZSwgY29uc3QgdW5zaWduZWQgYmFzZV9vZmZzZXQsIHN0cnVjdCBsbGlzdF9oZWFkICpsaXN0KTsKKworI2VuZGlmIC8qIF9JUEFDQ0VTU19IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tZWFzX3JlcC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWVhc19yZXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzJjOGQxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWVhc19yZXAuaApAQCAtMCwwICsxLDg1IEBACisjaWZuZGVmIF9NRUFTX1JFUF9ICisjZGVmaW5lIF9NRUFTX1JFUF9ICisKKyNkZWZpbmUgTVJDX0ZfUFJPQ0VTU0VECTB4MDAwMQorCisvKiBleHRyYWN0ZWQgZnJvbSBhIEwzIG1lYXN1cmVtZW50IHJlcG9ydCBJRSAqLworc3RydWN0IGdzbV9tZWFzX3JlcF9jZWxsIHsKKwl1X2ludDhfdCByeGxldjsKKwl1X2ludDhfdCBic2ljOworCXVfaW50OF90IG5laWdoX2lkeDsKKwl1X2ludDE2X3QgYXJmY247CisJdW5zaWduZWQgaW50IGZsYWdzOworfTsKKworLyogUlggTGV2ZWwgYW5kIFJYIFF1YWxpdHkgKi8KK3N0cnVjdCBnc21fcnhfbGV2X3F1YWwgeworCXVfaW50OF90IHJ4X2xldjsKKwl1X2ludDhfdCByeF9xdWFsOworfTsKKworLyogdW5pZGlyZWN0aW9uYWwgbWVhc3VtcmVtZW50IHJlcG9ydCAqLworc3RydWN0IGdzbV9tZWFzX3JlcF91bmlkaXIgeworCXN0cnVjdCBnc21fcnhfbGV2X3F1YWwgZnVsbDsKKwlzdHJ1Y3QgZ3NtX3J4X2xldl9xdWFsIHN1YjsKK307CisKKyNkZWZpbmUgTUVBU19SRVBfRl9VTF9EVFgJMHgwMQorI2RlZmluZSBNRUFTX1JFUF9GX0RMX1ZBTElECTB4MDIKKyNkZWZpbmUgTUVBU19SRVBfRl9CQTEJCTB4MDQKKyNkZWZpbmUgTUVBU19SRVBfRl9ETF9EVFgJMHgwOAorI2RlZmluZSBNRUFTX1JFUF9GX01TX1RPCTB4MTAKKyNkZWZpbmUgTUVBU19SRVBfRl9NU19MMQkweDIwCisjZGVmaW5lIE1FQVNfUkVQX0ZfRlBDCQkweDQwCisKKy8qIHBhcnNlZCB1cGxpbmsgYW5kIGRvd25saW5rIG1lYXN1cmVtZW50IHJlc3VsdCAqLworc3RydWN0IGdzbV9tZWFzX3JlcCB7CisJLyogYmFjay1wb2ludGVyIHRvIHRoZSBsb2dpY2FsIGNoYW5uZWwgKi8KKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKworCS8qIG51bWJlciBvZiB0aGUgbWVhc3VyZW1lbnQgcmVwb3J0ICovCisJdV9pbnQ4X3QgbnI7CisJLyogZmxhZ3MsIHNlZSBNRUFTX1JFUF9GXyogKi8KKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisKKwkvKiB1cGxpbmsgYW5kIGRvd25saW5rIHJ4bGV2LCByeHF1YWw7IGZ1bGwgYW5kIHN1YiAqLworCXN0cnVjdCBnc21fbWVhc19yZXBfdW5pZGlyIHVsOworCXN0cnVjdCBnc21fbWVhc19yZXBfdW5pZGlyIGRsOworCisJdV9pbnQ4X3QgYnNfcG93ZXI7CisJdV9pbnQ4X3QgbXNfdGltaW5nX29mZnNldDsKKwlzdHJ1Y3QgeworCQlpbnQ4X3QgcHdyOwkvKiBNUyBwb3dlciBpbiBkQm0gKi8KKwkJdV9pbnQ4X3QgdGE7CS8qIE1TIHRpbWluZyBhZHZhbmNlICovCisJfSBtc19sMTsKKworCS8qIG5laWdoYm9yIG1lYXN1cmVtZW50IHJlcG9ydHMgZm9yIHVwIHRvIDYgY2VsbHMgKi8KKwlpbnQgbnVtX2NlbGw7CisJc3RydWN0IGdzbV9tZWFzX3JlcF9jZWxsIGNlbGxbNl07Cit9OworCitlbnVtIG1lYXNfcmVwX2ZpZWxkIHsKKwlNRUFTX1JFUF9ETF9SWExFVl9GVUxMLAorCU1FQVNfUkVQX0RMX1JYTEVWX1NVQiwKKwlNRUFTX1JFUF9ETF9SWFFVQUxfRlVMTCwKKwlNRUFTX1JFUF9ETF9SWFFVQUxfU1VCLAorCU1FQVNfUkVQX1VMX1JYTEVWX0ZVTEwsCisJTUVBU19SRVBfVUxfUlhMRVZfU1VCLAorCU1FQVNfUkVQX1VMX1JYUVVBTF9GVUxMLAorCU1FQVNfUkVQX1VMX1JYUVVBTF9TVUIsCit9OworCisvKiBvYnRhaW4gYW4gYXZlcmFnZSBvdmVyIHRoZSBsYXN0ICdudW0nIGZpZWxkcyBpbiB0aGUgbWVhcyByZXBzICovCitpbnQgZ2V0X21lYXNfcmVwX2F2Zyhjb25zdCBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwKKwkJICAgICBlbnVtIG1lYXNfcmVwX2ZpZWxkIGZpZWxkLCB1bnNpZ25lZCBpbnQgbnVtKTsKKworLyogQ2hlY2sgaWYgTiBvdXQgb2YgTSBsYXN0IHZhbHVlcyBmb3IgRklFTEQgYXJlID49IGJkICovCitpbnQgbWVhc19yZXBfbl9vdXRfb2ZfbV9iZShjb25zdCBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwKKwkJCWVudW0gbWVhc19yZXBfZmllbGQgZmllbGQsCisJCQl1bnNpZ25lZCBpbnQgbiwgdW5zaWduZWQgaW50IG0sIGludCBiZSk7CisKK3Vuc2lnbmVkIGludCBjYWxjX2luaXRpYWxfaWR4KHVuc2lnbmVkIGludCBhcnJheV9zaXplLAorCQkJICAgICAgdW5zaWduZWQgaW50IG1lYXNfcmVwX2lkeCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBudW1fdmFsdWVzKTsKKworI2VuZGlmIC8qIF9NRUFTX1JFUF9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tZ2NwLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tZ2NwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiN2ZjMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21nY3AuaApAQCAtMCwwICsxLDEzNSBAQAorLyogQSBNZWRpYSBHYXRld2F5IENvbnRyb2wgUHJvdG9jb2wgTWVkaWEgR2F0ZXdheTogUkZDIDM0MzUgKi8KKworLyoKKyAqIChDKSAyMDA5LTIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDktMjAxMCBieSBPbi1XYXZlcworICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgT1BFTkJTQ19NR0NQX0gKKyNkZWZpbmUgT1BFTkJTQ19NR0NQX0gKKworI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjZGVmaW5lIFJUUF9QT1JUX0RFRkFVTFQgNDAwMAorCisvKioKKyAqIENhbGN1bGF0ZSB0aGUgUlRQIGF1ZGlvIHBvcnQgZm9yIHRoZSBnaXZlbiBtdWx0aXBsZXgKKyAqIGFuZCB0aGUgZGlyZWN0aW9uLiBUaGlzIGFsbG93cyBhIHNlbWkgc3RhdGljIGVuZHBvaW50CisgKiB0byBwb3J0IGNhbGN1bGF0aW9uIHJlbW92aW5nIHRoZSBuZWVkIGZvciB0aGUgQlNDCisgKiBhbmQgdGhlIE1lZGlhR2F0ZXdheSB0byBjb21tdW5pY2F0ZS4KKyAqCisgKiBQb3J0IHVzYWdlIGV4cGxhaW5lZDoKKyAqICAgICAgIGJhc2UgKyAobXVsdGlwbGV4ICogMikgKyAwID09IGxvY2FsIHBvcnQgdG8gd2FpdCBmb3IgbmV0d29yayBwYWNrZXRzCisgKiAgICAgICBiYXNlICsgKG11bHRpcGxleCAqIDIpICsgMSA9PSBsb2NhbCBwb3J0IGZvciBydGNwCisgKgorICogVGhlIGFib3ZlIHBvcnQgd2lsbCByZWNlaXZlIHBhY2tldHMgZnJvbSB0aGUgQlRTIHRoYXQgbmVlZAorICogdG8gYmUgcGF0Y2hlZCBhbmQgZm9yd2FyZGVkIHRvIHRoZSBuZXR3b3JrLgorICogVGhlIGFib3ZlIHBvcnQgd2lsbCByZWNlaXZlIHBhY2tldHMgZnJvbSB0aGUgbmV0d29yayB0aGF0CisgKiBuZWVkIHRvIGJlIHBhdGNoZWQgYW5kIGZvcndhcmRlZCB0byB0aGUgQlRTLgorICoKKyAqIFdlIGFzc3VtZSB0byBoYXZlIGEgc3RhdGljIEJUUyBJUCBhZGRyZXNzIHNvIHdlIGNhbiBkaWZmZXJlbnRpYXRlCisgKiBuZXR3b3JrIGFuZCBCVFMuCisgKgorICovCitzdGF0aWMgaW5saW5lIGludCBydHBfY2FsY3VsYXRlX3BvcnQoaW50IG11bHRpcGxleCwgaW50IGJhc2UpCit7CisJcmV0dXJuIGJhc2UgKyAobXVsdGlwbGV4ICogMik7Cit9CisKKworLyoKKyAqIEhhbmRsaW5nIG9mIE1HQ1AgRW5kcG9pbnRzIGFuZCB0aGUgTUdDUCBDb25maWcKKyAqLworc3RydWN0IG1nY3BfZW5kcG9pbnQ7CitzdHJ1Y3QgbWdjcF9jb25maWc7CisKKyNkZWZpbmUgTUdDUF9FTkRQX0NSQ1ggMQorI2RlZmluZSBNR0NQX0VORFBfRExDWCAyCisjZGVmaW5lIE1HQ1BfRU5EUF9NRENYIDMKKworLyoKKyAqIHdoYXQgdG8gZG8gd2l0aCB0aGUgbXNnPworICoJLSBjb250aW51ZSBhcyB1c3VhbD8KKyAqCS0gcmVqZWN0IGFuZCBzZW5kIGEgZmFpbHVyZSBjb2RlPworICoJLSBkZWZlcj8gZG8gbm90IHNlbmQgYW55dGhpbmcKKyAqLworI2RlZmluZSBNR0NQX1BPTElDWV9DT05UCTQKKyNkZWZpbmUgTUdDUF9QT0xJQ1lfUkVKRUNUCTUKKyNkZWZpbmUgTUdDUF9QT0xJQ1lfREVGRVIJNgorCit0eXBlZGVmIGludCAoKm1nY3BfY2hhbmdlKShzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgaW50IGVuZHBvaW50LCBpbnQgc3RhdGUsIGludCBsb2NhbF9ydHApOwordHlwZWRlZiBpbnQgKCptZ2NwX3BvbGljeSkoc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIGludCBlbmRwb2ludCwgaW50IHN0YXRlLCBjb25zdCBjaGFyICp0cmFuc2FjdGlvX2lkKTsKK3R5cGVkZWYgaW50ICgqbWdjcF9yZXNldCkoc3RydWN0IG1nY3BfY29uZmlnICpjZmcpOworCitzdHJ1Y3QgbWdjcF9jb25maWcgeworCWludCBzb3VyY2VfcG9ydDsKKwljaGFyICpsb2NhbF9pcDsKKwljaGFyICpzb3VyY2VfYWRkcjsKKwl1bnNpZ25lZCBpbnQgbnVtYmVyX2VuZHBvaW50czsKKwljaGFyICpidHNfaXA7CisJY2hhciAqY2FsbF9hZ2VudF9hZGRyOworCisJc3RydWN0IGluX2FkZHIgYnRzX2luOworCWNoYXIgKmF1ZGlvX25hbWU7CisJaW50IGF1ZGlvX3BheWxvYWQ7CisJaW50IGF1ZGlvX2xvb3A7CisJaW50IGVhcmx5X2JpbmQ7CisJaW50IHJ0cF9iYXNlX3BvcnQ7CisKKwljaGFyICpmb3J3YXJkX2lwOworCWludCBmb3J3YXJkX3BvcnQ7CisKKwkvKiBzcGVjIGhhbmRsaW5nICovCisJaW50IGZvcmNlX3JlYWxsb2M7CisKKwltZ2NwX2NoYW5nZSBjaGFuZ2VfY2I7CisJbWdjcF9wb2xpY3kgcG9saWN5X2NiOworCW1nY3BfcmVzZXQgcmVzZXRfY2I7CisJdm9pZCAqZGF0YTsKKworCXN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwb2ludHM7CisJdW5zaWduZWQgaW50IGxhc3RfY2FsbF9pZDsKK307CisKKy8qIGNvbmZpZyBtYW5hZ2VtZW50ICovCitzdHJ1Y3QgbWdjcF9jb25maWcgKm1nY3BfY29uZmlnX2FsbG9jKHZvaWQpOworaW50IG1nY3BfcGFyc2VfY29uZmlnKGNvbnN0IGNoYXIgKmNvbmZpZ19maWxlLCBzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZyk7CitpbnQgbWdjcF92dHlfaW5pdCh2b2lkKTsKK2ludCBtZ2NwX2VuZHBvaW50c19hbGxvY2F0ZShzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZyk7CitpbnQgbWdjcF9iaW5kX3J0cF9wb3J0KHN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwLCBpbnQgcnRwX3BvcnQpOwordm9pZCBtZ2NwX2ZyZWVfZW5kcChzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcCk7CisKKy8qCisgKiBmb3JtYXQgaGVscGVyIGZ1bmN0aW9ucworICovCitzdHJ1Y3QgbXNnYiAqbWdjcF9oYW5kbGVfbWVzc2FnZShzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZyk7CitzdHJ1Y3QgbXNnYiAqbWdjcF9jcmVhdGVfcmVzcG9uc2Vfd2l0aF9kYXRhKGludCBjb2RlLCBjb25zdCBjaGFyICptc2csIGNvbnN0IGNoYXIgKnRyYW5zLCBjb25zdCBjaGFyICpkYXRhKTsKKworLyogYWRjIGhlbHBlciAqLworc3RhdGljIGlubGluZSBpbnQgbWdjcF90aW1lc2xvdF90b19lbmRwb2ludChpbnQgbXVsdGlwbGV4LCBpbnQgdGltZXNsb3QpCit7CisJaWYgKHRpbWVzbG90ID09IDApCisJCXRpbWVzbG90ID0gMTsKKwlyZXR1cm4gdGltZXNsb3QgKyAoMzEgKiBtdWx0aXBsZXgpOworfQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWdjcF9pbnRlcm5hbC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWdjcF9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YWVjMzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tZ2NwX2ludGVybmFsLmgKQEAgLTAsMCArMSw3OCBAQAorLyogTUdDUCBQcml2YXRlIERhdGEgKi8KKworLyoKKyAqIChDKSAyMDA5LTIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDktMjAxMCBieSBPbi1XYXZlcworICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgT1BFTkJTQ19NR0NQX0RBVEFfSAorI2RlZmluZSBPUEVOQlNDX01HQ1BfREFUQV9ICisKKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKworI2RlZmluZSBDSV9VTlVTRUQgMAorCitzdHJ1Y3QgbWdjcF9lbmRwb2ludCB7CisJaW50IGNpOworCWNoYXIgKmNhbGxpZDsKKwljaGFyICpsb2NhbF9vcHRpb25zOworCWludCBjb25uX21vZGU7CisKKwlpbnQgYnRzX3BheWxvYWRfdHlwZTsKKwlpbnQgbmV0X3BheWxvYWRfdHlwZTsKKworCS8qIHRoZSBsb2NhbCBydHAgcG9ydCB3ZSBhcmUgYmluZGluZyB0byAqLworCWludCBydHBfcG9ydDsKKworCS8qCisJICogUlRQIG1hbmdsaW5nOgorCSAqICAtIHdlIGdldCBSVFAgYW5kIFJUQ1AgdG8gdXMgYW5kIG5lZWQgdG8gZm9yd2FyZCB0byB0aGUgQlRTCisJICogIC0gd2UgZ2V0IFJUUCBhbmQgUlRDUCBmcm9tIHRoZSBCVFMgYW5kIGZvcndhcmQgdG8gdGhlIG5ldHdvcmsKKwkgKi8KKwlzdHJ1Y3QgYnNjX2ZkIGxvY2FsX3J0cDsKKwlzdHJ1Y3QgYnNjX2ZkIGxvY2FsX3J0Y3A7CisKKwlzdHJ1Y3QgaW5fYWRkciByZW1vdGU7CisJc3RydWN0IGluX2FkZHIgYnRzOworCisJLyogaW4gbmV0d29yayBieXRlIG9yZGVyICovCisJaW50IG5ldF9ydHAsIG5ldF9ydGNwOworCWludCBidHNfcnRwLCBidHNfcnRjcDsKKworCS8qIGJhY2twb2ludGVyICovCisJc3RydWN0IG1nY3BfY29uZmlnICpjZmc7CisKKwkvKiBzdGF0aXN0aWNzICovCisJdW5zaWduZWQgaW50IGluX2J0czsKKwl1bnNpZ25lZCBpbnQgaW5fcmVtb3RlOworfTsKKworI2RlZmluZSBFTkRQT0lOVF9OVU1CRVIoZW5kcCkgYWJzKGVuZHAgLSBlbmRwLT5jZmctPmVuZHBvaW50cykKKworc3RydWN0IG1nY3BfbXNnX3B0ciB7CisJdW5zaWduZWQgaW50IHN0YXJ0OworCXVuc2lnbmVkIGludCBsZW5ndGg7Cit9OworCitpbnQgbWdjcF9hbmFseXplX2hlYWRlcihzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZywKKwkJCXN0cnVjdCBtZ2NwX21zZ19wdHIgKnB0ciwgaW50IHNpemUsCisJCQljb25zdCBjaGFyICoqdHJhbnNhY3Rpb25faWQsIHN0cnVjdCBtZ2NwX2VuZHBvaW50ICoqZW5kcCk7CitpbnQgbWdjcF9zZW5kX2R1bW15KHN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9taXNkbi5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWlzZG4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzM4ZGU3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWlzZG4uaApAQCAtMCwwICsxLDI5IEBACisvKiAoQykgMjAwOCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgTUlTRE5fSAorI2RlZmluZSBNSVNETl9ICisKKyNpbmNsdWRlICJlMV9pbnB1dC5oIgorCitpbnQgbWlfc2V0dXAoaW50IGNhcmRuciwgIHN0cnVjdCBlMWlucF9saW5lICpsaW5lLCBpbnQgcmVsZWFzZV9sMik7CitpbnQgX2FiaXNfbm1fc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKK2ludCBtaV9lMV9saW5lX3VwZGF0ZShzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbW5jYy5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbW5jYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiODMzOWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tbmNjLmgKQEAgLTAsMCArMSwxNTkgQEAKKy8qIEdTTSBNb2JpbGUgUmFkaW8gSW50ZXJmYWNlIExheWVyIDMgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZSAKKyAqIDNHUFAgVFMgMDQuMDggdmVyc2lvbiA3LjIxLjAgUmVsZWFzZSAxOTk4IC8gRVRTSSBUUyAxMDAgOTQwIFY3LjIxLjAgKi8KKworLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDgsIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9NTkNDX0gKKyNkZWZpbmUgX01OQ0NfSAorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbW5jYy5oPgorCisvKiBPbmUgZW5kIG9mIGEgY2FsbCAqLworc3RydWN0IGdzbV9jYWxsIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBlbnRyeTsKKworCS8qIG5ldHdvcmsgaGFuZGxlICovCisJdm9pZCAqbmV0OworCisJLyogdGhlICdsb2NhbCcgdHJhbnNhY3Rpb24gKi8KKwl1X2ludDMyX3QgY2FsbHJlZjsKKwkvKiB0aGUgJ3JlbW90ZScgdHJhbnNhY3Rpb24gKi8KKwl1X2ludDMyX3QgcmVtb3RlX3JlZjsKK307CisKKyNkZWZpbmUgTU5DQ19TRVRVUF9SRVEJCTB4MDEwMQorI2RlZmluZSBNTkNDX1NFVFVQX0lORAkJMHgwMTAyCisjZGVmaW5lIE1OQ0NfU0VUVVBfUlNQCQkweDAxMDMKKyNkZWZpbmUgTU5DQ19TRVRVUF9DTkYJCTB4MDEwNAorI2RlZmluZSBNTkNDX1NFVFVQX0NPTVBMX1JFUQkweDAxMDUKKyNkZWZpbmUgTU5DQ19TRVRVUF9DT01QTF9JTkQJMHgwMTA2CisvKiBNTkNDX1JFSl8qIGlzIHBlcmZvbWVkIHZpYSBNTkNDX1JFTF8qICovCisjZGVmaW5lIE1OQ0NfQ0FMTF9DT05GX0lORAkweDAxMDcKKyNkZWZpbmUgTU5DQ19DQUxMX1BST0NfUkVRCTB4MDEwOAorI2RlZmluZSBNTkNDX1BST0dSRVNTX1JFUQkweDAxMDkKKyNkZWZpbmUgTU5DQ19BTEVSVF9SRVEJCTB4MDEwYQorI2RlZmluZSBNTkNDX0FMRVJUX0lORAkJMHgwMTBiCisjZGVmaW5lIE1OQ0NfTk9USUZZX1JFUQkJMHgwMTBjCisjZGVmaW5lIE1OQ0NfTk9USUZZX0lORAkJMHgwMTBkCisjZGVmaW5lIE1OQ0NfRElTQ19SRVEJCTB4MDEwZQorI2RlZmluZSBNTkNDX0RJU0NfSU5ECQkweDAxMGYKKyNkZWZpbmUgTU5DQ19SRUxfUkVRCQkweDAxMTAKKyNkZWZpbmUgTU5DQ19SRUxfSU5ECQkweDAxMTEKKyNkZWZpbmUgTU5DQ19SRUxfQ05GCQkweDAxMTIKKyNkZWZpbmUgTU5DQ19GQUNJTElUWV9SRVEJMHgwMTEzCisjZGVmaW5lIE1OQ0NfRkFDSUxJVFlfSU5ECTB4MDExNAorI2RlZmluZSBNTkNDX1NUQVJUX0RUTUZfSU5ECTB4MDExNQorI2RlZmluZSBNTkNDX1NUQVJUX0RUTUZfUlNQCTB4MDExNgorI2RlZmluZSBNTkNDX1NUQVJUX0RUTUZfUkVKCTB4MDExNworI2RlZmluZSBNTkNDX1NUT1BfRFRNRl9JTkQJMHgwMTE4CisjZGVmaW5lIE1OQ0NfU1RPUF9EVE1GX1JTUAkweDAxMTkKKyNkZWZpbmUgTU5DQ19NT0RJRllfUkVRCQkweDAxMWEKKyNkZWZpbmUgTU5DQ19NT0RJRllfSU5ECQkweDAxMWIKKyNkZWZpbmUgTU5DQ19NT0RJRllfUlNQCQkweDAxMWMKKyNkZWZpbmUgTU5DQ19NT0RJRllfQ05GCQkweDAxMWQKKyNkZWZpbmUgTU5DQ19NT0RJRllfUkVKCQkweDAxMWUKKyNkZWZpbmUgTU5DQ19IT0xEX0lORAkJMHgwMTFmCisjZGVmaW5lIE1OQ0NfSE9MRF9DTkYJCTB4MDEyMAorI2RlZmluZSBNTkNDX0hPTERfUkVKCQkweDAxMjEKKyNkZWZpbmUgTU5DQ19SRVRSSUVWRV9JTkQJMHgwMTIyCisjZGVmaW5lIE1OQ0NfUkVUUklFVkVfQ05GCTB4MDEyMworI2RlZmluZSBNTkNDX1JFVFJJRVZFX1JFSgkweDAxMjQKKyNkZWZpbmUgTU5DQ19VU0VSSU5GT19SRVEJMHgwMTI1CisjZGVmaW5lIE1OQ0NfVVNFUklORk9fSU5ECTB4MDEyNgorI2RlZmluZSBNTkNDX1JFSl9SRVEJCTB4MDEyNworI2RlZmluZSBNTkNDX1JFSl9JTkQJCTB4MDEyOAorCisjZGVmaW5lIE1OQ0NfQlJJREdFCQkweDAyMDAKKyNkZWZpbmUgTU5DQ19GUkFNRV9SRUNWCQkweDAyMDEKKyNkZWZpbmUgTU5DQ19GUkFNRV9EUk9QCQkweDAyMDIKKyNkZWZpbmUgTU5DQ19MQ0hBTl9NT0RJRlkJMHgwMjAzCisKKyNkZWZpbmUgR1NNX1RDSEZfRlJBTUUJCTB4MDMwMAorI2RlZmluZSBHU01fVENIRl9GUkFNRV9FRlIJMHgwMzAxCisKKyNkZWZpbmUgR1NNX01BWF9GQUNJTElUWQkxMjgKKyNkZWZpbmUgR1NNX01BWF9TU1ZFUlNJT04JMTI4CisjZGVmaW5lIEdTTV9NQVhfVVNFUlVTRVIJMTI4CisKKyNkZWZpbmUJTU5DQ19GX0JFQVJFUl9DQVAJMHgwMDAxCisjZGVmaW5lIE1OQ0NfRl9DQUxMRUQJCTB4MDAwMgorI2RlZmluZSBNTkNDX0ZfQ0FMTElORwkJMHgwMDA0CisjZGVmaW5lIE1OQ0NfRl9SRURJUkVDVElORwkweDAwMDgKKyNkZWZpbmUgTU5DQ19GX0NPTk5FQ1RFRAkweDAwMTAKKyNkZWZpbmUgTU5DQ19GX0NBVVNFCQkweDAwMjAKKyNkZWZpbmUgTU5DQ19GX1VTRVJVU0VSCQkweDAwNDAKKyNkZWZpbmUgTU5DQ19GX1BST0dSRVNTCQkweDAwODAKKyNkZWZpbmUgTU5DQ19GX0VNRVJHRU5DWQkweDAxMDAKKyNkZWZpbmUgTU5DQ19GX0ZBQ0lMSVRZCQkweDAyMDAKKyNkZWZpbmUgTU5DQ19GX1NTVkVSU0lPTgkweDA0MDAKKyNkZWZpbmUgTU5DQ19GX0NDQ0FQCQkweDA4MDAKKyNkZWZpbmUgTU5DQ19GX0tFWVBBRAkJMHgxMDAwCisjZGVmaW5lIE1OQ0NfRl9TSUdOQUwJCTB4MjAwMAorCitzdHJ1Y3QgZ3NtX21uY2MgeworCS8qIGNvbnRleHQgYmFzZWQgaW5mb3JtYXRpb24gKi8KKwl1X2ludDMyX3QJbXNnX3R5cGU7CisJdV9pbnQzMl90CWNhbGxyZWY7CisKKwkvKiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgKi8KKwl1X2ludDMyX3QJZmllbGRzOworCisJLyogZGF0YSBkZXJpdmVkIGluZm9ybWF0aW9ucyAoTU5DQ19GXyBiYXNlZCkgKi8KKwlzdHJ1Y3QgZ3NtX21uY2NfYmVhcmVyX2NhcAliZWFyZXJfY2FwOworCXN0cnVjdCBnc21fbW5jY19udW1iZXIJCWNhbGxlZDsKKwlzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyCQljYWxsaW5nOworCXN0cnVjdCBnc21fbW5jY19udW1iZXIJCXJlZGlyZWN0aW5nOworCXN0cnVjdCBnc21fbW5jY19udW1iZXIJCWNvbm5lY3RlZDsKKwlzdHJ1Y3QgZ3NtX21uY2NfY2F1c2UJCWNhdXNlOworCXN0cnVjdCBnc21fbW5jY19wcm9ncmVzcwlwcm9ncmVzczsKKwlzdHJ1Y3QgZ3NtX21uY2NfdXNlcnVzZXIJdXNlcnVzZXI7CisJc3RydWN0IGdzbV9tbmNjX2ZhY2lsaXR5CWZhY2lsaXR5OworCXN0cnVjdCBnc21fbW5jY19jY2NhcAkJY2NjYXA7CisJc3RydWN0IGdzbV9tbmNjX3NzdmVyc2lvbglzc3ZlcnNpb247CisJc3RydWN0CXsKKwkJaW50CQlzdXA7CisJCWludAkJaW52OworCX0gY2xpcjsKKwlpbnQJCXNpZ25hbDsKKworCS8qIGRhdGEgZGVyaXZlZCBpbmZvcm1hdGlvbiwgbm90IE1OQ0NfRiBiYXNlZCAqLworCWludAkJa2V5cGFkOworCWludAkJbW9yZTsKKwlpbnQJCW5vdGlmeTsgLyogMC4uMTI3ICovCisJaW50CQllbWVyZ2VuY3k7CisJY2hhcgkJaW1zaVsxNl07CisKKwl1bnNpZ25lZCBjaGFyCWxjaGFuX21vZGU7Cit9OworCitzdHJ1Y3QgZ3NtX2RhdGFfZnJhbWUgeworCXVfaW50MzJfdAltc2dfdHlwZTsKKwl1X2ludDMyX3QJY2FsbHJlZjsKKwl1bnNpZ25lZCBjaGFyCWRhdGFbMF07Cit9OworCitjaGFyICpnZXRfbW5jY19uYW1lKGludCB2YWx1ZSk7CitpbnQgbW5jY19yZWN2KHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBpbnQgbXNnX3R5cGUsIHZvaWQgKmFyZyk7Cit2b2lkIG1uY2Nfc2V0X2NhdXNlKHN0cnVjdCBnc21fbW5jYyAqZGF0YSwgaW50IGxvYywgaW50IHZhbCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvb3BlbmJzY2RlZmluZXMuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL29wZW5ic2NkZWZpbmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgyZTU5MgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL29wZW5ic2NkZWZpbmVzLmgKQEAgLTAsMCArMSwzNSBAQAorLyogCisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgT1BFTkJTQ0RFRklORVNfSAorI2RlZmluZSBPUEVOQlNDREVGSU5FU19ICisKKyNpZmRlZiBCVUlMRElOR19PTl9XSU5ET1dTCisgICAgI2lmZGVmIEJVSUxESU5HX09QRU5CU0MKKyAgICAgICAgI2RlZmluZSBCU0NfQVBJIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorICAgICNlbHNlCisgICAgICAgICNkZWZpbmUgQlNDX0FQSSBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyAgICAjZW5kaWYKKyNlbHNlCisgICAgI2RlZmluZSBCU0NfQVBJIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9wYWdpbmcuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3BhZ2luZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYmRjYTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9wYWdpbmcuaApAQCAtMCwwICsxLDQ2IEBACisvKiBQYWdpbmcgaGVscGVyIGFuZCBtYW5hZ2VyLi4uLiAqLworLyogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgUEFHSU5HX0gKKyNkZWZpbmUgUEFHSU5HX0gKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisjaW5jbHVkZSAiZ3NtX2RhdGEuaCIKKyNpbmNsdWRlICJnc21fc3Vic2NyaWJlci5oIgorI2luY2x1ZGUgPG9zbW9jb3JlL3RpbWVyLmg+CisKKy8qIGNhbGwgb25jZSBmb3IgZXZlcnkgZ3NtX2J0cy4uLiAqLwordm9pZCBwYWdpbmdfaW5pdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKKworLyogc2NoZWR1bGUgcGFnaW5nIHJlcXVlc3QgKi8KK2ludCBwYWdpbmdfcmVxdWVzdChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldHdvcmssIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkgICBpbnQgdHlwZSwgZ3NtX2NiZm4gKmNiZm4sIHZvaWQgKmRhdGEpOworCisvKiBzdG9wIHBhZ2luZyByZXF1ZXN0cyAqLwordm9pZCBwYWdpbmdfcmVxdWVzdF9zdG9wKHN0cnVjdCBnc21fYnRzICpidHMsIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJIHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKKworLyogdXBkYXRlIHBhZ2luZyBsb2FkICovCit2b2lkIHBhZ2luZ191cGRhdGVfYnVmZmVyX3NwYWNlKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50MTZfdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvcmVzdF9vY3RldHMuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3Jlc3Rfb2N0ZXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ5MDExOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3Jlc3Rfb2N0ZXRzLmgKQEAgLTAsMCArMSwxMzMgQEAKKyNpZm5kZWYgX1JFU1RfT0NURVRTX0gKKyNkZWZpbmUgX1JFU1RfT0NURVRTX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisKKy8qIGdlbmVyYXRlIFNJMSByZXN0IG9jdGV0cyAqLworaW50IHJlc3Rfb2N0ZXRzX3NpMSh1X2ludDhfdCAqZGF0YSwgdV9pbnQ4X3QgKm5jaF9wb3MpOworCitzdHJ1Y3QgZ3NtNDhfc2lfc2VsZWN0aW9uX3BhcmFtcyB7CisJdV9pbnQxNl90IHBlbmFsdHlfdGltZTo1LAorCQkgIHRlbXBfb2ZmczozLAorCQkgIGNlbGxfcmVzZWxfb2ZmOjYsCisJCSAgY2JxOjEsCisJCSAgcHJlc2VudDoxOworfTsKKworc3RydWN0IGdzbTQ4X3NpX3Bvd2VyX29mZnNldCB7CisJdV9pbnQ4X3QgcG93ZXJfb2Zmc2V0OjIsCisJCSBwcmVzZW50OjE7Cit9OworCitzdHJ1Y3QgZ3NtNDhfc2kzX2dwcnNfaW5kIHsKKwl1X2ludDhfdCBzaTEzX3Bvc2l0aW9uOjEsCisJCSByYV9jb2xvdXI6MywKKwkJIHByZXNlbnQ6MTsKK307CisKK3N0cnVjdCBnc200OF9sc2FfcGFyYW1zIHsKKwl1X2ludDMyX3QgcHJpb190aHI6MywKKwkJIGxzYV9vZmZzZXQ6MywKKwkJIG1jYzoxMiwKKwkJIG1uYzoxMjsKKwl1bnNpZ25lZCBpbnQgcHJlc2VudDsKK307CisKK3N0cnVjdCBnc200OF9zaV9yb19pbmZvIHsKKwlzdHJ1Y3QgZ3NtNDhfc2lfc2VsZWN0aW9uX3BhcmFtcyBzZWxlY3Rpb25fcGFyYW1zOworCXN0cnVjdCBnc200OF9zaV9wb3dlcl9vZmZzZXQgcG93ZXJfb2Zmc2V0OworCXVfaW50OF90IHNpMnRlcl9pbmRpY2F0b3I7CisJdV9pbnQ4X3QgZWFybHlfY21fY3RybDsKKwlzdHJ1Y3QgeworCQl1X2ludDhfdCB3aGVyZTozLAorCQkJIHByZXNlbnQ6MTsKKwl9IHNjaGVkdWxpbmc7CisJc3RydWN0IGdzbTQ4X3NpM19ncHJzX2luZCBncHJzX2luZDsKKworCS8qIFNJIDQgc3BlY2lmaWMgKi8KKwlzdHJ1Y3QgZ3NtNDhfbHNhX3BhcmFtcyBsc2FfcGFyYW1zOworCXVfaW50MTZfdCBjZWxsX2lkOworCXVfaW50OF90IGJyZWFrX2luZDsJLyogZG8gd2UgaGF2ZSBTSTcgKyBTSTggPyAqLworfTsKKworCisvKiBHZW5lcmF0ZSBTSTMgUmVzdCBPY3Rlc3RzIChDaGFwdGVyIDEwLjUuMi4zNCAvIFRhYmxlIDEwLjQuNzIpICovCitpbnQgcmVzdF9vY3RldHNfc2kzKHVfaW50OF90ICpkYXRhLCBjb25zdCBzdHJ1Y3QgZ3NtNDhfc2lfcm9faW5mbyAqc2kzKTsKKworLyogR2VuZXJhdGUgU0k0IFJlc3QgT2N0ZXRzIChDaGFwdGVyIDEwLjUuMi4zNSkgKi8KK2ludCByZXN0X29jdGV0c19zaTQodV9pbnQ4X3QgKmRhdGEsIGNvbnN0IHN0cnVjdCBnc200OF9zaV9yb19pbmZvICpzaTQpOworCitlbnVtIHBiY2NoX2NhcnJpZXJfdHlwZSB7CisJUEJDQ0hfQkNDSCwKKwlQQkNDSF9BUkZDTiwKKwlQQkNDSF9NQUlPCit9OworCisvKiBUUyAwMy42MCBDaGFwdGVyIDYuMy4zLjE6IE5ldHdvcmsgTW9kZSBvZiBPcGVyYXRpb24gKi8KK2VudW0gZ3Byc19ubW8geworCUdQUlNfTk1PX0kJPSAwLAkvKiBDUyBwYWdpbiBvbiBHUFJTIHBhZ2luZyBvciB0cmFmZmljIGNoYW5uZWwgKi8KKwlHUFJTX05NT19JSQk9IDEsCS8qIGFsbCBwYWdpbmcgb24gQ0NDSCAqLworCUdQUlNfTk1PX0lJSQk9IDIsCS8qIG5vIHBhZ2luZyBjb29yZGluYXRpb24gKi8KK307CisKKy8qIFRTIDA0LjYwIDEyLjI0ICovCitzdHJ1Y3QgZ3Byc19jZWxsX29wdGlvbnMgeworCWVudW0gZ3Byc19ubW8gbm1vOworCS8qIFQzMTY4OiB3YWl0IGZvciBwYWNrZXQgdXBsaW5rIGFzc2lnbm1lbnQgbWVzc2FnZSAqLworCXVfaW50MzJfdCB0MzE2ODsJLyogaW4gbWlsbGlzZWNvbmRzICovCisJLyogVDMxOTI6IHdhaXQgZm9yIHJlbGVhc2Ugb2YgdGhlIFRCRiBhZnRlciByZWNlcHRpb24gb2YgdGhlIGZpbmFsIGJsb2NrICovCisJdV9pbnQzMl90IHQzMTkyOwkvKiBpbiBtaWxsaXNlY29uZHMgKi8KKwl1X2ludDMyX3QgZHJ4X3RpbWVyX21heDsvKiBpbiBzZWNvbmRzICovCisJdV9pbnQzMl90IGJzX2N2X21heDsKKworCXVfaW50OF90IGV4dF9pbmZvX3ByZXNlbnQ7CisJc3RydWN0IHsKKwkJdV9pbnQ4X3QgZWdwcnNfc3VwcG9ydGVkOworCQkJdV9pbnQ4X3QgdXNlX2VncHJzX3BfY2hfcmVxOworCQkJdV9pbnQ4X3QgYmVwX3BlcmlvZDsKKwkJdV9pbnQ4X3QgcGZjX3N1cHBvcnRlZDsKKwkJdV9pbnQ4X3QgZHRtX3N1cHBvcnRlZDsKKwkJdV9pbnQ4X3QgYnNzX3BhZ2luZ19jb29yZGluYXRpb247CisJfSBleHRfaW5mbzsKK307CisKKy8qIFRTIDA0LjYwIFRhYmxlIDEyLjkuMiAqLworc3RydWN0IGdwcnNfcG93ZXJfY3RybF9wYXJzIHsKKwl1X2ludDhfdCBhbHBoYTsKKwl1X2ludDhfdCB0X2F2Z193OworCXVfaW50OF90IHRfYXZnX3Q7CisJdV9pbnQ4X3QgcGNfbWVhc19jaGFuOworCXVfaW50OF90IG5fYXZnX2k7Cit9OworCitzdHJ1Y3QgZ3NtNDhfc2kxM19pbmZvIHsKKwlzdHJ1Y3QgZ3Byc19jZWxsX29wdGlvbnMgY2VsbF9vcHRzOworCXN0cnVjdCBncHJzX3Bvd2VyX2N0cmxfcGFycyBwd3JfY3RybF9wYXJzOworCXVfaW50OF90IGJjY2hfY2hhbmdlX21hcms7CisJdV9pbnQ4X3Qgc2lfY2hhbmdlX2ZpZWxkOworCXVfaW50OF90IHBiY2NoX3ByZXNlbnQ7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1X2ludDhfdCByYWM7CisJCQl1X2ludDhfdCBzcGdjX2NjY2hfc3VwOworCQkJdV9pbnQ4X3QgbmV0X2N0cmxfb3JkOworCQkJdV9pbnQ4X3QgcHJpb19hY2NfdGhyOworCQl9IG5vX3BiY2NoOworCQlzdHJ1Y3QgeworCQkJdV9pbnQ4X3QgcHNpMV9yZXBfcGVyOworCQkJdV9pbnQ4X3QgcGI7CisJCQl1X2ludDhfdCB0c2M7CisJCQl1X2ludDhfdCB0bjsKKwkJCWVudW0gcGJjY2hfY2Fycmllcl90eXBlIGNhcnJpZXJfdHlwZTsKKwkJCXVfaW50MTZfdCBhcmZjbjsKKwkJCXVfaW50OF90IG1haW87CisJCX0gcGJjY2g7CisJfTsKK307CisKKy8qIEdlbmVyYXRlIFNJMTMgUmVzdCBPY3Rlc3RzIChDaGFwdGVyIDEwLjUuMi4zN2IpICovCitpbnQgcmVzdF9vY3RldHNfc2kxMyh1X2ludDhfdCAqZGF0YSwgY29uc3Qgc3RydWN0IGdzbTQ4X3NpMTNfaW5mbyAqc2kxMyk7CisKKyNlbmRpZiAvKiBfUkVTVF9PQ1RFVFNfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvcnMyMzIuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3JzMjMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjExODdjYQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3JzMjMyLmgKQEAgLTAsMCArMSw5IEBACisjaWZuZGVmIF9SUzIzMl9ICisjZGVmaW5lIF9SUzIzMl9ICisKK2ludCByczIzMl9zZXR1cChjb25zdCBjaGFyICpzZXJpYWxfcG9ydCwgdW5zaWduZWQgaW50IGRlbGF5X21zLAorCQlzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKKworaW50IGhhbmRsZV9zZXJpYWxfbXNnKHN0cnVjdCBtc2diICptc2cpOworCisjZW5kaWYgLyogX1JTMjMyX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3J0cF9wcm94eS5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvcnRwX3Byb3h5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjViMWE1ZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3J0cF9wcm94eS5oCkBAIC0wLDAgKzEsOTEgQEAKKyNpZm5kZWYgX1JUUF9QUk9YWV9ICisjZGVmaW5lIF9SVFBfUFJPWFlfSAorCisvKiBSVFAgcHJveHkgaGFuZGxpbmcgZm9yIGlwLmFjY2VzcyBuYW5vQlRTICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisKKyNkZWZpbmUgUlRQX1BUX0dTTV9GVUxMIDMKKyNkZWZpbmUgUlRQX1BUX0dTTV9IQUxGIDk2CisjZGVmaW5lIFJUUF9QVF9HU01fRUZSIDk3CisjZGVmaW5lIFJUUF9QVF9BTVJfRlVMTCA5OAorI2RlZmluZSBSVFBfUFRfQU1SX0hBTEYgOTkKKworZW51bSBydHBfcnhfYWN0aW9uIHsKKwlSVFBfTk9ORSwKKwlSVFBfUFJPWFksCisJUlRQX1JFQ1ZfVVBTVFJFQU0sCit9OworCitlbnVtIHJ0cF90eF9hY3Rpb24geworCVJUUF9TRU5EX05PTkUsCisJUlRQX1NFTkRfRE9XTlNUUkVBTSwKK307CisKK3N0cnVjdCBydHBfc3ViX3NvY2tldCB7CisJc3RydWN0IHNvY2thZGRyX2luIHNpbl9sb2NhbDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luX3JlbW90ZTsKKworCXN0cnVjdCBic2NfZmQgYmZkOworCS8qIGxpbmtlZCBsaXN0IG9mIHRvLWJlLXRyYW5zbWl0dGVkIG1zZ2IncyAqLworCXN0cnVjdCBsbGlzdF9oZWFkIHR4X3F1ZXVlOworfTsKKworc3RydWN0IHJ0cF9zb2NrZXQgeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwlzdHJ1Y3QgcnRwX3N1Yl9zb2NrZXQgcnRwOworCXN0cnVjdCBydHBfc3ViX3NvY2tldCBydGNwOworCisJLyogd2hhdCBzaG91bGQgd2UgZG8gb24gcmVjZWl2ZT8gKi8KKwllbnVtIHJ0cF9yeF9hY3Rpb24gcnhfYWN0aW9uOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBydHBfc29ja2V0ICpvdGhlcl9zb2NrOworCQl9IHByb3h5OworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQ7CisJCQl1X2ludDMyX3QgY2FsbHJlZjsKKwkJfSByZWNlaXZlOworCX07CisJZW51bSBydHBfdHhfYWN0aW9uIHR4X2FjdGlvbjsKKwlzdHJ1Y3QgeworCQl1X2ludDE2X3Qgc2VxdWVuY2U7CisJCXVfaW50MzJfdCB0aW1lc3RhbXA7CisJCXVfaW50MzJfdCBzc3JjOworCQlzdHJ1Y3QgdGltZXZhbCBsYXN0X3R2OworCX0gdHJhbnNtaXQ7Cit9OworCitzdHJ1Y3QgcnRwX3NvY2tldCAqcnRwX3NvY2tldF9jcmVhdGUodm9pZCk7CitpbnQgcnRwX3NvY2tldF9iaW5kKHN0cnVjdCBydHBfc29ja2V0ICpycywgdV9pbnQzMl90IGlwKTsKK2ludCBydHBfc29ja2V0X2Nvbm5lY3Qoc3RydWN0IHJ0cF9zb2NrZXQgKnJzLCB1X2ludDMyX3QgaXAsIHVfaW50MTZfdCBwb3J0KTsKK2ludCBydHBfc29ja2V0X3Byb3h5KHN0cnVjdCBydHBfc29ja2V0ICp0aGlzLCBzdHJ1Y3QgcnRwX3NvY2tldCAqb3RoZXIpOworaW50IHJ0cF9zb2NrZXRfdXBzdHJlYW0oc3RydWN0IHJ0cF9zb2NrZXQgKnRoaXMsIHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCB1X2ludDMyX3QgY2FsbHJlZik7CitpbnQgcnRwX3NvY2tldF9mcmVlKHN0cnVjdCBydHBfc29ja2V0ICpycyk7CitpbnQgcnRwX3NlbmRfZnJhbWUoc3RydWN0IHJ0cF9zb2NrZXQgKnJzLCBzdHJ1Y3QgZ3NtX2RhdGFfZnJhbWUgKmZyYW1lKTsKKworI2VuZGlmIC8qIF9SVFBfUFJPWFlfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc2dzbi5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc2dzbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZTYwOGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zZ3NuLmgKQEAgLTAsMCArMSw1MyBAQAorI2lmbmRlZiBfU0dTTl9ICisjZGVmaW5lIF9TR1NOX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX25zLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX3Nnc24uaD4KKworc3RydWN0IHNnc25fY29uZmlnIHsKKwkvKiBwYXJzZWQgZnJvbSBjb25maWcgZmlsZSAqLworCisJY2hhciAqZ3RwX3N0YXRlZGlyOworCXN0cnVjdCBzb2NrYWRkcl9pbiBndHBfbGlzdGVuYWRkcjsKKworCS8qIG1pc2MgKi8KKwlzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2k7Cit9OworCitzdHJ1Y3Qgc2dzbl9pbnN0YW5jZSB7CisJY2hhciAqY29uZmlnX2ZpbGU7CisJc3RydWN0IHNnc25fY29uZmlnIGNmZzsKKwkvKiBGaWxlIGRlc2NyaXB0b3Igd3JhcHBlcnMgZm9yIExpYkdUUCAqLworCXN0cnVjdCBic2NfZmQgZ3RwX2ZkMDsKKwlzdHJ1Y3QgYnNjX2ZkIGd0cF9mZDFjOworCXN0cnVjdCBic2NfZmQgZ3RwX2ZkMXU7CisJLyogVGltZXIgZm9yIGxpYkdUUCAqLworCXN0cnVjdCB0aW1lcl9saXN0IGd0cF90aW1lcjsKKwkvKiBHU04gaW5zdGFuY2UgZm9yIGxpYmd0cCAqLworCXN0cnVjdCBnc25fdCAqZ3NuOworfTsKKworZXh0ZXJuIHN0cnVjdCBzZ3NuX2luc3RhbmNlICpzZ3NuOworCisvKiBzZ3NuX3Z0eS5jICovCisKK2ludCBzZ3NuX3Z0eV9pbml0KHZvaWQpOworaW50IHNnc25fcGFyc2VfY29uZmlnKGNvbnN0IGNoYXIgKmNvbmZpZ19maWxlLCBzdHJ1Y3Qgc2dzbl9jb25maWcgKmNmZyk7CisKKy8qIHNnc24uYyAqLworCisvKiBNYWluIGlucHV0IGZ1bmN0aW9uIGZvciBHYiBwcm94eSAqLworaW50IHNnc25fcmN2bXNnKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHVpbnQxNl90IG5zX2J2Y2kpOworCisKK3N0cnVjdCBzZ3NuX3BkcF9jdHggKnNnc25fY3JlYXRlX3BkcF9jdHgoc3RydWN0IHNnc25fZ2dzbl9jdHggKmdnc24sCisJCQkJCSBzdHJ1Y3Qgc2dzbl9tbV9jdHggKm1tY3R4LAorCQkJCQkgdWludDE2X3QgbnNhcGksCisJCQkJCSBzdHJ1Y3QgdGx2X3BhcnNlZCAqdHApOworaW50IHNnc25fZGVsZXRlX3BkcF9jdHgoc3RydWN0IHNnc25fcGRwX2N0eCAqcGN0eCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc2lnbmFsLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGY3OTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc2lnbmFsLmgKQEAgLTAsMCArMSwxNjAgQEAKKy8qIEdlbmVyaWMgc2lnbmFsbGluZy9ub3RpZmljYXRpb24gaW5mcmFzdHJ1Y3R1cmUgKi8KKy8qIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBPUEVOQlNDX1NJR05BTF9ICisjZGVmaW5lIE9QRU5CU0NfU0lHTkFMX0gKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9zaWduYWwuaD4KKworLyoKKyAqIFNpZ25hbGxpbmcgc3Vic3lzdGVtcworICovCitlbnVtIHNpZ25hbF9zdWJzeXN0ZW1zIHsKKwlTU19QQUdJTkcsCisJU1NfU01TLAorCVNTX0FCSVNJUCwKKwlTU19OTSwKKwlTU19MQ0hBTiwKKwlTU19TVUJTQ1IsCisJU1NfU0NBTEwsCisJU1NfR0xPQkFMLAorCVNTX0NIQUxMT0MsCisJU1NfTlMsCit9OworCisvKiBTU19QQUdJTkcgc2lnbmFscyAqLworZW51bSBzaWduYWxfcGFnaW5nIHsKKwlTX1BBR0lOR19TVUNDRUVERUQsCisJU19QQUdJTkdfRVhQSVJFRCwKK307CisKKy8qIFNTX1NNUyBzaWduYWxzICovCitlbnVtIHNpZ25hbF9zbXMgeworCVNfU01TX1NVQk1JVFRFRCwJLyogQSBTTVMgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHN1Ym1pdHRlZCB0byB1cyAqLworCVNfU01TX0RFTElWRVJFRCwJLyogQSBTTVMgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGRlbGl2ZXJlZCB0byBhIE1TICovCisJU19TTVNfU01NQSwJCS8qIEEgTVMgdGVsbHMgdXMgaXQgaGFzIG1vcmUgc3BhY2UgYXZhaWxhYmxlICovCisJU19TTVNfTUVNX0VYQ0VFREVELAkvKiBBIE1TIHRlbGxzIHVzIGl0IGhhcyBubyBtb3JlIHNwYWNlIGF2YWlsYWJsZSAqLworfTsKKworLyogU1NfQUJJU0lQIHNpZ25hbHMgKi8KK2VudW0gc2lnbmFsX2FiaXNpcCB7CisJU19BQklTSVBfQ1JDWF9BQ0ssCisJU19BQklTSVBfTURDWF9BQ0ssCisJU19BQklTSVBfRExDWF9JTkQsCit9OworCisvKiBTU19OTSBzaWduYWxzICovCitlbnVtIHNpZ25hbF9ubSB7CisJU19OTV9TV19BQ1RJVl9SRVAsCS8qIEdTTSAxMi4yMSBzb2Z0d2FyZSBhY3RpdmF0ZWQgcmVwb3J0ICovCisJU19OTV9GQUlMX1JFUCwJCS8qIEdTTSAxMi4yMSBmYWlsdXJlIGV2ZW50IHJlcG9ydCAqLworCVNfTk1fTkFDSywJCS8qIEdTTSAxMi4yMSB2YXJpb3VzIE5NX01UXypfTkFDSyBoYXBwZW5lZCAqLworCVNfTk1fSVBBQ0NfTkFDSywJLyogR1NNIDEyLjIxIG5hbm9CVFMgZXh0ZW5zaW9ucyBOTV9NVF9JUEFDQ18qXypfTkFDSyBoYXBwZW5lZCAqLworCVNfTk1fSVBBQ0NfQUNLLAkJLyogR1NNIDEyLjIxIG5hbm9CVFMgZXh0ZW5zaW9ucyBOTV9NVF9JUEFDQ18qXypfQUNLIGhhcHBlbmVkICovCisJU19OTV9JUEFDQ19SRVNUQVJUX0FDSywgLyogbmFub0JUUyBoYXMgc2VuZCBhIHJlc3RhcnQgYWNrICovCisJU19OTV9JUEFDQ19SRVNUQVJUX05BQ0ssLyogbmFub0JUUyBoYXMgc2VuZCBhIHJlc3RhcnQgYWNrICovCisJU19OTV9URVNUX1JFUCwJCS8qIEdTTSAxMi4yMSBUZXN0IFJlcG9ydCAqLworfTsKKworLyogU1NfTENIQU4gc2lnbmFscyAqLworZW51bSBzaWduYWxfbGNoYW4geworCS8qCisJICogVGhlIGxjaGFuIGdvdCBmcmVlZCB3aXRoIGFuIHVzZV9jb3VudCAhPSAwIGFuZCBlcnJvcgorCSAqIHJlY292ZXJ5IG5lZWRzIHRvIGJlIGNhcnJpZWQgb3V0IGZyb20gd2l0aGluIHRoZQorCSAqIHNpZ25hbCBoYW5kbGVyLgorCSAqLworCVNfTENIQU5fVU5FWFBFQ1RFRF9SRUxFQVNFLAorCVNfTENIQU5fQUNUSVZBVEVfQUNLLAkJLyogMDguNTggQ2hhbm5lbCBBY3RpdmF0ZSBBQ0sgKi8KKwlTX0xDSEFOX0FDVElWQVRFX05BQ0ssCQkvKiAwOC41OCBDaGFubmVsIEFjdGl2YXRlIE5BQ0sgKi8KKwlTX0xDSEFOX0hBTkRPVkVSX0NPTVBMLAkJLyogMDQuMDggSGFuZG92ZXIgQ29tcGxldGVkICovCisJU19MQ0hBTl9IQU5ET1ZFUl9GQUlMLAkJLyogMDQuMDggSGFuZG92ZXIgRmFpbGVkICovCisJU19MQ0hBTl9IQU5ET1ZFUl9ERVRFQ1QsCS8qIDA4LjU4IEhhbmRvdmVyIERldGVjdCAqLworCVNfTENIQU5fTUVBU19SRVAsCQkvKiAwOC41OCBNZWFzdXJlbWVudCBSZXBvcnQgKi8KK307CisKKy8qIFNTX0NIQUxMT0Mgc2lnbmFscyAqLworZW51bSBzaWduYWxfY2hhbGxvYyB7CisJU19DSEFMTE9DX0FMTE9DX0ZBSUwsCS8qIGFsbG9jYXRpb24gb2YgbGNoYW4gaGFzIGZhaWxlZCAqLworCVNfQ0hBTExPQ19GUkVFRCwJLyogbGNoYW4gaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGZyZWVkICovCit9OworCisvKiBTU19TVUJTQ1Igc2lnbmFscyAqLworZW51bSBzaWduYWxfc3Vic2NyIHsKKwlTX1NVQlNDUl9BVFRBQ0hFRCwKKwlTX1NVQlNDUl9ERVRBQ0hFRCwKKwlTX1NVQlNDUl9JREVOVElUWSwJCS8qIHdlJ3ZlIHJlY2VpdmVkIHNvbWUgaWRlbnRpdHkgaW5mb3JtYXRpb24gKi8KK307CisKKy8qIFNTX1NDQUxMIHNpZ25hbHMgKi8KK2VudW0gc2lnbmFsX3NjYWxsIHsKKwlTX1NDQUxMX1NVQ0NFU1MsCisJU19TQ0FMTF9FWFBJUkVELAorCVNfU0NBTExfREVUQUNIRUQsCit9OworCitlbnVtIHNpZ25hbF9nbG9iYWwgeworCVNfR0xPQkFMX1NIVVRET1dOLAorfTsKKworc3RydWN0IGdzbV9zdWJzY3JpYmVyOworCitzdHJ1Y3QgcGFnaW5nX3NpZ25hbF9kYXRhIHsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCisJLyogTlVMTCBpbiBjYXNlIHRoZSBwYWdpbmcgZGlkbid0IHdvcmsgKi8KKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKK307CisKK3N0cnVjdCBzY2FsbF9zaWduYWxfZGF0YSB7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisJdm9pZCAqZGF0YTsKK307CisKK3N0cnVjdCBpcGFjY19hY2tfc2lnbmFsX2RhdGEgeworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCXVfaW50OF90IG1zZ190eXBlOwkKK307CisKK3N0cnVjdCBjaGFsbG9jX3NpZ25hbF9kYXRhIHsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCWVudW0gZ3NtX2NoYW5fdCB0eXBlOworfTsKKworZW51bSBzaWduYWxfbnMgeworCVNfTlNfUkVTRVQsCisJU19OU19CTE9DSywKKwlTX05TX1VOQkxPQ0ssCisJU19OU19BTElWRV9FWFAsCS8qIFRucy1hbGl2ZSBleHBpcmVkIG1vcmUgdGhhbiBOIHRpbWVzICovCit9OworCitzdHJ1Y3QgbnNfc2lnbmFsX2RhdGEgeworCXN0cnVjdCBncHJzX25zdmMgKm5zdmM7CisJdWludDhfdCBjYXVzZTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc2lsZW50X2NhbGwuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3NpbGVudF9jYWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVmYzUxOAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3NpbGVudF9jYWxsLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfU0lMRU5UX0NBTExfSAorI2RlZmluZSBfU0lMRU5UX0NBTExfSAorCitleHRlcm4gaW50IGdzbV9zaWxlbnRfY2FsbF9zdGFydChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCB0eXBlKTsKK2V4dGVybiBpbnQgZ3NtX3NpbGVudF9jYWxsX3N0b3Aoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworZXh0ZXJuIGludCBzaWxlbnRfY2FsbF9yeChzdHJ1Y3QgbXNnYiAqbXNnKTsKK2V4dGVybiBpbnQgc2lsZW50X2NhbGxfcmVyb3V0ZShzdHJ1Y3QgbXNnYiAqbXNnKTsKKworI2VuZGlmIC8qIF9TSUxFTlRfQ0FMTF9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zb2NrZXQuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3NvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMzE2MTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zb2NrZXQuaApAQCAtMCwwICsxLDE0IEBACisjaWZuZGVmIF9CU0NfU09DS0VUX0gKKyNkZWZpbmUgX0JTQ19TT0NLRVRfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisKKyNpZm5kZWYgSVBQUk9UT19HUkUKKyNkZWZpbmUgSVBQUk9UT19HUkUgNDcKKyNlbmRpZgorCitpbnQgbWFrZV9zb2NrKHN0cnVjdCBic2NfZmQgKmJmZCwgaW50IHByb3RvLCB1X2ludDMyX3QgaXAsIHVfaW50MTZfdCBwb3J0LAorCSAgICAgIGludCAoKmNiKShzdHJ1Y3QgYnNjX2ZkICpmZCwgdW5zaWduZWQgaW50IHdoYXQpKTsKKworI2VuZGlmIC8qIF9CU0NfU09DS0VUX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3N1YmNoYW5fZGVtdXguaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3N1YmNoYW5fZGVtdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmZhMDIzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc3ViY2hhbl9kZW11eC5oCkBAIC0wLDAgKzEsMTAyIEBACisjaWZuZGVmIF9TVUJDSF9ERU1VWF9ICisjZGVmaW5lIF9TVUJDSF9ERU1VWF9ICisvKiBBIEUxIHN1Yi1jaGFubmVsIChkZSltdWx0aXBsZXhlciB3aXRoIFRSQVUgZnJhbWUgc3luYyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKworI2RlZmluZSBOUl9TVUJDSAk0CisjZGVmaW5lIFRSQVVfRlJBTUVfU0laRQk0MAorI2RlZmluZSBUUkFVX0ZSQU1FX0JJVFMJKFRSQVVfRlJBTUVfU0laRSo4KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBERU1VTFRJUExFWEVSICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBkZW11eF9zdWJjaCB7CisJdV9pbnQ4X3Qgb3V0X2JpdGJ1ZltUUkFVX0ZSQU1FX0JJVFNdOworCXVfaW50MTZfdCBvdXRfaWR4OyAvKiBuZXh0IGJpdCB0byBiZSB3cml0dGVuIGluIG91dF9iaXRidWYgKi8KKwkvKiBudW1iZXIgb2YgY29uc2VjdXRpdmUgemVyb3MgdGhhdCB3ZSBoYXZlIHJlY2VpdmVkIChmb3Igc3luYykgKi8KKwl1bnNpZ25lZCBpbnQgY29uc2VjdXRpdmVfemVyb3M7CisJLyogYXJlIHdlIGluIFRSQVUgZnJhbWUgc3luYyBvciBub3Q/ICovCisJdW5zaWduZWQgaW50IGluX3N5bmM7Cit9OworCitzdHJ1Y3Qgc3ViY2hfZGVtdXggeworCS8qIGJpdG1hc2sgb2YgY3VycmVudGx5IGFjdGl2ZSBzdWJjaGFubmVscyAqLworCXVfaW50OF90IGNoYW5fYWN0aXY7CisJLyogb25lIGRlbXV4X3N1YmNoIHN0cnVjdCBmb3IgZXZlcnkgc3ViY2hhbm5lbCAqLworCXN0cnVjdCBkZW11eF9zdWJjaCBzdWJjaFtOUl9TVUJDSF07CisJLyogY2FsbGJhY2sgdG8gYmUgY2FsbGVkIG9uY2Ugd2UgaGF2ZSByZWNlaXZlZCBhIGNvbXBsZXRlCisJICogZnJhbWUgb24gYSBnaXZlbiBzdWJjaGFubmVsICovCisJaW50ICgqb3V0X2NiKShzdHJ1Y3Qgc3ViY2hfZGVtdXggKmRteCwgaW50IGNoLCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbiwKKwkJICAgICAgdm9pZCAqKTsKKwkvKiB1c2VyLXByb3ZpZGVkIGRhdGEsIHRyYW5zcGFyZW50bHkgcGFzc2VkIHRvIG91dF9jYigpICovCisJdm9pZCAqZGF0YTsKK307CisKKy8qIGluaXRpYWxpemUgb25lIGRlbXVsdGlwbGV4ZXIgaW5zdGFuY2UgKi8KK2ludCBzdWJjaF9kZW11eF9pbml0KHN0cnVjdCBzdWJjaF9kZW11eCAqZG14KTsKKworLyogZmVlZCAnbGVuJyBudW1iZXIgb2YgbXV4ZWQgYnl0ZXMgaW50byB0aGUgZGVtdWx0aXBsZXhlciAqLworaW50IHN1YmNoX2RlbXV4X2luKHN0cnVjdCBzdWJjaF9kZW11eCAqZG14LCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbik7CisKKy8qIGFjdGl2YXRlIGRlY29kaW5nL3Byb2Nlc3NpbmcgZm9yIG9uZSBzdWJjaGFubmVsICovCitpbnQgc3ViY2hfZGVtdXhfYWN0aXZhdGUoc3RydWN0IHN1YmNoX2RlbXV4ICpkbXgsIGludCBzdWJjaCk7CisKKy8qIGRlYWN0aXZhdGUgZGVjb2RpbmcvcHJvY2Vzc2luZyBmb3Igb25lIHN1YmNoYW5uZWwgKi8KK2ludCBzdWJjaF9kZW11eF9kZWFjdGl2YXRlKHN0cnVjdCBzdWJjaF9kZW11eCAqZG14LCBpbnQgc3ViY2gpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNVUxUSVBMRVhFUiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBvbmUgZWxlbWVudCBpbiB0aGUgdHhfcXVldWUgb2YgYSBtdXhlciBzdWItY2hhbm5lbCAqLworc3RydWN0IHN1YmNoX3R4cV9lbnRyeSB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKworCXVuc2lnbmVkIGludCBiaXRfbGVuOwkvKiB0b3RhbCBudW1iZXIgb2YgYml0cyBpbiAnYml0cycgKi8KKwl1bnNpZ25lZCBpbnQgbmV4dF9iaXQ7CS8qIG5leHQgYml0IHRvIGJlIHRyYW5zbWl0dGVkICovCisKKwl1X2ludDhfdCBiaXRzWzBdOwkvKiBvbmUgYml0IHBlciBieXRlICovCit9OworCitzdHJ1Y3QgbXV4X3N1YmNoIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCB0eF9xdWV1ZTsKK307CisKKy8qIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgb25lIGluc3RhbmNlIG9mIHRoZSBzdWJjaGFubmVsIG11eGVyICovCitzdHJ1Y3Qgc3ViY2hfbXV4IHsKKwlzdHJ1Y3QgbXV4X3N1YmNoIHN1YmNoW05SX1NVQkNIXTsKK307CisKKy8qIGluaXRpYWxpemUgYSBzdWJjaGFubmVsIG11eGVyIGluc3RhbmNlICovCitpbnQgc3ViY2hhbl9tdXhfaW5pdChzdHJ1Y3Qgc3ViY2hfbXV4ICpteCk7CisKKy8qIHJlcXVlc3QgdGhlIG91dHB1dCBvZiAnbGVuJyBtdWx0aXBsZXhlZCBieXRlcyAqLworaW50IHN1YmNoYW5fbXV4X291dChzdHJ1Y3Qgc3ViY2hfbXV4ICpteCwgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4pOworCisvKiBlbnF1ZXVlIHNvbWUgZGF0YSBpbnRvIG9uZSBzdWItY2hhbm5lbCBvZiB0aGUgbXV4ZXIgKi8KK2ludCBzdWJjaGFuX211eF9lbnF1ZXVlKHN0cnVjdCBzdWJjaF9tdXggKm14LCBpbnQgc19uciwgY29uc3QgdV9pbnQ4X3QgKmRhdGEsCisJCQlpbnQgbGVuKTsKKworI2VuZGlmIC8qIF9TVUJDSF9ERU1VWF9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zeXN0ZW1faW5mb3JtYXRpb24uaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3N5c3RlbV9pbmZvcm1hdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MmE5YWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zeXN0ZW1faW5mb3JtYXRpb24uaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgX1NZU1RFTV9JTkZPX0gKKyNkZWZpbmUgX1NZU1RFTV9JTkZPX0gKKworaW50IGdzbV9nZW5lcmF0ZV9zaSh1X2ludDhfdCAqb3V0cHV0LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgdHlwZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdHJhbnNhY3Rpb24uaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RyYW5zYWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBhMDA4YgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RyYW5zYWN0aW9uLmgKQEAgLTAsMCArMSw3NiBAQAorI2lmbmRlZiBfVFJBTlNBQ1RfSAorI2RlZmluZSBfVFJBTlNBQ1RfSAorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8xMS5oPgorCisvKiBPbmUgdHJhbnNhY3Rpb24gKi8KK3N0cnVjdCBnc21fdHJhbnMgeworCS8qIEVudHJ5IGluIGxpc3Qgb2YgYWxsIHRyYW5zYWN0aW9ucyAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGVudHJ5OworCisJLyogVGhlIHByb3RvY29sIHdpdGhpbiB3aGljaCB3ZSBsaXZlICovCisJdV9pbnQ4X3QgcHJvdG9jb2w7CisKKwkvKiBUaGUgY3VycmVudCB0cmFuc2FjdGlvbiBJRCAqLworCXVfaW50OF90IHRyYW5zYWN0aW9uX2lkOworCQorCS8qIFRvIHdob20gd2UgYmVsb25nLCB1bmlxdWUgaWRlbnRpZmllciBvZiByZW1vdGUgTU0gZW50aXR5ICovCisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisKKwkvKiBUaGUgYXNzb2NpYXRlZCBjb25uZWN0aW9uIHdlIGFyZSB1c2luZyB0byB0cmFuc21pdCBtZXNzYWdlcyAqLworCXN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uOworCisJLyogcmVmZXJlbmNlIGZyb20gTU5DQyBvciBvdGhlciBhcHBsaWNhdGlvbiAqLworCXVfaW50MzJfdCBjYWxscmVmOworCisJLyogaWYgdHJhZmZpYyBjaGFubmVsIHJlY2VpdmUgd2FzIHJlcXVlc3RlZCAqLworCWludCB0Y2hfcmVjdjsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKworCQkJLyogY3VycmVudCBjYWxsIHN0YXRlICovCisJCQlpbnQgc3RhdGU7CisKKwkJCS8qIGN1cnJlbnQgdGltZXIgYW5kIG1lc3NhZ2UgcXVldWUgKi8KKwkJCWludCBUY3VycmVudDsJCS8qIGN1cnJlbnQgQ0MgdGltZXIgKi8KKwkJCWludCBUMzA4X3NlY29uZDsJLyogdXNlZCB0byBzZW5kIHJlbGVhc2UgYWdhaW4gKi8KKwkJCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCQkJc3RydWN0IGdzbV9tbmNjIG1zZzsJLyogc3RvcmVzIHNldHVwL2Rpc2Nvbm5lY3QvcmVsZWFzZSBtZXNzYWdlICovCisJCX0gY2M7CisJCXN0cnVjdCB7CisJCQl1X2ludDhfdCBsaW5rX2lkOwkvKiBSU0wgTGluayBJRCB0byBiZSB1c2VkIGZvciB0aGlzIHRyYW5zICovCisJCQlpbnQgaXNfbXQ7CS8qIGlzIHRoaXMgYSBNTyAoMCkgb3IgTVQgKDEpIHRyYW5zZmVyICovCisJCQllbnVtIGdzbTQxMV9jcF9zdGF0ZSBjcF9zdGF0ZTsKKwkJCXN0cnVjdCB0aW1lcl9saXN0IGNwX3RpbWVyOworCisJCQllbnVtIGdzbTQxMV9ycF9zdGF0ZSBycF9zdGF0ZTsKKworCQkJc3RydWN0IGdzbV9zbXMgKnNtczsKKwkJfSBzbXM7CisJfTsKK307CisKKworCitzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuc19maW5kX2J5X2lkKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJCSAgIHVfaW50OF90IHByb3RvLCB1X2ludDhfdCB0cmFuc19pZCk7CitzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuc19maW5kX2J5X2NhbGxyZWYoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCXVfaW50MzJfdCBjYWxscmVmKTsKKworc3RydWN0IGdzbV90cmFucyAqdHJhbnNfYWxsb2Moc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkgICAgICB1X2ludDhfdCBwcm90b2NvbCwgdV9pbnQ4X3QgdHJhbnNfaWQsCisJCQkgICAgICB1X2ludDMyX3QgY2FsbHJlZik7Cit2b2lkIHRyYW5zX2ZyZWUoc3RydWN0IGdzbV90cmFucyAqdHJhbnMpOworCitpbnQgdHJhbnNfYXNzaWduX3RyYW5zX2lkKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJICB1X2ludDhfdCBwcm90b2NvbCwgdV9pbnQ4X3QgdGlfZmxhZyk7CisKKy8qIHVwZGF0ZSBhbGwgdHJhbnNhY3Rpb25zIHRvIHVzZSBhIGRpZmZlcmVudCBMQ0hBTiwgZS5nLgorICogYWZ0ZXIgaGFuZG92ZXIgaGFzIHN1Y2NlZWRlZCAqLworaW50IHRyYW5zX2xjaGFuX2NoYW5nZShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubl9vbGQsCisJCSAgICAgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubl9uZXcpOworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90cmF1X2ZyYW1lLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90cmF1X2ZyYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkyM2Q0YQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RyYXVfZnJhbWUuaApAQCAtMCwwICsxLDY1IEBACisjaWZuZGVmIF9UUkFVX0ZSQU1FX0gKKyNkZWZpbmUgX1RSQVVfRlJBTUVfSAorLyogVFJBVSBmcmFtZSBoYW5kbGluZyBhY2NvcmRpbmcgdG8gR1NNIFRTIDA4LjYwICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKiAyMSBmb3IgRlIvRUZSLCAyNSBmb3IgQU1SLCAxNSBmb3IgT00sIDE1IGZvciBkYXRhLCAxMyBmb3IgRS1kYXRhLCAyMSBpZGxlICovCisjZGVmaW5lIE1BWF9DX0JJVFMJMjUKKy8qIDI2MCBmb3IgRlIvRUZSLCAyNTYgZm9yIEFNUiwgMjY0IGZvciBPTSwgMjg4IGZvciBFLWRhdGEgKi8KKyNkZWZpbmUgTUFYX0RfQklUUwkyODgKKy8qIGZvciBhbGwgc3BlZWNoIGZyYW1lcyAqLworI2RlZmluZSBNQVhfVF9CSVRTCTQKKy8qIGZvciBPTSAqLworI2RlZmluZSBNQVhfU19CSVRTCTYKKy8qIGZvciBFLWRhdGEgKi8KKyNkZWZpbmUgTUFYX01fQklUUwkyCisKK3N0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgeworCXVfaW50OF90IGNfYml0c1tNQVhfQ19CSVRTXTsKKwl1X2ludDhfdCBkX2JpdHNbTUFYX0RfQklUU107CisJdV9pbnQ4X3QgdF9iaXRzW01BWF9UX0JJVFNdOworCXVfaW50OF90IHNfYml0c1tNQVhfU19CSVRTXTsKKwl1X2ludDhfdCBtX2JpdHNbTUFYX01fQklUU107Cit9OworCisjZGVmaW5lIFRSQVVfRlRfRlJfVVAJCTB4MDIJLyogMCAwIDAgMSAwIC0gMy41LjEuMS4xICovCisjZGVmaW5lIFRSQVVfRlRfRlJfRE9XTgkJMHgxYwkvKiAxIDEgMSAwIDAgLSAzLjUuMS4xLjEgKi8KKyNkZWZpbmUgVFJBVV9GVF9FRlIJCTB4MWEJLyogMSAxIDAgMSAwIC0gMy41LjEuMS4xICovCisjZGVmaW5lIFRSQVVfRlRfQU1SCQkweDA2CS8qIDAgMCAxIDEgMCAtIDMuNS4xLjIgKi8KKyNkZWZpbmUgVFJBVV9GVF9PTV9VUAkJMHgwNwkvKiAwIDAgMSAwIDEgLSAzLjUuMiAqLworI2RlZmluZSBUUkFVX0ZUX09NX0RPV04JCTB4MWIJLyogMSAxIDAgMSAxIC0gMy41LjIgKi8KKyNkZWZpbmUgVFJBVV9GVF9EQVRBX1VQCQkweDA4CS8qIDAgMSAwIDAgMCAtIDMuNS4zICovCisjZGVmaW5lIFRSQVVfRlRfREFUQV9ET1dOCTB4MTYJLyogMSAwIDEgMSAwIC0gMy41LjMgKi8KKyNkZWZpbmUgVFJBVV9GVF9EMTQ1X1NZTkMJMHgxNAkvKiAxIDAgMSAwIDAgLSAzLjUuMyAqLworI2RlZmluZSBUUkFVX0ZUX0VEQVRBCQkweDFmCS8qIDEgMSAxIDEgMSAtIDMuNS40ICovCisjZGVmaW5lIFRSQVVfRlRfSURMRV9VUAkJMHgxMAkvKiAxIDAgMCAwIDAgLSAzLjUuNSAqLworI2RlZmluZSBUUkFVX0ZUX0lETEVfRE9XTgkweDBlCS8qIDAgMSAxIDEgMCAtIDMuNS41ICovCisKKworaW50IGRlY29kZV90cmF1X2ZyYW1lKHN0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgKmZyLCBjb25zdCB1X2ludDhfdCAqdHJhdV9iaXRzKTsKK2ludCBlbmNvZGVfdHJhdV9mcmFtZSh1X2ludDhfdCAqdHJhdV9iaXRzLCBjb25zdCBzdHJ1Y3QgZGVjb2RlZF90cmF1X2ZyYW1lICpmcik7CitpbnQgdHJhdV9mcmFtZV91cDJkb3duKHN0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgKmZyKTsKK3VfaW50OF90ICp0cmF1X2lkbGVfZnJhbWUodm9pZCk7CisKKworI2VuZGlmIC8qIF9UUkFVX0ZSQU1FX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RyYXVfbXV4LmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90cmF1X211eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZWI3MDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90cmF1X211eC5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qIFNpbXBsZSBUUkFVIGZyYW1lIHJlZmxlY3RvciB0byByb3V0ZSB2b2ljZSBjYWxscyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKy8qIFRoZSAiVFJBVSBtdXggbWFwIiBkZWZpbmVzIHdoaWNoIHBhcnRpY3VsYXIgMTZrYml0IHN1Yi1zbG90IChpbiB3aGljaCBFMQorICogdGltZXNsb3Qgb24gd2hpY2ggRTEgaW50ZXJmYWNlKSBzaG91bGQgYmUgZGlyZWN0bHkgbXV4ZWQgdG8gd2hpY2ggb3RoZXIgCisgKiBzdWItc2xvdC4gIEVudHJpZXMgaW4gdGhlIG11eCBtYXAgYXJlIGFsd2F5cyBiaS1kaXJlY3Rpb25hbC4gCisgKgorICogVGhlIGlkZWEgb2YgYWxsIHRoaXMgaXMgdG8gZGlyZWN0bHkgc3dpdGNoIHZvaWNlIGNoYW5uZWxzIGluIHRoZSBCU0MKKyAqIGZyb20gb25lIHBob25lIHRvIGFub3RoZXIuICBXZSBkbyB0aGlzIHJpZ2h0IG5vdyBzaW5jZSB3ZSBkb24ndCBzdXBwb3J0CisgKiBhbnkgZXh0ZXJuYWwgaW50ZXJmYWNlIGZvciB2b2ljZSBjaGFubmVscywgYW5kIGluIHRoZSBmdXR1cmUgYXMgYW4KKyAqIG9wdGltaXphdGlvbiB0byByb3V0aW5nIHRoZW0gZXh0ZXJuYWxseS4KKyAqLworCisvKiBtYXAgYSBUUkFVIG11eCBtYXAgZW50cnkgKi8KK2ludCB0cmF1X211eF9tYXAoY29uc3Qgc3RydWN0IGdzbV9lMV9zdWJzbG90ICpzcmMsCisJCSBjb25zdCBzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKmRzdCk7CitpbnQgdHJhdV9tdXhfbWFwX2xjaGFuKGNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKnNyYywJCisJCQljb25zdCBzdHJ1Y3QgZ3NtX2xjaGFuICpkc3QpOworCisvKiB1bm1hcCBhIFRSQVUgbXV4IG1hcCBlbnRyeSAqLworaW50IHRyYXVfbXV4X3VubWFwKGNvbnN0IHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqc3MsIHVfaW50MzJfdCBjYWxscmVmKTsKKworLyogd2UgZ2V0IGNhbGxlZCBieSBzdWJjaGFuX2RlbXV4ICovCitpbnQgdHJhdV9tdXhfaW5wdXQoc3RydWN0IGdzbV9lMV9zdWJzbG90ICpzcmNfZTFfc3MsCisJCSAgIGNvbnN0IHVfaW50OF90ICp0cmF1X2JpdHMsIGludCBudW1fYml0cyk7CisKKy8qIGFkZCBhIHRyYXUgcmVjZWl2ZXIgKi8KK2ludCB0cmF1X3JlY3ZfbGNoYW4oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50MzJfdCBjYWxscmVmKTsKKworLyogc2VuZCB0cmF1IGZyb20gYXBwbGljYXRpb24gKi8KK2ludCB0cmF1X3NlbmRfZnJhbWUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHN0cnVjdCBnc21fZGF0YV9mcmFtZSAqZnJhbWUpOwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdXNzZC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdXNzZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZWEzMWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy91c3NkLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfVVNTRF9ICisjZGVmaW5lIF9VU1NEX0gKKworLyogSGFuZGxlciBmdW5jdGlvbiBmb3IgbW9iaWxlLW9yaWdpbmF0ZWQgVVNTRCBtZXNzYWdlcyAqLworCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorCitpbnQgaGFuZGxlX3Jjdl91c3NkKHN0cnVjdCBtc2diICptc2cpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3Z0eS5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdnR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZlN2Q1ZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3Z0eS5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgT1BFTkJTQ19WVFlfSAorI2RlZmluZSBPUEVOQlNDX1ZUWV9ICisKKyNpbmNsdWRlIDxvc21vY29tL3Z0eS92dHkuaD4KKyNpbmNsdWRlIDxvc21vY29tL3Z0eS9idWZmZXIuaD4KKworc3RydWN0IGdzbV9uZXR3b3JrOworc3RydWN0IHZ0eTsKKwordm9pZCBsb2dnaW5nX3Z0eV9hZGRfY21kcyh2b2lkKTsKK3ZvaWQgb3BlbmJzY192dHlfcHJpbnRfc3RhdGlzdGljcyhzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fbmV0d29yayAqKTsKKworc3RydWN0IGJ1ZmZlciAqdnR5X2FyZ3ZfdG9fYnVmZmVyKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10sIGludCBiYXNlKTsKKworZXh0ZXJuIHN0cnVjdCBjbWRfZWxlbWVudCBjZmdfZGVzY3JpcHRpb25fY21kOworZXh0ZXJuIHN0cnVjdCBjbWRfZWxlbWVudCBjZmdfbm9fZGVzY3JpcHRpb25fY21kOworZXh0ZXJuIHN0cnVjdCBjbWRfZWxlbWVudCBvdXJub2RlX2V4aXRfY21kOworZXh0ZXJuIHN0cnVjdCBjbWRfZWxlbWVudCBvdXJub2RlX2VuZF9jbWQ7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL3NjY3AvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL2luY2x1ZGUvc2NjcC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzhhNTE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL3NjY3AvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyIEBACitzY2NwX0hFQURFUlMgPSBzY2NwX3R5cGVzLmggc2NjcC5oCitzY2NwZGlyID0gJChpbmNsdWRlZGlyKS9zY2NwCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvc2NjcC9zY2NwLmggYi9vcGVuYnNjL2luY2x1ZGUvc2NjcC9zY2NwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA0YTJhYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9zY2NwL3NjY3AuaApAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqIFNDQ1AgbWFuYWdlbWVudCBjb2RlCisgKgorICogKEMpIDIwMDksIDIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIFNDQ1BfSAorI2RlZmluZSBTQ0NQX0gKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAic2NjcF90eXBlcy5oIgorCitzdHJ1Y3QgbXNnYjsKK3N0cnVjdCBzY2NwX3N5c3RlbTsKKworZW51bSB7CisJU0NDUF9DT05ORUNUSU9OX1NUQVRFX05PTkUsCisJU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFUVVFU1QsCisJU0NDUF9DT05ORUNUSU9OX1NUQVRFX0NPTkZJUk0sCisJU0NDUF9DT05ORUNUSU9OX1NUQVRFX0VTVEFCTElTSEVELAorCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFLAorCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFX0NPTVBMRVRFLAorCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUZVU0VELAorCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9TRVRVUF9FUlJPUiwKK307CisKK3N0cnVjdCBzb2NrYWRkcl9zY2NwIHsKKwlzYV9mYW1pbHlfdAlzY2NwX2ZhbWlseTsJCS8qIEFGX1NDQ1AgaW4gdGhlIGZ1dHVyZT8/PyAqLworCXVfaW50OF90CXNjY3Bfc3NuOwkJLyogc3Vic3N5c3RlbSBudW1iZXIgZm9yIHJvdXRpbmcgKi8KKworCS8qIFRPRE8gZmlsbCBpbiBhZGRyZXNzIGluZGljYXRvci4uLiBpZiB0aGF0IGlzIGV2ZXIgbmVlZGVkICovCisKKwkvKiBub3Qgc3VyZSBhYm91dCB0aGVzZSAqLworCS8qIHVfaW50OF90ICAgIHNjY3BfY2xhc3M7ICovCit9OworCisvKgorICogcGFyc2VkIHN0cnVjdHVyZSBvZiBhbiBhZGRyZXNzCisgKi8KK3N0cnVjdCBzY2NwX2FkZHJlc3MgeworCXN0cnVjdCBzY2NwX2NhbGxlZF9wYXJ0eV9hZGRyZXNzICAgIGFkZHJlc3M7CisJdV9pbnQ4X3QJCQkgICAgc3NuOworCXVfaW50OF90CQkJICAgIHBvaVsyXTsKK307CisKK3N0cnVjdCBzY2NwX29wdGlvbmFsX2RhdGEgeworCXVfaW50OF90CQkJICAgIGRhdGFfbGVuOworCXVfaW50OF90CQkJICAgIGRhdGFfc3RhcnQ7Cit9OworCitzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uIHsKKwkvKiBwdWJsaWMgKi8KKwl2b2lkICpkYXRhX2N0eDsKKwl2b2lkICgqZGF0YV9jYikoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubiwgc3RydWN0IG1zZ2IgKm1zZywgdW5zaWduZWQgaW50IGxlbik7CisKKwl2b2lkICpzdGF0ZV9jdHg7CisJdm9pZCAoKnN0YXRlX2NiKShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICosIGludCBvbGRfc3RhdGUpOworCisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSBzb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCisJaW50IGNvbm5lY3Rpb25fc3RhdGU7CisKKwkvKiBwcml2YXRlICovCisJLyogbGlzdCBvZiBhY3RpdmUgY29ubmVjdGlvbnMgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBzY2NwX3N5c3RlbSAqc3lzdGVtOworCWludCBpbmNvbWluZzsKK307CisKKy8qKgorICogc3lzdGVtIGZ1bmN0aW9uYWxpdHkgdG8gaW1wbGVtZW50IG9uIHRvcCBvZiBhbnkgb3RoZXIgdHJhbnNwb3J0IGxheWVyOgorICogICBjYWxsIHNjY3Bfc3lzdGVtX2luY29taW5nIGZvciBpbmNvbWluZyBkYXRhIChmcm9tIHRoZSBuZXR3b3JrKQorICogICBzY2NwIHdpbGwgY2FsbCBvdXRnb2luZyB3aGVuZXZlciBvdXRnb2luZyBkYXRhIGV4aXN0cworICovCitpbnQgc2NjcF9zeXN0ZW1faW5pdCh2b2lkICgqb3V0Z29pbmcpKHN0cnVjdCBtc2diICpkYXRhLCB2b2lkICpjdHgpLCB2b2lkICpjb250ZXh0KTsKK2ludCBzY2NwX3N5c3RlbV9pbmNvbWluZyhzdHJ1Y3QgbXNnYiAqZGF0YSk7CisKKy8qKgorICogU2VuZCBkYXRhIG9uIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24KKyAqLworaW50IHNjY3BfY29ubmVjdGlvbl93cml0ZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgbXNnYiAqZGF0YSk7CitpbnQgc2NjcF9jb25uZWN0aW9uX3NlbmRfaXQoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CitpbnQgc2NjcF9jb25uZWN0aW9uX2Nsb3NlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIGludCBjYXVzZSk7CitpbnQgc2NjcF9jb25uZWN0aW9uX2ZyZWUoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CisKKy8qKgorICogaW50ZXJuYWwuLiAKKyAqLworaW50IHNjY3BfY29ubmVjdGlvbl9mb3JjZV9mcmVlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4pOworCisvKioKKyAqIENyZWF0ZSBhIG5ldyBzb2NrZXQuIFNldCB5b3VyIGNhbGxiYWNrcyBhbmQgdGhlbiBjYWxsIGJpbmQgdG8gb3BlbgorICogdGhlIGNvbm5lY3Rpb24uCisgKi8KK3N0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKnNjY3BfY29ubmVjdGlvbl9zb2NrZXQodm9pZCk7CisKKy8qKgorICogT3BlbiB0aGUgY29ubmVjdGlvbiBhbmQgc2VuZCBhZGRpdGlvbmFsIGRhdGEKKyAqLworaW50IHNjY3BfY29ubmVjdGlvbl9jb25uZWN0KHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKnNjY3BfY2FsbGVkLAorCQkJICAgIHN0cnVjdCBtc2diICpkYXRhKTsKKworLyoqCisgKiBtb3N0bHkgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS4gU2V0IHRoZSBhY2NlcHQgY2FsbGJhY2suCisgKiBUT0RPOiBhZGQgdHJ1ZSByb3V0aW5nIGluZm9ybWF0aW9uLi4uIGluIGFuYWxvZ3kgdG8gc29ja2V0LCBiaW5kLCBhY2NlcHQKKyAqLworaW50IHNjY3BfY29ubmVjdGlvbl9zZXRfaW5jb21pbmcoY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKnNvY2ssCisJCQkJIGludCAoKmFjY2VwdF9jYikoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdm9pZCAqZGF0YSksCisJCQkJIHZvaWQgKnVzZXJfZGF0YSk7CisKKy8qKgorICogU2VuZCBkYXRhIGluIHRlcm1zIG9mIHVuaXQgZGF0YS4gQSBmaXhlZCBhZGRyZXNzIGluZGljYXRvciB3aWxsIGJlIHVzZWQuCisgKi8KK2ludCBzY2NwX3dyaXRlKHN0cnVjdCBtc2diICpkYXRhLAorCSAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCAqc29ja19zZW5kZXIsCisJICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICpzb2NrX3RhcmdldCwgaW50IGNsYXNzKTsKK2ludCBzY2NwX3NldF9yZWFkKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICpzb2NrLAorCQkgIGludCAoKnJlYWRfY2IpKHN0cnVjdCBtc2diICptc2diLCB1bnNpZ25lZCBpbnQsIHZvaWQgKnVzZXJfZGF0YSksCisJCSAgdm9pZCAqdXNlcl9kYXRhKTsKKworLyogZ2VuZXJpYyBzb2NrIGFkZHJlc3NlcyAqLworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwIHNjY3Bfc3NuX2Jzc2FwOworCisvKiBoZWxwZXJzICovCit1X2ludDMyX3Qgc2NjcF9zcmNfcmVmX3RvX2ludChzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlICpyZWYpOworc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSBzY2NwX3NyY19yZWZfZnJvbV9pbnQodV9pbnQzMl90KTsKKworLyoqCisgKiBCZWxvdyB0aGlzIGFyZSBoZWxwZXIgZnVuY3Rpb25zIGFuZCBzdHJ1Y3RzIGZvciBwYXJzaW5nIFNDQ1AgbWVzc2FnZXMKKyAqLworc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0IHsKKwlzdHJ1Y3Qgc2NjcF9hZGRyZXNzIGNhbGxlZDsKKwlzdHJ1Y3Qgc2NjcF9hZGRyZXNzIGNhbGxpbmc7CisKKwkvKiBwb2ludCB0byB0aGUgbXNnIHBhY2tldCAqLworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgKnNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSAqZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCisJLyogZGF0YSBwb2ludGVyICovCisJaW50IGRhdGFfbGVuOworfTsKKworLyoKKyAqIGhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBuYXQgY29kZQorICovCitpbnQgc2NjcF9kZXRlcm1pbmVfbXNnX3R5cGUoc3RydWN0IG1zZ2IgKm1zZyk7CitpbnQgc2NjcF9wYXJzZV9oZWFkZXIoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0ICpyZXN1bHQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9zY2NwL3NjY3BfdHlwZXMuaCBiL29wZW5ic2MvaW5jbHVkZS9zY2NwL3NjY3BfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmJkNzBmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL3NjY3Avc2NjcF90eXBlcy5oCkBAIC0wLDAgKzEsNDIwIEBACisvKgorICogSVRVIFEuNzEzIGRlZmluZWQgdHlwZXMgZm9yIFNDQ1AKKyAqCisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgU0NDUF9UWVBFU19ICisjZGVmaW5lIFNDQ1BfVFlQRVNfSAorCisjaW5jbHVkZSA8ZW5kaWFuLmg+CisKKy8qIFRhYmxlIDEvUS43MTMgLSBTQ0NQIG1lc3NhZ2UgdHlwZXMgKi8KK2VudW0gc2NjcF9tZXNzYWdlX3R5cGVzIHsKKwlTQ0NQX01TR19UWVBFX0NSCT0gMSwKKwlTQ0NQX01TR19UWVBFX0NDCT0gMiwKKwlTQ0NQX01TR19UWVBFX0NSRUYJPSAzLAorCVNDQ1BfTVNHX1RZUEVfUkxTRAk9IDQsCisJU0NDUF9NU0dfVFlQRV9STEMJPSA1LAorCVNDQ1BfTVNHX1RZUEVfRFQxCT0gNiwKKwlTQ0NQX01TR19UWVBFX0RUMgk9IDcsCisJU0NDUF9NU0dfVFlQRV9BSwk9IDgsCisJU0NDUF9NU0dfVFlQRV9VRFQJPSA5LAorCVNDQ1BfTVNHX1RZUEVfVURUUwk9IDEwLAorCVNDQ1BfTVNHX1RZUEVfRUQJPSAxMSwKKwlTQ0NQX01TR19UWVBFX0VBCT0gMTIsCisJU0NDUF9NU0dfVFlQRV9SU1IJPSAxMywKKwlTQ0NQX01TR19UWVBFX1JTQwk9IDE0LAorCVNDQ1BfTVNHX1RZUEVfRVJSCT0gMTUsCisJU0NDUF9NU0dfVFlQRV9JVAk9IDE2LAorCVNDQ1BfTVNHX1RZUEVfWFVEVAk9IDE3LAorCVNDQ1BfTVNHX1RZUEVfWFVEVFMJPSAxOCwKKwlTQ0NQX01TR19UWVBFX0xVRFQJPSAxOSwKKwlTQ0NQX01TR19UWVBFX0xVRFRTCT0gMjAKK307CisKKy8qIFRhYmxlIDIvUS43MTMgLSBTQ0NQIHBhcmFtZXRlciBuYW1lIGNvZGVzICovCitlbnVtIHNjY3BfcGFyYW1ldGVyX25hbWVfY29kZXMgeworCVNDQ1BfUE5DX0VORF9PRl9PUFRJT05BTAkJPSAwLAorCVNDQ1BfUE5DX0RFU1RJTkFUSU9OX0xPQ0FMX1JFRkVSRU5DRQk9IDEsCisJU0NDUF9QTkNfU09VUkNFX0xPQ0FMX1JFRkVSRU5DRQkJPSAyLAorCVNDQ1BfUE5DX0NBTExFRF9QQVJUWV9BRERSRVNTCQk9IDMsCisJU0NDUF9QTkNfQ0FMTElOR19QQVJUWV9BRERSRVNTCQk9IDQsCisJU0NDUF9QTkNfUFJPVE9DT0xfQ0xBU1MJCQk9IDUsCisJU0NDUF9QTkNfU0VHTUVOVElORwkJCT0gNiwKKwlTQ0NQX1BOQ19SRUNFSVZFX1NFUV9OVU1CRVIJCT0gNywKKwlTQ0NQX1BOQ19TRVFVRU5DSU5HCQkJPSA4LAorCVNDQ1BfUE5DX0NSRURJVAkJCQk9IDksCisJU0NDUF9QTkNfUkVMRUFTRV9DQVVTRQkJCT0gMTAsCisJU0NDUF9QTkNfUkVUVVJOX0NBVVNFCQkJPSAxMSwKKwlTQ0NQX1BOQ19SRVNFVF9DQVVTRQkJCT0gMTIsCisJU0NDUF9QTkNfRVJST1JfQ0FVU0UJCQk9IDEzLAorCVNDQ1BfUE5DX1JFRlVTQUxfQ0FVU0UJCQk9IDE0LAorCVNDQ1BfUE5DX0RBVEEJCQkJPSAxNSwKKwlTQ0NQX1BOQ19TRUdNRU5UQVRJT04JCQk9IDE2LAorCVNDQ1BfUE5DX0hPUF9DT1VOVEVSCQkJPSAxNywKKwlTQ0NQX1BOQ19JTVBPUlRBTkNFCQkJPSAxOCwKKwlTQ0NQX1BOQ19MT05HX0RBVEEJCQk9IDE5LAorfTsKKworLyogRmlndXJlIDMvUS43MTMgQ2FsbGVkL2NhbGxpbmcgcGFydHkgYWRkcmVzcyAqLworZW51bSB7CisJU0NDUF9USVRMRV9JTkRfTk9ORQkJCT0gMCwKKwlTQ0NQX1RJVExFX0lORF9OQVRVUkVfT05MWQkJPSAxLAorCVNDQ1BfVElUTEVfSU5EX1RSQU5TTEFUSU9OX09OTFkJCT0gMiwKKwlTQ0NQX1RJVExFX0lORF9UUkFOU19OVU1fRU5DCQk9IDMsCisJU0NDUF9USVRMRV9JTkRfVFJBTlNfTlVNX0VOQ19OQVRVUkUJPSA0LAorfTsKKworZW51bSB7CisJU0NDUF9DQUxMX1JPVVRFX09OX1NTTgkJCT0gMSwKKwlTQ0NQX0NBTExfUk9VVEVfT05fR1QJCQk9IDAsCit9OworCitzdHJ1Y3Qgc2NjcF9jYWxsZWRfcGFydHlfYWRkcmVzcyB7CisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorCXVfaW50OF90CXBvaW50X2NvZGVfaW5kaWNhdG9yIDogMSwKKwkJCXNzbl9pbmRpY2F0b3IJICAgICA6IDEsCisJCQlnbG9iYWxfdGl0bGVfaW5kaWNhdG9yIDogNCwKKwkJCXJvdXRpbmdfaW5kaWNhdG9yICAgIDogMSwKKwkJCXJlc2VydmVkCSAgICAgOiAxOworI2VsaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCXVfaW50OF90CXJlc2VydmVkCSAgICAgOiAxLAorCQkJcm91dGluZ19pbmRpY2F0b3IgICAgOiAxLAorCQkJZ2xvYmFsX3RpdGxlX2luZGljYXRvciA6IDQsCisJCQlzc25faW5kaWNhdG9yCSAgICAgOiAxLAorCQkJcG9pbnRfY29kZV9pbmRpY2F0b3IgOiAxOworI2VuZGlmCisJdV9pbnQ4X3QJZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIGluZGljYXRvciBpbmRpY2F0ZXMgcHJlc2VuY2UgaW4gdGhlIGFib3ZlIG9yZGVyICovCisKKy8qIEZpZ3VyZSA2L1EuNzEzICovCitzdHJ1Y3Qgc2NjcF9zaWduYWxsaW5nX3BvaW50X2NvZGUgeworCXVfaW50OF90CWxzYjsKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisJdV9pbnQ4X3QJbXNiIDogNiwKKwkJCXJlc2VydmVkIDogMjsKKyNlbGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwl1X2ludDhfdAlyZXNlcnZlZCA6IDIsCisJCQltc2IgOiA2OworI2VuZGlmCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBTU04gPT0gc3Vic3lzdGVtIG51bWJlciAqLworZW51bSBzY2NwX3N1YnN5c3RlbV9udW1iZXIgeworCVNDQ1BfU1NOX05PVF9LTk9XTl9PUl9VU0VECSAgICA9IDAsCisJU0NDUF9TU05fTUFOQUdFTUVOVAkJICAgID0gMSwKKwlTQ0NQX1NTTl9SRVNFUlZFRF9JVFUJCSAgICA9IDIsCisJU0NDUF9TU05fSVNETl9VU0VSX1BBUlQJCSAgICA9IDMsCisJU0NDUF9TU05fT01BUAkJCSAgICA9IDQsIC8qIG9wZXJhdGlvbiwgbWFpbnQgYW5kIGFkbWluaXN0cmF0aW9uIHBhcnQgKi8KKwlTQ0NQX1NTTl9NQVAJCQkgICAgPSA1LCAvKiBtb2JpbGUgYXBwbGljYXRpb24gcGFydCAqLworCVNDQ1BfU1NOX0hMUgkJCSAgICA9IDYsCisJU0NDUF9TU05fVkxSCQkJICAgID0gNywKKwlTQ0NQX1NTTl9NU0MJCQkgICAgPSA4LAorCVNDQ1BfU1NOX0VJQwkJCSAgICA9IDksIC8qIGVxdWlwZW50IGlkZW50aWZpZXIgY2VudHJlICovCisJU0NDUF9TU05fQVVDCQkJICAgID0gMTAsIC8qIGF1dGhlbnRpY2F0aW9uIGNlbnRyZSAqLworCVNDQ1BfU1NOX0lTRE5fU1VQUExfU0VSVklDRVMJICAgID0gMTEsCisJU0NDUF9TU05fUkVTRVJWRURfSU5UTAkJICAgID0gMTIsCisJU0NDUF9TU05fSVNETl9FREdFX1RPX0VER0UJICAgID0gMTMsCisJU0NDUF9TU05fVENfVEVTVF9SRVNQT05ERVIJICAgID0gMTQsCisKKwkvKiBGcm9tIEdTTSAwMy4wMyA4LjIgKi8KKwlTQ0NQX1NTTl9CU1NBUAkJCSAgICA9IDI1NCwKKwlTQ0NQX1NTTl9CU1NPTQkJCSAgICA9IDI1MywKK307CisKKy8qIFEuNzEzLCAzLjQuMi4zICovCitlbnVtIHsKKwlTQ0NQX05BSV9VTktOT1dOCQkgICAgPSAwLAorCVNDQ1BfTkFJX1NVQlNDUklCRVJfTlVNQkVSCSAgICA9IDEsCisJU0NDUF9OQUlfUkVTRVJWRURfTkFUSU9OQUwJICAgID0gMiwKKwlTQ0NQX05BSV9OQVRJT05BTF9TSUdOSUZJQ0FOVAkgICAgPSAzLAorCVNDQ1BfTkFJX0lOVEVSTkFUSU9OQUwJCSAgICA9IDQsCit9OworCitzdHJ1Y3Qgc2NjcF9nbG9iYWxfdGl0bGUgeworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKwl1X2ludDhfdAluYXR1cmVfb2ZfYWRkcl9pbmQgOiA3LAorCQkJb2RkX2V2ZW4gOiAxOworI2VsaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCXVfaW50OF90CW9kZF9ldmVuIDogMSwKKwkJCW5hdHVyZV9vZl9hZGRyX2luZCA6IDc7CisjZW5kaWYKKwl1X2ludDhfdAlkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogUS43MTMsIDMuMyAqLworc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSB7CisJdV9pbnQ4X3QgICAgb2N0ZXQxOworCXVfaW50OF90ICAgIG9jdGV0MjsKKwl1X2ludDhfdCAgICBvY3RldDM7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBRLjcxNCwgMy42ICovCitlbnVtIHNjY3BfcHJvdG9jb2xfY2xhc3MgeworCVNDQ1BfUFJPVE9DT0xfQ0xBU1NfMAkJICAgID0gMCwKKwlTQ0NQX1BST1RPQ09MX0NMQVNTXzEJCSAgICA9IDEsCisJU0NDUF9QUk9UT0NPTF9DTEFTU18yCQkgICAgPSAyLAorCVNDQ1BfUFJPVE9DT0xfQ0xBU1NfMwkJICAgID0gMywKK307CisKKy8qIGJpdHMgNS04IHdoZW4gY2xhc3MwLCBjbGFzczEgaXMgdXNlZCAqLworZW51bSBzY2NwX3Byb3RvY29sX29wdGlvbnMgeworCVNDQ1BfUFJPVE9DT0xfTk9fU1BFQ0lBTAkgICAgPSAwLAorCVNDQ1BfUFJPVE9DT0xfUkVUVVJOX01FU1NBR0UJICAgID0gOCwKK307CisKK2VudW0gc2NjcF9yZWxlYXNlX2NhdXNlIHsKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfRU5EX1VTRVJfT1JJR0lOQVRFRAkgICAgPSAwLAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9FTkRfVVNFUl9DT05HRVNUSU9OCSAgICA9IDEsCisJU0NDUF9SRUxFQVNFX0NBVVNFX0VORF9VU0VSX0ZBSUxVUkUJICAgID0gMiwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfU0NDUF9VU0VSX09SSUdJTkFURUQJICAgID0gMywKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfUkVNT1RFX1BST0NFRFVSRV9FUlJPUiAgID0gNCwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfSU5DT05TSVNURU5UX0NPTk5fREFUQSAgID0gNSwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfQUNDRVNTX0ZBSUxVUkUJICAgID0gNiwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfQUNDRVNTX0NPTkdFU1RJT04JICAgID0gNywKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfU1VCU1lTVEVNX0ZBSUxVUkUJICAgID0gOCwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfU1VCU1lTVEVNX0NPTkdFU1RJT04JICAgID0gOSwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfTVRQX0ZBSUxVUkUJCSAgICA9IDEwLAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9ORVRXT1JLX0NPTkdFU1RJT04JICAgID0gMTEsCisJU0NDUF9SRUxFQVNFX0NBVVNFX0VYUElSQVRJT05fUkVTRVQJICAgID0gMTIsCisJU0NDUF9SRUxFQVNFX0NBVVNFX0VYUElSQVRJT05fSU5BQ1RJVkUJICAgID0gMTMsCisJU0NDUF9SRUxFQVNFX0NBVVNFX1JFU0VSVkVECQkgICAgPSAxNCwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfVU5RVUFMSUZJRUQJCSAgICA9IDE1LAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9TQ0NQX0ZBSUxVUkUJCSAgICA9IDE2LAorfTsKKworZW51bSBzY2NwX3JldHVybl9jYXVzZSB7CisJU0NDUF9SRVRVUk5fQ0FVU0VfTk9fVFJBTlNMQVRJT05fTkFUVVJFCSAgICA9IDAsCisJU0NDUF9SRVRVUk5fQ0FVU0VfTk9fVFJBTlNMQVRJT04JICAgID0gMSwKKwlTQ0NQX1JFVFVSTl9DQVVTRV9TVUJTWVNURU1fQ09OR0VTVElPTgkgICAgPSAyLAorCVNDQ1BfUkVUVVJOX0NBVVNFX1NVQlNZU1RFTV9GQUlMVVJFCSAgICA9IDMsCisJU0NDUF9SRVRVUk5fQ0FVU0VfVU5FUVVJUFBFRF9VU0VSCSAgICA9IDQsCisJU0NDUF9SRVRVUk5fQ0FVU0VfTVRQX0ZBSUxVUkUJCSAgICA9IDUsCisJU0NDUF9SRVRVUk5fQ0FVU0VfTkVUV09SS19DT05HRVNUSU9OCSAgICA9IDYsCisJU0NDUF9SRVRVUk5fQ0FVU0VfVU5RVUFMSUZJRUQJCSAgICA9IDcsCisJU0NDUF9SRVRVUk5fQ0FVU0VfRVJST1JfSU5fTVNHX1RSQU5TUE9SVCAgICA9IDgsCisJU0NDUF9SRVRVUk5fQ0FVU0VfRVJST1JfSU5fTE9DQUxfUFJPQ0VTU0lORyA9IDksCisJU0NDUF9SRVRVUk5fQ0FVU0VfREVTVF9DQU5OT1RfUEVSRk9STV9SRUFTU0VNQkxZID0gMTAsCisJU0NDUF9SRVRVUk5fQ0FVU0VfU0NDUF9GQUlMVVJFCQkgICAgPSAxMSwKKwlTQ0NQX1JFVFVSTl9DQVVTRV9IT1BfQ09VTlRFUl9WSU9MQVRJT04JICAgID0gMTIsCisJU0NDUF9SRVRVUk5fQ0FVU0VfU0VHTUVOVEFUSU9OX05PVF9TVVBQT1JURUQ9IDEzLAorCVNDQ1BfUkVUVVJOX0NBVVNFX1NFR01FTlRBVElPTl9GQU9MVVJFCSAgICA9IDE0Cit9OworCitlbnVtIHNjY3BfcmVzZXRfY2F1c2UgeworCVNDQ1BfUkVTRVRfQ0FVU0VfRU5EX1VTRVJfT1JJR0lOQVRFRAkgICAgPSAwLAorCVNDQ1BfUkVTRVRfQ0FVU0VfU0NDUF9VU0VSX09SSUdJTkFURUQJICAgID0gMSwKKwlTQ0NQX1JFU0VUX0NBVVNFX01TR19PVVRfT0ZfT1JERVJfUFMJICAgID0gMiwKKwlTQ0NQX1JFU0VUX0NBVVNFX01TR19PVVRfT0ZfT1JERVJfUFIJICAgID0gMywKKwlTQ0NQX1JFU0VUX0NBVVNFX1JQQ19PVVRfT0ZfV0lORE9XCSAgICA9IDQsCisJU0NDUF9SRVNFVF9DQVVTRV9SUENfSU5DT1JSRUNUX1BTCSAgICA9IDUsCisJU0NDUF9SRVNFVF9DQVVTRV9SUENfR0VORVJBTAkJICAgID0gNiwKKwlTQ0NQX1JFU0VUX0NBVVNFX1JFTU9URV9FTkRfVVNFUl9PUEVSQVRJT05BTD0gNywKKwlTQ0NQX1JFU0VUX0NBVVNFX05FVFdPUktfT1BFUkFUSU9OQUwJICAgID0gOCwKKwlTQ0NQX1JFU0VUX0NBVVNFX0FDQ0VTU19PUEVSQVRJT05BTAkgICAgPSA5LAorCVNDQ1BfUkVTRVRfQ0FVU0VfTkVUV09SS19DT05HRVNUSU9OCSAgICA9IDEwLAorCVNDQ1BfUkVTRVRfQ0FVU0VfUkVTRVJWRUQJCSAgICA9IDExLAorfTsKKworZW51bSBzY2NwX2Vycm9yX2NhdXNlIHsKKwlTQ0NQX0VSUk9SX0xSTl9NSVNNQVRDSF9VTkFTU0lHTkVECSAgICA9IDAsIC8qIGxvY2FsIHJlZmVyZW5jZSBudW1iZXIgKi8KKwlTQ0NQX0VSUk9SX0xSTl9NSVNNQVRDSF9JTkNPTlNJU1RFTlQJICAgID0gMSwKKwlTQ0NQX0VSUk9SX1BPSU5UX0NPREVfTUlTTUFUQ0gJCSAgICA9IDIsCisJU0NDUF9FUlJPUl9TRVJWSUNFX0NMQVNTX01JU01BVENICSAgICA9IDMsCisJU0NDUF9FUlJPUl9VTlFVQUxJRklFRAkJCSAgICA9IDQsCit9OworCitlbnVtIHNjY3BfcmVmdXNhbF9jYXVzZSB7CisJU0NDUF9SRUZVU0FMX0VORF9VU0VSX09SSUdJTkFURUQJICAgID0gMCwKKwlTQ0NQX1JFRlVTQUxfRU5EX1VTRVJfQ09OR0VTVElPTgkgICAgPSAxLAorCVNDQ1BfUkVGVVNBTF9FTkRfVVNFUl9GQUlMVVJFCQkgICAgPSAyLAorCVNDQ1BfUkVGVVNBTF9TQ0NQX1VTRVJfT1JJR0lOQVRFRAkgICAgPSAzLAorCVNDQ1BfUkVGVVNBTF9ERVNUSU5BVElPTl9BRERSRVNTX1VLTk9XTgkgICAgPSA0LAorCVNDQ1BfUkVGVVNBTF9ERVNUSU5BVElPTl9JTkFDQ0VTU0lCTEUJICAgID0gNSwKKwlTQ0NQX1JFRlVTQUxfTkVUX1FPU19OT05fVFJBTlNJRU5UCSAgICA9IDYsCisJU0NDUF9SRUZVU0FMX05FVF9RT1NfVFJBTlNJRU5UCQkgICAgPSA3LAorCVNDQ1BfUkVGVVNBTF9BQ0NFU1NfRkFJTFVSRQkJICAgID0gOCwKKwlTQ0NQX1JFRlVTQUxfQUNDRVNTX0NPTkdFU1RJT04JCSAgICA9IDksCisJU0NDUF9SRUZVU0FMX1NVQlNZU1RFTV9GQUlMVVJFCQkgICAgPSAxMCwKKwlTQ0NQX1JFRlVTQUxfU1VCU1lURU1fQ09OR0VTVElPTgkgICAgPSAxMSwKKwlTQ0NQX1JFRlVTQUxfRVhQSVJBVElPTgkJCSAgICA9IDEyLAorCVNDQ1BfUkVGVVNBTF9JTkNPTVBBVElCTEVfVVNFUl9EQVRBCSAgICA9IDEzLAorCVNDQ1BfUkVGVVNBTF9SRVNFUlZFRAkJCSAgICA9IDE0LAorCVNDQ1BfUkVGVVNBTF9VTlFVQUxJRklFRAkJICAgID0gMTUsCisJU0NDUF9SRUZVU0FMX0hPUF9DT1VOVEVSX1ZJT0xBVElPTgkgICAgPSAxNiwKKwlTQ0NQX1JFRlVTQUxfU0NDUF9GQUlMVVJFCQkgICAgPSAxNywKKwlTQ0NQX1JFRlVTQUxfVU5FUVVJUFBFRF9VU0VSCQkgICAgPSAxOCwKK307CisKKy8qCisgKiBtZXNzYWdlcy4uLiBhcyBvZiBRLjcxMyBDaGFwdGVyIDQKKyAqLworc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZXF1ZXN0IHsKKwkvKiBtYW5kYW50b3J5ICovCisJdV9pbnQ4X3QJCQl0eXBlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJc291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKwl1X2ludDhfdAkJCXByb3RvX2NsYXNzOworCisKKwkvKiB2YXJpYWJsZSAqLworCXVfaW50OF90CQkJdmFyaWFibGVfY2FsbGVkOworI2lmIFZBUklBQkxFCisJY2FsbGVkX3BhcnR5X2FkZHJlc3MKKyNlbmRpZgorCisJLyogb3B0aW9uYWwgKi8KKwl1X2ludDhfdAkJCW9wdGlvbmFsX3N0YXJ0OworCisjaWYgT1BUSU9OQUwKKwljcmVkaXQgMworCWNhbGxpbmdwYXJ0eSB2YXIgNC1uCisJZGF0YSAgICAgICAgICAgIDMtMTMwCisJaG9wX2NvdW50ZXIgICAgIDMKKwlpbXBvcnRhbmNlICAgICAgMworCWVuZF9vZl9vcHRpb25hbCAxCisjZW5kaWYKKworCXVfaW50OF90CQkJZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fY29uZmlybSB7CisJLyogbWFuZGFudG9yeSAqLworCXVfaW50OF90CQkJdHlwZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlCWRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlCXNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7CisJdV9pbnQ4X3QJCQlwcm90b19jbGFzczsKKworCS8qIG9wdGlvbmFsICovCisJdV9pbnQ4X3QJCQlvcHRpb25hbF9zdGFydDsKKworCS8qIG9wdGlvbmFsICovCisjaWYgT1BUSU9OQUwKKwljcmVkaXQgMworCWNhbGxlZCBwYXJ0eSA0CisJZGF0YSAgICAgICAgICAgIDMtMTMwCisJaW1wb3J0YW5jZSAgICAgIDMKKwllbmRfb2Zfb3B0aW9uYWwgMQorI2VuZGlmCisKKwl1X2ludDhfdAkJCWRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlZnVzZWQgeworCS8qIG1hbmRhbnRvcnkgKi8KKwl1X2ludDhfdAkJCXR5cGU7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZQlkZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisJdV9pbnQ4X3QJCQljYXVzZTsKKworCS8qIG9wdGlvbmFsICovCisJdV9pbnQ4X3QJCQlvcHRpb25hbF9zdGFydDsKKworCS8qIG9wdGlvbmFsICovCisjaWYgT1BUSU9OQUwKKwljYWxsZWQgcGFydHkgNAorCWRhdGEgICAgICAgICAgICAzLTEzMAorCWltcG9ydGFuY2UgICAgICAzCisJZW5kX29mX29wdGlvbmFsIDEKKyNlbmRpZgorCisJdV9pbnQ4X3QJCQlkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlZCB7CisJLyogbWFuZGFudG9yeSAqLworCXVfaW50OF90CQkJdHlwZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlCWRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlCXNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7CisJdV9pbnQ4X3QJCQlyZWxlYXNlX2NhdXNlOworCisKKwkvKiBvcHRpb25hbCAqLworCXVfaW50OF90CQkJb3B0aW9uYWxfc3RhcnQ7CisKKyNpZiBPUFRJT05BTAorCWRhdGEgICAgICAgICAgICAzLTEzMAorCWltcG9ydGFuY2UgICAgICAzCisJZW5kX29mX29wdGlvbmFsIDEKKyNlbmRpZgorCXVfaW50OF90CQkJZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZSB7CisJdV9pbnQ4X3QJCQl0eXBlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJc291cmNlX2xvY2FsX3JlZmVyZW5jZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzY2NwX2RhdGFfZm9ybTEgeworCS8qIG1hbmRhbnRvcnkgKi8KKwl1X2ludDhfdAkJCXR5cGU7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZQlkZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisJdV9pbnQ4X3QJCQlzZWdtZW50aW5nOworCisJLyogdmFyaWFibGUgKi8KKwl1X2ludDhfdAkJCXZhcmlhYmxlX3N0YXJ0OworCisjaWYgVkFSSUFCTEUKKwlkYXRhIDItMjU2OworI2VuZGlmCisKKwl1X2ludDhfdAkJCWRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKK3N0cnVjdCBzY2NwX2RhdGFfdW5pdGRhdGEgeworCS8qIG1hbmRhbnRvcnkgKi8KKwl1X2ludDhfdAkJCXR5cGU7CisJdV9pbnQ4X3QJCQlwcm90b19jbGFzczsKKworCisJLyogdmFyaWFibGUgKi8KKwl1X2ludDhfdAkJCXZhcmlhYmxlX2NhbGxlZDsKKwl1X2ludDhfdAkJCXZhcmlhYmxlX2NhbGxpbmc7CisJdV9pbnQ4X3QJCQl2YXJpYWJsZV9kYXRhOworCisjaWYgVkFSSUFCTEUKKwljYWxsZWQgcGFydHkgYWRkcmVzcworCWNhbGxpbmcgcGFydHkgYWRkcmVzcworI2VuZGlmCisKKwl1X2ludDhfdAkJCWRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc2NjcF9kYXRhX2l0IHsKKwkvKiBtYW5kYW50b3J5ICovCisJdV9pbnQ4X3QJCQl0eXBlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJc291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKwl1X2ludDhfdAkJCXByb3RvX2NsYXNzOworCisJdV9pbnQ4X3QJCQlzZXF1ZW5jaW5nWzJdOworCXVfaW50OF90CQkJY3JlZGl0OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNjY3BfcHJvdG9fZXJyIHsKKwl1X2ludDhfdAkJCXR5cGU7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZQlkZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisJdV9pbnQ4X3QJCQllcnJvcl9jYXVzZTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9saWJzY2NwLnBjLmluIGIvb3BlbmJzYy9saWJzY2NwLnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYThkNDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2xpYnNjY3AucGMuaW4KQEAgLTAsMCArMSwxMCBAQAorcHJlZml4PUBwcmVmaXhACitleGVjX3ByZWZpeD1AZXhlY19wcmVmaXhACitsaWJkaXI9QGxpYmRpckAKK2luY2x1ZGVkaXI9QGluY2x1ZGVkaXJACisKK05hbWU6IE9wZW5CU0MgU0NDUCBMaWIKK0Rlc2NyaXB0aW9uOiBPcGVuQlNDIFNDQ1AgTGliCitWZXJzaW9uOiBAVkVSU0lPTkAKK0xpYnM6IC1MJHtsaWJkaXJ9IC1sc2NjcAorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0vCmRpZmYgLS1naXQgYS9vcGVuYnNjL29wZW5ic2MucGMuaW4gYi9vcGVuYnNjL29wZW5ic2MucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJhMDdlMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvb3BlbmJzYy5wYy5pbgpAQCAtMCwwICsxLDExIEBACitwcmVmaXg9QHByZWZpeEAKK2V4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKK2xpYmRpcj1AbGliZGlyQAoraW5jbHVkZWRpcj1AaW5jbHVkZWRpckAvCisKK05hbWU6IE9wZW5CU0MKK0Rlc2NyaXB0aW9uOiBPcGVuQlNDIGJhc2Ugc3RhdGlvbiBjb250cm9sbGVyCitSZXF1aXJlczoKK1ZlcnNpb246IEBWRVJTSU9OQAorTGliczogLUwke2xpYmRpcn0gLWxvcGVuYnNjCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL3NyYy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDliZThjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0MyBAQAorSU5DTFVERVMgPSAkKGFsbF9pbmNsdWRlcykgLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUgLUkkKHRvcF9idWlsZGRpcikKK0FNX0NGTEFHUz0tV2FsbCAkKExJQk9TTU9DT1JFX0NGTEFHUykgJChMSUJPU01PVlRZX0NGTEFHUykKK0FNX0xERkxBR1MgPSAkKExJQk9TTU9DT1JFX0xJQlMpCisKKyMgYnVpbGQgY3VycmVudCBkaXJlY3RvcnkgYmVmb3JlIGJ1aWxkaW5nIGdwcnMKK1NVQkRJUlMgPSAuIGlwYWNjZXNzIGdwcnMKKworc2Jpbl9QUk9HUkFNUyA9IGJzY19oYWNrIGJzMTFfY29uZmlnIGlzZG5zeW5jIGJzY19tZ2NwCitub2luc3RfTElCUkFSSUVTID0gbGliYnNjLmEgbGlibXNjLmEgbGlidnR5LmEgbGlic2NjcC5hCisKK2JzY2RpciA9ICQobGliZGlyKQorYnNjX0xJQlJBUklFUyA9IGxpYnNjY3AuYQorCitsaWJic2NfYV9TT1VSQ0VTID0gYWJpc19yc2wuYyBhYmlzX25tLmMgZ3NtX2RhdGEuYyBnc21fMDRfMDhfdXRpbHMuYyBcCisJCWNoYW5fYWxsb2MuYyBkZWJ1Zy5jIHNvY2tldC5jIFwKKwkJZ3NtX3N1YnNjcmliZXJfYmFzZS5jIHN1YmNoYW5fZGVtdXguYyBic2NfcmxsLmMgdHJhbnNhY3Rpb24uYyBcCisJCXRyYXVfZnJhbWUuYyB0cmF1X211eC5jIHBhZ2luZy5jIGUxX2NvbmZpZy5jIGUxX2lucHV0LmMgXAorCQlpbnB1dC9taXNkbi5jIGlucHV0L2lwYWNjZXNzLmMgXAorCQl0YWxsb2NfY3R4LmMgc3lzdGVtX2luZm9ybWF0aW9uLmMgcmVzdF9vY3RldHMuYyBcCisJCXJ0cF9wcm94eS5jIGJ0c19zaWVtZW5zX2JzMTEuYyBidHNfaXBhY2Nlc3NfbmFub2J0cy5jIFwKKwkJYnRzX3Vua25vd24uYyBic2NfdmVyc2lvbi5jIGJzY19hcGkuYyBic2NfdnR5LmMKKworbGlibXNjX2FfU09VUkNFUyA9IGdzbV9zdWJzY3JpYmVyLmMgZGIuYyBcCisJCW1uY2MuYyBnc21fMDRfMDguYyBnc21fMDRfMTEuYyB0cmFuc2FjdGlvbi5jIFwKKwkJdG9rZW5fYXV0aC5jIHJybHAuYyBnc21fMDRfODAuYyB1c3NkLmMgc2lsZW50X2NhbGwuYyBcCisJCWhhbmRvdmVyX2xvZ2ljLmMgaGFuZG92ZXJfZGVjaXNpb24uYyBtZWFzX3JlcC5jCisKK2xpYnZ0eV9hX1NPVVJDRVMgPSBjb21tb25fdnR5LmMKKworbGlic2NjcF9hX1NPVVJDRVMgPSBzY2NwL3NjY3AuYworCitic2NfaGFja19TT1VSQ0VTID0gYnNjX2hhY2suYyBic2NfaW5pdC5jIGJzY192dHkuYyB2dHlfaW50ZXJmYWNlX2xheWVyMy5jCitic2NfaGFja19MREFERCA9IGxpYm1zYy5hIGxpYmJzYy5hIGxpYnZ0eS5hIGxpYm1zYy5hIFwKKwkJLWxkbCAtbGRiaSAkKExJQkNSWVBUKSAkKExJQk9TTU9WVFlfTElCUykKKworYnMxMV9jb25maWdfU09VUkNFUyA9IGJzMTFfY29uZmlnLmMgYWJpc19ubS5jIGdzbV9kYXRhLmMgZGVidWcuYyBcCisJCSAgICAgIHJzMjMyLmMgYnRzX3NpZW1lbnNfYnMxMS5jCisKK2lzZG5zeW5jX1NPVVJDRVMgPSBpc2Ruc3luYy5jCisKK2JzY19tZ2NwX1NPVVJDRVMgPSBtZ2NwL21nY3BfbWFpbi5jIG1nY3AvbWdjcF9wcm90b2NvbC5jIG1nY3AvbWdjcF9uZXR3b3JrLmMgbWdjcC9tZ2NwX3Z0eS5jIFwKKwkJICAgZGVidWcuYworYnNjX21nY3BfTERBREQgPSBsaWJ2dHkuYSAkKExJQk9TTU9WVFlfTElCUykKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2FiaXNfbm0uYyBiL29wZW5ic2Mvc3JjL2FiaXNfbm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTI4NWJkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvYWJpc19ubS5jCkBAIC0wLDAgKzEsMzAxNSBAQAorLyogR1NNIE5ldHdvcmsgTWFuYWdlbWVudCAoT01MKSBtZXNzYWdlcyBvbiB0aGUgQS1iaXMgaW50ZXJmYWNlCisgKiAzR1BQIFRTIDEyLjIxIHZlcnNpb24gOC4wLjAgUmVsZWFzZSAxOTk5IC8gRVRTSSBUUyAxMDAgNjIzIFY4LjAuMCAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGxpYmdlbi5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9taXNkbi5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisKKyNkZWZpbmUgT01fQUxMT0NfU0laRQkJMTAyNAorI2RlZmluZSBPTV9IRUFEUk9PTV9TSVpFCTEyOAorI2RlZmluZSBJUEFDQ19TRUdNRU5UX1NJWkUJMjQ1CisKKy8qIHVuaWRpcmVjdGlvbmFsIG1lc3NhZ2VzIGZyb20gQlRTIHRvIEJTQyAqLworc3RhdGljIGNvbnN0IGVudW0gYWJpc19ubV9tc2d0eXBlIHJlcG9ydHNbXSA9IHsKKwlOTV9NVF9TV19BQ1RJVkFURURfUkVQLAorCU5NX01UX1RFU1RfUkVQLAorCU5NX01UX1NUQVRFQ0hHX0VWRU5UX1JFUCwKKwlOTV9NVF9GQUlMVVJFX0VWRU5UX1JFUCwKK307CisKKy8qIG1lc3NhZ2VzIHdpdGhvdXQgQUNLL05BQ0sgKi8KK3N0YXRpYyBjb25zdCBlbnVtIGFiaXNfbm1fbXNndHlwZSBub19hY2tfbmFja1tdID0geworCU5NX01UX01FQVNfUkVTX1JFUSwKKwlOTV9NVF9TVE9QX01FQVMsCisJTk1fTVRfU1RBUlRfTUVBUywKK307CisKKy8qIE1lc3NhZ2VzIHJlbGF0ZWQgdG8gc29mdHdhcmUgbG9hZCAqLworc3RhdGljIGNvbnN0IGVudW0gYWJpc19ubV9tc2d0eXBlIHN3X2xvYWRfbXNnc1tdID0geworCU5NX01UX0xPQURfSU5JVF9BQ0ssCisJTk1fTVRfTE9BRF9JTklUX05BQ0ssCisJTk1fTVRfTE9BRF9TRUdfQUNLLAorCU5NX01UX0xPQURfQUJPUlQsCisJTk1fTVRfTE9BRF9FTkRfQUNLLAorCU5NX01UX0xPQURfRU5EX05BQ0ssCisJLy9OTV9NVF9TV19BQ1RfUkVRLAorCU5NX01UX0FDVElWQVRFX1NXX0FDSywKKwlOTV9NVF9BQ1RJVkFURV9TV19OQUNLLAorCU5NX01UX1NXX0FDVElWQVRFRF9SRVAsCit9OworCitzdGF0aWMgY29uc3QgZW51bSBhYmlzX25tX21zZ3R5cGUgbmFja3NbXSA9IHsKKwlOTV9NVF9MT0FEX0lOSVRfTkFDSywKKwlOTV9NVF9MT0FEX0VORF9OQUNLLAorCU5NX01UX1NXX0FDVF9SRVFfTkFDSywKKwlOTV9NVF9BQ1RJVkFURV9TV19OQUNLLAorCU5NX01UX0VTVEFCTElTSF9URUlfTkFDSywKKwlOTV9NVF9DT05OX1RFUlJfU0lHTl9OQUNLLAorCU5NX01UX0RJU0NfVEVSUl9TSUdOX05BQ0ssCisJTk1fTVRfQ09OTl9URVJSX1RSQUZfTkFDSywKKwlOTV9NVF9ESVNDX1RFUlJfVFJBRl9OQUNLLAorCU5NX01UX0NPTk5fTURST1BfTElOS19OQUNLLAorCU5NX01UX0RJU0NfTURST1BfTElOS19OQUNLLAorCU5NX01UX1NFVF9CVFNfQVRUUl9OQUNLLAorCU5NX01UX1NFVF9SQURJT19BVFRSX05BQ0ssCisJTk1fTVRfU0VUX0NIQU5fQVRUUl9OQUNLLAorCU5NX01UX1BFUkZfVEVTVF9OQUNLLAorCU5NX01UX1NFTkRfVEVTVF9SRVBfTkFDSywKKwlOTV9NVF9TVE9QX1RFU1RfTkFDSywKKwlOTV9NVF9TVE9QX0VWRU5UX1JFUF9OQUNLLAorCU5NX01UX1JFU1RfRVZFTlRfUkVQX05BQ0ssCisJTk1fTVRfQ0hHX0FETV9TVEFURV9OQUNLLAorCU5NX01UX0NIR19BRE1fU1RBVEVfUkVRX05BQ0ssCisJTk1fTVRfUkVQX09VVFNUX0FMQVJNU19OQUNLLAorCU5NX01UX0NIQU5HRU9WRVJfTkFDSywKKwlOTV9NVF9PUFNUQVJUX05BQ0ssCisJTk1fTVRfUkVJTklUX05BQ0ssCisJTk1fTVRfU0VUX1NJVEVfT1VUX05BQ0ssCisJTk1fTVRfQ0hHX0hXX0NPTkZfTkFDSywKKwlOTV9NVF9HRVRfQVRUUl9OQUNLLAorCU5NX01UX1NFVF9BTEFSTV9USFJFU19OQUNLLAorCU5NX01UX0JTMTFfQkVHSU5fREJfVFhfTkFDSywKKwlOTV9NVF9CUzExX0VORF9EQl9UWF9OQUNLLAorCU5NX01UX0JTMTFfQ1JFQVRFX09CSl9OQUNLLAorCU5NX01UX0JTMTFfREVMRVRFX09CSl9OQUNLLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgbmFja19uYW1lc1tdID0geworCXsgTk1fTVRfTE9BRF9JTklUX05BQ0ssCQkiU09GVFdBUkUgTE9BRCBJTklUIiB9LAorCXsgTk1fTVRfTE9BRF9FTkRfTkFDSywJCSJTT0ZUV0FSRSBMT0FEIEVORCIgfSwKKwl7IE5NX01UX1NXX0FDVF9SRVFfTkFDSywJIlNPRlRXQVJFIEFDVElWQVRFIFJFUVVFU1QiIH0sCisJeyBOTV9NVF9BQ1RJVkFURV9TV19OQUNLLAkiQUNUSVZBVEUgU09GVFdBUkUiIH0sCisJeyBOTV9NVF9FU1RBQkxJU0hfVEVJX05BQ0ssCSJFU1RBQkxJU0ggVEVJIiB9LAorCXsgTk1fTVRfQ09OTl9URVJSX1NJR05fTkFDSywJIkNPTk5FQ1QgVEVSUkVTVFJJQUwgU0lHTkFMTElORyIgfSwKKwl7IE5NX01UX0RJU0NfVEVSUl9TSUdOX05BQ0ssCSJESVNDT05ORUNUIFRFUlJFU1RSSUFMIFNJR05BTExJTkciIH0sCisJeyBOTV9NVF9DT05OX1RFUlJfVFJBRl9OQUNLLAkiQ09OTkVDVCBURVJSRVNUUklBTCBUUkFGRklDIiB9LAorCXsgTk1fTVRfRElTQ19URVJSX1RSQUZfTkFDSywJIkRJU0NPTk5FQ1QgVEVSUkVTVFJJQUwgVFJBRkZJQyIgfSwKKwl7IE5NX01UX0NPTk5fTURST1BfTElOS19OQUNLLAkiQ09OTkVDVCBNVUxUSS1EUk9QIExJTksiIH0sCisJeyBOTV9NVF9ESVNDX01EUk9QX0xJTktfTkFDSywJIkRJU0NPTk5FQ1QgTVVMVEktRFJPUCBMSU5LIiB9LAorCXsgTk1fTVRfU0VUX0JUU19BVFRSX05BQ0ssCSJTRVQgQlRTIEFUVFJJQlVURSIgfSwKKwl7IE5NX01UX1NFVF9SQURJT19BVFRSX05BQ0ssCSJTRVQgUkFESU8gQVRUUklCVVRFIiB9LAorCXsgTk1fTVRfU0VUX0NIQU5fQVRUUl9OQUNLLAkiU0VUIENIQU5ORUwgQVRUUklCVVRFIiB9LAorCXsgTk1fTVRfUEVSRl9URVNUX05BQ0ssCQkiUEVSRk9STSBURVNUIiB9LAorCXsgTk1fTVRfU0VORF9URVNUX1JFUF9OQUNLLAkiU0VORCBURVNUIFJFUE9SVCIgfSwKKwl7IE5NX01UX1NUT1BfVEVTVF9OQUNLLAkJIlNUT1AgVEVTVCIgfSwKKwl7IE5NX01UX1NUT1BfRVZFTlRfUkVQX05BQ0ssCSJTVE9QIEVWRU5UIFJFUE9SVCIgfSwKKwl7IE5NX01UX1JFU1RfRVZFTlRfUkVQX05BQ0ssCSJSRVNFVCBFVkVOVCBSRVBPUlQiIH0sCisJeyBOTV9NVF9DSEdfQURNX1NUQVRFX05BQ0ssCSJDSEFOR0UgQURNSU5JU1RSQVRJVkUgU1RBVEUiIH0sCisJeyBOTV9NVF9DSEdfQURNX1NUQVRFX1JFUV9OQUNLLAorCQkJCSJDSEFOR0UgQURNSU5JU1RSQVRJVkUgU1RBVEUgUkVRVUVTVCIgfSwKKwl7IE5NX01UX1JFUF9PVVRTVF9BTEFSTVNfTkFDSywJIlJFUE9SVCBPVVRTVEFORElORyBBTEFSTVMiIH0sCisJeyBOTV9NVF9DSEFOR0VPVkVSX05BQ0ssCSJDSEFOR0VPVkVSIiB9LAorCXsgTk1fTVRfT1BTVEFSVF9OQUNLLAkJIk9QU1RBUlQiIH0sCisJeyBOTV9NVF9SRUlOSVRfTkFDSywJCSJSRUlOSVQiIH0sCisJeyBOTV9NVF9TRVRfU0lURV9PVVRfTkFDSywJIlNFVCBTSVRFIE9VVFBVVCIgfSwKKwl7IE5NX01UX0NIR19IV19DT05GX05BQ0ssCSJDSEFOR0UgSEFSRFdBUkUgQ09ORklHVVJBVElPTiIgfSwKKwl7IE5NX01UX0dFVF9BVFRSX05BQ0ssCQkiR0VUIEFUVFJJQlVURSIgfSwKKwl7IE5NX01UX1NFVF9BTEFSTV9USFJFU19OQUNLLAkiU0VUIEFMQVJNIFRIUkVTSE9MRCIgfSwKKwl7IE5NX01UX0JTMTFfQkVHSU5fREJfVFhfTkFDSywJIkJTMTEgQkVHSU4gREFUQUJBU0UgVFJBTlNNSVNTSU9OIiB9LAorCXsgTk1fTVRfQlMxMV9FTkRfREJfVFhfTkFDSywJIkJTMTEgRU5EIERBVEFCQVNFIFRSQU5TTUlTU0lPTiIgfSwKKwl7IE5NX01UX0JTMTFfQ1JFQVRFX09CSl9OQUNLLAkiQlMxMSBDUkVBVEUgT0JKRUNUIiB9LAorCXsgTk1fTVRfQlMxMV9ERUxFVEVfT0JKX05BQ0ssCSJCUzExIERFTEVURSBPQkpFQ1QiIH0sCisJeyAwLAkJCQlOVUxMIH0KK307CisKKy8qIENoYXB0ZXIgOS40LjM2ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBuYWNrX2NhdXNlX25hbWVzW10gPSB7CisJLyogR2VuZXJhbCBOYWNrIENhdXNlcyAqLworCXsgTk1fTkFDS19JTkNPUlJfU1RSVUNULAkiSW5jb3JyZWN0IG1lc3NhZ2Ugc3RydWN0dXJlIiB9LAorCXsgTk1fTkFDS19NU0dUWVBFX0lOVkFMLAkiSW52YWxpZCBtZXNzYWdlIHR5cGUgdmFsdWUiIH0sCisJeyBOTV9OQUNLX09CSkNMQVNTX0lOVkFMLAkiSW52YWxpZCBPYmplY3QgY2xhc3MgdmFsdWUiIH0sCisJeyBOTV9OQUNLX09CSkNMQVNTX05PVFNVUFAsCSJPYmplY3QgY2xhc3Mgbm90IHN1cHBvcnRlZCIgfSwKKwl7IE5NX05BQ0tfQlRTTlJfVU5LTiwJCSJCVFMgbm8uIHVua25vd24iIH0sCisJeyBOTV9OQUNLX1RSWE5SX1VOS04sCQkiQmFzZWJhbmQgVHJhbnNjZWl2ZXIgbm8uIHVua25vd24iIH0sCisJeyBOTV9OQUNLX09CSklOU1RfVU5LTiwJCSJPYmplY3QgSW5zdGFuY2UgdW5rbm93biIgfSwKKwl7IE5NX05BQ0tfQVRUUklEX0lOVkFMLAkJIkludmFsaWQgYXR0cmlidXRlIGlkZW50aWZpZXIgdmFsdWUiIH0sCisJeyBOTV9OQUNLX0FUVFJJRF9OT1RTVVBQLAkiQXR0cmlidXRlIGlkZW50aWZpZXIgbm90IHN1cHBvcnRlZCIgfSwKKwl7IE5NX05BQ0tfUEFSQU1fUkFOR0UsCQkiUGFyYW1ldGVyIHZhbHVlIG91dHNpZGUgcGVybWl0dGVkIHJhbmdlIiB9LAorCXsgTk1fTkFDS19BVFRSTElTVF9JTkNPTlNJU1RFTlQsIkluY29uc2lzdGVuY3kgaW4gYXR0cmlidXRlIGxpc3QiIH0sCisJeyBOTV9OQUNLX1NQRUNfSU1QTF9OT1RTVVBQLAkiU3BlY2lmaWVkIGltcGxlbWVudGF0aW9uIG5vdCBzdXBwb3J0ZWQiIH0sCisJeyBOTV9OQUNLX0NBTlRfUEVSRk9STSwJCSJNZXNzYWdlIGNhbm5vdCBiZSBwZXJmb3JtZWQiIH0sCisJLyogU3BlY2lmaWMgTmFjayBDYXVzZXMgKi8KKwl7IE5NX05BQ0tfUkVTX05PVElNUEwsCQkiUmVzb3VyY2Ugbm90IGltcGxlbWVudGVkIiB9LAorCXsgTk1fTkFDS19SRVNfTk9UQVZBSUwsCQkiUmVzb3VyY2Ugbm90IGF2YWlsYWJsZSIgfSwKKwl7IE5NX05BQ0tfRlJFUV9OT1RBVkFJTCwJIkZyZXF1ZW5jeSBub3QgYXZhaWxhYmxlIiB9LAorCXsgTk1fTkFDS19URVNUX05PVFNVUFAsCQkiVGVzdCBub3Qgc3VwcG9ydGVkIiB9LAorCXsgTk1fTkFDS19DQVBBQ0lUWV9SRVNUUiwJIkNhcGFjaXR5IHJlc3RyaWN0aW9ucyIgfSwKKwl7IE5NX05BQ0tfUEhZU0NGR19OT1RQRVJGT1JNLAkiUGh5c2ljYWwgY29uZmlndXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIiB9LAorCXsgTk1fTkFDS19URVNUX05PVElOSVQsCQkiVGVzdCBub3QgaW5pdGlhdGVkIiB9LAorCXsgTk1fTkFDS19QSFlTQ0ZHX05PVFJFU1RPUkUsCSJQaHlzaWNhbCBjb25maWd1cmF0aW9uIGNhbm5vdCBiZSByZXN0b3JlZCIgfSwKKwl7IE5NX05BQ0tfVEVTVF9OT1NVQ0gsCQkiTm8gc3VjaCB0ZXN0IiB9LAorCXsgTk1fTkFDS19URVNUX05PU1RPUCwJCSJUZXN0IGNhbm5vdCBiZSBzdG9wcGVkIiB9LAorCXsgTk1fTkFDS19NU0dJTkNPTlNJU1RfUEhZU0NGRywJIk1lc3NhZ2UgaW5jb25zaXN0ZW50IHdpdGggcGh5c2ljYWwgY29uZmlndXJhdGlvbiIgfSwKKwl7IE5NX05BQ0tfRklMRV9JTkNPTVBMRVRFLAkiQ29tcGxldGUgZmlsZSBub3RyZWNlaXZlZCIgfSwKKwl7IE5NX05BQ0tfRklMRV9OT1RBVkFJTCwJIkZpbGUgbm90IGF2YWlsYWJsZSBhdCBkZXN0aW5hdGlvbiIgfSwKKwl7IE5NX05BQ0tfRklMRV9OT1RBQ1RJVkFURSwJIkZpbGUgY2Fubm90IGJlIGFjdGl2YXRlIiB9LAorCXsgTk1fTkFDS19SRVFfTk9UX0dSQU5ULAkiUmVxdWVzdCBub3QgZ3JhbnRlZCIgfSwKKwl7IE5NX05BQ0tfV0FJVCwJCQkiV2FpdCIgfSwKKwl7IE5NX05BQ0tfTk9USF9SRVBPUlRfRVhJU1QsCSJOb3RoaW5nIHJlcG9ydGFibGUgZXhpc3RpbmciIH0sCisJeyBOTV9OQUNLX01FQVNfTk9UU1VQUCwJCSJNZWFzdXJlbWVudCBub3Qgc3VwcG9ydGVkIiB9LAorCXsgTk1fTkFDS19NRUFTX05PVFNUQVJULAkiTWVhc3VyZW1lbnQgbm90IHN0YXJ0ZWQiIH0sCisJeyAwLAkJCQlOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpuYWNrX2NhdXNlX25hbWUodV9pbnQ4X3QgY2F1c2UpCit7CisJcmV0dXJuIGdldF92YWx1ZV9zdHJpbmcobmFja19jYXVzZV9uYW1lcywgY2F1c2UpOworfQorCisvKiBDaGFwdGVyIDkuNC4xNjogRXZlbnQgVHlwZSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgZXZlbnRfdHlwZV9uYW1lc1tdID0geworCXsgTk1fRVZUX0NPTU1fRkFJTCwJCSJjb21tdW5pY2F0aW9uIGZhaWx1cmUiIH0sCisJeyBOTV9FVlRfUU9TX0ZBSUwsCQkicXVhbGl0eSBvZiBzZXJ2aWNlIGZhaWx1cmUiIH0sCisJeyBOTV9FVlRfUFJPQ19GQUlMLAkJInByb2Nlc3NpbmcgZmFpbHVyZSIgfSwKKwl7IE5NX0VWVF9FUVVJUF9GQUlMLAkJImVxdWlwbWVudCBmYWlsdXJlIiB9LAorCXsgTk1fRVZUX0VOVl9GQUlMLAkJImVudmlyb25tZW50IGZhaWx1cmUiIH0sCisJeyAwLAkJCQlOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpldmVudF90eXBlX25hbWUodV9pbnQ4X3QgY2F1c2UpCit7CisJcmV0dXJuIGdldF92YWx1ZV9zdHJpbmcoZXZlbnRfdHlwZV9uYW1lcywgY2F1c2UpOworfQorCisvKiBDaGFwdGVyIDkuNC42MzogUGVyY2VpdmVkIFNldmVyaXR5ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBzZXZlcml0eV9uYW1lc1tdID0geworCXsgTk1fU0VWRVJfQ0VBU0VELAkJImZhaWx1cmUgY2Vhc2VkIiB9LAorCXsgTk1fU0VWRVJfQ1JJVElDQUwsCQkiY3JpdGljYWwgZmFpbHVyZSIgfSwKKwl7IE5NX1NFVkVSX01BSk9SLAkJIm1ham9yIGZhaWx1cmUiIH0sCisJeyBOTV9TRVZFUl9NSU5PUiwJCSJtaW5vciBmYWlsdXJlIiB9LAorCXsgTk1fU0VWRVJfV0FSTklORywJCSJ3YXJuaW5nIGxldmVsIGZhaWx1cmUiIH0sCisJeyBOTV9TRVZFUl9JTkRFVEVSTUlOQVRFLAkiaW5kZXRlcm1pbmF0ZSBmYWlsdXJlIiB9LAorCXsgMCwJCQkJTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqc2V2ZXJpdHlfbmFtZSh1X2ludDhfdCBjYXVzZSkKK3sKKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhzZXZlcml0eV9uYW1lcywgY2F1c2UpOworfQorCisvKiBBdHRyaWJ1dGVzIHRoYXQgdGhlIEJTQyBjYW4gc2V0LCBub3Qgb25seSBnZXQsIGFjY29yZGluZyB0byBTZWN0aW9uIDkuNCAqLworc3RhdGljIGNvbnN0IGVudW0gYWJpc19ubV9hdHRyIG5tX2F0dF9zZXR0YWJsZVtdID0geworCU5NX0FUVF9BRERfSU5GTywKKwlOTV9BVFRfQUREX1RFWFQsCisJTk1fQVRUX0RFU1QsCisJTk1fQVRUX0VWRU5UX1RZUEUsCisJTk1fQVRUX0ZJTEVfREFUQSwKKwlOTV9BVFRfR0VUX0FSSSwKKwlOTV9BVFRfSFdfQ09ORl9DSEcsCisJTk1fQVRUX0xJU1RfUkVRX0FUVFIsCisJTk1fQVRUX01EUk9QX0xJTkssCisJTk1fQVRUX01EUk9QX05FWFQsCisJTk1fQVRUX05BQ0tfQ0FVU0VTLAorCU5NX0FUVF9PVVRTVF9BTEFSTSwKKwlOTV9BVFRfUEhZU19DT05GLAorCU5NX0FUVF9QUk9CX0NBVVNFLAorCU5NX0FUVF9SQURfU1VCQywKKwlOTV9BVFRfU09VUkNFLAorCU5NX0FUVF9TUEVDX1BST0IsCisJTk1fQVRUX1NUQVJUX1RJTUUsCisJTk1fQVRUX1RFU1RfRFVSLAorCU5NX0FUVF9URVNUX05PLAorCU5NX0FUVF9URVNUX1JFUE9SVCwKKwlOTV9BVFRfV0lORE9XX1NJWkUsCisJTk1fQVRUX1NFVkVSSVRZLAorCU5NX0FUVF9NRUFTX1JFUywKKwlOTV9BVFRfTUVBU19UWVBFLAorfTsKKworY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uIG5tX2F0dF90bHZkZWYgPSB7CisJLmRlZiA9IHsKKwkJW05NX0FUVF9BQklTX0NIQU5ORUxdID0JCXsgVExWX1RZUEVfRklYRUQsIDMgfSwKKwkJW05NX0FUVF9BRERfSU5GT10gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0FERF9URVhUXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfQURNX1NUQVRFXSA9CQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfQVJGQ05fTElTVF09CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfQVVUT05fUkVQT1JUXSA9CQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfQVZBSUxfU1RBVFVTXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfQkNDSF9BUkZDTl0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQlbTk1fQVRUX0JTSUNdID0JCQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfQlRTX0FJUl9USU1FUl0gPQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfQ0NDSF9MX0lfUF0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0NDQ0hfTF9UXSA9CQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfQ0hBTl9DT01CXSA9CQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfQ09OTl9GQUlMX0NSSVRdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0RFU1RdID0JCQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfRVZFTlRfVFlQRV0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0ZJTEVfREFUQV0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0ZJTEVfSURdID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9GSUxFX1ZFUlNJT05dID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9HU01fVElNRV0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQlbTk1fQVRUX0hTTl0gPQkJCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9IV19DT05GSUddID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9IV19ERVNDXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfSU5UQVZFX1BBUkFNXSA9CQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfSU5URVJGX0JPVU5EXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCA2IH0sCisJCVtOTV9BVFRfTElTVF9SRVFfQVRUUl0gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfTUFJT10gPQkJCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9NQU5VRl9TVEFURV0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX01BTlVGX1RIUkVTSF0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX01BTlVGX0lEXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfTUFYX1RBXSA9CQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfTURST1BfTElOS10gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQlbTk1fQVRUX01EUk9QX05FWFRdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJW05NX0FUVF9OQUNLX0NBVVNFU10gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX05ZMV0gPQkJCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9PUEVSX1NUQVRFXSA9CQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfT1ZFUkxfUEVSSU9EXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfUEhZU19DT05GXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfUE9XRVJfQ0xBU1NdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9QT1dFUl9USFJFU0hdID0JCXsgVExWX1RZUEVfRklYRUQsIDMgfSwKKwkJW05NX0FUVF9QUk9CX0NBVVNFXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAzIH0sCisJCVtOTV9BVFRfUkFDSF9CX1RIUkVTSF0gPQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfTERBVkdfU0xPVFNdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJW05NX0FUVF9SQURfU1VCQ10gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX1JGX01BWFBPV1JfUl0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX1NJVEVfSU5QVVRTXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfU0lURV9PVVRQVVRTXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfU09VUkNFXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfU1BFQ19QUk9CXSA9CQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfU1RBUlRfVElNRV0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQlbTk1fQVRUX1QyMDBdID0JCQl7IFRMVl9UWVBFX0ZJWEVELCA3IH0sCisJCVtOTV9BVFRfVEVJXSA9CQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX1RFU1RfRFVSXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCVtOTV9BVFRfVEVTVF9OT10gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX1RFU1RfUkVQT1JUXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfVlNXUl9USFJFU0hdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJW05NX0FUVF9XSU5ET1dfU0laRV0gPSAJCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9UU0NdID0JCQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfU1dfQ09ORklHXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfU0VWRVJJVFldID0gCQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfR0VUX0FSSV0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0hXX0NPTkZfQ0hHXSA9IAkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX09VVFNUX0FMQVJNXSA9CQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfTUVBU19SRVNdID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IGVudW0gYWJpc19ubV9jaGFuX2NvbWIgY2hjb21iNHBjaGFuW10gPSB7CisJW0dTTV9QQ0hBTl9DQ0NIXQk9IE5NX0NIQU5DX21haW5CQ0NILAorCVtHU01fUENIQU5fQ0NDSF9TRENDSDRdCT0gTk1fQ0hBTkNfQkNDSENvbWIsCisJW0dTTV9QQ0hBTl9UQ0hfRl0JPSBOTV9DSEFOQ19UQ0hGdWxsLAorCVtHU01fUENIQU5fVENIX0hdCT0gTk1fQ0hBTkNfVENISGFsZiwKKwlbR1NNX1BDSEFOX1NEQ0NIOF9TQUNDSDhDXSA9IE5NX0NIQU5DX1NEQ0NILAorCVtHU01fUENIQU5fUERDSF0JPSBOTV9DSEFOQ19JUEFDX1BEQ0gsCisJW0dTTV9QQ0hBTl9UQ0hfRl9QRENIXQk9IE5NX0NIQU5DX0lQQUNfVENIRnVsbF9QRENILAorCS8qIEZJWE1FOiBib3VuZHMgY2hlY2sgKi8KK307CisKK2ludCBhYmlzX25tX2NoY29tYjRwY2hhbihlbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIHBjaGFuKQoreworCWlmIChwY2hhbiA8IEFSUkFZX1NJWkUoY2hjb21iNHBjaGFuKSkKKwkJcmV0dXJuIGNoY29tYjRwY2hhbltwY2hhbl07CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworaW50IGFiaXNfbm1fdGx2X3BhcnNlKHN0cnVjdCB0bHZfcGFyc2VkICp0cCwgc3RydWN0IGdzbV9idHMgKmJ0cywgY29uc3QgdV9pbnQ4X3QgKmJ1ZiwgaW50IGxlbikKK3sKKwlpZiAoIWJ0cy0+bW9kZWwpCisJCXJldHVybiAtRUlPOworCXJldHVybiB0bHZfcGFyc2UodHAsICZidHMtPm1vZGVsLT5ubV9hdHRfdGx2ZGVmLCBidWYsIGxlbiwgMCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgaXNfaW5fYXJyKGVudW0gYWJpc19ubV9tc2d0eXBlIG10LCBjb25zdCBlbnVtIGFiaXNfbm1fbXNndHlwZSAqYXJyLCBpbnQgc2l6ZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJaWYgKGFycltpXSA9PSBtdCkKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisjaWYgMAorLyogaXMgdGhpcyBtc2d0eXBlIHRoZSB1c3VhbCBBQ0svTkFDSyB0eXBlID8gKi8KK3N0YXRpYyBpbnQgaXNfYWNrX25hY2soZW51bSBhYmlzX25tX21zZ3R5cGUgbXQpCit7CisJcmV0dXJuICFpc19pbl9hcnIobXQsIG5vX2Fja19uYWNrLCBBUlJBWV9TSVpFKG5vX2Fja19uYWNrKSk7Cit9CisjZW5kaWYKKworLyogaXMgdGhpcyBtc2d0eXBlIGEgcmVwb3J0ID8gKi8KK3N0YXRpYyBpbnQgaXNfcmVwb3J0KGVudW0gYWJpc19ubV9tc2d0eXBlIG10KQoreworCXJldHVybiBpc19pbl9hcnIobXQsIHJlcG9ydHMsIEFSUkFZX1NJWkUocmVwb3J0cykpOworfQorCisjZGVmaW5lIE1UX0FDSyh4KQkoeCsxKQorI2RlZmluZSBNVF9OQUNLKHgpCSh4KzIpCisKK3N0YXRpYyB2b2lkIGZpbGxfb21faGRyKHN0cnVjdCBhYmlzX29tX2hkciAqb2gsIHVfaW50OF90IGxlbikKK3sKKwlvaC0+bWRpc2MgPSBBQklTX09NX01ESVNDX0ZPTTsKKwlvaC0+cGxhY2VtZW50ID0gQUJJU19PTV9QTEFDRU1FTlRfT05MWTsKKwlvaC0+c2VxdWVuY2UgPSAwOworCW9oLT5sZW5ndGggPSBsZW47Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfb21fZm9tX2hkcihzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oLCB1X2ludDhfdCBsZW4sCisJCQkgICAgdV9pbnQ4X3QgbXNnX3R5cGUsIHVfaW50OF90IG9ial9jbGFzcywKKwkJCSAgICB1X2ludDhfdCBidHNfbnIsIHVfaW50OF90IHRyeF9uciwgdV9pbnQ4X3QgdHNfbnIpCit7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oID0KKwkJCShzdHJ1Y3QgYWJpc19vbV9mb21faGRyICopIG9oLT5kYXRhOworCisJZmlsbF9vbV9oZHIob2gsIGxlbitzaXplb2YoKmZvaCkpOworCWZvaC0+bXNnX3R5cGUgPSBtc2dfdHlwZTsKKwlmb2gtPm9ial9jbGFzcyA9IG9ial9jbGFzczsKKwlmb2gtPm9ial9pbnN0LmJ0c19uciA9IGJ0c19ucjsKKwlmb2gtPm9ial9pbnN0LnRyeF9uciA9IHRyeF9ucjsKKwlmb2gtPm9ial9pbnN0LnRzX25yID0gdHNfbnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqbm1fbXNnYl9hbGxvYyh2b2lkKQoreworCXJldHVybiBtc2diX2FsbG9jX2hlYWRyb29tKE9NX0FMTE9DX1NJWkUsIE9NX0hFQURST09NX1NJWkUsCisJCQkJICAgIk9NTCIpOworfQorCisvKiBTZW5kIGEgT01MIE5NIE1lc3NhZ2UgZnJvbSBCU0MgdG8gQlRTICovCitpbnQgYWJpc19ubV9zZW5kbXNnKHN0cnVjdCBnc21fYnRzICpidHMsIHN0cnVjdCBtc2diICptc2cpCit7CisJbXNnLT50cnggPSBidHMtPmMwOworCisJcmV0dXJuIF9hYmlzX25tX3NlbmRtc2cobXNnKTsKK30KKworc3RhdGljIGludCBhYmlzX25tX3Jjdm1zZ19zdyhzdHJ1Y3QgbXNnYiAqbWIpOworCitzdGF0aWMgc3RydWN0IHZhbHVlX3N0cmluZyBvYmpfY2xhc3NfbmFtZXNbXSA9IHsKKwl7IE5NX09DX1NJVEVfTUFOQUdFUiwJIlNJVEUgTUFOQUdFUiIgfSwKKwl7IE5NX09DX0JUUywJCSJCVFMiIH0sCisJeyBOTV9PQ19SQURJT19DQVJSSUVSLAkiUkFESU8gQ0FSUklFUiIgfSwKKwl7IE5NX09DX0JBU0VCX1RSQU5TQywJIkJBU0VCQU5EIFRSQU5TQ0VJVkVSIiB9LAorCXsgTk1fT0NfQ0hBTk5FTCwJIkNIQU5ORUwiIH0sCisJeyBOTV9PQ19CUzExX0FESkMsCSJBREpDIiB9LAorCXsgTk1fT0NfQlMxMV9IQU5ET1ZFUiwJIkhBTkRPVkVSIiB9LAorCXsgTk1fT0NfQlMxMV9QV1JfQ1RSTCwJIlBPV0VSIENPTlRST0wiIH0sCisJeyBOTV9PQ19CUzExX0JUU0UsCSJCVFNFIiB9LAorCXsgTk1fT0NfQlMxMV9SQUNLLAkiUkFDSyIgfSwKKwl7IE5NX09DX0JTMTFfVEVTVCwJIlRFU1QiIH0sCisJeyBOTV9PQ19CUzExX0VOVkFCVFNFLAkiRU5WQUJUU0UiIH0sCisJeyBOTV9PQ19CUzExX0JQT1JULAkiQlBPUlQiIH0sCisJeyBOTV9PQ19HUFJTX05TRSwJIkdQUlMgTlNFIiB9LAorCXsgTk1fT0NfR1BSU19DRUxMLAkiR1BSUyBDRUxMIiB9LAorCXsgTk1fT0NfR1BSU19OU1ZDLAkiR1BSUyBOU1ZDIiB9LAorCXsgTk1fT0NfQlMxMSwJCSJTSUVNRU5TSFciIH0sCisJeyAwLAkJCU5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKm9ial9jbGFzc19uYW1lKHVfaW50OF90IG9jKQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKG9ial9jbGFzc19uYW1lcywgb2MpOworfQorCitjb25zdCBjaGFyICpubV9vcHN0YXRlX25hbWUodV9pbnQ4X3Qgb3MpCit7CisJc3dpdGNoIChvcykgeworCWNhc2UgTk1fT1BTVEFURV9ESVNBQkxFRDoKKwkJcmV0dXJuICJEaXNhYmxlZCI7CisJY2FzZSBOTV9PUFNUQVRFX0VOQUJMRUQ6CisJCXJldHVybiAiRW5hYmxlZCI7CisJY2FzZSBOTV9PUFNUQVRFX05VTEw6CisJCXJldHVybiAiTlVMTCI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJSRlUiOworCX0KK30KKworLyogQ2hhcHRlciA5LjQuNyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgYXZhaWxfbmFtZXNbXSA9IHsKKwl7IDAsIAkiSW4gdGVzdCIgfSwKKwl7IDEsCSJGYWlsZWQiIH0sCisJeyAyLAkiUG93ZXIgb2ZmIiB9LAorCXsgMywJIk9mZiBsaW5lIiB9LAorCS8qIE5vdCB1c2VkICovCisJeyA1LAkiRGVwZW5kZW5jeSIgfSwKKwl7IDYsCSJEZWdyYWRlZCIgfSwKKwl7IDcsCSJOb3QgaW5zdGFsbGVkIiB9LAorCXsgMHhmZiwgIk9LIiB9LAorCXsgMCwJTlVMTCB9Cit9OworCitjb25zdCBjaGFyICpubV9hdmFpbF9uYW1lKHVfaW50OF90IGF2YWlsKQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKGF2YWlsX25hbWVzLCBhdmFpbCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmFsdWVfc3RyaW5nIHRlc3RfbmFtZXNbXSA9IHsKKwkvKiBGSVhNRTogc3RhbmRhcmQgdGVzdCBuYW1lcyAqLworCXsgTk1fSVBBQ0NfVEVTVE5PX0NIQU5fVVNBR0UsICJDaGFubmVsIFVzYWdlIiB9LAorCXsgTk1fSVBBQ0NfVEVTVE5PX0JDQ0hfQ0hBTl9VU0FHRSwgIkJDQ0ggQ2hhbm5lbCBVc2FnZSIgfSwKKwl7IE5NX0lQQUNDX1RFU1ROT19GUkVRX1NZTkMsICJGcmVxdWVuY3kgU3luY2hyb25pemF0aW9uIiB9LAorCXsgTk1fSVBBQ0NfVEVTVE5PX0JDQ0hfSU5GTywgIkJDQ0ggSW5mbyIgfSwKKwl7IE5NX0lQQUNDX1RFU1ROT19UWF9CRUFDT04sICJUcmFuc21pdCBCZWFjb24iIH0sCisJeyBOTV9JUEFDQ19URVNUTk9fU1lTSU5GT19NT05JVE9SLCAiU3lzdGVtIEluZm8gTW9uaXRvciIgfSwKKwl7IE5NX0lQQUNDX1RFU1ROT19CQ0NDSF9NT05JVE9SLCAiQkNDSCBNb25pdG9yIiB9LAorCXsgMCwgTlVMTCB9Cit9OworCitjb25zdCBjaGFyICpubV9hZG1fbmFtZSh1X2ludDhfdCBhZG0pCit7CisJc3dpdGNoIChhZG0pIHsKKwljYXNlIDE6CisJCXJldHVybiAiTG9ja2VkIjsKKwljYXNlIDI6CisJCXJldHVybiAiVW5sb2NrZWQiOworCWNhc2UgMzoKKwkJcmV0dXJuICJTaHV0ZG93biI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICI8bm90IHVzZWQ+IjsKKwl9Cit9CisKK2ludCBubV9pc19ydW5uaW5nKHN0cnVjdCBnc21fbm1fc3RhdGUgKnMpIHsKKwlyZXR1cm4gKHMtPm9wZXJhdGlvbmFsID09IE5NX09QU1RBVEVfRU5BQkxFRCkgJiYgKAorCQkocy0+YXZhaWxhYmlsaXR5ID09IE5NX0FWU1RBVEVfT0spIHx8CisJCShzLT5hdmFpbGFiaWxpdHkgPT0gMHhmZikKKwkpOworfQorCitzdGF0aWMgdm9pZCBkZWJ1Z3BfZm9oKHN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCkKK3sKKwlERUJVR1AoRE5NLCAiT0M9JXMoJTAyeCkgSU5TVD0oJTAyeCwlMDJ4LCUwMngpICIsCisJCW9ial9jbGFzc19uYW1lKGZvaC0+b2JqX2NsYXNzKSwgZm9oLT5vYmpfY2xhc3MsCisJCWZvaC0+b2JqX2luc3QuYnRzX25yLCBmb2gtPm9ial9pbnN0LnRyeF9uciwKKwkJZm9oLT5vYmpfaW5zdC50c19ucik7Cit9CisKKy8qIG9idGFpbiB0aGUgZ3NtX25tX3N0YXRlIGRhdGEgc3RydWN0dXJlIGZvciBhIGdpdmVuIG9iamVjdCBpbnN0YW5jZSAqLworc3RhdGljIHN0cnVjdCBnc21fbm1fc3RhdGUgKgorb2JqY2xhc3Mybm1zdGF0ZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsCisJCSBzdHJ1Y3QgYWJpc19vbV9vYmpfaW5zdCAqb2JqX2luc3QpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisJc3RydWN0IGdzbV9ubV9zdGF0ZSAqbm1fc3RhdGUgPSBOVUxMOworCisJc3dpdGNoIChvYmpfY2xhc3MpIHsKKwljYXNlIE5NX09DX0JUUzoKKwkJbm1fc3RhdGUgPSAmYnRzLT5ubV9zdGF0ZTsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19SQURJT19DQVJSSUVSOgorCQlpZiAob2JqX2luc3QtPnRyeF9uciA+PSBidHMtPm51bV90cngpIHsKKwkJCURFQlVHUEMoRE5NLCAiVFJYICV1IGRvZXMgbm90IGV4aXN0ICIsIG9ial9pbnN0LT50cnhfbnIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgb2JqX2luc3QtPnRyeF9ucik7CisJCW5tX3N0YXRlID0gJnRyeC0+bm1fc3RhdGU7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfQkFTRUJfVFJBTlNDOgorCQlpZiAob2JqX2luc3QtPnRyeF9uciA+PSBidHMtPm51bV90cngpIHsKKwkJCURFQlVHUEMoRE5NLCAiVFJYICV1IGRvZXMgbm90IGV4aXN0ICIsIG9ial9pbnN0LT50cnhfbnIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgb2JqX2luc3QtPnRyeF9ucik7CisJCW5tX3N0YXRlID0gJnRyeC0+YmJfdHJhbnNjLm5tX3N0YXRlOworCQlicmVhazsKKwljYXNlIE5NX09DX0NIQU5ORUw6CisJCWlmIChvYmpfaW5zdC0+dHJ4X25yID49IGJ0cy0+bnVtX3RyeCkgeworCQkJREVCVUdQQyhETk0sICJUUlggJXUgZG9lcyBub3QgZXhpc3QgIiwgb2JqX2luc3QtPnRyeF9ucik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCBvYmpfaW5zdC0+dHJ4X25yKTsKKwkJaWYgKG9ial9pbnN0LT50c19uciA+PSBUUlhfTlJfVFMpCisJCQlyZXR1cm4gTlVMTDsKKwkJbm1fc3RhdGUgPSAmdHJ4LT50c1tvYmpfaW5zdC0+dHNfbnJdLm5tX3N0YXRlOworCQlicmVhazsKKwljYXNlIE5NX09DX1NJVEVfTUFOQUdFUjoKKwkJbm1fc3RhdGUgPSAmYnRzLT5zaXRlX21nci5ubV9zdGF0ZTsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19CUzExOgorCQlzd2l0Y2ggKG9ial9pbnN0LT5idHNfbnIpIHsKKwkJY2FzZSBCUzExX09CSl9DQ0xLOgorCQkJbm1fc3RhdGUgPSAmYnRzLT5iczExLmNjbGsubm1fc3RhdGU7CisJCQlicmVhazsKKwkJY2FzZSBCUzExX09CSl9CQlNJRzoKKwkJCWlmIChvYmpfaW5zdC0+dHNfbnIgPiBidHMtPm51bV90cngpCisJCQkJcmV0dXJuIE5VTEw7CisJCQl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCBvYmpfaW5zdC0+dHJ4X25yKTsKKwkJCW5tX3N0YXRlID0gJnRyeC0+YnMxMS5iYnNpZy5ubV9zdGF0ZTsKKwkJCWJyZWFrOworCQljYXNlIEJTMTFfT0JKX1BBOgorCQkJaWYgKG9ial9pbnN0LT50c19uciA+IGJ0cy0+bnVtX3RyeCkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIG9ial9pbnN0LT50cnhfbnIpOworCQkJbm1fc3RhdGUgPSAmdHJ4LT5iczExLnBhLm5tX3N0YXRlOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCWNhc2UgTk1fT0NfQlMxMV9SQUNLOgorCQlubV9zdGF0ZSA9ICZidHMtPmJzMTEucmFjay5ubV9zdGF0ZTsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19CUzExX0VOVkFCVFNFOgorCQlpZiAob2JqX2luc3QtPnRyeF9uciA+PSBBUlJBWV9TSVpFKGJ0cy0+YnMxMS5lbnZhYnRzZSkpCisJCQlyZXR1cm4gTlVMTDsKKwkJbm1fc3RhdGUgPSAmYnRzLT5iczExLmVudmFidHNlW29ial9pbnN0LT50cnhfbnJdLm5tX3N0YXRlOworCQlicmVhazsKKwljYXNlIE5NX09DX0dQUlNfTlNFOgorCQlubV9zdGF0ZSA9ICZidHMtPmdwcnMubnNlLm5tX3N0YXRlOworCQlicmVhazsKKwljYXNlIE5NX09DX0dQUlNfQ0VMTDoKKwkJbm1fc3RhdGUgPSAmYnRzLT5ncHJzLmNlbGwubm1fc3RhdGU7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfR1BSU19OU1ZDOgorCQlpZiAob2JqX2luc3QtPnRyeF9uciA+PSBBUlJBWV9TSVpFKGJ0cy0+Z3Bycy5uc3ZjKSkKKwkJCXJldHVybiBOVUxMOworCQlubV9zdGF0ZSA9ICZidHMtPmdwcnMubnN2Y1tvYmpfaW5zdC0+dHJ4X25yXS5ubV9zdGF0ZTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBubV9zdGF0ZTsKK30KKworLyogb2J0YWluIHRoZSBpbi1tZW1vcnkgZGF0YSBzdHJ1Y3R1cmUgb2YgYSBnaXZlbiBvYmplY3QgaW5zdGFuY2UgKi8KK3N0YXRpYyB2b2lkICoKK29iamNsYXNzMm9iaihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsCisJICAgICBzdHJ1Y3QgYWJpc19vbV9vYmpfaW5zdCAqb2JqX2luc3QpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisJdm9pZCAqb2JqID0gTlVMTDsKKworCXN3aXRjaCAob2JqX2NsYXNzKSB7CisJY2FzZSBOTV9PQ19CVFM6CisJCW9iaiA9IGJ0czsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19SQURJT19DQVJSSUVSOgorCQlpZiAob2JqX2luc3QtPnRyeF9uciA+PSBidHMtPm51bV90cngpIHsKKwkJCURFQlVHUEMoRE5NLCAiVFJYICV1IGRvZXMgbm90IGV4aXN0ICIsIG9ial9pbnN0LT50cnhfbnIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgb2JqX2luc3QtPnRyeF9ucik7CisJCW9iaiA9IHRyeDsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19CQVNFQl9UUkFOU0M6CisJCWlmIChvYmpfaW5zdC0+dHJ4X25yID49IGJ0cy0+bnVtX3RyeCkgeworCQkJREVCVUdQQyhETk0sICJUUlggJXUgZG9lcyBub3QgZXhpc3QgIiwgb2JqX2luc3QtPnRyeF9ucik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCBvYmpfaW5zdC0+dHJ4X25yKTsKKwkJb2JqID0gJnRyeC0+YmJfdHJhbnNjOworCQlicmVhazsKKwljYXNlIE5NX09DX0NIQU5ORUw6CisJCWlmIChvYmpfaW5zdC0+dHJ4X25yID49IGJ0cy0+bnVtX3RyeCkgeworCQkJREVCVUdQQyhETk0sICJUUlggJXUgZG9lcyBub3QgZXhpc3QgIiwgb2JqX2luc3QtPnRyeF9ucik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCBvYmpfaW5zdC0+dHJ4X25yKTsKKwkJaWYgKG9ial9pbnN0LT50c19uciA+PSBUUlhfTlJfVFMpCisJCQlyZXR1cm4gTlVMTDsKKwkJb2JqID0gJnRyeC0+dHNbb2JqX2luc3QtPnRzX25yXTsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19TSVRFX01BTkFHRVI6CisJCW9iaiA9ICZidHMtPnNpdGVfbWdyOworCQlicmVhazsKKwljYXNlIE5NX09DX0dQUlNfTlNFOgorCQlvYmogPSAmYnRzLT5ncHJzLm5zZTsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19HUFJTX0NFTEw6CisJCW9iaiA9ICZidHMtPmdwcnMuY2VsbDsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19HUFJTX05TVkM6CisJCWlmIChvYmpfaW5zdC0+dHJ4X25yID49IEFSUkFZX1NJWkUoYnRzLT5ncHJzLm5zdmMpKQorCQkJcmV0dXJuIE5VTEw7CisJCW9iaiA9ICZidHMtPmdwcnMubnN2Y1tvYmpfaW5zdC0+dHJ4X25yXTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBvYmo7Cit9CisKKy8qIFVwZGF0ZSB0aGUgYWRtaW5pc3RyYXRpdmUgc3RhdGUgb2YgYSBnaXZlbiBvYmplY3QgaW4gb3VyIGluLW1lbW9yeSBkYXRhCisgKiBzdHJ1Y3R1cmVzIGFuZCBzZW5kIGFuIGV2ZW50IHRvIHRoZSBoaWdoZXIgbGF5ZXIgKi8KK3N0YXRpYyBpbnQgdXBkYXRlX2FkbXN0YXRlKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywKKwkJCSAgIHN0cnVjdCBhYmlzX29tX29ial9pbnN0ICpvYmpfaW5zdCwgdV9pbnQ4X3QgYWRtX3N0YXRlKQoreworCXN0cnVjdCBnc21fbm1fc3RhdGUgKm5tX3N0YXRlLCBuZXdfc3RhdGU7CisJdm9pZCAqb2JqOworCWludCByYzsKKworCW9iaiA9IG9iamNsYXNzMm9iaihidHMsIG9ial9jbGFzcywgb2JqX2luc3QpOworCWlmICghb2JqKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlubV9zdGF0ZSA9IG9iamNsYXNzMm5tc3RhdGUoYnRzLCBvYmpfY2xhc3MsIG9ial9pbnN0KTsKKwlpZiAoIW5tX3N0YXRlKQorCQlyZXR1cm4gLTE7CisKKwluZXdfc3RhdGUgPSAqbm1fc3RhdGU7CisJbmV3X3N0YXRlLmFkbWluaXN0cmF0aXZlID0gYWRtX3N0YXRlOworCisJcmMgPSBubV9zdGF0ZV9ldmVudChFVlRfU1RBVEVDSEdfQURNLCBvYmpfY2xhc3MsIG9iaiwgbm1fc3RhdGUsICZuZXdfc3RhdGUsIG9ial9pbnN0KTsKKworCW5tX3N0YXRlLT5hZG1pbmlzdHJhdGl2ZSA9IGFkbV9zdGF0ZTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBhYmlzX25tX3J4X3N0YXRlY2hnX3JlcChzdHJ1Y3QgbXNnYiAqbWIpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaCA9IG1zZ2JfbDIobWIpOworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCA9IG1zZ2JfbDMobWIpOworCXN0cnVjdCBnc21fYnRzICpidHMgPSBtYi0+dHJ4LT5idHM7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJc3RydWN0IGdzbV9ubV9zdGF0ZSAqbm1fc3RhdGUsIG5ld19zdGF0ZTsKKwlpbnQgcmM7CisKKwlERUJVR1BDKEROTSwgIlNUQVRFIENIRzogIik7CisKKwltZW1zZXQoJm5ld19zdGF0ZSwgMCwgc2l6ZW9mKG5ld19zdGF0ZSkpOworCisJbm1fc3RhdGUgPSBvYmpjbGFzczJubXN0YXRlKGJ0cywgZm9oLT5vYmpfY2xhc3MsICZmb2gtPm9ial9pbnN0KTsKKwlpZiAoIW5tX3N0YXRlKSB7CisJCURFQlVHUEMoRE5NLCAidW5rbm93biBvYmplY3QgY2xhc3NcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwluZXdfc3RhdGUgPSAqbm1fc3RhdGU7CisJCisJYWJpc19ubV90bHZfcGFyc2UoJnRwLCBidHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfT1BFUl9TVEFURSkpIHsKKwkJbmV3X3N0YXRlLm9wZXJhdGlvbmFsID0gKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX09QRVJfU1RBVEUpOworCQlERUJVR1BDKEROTSwgIk9QX1NUQVRFPSVzICIsIG5tX29wc3RhdGVfbmFtZShuZXdfc3RhdGUub3BlcmF0aW9uYWwpKTsKKwl9CisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9BVkFJTF9TVEFUVVMpKSB7CisJCWlmIChUTFZQX0xFTigmdHAsIE5NX0FUVF9BVkFJTF9TVEFUVVMpID09IDApCisJCQluZXdfc3RhdGUuYXZhaWxhYmlsaXR5ID0gMHhmZjsKKwkJZWxzZQorCQkJbmV3X3N0YXRlLmF2YWlsYWJpbGl0eSA9ICpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9BVkFJTF9TVEFUVVMpOworCQlERUJVR1BDKEROTSwgIkFWQUlMPSVzKCUwMngpICIsIG5tX2F2YWlsX25hbWUobmV3X3N0YXRlLmF2YWlsYWJpbGl0eSksCisJCQluZXdfc3RhdGUuYXZhaWxhYmlsaXR5KTsKKwl9IGVsc2UKKwkJbmV3X3N0YXRlLmF2YWlsYWJpbGl0eSA9IDB4ZmY7CisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9BRE1fU1RBVEUpKSB7CisJCW5ld19zdGF0ZS5hZG1pbmlzdHJhdGl2ZSA9ICpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9BRE1fU1RBVEUpOworCQlERUJVR1BDKEROTSwgIkFETT0lMnMgIiwgbm1fYWRtX25hbWUobmV3X3N0YXRlLmFkbWluaXN0cmF0aXZlKSk7CisJfQorCURFQlVHUEMoRE5NLCAiXG4iKTsKKworCWlmICgobmV3X3N0YXRlLmFkbWluaXN0cmF0aXZlICE9IDAgJiYgbm1fc3RhdGUtPmFkbWluaXN0cmF0aXZlID09IDApIHx8CisJICAgIG5ld19zdGF0ZS5vcGVyYXRpb25hbCAhPSBubV9zdGF0ZS0+b3BlcmF0aW9uYWwgfHwKKwkgICAgbmV3X3N0YXRlLmF2YWlsYWJpbGl0eSAhPSBubV9zdGF0ZS0+YXZhaWxhYmlsaXR5KSB7CisJCS8qIFVwZGF0ZSB0aGUgb3BlcmF0aW9uYWwgc3RhdGUgb2YgYSBnaXZlbiBvYmplY3QgaW4gb3VyIGluLW1lbW9yeSBkYXRhCisgCQkqIHN0cnVjdHVyZXMgYW5kIHNlbmQgYW4gZXZlbnQgdG8gdGhlIGhpZ2hlciBsYXllciAqLworCQl2b2lkICpvYmogPSBvYmpjbGFzczJvYmooYnRzLCBmb2gtPm9ial9jbGFzcywgJmZvaC0+b2JqX2luc3QpOworCQlyYyA9IG5tX3N0YXRlX2V2ZW50KEVWVF9TVEFURUNIR19PUEVSLCBmb2gtPm9ial9jbGFzcywgb2JqLCBubV9zdGF0ZSwgJm5ld19zdGF0ZSwgJmZvaC0+b2JqX2luc3QpOworCQlubV9zdGF0ZS0+b3BlcmF0aW9uYWwgPSBuZXdfc3RhdGUub3BlcmF0aW9uYWw7CisJCW5tX3N0YXRlLT5hdmFpbGFiaWxpdHkgPSBuZXdfc3RhdGUuYXZhaWxhYmlsaXR5OworCQlpZiAobm1fc3RhdGUtPmFkbWluaXN0cmF0aXZlID09IDApCisJCQlubV9zdGF0ZS0+YWRtaW5pc3RyYXRpdmUgPSBuZXdfc3RhdGUuYWRtaW5pc3RyYXRpdmU7CisJfQorI2lmIDAKKwlpZiAob3Bfc3RhdGUgPT0gMSkgeworCQkvKiB0cnkgdG8gZW5hYmxlIG9iamVjdHMgdGhhdCBhcmUgZGlzYWJsZWQgKi8KKwkJYWJpc19ubV9vcHN0YXJ0KGJ0cywgZm9oLT5vYmpfY2xhc3MsCisJCQkJZm9oLT5vYmpfaW5zdC5idHNfbnIsCisJCQkJZm9oLT5vYmpfaW5zdC50cnhfbnIsCisJCQkJZm9oLT5vYmpfaW5zdC50c19ucik7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnhfZmFpbF9ldnRfcmVwKHN0cnVjdCBtc2diICptYikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oID0gbXNnYl9sMihtYik7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oID0gbXNnYl9sMyhtYik7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisKKwlERUJVR1BDKEROTSwgIkZhaWx1cmUgRXZlbnQgUmVwb3J0ICIpOworCQorCWFiaXNfbm1fdGx2X3BhcnNlKCZ0cCwgbWItPnRyeC0+YnRzLCBmb2gtPmRhdGEsIG9oLT5sZW5ndGgtc2l6ZW9mKCpmb2gpKTsKKworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfRVZFTlRfVFlQRSkpCisJCURFQlVHUEMoRE5NLCAiVHlwZT0lcyAiLCBldmVudF90eXBlX25hbWUoKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX0VWRU5UX1RZUEUpKSk7CisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9TRVZFUklUWSkpCisJCURFQlVHUEMoRE5NLCAiU2V2ZXJpdHk9JXMgIiwgc2V2ZXJpdHlfbmFtZSgqVExWUF9WQUwoJnRwLCBOTV9BVFRfU0VWRVJJVFkpKSk7CisKKwlERUJVR1BDKEROTSwgIlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYmlzX25tX3Jjdm1zZ19yZXBvcnQoc3RydWN0IG1zZ2IgKm1iKQoreworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCA9IG1zZ2JfbDMobWIpOworCXVfaW50OF90IG10ID0gZm9oLT5tc2dfdHlwZTsKKworCWRlYnVncF9mb2goZm9oKTsKKworCS8vbm1oLT5jZmctPnJlcG9ydF9jYihtYiwgZm9oKTsKKworCXN3aXRjaCAobXQpIHsKKwljYXNlIE5NX01UX1NUQVRFQ0hHX0VWRU5UX1JFUDoKKwkJcmV0dXJuIGFiaXNfbm1fcnhfc3RhdGVjaGdfcmVwKG1iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9TV19BQ1RJVkFURURfUkVQOgorCQlERUJVR1BDKEROTSwgIlNvZnR3YXJlIEFjdGl2YXRlZCBSZXBvcnRcbiIpOworCQlkaXNwYXRjaF9zaWduYWwoU1NfTk0sIFNfTk1fU1dfQUNUSVZfUkVQLCBtYik7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfRkFJTFVSRV9FVkVOVF9SRVA6CisJCXJ4X2ZhaWxfZXZ0X3JlcChtYik7CisJCWRpc3BhdGNoX3NpZ25hbChTU19OTSwgU19OTV9GQUlMX1JFUCwgbWIpOworCQlicmVhazsKKwljYXNlIE5NX01UX1RFU1RfUkVQOgorCQlERUJVR1BDKEROTSwgIlRlc3QgUmVwb3J0XG4iKTsKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX05NLCBTX05NX1RFU1RfUkVQLCBtYik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUEMoRE5NLCAicmVwb3J0aW5nIE5NIE1UIDB4JTAyeFxuIiwgbXQpOworCQlicmVhazsKKwkJCisJfTsKKworCXJldHVybiAwOworfQorCisvKiBBY3RpdmF0ZSB0aGUgc3BlY2lmaWVkIHNvZnR3YXJlIGludG8gdGhlIEJUUyAqLworc3RhdGljIGludCBpcGFjY19zd19hY3RpdmF0ZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsIHVfaW50OF90IGkwLCB1X2ludDhfdCBpMSwKKwkJCSAgICAgdV9pbnQ4X3QgaTIsIGNvbnN0IHVfaW50OF90ICpzd19kZXNjLCB1X2ludDhfdCBzd2Rlc2NfbGVuKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCBsZW4gPSBzd2Rlc2NfbGVuOworCXVfaW50OF90ICp0cmFpbGVyOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgbGVuLCBOTV9NVF9BQ1RJVkFURV9TVywgb2JqX2NsYXNzLCBpMCwgaTEsIGkyKTsKKworCXRyYWlsZXIgPSBtc2diX3B1dChtc2csIHN3ZGVzY19sZW4pOworCW1lbWNweSh0cmFpbGVyLCBzd19kZXNjLCBzd2Rlc2NfbGVuKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitzdGF0aWMgaW50IGFiaXNfbm1fcGFyc2Vfc3dfZGVzY3IoY29uc3QgdV9pbnQ4X3QgKnN3X2Rlc2NyLCBpbnQgc3dfZGVzY3JfbGVuKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgdGx2X2RlZmluaXRpb24gc3dfZGVzY3JfZGVmID0geworCQkuZGVmID0geworCQkJW05NX0FUVF9GSUxFX0lEXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCB9LAorCQkJW05NX0FUVF9GSUxFX1ZFUlNJT05dID0JCXsgVExWX1RZUEVfVEwxNlYsIH0sCisJCX0sCisJfTsKKworCXVfaW50OF90IHRhZzsKKwl1X2ludDE2X3QgdGFnX2xlbjsKKwljb25zdCB1X2ludDhfdCAqdmFsOworCWludCBvZnMgPSAwLCBsZW47CisKKwkvKiBDbGFzc2ljIFRMViBwYXJzaW5nIGRvZXNuJ3Qgd29yayB3ZWxsIHdpdGggU1dfREVTQ1IgYmVjYXVzZSBvZiBpdCdzCisJICogbmVzdGVkIG5hdHVyZSBhbmQgdGhlIGZhY3QgeW91IGhhdmUgdG8gYXNzdW1lIGl0IGNvbnRhaW5zIG9ubHkgdHdvIHN1YgorCSAqIHRhZ3MgTk1fQVRUX0ZJTEVfVkVSU0lPTiAmIE5NX0FUVF9GSUxFX0lEIHRvIHBhcnNlIGl0ICovCisKKwlpZiAoc3dfZGVzY3JbMF0gIT0gTk1fQVRUX1NXX0RFU0NSKSB7CisJCURFQlVHUChETk0sICJTV19ERVNDUiBhdHRyaWJ1dGUgaWRlbnRpZmllciBub3QgZm91bmQhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlvZnMgKz0gMTsKKworCWxlbiA9IHRsdl9wYXJzZV9vbmUoJnRhZywgJnRhZ19sZW4sICZ2YWwsCisJCSZzd19kZXNjcl9kZWYsICZzd19kZXNjcltvZnNdLCBzd19kZXNjcl9sZW4tb2ZzKTsKKwlpZiAobGVuIDwgMCB8fCAodGFnICE9IE5NX0FUVF9GSUxFX0lEKSkgeworCQlERUJVR1AoRE5NLCAiRklMRV9JRCBhdHRyaWJ1dGUgaWRlbnRpZmllciBub3QgZm91bmQhXG4iKTsKKwkJcmV0dXJuIC0yOworCX0KKwlvZnMgKz0gbGVuOworCisJbGVuID0gdGx2X3BhcnNlX29uZSgmdGFnLCAmdGFnX2xlbiwgJnZhbCwKKwkJJnN3X2Rlc2NyX2RlZiwgJnN3X2Rlc2NyW29mc10sIHN3X2Rlc2NyX2xlbi1vZnMpOworCWlmIChsZW4gPCAwIHx8ICh0YWcgIT0gTk1fQVRUX0ZJTEVfVkVSU0lPTikpIHsKKwkJREVCVUdQKEROTSwgIkZJTEVfVkVSU0lPTiBhdHRyaWJ1dGUgaWRlbnRpZmllciBub3QgZm91bmQhXG4iKTsKKwkJcmV0dXJuIC0zOworCX0KKwlvZnMgKz0gbGVuOworCisJcmV0dXJuIG9mczsKK30KKworc3RhdGljIGludCBhYmlzX25tX3J4X3N3X2FjdF9yZXEoc3RydWN0IG1zZ2IgKm1iKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2ggPSBtc2diX2wyKG1iKTsKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2ggPSBtc2diX2wzKG1iKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwljb25zdCB1X2ludDhfdCAqc3dfY29uZmlnOworCWludCByZXQsIHN3X2NvbmZpZ19sZW4sIHN3X2Rlc2NyX2xlbjsKKworCWRlYnVncF9mb2goZm9oKTsKKworCURFQlVHUEMoRE5NLCAiU1cgQWN0aXZhdGUgUmVxdWVzdDogIik7CisKKwlERUJVR1AoRE5NLCAiU29mdHdhcmUgQWN0aXZhdGUgUmVxdWVzdCwgQUNLaW5nIGFuZCBBY3RpdmF0aW5nXG4iKTsKKworCXJldCA9IGFiaXNfbm1fc3dfYWN0X3JlcV9hY2sobWItPnRyeC0+YnRzLCBmb2gtPm9ial9jbGFzcywKKwkJCQkgICAgICBmb2gtPm9ial9pbnN0LmJ0c19uciwKKwkJCQkgICAgICBmb2gtPm9ial9pbnN0LnRyeF9uciwKKwkJCQkgICAgICBmb2gtPm9ial9pbnN0LnRzX25yLCAwLAorCQkJCSAgICAgIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCisJYWJpc19ubV90bHZfcGFyc2UoJnRwLCBtYi0+dHJ4LT5idHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCXN3X2NvbmZpZyA9IFRMVlBfVkFMKCZ0cCwgTk1fQVRUX1NXX0NPTkZJRyk7CisJc3dfY29uZmlnX2xlbiA9IFRMVlBfTEVOKCZ0cCwgTk1fQVRUX1NXX0NPTkZJRyk7CisJaWYgKCFUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfU1dfQ09ORklHKSkgeworCQlERUJVR1AoRE5NLCAiU1cgY29uZmlnIG5vdCBmb3VuZCEgQ2FuJ3QgY29udGludWUuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJREVCVUdQKEROTSwgIkZvdW5kIFNXIGNvbmZpZzogJXNcbiIsIGhleGR1bXAoc3dfY29uZmlnLCBzd19jb25maWdfbGVuKSk7CisJfQorCisJCS8qIFVzZSB0aGUgZmlyc3QgU1dfREVTQ1IgcHJlc2VudCBpbiBTVyBjb25maWcgKi8KKwlzd19kZXNjcl9sZW4gPSBhYmlzX25tX3BhcnNlX3N3X2Rlc2NyKHN3X2NvbmZpZywgc3dfY29uZmlnX2xlbik7CisJaWYgKHN3X2Rlc2NyX2xlbiA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGlwYWNjX3N3X2FjdGl2YXRlKG1iLT50cngtPmJ0cywgZm9oLT5vYmpfY2xhc3MsCisJCQkJIGZvaC0+b2JqX2luc3QuYnRzX25yLAorCQkJCSBmb2gtPm9ial9pbnN0LnRyeF9uciwKKwkJCQkgZm9oLT5vYmpfaW5zdC50c19uciwKKwkJCQkgc3dfY29uZmlnLCBzd19kZXNjcl9sZW4pOworfQorCisvKiBSZWNlaXZlIGEgQ0hBTkdFX0FETV9TVEFURV9BQ0ssIHBhcnNlIHRoZSBUTFYgYW5kIHVwZGF0ZSBsb2NhbCBzdGF0ZSAqLworc3RhdGljIGludCBhYmlzX25tX3J4X2NoZ19hZG1fc3RhdGVfYWNrKHN0cnVjdCBtc2diICptYikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oID0gbXNnYl9sMihtYik7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oID0gbXNnYl9sMyhtYik7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJdV9pbnQ4X3QgYWRtX3N0YXRlOworCisJYWJpc19ubV90bHZfcGFyc2UoJnRwLCBtYi0+dHJ4LT5idHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCWlmICghVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX0FETV9TVEFURSkpCisJCXJldHVybiAtRUlOVkFMOworCisJYWRtX3N0YXRlID0gKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX0FETV9TVEFURSk7CisKKwlyZXR1cm4gdXBkYXRlX2FkbXN0YXRlKG1iLT50cngtPmJ0cywgZm9oLT5vYmpfY2xhc3MsICZmb2gtPm9ial9pbnN0LCBhZG1fc3RhdGUpOworfQorCitzdGF0aWMgaW50IGFiaXNfbm1fcnhfbG10X2V2ZW50KHN0cnVjdCBtc2diICptYikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oID0gbXNnYl9sMihtYik7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oID0gbXNnYl9sMyhtYik7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisKKwlERUJVR1AoRE5NLCAiTE1UIEV2ZW50ICIpOworCWFiaXNfbm1fdGx2X3BhcnNlKCZ0cCwgbWItPnRyeC0+YnRzLCBmb2gtPmRhdGEsIG9oLT5sZW5ndGgtc2l6ZW9mKCpmb2gpKTsKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX0JTMTFfTE1UX0xPR09OX1NFU1NJT04pICYmCisJICAgIFRMVlBfTEVOKCZ0cCwgTk1fQVRUX0JTMTFfTE1UX0xPR09OX1NFU1NJT04pID49IDEpIHsKKwkJdV9pbnQ4X3Qgb25vZmYgPSAqVExWUF9WQUwoJnRwLCBOTV9BVFRfQlMxMV9MTVRfTE9HT05fU0VTU0lPTik7CisJCURFQlVHUEMoRE5NLCAiTE9HJXMgIiwgb25vZmYgPyAiT04iIDogIk9GRiIpOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFVikgJiYKKwkgICAgVExWUF9MRU4oJnRwLCBOTV9BVFRfQlMxMV9MTVRfVVNFUl9BQ0NfTEVWKSA+PSAxKSB7CisJCXVfaW50OF90IGxldmVsID0gKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFVik7CisJCURFQlVHUEMoRE5NLCAiTGV2ZWw9JXUgIiwgbGV2ZWwpOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX0JTMTFfTE1UX1VTRVJfTkFNRSkgJiYKKwkgICAgVExWUF9MRU4oJnRwLCBOTV9BVFRfQlMxMV9MTVRfVVNFUl9OQU1FKSA+PSAxKSB7CisJCWNoYXIgKm5hbWUgPSAoY2hhciAqKSBUTFZQX1ZBTCgmdHAsIE5NX0FUVF9CUzExX0xNVF9VU0VSX05BTUUpOworCQlERUJVR1BDKEROTSwgIlVzZXJuYW1lPSVzICIsIG5hbWUpOworCX0KKwlERUJVR1BDKEROTSwgIlxuIik7CisJLyogRklYTUU6IHBhcnNlIExNVCBMT0dPTiBUSU1FICovCisJcmV0dXJuIDA7Cit9CisKKy8qIFJlY2VpdmUgYSBPTUwgTk0gTWVzc2FnZSBmcm9tIEJUUyAqLworc3RhdGljIGludCBhYmlzX25tX3Jjdm1zZ19mb20oc3RydWN0IG1zZ2IgKm1iKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2ggPSBtc2diX2wyKG1iKTsKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2ggPSBtc2diX2wzKG1iKTsKKwl1X2ludDhfdCBtdCA9IGZvaC0+bXNnX3R5cGU7CisKKwkvKiBjaGVjayBmb3IgdW5zb2xpY2l0ZWQgbWVzc2FnZSAqLworCWlmIChpc19yZXBvcnQobXQpKQorCQlyZXR1cm4gYWJpc19ubV9yY3Ztc2dfcmVwb3J0KG1iKTsKKworCWlmIChpc19pbl9hcnIobXQsIHN3X2xvYWRfbXNncywgQVJSQVlfU0laRShzd19sb2FkX21zZ3MpKSkKKwkJcmV0dXJuIGFiaXNfbm1fcmN2bXNnX3N3KG1iKTsKKworCWlmIChpc19pbl9hcnIobXQsIG5hY2tzLCBBUlJBWV9TSVpFKG5hY2tzKSkpIHsKKwkJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisKKwkJZGVidWdwX2ZvaChmb2gpOworCisJCURFQlVHUEMoRE5NLCAiJXMgTkFDSyAiLCBnZXRfdmFsdWVfc3RyaW5nKG5hY2tfbmFtZXMsIG10KSk7CisKKwkJYWJpc19ubV90bHZfcGFyc2UoJnRwLCBtYi0+dHJ4LT5idHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCQlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkKKwkJCURFQlVHUEMoRE5NLCAiQ0FVU0U9JXNcbiIsCisJCQkJbmFja19jYXVzZV9uYW1lKCpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9OQUNLX0NBVVNFUykpKTsKKwkJZWxzZQorCQkJREVCVUdQQyhETk0sICJcbiIpOworCisJCWRpc3BhdGNoX3NpZ25hbChTU19OTSwgU19OTV9OQUNLLCAodm9pZCopICZtdCk7CisJCXJldHVybiAwOworCX0KKyNpZiAwCisJLyogY2hlY2sgaWYgbGFzdCBtZXNzYWdlIGlzIHRvIGJlIGFja2VkICovCisJaWYgKGlzX2Fja19uYWNrKG5taC0+bGFzdF9tc2d0eXBlKSkgeworCQlpZiAobXQgPT0gTVRfQUNLKG5taC0+bGFzdF9tc2d0eXBlKSkgeworCQkJREVCVUdQKEROTSwgInJlY2VpdmVkIEFDSyAoMHgleClcbiIsIGZvaC0+bXNnX3R5cGUpOworCQkJLyogd2UgZ290IG91ciBBQ0ssIGNvbnRpbnVlIHNlbmRpbmcgdGhlIG5leHQgbXNnICovCisJCX0gZWxzZSBpZiAobXQgPT0gTVRfTkFDSyhubWgtPmxhc3RfbXNndHlwZSkpIHsKKwkJCS8qIHdlIGdvdCBhIE5BQ0ssIHNpZ25hbCB0aGlzIHRvIHRoZSBjYWxsZXIgKi8KKwkJCURFQlVHUChETk0sICJyZWNlaXZlZCBOQUNLICgweCV4KVxuIiwgZm9oLT5tc2dfdHlwZSk7CisJCQkvKiBGSVhNRTogc29tZWhvdyBzaWduYWwgdGhpcyB0byB0aGUgY2FsbGVyICovCisJCX0gZWxzZSB7CisJCQkvKiByZWFsbHkgc3RyYW5nZSB0aGluZ3MgaGFwcGVuICovCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKyNlbmRpZgorCisJc3dpdGNoIChtdCkgeworCWNhc2UgTk1fTVRfQ0hHX0FETV9TVEFURV9BQ0s6CisJCXJldHVybiBhYmlzX25tX3J4X2NoZ19hZG1fc3RhdGVfYWNrKG1iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9TV19BQ1RfUkVROgorCQlyZXR1cm4gYWJpc19ubV9yeF9zd19hY3RfcmVxKG1iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9CUzExX0xNVF9TRVNTSU9OOgorCQlyZXR1cm4gYWJpc19ubV9yeF9sbXRfZXZlbnQobWIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0NPTk5fTURST1BfTElOS19BQ0s6CisJCURFQlVHUChETk0sICJDT05OIE1EUk9QIExJTksgQUNLXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19SRVNUQVJUX0FDSzoKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX05NLCBTX05NX0lQQUNDX1JFU1RBUlRfQUNLLCBOVUxMKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19SRVNUQVJUX05BQ0s6CisJCWRpc3BhdGNoX3NpZ25hbChTU19OTSwgU19OTV9JUEFDQ19SRVNUQVJUX05BQ0ssIE5VTEwpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYmlzX25tX3J4X2lwYWNjKHN0cnVjdCBtc2diICptYik7CisKK3N0YXRpYyBpbnQgYWJpc19ubV9yY3Ztc2dfbWFudWYoc3RydWN0IG1zZ2IgKm1iKQoreworCWludCByYzsKKwlpbnQgYnRzX3R5cGUgPSBtYi0+dHJ4LT5idHMtPnR5cGU7CisKKwlzd2l0Y2ggKGJ0c190eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfTkFOT0JUUzoKKwkJcmMgPSBhYmlzX25tX3J4X2lwYWNjKG1iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJkb24ndCBrbm93IGhvdyB0byBwYXJzZSBPTUwgZm9yIHRoaXMgIgorCQkgICAgICJCVFMgdHlwZSAoJXUpXG4iLCBidHNfdHlwZSk7CisJCXJjID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKiBIaWdoLUxldmVsIEFQSSAqLworLyogRW50cnktcG9pbnQgd2hlcmUgTDIgT01MIGZyb20gQlRTIGVudGVycyB0aGUgTk0gY29kZSAqLworaW50IGFiaXNfbm1fcmN2bXNnKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaCA9IG1zZ2JfbDIobXNnKTsKKwlpbnQgcmMgPSAwOworCisJLyogVmFyaW91cyBjb25zaXN0ZW5jeSBjaGVja3MgKi8KKwlpZiAob2gtPnBsYWNlbWVudCAhPSBBQklTX09NX1BMQUNFTUVOVF9PTkxZKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiQUJJUyBPTUwgcGxhY2VtZW50IDB4JXggbm90IHN1cHBvcnRlZFxuIiwKKwkJCW9oLT5wbGFjZW1lbnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKG9oLT5zZXF1ZW5jZSAhPSAwKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiQUJJUyBPTUwgc2VxdWVuY2UgMHgleCAhPSAweDAwXG4iLAorCQkJb2gtPnNlcXVlbmNlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorI2lmIDAKKwl1bnNpZ25lZCBpbnQgbDJfbGVuID0gbXNnLT50YWlsIC0gKHVfaW50OF90ICopbXNnYl9sMihtc2cpOworCXVuc2lnbmVkIGludCBobGVuID0gc2l6ZW9mKCpvaCkgKyBzaXplb2Yoc3RydWN0IGFiaXNfb21fZm9tX2hkcik7CisJaWYgKG9oLT5sZW5ndGggKyBobGVuID4gbDJfbGVuKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiQUJJUyBPTUwgdHJ1bmNhdGVkIG1lc3NhZ2UgKCV1ID4gJXUpXG4iLAorCQkJb2gtPmxlbmd0aCArIHNpemVvZigqb2gpLCBsMl9sZW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKG9oLT5sZW5ndGggKyBobGVuIDwgbDJfbGVuKQorCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIkFCSVMgT01MIG1lc3NhZ2Ugd2l0aCBleHRyYSB0cmFpbGVyPyE/IChvaC0+bGVuPSVkLCBzaXplb2Zfb2g9JWQgbDJfbGVuPSVkXG4iLCBvaC0+bGVuZ3RoLCBzaXplb2YoKm9oKSwgbDJfbGVuKTsKKyNlbmRpZgorCW1zZy0+bDNoID0gKHVuc2lnbmVkIGNoYXIgKilvaCArIHNpemVvZigqb2gpOworCisJc3dpdGNoIChvaC0+bWRpc2MpIHsKKwljYXNlIEFCSVNfT01fTURJU0NfRk9NOgorCQlyYyA9IGFiaXNfbm1fcmN2bXNnX2ZvbShtc2cpOworCQlicmVhazsKKwljYXNlIEFCSVNfT01fTURJU0NfTUFOVUY6CisJCXJjID0gYWJpc19ubV9yY3Ztc2dfbWFudWYobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBBQklTX09NX01ESVNDX01NSToKKwljYXNlIEFCSVNfT01fTURJU0NfVFJBVToKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJ1bmltcGxlbWVudGVkIEFCSVMgT01MIG1lc3NhZ2UgZGlzY3JpbWluYXRvciAweCV4XG4iLAorCQkJb2gtPm1kaXNjKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJ1bmtub3duIEFCSVMgT01MIG1lc3NhZ2UgZGlzY3JpbWluYXRvciAweCV4XG4iLAorCQkJb2gtPm1kaXNjKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXNnYl9mcmVlKG1zZyk7CisJcmV0dXJuIHJjOworfQorCisjaWYgMAorLyogaW5pdGlhbGl6ZWQgYWxsIHJlc291cmNlcyAqLworc3RydWN0IGFiaXNfbm1faCAqYWJpc19ubV9pbml0KHN0cnVjdCBhYmlzX25tX2NmZyAqY2ZnKQoreworCXN0cnVjdCBhYmlzX25tX2ggKm5taDsKKworCW5taCA9IG1hbGxvYyhzaXplb2YoKm5taCkpOworCWlmICghbm1oKQorCQlyZXR1cm4gTlVMTDsKKworCW5taC0+Y2ZnID0gY2ZnOworCisJcmV0dXJuIG5taDsKK30KKworLyogZnJlZSBhbGwgcmVzb3VyY2VzICovCit2b2lkIGFiaXNfbm1fZmluaShzdHJ1Y3QgYWJpc19ubV9oICpubWgpCit7CisJZnJlZShubWgpOworfQorI2VuZGlmCisKKy8qIEhlcmUgd2UgYXJlIHRyeWluZyB0byBkZWZpbmUgYSBoaWdoLWxldmVsIEFQSSB0aGF0IGNhbiBiZSB1c2VkIGJ5CisgKiB0aGUgYWN0dWFsIEJTQyBpbXBsZW1lbnRhdGlvbi4gIEhvd2V2ZXIsIHRoZSBhcmNoaXRlY3R1cmUgaXMgY3VycmVudGx5CisgKiBzdGlsbCB1bmRlciBkZXNpZ24uICBJZGVhbGx5IHRoZSBjYWxscyB0byB0aGlzIEFQSSB3b3VsZCBiZSBzeW5jaHJvbm91cywKKyAqIHdoaWxlIHRoZSB1bmRlcmx5aW5nIHN0YWNrIGJlaGluZCB0aGUgQVBpIHJ1bnMgaW4gYSB0cmFkaXRpb25hbCBzZWxlY3QKKyAqIGJhc2VkIHN0YXRlIG1hY2hpbmUuCisgKi8KKworLyogNi4yIFNvZnR3YXJlIExvYWQ6ICovCitlbnVtIHN3X3N0YXRlIHsKKwlTV19TVEFURV9OT05FLAorCVNXX1NUQVRFX1dBSVRfSU5JVEFDSywKKwlTV19TVEFURV9XQUlUX1NFR0FDSywKKwlTV19TVEFURV9XQUlUX0VOREFDSywKKwlTV19TVEFURV9XQUlUX0FDVEFDSywKKwlTV19TVEFURV9FUlJPUiwKK307CisKK3N0cnVjdCBhYmlzX25tX3N3IHsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCWludCB0cnhfbnI7CisJZ3NtX2NiZm4gKmNiZm47CisJdm9pZCAqY2JfZGF0YTsKKwlpbnQgZm9yY2VkOworCisJLyogdGhpcyB3aWxsIGJlY29tZSBwYXJ0IG9mIHRoZSBTVyBMT0FEIElOSVRJQVRFICovCisJdV9pbnQ4X3Qgb2JqX2NsYXNzOworCXVfaW50OF90IG9ial9pbnN0YW5jZVszXTsKKworCXVfaW50OF90IGZpbGVfaWRbMjU1XTsKKwl1X2ludDhfdCBmaWxlX2lkX2xlbjsKKworCXVfaW50OF90IGZpbGVfdmVyc2lvblsyNTVdOworCXVfaW50OF90IGZpbGVfdmVyc2lvbl9sZW47CisKKwl1X2ludDhfdCB3aW5kb3dfc2l6ZTsKKwl1X2ludDhfdCBzZWdfaW5fd2luZG93OworCisJaW50IGZkOworCUZJTEUgKnN0cmVhbTsKKwllbnVtIHN3X3N0YXRlIHN0YXRlOworCWludCBsYXN0X3NlZzsKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWJpc19ubV9zdyBnX3N3OworCitzdGF0aWMgdm9pZCBzd19hZGRfZmlsZV9pZF9hbmRfdmVyKHN0cnVjdCBhYmlzX25tX3N3ICpzdywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlpZiAoc3ctPmJ0cy0+dHlwZSA9PSBHU01fQlRTX1RZUEVfTkFOT0JUUykgeworCQltc2diX3ZfcHV0KG1zZywgTk1fQVRUX1NXX0RFU0NSKTsKKwkJbXNnYl90bDE2dl9wdXQobXNnLCBOTV9BVFRfRklMRV9JRCwgc3ctPmZpbGVfaWRfbGVuLCBzdy0+ZmlsZV9pZCk7CisJCW1zZ2JfdGwxNnZfcHV0KG1zZywgTk1fQVRUX0ZJTEVfVkVSU0lPTiwgc3ctPmZpbGVfdmVyc2lvbl9sZW4sCisJCQkgICAgICAgc3ctPmZpbGVfdmVyc2lvbik7CisJfSBlbHNlIGlmIChzdy0+YnRzLT50eXBlID09IEdTTV9CVFNfVFlQRV9CUzExKSB7CisJCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9GSUxFX0lELCBzdy0+ZmlsZV9pZF9sZW4sIHN3LT5maWxlX2lkKTsKKwkJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0ZJTEVfVkVSU0lPTiwgc3ctPmZpbGVfdmVyc2lvbl9sZW4sCisJCQkgICAgIHN3LT5maWxlX3ZlcnNpb24pOworCX0gZWxzZSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiUGxlYXNlIGltcGxlbWVudCB0aGlzIGZvciB0aGUgQlRTLlxuIik7CisJfQorfQorCisvKiA2LjIuMSAvIDguMy4xOiBMb2FkIERhdGEgSW5pdGlhdGUgKi8KK3N0YXRpYyBpbnQgc3dfbG9hZF9pbml0KHN0cnVjdCBhYmlzX25tX3N3ICpzdykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgbGVuID0gMyoyICsgc3ctPmZpbGVfaWRfbGVuICsgc3ctPmZpbGVfdmVyc2lvbl9sZW47CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBsZW4sIE5NX01UX0xPQURfSU5JVCwgc3ctPm9ial9jbGFzcywKKwkJCXN3LT5vYmpfaW5zdGFuY2VbMF0sIHN3LT5vYmpfaW5zdGFuY2VbMV0sCisJCQlzdy0+b2JqX2luc3RhbmNlWzJdKTsKKworCXN3X2FkZF9maWxlX2lkX2FuZF92ZXIoc3csIG1zZyk7CisJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfV0lORE9XX1NJWkUsIHN3LT53aW5kb3dfc2l6ZSk7CisJCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhzdy0+YnRzLCBtc2cpOworfQorCitzdGF0aWMgaW50IGlzX2xhc3RfbGluZShGSUxFICpzdHJlYW0pCit7CisJY2hhciBuZXh0X3NlZ19idWZbMjU2XTsKKwlsb25nIHBvczsKKworCS8qIGNoZWNrIGlmIHdlJ3JlIHNlbmRpbmcgdGhlIGxhc3QgbGluZSAqLworCXBvcyA9IGZ0ZWxsKHN0cmVhbSk7CisJaWYgKCFmZ2V0cyhuZXh0X3NlZ19idWYsIHNpemVvZihuZXh0X3NlZ19idWYpLTIsIHN0cmVhbSkpIHsKKwkJZnNlZWsoc3RyZWFtLCBwb3MsIFNFRUtfU0VUKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZnNlZWsoc3RyZWFtLCBwb3MsIFNFRUtfU0VUKTsKKwlyZXR1cm4gMDsKK30KKworLyogNi4yLjIgLyA4LjMuMiBMb2FkIERhdGEgU2VnbWVudCAqLworc3RhdGljIGludCBzd19sb2FkX3NlZ21lbnQoc3RydWN0IGFiaXNfbm1fc3cgKnN3KQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwljaGFyIHNlZ19idWZbMjU2XTsKKwljaGFyICpsaW5lX2J1ZiA9IHNlZ19idWYrMjsKKwl1bnNpZ25lZCBjaGFyICp0bHY7CisJdV9pbnQ4X3QgbGVuOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCisJc3dpdGNoIChzdy0+YnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJaWYgKGZnZXRzKGxpbmVfYnVmLCBzaXplb2Yoc2VnX2J1ZiktMiwgc3ctPnN0cmVhbSkgPT0gTlVMTCkgeworCQkJcGVycm9yKCJmZ2V0cyByZWFkaW5nIHNlZ21lbnQiKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXNlZ19idWZbMF0gPSAweDAwOworCisJCS8qIGNoZWNrIGlmIHdlJ3JlIHNlbmRpbmcgdGhlIGxhc3QgbGluZSAqLworCQlzdy0+bGFzdF9zZWcgPSBpc19sYXN0X2xpbmUoc3ctPnN0cmVhbSk7CisJCWlmIChzdy0+bGFzdF9zZWcpCisJCQlzZWdfYnVmWzFdID0gMDsKKwkJZWxzZQorCQkJc2VnX2J1ZlsxXSA9IDEgKyBzdy0+c2VnX2luX3dpbmRvdysrOworCisJCWxlbiA9IHN0cmxlbihsaW5lX2J1ZikgKyAyOworCQl0bHYgPSBtc2diX3B1dChtc2csIFRMVl9HUk9TU19MRU4obGVuKSk7CisJCXRsdl9wdXQodGx2LCBOTV9BVFRfQlMxMV9GSUxFX0RBVEEsIGxlbiwgKHVfaW50OF90ICopc2VnX2J1Zik7CisJCS8qIEJTMTEgd2FudHMgQ1IgKyBMRiBpbiBleGNlc3Mgb2YgdGhlIFRMViBsZW5ndGggIT8hICovCisJCXRsdlsxXSAtPSAyOworCisJCS8qIHdlIG9ubHkgbm93IGtub3cgdGhlIGV4YWN0IGxlbmd0aCBmb3IgdGhlIE9NIGhkciAqLworCQlsZW4gPSBzdHJsZW4obGluZV9idWYpKzI7CisJCWJyZWFrOworCWNhc2UgR1NNX0JUU19UWVBFX05BTk9CVFM6IHsKKwkJc3RhdGljX2Fzc2VydChzaXplb2Yoc2VnX2J1ZikgPj0gSVBBQ0NfU0VHTUVOVF9TSVpFLCBidWZmZXJfYmlnX2Vub3VnaCk7CisJCWxlbiA9IHJlYWQoc3ctPmZkLCAmc2VnX2J1ZiwgSVBBQ0NfU0VHTUVOVF9TSVpFKTsKKwkJaWYgKGxlbiA8IDApIHsKKwkJCXBlcnJvcigicmVhZCBmYWlsZWQiKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKGxlbiAhPSBJUEFDQ19TRUdNRU5UX1NJWkUpCisJCQlzdy0+bGFzdF9zZWcgPSAxOworCisJCSsrc3ctPnNlZ19pbl93aW5kb3c7CisJCW1zZ2JfdGwxNnZfcHV0KG1zZywgTk1fQVRUX0lQQUNDX0ZJTEVfREFUQSwgbGVuLCAoY29uc3QgdV9pbnQ4X3QgKikgc2VnX2J1Zik7CisJCWxlbiArPSAzOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJzd19sb2FkX3NlZ21lbnQgbmVlZHMgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBCVFMuXG4iKTsKKwkJLyogRklYTUU6IE90aGVyIEJUUyB0eXBlcyAqLworCQlyZXR1cm4gLTE7CisJfQorCisJZmlsbF9vbV9mb21faGRyKG9oLCBsZW4sIE5NX01UX0xPQURfU0VHLCBzdy0+b2JqX2NsYXNzLAorCQkJc3ctPm9ial9pbnN0YW5jZVswXSwgc3ctPm9ial9pbnN0YW5jZVsxXSwKKwkJCXN3LT5vYmpfaW5zdGFuY2VbMl0pOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhzdy0+YnRzLCBtc2cpOworfQorCisvKiA2LjIuNCAvIDguMy40IExvYWQgRGF0YSBFbmQgKi8KK3N0YXRpYyBpbnQgc3dfbG9hZF9lbmQoc3RydWN0IGFiaXNfbm1fc3cgKnN3KQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCBsZW4gPSAyKjIgKyBzdy0+ZmlsZV9pZF9sZW4gKyBzdy0+ZmlsZV92ZXJzaW9uX2xlbjsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIGxlbiwgTk1fTVRfTE9BRF9FTkQsIHN3LT5vYmpfY2xhc3MsCisJCQlzdy0+b2JqX2luc3RhbmNlWzBdLCBzdy0+b2JqX2luc3RhbmNlWzFdLAorCQkJc3ctPm9ial9pbnN0YW5jZVsyXSk7CisKKwlzd19hZGRfZmlsZV9pZF9hbmRfdmVyKHN3LCBtc2cpOworCXJldHVybiBhYmlzX25tX3NlbmRtc2coc3ctPmJ0cywgbXNnKTsKK30KKworLyogQWN0aXZhdGUgdGhlIHNwZWNpZmllZCBzb2Z0d2FyZSBpbnRvIHRoZSBCVFMgKi8KK3N0YXRpYyBpbnQgc3dfYWN0aXZhdGUoc3RydWN0IGFiaXNfbm1fc3cgKnN3KQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCBsZW4gPSAyKjIgKyBzdy0+ZmlsZV9pZF9sZW4gKyBzdy0+ZmlsZV92ZXJzaW9uX2xlbjsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIGxlbiwgTk1fTVRfQUNUSVZBVEVfU1csIHN3LT5vYmpfY2xhc3MsCisJCQlzdy0+b2JqX2luc3RhbmNlWzBdLCBzdy0+b2JqX2luc3RhbmNlWzFdLAorCQkJc3ctPm9ial9pbnN0YW5jZVsyXSk7CisKKwkvKiBGSVhNRTogdGhpcyBpcyBCUzExIHNwZWNpZmljIGZvcm1hdCAqLworCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9GSUxFX0lELCBzdy0+ZmlsZV9pZF9sZW4sIHN3LT5maWxlX2lkKTsKKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfRklMRV9WRVJTSU9OLCBzdy0+ZmlsZV92ZXJzaW9uX2xlbiwKKwkJICAgICBzdy0+ZmlsZV92ZXJzaW9uKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coc3ctPmJ0cywgbXNnKTsKK30KKworc3RydWN0IHNkcF9maXJtd2FyZSB7CisJY2hhciBtYWdpY1s0XTsKKwljaGFyIG1vcmVfbWFnaWNbNF07CisJdW5zaWduZWQgaW50IGhlYWRlcl9sZW5ndGg7CisJdW5zaWduZWQgaW50IGZpbGVfbGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0YXRpYyBpbnQgcGFyc2Vfc2RwX2hlYWRlcihzdHJ1Y3QgYWJpc19ubV9zdyAqc3cpCit7CisJc3RydWN0IHNkcF9maXJtd2FyZSBmaXJtd2FyZV9oZWFkZXI7CisJaW50IHJjOworCXN0cnVjdCBzdGF0IHN0YXQ7CisKKwlyYyA9IHJlYWQoc3ctPmZkLCAmZmlybXdhcmVfaGVhZGVyLCBzaXplb2YoZmlybXdhcmVfaGVhZGVyKSk7CisJaWYgKHJjICE9IHNpemVvZihmaXJtd2FyZV9oZWFkZXIpKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiQ291bGQgbm90IHJlYWQgU0RQIGZpbGUgaGVhZGVyLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoc3RybmNtcChmaXJtd2FyZV9oZWFkZXIubWFnaWMsICIgU0RQIiwgNCkgIT0gMCkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlRoZSBtYWdpYyBudW1iZXIxIGlzIHdyb25nLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoZmlybXdhcmVfaGVhZGVyLm1vcmVfbWFnaWNbMF0gIT0gMHgxMCB8fAorCSAgICBmaXJtd2FyZV9oZWFkZXIubW9yZV9tYWdpY1sxXSAhPSAweDAyIHx8CisJICAgIGZpcm13YXJlX2hlYWRlci5tb3JlX21hZ2ljWzJdICE9IDB4MDAgfHwKKwkgICAgZmlybXdhcmVfaGVhZGVyLm1vcmVfbWFnaWNbM10gIT0gMHgwMCkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlRoZSBtb3JlIG1hZ2ljIG51bWJlciBpcyB3cm9uZy5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisKKwlpZiAoZnN0YXQoc3ctPmZkLCAmc3RhdCkgPT0gLTEpIHsKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJDb3VsZCBub3Qgc3RhdCB0aGUgZmlsZS5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKG50b2hsKGZpcm13YXJlX2hlYWRlci5maWxlX2xlbmd0aCkgIT0gc3RhdC5zdF9zaXplKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiVGhlIGZpbGVzaXplcyBkbyBub3QgbWF0Y2guXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGdvIGJhY2sgdG8gdGhlIHN0YXJ0IGFzIHdlIGNoZWNrZWQgdGhlIHdob2xlIGZpbGVzaXplLi4gKi8KKwlsc2Vlayhzdy0+ZmQsIDBsLCBTRUVLX1NFVCk7CisJTE9HUChETk0sIExPR0xfTk9USUNFLCAiVGhlIGlwYWNjZXNzIFNEUCBoZWFkZXIgaXMgbm90IGZ1bGx5IHVuZGVyc3Rvb2QuXG4iCisJCQkgICAgICAgIlRoZXJlIG1pZ2h0IGJlIGNoZWNrc3VtcyBpbiB0aGUgZmlsZSB0aGF0IGFyZSBub3RcbiIKKwkJCSAgICAgICAidmVyaWZpZWQgYW5kIGluY29tcGxldGUgZmlybXdhcmUgbWlnaHQgYmUgZmxhc2hlZC5cbiIKKwkJCSAgICAgICAiVGhlcmUgaXMgYWJzb2x1dGVseSBubyBXQVJSQU5UWSB0aGF0IGZsYXNoaW5nIHdpbGxcbiIKKwkJCSAgICAgICAid29yay5cbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN3X29wZW5fZmlsZShzdHJ1Y3QgYWJpc19ubV9zdyAqc3csIGNvbnN0IGNoYXIgKmZuYW1lKQoreworCWNoYXIgZmlsZV9pZFsxMisxXTsKKwljaGFyIGZpbGVfdmVyc2lvbls4MCsxXTsKKwlpbnQgcmM7CisKKwlzdy0+ZmQgPSBvcGVuKGZuYW1lLCBPX1JET05MWSk7CisJaWYgKHN3LT5mZCA8IDApCisJCXJldHVybiBzdy0+ZmQ7CisKKwlzd2l0Y2ggKHN3LT5idHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQlzdy0+c3RyZWFtID0gZmRvcGVuKHN3LT5mZCwgInIiKTsKKwkJaWYgKCFzdy0+c3RyZWFtKSB7CisJCQlwZXJyb3IoImZkb3BlbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCS8qIHJlYWQgZmlyc3QgbGluZSBhbmQgcGFyc2UgZmlsZSBJRCBhbmQgVkVSU0lPTiAqLworCQlyYyA9IGZzY2FuZihzdy0+c3RyZWFtLCAiQCgjKSUxMnM6JTgwc1xyXG4iLAorCQkJICAgIGZpbGVfaWQsIGZpbGVfdmVyc2lvbik7CisJCWlmIChyYyAhPSAyKSB7CisJCQlwZXJyb3IoInBhcnNpbmcgaGVhZGVyIGxpbmUgb2Ygc29mdHdhcmUgZmlsZSIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXN0cmNweSgoY2hhciAqKXN3LT5maWxlX2lkLCBmaWxlX2lkKTsKKwkJc3ctPmZpbGVfaWRfbGVuID0gc3RybGVuKGZpbGVfaWQpOworCQlzdHJjcHkoKGNoYXIgKilzdy0+ZmlsZV92ZXJzaW9uLCBmaWxlX3ZlcnNpb24pOworCQlzdy0+ZmlsZV92ZXJzaW9uX2xlbiA9IHN0cmxlbihmaWxlX3ZlcnNpb24pOworCQkvKiByZXdpbmQgdG8gc3RhcnQgb2YgZmlsZSAqLworCQlyZXdpbmQoc3ctPnN0cmVhbSk7CisJCWJyZWFrOwkKKwljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOgorCQkvKiBUT0RPOiBleHRyYWN0IHRoYXQgZnJvbSB0aGUgZmlsZW5hbWUgb3IgY29udGVudCAqLworCQlyYyA9IHBhcnNlX3NkcF9oZWFkZXIoc3cpOworCQlpZiAocmMgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBwYXJzZSB0aGUgaXBhY2Nlc3MgU0RQIGhlYWRlclxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlzdHJjcHkoKGNoYXIgKilzdy0+ZmlsZV9pZCwgImlkIik7CisJCXN3LT5maWxlX2lkX2xlbiA9IDM7CisJCXN0cmNweSgoY2hhciAqKXN3LT5maWxlX3ZlcnNpb24sICJ2ZXJzaW9uIik7CisJCXN3LT5maWxlX3ZlcnNpb25fbGVuID0gODsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogV2UgZG9uJ3Qga25vdyBob3cgdG8gdHJlYXQgdGhlbSB5ZXQgKi8KKwkJY2xvc2Uoc3ctPmZkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisJCitzdGF0aWMgdm9pZCBzd19jbG9zZV9maWxlKHN0cnVjdCBhYmlzX25tX3N3ICpzdykKK3sKKwlzd2l0Y2ggKHN3LT5idHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQlmY2xvc2Uoc3ctPnN0cmVhbSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNsb3NlKHN3LT5mZCk7CisJCWJyZWFrOworCX0KK30KKworLyogRmlsbCB0aGUgd2luZG93ICovCitzdGF0aWMgaW50IHN3X2ZpbGxfd2luZG93KHN0cnVjdCBhYmlzX25tX3N3ICpzdykKK3sKKwlpbnQgcmM7CisKKwl3aGlsZSAoc3ctPnNlZ19pbl93aW5kb3cgPCBzdy0+d2luZG93X3NpemUpIHsKKwkJcmMgPSBzd19sb2FkX3NlZ21lbnQoc3cpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCQlpZiAoc3ctPmxhc3Rfc2VnKQorCQkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisvKiBjYWxsYmFjayBmdW5jdGlvbiBmcm9tIGFiaXNfbm1fcmN2bXNnKCkgaGFuZGxlciAqLworc3RhdGljIGludCBhYmlzX25tX3Jjdm1zZ19zdyhzdHJ1Y3QgbXNnYiAqbWIpCit7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oID0gbXNnYl9sMyhtYik7CisJaW50IHJjID0gLTE7CisJc3RydWN0IGFiaXNfbm1fc3cgKnN3ID0gJmdfc3c7CisJZW51bSBzd19zdGF0ZSBvbGRfc3RhdGUgPSBzdy0+c3RhdGU7CisJCisJLy9ERUJVR1AoRE5NLCAic3RhdGUgJXUsIE5NIE1UIDB4JTAyeFxuIiwgc3ctPnN0YXRlLCBmb2gtPm1zZ190eXBlKTsKKworCXN3aXRjaCAoc3ctPnN0YXRlKSB7CisJY2FzZSBTV19TVEFURV9XQUlUX0lOSVRBQ0s6CisJCXN3aXRjaCAoZm9oLT5tc2dfdHlwZSkgeworCQljYXNlIE5NX01UX0xPQURfSU5JVF9BQ0s6CisJCQkvKiBmaWxsIHdpbmRvdyB3aXRoIHNlZ21lbnRzICovCisJCQlpZiAoc3ctPmNiZm4pCisJCQkJc3ctPmNiZm4oR1NNX0hPT0tfTk1fU1dMT0FELAorCQkJCQkgTk1fTVRfTE9BRF9JTklUX0FDSywgbWIsCisJCQkJCSBzdy0+Y2JfZGF0YSwgTlVMTCk7CisJCQlyYyA9IHN3X2ZpbGxfd2luZG93KHN3KTsKKwkJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX1dBSVRfU0VHQUNLOworCQkJYnJlYWs7CisJCWNhc2UgTk1fTVRfTE9BRF9JTklUX05BQ0s6CisJCQlpZiAoc3ctPmZvcmNlZCkgeworCQkJCURFQlVHUChETk0sICJGT1JDRUQ6IElnbm9yaW5nIFNvZnR3YXJlIExvYWQgIgorCQkJCQkiSW5pdCBOQUNLXG4iKTsKKwkJCQlpZiAoc3ctPmNiZm4pCisJCQkJCXN3LT5jYmZuKEdTTV9IT09LX05NX1NXTE9BRCwKKwkJCQkJCSBOTV9NVF9MT0FEX0lOSVRfQUNLLCBtYiwKKwkJCQkJCSBzdy0+Y2JfZGF0YSwgTlVMTCk7CisJCQkJcmMgPSBzd19maWxsX3dpbmRvdyhzdyk7CisJCQkJc3ctPnN0YXRlID0gU1dfU1RBVEVfV0FJVF9TRUdBQ0s7CisJCQl9IGVsc2UgeworCQkJCURFQlVHUChETk0sICJTb2Z0d2FyZSBMb2FkIEluaXQgTkFDS1xuIik7CisJCQkJLyogRklYTUU6IGNhdXNlICovCisJCQkJaWYgKHN3LT5jYmZuKQorCQkJCQlzdy0+Y2JmbihHU01fSE9PS19OTV9TV0xPQUQsCisJCQkJCQkgTk1fTVRfTE9BRF9JTklUX05BQ0ssIG1iLAorCQkJCQkJIHN3LT5jYl9kYXRhLCBOVUxMKTsKKwkJCQlzdy0+c3RhdGUgPSBTV19TVEFURV9FUlJPUjsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgU1dfU1RBVEVfV0FJVF9TRUdBQ0s6CisJCXN3aXRjaCAoZm9oLT5tc2dfdHlwZSkgeworCQljYXNlIE5NX01UX0xPQURfU0VHX0FDSzoKKwkJCWlmIChzdy0+Y2JmbikKKwkJCQlzdy0+Y2JmbihHU01fSE9PS19OTV9TV0xPQUQsCisJCQkJCSBOTV9NVF9MT0FEX1NFR19BQ0ssIG1iLAorCQkJCQkgc3ctPmNiX2RhdGEsIE5VTEwpOworCQkJc3ctPnNlZ19pbl93aW5kb3cgPSAwOworCQkJaWYgKCFzdy0+bGFzdF9zZWcpIHsKKwkJCQkvKiBmaWxsIHdpbmRvdyB3aXRoIG1vcmUgc2VnbWVudHMgKi8KKwkJCQlyYyA9IHN3X2ZpbGxfd2luZG93KHN3KTsKKwkJCQlzdy0+c3RhdGUgPSBTV19TVEFURV9XQUlUX1NFR0FDSzsKKwkJCX0gZWxzZSB7CisJCQkJLyogZW5kIHRoZSB0cmFuc2ZlciAqLworCQkJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX1dBSVRfRU5EQUNLOworCQkJCXJjID0gc3dfbG9hZF9lbmQoc3cpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgTk1fTVRfTE9BRF9BQk9SVDoKKwkJCWlmIChzdy0+Y2JmbikKKwkJCQlzdy0+Y2JmbihHU01fSE9PS19OTV9TV0xPQUQsCisJCQkJCSBOTV9NVF9MT0FEX0FCT1JULCBtYiwKKwkJCQkJIHN3LT5jYl9kYXRhLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgU1dfU1RBVEVfV0FJVF9FTkRBQ0s6CisJCXN3aXRjaCAoZm9oLT5tc2dfdHlwZSkgeworCQljYXNlIE5NX01UX0xPQURfRU5EX0FDSzoKKwkJCXN3X2Nsb3NlX2ZpbGUoc3cpOworCQkJREVCVUdQKEROTSwgIlNvZnR3YXJlIExvYWQgRW5kIChCVFMgJXUpXG4iLAorCQkJCXN3LT5idHMtPm5yKTsKKwkJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX05PTkU7CisJCQlpZiAoc3ctPmNiZm4pCisJCQkJc3ctPmNiZm4oR1NNX0hPT0tfTk1fU1dMT0FELAorCQkJCQkgTk1fTVRfTE9BRF9FTkRfQUNLLCBtYiwKKwkJCQkJIHN3LT5jYl9kYXRhLCBOVUxMKTsKKwkJCXJjID0gMDsKKwkJCWJyZWFrOworCQljYXNlIE5NX01UX0xPQURfRU5EX05BQ0s6CisJCQlpZiAoc3ctPmZvcmNlZCkgeworCQkJCURFQlVHUChETk0sICJGT1JDRUQ6IElnbm9yaW5nIFNvZnR3YXJlIExvYWQiCisJCQkJCSJFbmQgTkFDS1xuIik7CisJCQkJc3ctPnN0YXRlID0gU1dfU1RBVEVfTk9ORTsKKwkJCQlpZiAoc3ctPmNiZm4pCisJCQkJCXN3LT5jYmZuKEdTTV9IT09LX05NX1NXTE9BRCwKKwkJCQkJCSBOTV9NVF9MT0FEX0VORF9BQ0ssIG1iLAorCQkJCQkJIHN3LT5jYl9kYXRhLCBOVUxMKTsKKwkJCX0gZWxzZSB7CisJCQkJREVCVUdQKEROTSwgIlNvZnR3YXJlIExvYWQgRW5kIE5BQ0tcbiIpOworCQkJCS8qIEZJWE1FOiBjYXVzZSAqLworCQkJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX0VSUk9SOworCQkJCWlmIChzdy0+Y2JmbikKKwkJCQkJc3ctPmNiZm4oR1NNX0hPT0tfTk1fU1dMT0FELAorCQkJCQkJIE5NX01UX0xPQURfRU5EX05BQ0ssIG1iLAorCQkJCQkJIHN3LT5jYl9kYXRhLCBOVUxMKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJY2FzZSBTV19TVEFURV9XQUlUX0FDVEFDSzoKKwkJc3dpdGNoIChmb2gtPm1zZ190eXBlKSB7CisJCWNhc2UgTk1fTVRfQUNUSVZBVEVfU1dfQUNLOgorCQkJLyogd2UncmUgZG9uZSAqLworCQkJREVCVUdQKEROTSwgIkFjdGl2YXRlIFNvZnR3YXJlIERPTkUhXG4iKTsKKwkJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX05PTkU7CisJCQlyYyA9IDA7CisJCQlpZiAoc3ctPmNiZm4pCisJCQkJc3ctPmNiZm4oR1NNX0hPT0tfTk1fU1dMT0FELAorCQkJCQkgTk1fTVRfQUNUSVZBVEVfU1dfQUNLLCBtYiwKKwkJCQkJIHN3LT5jYl9kYXRhLCBOVUxMKTsKKwkJCWJyZWFrOworCQljYXNlIE5NX01UX0FDVElWQVRFX1NXX05BQ0s6CisJCQlERUJVR1AoRE5NLCAiQWN0aXZhdGUgU29mdHdhcmUgTkFDS1xuIik7CisJCQkvKiBGSVhNRTogY2F1c2UgKi8KKwkJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX0VSUk9SOworCQkJaWYgKHN3LT5jYmZuKQorCQkJCXN3LT5jYmZuKEdTTV9IT09LX05NX1NXTE9BRCwKKwkJCQkJIE5NX01UX0FDVElWQVRFX1NXX05BQ0ssIG1iLAorCQkJCQkgc3ctPmNiX2RhdGEsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwljYXNlIFNXX1NUQVRFX05PTkU6CisJCXN3aXRjaCAoZm9oLT5tc2dfdHlwZSkgeworCQljYXNlIE5NX01UX0FDVElWQVRFX1NXX0FDSzoKKwkJCXJjID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgU1dfU1RBVEVfRVJST1I6CisJCWJyZWFrOworCX0KKworCWlmIChyYykKKwkJREVCVUdQKEROTSwgInVuZXhwZWN0ZWQgTk0gTVQgMHglMDJ4IGluIHN0YXRlICV1IC0+ICV1XG4iLAorCQkJZm9oLT5tc2dfdHlwZSwgb2xkX3N0YXRlLCBzdy0+c3RhdGUpOworCisJcmV0dXJuIHJjOworfQorCisvKiBMb2FkIHRoZSBzcGVjaWZpZWQgc29mdHdhcmUgaW50byB0aGUgQlRTICovCitpbnQgYWJpc19ubV9zb2Z0d2FyZV9sb2FkKHN0cnVjdCBnc21fYnRzICpidHMsIGludCB0cnhfbnIsIGNvbnN0IGNoYXIgKmZuYW1lLAorCQkJICB1X2ludDhfdCB3aW5fc2l6ZSwgaW50IGZvcmNlZCwKKwkJCSAgZ3NtX2NiZm4gKmNiZm4sIHZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IGFiaXNfbm1fc3cgKnN3ID0gJmdfc3c7CisJaW50IHJjOworCisJREVCVUdQKEROTSwgIlNvZnR3YXJlIExvYWQgKEJUUyAldSwgRmlsZSBcIiVzXCIpXG4iLAorCQlidHMtPm5yLCBmbmFtZSk7CisKKwlpZiAoc3ctPnN0YXRlICE9IFNXX1NUQVRFX05PTkUpCisJCXJldHVybiAtRUJVU1k7CisKKwlzdy0+YnRzID0gYnRzOworCXN3LT50cnhfbnIgPSB0cnhfbnI7CisKKwlzd2l0Y2ggKGJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CisJCXN3LT5vYmpfY2xhc3MgPSBOTV9PQ19TSVRFX01BTkFHRVI7CisJCXN3LT5vYmpfaW5zdGFuY2VbMF0gPSAweGZmOworCQlzdy0+b2JqX2luc3RhbmNlWzFdID0gMHhmZjsKKwkJc3ctPm9ial9pbnN0YW5jZVsyXSA9IDB4ZmY7CisJCWJyZWFrOworCWNhc2UgR1NNX0JUU19UWVBFX05BTk9CVFM6CisJCXN3LT5vYmpfY2xhc3MgPSBOTV9PQ19CQVNFQl9UUkFOU0M7CisJCXN3LT5vYmpfaW5zdGFuY2VbMF0gPSBzdy0+YnRzLT5ucjsKKwkJc3ctPm9ial9pbnN0YW5jZVsxXSA9IHN3LT50cnhfbnI7CisJCXN3LT5vYmpfaW5zdGFuY2VbMl0gPSAweGZmOworCQlicmVhazsKKwljYXNlIEdTTV9CVFNfVFlQRV9VTktOT1dOOgorCWRlZmF1bHQ6CisJCUxPR1BDKEROTSwgTE9HTF9FUlJPUiwgIlNvZnR3YXJlIExvYWQgbm90IHByb3Blcmx5IGltcGxlbWVudGVkLlxuIik7CisJCXJldHVybiAtMTsKKwkJYnJlYWs7CisJfQorCXN3LT53aW5kb3dfc2l6ZSA9IHdpbl9zaXplOworCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX1dBSVRfSU5JVEFDSzsKKwlzdy0+Y2JmbiA9IGNiZm47CisJc3ctPmNiX2RhdGEgPSBjYl9kYXRhOworCXN3LT5mb3JjZWQgPSBmb3JjZWQ7CisKKwlyYyA9IHN3X29wZW5fZmlsZShzdywgZm5hbWUpOworCWlmIChyYyA8IDApIHsKKwkJc3ctPnN0YXRlID0gU1dfU1RBVEVfTk9ORTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiBzd19sb2FkX2luaXQoc3cpOworfQorCitpbnQgYWJpc19ubV9zb2Z0d2FyZV9sb2FkX3N0YXR1cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBhYmlzX25tX3N3ICpzdyA9ICZnX3N3OworCXN0cnVjdCBzdGF0IHN0OworCWludCByYywgcGVyY2VudDsKKworCXJjID0gZnN0YXQoc3ctPmZkLCAmc3QpOworCWlmIChyYyA8IDApIHsKKwkJcGVycm9yKCJFUlJPUiBkdXJpbmcgc3RhdCIpOworCQlyZXR1cm4gcmM7CisJfQorCisJaWYgKHN3LT5zdHJlYW0pCisJCXBlcmNlbnQgPSAoZnRlbGwoc3ctPnN0cmVhbSkgKiAxMDApIC8gc3Quc3Rfc2l6ZTsKKwllbHNlCisJCXBlcmNlbnQgPSAobHNlZWsoc3ctPmZkLCAwLCBTRUVLX0NVUikgKiAxMDApIC8gc3Quc3Rfc2l6ZTsKKwlyZXR1cm4gcGVyY2VudDsKK30KKworLyogQWN0aXZhdGUgdGhlIHNwZWNpZmllZCBzb2Z0d2FyZSBpbnRvIHRoZSBCVFMgKi8KK2ludCBhYmlzX25tX3NvZnR3YXJlX2FjdGl2YXRlKHN0cnVjdCBnc21fYnRzICpidHMsIGNvbnN0IGNoYXIgKmZuYW1lLAorCQkJICAgICAgZ3NtX2NiZm4gKmNiZm4sIHZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IGFiaXNfbm1fc3cgKnN3ID0gJmdfc3c7CisJaW50IHJjOworCisJREVCVUdQKEROTSwgIkFjdGl2YXRpbmcgU29mdHdhcmUgKEJUUyAldSwgRmlsZSBcIiVzXCIpXG4iLAorCQlidHMtPm5yLCBmbmFtZSk7CisKKwlpZiAoc3ctPnN0YXRlICE9IFNXX1NUQVRFX05PTkUpCisJCXJldHVybiAtRUJVU1k7CisKKwlzdy0+YnRzID0gYnRzOworCXN3LT5vYmpfY2xhc3MgPSBOTV9PQ19TSVRFX01BTkFHRVI7CisJc3ctPm9ial9pbnN0YW5jZVswXSA9IDB4ZmY7CisJc3ctPm9ial9pbnN0YW5jZVsxXSA9IDB4ZmY7CisJc3ctPm9ial9pbnN0YW5jZVsyXSA9IDB4ZmY7CisJc3ctPnN0YXRlID0gU1dfU1RBVEVfV0FJVF9BQ1RBQ0s7CisJc3ctPmNiZm4gPSBjYmZuOworCXN3LT5jYl9kYXRhID0gY2JfZGF0YTsKKworCS8qIE9wZW4gdGhlIGZpbGUgaW4gb3JkZXIgdG8gZmlsbCBzb21lIHN3IHN0cnVjdCBtZW1iZXJzICovCisJcmMgPSBzd19vcGVuX2ZpbGUoc3csIGZuYW1lKTsKKwlpZiAocmMgPCAwKSB7CisJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX05PTkU7CisJCXJldHVybiByYzsKKwl9CisJc3dfY2xvc2VfZmlsZShzdyk7CisKKwlyZXR1cm4gc3dfYWN0aXZhdGUoc3cpOworfQorCitzdGF0aWMgdm9pZCBmaWxsX25tX2NoYW5uZWwoc3RydWN0IGFiaXNfbm1fY2hhbm5lbCAqY2gsIHVfaW50OF90IGJ0c19wb3J0LAorCQkgICAgICAgdV9pbnQ4X3QgdHNfbnIsIHVfaW50OF90IHN1YnNsb3RfbnIpCit7CisJY2gtPmF0dHJpYiA9IE5NX0FUVF9BQklTX0NIQU5ORUw7CisJY2gtPmJ0c19wb3J0ID0gYnRzX3BvcnQ7CisJY2gtPnRpbWVzbG90ID0gdHNfbnI7CisJY2gtPnN1YnNsb3QgPSBzdWJzbG90X25yOwkKK30KKworaW50IGFiaXNfbm1fZXN0YWJsaXNoX3RlaShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCB0cnhfbnIsCisJCQkgIHVfaW50OF90IGUxX3BvcnQsIHVfaW50OF90IGUxX3RpbWVzbG90LCB1X2ludDhfdCBlMV9zdWJzbG90LAorCQkJICB1X2ludDhfdCB0ZWkpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgYWJpc19ubV9jaGFubmVsICpjaDsKKwl1X2ludDhfdCBsZW4gPSBzaXplb2YoKmNoKSArIDI7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIGxlbiwgTk1fTVRfRVNUQUJMSVNIX1RFSSwgTk1fT0NfUkFESU9fQ0FSUklFUiwKKwkJCWJ0cy0+YnRzX25yLCB0cnhfbnIsIDB4ZmYpOworCQorCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX1RFSSwgdGVpKTsKKworCWNoID0gKHN0cnVjdCBhYmlzX25tX2NoYW5uZWwgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmNoKSk7CisJZmlsbF9ubV9jaGFubmVsKGNoLCBlMV9wb3J0LCBlMV90aW1lc2xvdCwgZTFfc3Vic2xvdCk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogY29ubmVjdCBzaWduYWxsaW5nIG9mIG9uZSAoQlRTLFRSWCkgdG8gYSBwYXJ0aWN1bGFyIHRpbWVzbG90IG9uIHRoZSBFMSAqLworaW50IGFiaXNfbm1fY29ubl90ZXJyX3NpZ24oc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsCisJCQkgICB1X2ludDhfdCBlMV9wb3J0LCB1X2ludDhfdCBlMV90aW1lc2xvdCwgdV9pbnQ4X3QgZTFfc3Vic2xvdCkKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdHJ4LT5idHM7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgYWJpc19ubV9jaGFubmVsICpjaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgc2l6ZW9mKCpjaCksIE5NX01UX0NPTk5fVEVSUl9TSUdOLAorCQkJTk1fT0NfUkFESU9fQ0FSUklFUiwgYnRzLT5idHNfbnIsIHRyeC0+bnIsIDB4ZmYpOworCQorCWNoID0gKHN0cnVjdCBhYmlzX25tX2NoYW5uZWwgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmNoKSk7CisJZmlsbF9ubV9jaGFubmVsKGNoLCBlMV9wb3J0LCBlMV90aW1lc2xvdCwgZTFfc3Vic2xvdCk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworI2lmIDAKK2ludCBhYmlzX25tX2Rpc2NfdGVycl9zaWduKHN0cnVjdCBhYmlzX25tX2ggKmgsIHN0cnVjdCBhYmlzX29tX29ial9pbnN0ICppbnN0LAorCQkJICAgc3RydWN0IGFiaXNfbm1fYWJpc19jaGFubmVsICpjaGFuKQoreworfQorI2VuZGlmCisKK2ludCBhYmlzX25tX2Nvbm5fdGVycl90cmFmKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMsCisJCQkgICB1X2ludDhfdCBlMV9wb3J0LCB1X2ludDhfdCBlMV90aW1lc2xvdCwKKwkJCSAgIHVfaW50OF90IGUxX3N1YnNsb3QpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHRzLT50cngtPmJ0czsKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBhYmlzX25tX2NoYW5uZWwgKmNoOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBzaXplb2YoKmNoKSwgTk1fTVRfQ09OTl9URVJSX1RSQUYsCisJCQlOTV9PQ19DSEFOTkVMLCBidHMtPmJ0c19uciwgdHMtPnRyeC0+bnIsIHRzLT5ucik7CisKKwljaCA9IChzdHJ1Y3QgYWJpc19ubV9jaGFubmVsICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpjaCkpOworCWZpbGxfbm1fY2hhbm5lbChjaCwgZTFfcG9ydCwgZTFfdGltZXNsb3QsIGUxX3N1YnNsb3QpOworCisJREVCVUdQKEROTSwgIkNPTk5FQ1QgVEVSUiBUUkFGIFVtPSVzIEUxPSgldSwldSwldSlcbiIsCisJCWdzbV90c19uYW1lKHRzKSwKKwkJZTFfcG9ydCwgZTFfdGltZXNsb3QsIGUxX3N1YnNsb3QpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKyNpZiAwCitpbnQgYWJpc19ubV9kaXNjX3RlcnJfdHJhZihzdHJ1Y3QgYWJpc19ubV9oICpoLCBzdHJ1Y3QgYWJpc19vbV9vYmpfaW5zdCAqaW5zdCwKKwkJCSAgIHN0cnVjdCBhYmlzX25tX2FiaXNfY2hhbm5lbCAqY2hhbiwKKwkJCSAgIHVfaW50OF90IHN1YmNoYW4pCit7Cit9CisjZW5kaWYKKworLyogQ2hhcHRlciA4LjYuMSAqLworaW50IGFiaXNfbm1fc2V0X2J0c19hdHRyKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90ICphdHRyLCBpbnQgYXR0cl9sZW4pCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90ICpjdXI7CisKKwlERUJVR1AoRE5NLCAiU2V0IEJUUyBBdHRyIChidHM9JWQpXG4iLCBidHMtPm5yKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIGF0dHJfbGVuLCBOTV9NVF9TRVRfQlRTX0FUVFIsIE5NX09DX0JUUywgYnRzLT5idHNfbnIsIDB4ZmYsIDB4ZmYpOworCWN1ciA9IG1zZ2JfcHV0KG1zZywgYXR0cl9sZW4pOworCW1lbWNweShjdXIsIGF0dHIsIGF0dHJfbGVuKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisvKiBDaGFwdGVyIDguNi4yICovCitpbnQgYWJpc19ubV9zZXRfcmFkaW9fYXR0cihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgKmF0dHIsIGludCBhdHRyX2xlbikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgKmN1cjsKKworCURFQlVHUChETk0sICJTZXQgVFJYIEF0dHIgKGJ0cz0lZCx0cng9JWQpXG4iLCB0cngtPmJ0cy0+bnIsIHRyeC0+bnIpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgYXR0cl9sZW4sIE5NX01UX1NFVF9SQURJT19BVFRSLCBOTV9PQ19SQURJT19DQVJSSUVSLAorCQkJdHJ4LT5idHMtPmJ0c19uciwgdHJ4LT5uciwgMHhmZik7CisJY3VyID0gbXNnYl9wdXQobXNnLCBhdHRyX2xlbik7CisJbWVtY3B5KGN1ciwgYXR0ciwgYXR0cl9sZW4pOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyh0cngtPmJ0cywgbXNnKTsKK30KKworc3RhdGljIGludCB2ZXJpZnlfY2hhbl9jb21iKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMsIHVfaW50OF90IGNoYW5fY29tYikKK3sKKwlpbnQgaTsKKworCS8qIEFzIGl0IHR1cm5zIG91dCwgdGhlIEJTLTExIGhhcyBzb21lIHZlcnkgcGVjdWxpYXIgcmVzdHJpY3Rpb25zCisJICogb24gdGhlIGNoYW5uZWwgY29tYmluYXRpb25zIGl0IGFsbG93cyAqLworCXN3aXRjaCAodHMtPnRyeC0+YnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJc3dpdGNoIChjaGFuX2NvbWIpIHsKKwkJY2FzZSBOTV9DSEFOQ19UQ0hIYWxmOgorCQljYXNlIE5NX0NIQU5DX1RDSEhhbGYyOgorCQkJLyogbm90IHN1cHBvcnRlZCAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisJCWNhc2UgTk1fQ0hBTkNfU0RDQ0g6CisJCQkvKiBvbmx5IG9uZSBTRENDSC84IHBlciBUUlggKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBUUlhfTlJfVFM7IGkrKykgeworCQkJCWlmIChpID09IHRzLT5ucikKKwkJCQkJY29udGludWU7CisJCQkJaWYgKHRzLT50cngtPnRzW2ldLm5tX2NoYW5fY29tYiA9PQorCQkJCSAgICBOTV9DSEFOQ19TRENDSCkKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQkvKiBub3QgYWxsb3dlZCBmb3IgVFMwIG9mIEJDQ0gtVFJYICovCisJCQlpZiAodHMtPnRyeCA9PSB0cy0+dHJ4LT5idHMtPmMwICYmCisJCQkgICAgdHMtPm5yID09IDApCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJLyogbm90IG9uIHRoZSBzYW1lIFRSWCB0aGF0IGhhcyBhIEJDQ0grU0RDQ0g0CisJCQkgKiBjb21iaW5hdGlvbiAqLworCQkJaWYgKHRzLT50cnggPT0gdHMtPnRyeC0+YnRzLT5jMCAmJgorCQkJICAgICh0cy0+dHJ4LT50c1swXS5ubV9jaGFuX2NvbWIgPT0gNSB8fAorCQkJICAgICB0cy0+dHJ4LT50c1swXS5ubV9jaGFuX2NvbWIgPT0gOCkpCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisJCWNhc2UgTk1fQ0hBTkNfbWFpbkJDQ0g6CisJCWNhc2UgTk1fQ0hBTkNfQkNDSENvbWI6CisJCQkvKiBhbGxvd2VkIG9ubHkgZm9yIFRTMCBvZiBDMCAqLworCQkJaWYgKHRzLT50cnggIT0gdHMtPnRyeC0+YnRzLT5jMCB8fAorCQkJICAgIHRzLT5uciAhPSAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisJCWNhc2UgTk1fQ0hBTkNfQkNDSDoKKwkJCS8qIGFsbG93ZWQgb25seSBmb3IgVFMgMi80LzYgb2YgQzAgKi8KKwkJCWlmICh0cy0+dHJ4ICE9IHRzLT50cngtPmJ0cy0+YzApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAodHMtPm5yICE9IDIgJiYgdHMtPm5yICE9IDQgJiYKKwkJCSAgICB0cy0+bnIgIT0gNikKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCQljYXNlIDg6IC8qIHRoaXMgaXMgbm90IGxpa2UgMDguNTgsIGJ1dCBpbiBmYWN0CisJCQkgKiBGQ0NIK1NDSCtCQ0NIK0NDQ0grU0RDQ0gvNCtTQUNDSC9DNCtDQkNIICovCisJCQkvKiBGSVhNRTogb25seSBvbmUgQ0JDSCBhbGxvd2VkIHBlciBjZWxsICovCisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOgorCQlzd2l0Y2ggKHRzLT5ucikgeworCQljYXNlIDA6CisJCQlpZiAodHMtPnRyeC0+bnIgPT0gMCkgeworCQkJCS8qIG9ubHkgb24gVFJYMCAqLworCQkJCXN3aXRjaCAoY2hhbl9jb21iKSB7CisJCQkJY2FzZSBOTV9DSEFOQ19CQ0NIOgorCQkJCWNhc2UgTk1fQ0hBTkNfbWFpbkJDQ0g6CisJCQkJY2FzZSBOTV9DSEFOQ19CQ0NIQ29tYjoKKwkJCQkJcmV0dXJuIDA7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJc3dpdGNoIChjaGFuX2NvbWIpIHsKKwkJCQljYXNlIE5NX0NIQU5DX1RDSEZ1bGw6CisJCQkJY2FzZSBOTV9DSEFOQ19UQ0hIYWxmOgorCQkJCWNhc2UgTk1fQ0hBTkNfSVBBQ19UQ0hGdWxsX1RDSEhhbGY6CisJCQkJCXJldHVybiAwOworCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlpZiAodHMtPnRyeC0+bnIgPT0gMCkgeworCQkJCXN3aXRjaCAoY2hhbl9jb21iKSB7CisJCQkJY2FzZSBOTV9DSEFOQ19TRENDSF9DQkNIOgorCQkJCQlpZiAodHMtPnRyeC0+dHNbMF0ubm1fY2hhbl9jb21iID09CisJCQkJCSAgICBOTV9DSEFOQ19tYWluQkNDSCkKKwkJCQkJCXJldHVybiAwOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQljYXNlIE5NX0NIQU5DX1NEQ0NIOgorCQkJCWNhc2UgTk1fQ0hBTkNfVENIRnVsbDoKKwkJCQljYXNlIE5NX0NIQU5DX1RDSEhhbGY6CisJCQkJY2FzZSBOTV9DSEFOQ19JUEFDX1RDSEZ1bGxfVENISGFsZjoKKwkJCQljYXNlIE5NX0NIQU5DX0lQQUNfVENIRnVsbF9QRENIOgorCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXN3aXRjaCAoY2hhbl9jb21iKSB7CisJCQkJY2FzZSBOTV9DSEFOQ19TRENDSDoKKwkJCQljYXNlIE5NX0NIQU5DX1RDSEZ1bGw6CisJCQkJY2FzZSBOTV9DSEFOQ19UQ0hIYWxmOgorCQkJCWNhc2UgTk1fQ0hBTkNfSVBBQ19UQ0hGdWxsX1RDSEhhbGY6CisJCQkJCXJldHVybiAwOworCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDI6CisJCWNhc2UgMzoKKwkJY2FzZSA0OgorCQljYXNlIDU6CisJCWNhc2UgNjoKKwkJY2FzZSA3OgorCQkJc3dpdGNoIChjaGFuX2NvbWIpIHsKKwkJCWNhc2UgTk1fQ0hBTkNfVENIRnVsbDoKKwkJCWNhc2UgTk1fQ0hBTkNfVENISGFsZjoKKwkJCWNhc2UgTk1fQ0hBTkNfSVBBQ19UQ0hGdWxsX1RDSEhhbGY6CisJCQkJcmV0dXJuIDA7CisJCQljYXNlIE5NX0NIQU5DX0lQQUNfUERDSDoKKwkJCWNhc2UgTk1fQ0hBTkNfSVBBQ19UQ0hGdWxsX1BEQ0g6CisJCQkJaWYgKHRzLT50cngtPm5yID09IDApCisJCQkJCXJldHVybiAwOworCQkJCWVsc2UKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkZWZhdWx0OgorCQkvKiB1bmtub3duIEJUUyB0eXBlICovCisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogQ2hhcHRlciA4LjYuMyAqLworaW50IGFiaXNfbm1fc2V0X2NoYW5uZWxfYXR0cihzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzLCB1X2ludDhfdCBjaGFuX2NvbWIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHRzLT50cngtPmJ0czsKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXVfaW50MTZfdCBhcmZjbiA9IGh0b25zKHRzLT50cngtPmFyZmNuKTsKKwl1X2ludDhfdCB6ZXJvID0gMHgwMDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90IGxlbiA9IDIgKyAyOworCisJaWYgKGJ0cy0+dHlwZSA9PSBHU01fQlRTX1RZUEVfQlMxMSkKKwkJbGVuICs9IDQgKyAyICsgMiArIDM7CisKKwlERUJVR1AoRE5NLCAiU2V0IENoYW4gQXR0ciAlc1xuIiwgZ3NtX3RzX25hbWUodHMpKTsKKwlpZiAodmVyaWZ5X2NoYW5fY29tYih0cywgY2hhbl9jb21iKSA8IDApIHsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCURFQlVHUChETk0sICJJbnZhbGlkIENoYW5uZWwgQ29tYmluYXRpb24hISFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJdHMtPm5tX2NoYW5fY29tYiA9IGNoYW5fY29tYjsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIGxlbiwgTk1fTVRfU0VUX0NIQU5fQVRUUiwKKwkJCU5NX09DX0NIQU5ORUwsIGJ0cy0+YnRzX25yLAorCQkJdHMtPnRyeC0+bnIsIHRzLT5ucik7CisJLyogRklYTUU6IGRvbid0IHNlbmQgQVJGQ04gbGlzdCwgaG9wcGluZyBzZXF1ZW5jZSwgbUFJTywgLi4uKi8KKwlpZiAoYnRzLT50eXBlID09IEdTTV9CVFNfVFlQRV9CUzExKQorCQltc2diX3RsdjE2X3B1dChtc2csIE5NX0FUVF9BUkZDTl9MSVNULCAxLCAmYXJmY24pOworCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX0NIQU5fQ09NQiwgY2hhbl9jb21iKTsKKwlpZiAoYnRzLT50eXBlID09IEdTTV9CVFNfVFlQRV9CUzExKSB7CisJCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX0hTTiwgMHgwMCk7CisJCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX01BSU8sIDB4MDApOworCX0KKwltc2diX3R2X3B1dChtc2csIE5NX0FUVF9UU0MsIGJ0cy0+dHNjKTsJLyogdHJhaW5pbmcgc2VxdWVuY2UgKi8KKwlpZiAoYnRzLT50eXBlID09IEdTTV9CVFNfVFlQRV9CUzExKQorCQltc2diX3Rsdl9wdXQobXNnLCAweDU5LCAxLCAmemVybyk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fc3dfYWN0X3JlcV9hY2soc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB1X2ludDhfdCBpMSwKKwkJCXVfaW50OF90IGkyLCB1X2ludDhfdCBpMywgaW50IG5hY2ssIHVfaW50OF90ICphdHRyLCBpbnQgYXR0X2xlbikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgbXNndHlwZSA9IE5NX01UX1NXX0FDVF9SRVFfQUNLOworCXVfaW50OF90IGxlbiA9IGF0dF9sZW47CisKKwlpZiAobmFjaykgeworCQlsZW4gKz0gMjsKKwkJbXNndHlwZSA9IE5NX01UX1NXX0FDVF9SRVFfTkFDSzsKKwl9CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBhdHRfbGVuLCBtc2d0eXBlLCBvYmpfY2xhc3MsIGkxLCBpMiwgaTMpOworCisJaWYgKGF0dHIpIHsKKwkJdV9pbnQ4X3QgKnB0ciA9IG1zZ2JfcHV0KG1zZywgYXR0X2xlbik7CisJCW1lbWNweShwdHIsIGF0dHIsIGF0dF9sZW4pOworCX0KKwlpZiAobmFjaykKKwkJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfTkFDS19DQVVTRVMsIE5NX05BQ0tfT0JKQ0xBU1NfTk9UU1VQUCk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fcmF3X21zZyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgbGVuLCB1X2ludDhfdCAqcmF3bXNnKQoreworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwl1X2ludDhfdCAqZGF0YTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqb2gpKTsKKwlmaWxsX29tX2hkcihvaCwgbGVuKTsKKwlkYXRhID0gbXNnYl9wdXQobXNnLCBsZW4pOworCW1lbWNweShkYXRhLCByYXdtc2csIGxlbik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogU2llbWVucyBzcGVjaWZpYyBjb21tYW5kcyAqLworc3RhdGljIGludCBfX3NpbXBsZV9jbWQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgbXNnX3R5cGUpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMCwgbXNnX3R5cGUsIE5NX09DX1NJVEVfTUFOQUdFUiwKKwkJCTB4ZmYsIDB4ZmYsIDB4ZmYpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKy8qIENoYXB0ZXIgOC45LjIgKi8KK2ludCBhYmlzX25tX29wc3RhcnQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB1X2ludDhfdCBpMCwgdV9pbnQ4X3QgaTEsIHVfaW50OF90IGkyKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDAsIE5NX01UX09QU1RBUlQsIG9ial9jbGFzcywgaTAsIGkxLCBpMik7CisKKwlkZWJ1Z3BfZm9oKChzdHJ1Y3QgYWJpc19vbV9mb21faGRyICopIG9oLT5kYXRhKTsKKwlERUJVR1BDKEROTSwgIlNlbmRpbmcgT1BTVEFSVFxuIik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogQ2hhcHRlciA4LjguNSAqLworaW50IGFiaXNfbm1fY2hnX2FkbV9zdGF0ZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsIHVfaW50OF90IGkwLAorCQkJICB1X2ludDhfdCBpMSwgdV9pbnQ4X3QgaTIsIGVudW0gYWJpc19ubV9hZG1fc3RhdGUgYWRtX3N0YXRlKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIsIE5NX01UX0NIR19BRE1fU1RBVEUsIG9ial9jbGFzcywgaTAsIGkxLCBpMik7CisJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfQURNX1NUQVRFLCBhZG1fc3RhdGUpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2Nvbm5fbWRyb3BfbGluayhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBlMV9wb3J0MCwgdV9pbnQ4X3QgdHMwLAorCQkJICAgIHVfaW50OF90IGUxX3BvcnQxLCB1X2ludDhfdCB0czEpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90ICphdHRyOworCisJREVCVUdQKEROTSwgIkNPTk5FQ1QgTURST1AgTElOSyBFMT0oJXUsJXUpIC0+IEUxPSgldSwgJXUpXG4iLAorCQllMV9wb3J0MCwgdHMwLCBlMV9wb3J0MSwgdHMxKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDYsIE5NX01UX0NPTk5fTURST1BfTElOSywKKwkJCU5NX09DX1NJVEVfTUFOQUdFUiwgMHgwMCwgMHgwMCwgMHgwMCk7CisKKwlhdHRyID0gbXNnYl9wdXQobXNnLCAzKTsKKwlhdHRyWzBdID0gTk1fQVRUX01EUk9QX0xJTks7CisJYXR0clsxXSA9IGUxX3BvcnQwOworCWF0dHJbMl0gPSB0czA7CisKKwlhdHRyID0gbXNnYl9wdXQobXNnLCAzKTsKKwlhdHRyWzBdID0gTk1fQVRUX01EUk9QX05FWFQ7CisJYXR0clsxXSA9IGUxX3BvcnQxOworCWF0dHJbMl0gPSB0czE7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogQ2hhcHRlciA4LjcuMSAqLworaW50IGFiaXNfbm1fcGVyZm9ybV90ZXN0KHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywKKwkJCSB1X2ludDhfdCBidHNfbnIsIHVfaW50OF90IHRyeF9uciwgdV9pbnQ4X3QgdHNfbnIsCisJCQkgdV9pbnQ4X3QgdGVzdF9uciwgdV9pbnQ4X3QgYXV0b25fcmVwb3J0LAorCQkJIHVfaW50OF90ICpwaHlzX2NvbmZpZywgdV9pbnQxNl90IHBoeXNfY29uZmlnX2xlbikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJaW50IGxlbiA9IDQ7IC8qIDIgVFYgYXR0cmlidXRlcyAqLworCisJREVCVUdQKEROTSwgIlBFRk9STSBURVNUXG4iKTsKKwkKKwlpZiAocGh5c19jb25maWdfbGVuKQorCQlsZW4gKz0gMyArIHBoeXNfY29uZmlnX2xlbjsKKwkKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBsZW4sIE5NX01UX1BFUkZfVEVTVCwKKwkJCW9ial9jbGFzcywgYnRzX25yLCB0cnhfbnIsIHRzX25yKTsKKwltc2diX3R2X3B1dChtc2csIE5NX0FUVF9URVNUX05PLCB0ZXN0X25yKTsKKwltc2diX3R2X3B1dChtc2csIE5NX0FUVF9BVVRPTl9SRVBPUlQsIGF1dG9uX3JlcG9ydCk7CisJaWYgKHBoeXNfY29uZmlnX2xlbikKKwkJbXNnYl90bDE2dl9wdXQobXNnLCBOTV9BVFRfUEhZU19DT05GLCBwaHlzX2NvbmZpZ19sZW4sCisJCQkJcGh5c19jb25maWcpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2V2ZW50X3JlcG9ydHMoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IG9uKQoreworCWlmIChvbiA9PSAwKQorCQlyZXR1cm4gX19zaW1wbGVfY21kKGJ0cywgTk1fTVRfU1RPUF9FVkVOVF9SRVApOworCWVsc2UKKwkJcmV0dXJuIF9fc2ltcGxlX2NtZChidHMsIE5NX01UX1JFU1RfRVZFTlRfUkVQKTsKK30KKworLyogU2llbWVucyAob3IgQlMtMTEpIHNwZWNpZmljIGNvbW1hbmRzICovCisKK2ludCBhYmlzX25tX2JzMTFfYnNjX2Rpc2Nvbm5lY3Qoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IHJlY29ubmVjdCkKK3sKKwlpZiAocmVjb25uZWN0ID09IDApCisJCXJldHVybiBfX3NpbXBsZV9jbWQoYnRzLCBOTV9NVF9CUzExX0RJU0NPTk5FQ1QpOworCWVsc2UKKwkJcmV0dXJuIF9fc2ltcGxlX2NtZChidHMsIE5NX01UX0JTMTFfUkVDT05ORUNUKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9yZXN0YXJ0KHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJcmV0dXJuIF9fc2ltcGxlX2NtZChidHMsIE5NX01UX0JTMTFfUkVTVEFSVCk7Cit9CisKKworc3RydWN0IGJzMTFfZGF0ZV90aW1lIHsKKwl1X2ludDE2X3QJeWVhcjsKKwl1X2ludDhfdAltb250aDsKKwl1X2ludDhfdAlkYXk7CisJdV9pbnQ4X3QJaG91cjsKKwl1X2ludDhfdAltaW47CisJdV9pbnQ4X3QJc2VjOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCit2b2lkIGdldF9iczExX2RhdGVfdGltZShzdHJ1Y3QgYnMxMV9kYXRlX3RpbWUgKmFldCkKK3sKKwl0aW1lX3QgdDsKKwlzdHJ1Y3QgdG0gKnRtOworCisJdCA9IHRpbWUoTlVMTCk7CisJdG0gPSBsb2NhbHRpbWUoJnQpOworCWFldC0+c2VjID0gdG0tPnRtX3NlYzsKKwlhZXQtPm1pbiA9IHRtLT50bV9taW47CisJYWV0LT5ob3VyID0gdG0tPnRtX2hvdXI7CisJYWV0LT5kYXkgPSB0bS0+dG1fbWRheTsKKwlhZXQtPm1vbnRoID0gdG0tPnRtX21vbjsKKwlhZXQtPnllYXIgPSBodG9ucygxOTAwICsgdG0tPnRtX3llYXIpOworfQorCitpbnQgYWJpc19ubV9iczExX3Jlc2V0X3Jlc291cmNlKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJcmV0dXJuIF9fc2ltcGxlX2NtZChidHMsIE5NX01UX0JTMTFfUkVTRVRfUkVTT1VSQ0UpOworfQorCitpbnQgYWJpc19ubV9iczExX2RiX3RyYW5zbWlzc2lvbihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgYmVnaW4pCit7CisJaWYgKGJlZ2luKQorCQlyZXR1cm4gX19zaW1wbGVfY21kKGJ0cywgTk1fTVRfQlMxMV9CRUdJTl9EQl9UWCk7CisJZWxzZQorCQlyZXR1cm4gX19zaW1wbGVfY21kKGJ0cywgTk1fTVRfQlMxMV9FTkRfREJfVFgpOworfQorCitpbnQgYWJpc19ubV9iczExX2NyZWF0ZV9vYmplY3Qoc3RydWN0IGdzbV9idHMgKmJ0cywKKwkJCQllbnVtIGFiaXNfYnMxMV9vYmp0eXBlIHR5cGUsIHVfaW50OF90IGlkeCwKKwkJCQl1X2ludDhfdCBhdHRyX2xlbiwgY29uc3QgdV9pbnQ4X3QgKmF0dHIpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90ICpjdXI7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBhdHRyX2xlbiwgTk1fTVRfQlMxMV9DUkVBVEVfT0JKLAorCQkJTk1fT0NfQlMxMSwgdHlwZSwgMCwgaWR4KTsKKwljdXIgPSBtc2diX3B1dChtc2csIGF0dHJfbGVuKTsKKwltZW1jcHkoY3VyLCBhdHRyLCBhdHRyX2xlbik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9kZWxldGVfb2JqZWN0KHN0cnVjdCBnc21fYnRzICpidHMsCisJCQkJZW51bSBhYmlzX2JzMTFfb2JqdHlwZSB0eXBlLCB1X2ludDhfdCBpZHgpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMCwgTk1fTVRfQlMxMV9ERUxFVEVfT0JKLAorCQkJTk1fT0NfQlMxMSwgdHlwZSwgMCwgaWR4KTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX2NyZWF0ZV9lbnZhQlRTRShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBpZHgpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90IHplcm8gPSAweDAwOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMywgTk1fTVRfQlMxMV9DUkVBVEVfT0JKLAorCQkJTk1fT0NfQlMxMV9FTlZBQlRTRSwgMCwgaWR4LCAweGZmKTsKKwltc2diX3Rsdl9wdXQobXNnLCAweDk5LCAxLCAmemVybyk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9jcmVhdGVfYnBvcnQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgaWR4KQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDAsIE5NX01UX0JTMTFfQ1JFQVRFX09CSiwgTk1fT0NfQlMxMV9CUE9SVCwKKwkJCWlkeCwgMHhmZiwgMHhmZik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9kZWxldGVfYnBvcnQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgaWR4KQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDAsIE5NX01UX0JTMTFfREVMRVRFX09CSiwgTk1fT0NfQlMxMV9CUE9SVCwKKwkJCWlkeCwgMHhmZiwgMHhmZik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworc3RhdGljIGNvbnN0IHVfaW50OF90IHNtX2F0dHJbXSA9IHsgTk1fQVRUX1RFSSwgTk1fQVRUX0FCSVNfQ0hBTk5FTCB9OworaW50IGFiaXNfbm1fYnMxMV9nZXRfb21sX3RlaV90cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIrc2l6ZW9mKHNtX2F0dHIpLCBOTV9NVF9HRVRfQVRUUiwgTk1fT0NfU0lURV9NQU5BR0VSLAorCQkJMHhmZiwgMHhmZiwgMHhmZik7CisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0xJU1RfUkVRX0FUVFIsIHNpemVvZihzbV9hdHRyKSwgc21fYXR0cik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogbGlrZSBhYmlzX25tX2Nvbm5fdGVycl90cmFmICsgc2V0X3RlaSAqLworaW50IGFiaXNfbm1fYnMxMV9jb25uX29tbF90ZWkoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgZTFfcG9ydCwKKwkJCSAgdV9pbnQ4X3QgZTFfdGltZXNsb3QsIHVfaW50OF90IGUxX3N1YnNsb3QsCisJCQkgIHVfaW50OF90IHRlaSkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBhYmlzX25tX2NoYW5uZWwgKmNoOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBzaXplb2YoKmNoKSsyLCBOTV9NVF9CUzExX1NFVF9BVFRSLAorCQkJTk1fT0NfU0lURV9NQU5BR0VSLCAweGZmLCAweGZmLCAweGZmKTsKKworCWNoID0gKHN0cnVjdCBhYmlzX25tX2NoYW5uZWwgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmNoKSk7CisJZmlsbF9ubV9jaGFubmVsKGNoLCBlMV9wb3J0LCBlMV90aW1lc2xvdCwgZTFfc3Vic2xvdCk7CisJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfVEVJLCB0ZWkpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfc2V0X3RyeF9wb3dlcihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgbGV2ZWwpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMywgTk1fTVRfQlMxMV9TRVRfQVRUUiwKKwkJCU5NX09DX0JTMTEsIEJTMTFfT0JKX1BBLCAweDAwLCB0cngtPm5yKTsKKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfQlMxMV9UWFBXUiwgMSwgJmxldmVsKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2codHJ4LT5idHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfZ2V0X3RyeF9wb3dlcihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgYXR0ciA9IE5NX0FUVF9CUzExX1RYUFdSOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMitzaXplb2YoYXR0ciksIE5NX01UX0dFVF9BVFRSLAorCQkJTk1fT0NfQlMxMSwgQlMxMV9PQkpfUEEsIDB4MDAsIHRyeC0+bnIpOworCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9MSVNUX1JFUV9BVFRSLCBzaXplb2YoYXR0ciksICZhdHRyKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2codHJ4LT5idHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfZ2V0X3BsbF9tb2RlKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90IGF0dHJbXSA9IHsgTk1fQVRUX0JTMTFfUExMX01PREUgfTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIrc2l6ZW9mKGF0dHIpLCBOTV9NVF9HRVRfQVRUUiwKKwkJCU5NX09DX0JTMTEsIEJTMTFfT0JKX0xJLCAweDAwLCAweDAwKTsKKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfTElTVF9SRVFfQVRUUiwgc2l6ZW9mKGF0dHIpLCBhdHRyKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX2dldF9jY2xrKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90IGF0dHJbXSA9IHsgTk1fQVRUX0JTMTFfQ0NMS19BQ0NVUkFDWSwKKwkJCSAgICBOTV9BVFRfQlMxMV9DQ0xLX1RZUEUgfTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIrc2l6ZW9mKGF0dHIpLCBOTV9NVF9HRVRfQVRUUiwKKwkJCU5NX09DX0JTMTEsIEJTMTFfT0JKX0NDTEssIDB4MDAsIDB4MDApOworCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9MSVNUX1JFUV9BVFRSLCBzaXplb2YoYXR0ciksIGF0dHIpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7CisKK30KKworLy9zdGF0aWMgY29uc3QgdV9pbnQ4X3QgYnMxMV9sb2dvbl9jN1tdID0geyAweDA3LCAweGQ5LCAweDAxLCAweDExLCAweDBkLCAweDEwLCAweDIwIH07CisKK2ludCBhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgb24pCit7CisJcmV0dXJuIGFiaXNfbm1fYnMxMV9sb2dvbihidHMsIDB4MDIsICJGQUNUT1JZIiwgb24pOworfQorCitpbnQgYWJpc19ubV9iczExX2luZmllbGRfbG9nb24oc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IG9uKQoreworCXJldHVybiBhYmlzX25tX2JzMTFfbG9nb24oYnRzLCAweDAzLCAiRklFTEQgICIsIG9uKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9sb2dvbihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBsZXZlbCwgY29uc3QgY2hhciAqbmFtZSwgaW50IG9uKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYnMxMV9kYXRlX3RpbWUgYmR0OworCisJZ2V0X2JzMTFfZGF0ZV90aW1lKCZiZHQpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWlmIChvbikgeworCQl1X2ludDhfdCBsZW4gPSAzKjIgKyBzaXplb2YoYmR0KQorCQkJCSsgMSArIHN0cmxlbihuYW1lKTsKKwkJZmlsbF9vbV9mb21faGRyKG9oLCBsZW4sIE5NX01UX0JTMTFfTE1UX0xPR09OLAorCQkJCU5NX09DX0JTMTFfQlRTRSwgMHhmZiwgMHhmZiwgMHhmZik7CisJCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9CUzExX0xNVF9MT0dJTl9USU1FLAorCQkJICAgICBzaXplb2YoYmR0KSwgKHVfaW50OF90ICopICZiZHQpOworCQltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfQlMxMV9MTVRfVVNFUl9BQ0NfTEVWLAorCQkJICAgICAxLCAmbGV2ZWwpOworCQltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfQlMxMV9MTVRfVVNFUl9OQU1FLAorCQkJICAgICBzdHJsZW4obmFtZSksICh1X2ludDhfdCAqKW5hbWUpOworCX0gZWxzZSB7CisJCWZpbGxfb21fZm9tX2hkcihvaCwgMCwgTk1fTVRfQlMxMV9MTVRfTE9HT0ZGLAorCQkJCU5NX09DX0JTMTFfQlRTRSwgMHhmZiwgMHhmZiwgMHhmZik7CisJfQorCQorCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX3NldF90cngxX3B3KHN0cnVjdCBnc21fYnRzICpidHMsIGNvbnN0IGNoYXIgKnBhc3N3b3JkKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZzsKKworCWlmIChzdHJsZW4ocGFzc3dvcmQpICE9IDEwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworIAltc2cgPSBubV9tc2diX2FsbG9jKCk7CisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMitzdHJsZW4ocGFzc3dvcmQpLCBOTV9NVF9CUzExX1NFVF9BVFRSLAorCQkJTk1fT0NfQlMxMSwgQlMxMV9PQkpfVFJYMSwgMHgwMCwgMHgwMCk7CisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0JTMTFfUEFTU1dPUkQsIDEwLCAoY29uc3QgdV9pbnQ4X3QgKilwYXNzd29yZCk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogY2hhbmdlIHRoZSBCUy0xMSBQTEwgTW9kZSB0byBlaXRoZXIgbG9ja2VkIChFMSBkZXJpdmVkKSBvciBzdGFuZGFsb25lICovCitpbnQgYWJpc19ubV9iczExX3NldF9wbGxfbG9ja2VkKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBsb2NrZWQpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXVfaW50OF90IHRsdl92YWx1ZTsKKwkKKwltc2cgPSBubV9tc2diX2FsbG9jKCk7CisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMywgTk1fTVRfQlMxMV9TRVRfQVRUUiwgTk1fT0NfQlMxMSwKKwkJCUJTMTFfT0JKX0xJLCAweDAwLCAweDAwKTsKKworCWlmIChsb2NrZWQpCisJCXRsdl92YWx1ZSA9IEJTMTFfTElfUExMX0xPQ0tFRDsKKwllbHNlCisJCXRsdl92YWx1ZSA9IEJTMTFfTElfUExMX1NUQU5EQUxPTkU7CisJCisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0JTMTFfUExMX01PREUsIDEsICZ0bHZfdmFsdWUpOworCQorCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisvKiBTZXQgdGhlIGNhbGlicmF0aW9uIHZhbHVlIG9mIHRoZSBQTEwgKHdvcmsgdmFsdWUvc2V0IHZhbHVlKQorICogSXQgZGVwZW5kcyBvbiB0aGUgbG9naW4gd2hpY2ggb25lIGlzIGNoYW5nZWQgKi8KK2ludCBhYmlzX25tX2JzMTFfc2V0X3BsbChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgdmFsdWUpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXVfaW50OF90IHRsdl92YWx1ZVsyXTsKKworCW1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAzLCBOTV9NVF9CUzExX1NFVF9BVFRSLCBOTV9PQ19CUzExLAorCQkJQlMxMV9PQkpfVFJYMSwgMHgwMCwgMHgwMCk7CisKKwl0bHZfdmFsdWVbMF0gPSB2YWx1ZT4+ODsKKwl0bHZfdmFsdWVbMV0gPSB2YWx1ZSYweGZmOworCisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0JTMTFfUExMLCAyLCB0bHZfdmFsdWUpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfZ2V0X3N0YXRlKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJcmV0dXJuIF9fc2ltcGxlX2NtZChidHMsIE5NX01UX0JTMTFfR0VUX1NUQVRFKTsKK30KKworLyogQlMxMSBTV0wgKi8KKwordm9pZCAqdGFsbF9mbGVfY3R4OworCitzdHJ1Y3QgYWJpc19ubV9iczExX3N3IHsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCWNoYXIgc3dsX2ZuYW1lW1BBVEhfTUFYXTsKKwl1X2ludDhfdCB3aW5fc2l6ZTsKKwlpbnQgZm9yY2VkOworCXN0cnVjdCBsbGlzdF9oZWFkIGZpbGVfbGlzdDsKKwlnc21fY2JmbiAqdXNlcl9jYjsJLyogc3BlY2lmaWVkIGJ5IHRoZSB1c2VyICovCit9Oworc3RhdGljIHN0cnVjdCBhYmlzX25tX2JzMTFfc3cgX2dfYnMxMV9zdywgKmdfYnMxMV9zdyA9ICZfZ19iczExX3N3OworCitzdHJ1Y3QgZmlsZV9saXN0X2VudHJ5IHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCWNoYXIgZm5hbWVbUEFUSF9NQVhdOworfTsKKworc3RydWN0IGZpbGVfbGlzdF9lbnRyeSAqZmxfZGVxdWV1ZShzdHJ1Y3QgbGxpc3RfaGVhZCAqcXVldWUpCit7CisJc3RydWN0IGxsaXN0X2hlYWQgKmxoOworCisJaWYgKGxsaXN0X2VtcHR5KHF1ZXVlKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlsaCA9IHF1ZXVlLT5uZXh0OworCWxsaXN0X2RlbChsaCk7CisJCisJcmV0dXJuIGxsaXN0X2VudHJ5KGxoLCBzdHJ1Y3QgZmlsZV9saXN0X2VudHJ5LCBsaXN0KTsKK30KKworc3RhdGljIGludCBiczExX3JlYWRfc3dsX2ZpbGUoc3RydWN0IGFiaXNfbm1fYnMxMV9zdyAqYnMxMV9zdykKK3sKKwljaGFyIGxpbmVidWZbMjU1XTsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCAqbGgsICpsaDI7CisJRklMRSAqc3dsOworCWludCByYyA9IDA7CisKKwlzd2wgPSBmb3BlbihiczExX3N3LT5zd2xfZm5hbWUsICJyIik7CisJaWYgKCFzd2wpCisJCXJldHVybiAtRU5PREVWOworCisJLyogemVybyB0aGUgc3RhbGUgZmlsZSBsaXN0LCBpZiBhbnkgKi8KKwlsbGlzdF9mb3JfZWFjaF9zYWZlKGxoLCBsaDIsICZiczExX3N3LT5maWxlX2xpc3QpIHsKKwkJbGxpc3RfZGVsKGxoKTsKKwkJdGFsbG9jX2ZyZWUobGgpOworCX0KKworCXdoaWxlIChmZ2V0cyhsaW5lYnVmLCBzaXplb2YobGluZWJ1ZiksIHN3bCkpIHsKKwkJY2hhciBmaWxlX2lkWzEyKzFdOworCQljaGFyIGZpbGVfdmVyc2lvbls4MCsxXTsKKwkJc3RydWN0IGZpbGVfbGlzdF9lbnRyeSAqZmxlOworCQlzdGF0aWMgY2hhciBkaXJbUEFUSF9NQVhdOworCisJCWlmIChzdHJsZW4obGluZWJ1ZikgPCA0KQorCQkJY29udGludWU7CisJCisJCXJjID0gc3NjYW5mKGxpbmVidWYrNCwgIiUxMnM6JTgwc1xyXG4iLCBmaWxlX2lkLCBmaWxlX3ZlcnNpb24pOworCQlpZiAocmMgPCAwKSB7CisJCQlwZXJyb3IoIkVSUiBwYXJzaW5nIFNXTCBmaWxlIik7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAocmMgPCAyKQorCQkJY29udGludWU7CisKKwkJZmxlID0gdGFsbG9jX3plcm8odGFsbF9mbGVfY3R4LCBzdHJ1Y3QgZmlsZV9saXN0X2VudHJ5KTsKKwkJaWYgKCFmbGUpIHsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogY29uc3RydWN0IG5ldyBmaWxlbmFtZSAqLworCQlzdHJuY3B5KGRpciwgYnMxMV9zdy0+c3dsX2ZuYW1lLCBzaXplb2YoZGlyKSk7CisJCXN0cm5jYXQoZmxlLT5mbmFtZSwgZGlybmFtZShkaXIpLCBzaXplb2YoZmxlLT5mbmFtZSkgLSAxKTsKKwkJc3RyY2F0KGZsZS0+Zm5hbWUsICIvIik7CisJCXN0cm5jYXQoZmxlLT5mbmFtZSwgZmlsZV9pZCwgc2l6ZW9mKGZsZS0+Zm5hbWUpIC0gMSAtc3RybGVuKGZsZS0+Zm5hbWUpKTsKKwkJCisJCWxsaXN0X2FkZF90YWlsKCZmbGUtPmxpc3QsICZiczExX3N3LT5maWxlX2xpc3QpOworCX0KKworb3V0OgorCWZjbG9zZShzd2wpOworCXJldHVybiByYzsKK30KKworLyogYnMxMSBzd2xvYWQgc3BlY2lmaWMgY2FsbGJhY2ssIHBhc3NlZCB0byBhYmlzX25tIGNvcmUgc3dsb2FkICovCitzdGF0aWMgaW50IGJzMTFfc3dsb2FkX2NiZm4odW5zaWduZWQgaW50IGhvb2ssIHVuc2lnbmVkIGludCBldmVudCwKKwkJCSAgICBzdHJ1Y3QgbXNnYiAqbXNnLCB2b2lkICpkYXRhLCB2b2lkICpwYXJhbSkKK3sKKwlzdHJ1Y3QgYWJpc19ubV9iczExX3N3ICpiczExX3N3ID0gZGF0YTsKKwlzdHJ1Y3QgZmlsZV9saXN0X2VudHJ5ICpmbGU7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE5NX01UX0xPQURfRU5EX0FDSzoKKwkJZmxlID0gZmxfZGVxdWV1ZSgmYnMxMV9zdy0+ZmlsZV9saXN0KTsKKwkJaWYgKGZsZSkgeworCQkJLyogc3RhcnQgZG93bmxvYWQgdGhlIG5leHQgZmlsZSBvZiBvdXIgZmlsZSBsaXN0ICovCisJCQlyYyA9IGFiaXNfbm1fc29mdHdhcmVfbG9hZChiczExX3N3LT5idHMsIDB4ZmYsIGZsZS0+Zm5hbWUsCisJCQkJCQkgICBiczExX3N3LT53aW5fc2l6ZSwKKwkJCQkJCSAgIGJzMTFfc3ctPmZvcmNlZCwKKwkJCQkJCSAgICZiczExX3N3bG9hZF9jYmZuLCBiczExX3N3KTsKKwkJCXRhbGxvY19mcmVlKGZsZSk7CisJCX0gZWxzZSB7CisJCQkvKiBhY3RpdmF0ZSB0aGUgU1dMICovCisJCQlyYyA9IGFiaXNfbm1fc29mdHdhcmVfYWN0aXZhdGUoYnMxMV9zdy0+YnRzLAorCQkJCQkJCWJzMTFfc3ctPnN3bF9mbmFtZSwKKwkJCQkJCQliczExX3N3bG9hZF9jYmZuLAorCQkJCQkJCWJzMTFfc3cpOworCQl9CisJCWJyZWFrOworCWNhc2UgTk1fTVRfTE9BRF9TRUdfQUNLOgorCWNhc2UgTk1fTVRfTE9BRF9FTkRfTkFDSzoKKwljYXNlIE5NX01UX0xPQURfSU5JVF9BQ0s6CisJY2FzZSBOTV9NVF9MT0FEX0lOSVRfTkFDSzoKKwljYXNlIE5NX01UX0FDVElWQVRFX1NXX05BQ0s6CisJY2FzZSBOTV9NVF9BQ1RJVkFURV9TV19BQ0s6CisJZGVmYXVsdDoKKwkJLyogZmFsbHRocm91Z2ggdG8gdGhlIHVzZXIgY2FsbGJhY2sgKi8KKwkJaWYgKGJzMTFfc3ctPnVzZXJfY2IpCisJCQlyYyA9IGJzMTFfc3ctPnVzZXJfY2IoaG9vaywgZXZlbnQsIG1zZywgTlVMTCwgTlVMTCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworLyogU2llbWVucyBwcm92aWRlcyBhIFNXTCBmaWxlIHRoYXQgaXMgYSBtZXJlIGxpc3Rpbmcgb2YgYWxsIHRoZSBvdGhlcgorICogZmlsZXMgdGhhdCBhcmUgcGFydCBvZiBhIHNvZnR3YXJlIHJlbGVhc2UuICBXZSBuZWVkIHRvIHVwbG9hZCBmaXJzdAorICogdGhlIGxpc3QgZmlsZSwgYW5kIHRoZW4gZWFjaCBmaWxlIHRoYXQgaXMgbGlzdGVkIGluIHRoZSBsaXN0IGZpbGUgKi8KK2ludCBhYmlzX25tX2JzMTFfbG9hZF9zd2woc3RydWN0IGdzbV9idHMgKmJ0cywgY29uc3QgY2hhciAqZm5hbWUsCisJCQkgIHVfaW50OF90IHdpbl9zaXplLCBpbnQgZm9yY2VkLCBnc21fY2JmbiAqY2JmbikKK3sKKwlzdHJ1Y3QgYWJpc19ubV9iczExX3N3ICpiczExX3N3ID0gZ19iczExX3N3OworCXN0cnVjdCBmaWxlX2xpc3RfZW50cnkgKmZsZTsKKwlpbnQgcmMgPSAwOworCisJSU5JVF9MTElTVF9IRUFEKCZiczExX3N3LT5maWxlX2xpc3QpOworCWJzMTFfc3ctPmJ0cyA9IGJ0czsKKwliczExX3N3LT53aW5fc2l6ZSA9IHdpbl9zaXplOworCWJzMTFfc3ctPnVzZXJfY2IgPSBjYmZuOworCWJzMTFfc3ctPmZvcmNlZCA9IGZvcmNlZDsKKworCXN0cm5jcHkoYnMxMV9zdy0+c3dsX2ZuYW1lLCBmbmFtZSwgc2l6ZW9mKGJzMTFfc3ctPnN3bF9mbmFtZSkpOworCXJjID0gYnMxMV9yZWFkX3N3bF9maWxlKGJzMTFfc3cpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCS8qIGRlcXVldWUgbmV4dCBpdGVtIGluIGZpbGUgbGlzdCAqLworCWZsZSA9IGZsX2RlcXVldWUoJmJzMTFfc3ctPmZpbGVfbGlzdCk7CisJaWYgKCFmbGUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogc3RhcnQgZG93bmxvYWQgdGhlIG5leHQgZmlsZSBvZiBvdXIgZmlsZSBsaXN0ICovCisJcmMgPSBhYmlzX25tX3NvZnR3YXJlX2xvYWQoYnRzLCAweGZmLCBmbGUtPmZuYW1lLCB3aW5fc2l6ZSwgZm9yY2VkLAorCQkJCSAgIGJzMTFfc3dsb2FkX2NiZm4sIGJzMTFfc3cpOworCXRhbGxvY19mcmVlKGZsZSk7CisJcmV0dXJuIHJjOworfQorCisjaWYgMAorc3RhdGljIHVfaW50OF90IHJlcV9hdHRyX2J0c2VbXSA9IHsKKwlOTV9BVFRfQURNX1NUQVRFLCBOTV9BVFRfQlMxMV9MTVRfTE9HT05fU0VTU0lPTiwKKwlOTV9BVFRfQlMxMV9MTVRfTE9HSU5fVElNRSwgTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFViwKKwlOTV9BVFRfQlMxMV9MTVRfVVNFUl9OQU1FLAorCisJMHhhZiwgTk1fQVRUX0JTMTFfUlhfT0ZGU0VULCBOTV9BVFRfQlMxMV9WRU5ET1JfTkFNRSwKKworCU5NX0FUVF9CUzExX1NXX0xPQURfSU5URU5ERUQsIE5NX0FUVF9CUzExX1NXX0xPQURfU0FGRVRZLAorCisJTk1fQVRUX0JTMTFfU1dfTE9BRF9TVE9SRUQgfTsKKworc3RhdGljIHVfaW50OF90IHJlcV9hdHRyX2J0c21bXSA9IHsKKwlOTV9BVFRfQUJJU19DSEFOTkVMLCBOTV9BVFRfVEVJLCBOTV9BVFRfQlMxMV9BQklTX0VYVF9USU1FLAorCU5NX0FUVF9BRE1fU1RBVEUsIE5NX0FUVF9BVkFJTF9TVEFUVVMsIDB4Y2UsIE5NX0FUVF9GSUxFX0lELAorCU5NX0FUVF9GSUxFX1ZFUlNJT04sIE5NX0FUVF9PUEVSX1NUQVRFLCAweGU4LCBOTV9BVFRfQlMxMV9BTExfVEVTVF9DQVRHLAorCU5NX0FUVF9TV19ERVNDUiwgTk1fQVRUX0dFVF9BUkkgfTsKKyNlbmRpZgorCQorc3RhdGljIHVfaW50OF90IHJlcV9hdHRyW10gPSB7CisJTk1fQVRUX0FETV9TVEFURSwgTk1fQVRUX0FWQUlMX1NUQVRVUywgMHhhOCwgTk1fQVRUX09QRVJfU1RBVEUsCisJMHhkNSwgMHhhMSwgTk1fQVRUX0JTMTFfRVNOX0ZXX0NPREVfTk8sIE5NX0FUVF9CUzExX0VTTl9IV19DT0RFX05PLAorCTB4NDIsIE5NX0FUVF9CUzExX0VTTl9QQ0JfU0VSSUFMLCBOTV9BVFRfQlMxMV9QTEwgfTsKKworaW50IGFiaXNfbm1fYnMxMV9nZXRfc2Vybm8oc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJLyogU2llbWVuc0hXIENDVFJMIG9iamVjdCAqLworCWZpbGxfb21fZm9tX2hkcihvaCwgMitzaXplb2YocmVxX2F0dHIpLCBOTV9NVF9HRVRfQVRUUiwgTk1fT0NfQlMxMSwKKwkJCTB4MDMsIDB4MDAsIDB4MDApOworCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9MSVNUX1JFUV9BVFRSLCBzaXplb2YocmVxX2F0dHIpLCByZXFfYXR0cik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9zZXRfZXh0X3RpbWUoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJc3RydWN0IGJzMTFfZGF0ZV90aW1lIGFldDsKKworCWdldF9iczExX2RhdGVfdGltZSgmYWV0KTsKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJLyogU2llbWVuc0hXIENDVFJMIG9iamVjdCAqLworCWZpbGxfb21fZm9tX2hkcihvaCwgMitzaXplb2YoYWV0KSwgTk1fTVRfQlMxMV9TRVRfQVRUUiwgTk1fT0NfU0lURV9NQU5BR0VSLAorCQkJMHhmZiwgMHhmZiwgMHhmZik7CisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0JTMTFfQUJJU19FWFRfVElNRSwgc2l6ZW9mKGFldCksICh1X2ludDhfdCAqKSAmYWV0KTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX3NldF9icG9ydF9saW5lX2NmZyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBicG9ydCwgZW51bSBhYmlzX2JzMTFfbGluZV9jZmcgbGluZV9jZmcpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXN0cnVjdCBiczExX2RhdGVfdGltZSBhZXQ7CisKKwlnZXRfYnMxMV9kYXRlX3RpbWUoJmFldCk7CisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMiwgTk1fTVRfQlMxMV9TRVRfQVRUUiwgTk1fT0NfQlMxMV9CUE9SVCwKKwkJCWJwb3J0LCAweGZmLCAweDAyKTsKKwltc2diX3R2X3B1dChtc2csIE5NX0FUVF9CUzExX0xJTkVfQ0ZHLCBsaW5lX2NmZyk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogaXAuYWNjZXNzIG5hbm9CVFMgc3BlY2lmaWMgY29tbWFuZHMgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGlwYWNjZXNzX21hZ2ljW10gPSAiY29tLmlwYWNjZXNzIjsKKworCitzdGF0aWMgaW50IGFiaXNfbm1fcnhfaXBhY2Moc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oID0gbXNnYl9sMihtc2cpOworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaDsKKwl1X2ludDhfdCBpZHN0cmxlbiA9IG9oLT5kYXRhWzBdOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBpcGFjY19hY2tfc2lnbmFsX2RhdGEgc2lnbmFsOworCisJaWYgKHN0cm5jbXAoKGNoYXIgKikmb2gtPmRhdGFbMV0sIGlwYWNjZXNzX21hZ2ljLCBpZHN0cmxlbikpIHsKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJpZCBzdHJpbmcgaXMgbm90IGNvbS5pcGFjY2VzcyAhPyFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmb2ggPSAoc3RydWN0IGFiaXNfb21fZm9tX2hkciAqKSAob2gtPmRhdGEgKyAxICsgaWRzdHJsZW4pOworCWFiaXNfbm1fdGx2X3BhcnNlKCZ0cCwgbXNnLT50cngtPmJ0cywgZm9oLT5kYXRhLCBvaC0+bGVuZ3RoLXNpemVvZigqZm9oKSk7CisKKwlkZWJ1Z3BfZm9oKGZvaCk7CisKKwlERUJVR1BDKEROTSwgIklQQUNDRVNTKDB4JTAyeCk6ICIsIGZvaC0+bXNnX3R5cGUpOworCisJc3dpdGNoIChmb2gtPm1zZ190eXBlKSB7CisJY2FzZSBOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVF9BQ0s6CisJCURFQlVHUEMoRE5NLCAiUlNMIENPTk5FQ1QgQUNLICIpOworCQlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX0lQQUNDX0RTVF9JUCkpCisJCQlERUJVR1BDKEROTSwgIklQPSVzICIsCisJCQkJaW5ldF9udG9hKCooKHN0cnVjdCBpbl9hZGRyICopCisJCQkJCVRMVlBfVkFMKCZ0cCwgTk1fQVRUX0lQQUNDX0RTVF9JUCkpKSk7CisJCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfSVBBQ0NfRFNUX0lQX1BPUlQpKQorCQkJREVCVUdQQyhETk0sICJQT1JUPSV1ICIsCisJCQkJbnRvaHMoKigodV9pbnQxNl90ICopCisJCQkJCVRMVlBfVkFMKCZ0cCwgTk1fQVRUX0lQQUNDX0RTVF9JUF9QT1JUKSkpKTsKKwkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9JUEFDQ19TVFJFQU1fSUQpKQorCQkJREVCVUdQQyhETk0sICJTVFJFQU09MHglMDJ4ICIsCisJCQkJCSpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9JUEFDQ19TVFJFQU1fSUQpKTsKKwkJREVCVUdQQyhETk0sICJcbiIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX1JTTF9DT05ORUNUX05BQ0s6CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiUlNMIENPTk5FQ1QgTkFDSyAiKTsKKwkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9OQUNLX0NBVVNFUykpCisJCQlERUJVR1BDKEROTSwgIiBDQVVTRT0lc1xuIiwKKwkJCQluYWNrX2NhdXNlX25hbWUoKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkpOworCQllbHNlCisJCQlERUJVR1BDKEROTSwgIlxuIik7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfSVBBQ0NfU0VUX05WQVRUUl9BQ0s6CisJCURFQlVHUEMoRE5NLCAiU0VUIE5WQVRUUiBBQ0tcbiIpOworCQkvKiBGSVhNRTogZGVjb2RlIGFuZCBzaG93IHRoZSBhY3R1YWwgYXR0cmlidXRlcyAqLworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX1NFVF9OVkFUVFJfTkFDSzoKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJTRVQgTlZBVFRSIE5BQ0sgIik7CisJCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfTkFDS19DQVVTRVMpKQorCQkJTE9HUEMoRE5NLCBMT0dMX0VSUk9SLCAiIENBVVNFPSVzXG4iLAorCQkJCW5hY2tfY2F1c2VfbmFtZSgqVExWUF9WQUwoJnRwLCBOTV9BVFRfTkFDS19DQVVTRVMpKSk7CisJCWVsc2UKKwkJCUxPR1BDKEROTSwgTE9HTF9FUlJPUiwgIlxuIik7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfSVBBQ0NfR0VUX05WQVRUUl9BQ0s6CisJCURFQlVHUEMoRE5NLCAiR0VUIE5WQVRUUiBBQ0tcbiIpOworCQkvKiBGSVhNRTogZGVjb2RlIGFuZCBzaG93IHRoZSBhY3R1YWwgYXR0cmlidXRlcyAqLworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX0dFVF9OVkFUVFJfTkFDSzoKKwkJTE9HUEMoRE5NLCBMT0dMX0VSUk9SLCAiR0VUIE5WQVRUUiBOQUNLICIpOworCQlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkKKwkJCUxPR1BDKEROTSwgTE9HTF9FUlJPUiwgIiBDQVVTRT0lc1xuIiwKKwkJCQluYWNrX2NhdXNlX25hbWUoKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkpOworCQllbHNlCisJCQlMT0dQQyhETk0sIExPR0xfRVJST1IsICJcbiIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX1NFVF9BVFRSX0FDSzoKKwkJREVCVUdQQyhETk0sICJTRVQgQVRUUiBBQ0tcbiIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX1NFVF9BVFRSX05BQ0s6CisJCUxPR1BDKEROTSwgTE9HTF9FUlJPUiwgIlNFVCBBVFRSIE5BQ0sgIik7CisJCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfTkFDS19DQVVTRVMpKQorCQkJTE9HUEMoRE5NLCBMT0dMX0VSUk9SLCAiIENBVVNFPSVzXG4iLAorCQkJCW5hY2tfY2F1c2VfbmFtZSgqVExWUF9WQUwoJnRwLCBOTV9BVFRfTkFDS19DQVVTRVMpKSk7CisJCWVsc2UKKwkJCUxPR1BDKEROTSwgTE9HTF9FUlJPUiwgIlxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUEMoRE5NLCAidW5rbm93blxuIik7CisJCWJyZWFrOworCX0KKworCS8qIHNpZ25hbCBoYW5kbGluZyAqLworCXN3aXRjaCAgKGZvaC0+bXNnX3R5cGUpIHsKKwljYXNlIE5NX01UX0lQQUNDX1JTTF9DT05ORUNUX05BQ0s6CisJY2FzZSBOTV9NVF9JUEFDQ19TRVRfTlZBVFRSX05BQ0s6CisJY2FzZSBOTV9NVF9JUEFDQ19HRVRfTlZBVFRSX05BQ0s6CisJCXNpZ25hbC50cnggPSBnc21fYnRzX3RyeF9ieV9ucihtc2ctPnRyeC0+YnRzLCBmb2gtPm9ial9pbnN0LnRyeF9ucik7CisJCXNpZ25hbC5tc2dfdHlwZSA9IGZvaC0+bXNnX3R5cGU7CisJCWRpc3BhdGNoX3NpZ25hbChTU19OTSwgU19OTV9JUEFDQ19OQUNLLCAmc2lnbmFsKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19TRVRfTlZBVFRSX0FDSzoKKwkJc2lnbmFsLnRyeCA9IGdzbV9idHNfdHJ4X2J5X25yKG1zZy0+dHJ4LT5idHMsIGZvaC0+b2JqX2luc3QudHJ4X25yKTsKKwkJc2lnbmFsLm1zZ190eXBlID0gZm9oLT5tc2dfdHlwZTsKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX05NLCBTX05NX0lQQUNDX0FDSywgJnNpZ25hbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisvKiBzZW5kIGFuIGlwLWFjY2VzcyBtYW51ZmFjdHVyZXIgc3BlY2lmaWMgbWVzc2FnZSAqLworaW50IGFiaXNfbm1faXBhY2Nlc3NfbXNnKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG1zZ190eXBlLAorCQkJIHVfaW50OF90IG9ial9jbGFzcywgdV9pbnQ4X3QgYnRzX25yLAorCQkJIHVfaW50OF90IHRyeF9uciwgdV9pbnQ4X3QgdHNfbnIsCisJCQkgdV9pbnQ4X3QgKmF0dHIsIGludCBhdHRyX2xlbikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oOworCXVfaW50OF90ICpkYXRhOworCisJLyogY29uc3RydWN0IHRoZSAxMi4yMSBPTSBoZWFkZXIsIG9ic2VydmUgdGhlIGVycm9uZW91cyBsZW5ndGggKi8KKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKm9oKSk7CisJZmlsbF9vbV9oZHIob2gsIHNpemVvZigqZm9oKSArIGF0dHJfbGVuKTsKKwlvaC0+bWRpc2MgPSBBQklTX09NX01ESVNDX01BTlVGOworCisJLyogYWRkIHRoZSBpcC5hY2Nlc3MgbWFnaWMgKi8KKwlkYXRhID0gbXNnYl9wdXQobXNnLCBzaXplb2YoaXBhY2Nlc3NfbWFnaWMpKzEpOworCSpkYXRhKysgPSBzaXplb2YoaXBhY2Nlc3NfbWFnaWMpOworCW1lbWNweShkYXRhLCBpcGFjY2Vzc19tYWdpYywgc2l6ZW9mKGlwYWNjZXNzX21hZ2ljKSk7CisKKwkvKiBmaWxsIHRoZSAxMi4yMSBGT00gaGVhZGVyICovCisJZm9oID0gKHN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmZvaCkpOworCWZvaC0+bXNnX3R5cGUgPSBtc2dfdHlwZTsKKwlmb2gtPm9ial9jbGFzcyA9IG9ial9jbGFzczsKKwlmb2gtPm9ial9pbnN0LmJ0c19uciA9IGJ0c19ucjsKKwlmb2gtPm9ial9pbnN0LnRyeF9uciA9IHRyeF9ucjsKKwlmb2gtPm9ial9pbnN0LnRzX25yID0gdHNfbnI7CisKKwlpZiAoYXR0ciAmJiBhdHRyX2xlbikgeworCQlkYXRhID0gbXNnYl9wdXQobXNnLCBhdHRyX2xlbik7CisJCW1lbWNweShkYXRhLCBhdHRyLCBhdHRyX2xlbik7CisJfQorCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKy8qIHNldCBzb21lIGF0dHJpYnV0ZXMgaW4gTlZSQU0gKi8KK2ludCBhYmlzX25tX2lwYWNjZXNzX3NldF9udmF0dHIoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90ICphdHRyLAorCQkJCWludCBhdHRyX2xlbikKK3sKKwlyZXR1cm4gYWJpc19ubV9pcGFjY2Vzc19tc2codHJ4LT5idHMsIE5NX01UX0lQQUNDX1NFVF9OVkFUVFIsCisJCQkJICAgIE5NX09DX0JBU0VCX1RSQU5TQywgMCwgdHJ4LT5uciwgMHhmZiwgYXR0ciwKKwkJCQkgICAgYXR0cl9sZW4pOworfQorCitpbnQgYWJpc19ubV9pcGFjY2Vzc19yc2xfY29ubmVjdChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwKKwkJCQkgdV9pbnQzMl90IGlwLCB1X2ludDE2X3QgcG9ydCwgdV9pbnQ4X3Qgc3RyZWFtKQoreworCXN0cnVjdCBpbl9hZGRyIGlhOworCXVfaW50OF90IGF0dHJbXSA9IHsgTk1fQVRUX0lQQUNDX1NUUkVBTV9JRCwgMCwKKwkJCSAgICBOTV9BVFRfSVBBQ0NfRFNUX0lQX1BPUlQsIDAsIDAsCisJCQkgICAgTk1fQVRUX0lQQUNDX0RTVF9JUCwgMCwgMCwgMCwgMCB9OworCisJaW50IGF0dHJfbGVuID0gc2l6ZW9mKGF0dHIpOworCisJaWEuc19hZGRyID0gaHRvbmwoaXApOworCWF0dHJbMV0gPSBzdHJlYW07CisJYXR0clszXSA9IHBvcnQgPj4gODsKKwlhdHRyWzRdID0gcG9ydCAmIDB4ZmY7CisJKih1X2ludDMyX3QgKikoYXR0cis2KSA9IGlhLnNfYWRkcjsKKworCS8qIGlmIGlwID09IDAsIHdlIHVzZSB0aGUgZGVmYXVsdCBJUCAqLworCWlmIChpcCA9PSAwKQorCQlhdHRyX2xlbiAtPSA1OworCisJREVCVUdQKEROTSwgImlwLmFjY2VzcyBSU0wgQ09OTkVDVCBJUD0lcyBQT1JUPSV1IFNUUkVBTT0weCUwMnhcbiIsCisJCWluZXRfbnRvYShpYSksIHBvcnQsIHN0cmVhbSk7CisKKwlyZXR1cm4gYWJpc19ubV9pcGFjY2Vzc19tc2codHJ4LT5idHMsIE5NX01UX0lQQUNDX1JTTF9DT05ORUNULAorCQkJCSAgICBOTV9PQ19CQVNFQl9UUkFOU0MsIHRyeC0+YnRzLT5idHNfbnIsCisJCQkJICAgIHRyeC0+bnIsIDB4ZmYsIGF0dHIsIGF0dHJfbGVuKTsKK30KKworLyogcmVzdGFydCAvIHJlYm9vdCBhbiBpcC5hY2Nlc3MgbmFub0JUUyAqLworaW50IGFiaXNfbm1faXBhY2Nlc3NfcmVzdGFydChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAwLCBOTV9NVF9JUEFDQ19SRVNUQVJULCBOTV9PQ19CQVNFQl9UUkFOU0MsCisJCQl0cngtPmJ0cy0+bnIsIHRyeC0+bnIsIDB4ZmYpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyh0cngtPmJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1faXBhY2Nlc3Nfc2V0X2F0dHIoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLAorCQkJCXVfaW50OF90IGJ0c19uciwgdV9pbnQ4X3QgdHJ4X25yLCB1X2ludDhfdCB0c19uciwKKwkJCQl1X2ludDhfdCAqYXR0ciwgdV9pbnQ4X3QgYXR0cl9sZW4pCit7CisJcmV0dXJuIGFiaXNfbm1faXBhY2Nlc3NfbXNnKGJ0cywgTk1fTVRfSVBBQ0NfU0VUX0FUVFIsCisJCQkJICAgIG9ial9jbGFzcywgYnRzX25yLCB0cnhfbnIsIHRzX25yLAorCQkJCSAgICAgYXR0ciwgYXR0cl9sZW4pOworfQorCit2b2lkIGFiaXNfbm1faXBhY2Nlc3NfY2dpKHVfaW50OF90ICpidWYsIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJLyogd2Ugc2ltcGx5IHJldXNlIHRoZSBHU000OCBmdW5jdGlvbiBhbmQgb3ZlcndyaXRlIHRoZSBSQUMKKwkgKiB3aXRoIHRoZSBDZWxsIElEICovCisJZ3NtNDhfcmFfaWRfYnlfYnRzKGJ1ZiwgYnRzKTsKKwkqKCh1X2ludDE2X3QgKikoYnVmICsgNSkpID0gaHRvbnMoYnRzLT5jZWxsX2lkZW50aXR5KTsKK30KKwordm9pZCBnc21fdHJ4X2xvY2tfcmYoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIGludCBsb2NrZWQpCit7CisJaW50IG5ld19zdGF0ZSA9IGxvY2tlZCA/IE5NX1NUQVRFX0xPQ0tFRCA6IE5NX1NUQVRFX1VOTE9DS0VEOworCisJdHJ4LT5ubV9zdGF0ZS5hZG1pbmlzdHJhdGl2ZSA9IG5ld19zdGF0ZTsKKwlpZiAoIXRyeC0+YnRzIHx8ICF0cngtPmJ0cy0+b21sX2xpbmspCisJCXJldHVybjsKKworCWFiaXNfbm1fY2hnX2FkbV9zdGF0ZSh0cngtPmJ0cywgTk1fT0NfUkFESU9fQ0FSUklFUiwKKwkJCSAgICAgIHRyeC0+YnRzLT5idHNfbnIsIHRyeC0+bnIsIDB4ZmYsCisJCQkgICAgICBuZXdfc3RhdGUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBpcGFjY190ZXN0cmVzX25hbWVzW10gPSB7CisJeyBOTV9JUEFDQ19URVNUUkVTX1NVQ0NFU1MsCSJTVUNDRVNTIiB9LAorCXsgTk1fSVBBQ0NfVEVTVFJFU19USU1FT1VULAkiVElNRU9VVCIgfSwKKwl7IE5NX0lQQUNDX1RFU1RSRVNfTk9fQ0hBTlMsCSJOTyBDSEFOTkVMUyIgfSwKKwl7IE5NX0lQQUNDX1RFU1RSRVNfUEFSVElBTCwJIlBBUlRJQUwiIH0sCisJeyBOTV9JUEFDQ19URVNUUkVTX1NUT1BQRUQsCSJTVE9QUEVEIiB9LAorCXsgMCwJCQkJTlVMTCB9Cit9OworCitjb25zdCBjaGFyICppcGFjY190ZXN0cmVzX25hbWUodV9pbnQ4X3QgcmVzKQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKGlwYWNjX3Rlc3RyZXNfbmFtZXMsIHJlcyk7Cit9CisKK3ZvaWQgaXBhY19wYXJzZV9jZ2koc3RydWN0IGNlbGxfZ2xvYmFsX2lkICpjaWQsIGNvbnN0IHVfaW50OF90ICpidWYpCit7CisJY2lkLT5tY2MgPSAoYnVmWzBdICYgMHhmKSAqIDEwMDsKKwljaWQtPm1jYyArPSAoYnVmWzBdID4+IDQpICogIDEwOworCWNpZC0+bWNjICs9IChidWZbMV0gJiAweGYpICogIDE7CisKKwlpZiAoYnVmWzFdID4+IDQgPT0gMHhmKSB7CisJCWNpZC0+bW5jID0gKGJ1ZlsyXSAmIDB4ZikgKiAxMDsKKwkJY2lkLT5tbmMgKz0gKGJ1ZlsyXSA+PiA0KSAqICAxOworCX0gZWxzZSB7CisJCWNpZC0+bW5jID0gKGJ1ZlsyXSAmIDB4ZikgKiAxMDA7CisJCWNpZC0+bW5jICs9IChidWZbMl0gPj4gNCkgKiAgMTA7CisJCWNpZC0+bW5jICs9IChidWZbMV0gPj4gNCkgKiAgIDE7CisJfQorCisJY2lkLT5sYWMgPSBudG9ocygqKCh1X2ludDE2X3QgKikmYnVmWzNdKSk7CisJY2lkLT5jaSA9IG50b2hzKCooKHVfaW50MTZfdCAqKSZidWZbNV0pKTsKK30KKworLyogcGFyc2UgQkNDSCBpbmZvcm1hdGlvbiBJRUkgZnJvbSB3aXJlIGZvcm1hdCB0byBzdHJ1Y3QgaXBhY19iY2NoX2luZm8gKi8KK2ludCBpcGFjX3BhcnNlX2JjY2hfaW5mbyhzdHJ1Y3QgaXBhY19iY2NoX2luZm8gKmJpbmYsIHVfaW50OF90ICpidWYpCit7CisJdV9pbnQ4X3QgKmN1ciA9IGJ1ZjsKKwl1X2ludDE2X3QgbGVuOworCisJbWVtc2V0KGJpbmYsIDAsIHNpemVvZihiaW5mKSk7CisKKwlpZiAoY3VyWzBdICE9IE5NX0lQQUNfRUlFX0JDQ0hfSU5GTykKKwkJcmV0dXJuIC1FSU5WQUw7CisJY3VyKys7CisKKwlsZW4gPSBudG9ocygqKHVfaW50MTZfdCAqKWN1cik7CisJY3VyICs9IDI7CisKKwliaW5mLT5pbmZvX3R5cGUgPSBudG9ocygqKHVfaW50MTZfdCAqKWN1cik7CisJY3VyICs9IDI7CisKKwlpZiAoYmluZi0+aW5mb190eXBlICYgSVBBQ19CSU5GX0ZSRVFfRVJSX1FVQUwpCisJCWJpbmYtPmZyZXFfcXVhbCA9ICpjdXIgPj4gMjsKKworCWJpbmYtPmFyZmNuID0gKmN1cisrICYgMyA8PCA4OworCWJpbmYtPmFyZmNuIHw9ICpjdXIrKzsKKworCWlmIChiaW5mLT5pbmZvX3R5cGUgJiBJUEFDX0JJTkZfUlhMRVYpCisJCWJpbmYtPnJ4X2xldiA9ICpjdXIgJiAweDNmOworCWN1cisrOworCisJaWYgKGJpbmYtPmluZm9fdHlwZSAmIElQQUNfQklORl9SWFFVQUwpCisJCWJpbmYtPnJ4X3F1YWwgPSAqY3VyICYgMHg3OworCWN1cisrOworCisJaWYgKGJpbmYtPmluZm9fdHlwZSAmIElQQUNfQklORl9GUkVRX0VSUl9RVUFMKQorCQliaW5mLT5mcmVxX2VyciA9IG50b2hzKCoodV9pbnQxNl90ICopY3VyKTsKKwljdXIgKz0gMjsKKworCWlmIChiaW5mLT5pbmZvX3R5cGUgJiBJUEFDX0JJTkZfRlJBTUVfT0ZGU0VUKQorCQliaW5mLT5mcmFtZV9vZmZzZXQgPSBudG9ocygqKHVfaW50MTZfdCAqKWN1cik7CisJY3VyICs9IDI7CisKKwlpZiAoYmluZi0+aW5mb190eXBlICYgSVBBQ19CSU5GX0ZSQU1FX05SX09GRlNFVCkKKwkJYmluZi0+ZnJhbWVfbnJfb2Zmc2V0ID0gbnRvaGwoKih1X2ludDMyX3QgKiljdXIpOworCWN1ciArPSA0OworCisJaWYgKGJpbmYtPmluZm9fdHlwZSAmIElQQUNfQklORl9CU0lDKQorCQliaW5mLT5ic2ljID0gKmN1ciAmIDB4M2Y7CisJY3VyKys7CisKKwlpcGFjX3BhcnNlX2NnaSgmYmluZi0+Y2dpLCBjdXIpOworCWN1ciArPSA3OworCisJaWYgKGJpbmYtPmluZm9fdHlwZSAmIElQQUNfQklORl9ORUlHSF9CQV9TSTIpIHsKKwkJbWVtY3B5KGJpbmYtPmJhX2xpc3Rfc2kyLCBjdXIsIHNpemVvZihiaW5mLT5iYV9saXN0X3NpMikpOworCQljdXIgKz0gc2l6ZW9mKGJpbmYtPmJhX2xpc3Rfc2kyKTsKKwl9CisKKwlpZiAoYmluZi0+aW5mb190eXBlICYgSVBBQ19CSU5GX05FSUdIX0JBX1NJMmJpcykgeworCQltZW1jcHkoYmluZi0+YmFfbGlzdF9zaTJiaXMsIGN1ciwKKwkJCXNpemVvZihiaW5mLT5iYV9saXN0X3NpMmJpcykpOworCQljdXIgKz0gc2l6ZW9mKGJpbmYtPmJhX2xpc3Rfc2kyYmlzKTsKKwl9CisKKwlpZiAoYmluZi0+aW5mb190eXBlICYgSVBBQ19CSU5GX05FSUdIX0JBX1NJMnRlcikgeworCQltZW1jcHkoYmluZi0+YmFfbGlzdF9zaTJ0ZXIsIGN1ciwKKwkJCXNpemVvZihiaW5mLT5iYV9saXN0X3NpMnRlcikpOworCQljdXIgKz0gc2l6ZW9mKGJpbmYtPmJhX2xpc3Rfc2kydGVyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2FiaXNfcnNsLmMgYi9vcGVuYnNjL3NyYy9hYmlzX3JzbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYjI5ODIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9hYmlzX3JzbC5jCkBAIC0wLDAgKzEsMTc2NSBAQAorLyogR1NNIFJhZGlvIFNpZ25hbGxpbmcgTGluayBtZXNzYWdlcyBvbiB0aGUgQS1iaXMgaW50ZXJmYWNlCisgKiAzR1BQIFRTIDA4LjU4IHZlcnNpb24gOC42LjAgUmVsZWFzZSAxOTk5IC8gRVRTSSBUUyAxMDAgNTk2IFY4LjYuMCAqLworCisvKiAoQykgMjAwOC0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtX3V0aWxzLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvY2hhbl9hbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYnNjX3JsbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3BhZ2luZy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tZWFzX3JlcC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcnRwX3Byb3h5Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvcnNsLmg+CisKKyNkZWZpbmUgUlNMX0FMTE9DX1NJWkUJCTEwMjQKKyNkZWZpbmUgUlNMX0FMTE9DX0hFQURST09NCTEyOAorCisjZGVmaW5lIE1BWChhLCBiKSAoYSkgPj0gKGIpID8gKGEpIDogKGIpCisKK3N0YXRpYyB1X2ludDhfdCBtZGlzY19ieV9tc2d0eXBlKHVfaW50OF90IG1zZ190eXBlKQoreworCS8qIG1hc2sgb2ZmIHRoZSB0cmFuc3BhcmVudCBiaXQgPyAqLworCW1zZ190eXBlICY9IDB4ZmU7CisKKwlpZiAoKG1zZ190eXBlICYgMHhmMCkgPT0gMHgwMCkKKwkJcmV0dXJuIEFCSVNfUlNMX01ESVNDX1JMTDsKKwlpZiAoKG1zZ190eXBlICYgMHhmMCkgPT0gMHgxMCkgeworCQlpZiAobXNnX3R5cGUgPj0gMHgxOSAmJiBtc2dfdHlwZSA8PSAweDIyKQorCQkJcmV0dXJuIEFCSVNfUlNMX01ESVNDX1RSWDsKKwkJZWxzZQorCQkJcmV0dXJuIEFCSVNfUlNMX01ESVNDX0NPTV9DSEFOOworCX0KKwlpZiAoKG1zZ190eXBlICYgMHhlMCkgPT0gMHgyMCkKKwkJcmV0dXJuIEFCSVNfUlNMX01ESVNDX0RFRF9DSEFOOworCQorCXJldHVybiBBQklTX1JTTF9NRElTQ19MT0M7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2RjaGFuX2hkcihzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaCwKKwkJCQkgIHVfaW50OF90IG1zZ190eXBlKQoreworCWRoLT5jLm1zZ19kaXNjciA9IG1kaXNjX2J5X21zZ3R5cGUobXNnX3R5cGUpOworCWRoLT5jLm1zZ190eXBlID0gbXNnX3R5cGU7CisJZGgtPmllX2NoYW4gPSBSU0xfSUVfQ0hBTl9OUjsKK30KKworLyogZGV0ZXJtaW5lIGxvZ2ljYWwgY2hhbm5lbCBiYXNlZCBvbiBUUlggYW5kIGNoYW5uZWwgbnVtYmVyIElFICovCitzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbl9sb29rdXAoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90IGNoYW5fbnIpCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisJdV9pbnQ4X3QgdHNfbnIgPSBjaGFuX25yICYgMHgwNzsKKwl1X2ludDhfdCBjYml0cyA9IGNoYW5fbnIgPj4gMzsKKwl1X2ludDhfdCBsY2hfaWR4OworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMgPSAmdHJ4LT50c1t0c19ucl07CisKKwlpZiAoY2JpdHMgPT0gMHgwMSkgeworCQlsY2hfaWR4ID0gMDsJLyogVENIL0YgKi8JCisJCWlmICh0cy0+cGNoYW4gIT0gR1NNX1BDSEFOX1RDSF9GICYmCisJCSAgICB0cy0+cGNoYW4gIT0gR1NNX1BDSEFOX1BEQ0ggJiYKKwkJICAgIHRzLT5wY2hhbiAhPSBHU01fUENIQU5fVENIX0ZfUERDSCkKKwkJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgImNoYW5fbnI9MHglMDJ4IGJ1dCBwY2hhbj0ldVxuIiwKKwkJCQljaGFuX25yLCB0cy0+cGNoYW4pOworCX0gZWxzZSBpZiAoKGNiaXRzICYgMHgxZSkgPT0gMHgwMikgeworCQlsY2hfaWR4ID0gY2JpdHMgJiAweDE7CS8qIFRDSC9IICovCisJCWlmICh0cy0+cGNoYW4gIT0gR1NNX1BDSEFOX1RDSF9IKQorCQkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiY2hhbl9ucj0weCUwMnggYnV0IHBjaGFuPSV1XG4iLAorCQkJCWNoYW5fbnIsIHRzLT5wY2hhbik7CisJfSBlbHNlIGlmICgoY2JpdHMgJiAweDFjKSA9PSAweDA0KSB7CisJCWxjaF9pZHggPSBjYml0cyAmIDB4MzsJLyogU0RDQ0gvNCAqLworCQlpZiAodHMtPnBjaGFuICE9IEdTTV9QQ0hBTl9DQ0NIX1NEQ0NINCkKKwkJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgImNoYW5fbnI9MHglMDJ4IGJ1dCBwY2hhbj0ldVxuIiwKKwkJCQljaGFuX25yLCB0cy0+cGNoYW4pOworCX0gZWxzZSBpZiAoKGNiaXRzICYgMHgxOCkgPT0gMHgwOCkgeworCQlsY2hfaWR4ID0gY2JpdHMgJiAweDc7CS8qIFNEQ0NILzggKi8KKwkJaWYgKHRzLT5wY2hhbiAhPSBHU01fUENIQU5fU0RDQ0g4X1NBQ0NIOEMpCisJCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJjaGFuX25yPTB4JTAyeCBidXQgcGNoYW49JXVcbiIsCisJCQkJY2hhbl9uciwgdHMtPnBjaGFuKTsKKwl9IGVsc2UgaWYgKGNiaXRzID09IDB4MTAgfHwgY2JpdHMgPT0gMHgxMSB8fCBjYml0cyA9PSAweDEyKSB7CisJCWxjaF9pZHggPSAwOworCQlpZiAodHMtPnBjaGFuICE9IEdTTV9QQ0hBTl9DQ0NIICYmCisJCSAgICB0cy0+cGNoYW4gIT0gR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0KQorCQkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiY2hhbl9ucj0weCUwMnggYnV0IHBjaGFuPSV1XG4iLAorCQkJCWNoYW5fbnIsIHRzLT5wY2hhbik7CisJCS8qIEZJWE1FOiB3ZSBzaG91bGQgbm90IHJldHVybiBmaXJzdCBzZGNjaDQgISEhICovCisJfSBlbHNlIHsKKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAidW5rbm93biBjaGFuX25yPTB4JTAyeFxuIiwgY2hhbl9ucik7CisJCXJldHVybiBOVUxMOworCX0KKworCWxjaGFuID0gJnRzLT5sY2hhbltsY2hfaWR4XTsKKwlsb2dfc2V0X2NvbnRleHQoQlNDX0NUWF9MQ0hBTiwgbGNoYW4pOworCWxvZ19zZXRfY29udGV4dChCU0NfQ1RYX1NVQlNDUiwgbGNoYW4tPmNvbm4uc3Vic2NyKTsKKworCXJldHVybiBsY2hhbjsKK30KKworLyogU2VlIFRhYmxlIDEwLjUuMjUgb2YgR1NNMDQuMDggKi8KK3VfaW50OF90IGxjaGFuMmNoYW5fbnIoY29uc3Qgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9IGxjaGFuLT50czsKKwl1X2ludDhfdCBjYml0cywgY2hhbl9ucjsKKworCXN3aXRjaCAodHMtPnBjaGFuKSB7CisJY2FzZSBHU01fUENIQU5fVENIX0Y6CisJY2FzZSBHU01fUENIQU5fUERDSDoKKwljYXNlIEdTTV9QQ0hBTl9UQ0hfRl9QRENIOgorCQljYml0cyA9IDB4MDE7CisJCWJyZWFrOworCWNhc2UgR1NNX1BDSEFOX1RDSF9IOgorCQljYml0cyA9IDB4MDI7CisJCWNiaXRzICs9IGxjaGFuLT5ucjsKKwkJYnJlYWs7CisJY2FzZSBHU01fUENIQU5fQ0NDSF9TRENDSDQ6CisJCWNiaXRzID0gMHgwNDsKKwkJY2JpdHMgKz0gbGNoYW4tPm5yOworCQlicmVhazsKKwljYXNlIEdTTV9QQ0hBTl9TRENDSDhfU0FDQ0g4QzoKKwkJY2JpdHMgPSAweDA4OworCQljYml0cyArPSBsY2hhbi0+bnI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJY2FzZSBHU01fUENIQU5fQ0NDSDoKKwkJY2JpdHMgPSAweDEwOworCQlicmVhazsKKwl9CisKKwljaGFuX25yID0gKGNiaXRzIDw8IDMpIHwgKHRzLT5uciAmIDB4Nyk7CisKKwlyZXR1cm4gY2hhbl9ucjsKK30KKworLyogQXMgcGVyIFRTIDAzLjAzIFNlY3Rpb24gMi4yLCB0aGUgSU1TSSBoYXMgJ25vdCBtb3JlIHRoYW4gMTUgZGlnaXRzJyAqLwordV9pbnQ2NF90IHN0cl90b19pbXNpKGNvbnN0IGNoYXIgKmltc2lfc3RyKQoreworCXVfaW50NjRfdCByZXQ7CisKKwlyZXQgPSBzdHJ0b3VsbChpbXNpX3N0ciwgTlVMTCwgMTApOworCisJcmV0dXJuIHJldDsKK30KKworLyogVGFibGUgNSBDbGF1c2UgNyBUUyAwNS4wMiAqLwordW5zaWduZWQgaW50IG5fcGFnX2Jsb2NrcyhpbnQgYnNfY2NjaF9zZGNjaF9jb21iLCB1bnNpZ25lZCBpbnQgYnNfYWdfYmxrc19yZXMpCit7CisJaWYgKCFic19jY2NoX3NkY2NoX2NvbWIpCisJCXJldHVybiA5IC0gYnNfYWdfYmxrc19yZXM7CisJZWxzZQorCQlyZXR1cm4gMyAtIGJzX2FnX2Jsa3NfcmVzOworfQorCisvKiBDaGFwdGVyIDYuNS4yIG9mIFRTIDA1LjAyICovCit1bnNpZ25lZCBpbnQgZ2V0X2NjY2hfZ3JvdXAodV9pbnQ2NF90IGltc2ksIHVuc2lnbmVkIGludCBic19jY19jaGFucywKKwkJCSAgICB1bnNpZ25lZCBpbnQgbl9wYWdfYmxvY2tzKQoreworCXJldHVybiAoaW1zaSAlIDEwMDApICUgKGJzX2NjX2NoYW5zICogbl9wYWdfYmxvY2tzKSAvIG5fcGFnX2Jsb2NrczsKK30KKworLyogQ2hhcHRlciA2LjUuMiBvZiBUUyAwNS4wMiAqLwordW5zaWduZWQgaW50IGdldF9wYWdpbmdfZ3JvdXAodV9pbnQ2NF90IGltc2ksIHVuc2lnbmVkIGludCBic19jY19jaGFucywKKwkJCSAgICAgIGludCBuX3BhZ19ibG9ja3MpCit7CisJcmV0dXJuIChpbXNpICUgMTAwMCkgJSAoYnNfY2NfY2hhbnMgKiBuX3BhZ19ibG9ja3MpICUgbl9wYWdfYmxvY2tzOworfQorCitzdGF0aWMgc3RydWN0IG1zZ2IgKnJzbF9tc2diX2FsbG9jKHZvaWQpCit7CisJcmV0dXJuIG1zZ2JfYWxsb2NfaGVhZHJvb20oUlNMX0FMTE9DX1NJWkUsIFJTTF9BTExPQ19IRUFEUk9PTSwKKwkJCQkgICAiUlNMIik7Cit9CisKKyNkZWZpbmUgTUFDQkxPQ0tfU0laRQkyMworc3RhdGljIHZvaWQgcGFkX21hY2Jsb2NrKHVfaW50OF90ICpvdXQsIGNvbnN0IHVfaW50OF90ICppbiwgaW50IGxlbikKK3sKKwltZW1jcHkob3V0LCBpbiwgbGVuKTsKKworCWlmIChsZW4gPCBNQUNCTE9DS19TSVpFKQorCQltZW1zZXQob3V0K2xlbiwgMHgyYiwgTUFDQkxPQ0tfU0laRS1sZW4pOworfQorCisvKiBDaGFwdGVyIDkuMy43OiBFbmNyeXB0aW9uIEluZm9ybWF0aW9uICovCitzdGF0aWMgaW50IGJ1aWxkX2VuY3JfaW5mbyh1X2ludDhfdCAqb3V0LCBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwkqb3V0KysgPSBsY2hhbi0+ZW5jci5hbGdfaWQgJiAweGZmOworCWlmIChsY2hhbi0+ZW5jci5rZXlfbGVuKQorCQltZW1jcHkob3V0LCBsY2hhbi0+ZW5jci5rZXksIGxjaGFuLT5lbmNyLmtleV9sZW4pOworCXJldHVybiBsY2hhbi0+ZW5jci5rZXlfbGVuICsgMTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfcnNsX2NhdXNlKGludCBsdmwsIGNvbnN0IHVfaW50OF90ICpjYXVzZV92LCB1X2ludDhfdCBjYXVzZV9sZW4pCit7CisJaW50IGk7CisKKwlMT0dQQyhEUlNMLCBsdmwsICJDQVVTRT0weCUwMngoJXMpICIsCisJCWNhdXNlX3ZbMF0sIHJzbF9lcnJfbmFtZShjYXVzZV92WzBdKSk7CisJZm9yIChpID0gMTsgaSA8IGNhdXNlX2xlbi0xOyBpKyspCisJCUxPR1BDKERSU0wsIGx2bCwgIiUwMnggIiwgY2F1c2VfdltpXSk7Cit9CisKKy8qIFNlbmQgYSBCQ0NIX0lORk8gbWVzc2FnZSBhcyBwZXIgQ2hhcHRlciA4LjUuMSAqLworaW50IHJzbF9iY2NoX2luZm8oc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90IHR5cGUsCisJCSAgY29uc3QgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJc3RydWN0IG1zZ2IgKm1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKmRoKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX0JDQ0hfSU5GTyk7CisJZGgtPmNoYW5fbnIgPSBSU0xfQ0hBTl9CQ0NIOworCisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfU1lTSU5GT19UWVBFLCB0eXBlKTsKKwltc2diX3Rsdl9wdXQobXNnLCBSU0xfSUVfRlVMTF9CQ0NIX0lORk8sIGxlbiwgZGF0YSk7CisKKwltc2ctPnRyeCA9IHRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKK2ludCByc2xfc2FjY2hfZmlsbGluZyhzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgdHlwZSwKKwkJICAgICAgY29uc3QgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IGFiaXNfcnNsX2NvbW1vbl9oZHIgKmNoOworCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOworCisJY2ggPSAoc3RydWN0IGFiaXNfcnNsX2NvbW1vbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmNoKSk7CisJY2gtPm1zZ19kaXNjciA9IEFCSVNfUlNMX01ESVNDX1RSWDsKKwljaC0+bXNnX3R5cGUgPSBSU0xfTVRfU0FDQ0hfRklMTDsKKworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX1NZU0lORk9fVFlQRSwgdHlwZSk7CisJbXNnYl90bDE2dl9wdXQobXNnLCBSU0xfSUVfTDNfSU5GTywgbGVuLCBkYXRhKTsKKworCW1zZy0+dHJ4ID0gdHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworaW50IHJzbF9jaGFuX2JzX3Bvd2VyX2N0cmwoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVuc2lnbmVkIGludCBmcGMsIGludCBkYikKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXVfaW50OF90IGNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKworCWRiID0gYWJzKGRiKTsKKwlpZiAoZGIgPiAzMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltc2cgPSByc2xfbXNnYl9hbGxvYygpOworCisJbGNoYW4tPmJzX3Bvd2VyID0gZGIvMjsKKwlpZiAoZnBjKQorCQlsY2hhbi0+YnNfcG93ZXIgfD0gMHgxMDsKKwkKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfQlNfUE9XRVJfQ09OVFJPTCk7CisJZGgtPmNoYW5fbnIgPSBjaGFuX25yOworCisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfQlNfUE9XRVIsIGxjaGFuLT5ic19wb3dlcik7CisKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworaW50IHJzbF9jaGFuX21zX3Bvd2VyX2N0cmwoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVuc2lnbmVkIGludCBmcGMsIGludCBkYm0pCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwl1X2ludDhfdCBjaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisJaW50IGN0bF9sdmw7CisKKwljdGxfbHZsID0gbXNfcHdyX2N0bF9sdmwobGNoYW4tPnRzLT50cngtPmJ0cy0+YmFuZCwgZGJtKTsKKwlpZiAoY3RsX2x2bCA8IDApCisJCXJldHVybiBjdGxfbHZsOworCisJbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKworCWxjaGFuLT5tc19wb3dlciA9IGN0bF9sdmw7CisKKwlpZiAoZnBjKQorCQlsY2hhbi0+bXNfcG93ZXIgfD0gMHgyMDsKKwkKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfTVNfUE9XRVJfQ09OVFJPTCk7CisJZGgtPmNoYW5fbnIgPSBjaGFuX25yOworCisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfTVNfUE9XRVIsIGxjaGFuLT5tc19wb3dlcik7CisKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworc3RhdGljIGludCBjaGFubmVsX21vZGVfZnJvbV9sY2hhbihzdHJ1Y3QgcnNsX2llX2NoYW5fbW9kZSAqY20sCisJCQkJICAgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJbWVtc2V0KGNtLCAwLCBzaXplb2YoY20pKTsKKworCS8qIEZJWE1FOiB3aGF0IHRvIGRvIHdpdGggZGF0YSBjYWxscyA/ICovCisJY20tPmR0eF9kdHUgPSAweDAwOworCisJLyogc2V0IFRDSCBTcGVlY2gvRGF0YSAqLworCWNtLT5zcGRfaW5kID0gbGNoYW4tPnJzbF9jbW9kZTsKKworCWlmIChsY2hhbi0+cnNsX2Ntb2RlID09IFJTTF9DTU9EX1NQRF9TSUdOICYmCisJICAgIGxjaGFuLT50Y2hfbW9kZSAhPSBHU000OF9DTU9ERV9TSUdOKQorCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJ1bnN1cHBvcnRlZDogcnNsX21vZGUgPT0gc2lnbmFsbGluZywgIgorCQkJImJ1dCB0Y2hfbW9kZSAhPSBzaWduYWxsaW5nXG4iKTsKKworCXN3aXRjaCAobGNoYW4tPnR5cGUpIHsKKwljYXNlIEdTTV9MQ0hBTl9TRENDSDoKKwkJY20tPmNoYW5fcnQgPSBSU0xfQ01PRF9DUlRfU0RDQ0g7CisJCWJyZWFrOworCWNhc2UgR1NNX0xDSEFOX1RDSF9GOgorCQljbS0+Y2hhbl9ydCA9IFJTTF9DTU9EX0NSVF9UQ0hfQm07CisJCWJyZWFrOworCWNhc2UgR1NNX0xDSEFOX1RDSF9IOgorCQljbS0+Y2hhbl9ydCA9IFJTTF9DTU9EX0NSVF9UQ0hfTG07CisJCWJyZWFrOworCWNhc2UgR1NNX0xDSEFOX05PTkU6CisJY2FzZSBHU01fTENIQU5fVU5LTk9XTjoKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGxjaGFuLT50Y2hfbW9kZSkgeworCWNhc2UgR1NNNDhfQ01PREVfU0lHTjoKKwkJY20tPmNoYW5fcmF0ZSA9IDA7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfQ01PREVfU1BFRUNIX1YxOgorCQljbS0+Y2hhbl9yYXRlID0gUlNMX0NNT0RfU1BfR1NNMTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9DTU9ERV9TUEVFQ0hfRUZSOgorCQljbS0+Y2hhbl9yYXRlID0gUlNMX0NNT0RfU1BfR1NNMjsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9DTU9ERV9TUEVFQ0hfQU1SOgorCQljbS0+Y2hhbl9yYXRlID0gUlNMX0NNT0RfU1BfR1NNMzsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9DTU9ERV9EQVRBXzE0azU6CisJCWNtLT5jaGFuX3JhdGUgPSBSU0xfQ01PRF9TUF9OVF8xNGs1OworCQlicmVhazsKKwljYXNlIEdTTTQ4X0NNT0RFX0RBVEFfMTJrMDoKKwkJY20tPmNoYW5fcmF0ZSA9IFJTTF9DTU9EX1NQX05UXzEyazA7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfQ01PREVfREFUQV82azA6CisJCWNtLT5jaGFuX3JhdGUgPSBSU0xfQ01PRF9TUF9OVF82azA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKiBDaGFwdGVyIDguNC4xICovCisjaWYgMAoraW50IHJzbF9jaGFuX2FjdGl2YXRlKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCBjaGFuX25yLAorCQkgICAgICB1X2ludDhfdCBhY3RfdHlwZSwKKwkJICAgICAgc3RydWN0IHJzbF9pZV9jaGFuX21vZGUgKmNoYW5fbW9kZSwKKwkJICAgICAgc3RydWN0IHJzbF9pZV9jaGFuX2lkZW50ICpjaGFuX2lkZW50LAorCQkgICAgICB1X2ludDhfdCBic19wb3dlciwgdV9pbnQ4X3QgbXNfcG93ZXIsCisJCSAgICAgIHVfaW50OF90IHRhKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOworCisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZGgpKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX0NIQU5fQUNUSVYpOworCWRoLT5jaGFuX25yID0gY2hhbl9ucjsKKworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0FDVF9UWVBFLCBhY3RfdHlwZSk7CisJLyogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBQaGFzZSAxICovCisJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0NIQU5fTU9ERSwgc2l6ZW9mKCpjaGFuX21vZGUpLAorCQkgICAgICh1X2ludDhfdCAqKSBjaGFuX21vZGUpOworCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9DSEFOX0lERU5ULCA0LAorCQkgICAgICh1X2ludDhfdCAqKSBjaGFuX2lkZW50KTsKKyNpZiAwCisJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0VOQ1JfSU5GTywgMSwKKwkJICAgICAodV9pbnQ4X3QgKikgJmVuY3JfaW5mbyk7CisjZW5kaWYKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9CU19QT1dFUiwgYnNfcG93ZXIpOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX01TX1BPV0VSLCBtc19wb3dlcik7CisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfVElNSU5HX0FEVkFOQ0UsIHRhKTsKKworCW1zZy0+dHJ4ID0gdHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKyNlbmRpZgorCitpbnQgcnNsX2NoYW5fYWN0aXZhdGVfbGNoYW4oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGFjdF90eXBlLAorCQkJICAgIHVfaW50OF90IHRhLCB1X2ludDhfdCBob19yZWYpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlpbnQgcmM7CisKKwl1X2ludDhfdCBjaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisJdV9pbnQxNl90IGFyZmNuID0gbGNoYW4tPnRzLT50cngtPmFyZmNuOworCXN0cnVjdCByc2xfaWVfY2hhbl9tb2RlIGNtOworCXN0cnVjdCByc2xfaWVfY2hhbl9pZGVudCBjaTsKKworCXJjID0gY2hhbm5lbF9tb2RlX2Zyb21fbGNoYW4oJmNtLCBsY2hhbik7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJbWVtc2V0KCZjaSwgMCwgc2l6ZW9mKGNpKSk7CisJY2kuY2hhbl9kZXNjLmllaSA9IDB4NjQ7CisJY2kuY2hhbl9kZXNjLmNoYW5fbnIgPSBjaGFuX25yOworCWNpLmNoYW5fZGVzYy5vY3QzID0gKGxjaGFuLT50cy0+dHJ4LT5idHMtPnRzYyA8PCA1KSB8ICgoYXJmY24gJiAweDNmZikgPj4gOCk7CisJY2kuY2hhbl9kZXNjLm9jdDQgPSBhcmZjbiAmIDB4ZmY7CisKKwltc2cgPSByc2xfbXNnYl9hbGxvYygpOworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9DSEFOX0FDVElWKTsKKwlkaC0+Y2hhbl9uciA9IGNoYW5fbnI7CisKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9BQ1RfVFlQRSwgYWN0X3R5cGUpOworCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9DSEFOX01PREUsIHNpemVvZihjbSksCisJCSAgICAgKHVfaW50OF90ICopICZjbSk7CisJLyogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBQaGFzZSAxICovCisJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0NIQU5fSURFTlQsIDQsCisJCSAgICAgKHVfaW50OF90ICopICZjaSk7CisKKwlpZiAobGNoYW4tPmVuY3IuYWxnX2lkID4gUlNMX0VOQ19BTEdfQTUoMCkpIHsKKwkJdV9pbnQ4X3QgZW5jcl9pbmZvW01BWF9BNV9LRVlfTEVOKzJdOworCQlyYyA9IGJ1aWxkX2VuY3JfaW5mbyhlbmNyX2luZm8sIGxjaGFuKTsKKwkJaWYgKHJjID4gMCkKKwkJCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9FTkNSX0lORk8sIHJjLCBlbmNyX2luZm8pOworCX0KKworCXN3aXRjaCAoYWN0X3R5cGUpIHsKKwljYXNlIFJTTF9BQ1RfSU5URVJfQVNZTkM6CisJY2FzZSBSU0xfQUNUX0lOVEVSX1NZTkM6CisJCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0hBTkRPX1JFRiwgaG9fcmVmKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfQlNfUE9XRVIsIGxjaGFuLT5ic19wb3dlcik7CisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfTVNfUE9XRVIsIGxjaGFuLT5tc19wb3dlcik7CisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfVElNSU5HX0FEVkFOQ0UsIHRhKTsKKworCWlmIChsY2hhbi0+dGNoX21vZGUgPT0gR1NNNDhfQ01PREVfU1BFRUNIX0FNUikKKwkJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX01SX0NPTkZJRywgc2l6ZW9mKGxjaGFuLT5tcl9jb25mKSwKKwkJCSAgICAgKHVfaW50OF90ICopICZsY2hhbi0+bXJfY29uZik7CisKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworLyogQ2hhcHRlciA4LjQuOTogTW9kaWZ5IGNoYW5uZWwgbW9kZSBvbiBCVFMgc2lkZSAqLworaW50IHJzbF9jaGFuX21vZGVfbW9kaWZ5X3JlcShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCWludCByYzsKKworCXVfaW50OF90IGNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKwlzdHJ1Y3QgcnNsX2llX2NoYW5fbW9kZSBjbTsKKworCXJjID0gY2hhbm5lbF9tb2RlX2Zyb21fbGNoYW4oJmNtLCBsY2hhbik7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfTU9ERV9NT0RJRllfUkVRKTsKKwlkaC0+Y2hhbl9uciA9IGNoYW5fbnI7CisKKwltc2diX3Rsdl9wdXQobXNnLCBSU0xfSUVfQ0hBTl9NT0RFLCBzaXplb2YoY20pLAorCQkgICAgICh1X2ludDhfdCAqKSAmY20pOworCisJaWYgKGxjaGFuLT5lbmNyLmFsZ19pZCA+IFJTTF9FTkNfQUxHX0E1KDApKSB7CisJCXVfaW50OF90IGVuY3JfaW5mb1tNQVhfQTVfS0VZX0xFTisyXTsKKwkJcmMgPSBidWlsZF9lbmNyX2luZm8oZW5jcl9pbmZvLCBsY2hhbik7CisJCWlmIChyYyA+IDApCisJCQltc2diX3Rsdl9wdXQobXNnLCBSU0xfSUVfRU5DUl9JTkZPLCByYywgZW5jcl9pbmZvKTsKKwl9CisKKwlpZiAobGNoYW4tPnRjaF9tb2RlID09IEdTTTQ4X0NNT0RFX1NQRUVDSF9BTVIpIHsKKwkJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX01SX0NPTkZJRywgc2l6ZW9mKGxjaGFuLT5tcl9jb25mKSwKKwkJCSAgICAgKHVfaW50OF90ICopICZsY2hhbi0+bXJfY29uZik7CisJfQorCisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKy8qIENoYXB0ZXIgOC40LjY6IFNlbmQgdGhlIGVuY3J5cHRpb24gY29tbWFuZCB3aXRoIGdpdmVuIEwzIGluZm8gKi8KK2ludCByc2xfZW5jcnlwdGlvbl9jbWQoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IG1zZy0+bGNoYW47CisJdV9pbnQ4X3QgY2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCXVfaW50OF90IGVuY3JfaW5mb1tNQVhfQTVfS0VZX0xFTisyXTsKKwl1X2ludDhfdCBsM19sZW4gPSBtc2ctPmxlbjsKKwlpbnQgcmM7CisKKwkvKiBGaXJzdCBwdXNoIHRoZSBMMyBJRSB0YWcgYW5kIGxlbmd0aCAqLworCW1zZ2JfdHYxNl9wdXNoKG1zZywgUlNMX0lFX0wzX0lORk8sIGwzX2xlbik7CisKKwkvKiB0aGVuIHRoZSBsaW5rIGlkZW50aWZpZXIgKFNBUEkwLCBtYWluIHNpZ24gbGluaykgKi8KKwltc2diX3R2X3B1c2gobXNnLCBSU0xfSUVfTElOS19JREVOVCwgMCk7CisKKwkvKiB0aGVuIGVuY3J5cHRpb24gaW5mb3JtYXRpb24gKi8KKwlyYyA9IGJ1aWxkX2VuY3JfaW5mbyhlbmNyX2luZm8sIGxjaGFuKTsKKwlpZiAocmMgPD0gMCkKKwkJcmV0dXJuIHJjOworCW1zZ2JfdGx2X3B1c2gobXNnLCBSU0xfSUVfRU5DUl9JTkZPLCByYywgZW5jcl9pbmZvKTsKKworCS8qIGFuZCBmaW5hbGx5IHRoZSBEQ0hBTiBoZWFkZXIgKi8KKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHVzaChtc2csIHNpemVvZigqZGgpKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX0VOQ1JfQ01EKTsKKwlkaC0+Y2hhbl9uciA9IGNoYW5fbnI7CisKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworLyogQ2hhcHRlciA4LjQuNSAvIDQuNjogRGVhY3RpdmF0ZSB0aGUgU0FDQ0ggYWZ0ZXIgMDQuMDggUlIgQ0hBTiBSRUxFQVNFICovCitpbnQgcnNsX2RlYWN0X3NhY2NoKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOworCisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZGgpKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX0RFQUNUSVZBVEVfU0FDQ0gpOworCWRoLT5jaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisKKwltc2ctPmxjaGFuID0gbGNoYW47CisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCURFQlVHUChEUlNMLCAiJXMgREVBQ1RpdmF0ZSBTQUNDSCBDTURcbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSk7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCisvKiBDaGFwdGVyIDguNC4xNCAvIDQuNzogVGVsbCBCVFMgdG8gcmVsZWFzZSB0aGUgcmFkaW8gY2hhbm5lbCAqLworaW50IHJzbF9yZl9jaGFuX3JlbGVhc2Uoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJc3RydWN0IG1zZ2IgKm1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfUkZfQ0hBTl9SRUwpOworCWRoLT5jaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisKKwltc2ctPmxjaGFuID0gbGNoYW47CisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCURFQlVHUChEUlNMLCAiJXMgUkYgQ2hhbm5lbCBSZWxlYXNlIENNRFxuIiwgZ3NtX2xjaGFuX25hbWUobGNoYW4pKTsKKworCS8qIEJUUyB3aWxsIHJlc3BvbmQgYnkgUkYgQ0hBTiBSRUwgQUNLICovCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworaW50IHJzbF9wYWdpbmdfY21kKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IHBhZ2luZ19ncm91cCwgdV9pbnQ4X3QgbGVuLAorCQkgICB1X2ludDhfdCAqbXNfaWRlbnQsIHVfaW50OF90IGNoYW5fbmVlZGVkKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOworCisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZGgpKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX1BBR0lOR19DTUQpOworCWRoLT5jaGFuX25yID0gUlNMX0NIQU5fUENIX0FHQ0g7CisKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9QQUdJTkdfR1JPVVAsIHBhZ2luZ19ncm91cCk7CisJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX01TX0lERU5USVRZLCBsZW4tMiwgbXNfaWRlbnQrMik7CisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfQ0hBTl9ORUVERUQsIGNoYW5fbmVlZGVkKTsKKworCW1zZy0+dHJ4ID0gYnRzLT5jMDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKK2ludCByc2xfcGFnaW5nX2NtZF9zdWJzY3Ioc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgY2hhbl9uZWVkLAorCQkJICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKyNpZiAwCisJdV9pbnQ4X3QgbWlbMTI4XTsKKwl1bnNpZ25lZCBpbnQgbWlfbGVuOworCXVfaW50OF90IHBhZ2luZ19ncm91cDsKKyNlbmRpZgorCisJcmV0dXJuIC0xOworfQorCitpbnQgaW1zaV9zdHIyYmNkKHVfaW50OF90ICpiY2Rfb3V0LCBjb25zdCBjaGFyICpzdHJfaW4pCit7CisJaW50IGksIGxlbiA9IHN0cmxlbihzdHJfaW4pOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWludCBudW0gPSBzdHJfaW5baV0gLSAweDMwOworCQlpZiAobnVtIDwgMCB8fCBudW0gPiA5KQorCQkJcmV0dXJuIC0xOworCQlpZiAoaSAlIDIgPT0gMCkKKwkJCWJjZF9vdXRbaS8yXSA9IG51bTsKKwkJZWxzZQorCQkJYmNkX291dFtpLzJdIHw9IChudW0gPDwgNCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIENoYXB0ZXIgOC41LjYgKi8KK2ludCByc2xfaW1tX2Fzc2lnbl9jbWQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgbGVuLCB1X2ludDhfdCAqdmFsKQoreworCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXVfaW50OF90IGJ1ZltNQUNCTE9DS19TSVpFXTsKKworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9JTU1FRElBVEVfQVNTSUdOX0NNRCk7CisJZGgtPmNoYW5fbnIgPSBSU0xfQ0hBTl9QQ0hfQUdDSDsKKworCXN3aXRjaCAoYnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0lNTV9BU1NfSU5GTywgbGVuLCB2YWwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBJZiBwaGFzZSAyLCBjb25zdHJ1Y3QgYSBGVUxMX0lNTV9BU1NfSU5GTyAqLworCQlwYWRfbWFjYmxvY2soYnVmLCB2YWwsIGxlbik7CisJCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9GVUxMX0lNTV9BU1NfSU5GTywgTUFDQkxPQ0tfU0laRSwgYnVmKTsKKwkJYnJlYWs7CisJfQorCisJbXNnLT50cnggPSBidHMtPmMwOworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworLyogU2VuZCBTaWVtZW5zIHNwZWNpZmljIE1TIFJGIFBvd2VyIENhcGFiaWxpdHkgSW5kaWNhdGlvbiAqLworaW50IHJzbF9zaWVtZW5zX21ycGNpKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBzdHJ1Y3QgcnNsX21ycGNpICptcnBjaSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9TSUVNRU5TX01SUENJKTsKKwlkaC0+Yy5tc2dfZGlzY3IgPSBBQklTX1JTTF9NRElTQ19ERURfQ0hBTjsKKwlkaC0+Y2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX1NJRU1FTlNfTVJQQ0ksICoodV9pbnQ4X3QgKiltcnBjaSk7CisKKwlERUJVR1AoRFJTTCwgIiVzIFRYIFNpZW1lbnMgTVJQQ0kgMHglMDJ4XG4iLAorCQlnc21fbGNoYW5fbmFtZShsY2hhbiksICoodV9pbnQ4X3QgKiltcnBjaSk7CisKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworCisvKiBTZW5kICJEQVRBIFJFUVVFU1QiIG1lc3NhZ2Ugd2l0aCBnaXZlbiBMMyBJbmZvIHBheWxvYWQgKi8KKy8qIENoYXB0ZXIgOC4zLjEgKi8KK2ludCByc2xfZGF0YV9yZXF1ZXN0KHN0cnVjdCBtc2diICptc2csIHVfaW50OF90IGxpbmtfaWQpCit7CisJaWYgKG1zZy0+bGNoYW4gPT0gTlVMTCkgeworCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJjYW5ub3Qgc2VuZCBEQVRBIFJFUVVFU1QgdG8gdW5rbm93biBsY2hhblxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJzbF9ybGxfcHVzaF9sMyhtc2csIFJTTF9NVF9EQVRBX1JFUSwgbGNoYW4yY2hhbl9ucihtc2ctPmxjaGFuKSwKKwkJCWxpbmtfaWQsIDEpOworCisJbXNnLT50cnggPSBtc2ctPmxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworLyogU2VuZCAiRVNUQUJMSVNIIFJFUVVFU1QiIG1lc3NhZ2Ugd2l0aCBnaXZlbiBMMyBJbmZvIHBheWxvYWQgKi8KKy8qIENoYXB0ZXIgOC4zLjEgKi8KK2ludCByc2xfZXN0YWJsaXNoX3JlcXVlc3Qoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxpbmtfaWQpCit7CisJc3RydWN0IG1zZ2IgKm1zZzsKKworCW1zZyA9IHJzbF9ybGxfc2ltcGxlKFJTTF9NVF9FU1RfUkVRLCBsY2hhbjJjaGFuX25yKGxjaGFuKSwKKwkJCSAgICAgbGlua19pZCwgMCk7CisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKy8qIENoYXB0ZXIgOC4zLjcgUmVxdWVzdCB0aGUgcmVsZWFzZSBvZiBtdWx0aWZyYW1lIG1vZGUgb2YgUkxMIGNvbm5lY3Rpb24uCisgICBUaGlzIGlzIHdoYXQgaGlnaGVyIGxheWVycyBzaG91bGQgY2FsbC4gIFRoZSBCVFMgdGhlbiByZXNwb25kcyB3aXRoCisgICBSRUxFQVNFIENPTkZJUk0sIHdoaWNoIHdlIGluIHR1cm4gdXNlIHRvIHRyaWdnZXIgUlNMIENIQU5ORUwgUkVMRUFTRSwKKyAgIHdoaWNoIGluIHR1cm4gaXMgYWNrbm93bGVkZ2VkIGJ5IFJTTCBDSEFOTkVMIFJFTEVBU0UgQUNLLCB3aGljaCBjYWxscworICAgbGNoYW5fZnJlZSgpICovCitpbnQgcnNsX3JlbGVhc2VfcmVxdWVzdChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCkKK3sKKworCXN0cnVjdCBtc2diICptc2c7CisKKwltc2cgPSByc2xfcmxsX3NpbXBsZShSU0xfTVRfUkVMX1JFUSwgbGNoYW4yY2hhbl9ucihsY2hhbiksCisJCQkgICAgIGxpbmtfaWQsIDApOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX1JFTEVBU0VfTU9ERSwgMCk7CS8qIG5vcm1hbCByZWxlYXNlICovCisKKwkvKiBGSVhNRTogc3RhcnQgc29tZSB0aW1lciBpbiBjYXNlIHdlIGRvbid0IHJlY2VpdmUgYSBSRUwgQUNLID8gKi8KKworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCitpbnQgcnNsX2xjaGFuX3NldF9zdGF0ZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgaW50IHN0YXRlKQoreworCWxjaGFuLT5zdGF0ZSA9IHN0YXRlOworCXJldHVybiAwOworfQorCisvKiBDaGFwdGVyIDguNC4yOiBDaGFubmVsIEFjdGl2YXRlIEFja25vd2xlZGdlICovCitzdGF0aWMgaW50IHJzbF9yeF9jaGFuX2FjdF9hY2soc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpyc2xoID0gbXNnYl9sMihtc2cpOworCisJLyogQlRTIGhhcyBjb25maXJtZWQgY2hhbm5lbCBhY3RpdmF0aW9uLCB3ZSBub3cgbmVlZAorCSAqIHRvIGFzc2lnbiB0aGUgYWN0aXZhdGVkIGNoYW5uZWwgdG8gdGhlIE1TICovCisJaWYgKHJzbGgtPmllX2NoYW4gIT0gUlNMX0lFX0NIQU5fTlIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG1zZy0+bGNoYW4tPnN0YXRlICE9IExDSEFOX1NfQUNUX1JFUSkKKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIiVzIENIQU4gQUNUIEFDSywgYnV0IHN0YXRlICVzXG4iLAorCQkJZ3NtX2xjaGFuX25hbWUobXNnLT5sY2hhbiksCisJCQlnc21fbGNoYW5zX25hbWUobXNnLT5sY2hhbi0+c3RhdGUpKTsKKwlyc2xfbGNoYW5fc2V0X3N0YXRlKG1zZy0+bGNoYW4sIExDSEFOX1NfQUNUSVZFKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19MQ0hBTiwgU19MQ0hBTl9BQ1RJVkFURV9BQ0ssIG1zZy0+bGNoYW4pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENoYXB0ZXIgOC40LjM6IENoYW5uZWwgQWN0aXZhdGUgTkFDSyAqLworc3RhdGljIGludCByc2xfcnhfY2hhbl9hY3RfbmFjayhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoID0gbXNnYl9sMihtc2cpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCisJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiJXMgQ0hBTk5FTCBBQ1RJVkFURSBOQUNLIiwKKwkJZ3NtX2xjaGFuX25hbWUobXNnLT5sY2hhbikpOworCisJLyogQlRTIGhhcyByZWplY3RlZCBjaGFubmVsIGFjdGl2YXRpb24gPyE/ICovCisJaWYgKGRoLT5pZV9jaGFuICE9IFJTTF9JRV9DSEFOX05SKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJzbF90bHZfcGFyc2UoJnRwLCBkaC0+ZGF0YSwgbXNnYl9sMmxlbihtc2cpLXNpemVvZigqZGgpKTsKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgUlNMX0lFX0NBVVNFKSkgeworCQljb25zdCB1X2ludDhfdCAqY2F1c2UgPSBUTFZQX1ZBTCgmdHAsIFJTTF9JRV9DQVVTRSk7CisJCXByaW50X3JzbF9jYXVzZShMT0dMX0VSUk9SLCBjYXVzZSwKKwkJCQlUTFZQX0xFTigmdHAsIFJTTF9JRV9DQVVTRSkpOworCQlpZiAoKmNhdXNlICE9IFJTTF9FUlJfUkNIX0FMUl9BQ1RWX0FMTE9DKQorCQkJcnNsX2xjaGFuX3NldF9zdGF0ZShtc2ctPmxjaGFuLCBMQ0hBTl9TX05PTkUpOworCX0gZWxzZQorCQlyc2xfbGNoYW5fc2V0X3N0YXRlKG1zZy0+bGNoYW4sIExDSEFOX1NfTk9ORSk7CisKKwlMT0dQQyhEUlNMLCBMT0dMX0VSUk9SLCAiXG4iKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19MQ0hBTiwgU19MQ0hBTl9BQ1RJVkFURV9OQUNLLCBtc2ctPmxjaGFuKTsKKworCWxjaGFuX2ZyZWUobXNnLT5sY2hhbik7CisJcmV0dXJuIDA7Cit9CisKKy8qIENoYXB0ZXIgOC40LjQ6IENvbm5lY3Rpb24gRmFpbHVyZSBJbmRpY2F0aW9uICovCitzdGF0aWMgaW50IHJzbF9yeF9jb25uX2ZhaWwoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKworCS8qIEZJWE1FOiBwcmludCB3aGljaCBjaGFubmVsICovCisJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIiVzIENPTk5FQ1RJT04gRkFJTDogUkVMRUFTSU5HICIsCisJICAgICBnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKSk7CisKKwlyc2xfdGx2X3BhcnNlKCZ0cCwgZGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKmRoKSk7CisKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgUlNMX0lFX0NBVVNFKSkKKwkJcHJpbnRfcnNsX2NhdXNlKExPR0xfTk9USUNFLCBUTFZQX1ZBTCgmdHAsIFJTTF9JRV9DQVVTRSksCisJCQkJVExWUF9MRU4oJnRwLCBSU0xfSUVfQ0FVU0UpKTsKKworCUxPR1BDKERSU0wsIExPR0xfTk9USUNFLCAiXG4iKTsKKwkvKiBGSVhNRTogb25seSBmcmVlIGl0IGFmdGVyIGNoYW5uZWwgcmVsZWFzZSBBQ0sgKi8KKwljb3VudGVyX2luYyhtc2ctPmxjaGFuLT50cy0+dHJ4LT5idHMtPm5ldHdvcmstPnN0YXRzLmNoYW4ucmZfZmFpbCk7CisJcmV0dXJuIHJzbF9yZl9jaGFuX3JlbGVhc2UobXNnLT5sY2hhbik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X21lYXNfcmVwX3VuaShzdHJ1Y3QgZ3NtX21lYXNfcmVwX3VuaWRpciAqbXJ1LAorCQkJCWNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlERUJVR1BDKERNRUFTLCAiUlhMLUZVTEwtJXM9JTNkZEJtIFJYTC1TVUItJXM9JTNkZEJtICIsCisJCXByZWZpeCwgcnhsZXYyZGJtKG1ydS0+ZnVsbC5yeF9sZXYpLAorCQlwcmVmaXgsIHJ4bGV2MmRibShtcnUtPnN1Yi5yeF9sZXYpKTsKKwlERUJVR1BDKERNRUFTLCAiUlhRLUZVTEwtJXM9JWQgUlhRLVNVQi0lcz0lZCAiLAorCQlwcmVmaXgsIG1ydS0+ZnVsbC5yeF9xdWFsLCBwcmVmaXgsIG1ydS0+c3ViLnJ4X3F1YWwpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9tZWFzX3JlcChzdHJ1Y3QgZ3NtX21lYXNfcmVwICptcikKK3sKKwlpbnQgaTsKKworCURFQlVHUChETUVBUywgIk1FQVNVUkVNRU5UIFJFU1VMVCBOUj0lZCAiLCBtci0+bnIpOworCisJaWYgKG1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfRExfRFRYKQorCQlERUJVR1BDKERNRUFTLCAiRFRYZCAiKTsKKworCXByaW50X21lYXNfcmVwX3VuaSgmbXItPnVsLCAidWwiKTsKKwlERUJVR1BDKERNRUFTLCAiQlNfUE9XRVI9JWQgIiwgbXItPmJzX3Bvd2VyKTsKKwlpZiAobXItPmZsYWdzICYgTUVBU19SRVBfRl9NU19UTykKKwkJREVCVUdQQyhETUVBUywgIk1TX1RPPSVkICIsIG1yLT5tc190aW1pbmdfb2Zmc2V0KTsKKworCWlmIChtci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX01TX0wxKSB7CisJCURFQlVHUEMoRE1FQVMsICJMMV9NU19QV1I9JTNkZEJtICIsIG1yLT5tc19sMS5wd3IpOworCQlERUJVR1BDKERNRUFTLCAiTDFfRlBDPSV1ICIsCisJCQltci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX0ZQQyA/IDEgOiAwKTsKKwkJREVCVUdQQyhETUVBUywgIkwxX1RBPSV1ICIsIG1yLT5tc19sMS50YSk7CisJfQorCisJaWYgKG1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfVUxfRFRYKQorCQlERUJVR1BDKERNRUFTLCAiRFRYdSAiKTsKKwlpZiAobXItPmZsYWdzICYgTUVBU19SRVBfRl9CQTEpCisJCURFQlVHUEMoRE1FQVMsICJCQTEgIik7CisJaWYgKCEobXItPmZsYWdzICYgTUVBU19SRVBfRl9ETF9WQUxJRCkpCisJCURFQlVHUEMoRE1FQVMsICJOT1QgVkFMSUQgIik7CisJZWxzZQorCQlwcmludF9tZWFzX3JlcF91bmkoJm1yLT5kbCwgImRsIik7CisKKwlERUJVR1BDKERNRUFTLCAiTlVNX05FSUdIPSV1XG4iLCBtci0+bnVtX2NlbGwpOworCWlmIChtci0+bnVtX2NlbGwgPT0gNykKKwkJcmV0dXJuOworCWZvciAoaSA9IDA7IGkgPCBtci0+bnVtX2NlbGw7IGkrKykgeworCQlzdHJ1Y3QgZ3NtX21lYXNfcmVwX2NlbGwgKm1yYyA9ICZtci0+Y2VsbFtpXTsKKwkJREVCVUdQKERNRUFTLCAiSURYPSV1IEFSRkNOPSV1IEJTSUM9JXUgPT4gJWQgZEJtXG4iLAorCQkJbXJjLT5uZWlnaF9pZHgsIG1yYy0+YXJmY24sIG1yYy0+YnNpYywgcnhsZXYyZGJtKG1yYy0+cnhsZXYpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcnNsX3J4X21lYXNfcmVzKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGggPSBtc2diX2wyKG1zZyk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJc3RydWN0IGdzbV9tZWFzX3JlcCAqbXIgPSBsY2hhbl9uZXh0X21lYXNfcmVwKG1zZy0+bGNoYW4pOworCXVfaW50OF90IGxlbjsKKwljb25zdCB1X2ludDhfdCAqdmFsOworCWludCByYzsKKworCS8qIGNoZWNrIGlmIHRoaXMgY2hhbm5lbCBpcyBhY3R1YWxseSBhY3RpdmUgKi8KKwkvKiBGSVhNRTogbWF5YmUgdGhpcyBjaGVjayBzaG91bGQgYmUgd2F5IG1vcmUgZ2VuZXJpYy9jZW50cmFsaXplZCAqLworCWlmIChtc2ctPmxjaGFuLT5zdGF0ZSAhPSBMQ0hBTl9TX0FDVElWRSkgeworCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiJXM6IE1FQVMgUkVTIGZvciBpbmFjdGl2ZSBjaGFubmVsXG4iLAorCQkJZ3NtX2xjaGFuX25hbWUobXNnLT5sY2hhbikpOworCQlyZXR1cm4gMDsKKwl9CisKKwltZW1zZXQobXIsIDAsIHNpemVvZigqbXIpKTsKKwltci0+bGNoYW4gPSBtc2ctPmxjaGFuOworCisJcnNsX3Rsdl9wYXJzZSgmdHAsIGRoLT5kYXRhLCBtc2diX2wybGVuKG1zZyktc2l6ZW9mKCpkaCkpOworCisJaWYgKCFUTFZQX1BSRVNFTlQoJnRwLCBSU0xfSUVfTUVBU19SRVNfTlIpIHx8CisJICAgICFUTFZQX1BSRVNFTlQoJnRwLCBSU0xfSUVfVVBMSU5LX01FQVMpIHx8CisJICAgICFUTFZQX1BSRVNFTlQoJnRwLCBSU0xfSUVfQlNfUE9XRVIpKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIE1hbmRhdG9yeSBQYXJ0cyAqLworCW1yLT5uciA9ICpUTFZQX1ZBTCgmdHAsIFJTTF9JRV9NRUFTX1JFU19OUik7CisKKwlsZW4gPSBUTFZQX0xFTigmdHAsIFJTTF9JRV9VUExJTktfTUVBUyk7CisJdmFsID0gVExWUF9WQUwoJnRwLCBSU0xfSUVfVVBMSU5LX01FQVMpOworCWlmIChsZW4gPj0gMykgeworCQlpZiAodmFsWzBdICYgMHg0MCkKKwkJCW1yLT5mbGFncyB8PSBNRUFTX1JFUF9GX0RMX0RUWDsKKwkJbXItPnVsLmZ1bGwucnhfbGV2ID0gdmFsWzBdICYgMHgzZjsKKwkJbXItPnVsLnN1Yi5yeF9sZXYgPSB2YWxbMV0gJiAweDNmOworCQltci0+dWwuZnVsbC5yeF9xdWFsID0gdmFsWzJdPj4zICYgMHg3OworCQltci0+dWwuc3ViLnJ4X3F1YWwgPSB2YWxbMl0gJiAweDc7CisJfQorCisJbXItPmJzX3Bvd2VyID0gKlRMVlBfVkFMKCZ0cCwgUlNMX0lFX0JTX1BPV0VSKTsKKworCS8qIE9wdGlvbmFsIFBhcnRzICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9NU19USU1JTkdfT0ZGU0VUKSkKKwkJbXItPm1zX3RpbWluZ19vZmZzZXQgPQorCQkJKlRMVlBfVkFMKCZ0cCwgUlNMX0lFX01TX1RJTUlOR19PRkZTRVQpOworCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9MMV9JTkZPKSkgeworCQl2YWwgPSBUTFZQX1ZBTCgmdHAsIFJTTF9JRV9MMV9JTkZPKTsKKwkJbXItPmZsYWdzIHw9IE1FQVNfUkVQX0ZfTVNfTDE7CisJCW1yLT5tc19sMS5wd3IgPSBtc19wd3JfZGJtKG1zZy0+dHJ4LT5idHMtPmJhbmQsIHZhbFswXSA+PiAzKTsKKwkJaWYgKHZhbFswXSAmIDB4MDQpCisJCQltci0+ZmxhZ3MgfD0gTUVBU19SRVBfRl9GUEM7CisJCW1yLT5tc19sMS50YSA9IHZhbFsxXTsKKwl9CisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9MM19JTkZPKSkgeworCQltc2ctPmwzaCA9ICh1X2ludDhfdCAqKSBUTFZQX1ZBTCgmdHAsIFJTTF9JRV9MM19JTkZPKTsKKwkJcmMgPSBnc200OF9wYXJzZV9tZWFzX3JlcChtciwgbXNnKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKwl9CisKKwlwcmludF9tZWFzX3JlcChtcik7CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfTENIQU4sIFNfTENIQU5fTUVBU19SRVAsIG1yKTsKKworCXJldHVybiAwOworfQorCisvKiBDaGFwdGVyIDguNC43ICovCitzdGF0aWMgaW50IHJzbF9yeF9oYW5kb19kZXQoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKworCURFQlVHUChEUlNMLCAiJXMgSEFORE9WRVIgREVURUNUICIsIGdzbV9sY2hhbl9uYW1lKG1zZy0+bGNoYW4pKTsKKworCXJzbF90bHZfcGFyc2UoJnRwLCBkaC0+ZGF0YSwgbXNnYl9sMmxlbihtc2cpLXNpemVvZigqZGgpKTsKKworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBSU0xfSUVfQUNDRVNTX0RFTEFZKSkKKwkJREVCVUdQQyhEUlNMLCAiYWNjZXNzIGRlbGF5ID0gJXVcbiIsCisJCQkqVExWUF9WQUwoJnRwLCBSU0xfSUVfQUNDRVNTX0RFTEFZKSk7CisJZWxzZQorCQlERUJVR1BDKERSU0wsICJcbiIpOworCisJZGlzcGF0Y2hfc2lnbmFsKFNTX0xDSEFOLCBTX0xDSEFOX0hBTkRPVkVSX0RFVEVDVCwgbXNnLT5sY2hhbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYmlzX3JzbF9yeF9kY2hhbihzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKnJzbGggPSBtc2diX2wyKG1zZyk7CisJaW50IHJjID0gMDsKKwljaGFyICp0c19uYW1lOworCisJbXNnLT5sY2hhbiA9IGxjaGFuX2xvb2t1cChtc2ctPnRyeCwgcnNsaC0+Y2hhbl9ucik7CisJdHNfbmFtZSA9IGdzbV9sY2hhbl9uYW1lKG1zZy0+bGNoYW4pOworCisJc3dpdGNoIChyc2xoLT5jLm1zZ190eXBlKSB7CisJY2FzZSBSU0xfTVRfQ0hBTl9BQ1RJVl9BQ0s6CisJCURFQlVHUChEUlNMLCAiJXMgQ0hBTk5FTCBBQ1RJVkFURSBBQ0tcbiIsIHRzX25hbWUpOworCQlyYyA9IHJzbF9yeF9jaGFuX2FjdF9hY2sobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfQ0hBTl9BQ1RJVl9OQUNLOgorCQlyYyA9IHJzbF9yeF9jaGFuX2FjdF9uYWNrKG1zZyk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0NPTk5fRkFJTDoKKwkJcmMgPSByc2xfcnhfY29ubl9mYWlsKG1zZyk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX01FQVNfUkVTOgorCQlyYyA9IHJzbF9yeF9tZWFzX3Jlcyhtc2cpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9IQU5ET19ERVQ6CisJCXJjID0gcnNsX3J4X2hhbmRvX2RldChtc2cpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9SRl9DSEFOX1JFTF9BQ0s6CisJCURFQlVHUChEUlNMLCAiJXMgUkYgQ0hBTk5FTCBSRUxFQVNFIEFDS1xuIiwgdHNfbmFtZSk7CisJCWlmIChtc2ctPmxjaGFuLT5zdGF0ZSAhPSBMQ0hBTl9TX1JFTF9SRVEpCisJCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiJXMgQ0hBTiBSRUwgQUNLIGJ1dCBzdGF0ZSAlc1xuIiwKKwkJCQlnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKSwKKwkJCQlnc21fbGNoYW5zX25hbWUobXNnLT5sY2hhbi0+c3RhdGUpKTsKKwkJcnNsX2xjaGFuX3NldF9zdGF0ZShtc2ctPmxjaGFuLCBMQ0hBTl9TX05PTkUpOworCQlsY2hhbl9mcmVlKG1zZy0+bGNoYW4pOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9NT0RFX01PRElGWV9BQ0s6CisJCURFQlVHUChEUlNMLCAiJXMgQ0hBTk5FTCBNT0RFIE1PRElGWSBBQ0tcbiIsIHRzX25hbWUpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9NT0RFX01PRElGWV9OQUNLOgorCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICIlcyBDSEFOTkVMIE1PREUgTU9ESUZZIE5BQ0tcbiIsIHRzX25hbWUpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9JUEFDX1BEQ0hfQUNUX0FDSzoKKwkJREVCVUdQQyhEUlNMLCAiJXMgSVBBQyBQRENIIEFDVCBBQ0tcbiIsIHRzX25hbWUpOworCQltc2ctPmxjaGFuLT50cy0+ZmxhZ3MgfD0gVFNfRl9QRENIX01PREU7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0lQQUNfUERDSF9BQ1RfTkFDSzoKKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiJXMgSVBBQyBQRENIIEFDVCBOQUNLXG4iLCB0c19uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSVBBQ19QRENIX0RFQUNUX0FDSzoKKwkJREVCVUdQKERSU0wsICIlcyBJUEFDIFBEQ0ggREVBQ1QgQUNLXG4iLCB0c19uYW1lKTsKKwkJbXNnLT5sY2hhbi0+dHMtPmZsYWdzICY9IH5UU19GX1BEQ0hfTU9ERTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSVBBQ19QRENIX0RFQUNUX05BQ0s6CisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIiVzIElQQUMgUERDSCBERUFDVCBOQUNLXG4iLCB0c19uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfUEhZX0NPTlRFWFRfQ09ORjoKKwljYXNlIFJTTF9NVF9QUkVQUk9DX01FQVNfUkVTOgorCWNhc2UgUlNMX01UX1RBTEtFUl9ERVQ6CisJY2FzZSBSU0xfTVRfTElTVEVORVJfREVUOgorCWNhc2UgUlNMX01UX1JFTU9URV9DT0RFQ19DT05GX1JFUDoKKwljYXNlIFJTTF9NVF9NUl9DT0RFQ19NT0RfQUNLOgorCWNhc2UgUlNMX01UX01SX0NPREVDX01PRF9OQUNLOgorCWNhc2UgUlNMX01UX01SX0NPREVDX01PRF9QRVI6CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICIlcyBVbmltcGxlbWVudGVkIEFiaXMgUlNMIERDaGFuICIKKwkJCSJtc2cgMHglMDJ4XG4iLCB0c19uYW1lLCByc2xoLT5jLm1zZ190eXBlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIiVzIHVua25vd24gQWJpcyBSU0wgRENoYW4gbXNnIDB4JTAyeFxuIiwKKwkJCXRzX25hbWUsIHJzbGgtPmMubXNnX3R5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcnNsX3J4X2Vycm9yX3JlcChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9jb21tb25faGRyICpyc2xoID0gbXNnYl9sMihtc2cpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCisJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiJXMgRVJST1IgUkVQT1JUICIsIGdzbV90cnhfbmFtZShtc2ctPnRyeCkpOworCisJcnNsX3Rsdl9wYXJzZSgmdHAsIHJzbGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKnJzbGgpKTsKKworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBSU0xfSUVfQ0FVU0UpKQorCQlwcmludF9yc2xfY2F1c2UoTE9HTF9FUlJPUiwgVExWUF9WQUwoJnRwLCBSU0xfSUVfQ0FVU0UpLAorCQkJCVRMVlBfTEVOKCZ0cCwgUlNMX0lFX0NBVVNFKSk7CisKKwlMT0dQQyhEUlNMLCBMT0dMX0VSUk9SLCAiXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFiaXNfcnNsX3J4X3RyeChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9jb21tb25faGRyICpyc2xoID0gbXNnYl9sMihtc2cpOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKHJzbGgtPm1zZ190eXBlKSB7CisJY2FzZSBSU0xfTVRfRVJST1JfUkVQT1JUOgorCQlyYyA9IHJzbF9yeF9lcnJvcl9yZXAobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfUkZfUkVTX0lORDoKKwkJLyogaW50ZXJmZXJlbmNlIG9uIGlkbGUgY2hhbm5lbHMgb2YgVFJYICovCisJCS8vREVCVUdQKERSU0wsICIlcyBSRiBSZXNvdXJjZSBJbmRpY2F0aW9uXG4iLCBnc21fdHJ4X25hbWUobXNnLT50cngpKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfT1ZFUkxPQUQ6CisJCS8qIGluZGljYXRlIENDQ0ggLyBBQ0NIIC8gcHJvY2Vzc29yIG92ZXJsb2FkICovCisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIiVzIENDQ0gvQUNDSC9DUFUgT3ZlcmxvYWRcbiIsCisJCSAgICAgZ3NtX3RyeF9uYW1lKG1zZy0+dHJ4KSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICIlcyBVbmtub3duIEFiaXMgUlNMIFRSWCBtZXNzYWdlICIKKwkJCSJ0eXBlIDB4JTAyeFxuIiwgZ3NtX3RyeF9uYW1lKG1zZy0+dHJ4KSwgcnNsaC0+bXNnX3R5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJjOworfQorCisvKiBJZiBUMzEwMSBleHBpcmVzLCB3ZSBuZXZlciByZWNlaXZlZCBhIHJlc3BvbnNlIHRvIElNTUVESUFURSBBU1NJR04gKi8KK3N0YXRpYyB2b2lkIHQzMTAxX2V4cGlyZWQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IGRhdGE7CisKKwlyc2xfcmZfY2hhbl9yZWxlYXNlKGxjaGFuKTsKK30KKworLyogTVMgaGFzIHJlcXVlc3RlZCBhIGNoYW5uZWwgb24gdGhlIFJBQ0ggKi8KK3N0YXRpYyBpbnQgcnNsX3J4X2NoYW5fcnFkKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IG1zZy0+dHJ4LT5idHM7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqcnFkX2hkciA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgZ3NtNDhfcmVxX3JlZiAqcnFkX3JlZjsKKwlzdHJ1Y3QgZ3NtNDhfaW1tX2FzcyBpYTsKKwllbnVtIGdzbV9jaGFuX3QgbGN0eXBlOworCWVudW0gZ3NtX2NocmVxX3JlYXNvbl90IGNocmVxX3JlYXNvbjsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwl1X2ludDhfdCBycWRfdGE7CisJaW50IHJldDsKKworCXVfaW50MTZfdCBhcmZjbjsKKwl1X2ludDhfdCB0c19udW1iZXIsIHN1YmNoOworCisJLyogcGFyc2UgcmVxdWVzdCByZWZlcmVuY2UgdG8gYmUgdXNlZCBpbiBpbW1lZGlhdGUgYXNzaWduICovCisJaWYgKHJxZF9oZHItPmRhdGFbMF0gIT0gUlNMX0lFX1JFUV9SRUZFUkVOQ0UpCisJCXJldHVybiAtRUlOVkFMOworCisJcnFkX3JlZiA9IChzdHJ1Y3QgZ3NtNDhfcmVxX3JlZiAqKSAmcnFkX2hkci0+ZGF0YVsxXTsKKworCS8qIHBhcnNlIGFjY2VzcyBkZWxheSBhbmQgdXNlIGFzIFRBICovCisJaWYgKHJxZF9oZHItPmRhdGFbc2l6ZW9mKHN0cnVjdCBnc200OF9yZXFfcmVmKSsxXSAhPSBSU0xfSUVfQUNDRVNTX0RFTEFZKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlycWRfdGEgPSBycWRfaGRyLT5kYXRhW3NpemVvZihzdHJ1Y3QgZ3NtNDhfcmVxX3JlZikrMl07CisKKwkvKiBkZXRlcm1pbmUgY2hhbm5lbCB0eXBlIChTRENDSC9UQ0hfRi9UQ0hfSCkgYmFzZWQgb24KKwkgKiByZXF1ZXN0IHJlZmVyZW5jZSBSQSAqLworCWxjdHlwZSA9IGdldF9jdHlwZV9ieV9jaHJlcShidHMsIHJxZF9yZWYtPnJhLCBidHMtPm5ldHdvcmstPm5lY2kpOworCWNocmVxX3JlYXNvbiA9IGdldF9yZWFzb25fYnlfY2hyZXEoYnRzLCBycWRfcmVmLT5yYSwgYnRzLT5uZXR3b3JrLT5uZWNpKTsKKworCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMuY2hyZXEudG90YWwpOworCisJLyogY2hlY2sgYXZhaWxhYmlsaXR5IC8gYWxsb2NhdGUgY2hhbm5lbCAqLworCWxjaGFuID0gbGNoYW5fYWxsb2MoYnRzLCBsY3R5cGUpOworCWlmICghbGNoYW4pIHsKKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIkJUUyAlZCBDSEFOIFJRRDogbm8gcmVzb3VyY2VzIGZvciAlcyAweCV4XG4iLAorCQkgICAgIG1zZy0+bGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIGdzbV9sY2hhbnRfbmFtZShsY3R5cGUpLCBycWRfcmVmLT5yYSk7CisJCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMuY2hyZXEubm9fY2hhbm5lbCk7CisJCS8qIEZJWE1FOiBzZW5kIHNvbWUga2luZCBvZiByZWplY3QgPyE/ICovCisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChsY2hhbi0+c3RhdGUgIT0gTENIQU5fU19OT05FKQorCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiJXMgbGNoYW5fYWxsb2MoKSByZXR1cm5lZCBjaGFubmVsICIKKwkJICAgICAiaW4gc3RhdGUgJXNcbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSwKKwkJICAgICBnc21fbGNoYW5zX25hbWUobGNoYW4tPnN0YXRlKSk7CisJcnNsX2xjaGFuX3NldF9zdGF0ZShsY2hhbiwgTENIQU5fU19BQ1RfUkVRKTsKKworCXRzX251bWJlciA9IGxjaGFuLT50cy0+bnI7CisJYXJmY24gPSBsY2hhbi0+dHMtPnRyeC0+YXJmY247CisJc3ViY2ggPSBsY2hhbi0+bnI7CisJCisJbGNoYW4tPmVuY3IuYWxnX2lkID0gUlNMX0VOQ19BTEdfQTUoMCk7CS8qIG5vIGVuY3J5cHRpb24gKi8KKwlsY2hhbi0+bXNfcG93ZXIgPSBtc19wd3JfY3RsX2x2bChidHMtPmJhbmQsIGJ0cy0+bXNfbWF4X3Bvd2VyKTsKKwlsY2hhbi0+YnNfcG93ZXIgPSAwOyAvKiAwZEIgcmVkdWN0aW9uLCBvdXRwdXQgcG93ZXIgPSBQbiAqLworCWxjaGFuLT5yc2xfY21vZGUgPSBSU0xfQ01PRF9TUERfU0lHTjsKKwlsY2hhbi0+dGNoX21vZGUgPSBHU000OF9DTU9ERV9TSUdOOworCXJzbF9jaGFuX2FjdGl2YXRlX2xjaGFuKGxjaGFuLCAweDAwLCBycWRfdGEsIDApOworCisJLyogY3JlYXRlIElNTUVESUFURSBBU1NJR04gMDQuMDggbWVzc2dlICovCisJbWVtc2V0KCZpYSwgMCwgc2l6ZW9mKGlhKSk7CisJaWEubDJfcGxlbiA9IDB4MmQ7CisJaWEucHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19SUjsKKwlpYS5tc2dfdHlwZSA9IEdTTTQ4X01UX1JSX0lNTV9BU1M7CisJaWEucGFnZV9tb2RlID0gR1NNNDhfUE1fU0FNRTsKKwlpYS5jaGFuX2Rlc2MuY2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCWlhLmNoYW5fZGVzYy5oMC5oID0gMDsKKwlpYS5jaGFuX2Rlc2MuaDAuYXJmY25faGlnaCA9IGFyZmNuID4+IDg7CisJaWEuY2hhbl9kZXNjLmgwLmFyZmNuX2xvdyA9IGFyZmNuICYgMHhmZjsKKwlpYS5jaGFuX2Rlc2MuaDAudHNjID0gYnRzLT50c2M7CisJLyogdXNlIHJlcXVlc3QgcmVmZXJlbmNlIGV4dHJhY3RlZCBmcm9tIENIQU5fUlFEICovCisJbWVtY3B5KCZpYS5yZXFfcmVmLCBycWRfcmVmLCBzaXplb2YoaWEucmVxX3JlZikpOworCWlhLnRpbWluZ19hZHZhbmNlID0gcnFkX3RhOworCWlhLm1vYl9hbGxvY19sZW4gPSAwOworCisJREVCVUdQKERSU0wsICIlcyBBY3RpdmF0aW5nIEFSRkNOKCV1KSBTUygldSkgbGN0eXBlICVzICIKKwkJInI9JXMgcmE9MHglMDJ4XG4iLCBnc21fbGNoYW5fbmFtZShsY2hhbiksIGFyZmNuLCBzdWJjaCwKKwkJZ3NtX2xjaGFudF9uYW1lKGxjaGFuLT50eXBlKSwgZ3NtX2NocmVxX25hbWUoY2hyZXFfcmVhc29uKSwKKwkJcnFkX3JlZi0+cmEpOworCisJLyogU3RhcnQgdGltZXIgVDMxMDEgdG8gd2FpdCBmb3IgR1NNNDhfTVRfUlJfUEFHX1JFU1AgKi8KKwlsY2hhbi0+VDMxMDEuY2IgPSB0MzEwMV9leHBpcmVkOworCWxjaGFuLT5UMzEwMS5kYXRhID0gbGNoYW47CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZsY2hhbi0+VDMxMDEsIGJ0cy0+bmV0d29yay0+VDMxMDEsIDApOworCisJLyogc2VuZCBJTU1FRElBVEUgQVNTSUdOIENNRCBvbiBSU0wgdG8gQlRTICh0byBzZW5kIG9uIENDQ0ggdG8gTVMpICovCisJcmV0ID0gcnNsX2ltbV9hc3NpZ25fY21kKGJ0cywgc2l6ZW9mKGlhKSwgKHVfaW50OF90ICopICZpYSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBNUyBoYXMgcmVxdWVzdGVkIGEgY2hhbm5lbCBvbiB0aGUgUkFDSCAqLworc3RhdGljIGludCByc2xfcnhfY2NjaF9sb2FkKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqcnNsaCA9IG1zZ2JfbDIobXNnKTsKKwl1X2ludDE2X3QgcGdfYnVmX3NwYWNlOworCXVfaW50MTZfdCByYWNoX3Nsb3RfY291bnQgPSAtMTsKKwl1X2ludDE2X3QgcmFjaF9idXN5X2NvdW50ID0gLTE7CisJdV9pbnQxNl90IHJhY2hfYWNjZXNzX2NvdW50ID0gLTE7CisKKwlzd2l0Y2ggKHJzbGgtPmRhdGFbMF0pIHsKKwljYXNlIFJTTF9JRV9QQUdJTkdfTE9BRDoKKwkJcGdfYnVmX3NwYWNlID0gcnNsaC0+ZGF0YVsxXSA8PCA4IHwgcnNsaC0+ZGF0YVsyXTsKKwkJaWYgKGlzX2lwYWNjZXNzX2J0cyhtc2ctPnRyeC0+YnRzKSAmJiBwZ19idWZfc3BhY2UgPT0gMHhmZmZmKSB7CisJCQkvKiBwYWdpbmcgbG9hZCBiZWxvdyBjb25maWd1cmVkIHRocmVzaG9sZCwgdXNlIDUwIGFzIGRlZmF1bHQgKi8KKwkJCXBnX2J1Zl9zcGFjZSA9IDUwOworCQl9CisJCXBhZ2luZ191cGRhdGVfYnVmZmVyX3NwYWNlKG1zZy0+dHJ4LT5idHMsIHBnX2J1Zl9zcGFjZSk7CisJCWJyZWFrOworCWNhc2UgUlNMX0lFX1JBQ0hfTE9BRDoKKwkJaWYgKG1zZy0+ZGF0YV9sZW4gPj0gNykgeworCQkJcmFjaF9zbG90X2NvdW50ID0gcnNsaC0+ZGF0YVsyXSA8PCA4IHwgcnNsaC0+ZGF0YVszXTsKKwkJCXJhY2hfYnVzeV9jb3VudCA9IHJzbGgtPmRhdGFbNF0gPDwgOCB8IHJzbGgtPmRhdGFbNV07CisJCQlyYWNoX2FjY2Vzc19jb3VudCA9IHJzbGgtPmRhdGFbNl0gPDwgOCB8IHJzbGgtPmRhdGFbN107CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19yc2xfcnhfY2NoYW4oc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpyc2xoID0gbXNnYl9sMihtc2cpOworCWludCByYyA9IDA7CisKKwltc2ctPmxjaGFuID0gbGNoYW5fbG9va3VwKG1zZy0+dHJ4LCByc2xoLT5jaGFuX25yKTsKKworCXN3aXRjaCAocnNsaC0+Yy5tc2dfdHlwZSkgeworCWNhc2UgUlNMX01UX0NIQU5fUlFEOgorCQkvKiBNUyBoYXMgcmVxdWVzdGVkIGEgY2hhbm5lbCBvbiB0aGUgUkFDSCAqLworCQlyYyA9IHJzbF9yeF9jaGFuX3JxZChtc2cpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9DQ0NIX0xPQURfSU5EOgorCQkvKiBjdXJyZW50IGxvYWQgb24gdGhlIENDQ0ggKi8KKwkJcmMgPSByc2xfcnhfY2NjaF9sb2FkKG1zZyk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0RFTEVURV9JTkQ6CisJCS8qIENDQ0ggb3ZlcmxvYWRlZCwgSU1NX0FTU0lHTiB3YXMgZHJvcHBlZCAqLworCWNhc2UgUlNMX01UX0NCQ0hfTE9BRF9JTkQ6CisJCS8qIGN1cnJlbnQgbG9hZCBvbiB0aGUgQ0JDSCAqLworCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiVW5pbXBsZW1lbnRlZCBBYmlzIFJTTCBUUlggbWVzc2FnZSAiCisJCQkidHlwZSAweCUwMnhcbiIsIHJzbGgtPmMubXNnX3R5cGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiVW5rbm93biBBYmlzIFJTTCBUUlggbWVzc2FnZSB0eXBlICIKKwkJCSIweCUwMnhcbiIsIHJzbGgtPmMubXNnX3R5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcnNsX3J4X3JsbF9lcnJfaW5kKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX3JsbF9oZHIgKnJsbGggPSBtc2diX2wyKG1zZyk7CisJdV9pbnQ4X3QgKnJsbV9jYXVzZSA9IHJsbGgtPmRhdGE7CisKKwlMT0dQKERSTEwsIExPR0xfRVJST1IsICIlcyBFUlJPUiBJTkRJQ0FUSU9OIGNhdXNlPSVzXG4iLAorCQlnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKSwKKwkJcnNsX3JsbV9jYXVzZV9uYW1lKHJsbV9jYXVzZVsxXSkpOworCisJcmxsX2luZGljYXRpb24obXNnLT5sY2hhbiwgcmxsaC0+bGlua19pZCwgQlNDX1JMTFJfSU5EX0VSUl9JTkQpOworCisJaWYgKHJsbV9jYXVzZVsxXSA9PSBSTExfQ0FVU0VfVDIwMF9FWFBJUkVEKSB7CisJCWNvdW50ZXJfaW5jKG1zZy0+bGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yay0+c3RhdHMuY2hhbi5ybGxfZXJyKTsKKwkJcmV0dXJuIHJzbF9yZl9jaGFuX3JlbGVhc2UobXNnLT5sY2hhbik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCUVTVEFCTElTSCBJTkRJQ0FUSU9OLCBMT0NBVElPTiBBUkVBIFVQREFURSBSRVFVRVNUCisJMHgwMiwgMHgwNiwKKwkweDAxLCAweDIwLAorCTB4MDIsIDB4MDAsCisJMHgwYiwgMHgwMCwgMHgwZiwgMHgwNSwgMHgwOCwgLi4uICovCisKK3N0YXRpYyBpbnQgYWJpc19yc2xfcnhfcmxsKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX3JsbF9oZHIgKnJsbGggPSBtc2diX2wyKG1zZyk7CisJaW50IHJjID0gMDsKKwljaGFyICp0c19uYW1lOworCXVfaW50OF90IHNhcGkgPSBybGxoLT5saW5rX2lkICYgNzsKKworCW1zZy0+bGNoYW4gPSBsY2hhbl9sb29rdXAobXNnLT50cngsIHJsbGgtPmNoYW5fbnIpOworCXRzX25hbWUgPSBnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKTsKKwlERUJVR1AoRFJMTCwgIiVzIFNBUEk9JXUgIiwgdHNfbmFtZSwgc2FwaSk7CisJCisJc3dpdGNoIChybGxoLT5jLm1zZ190eXBlKSB7CisJY2FzZSBSU0xfTVRfREFUQV9JTkQ6CisJCURFQlVHUEMoRFJMTCwgIkRBVEEgSU5ESUNBVElPTlxuIik7CisJCWlmIChtc2diX2wybGVuKG1zZykgPgorCQkgICAgc2l6ZW9mKHN0cnVjdCBhYmlzX3JzbF9jb21tb25faGRyKSArIHNpemVvZigqcmxsaCkgJiYKKwkJICAgIHJsbGgtPmRhdGFbMF0gPT0gUlNMX0lFX0wzX0lORk8pIHsKKwkJCW1zZy0+bDNoID0gJnJsbGgtPmRhdGFbM107CisJCQlyZXR1cm4gZ3NtMDQwOF9yY3Ztc2cobXNnLCBybGxoLT5saW5rX2lkKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFJTTF9NVF9FU1RfSU5EOgorCQlERUJVR1BDKERSTEwsICJFU1RBQkxJU0ggSU5ESUNBVElPTlxuIik7CisJCS8qIGxjaGFuIGlzIGVzdGFibGlzaGVkLCBzdG9wIFQzMTAxICovCisJCW1zZy0+bGNoYW4tPnNhcGlzW3JsbGgtPmxpbmtfaWQgJiAweDddID0gTENIQU5fU0FQSV9NUzsKKwkJYnNjX2RlbF90aW1lcigmbXNnLT5sY2hhbi0+VDMxMDEpOworCQlpZiAobXNnYl9sMmxlbihtc2cpID4KKwkJICAgIHNpemVvZihzdHJ1Y3QgYWJpc19yc2xfY29tbW9uX2hkcikgKyBzaXplb2YoKnJsbGgpICYmCisJCSAgICBybGxoLT5kYXRhWzBdID09IFJTTF9JRV9MM19JTkZPKSB7CisJCQltc2ctPmwzaCA9ICZybGxoLT5kYXRhWzNdOworCQkJcmV0dXJuIGdzbTA0MDhfcmN2bXNnKG1zZywgcmxsaC0+bGlua19pZCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfRVNUX0NPTkY6CisJCURFQlVHUEMoRFJMTCwgIkVTVEFCTElTSCBDT05GSVJNXG4iKTsKKwkJbXNnLT5sY2hhbi0+c2FwaXNbcmxsaC0+bGlua19pZCAmIDB4N10gPSBMQ0hBTl9TQVBJX05FVDsKKwkJcmxsX2luZGljYXRpb24obXNnLT5sY2hhbiwgcmxsaC0+bGlua19pZCwKKwkJCQkgIEJTQ19STExSX0lORF9FU1RfQ09ORik7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX1JFTF9JTkQ6CisJCS8qIEJUUyBpbmZvcm1zIHVzIG9mIGhhdmluZyByZWNlaXZlZCAgRElTQyBmcm9tIE1TICovCisJCURFQlVHUEMoRFJMTCwgIlJFTEVBU0UgSU5ESUNBVElPTlxuIik7CisJCW1zZy0+bGNoYW4tPnNhcGlzW3JsbGgtPmxpbmtfaWQgJiAweDddID0gTENIQU5fU0FQSV9VTlVTRUQ7CisJCXJsbF9pbmRpY2F0aW9uKG1zZy0+bGNoYW4sIHJsbGgtPmxpbmtfaWQsCisJCQkJICBCU0NfUkxMUl9JTkRfUkVMX0lORCk7CisJCS8qIHdlIGNhbiBub3cgcmVsZWFlIHRoZSBjaGFubmVsIG9uIHRoZSBCVFMvQWJpcyBzaWRlICovCisJCS8qIEZJWE1FOiBvZmZpY2lhbGx5IHdlIG5lZWQgdG8gc3RhcnQgVDMxMTEgYW5kIHdhaXQgZm9yCisJCSAqIHNvbWUgZ3JhY2UgcGVyaW9kICovCisJCXJzbF9yZl9jaGFuX3JlbGVhc2UobXNnLT5sY2hhbik7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX1JFTF9DT05GOgorCQkvKiBCVFMgaW5mb3JtcyB1cyBvZiBoYXZpbmcgcmVjZWl2ZWQgVUEgZnJvbSBNUywKKwkJICogaW4gcmVzcG9uc2UgdG8gRElTQyB0aGF0IHdlJ3ZlIHNlbnQgZWFybGllciAqLworCQlERUJVR1BDKERSTEwsICJSRUxFQVNFIENPTkZJUk1BVElPTlxuIik7CisJCW1zZy0+bGNoYW4tPnNhcGlzW3JsbGgtPmxpbmtfaWQgJiAweDddID0gTENIQU5fU0FQSV9VTlVTRUQ7CisJCS8qIHdlIGNhbiBub3cgcmVsZWFlIHRoZSBjaGFubmVsIG9uIHRoZSBCVFMvQWJpcyBzaWRlICovCisJCS8qIEZJWE1FOiBvZmZpY2lhbGx5IHdlIG5lZWQgdG8gc3RhcnQgVDMxMTEgYW5kIHdhaXQgZm9yCisJCSAqIHNvbWUgZ3JhY2UgcGVyaW9kICovCisJCXJzbF9yZl9jaGFuX3JlbGVhc2UobXNnLT5sY2hhbik7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0VSUk9SX0lORDoKKwkJcmMgPSByc2xfcnhfcmxsX2Vycl9pbmQobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfVU5JVF9EQVRBX0lORDoKKwkJTE9HUChEUkxMLCBMT0dMX05PVElDRSwgInVuaW1wbGVtZW50ZWQgQWJpcyBSTEwgbWVzc2FnZSAiCisJCQkidHlwZSAweCUwMnhcbiIsIHJsbGgtPmMubXNnX3R5cGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERSTEwsIExPR0xfTk9USUNFLCAidW5rbm93biBBYmlzIFJMTCBtZXNzYWdlICIKKwkJCSJ0eXBlIDB4JTAyeFxuIiwgcmxsaC0+Yy5tc2dfdHlwZSk7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIHVfaW50OF90IGlwYV9zbW9kX3NfZm9yX2xjaGFuKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN3aXRjaCAobGNoYW4tPnRjaF9tb2RlKSB7CisJY2FzZSBHU000OF9DTU9ERV9TUEVFQ0hfVjE6CisJCXN3aXRjaCAobGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBHU01fTENIQU5fVENIX0Y6CisJCQlyZXR1cm4gMHgwMDsKKwkJY2FzZSBHU01fTENIQU5fVENIX0g6CisJCQlyZXR1cm4gMHgwMzsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJY2FzZSBHU000OF9DTU9ERV9TUEVFQ0hfRUZSOgorCQlzd2l0Y2ggKGxjaGFuLT50eXBlKSB7CisJCWNhc2UgR1NNX0xDSEFOX1RDSF9GOgorCQkJcmV0dXJuIDB4MDE7CisJCS8qIHRoZXJlJ3Mgbm8gaGFsZi1yYXRlIEVGUiAqLworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwljYXNlIEdTTTQ4X0NNT0RFX1NQRUVDSF9BTVI6CisJCXN3aXRjaCAobGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBHU01fTENIQU5fVENIX0Y6CisJCQlyZXR1cm4gMHgwMjsKKwkJY2FzZSBHU01fTENIQU5fVENIX0g6CisJCQlyZXR1cm4gMHgwNTsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIkNhbm5vdCBkZXRlcm1pbmUgaXAuYWNjZXNzIHNwZWVjaCBtb2RlIGZvciAiCisJCSJ0Y2hfbW9kZSA9PSAweCUwMnhcbiIsIGxjaGFuLT50Y2hfbW9kZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1X2ludDhfdCBpcGFfcnRwX3B0X2Zvcl9sY2hhbihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzd2l0Y2ggKGxjaGFuLT50Y2hfbW9kZSkgeworCWNhc2UgR1NNNDhfQ01PREVfU1BFRUNIX1YxOgorCQlzd2l0Y2ggKGxjaGFuLT50eXBlKSB7CisJCWNhc2UgR1NNX0xDSEFOX1RDSF9GOgorCQkJcmV0dXJuIFJUUF9QVF9HU01fRlVMTDsKKwkJY2FzZSBHU01fTENIQU5fVENIX0g6CisJCQlyZXR1cm4gUlRQX1BUX0dTTV9IQUxGOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwljYXNlIEdTTTQ4X0NNT0RFX1NQRUVDSF9FRlI6CisJCXN3aXRjaCAobGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBHU01fTENIQU5fVENIX0Y6CisJCQlyZXR1cm4gUlRQX1BUX0dTTV9FRlI7CisJCS8qIHRoZXJlJ3Mgbm8gaGFsZi1yYXRlIEVGUiAqLworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwljYXNlIEdTTTQ4X0NNT0RFX1NQRUVDSF9BTVI6CisJCXN3aXRjaCAobGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBHU01fTENIQU5fVENIX0Y6CisJCQlyZXR1cm4gUlRQX1BUX0FNUl9GVUxMOworCQljYXNlIEdTTV9MQ0hBTl9UQ0hfSDoKKwkJCXJldHVybiBSVFBfUFRfQU1SX0hBTEY7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlMT0dQKERSU0wsIExPR0xfRVJST1IsICJDYW5ub3QgZGV0ZXJtaW5lIGlwLmFjY2VzcyBydHAgcGF5bG9hZCB0eXBlIGZvciAiCisJCSJ0Y2hfbW9kZSA9PSAweCUwMnhcbiAmIGxjaGFuX3R5cGUgPT0gJWQiLAorCQlsY2hhbi0+dGNoX21vZGUsIGxjaGFuLT50eXBlKTsKKwlyZXR1cm4gMDsKK30KKworLyogaXAuYWNjZXNzIHNwZWNpZmljIFJTTCBleHRlbnNpb25zICovCitzdGF0aWMgdm9pZCBpcGFjX3BhcnNlX3J0cChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgc3RydWN0IHRsdl9wYXJzZWQgKnR2KQoreworCXN0cnVjdCBpbl9hZGRyIGlwOworCXVfaW50MTZfdCBwb3J0LCBjb25uX2lkOworCisJaWYgKFRMVlBfUFJFU0VOVCh0diwgUlNMX0lFX0lQQUNfTE9DQUxfSVApKSB7CisJCWlwLnNfYWRkciA9ICooKHVfaW50MzJfdCAqKSBUTFZQX1ZBTCh0diwgUlNMX0lFX0lQQUNfTE9DQUxfSVApKTsKKwkJREVCVUdQQyhEUlNMLCAiTE9DQUxfSVA9JXMgIiwgaW5ldF9udG9hKGlwKSk7CisJCWxjaGFuLT5hYmlzX2lwLmJvdW5kX2lwID0gbnRvaGwoaXAuc19hZGRyKTsKKwl9CisKKwlpZiAoVExWUF9QUkVTRU5UKHR2LCBSU0xfSUVfSVBBQ19MT0NBTF9QT1JUKSkgeworCQlwb3J0ID0gKigodV9pbnQxNl90ICopIFRMVlBfVkFMKHR2LCBSU0xfSUVfSVBBQ19MT0NBTF9QT1JUKSk7CisJCXBvcnQgPSBudG9ocyhwb3J0KTsKKwkJREVCVUdQQyhEUlNMLCAiTE9DQUxfUE9SVD0ldSAiLCBwb3J0KTsKKwkJbGNoYW4tPmFiaXNfaXAuYm91bmRfcG9ydCA9IHBvcnQ7CisJfQorCisJaWYgKFRMVlBfUFJFU0VOVCh0diwgUlNMX0lFX0lQQUNfQ09OTl9JRCkpIHsKKwkJY29ubl9pZCA9ICooKHVfaW50MTZfdCAqKSBUTFZQX1ZBTCh0diwgUlNMX0lFX0lQQUNfQ09OTl9JRCkpOworCQljb25uX2lkID0gbnRvaHMoY29ubl9pZCk7CisJCURFQlVHUEMoRFJTTCwgIkNPTl9JRD0ldSAiLCBjb25uX2lkKTsKKwkJbGNoYW4tPmFiaXNfaXAuY29ubl9pZCA9IGNvbm5faWQ7CisJfQorCisJaWYgKFRMVlBfUFJFU0VOVCh0diwgUlNMX0lFX0lQQUNfUlRQX1BBWUxPQUQyKSkgeworCQlsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZDIgPQorCQkJCSpUTFZQX1ZBTCh0diwgUlNMX0lFX0lQQUNfUlRQX1BBWUxPQUQyKTsKKwkJREVCVUdQQyhEUlNMLCAiUlRQX1BBWUxPQUQyPTB4JTAyeCAiLAorCQkJbGNoYW4tPmFiaXNfaXAucnRwX3BheWxvYWQyKTsKKwl9CisKKwlpZiAoVExWUF9QUkVTRU5UKHR2LCBSU0xfSUVfSVBBQ19TUEVFQ0hfTU9ERSkpIHsKKwkJbGNoYW4tPmFiaXNfaXAuc3BlZWNoX21vZGUgPQorCQkJCSpUTFZQX1ZBTCh0diwgUlNMX0lFX0lQQUNfU1BFRUNIX01PREUpOworCQlERUJVR1BDKERSU0wsICJzcGVlY2hfbW9kZT0weCUwMnggIiwKKwkJCWxjaGFuLT5hYmlzX2lwLnNwZWVjaF9tb2RlKTsKKwl9CisKKwlpZiAoVExWUF9QUkVTRU5UKHR2LCBSU0xfSUVfSVBBQ19SRU1PVEVfSVApKSB7CisJCWlwLnNfYWRkciA9ICooKHVfaW50MzJfdCAqKSBUTFZQX1ZBTCh0diwgUlNMX0lFX0lQQUNfUkVNT1RFX0lQKSk7CisJCURFQlVHUEMoRFJTTCwgIlJFTU9URV9JUD0lcyAiLCBpbmV0X250b2EoaXApKTsKKwkJbGNoYW4tPmFiaXNfaXAuY29ubmVjdF9pcCA9IG50b2hsKGlwLnNfYWRkcik7CisJfQorCisJaWYgKFRMVlBfUFJFU0VOVCh0diwgUlNMX0lFX0lQQUNfUkVNT1RFX1BPUlQpKSB7CisJCXBvcnQgPSAqKCh1X2ludDE2X3QgKikgVExWUF9WQUwodHYsIFJTTF9JRV9JUEFDX1JFTU9URV9QT1JUKSk7CisJCXBvcnQgPSBudG9ocyhwb3J0KTsKKwkJREVCVUdQQyhEUlNMLCAiUkVNT1RFX1BPUlQ9JXUgIiwgcG9ydCk7CisJCWxjaGFuLT5hYmlzX2lwLmNvbm5lY3RfcG9ydCA9IHBvcnQ7CisJfQorfQorCitpbnQgcnNsX2lwYWNjX2NyY3goc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfSVBBQ19DUkNYKTsKKwlkaC0+Yy5tc2dfZGlzY3IgPSBBQklTX1JTTF9NRElTQ19JUEFDQ0VTUzsKKwlkaC0+Y2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCisJLyogMHgxLSA9PSByZWNlaXZlLW9ubHksIDB4LTEgPT0gRUZSIGNvZGVjICovCisJbGNoYW4tPmFiaXNfaXAuc3BlZWNoX21vZGUgPSAweDEwIHwgaXBhX3Ntb2Rfc19mb3JfbGNoYW4obGNoYW4pOworCWxjaGFuLT5hYmlzX2lwLnJ0cF9wYXlsb2FkID0gaXBhX3J0cF9wdF9mb3JfbGNoYW4obGNoYW4pOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0lQQUNfU1BFRUNIX01PREUsIGxjaGFuLT5hYmlzX2lwLnNwZWVjaF9tb2RlKTsKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9JUEFDX1JUUF9QQVlMT0FELCBsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZCk7CisKKwlERUJVR1AoRFJTTCwgIiVzIElQQUNfQklORCBzcGVlY2hfbW9kZT0weCUwMnggUlRQX1BBWUxPQUQ9JWRcbiIsCisJCWdzbV9sY2hhbl9uYW1lKGxjaGFuKSwgbGNoYW4tPmFiaXNfaXAuc3BlZWNoX21vZGUsCisJCWxjaGFuLT5hYmlzX2lwLnJ0cF9wYXlsb2FkKTsKKworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCitpbnQgcnNsX2lwYWNjX21kY3goc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50MzJfdCBpcCwgdV9pbnQxNl90IHBvcnQsCisJCSAgIHVfaW50OF90IHJ0cF9wYXlsb2FkMikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwl1X2ludDMyX3QgKmF0dF9pcDsKKwlzdHJ1Y3QgaW5fYWRkciBpYTsKKworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9JUEFDX01EQ1gpOworCWRoLT5jLm1zZ19kaXNjciA9IEFCSVNfUlNMX01ESVNDX0lQQUNDRVNTOworCWRoLT5jaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisKKwkvKiB3ZSBuZWVkIHRvIHN0b3JlIHRoZXNlIG5vdyBhcyBNRENYX0FDSyBkb2VzIG5vdCByZXR1cm4gdGhlbSA6KCAqLworCWxjaGFuLT5hYmlzX2lwLnJ0cF9wYXlsb2FkMiA9IHJ0cF9wYXlsb2FkMjsKKwlsY2hhbi0+YWJpc19pcC5jb25uZWN0X3BvcnQgPSBwb3J0OworCWxjaGFuLT5hYmlzX2lwLmNvbm5lY3RfaXAgPSBpcDsKKworCS8qIDB4MC0gPT0gYm90aCBkaXJlY3Rpb25zLCAweC0xID09IEVGUiBjb2RlYyAqLworCWxjaGFuLT5hYmlzX2lwLnNwZWVjaF9tb2RlID0gMHgwMCB8IGlwYV9zbW9kX3NfZm9yX2xjaGFuKGxjaGFuKTsKKwlsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZCA9IGlwYV9ydHBfcHRfZm9yX2xjaGFuKGxjaGFuKTsKKworCWlhLnNfYWRkciA9IGh0b25sKGlwKTsKKwlERUJVR1AoRFJTTCwgIiVzIElQQUNfTURDWCBJUD0lcyBQT1JUPSVkIFJUUF9QQVlMT0FEPSVkIFJUUF9QQVlMT0FEMj0lZCAiCisJCSJDT05OX0lEPSVkIHNwZWVjaF9tb2RlPTB4JTAyeFxuIiwgZ3NtX2xjaGFuX25hbWUobGNoYW4pLAorCQlpbmV0X250b2EoaWEpLCBwb3J0LCBsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZCwgcnRwX3BheWxvYWQyLAorCQlsY2hhbi0+YWJpc19pcC5jb25uX2lkLCBsY2hhbi0+YWJpc19pcC5zcGVlY2hfbW9kZSk7CisKKwltc2diX3R2MTZfcHV0KG1zZywgUlNMX0lFX0lQQUNfQ09OTl9JRCwgbGNoYW4tPmFiaXNfaXAuY29ubl9pZCk7CisJbXNnYl92X3B1dChtc2csIFJTTF9JRV9JUEFDX1JFTU9URV9JUCk7CisJYXR0X2lwID0gKHVfaW50MzJfdCAqKSBtc2diX3B1dChtc2csIHNpemVvZihpcCkpOworCSphdHRfaXAgPSBpYS5zX2FkZHI7CisJbXNnYl90djE2X3B1dChtc2csIFJTTF9JRV9JUEFDX1JFTU9URV9QT1JULCBwb3J0KTsKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9JUEFDX1NQRUVDSF9NT0RFLCBsY2hhbi0+YWJpc19pcC5zcGVlY2hfbW9kZSk7CisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRCwgbGNoYW4tPmFiaXNfaXAucnRwX3BheWxvYWQpOworCWlmIChydHBfcGF5bG9hZDIpCisJCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0lQQUNfUlRQX1BBWUxPQUQyLCBydHBfcGF5bG9hZDIpOworCQorCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCisvKiB0ZWxsIEJUUyB0byBjb25uZWN0IFJUUCBzdHJlYW0gdG8gb3VyIGxvY2FsIFJUUCBzb2NrZXQgKi8KK2ludCByc2xfaXBhY2NfbWRjeF90b19ydHBzb2NrKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBydHBfc29ja2V0ICpycyA9IGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQ7CisJaW50IHJjOworCisJcmMgPSByc2xfaXBhY2NfbWRjeChsY2hhbiwgbnRvaGwocnMtPnJ0cC5zaW5fbG9jYWwuc2luX2FkZHIuc19hZGRyKSwKKwkJCQludG9ocyhycy0+cnRwLnNpbl9sb2NhbC5zaW5fcG9ydCksCisJCQkvKiBGSVhNRTogdXNlIFJUUCBwYXlsb2FkIG9mIGJvdW5kIHNvY2tldCwgbm90IEJUUyovCisJCQkJbGNoYW4tPmFiaXNfaXAucnRwX3BheWxvYWQyKTsKKworCXJldHVybiByYzsKK30KKworaW50IHJzbF9pcGFjY19wZGNoX2FjdGl2YXRlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBpbnQgYWN0KQoreworCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXVfaW50OF90IG1zZ190eXBlOworCisJaWYgKGFjdCkKKwkJbXNnX3R5cGUgPSBSU0xfTVRfSVBBQ19QRENIX0FDVDsKKwllbHNlCisJCW1zZ190eXBlID0gUlNMX01UX0lQQUNfUERDSF9ERUFDVDsKKworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIG1zZ190eXBlKTsKKwlkaC0+Yy5tc2dfZGlzY3IgPSBBQklTX1JTTF9NRElTQ19ERURfQ0hBTjsKKwlkaC0+Y2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCisJREVCVUdQKERSU0wsICIlcyBJUEFDX1BEQ0hfJXNBQ1RcbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSwKKwkJYWN0ID8gIiIgOiAiREUiKTsKKworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCitzdGF0aWMgaW50IGFiaXNfcnNsX3J4X2lwYWNjX2NyY3hfYWNrKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGggPSBtc2diX2wyKG1zZyk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHY7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBtc2ctPmxjaGFuOworCisJLyogdGhlIEJUUyBoYXMgYWNrbm93bGVkZ2VkIGEgbG9jYWwgYmluZCwgaXQgbm93IHRlbGxzIHVzIHRoZSBJUAorCSogYWRkcmVzcyBhbmQgcG9ydCBudW1iZXIgdG8gd2hpY2ggaXQgaGFzIGJvdW5kIHRoZSBnaXZlbiBsb2dpY2FsCisJKiBjaGFubmVsICovCisKKwlyc2xfdGx2X3BhcnNlKCZ0diwgZGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKmRoKSk7CisJaWYgKCFUTFZQX1BSRVNFTlQoJnR2LCBSU0xfSUVfSVBBQ19MT0NBTF9QT1JUKSB8fAorCSAgICAhVExWUF9QUkVTRU5UKCZ0diwgUlNMX0lFX0lQQUNfTE9DQUxfSVApIHx8CisJICAgICFUTFZQX1BSRVNFTlQoJnR2LCBSU0xfSUVfSVBBQ19DT05OX0lEKSkgeworCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAibWFuZGF0b3J5IElFIG1pc3NpbmciKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaXBhY19wYXJzZV9ydHAobGNoYW4sICZ0dik7CisKKwkvKiBpbiBjYXNlIHdlIGRvbid0IHVzZSBkaXJlY3QgQlRTLXRvLUJUUyBSVFAgKi8KKwlpZiAoIWlwYWNjX3J0cF9kaXJlY3QpIHsKKwkJaW50IHJjOworCQkvKiB0aGUgQlRTIGhhcyBzdWNjZXNzZnVsbHkgYm91bmQgYSBUQ0ggdG8gYSBsb2NhbCBpcC9wb3J0LAorCQkgKiB3aGljaCBtZWFucyB3ZSBjYW4gY29ubmVjdCBvdXIgVURQIHNvY2tldCB0byBpdCAqLworCQlpZiAobGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCkgeworCQkJcnRwX3NvY2tldF9mcmVlKGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQpOworCQkJbGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCA9IE5VTEw7CisJCX0KKworCQlsY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0ID0gcnRwX3NvY2tldF9jcmVhdGUoKTsKKwkJaWYgKCFsY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0KQorCQkJZ290byBvdXRfZXJyOworCisJCXJjID0gcnRwX3NvY2tldF9jb25uZWN0KGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQsCisJCQkJICAgbGNoYW4tPmFiaXNfaXAuYm91bmRfaXAsCisJCQkJICAgbGNoYW4tPmFiaXNfaXAuYm91bmRfcG9ydCk7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIG91dF9lcnI7CisJfQorCisJZGlzcGF0Y2hfc2lnbmFsKFNTX0FCSVNJUCwgU19BQklTSVBfQ1JDWF9BQ0ssIG1zZy0+bGNoYW4pOworCisJcmV0dXJuIDA7CitvdXRfZXJyOgorCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50IGFiaXNfcnNsX3J4X2lwYWNjX21kY3hfYWNrKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGggPSBtc2diX2wyKG1zZyk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHY7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBtc2ctPmxjaGFuOworCisJLyogdGhlIEJUUyBoYXMgYWNrbm93bGVkZ2VkIGEgcmVtb3RlIGNvbm5lY3QgcmVxdWVzdCBhbmQKKwkgKiBpdCBub3cgdGVsbHMgdXMgdGhlIElQIGFkZHJlc3MgYW5kIHBvcnQgbnVtYmVyIHRvIHdoaWNoIGl0IGhhcworCSAqIGNvbm5lY3RlZCB0aGUgZ2l2ZW4gbG9naWNhbCBjaGFubmVsICovCisKKwlyc2xfdGx2X3BhcnNlKCZ0diwgZGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKmRoKSk7CisJaXBhY19wYXJzZV9ydHAobGNoYW4sICZ0dik7CisJZGlzcGF0Y2hfc2lnbmFsKFNTX0FCSVNJUCwgU19BQklTSVBfTURDWF9BQ0ssIG1zZy0+bGNoYW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19yc2xfcnhfaXBhY2NfZGxjeF9pbmQoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0djsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IG1zZy0+bGNoYW47CisKKwlyc2xfdGx2X3BhcnNlKCZ0diwgZGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKmRoKSk7CisKKwlpZiAoVExWUF9QUkVTRU5UKCZ0diwgUlNMX0lFX0NBVVNFKSkKKwkJcHJpbnRfcnNsX2NhdXNlKExPR0xfREVCVUcsIFRMVlBfVkFMKCZ0diwgUlNMX0lFX0NBVVNFKSwKKwkJCQlUTFZQX0xFTigmdHYsIFJTTF9JRV9DQVVTRSkpOworCisJLyogdGhlIEJUUyB0ZWxscyB1cyBhIFJUUCBzdHJlYW0gaGFzIGJlZW4gZGlzY29ubmVjdGVkICovCisJaWYgKGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQpIHsKKwkJcnRwX3NvY2tldF9mcmVlKGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQpOworCQlsY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0ID0gTlVMTDsKKwl9CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfQUJJU0lQLCBTX0FCSVNJUF9ETENYX0lORCwgbXNnLT5sY2hhbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYmlzX3JzbF9yeF9pcGFjYyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9ybGxfaGRyICpybGxoID0gbXNnYl9sMihtc2cpOworCWNoYXIgKnRzX25hbWU7CisJaW50IHJjID0gMDsKKworCW1zZy0+bGNoYW4gPSBsY2hhbl9sb29rdXAobXNnLT50cngsIHJsbGgtPmNoYW5fbnIpOworCXRzX25hbWUgPSBnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKTsKKwkKKwlzd2l0Y2ggKHJsbGgtPmMubXNnX3R5cGUpIHsKKwljYXNlIFJTTF9NVF9JUEFDX0NSQ1hfQUNLOgorCQlERUJVR1AoRFJTTCwgIiVzIElQQUNfQ1JDWF9BQ0sgIiwgdHNfbmFtZSk7CisJCXJjID0gYWJpc19yc2xfcnhfaXBhY2NfY3JjeF9hY2sobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSVBBQ19DUkNYX05BQ0s6CisJCS8qIHNvbWVob3cgdGhlIEJUUyB3YXMgdW5hYmxlIHRvIGJpbmQgdGhlIGxjaGFuIHRvIGl0cyBsb2NhbAorCQkgKiBwb3J0PyE/ICovCisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIiVzIElQQUNfQ1JDWF9OQUNLXG4iLCB0c19uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSVBBQ19NRENYX0FDSzoKKwkJLyogdGhlIEJUUyB0ZWxscyB1cyB0aGF0IGEgY29ubmVjdCBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgKi8KKwkJREVCVUdQKERSU0wsICIlcyBJUEFDX01EQ1hfQUNLICIsIHRzX25hbWUpOworCQlyYyA9IGFiaXNfcnNsX3J4X2lwYWNjX21kY3hfYWNrKG1zZyk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0lQQUNfTURDWF9OQUNLOgorCQkvKiBzb21laG93IHRoZSBCVFMgd2FzIHVuYWJsZSB0byBjb25uZWN0IHRoZSBsY2hhbiB0byBhIHJlbW90ZQorCQkgKiBwb3J0ICovCisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIiVzIElQQUNfTURDWF9OQUNLXG4iLCB0c19uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSVBBQ19ETENYX0lORDoKKwkJREVCVUdQKERSU0wsICIlcyBJUEFDX0RMQ1hfSU5EICIsIHRzX25hbWUpOworCQlyYyA9IGFiaXNfcnNsX3J4X2lwYWNjX2RsY3hfaW5kKG1zZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICJVbmtub3duIGlwLmFjY2VzcyBtc2dfdHlwZSAweCUwMnhcbiIsCisJCQlybGxoLT5jLm1zZ190eXBlKTsKKwkJYnJlYWs7CisJfQorCURFQlVHUEMoRFJTTCwgIlxuIik7CisKKwlyZXR1cm4gcmM7Cit9CisKKworLyogRW50cnktcG9pbnQgd2hlcmUgTDIgUlNMIGZyb20gQlRTIGVudGVycyAqLworaW50IGFiaXNfcnNsX3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9jb21tb25faGRyICpyc2xoOworCWludCByYyA9IDA7CisKKwlpZiAoIW1zZykgeworCQlERUJVR1AoRFJTTCwgIkVtcHR5IFJTTCBtc2c/Li5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKG1zZ2JfbDJsZW4obXNnKSA8IHNpemVvZigqcnNsaCkpIHsKKwkJREVCVUdQKERSU0wsICJUcnVuY2F0ZWQgUlNMIG1lc3NhZ2Ugd2l0aCBsMmxlbjogJXVcbiIsIG1zZ2JfbDJsZW4obXNnKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyc2xoID0gbXNnYl9sMihtc2cpOworCisJc3dpdGNoIChyc2xoLT5tc2dfZGlzY3IgJiAweGZlKSB7CisJY2FzZSBBQklTX1JTTF9NRElTQ19STEw6CisJCXJjID0gYWJpc19yc2xfcnhfcmxsKG1zZyk7CisJCWJyZWFrOworCWNhc2UgQUJJU19SU0xfTURJU0NfREVEX0NIQU46CisJCXJjID0gYWJpc19yc2xfcnhfZGNoYW4obXNnKTsKKwkJYnJlYWs7CisJY2FzZSBBQklTX1JTTF9NRElTQ19DT01fQ0hBTjoKKwkJcmMgPSBhYmlzX3JzbF9yeF9jY2hhbihtc2cpOworCQlicmVhazsKKwljYXNlIEFCSVNfUlNMX01ESVNDX1RSWDoKKwkJcmMgPSBhYmlzX3JzbF9yeF90cngobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBBQklTX1JTTF9NRElTQ19MT0M6CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICJ1bmltcGxlbWVudGVkIFJTTCBtc2cgZGlzYyAweCUwMnhcbiIsCisJCQlyc2xoLT5tc2dfZGlzY3IpOworCQlicmVhazsKKwljYXNlIEFCSVNfUlNMX01ESVNDX0lQQUNDRVNTOgorCQlyYyA9IGFiaXNfcnNsX3J4X2lwYWNjKG1zZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICJ1bmtub3duIFJTTCBtZXNzYWdlIGRpc2NyaW1pbmF0b3IgIgorCQkJIjB4JTAyeFxuIiwgcnNsaC0+bXNnX2Rpc2NyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1zZ2JfZnJlZShtc2cpOworCXJldHVybiByYzsKK30KKworLyogRnJvbSBUYWJsZSAxMC41LjMzIG9mIEdTTSAwNC4wOCAqLworaW50IHJzbF9udW1iZXJfb2ZfcGFnaW5nX3N1YmNoYW5uZWxzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJaWYgKGJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5jY2NoX2NvbmYgPT0gUlNMX0JDQ0hfQ0NDSF9DT05GXzFfQykgeworCQlyZXR1cm4gTUFYKDEsICgzIC0gYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmJzX2FnX2Jsa3NfcmVzKSkKKwkJCSogKGJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5ic19wYV9tZnJtcyArIDIpOworCX0gZWxzZSB7CisJCXJldHVybiAoOSAtIGJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5ic19hZ19ibGtzX3JlcykKKwkJCSogKGJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5ic19wYV9tZnJtcyArIDIpOworCX0KK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2JzMTFfY29uZmlnLmMgYi9vcGVuYnNjL3NyYy9iczExX2NvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0Y2VmMGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9iczExX2NvbmZpZy5jCkBAIC0wLDAgKzEsODc0IEBACisvKiBTaWVtZW5zIEJTLTExIG1pY3JvQlRTIGNvbmZpZ3VyYXRpb24gdG9vbCAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYmFzZWQgb24gaWRlYXMgKGJ1dCBub3QgY29kZSkgb2YgQlMxMUNvbmZpZworICogKEMpIDIwMDkgYnkgRGlldGVyIFNwYWFyIDxzcGFhckBtaXJpZGVyLmF1Z3VzdGEuZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcnMyMzIuaD4KKworLyogc3RhdGUgb2Ygb3VyIGJzMTFfY29uZmlnIGFwcGxpY2F0aW9uICovCitlbnVtIGJzMTFjZmdfc3RhdGUgeworCVNUQVRFX05PTkUsCisJU1RBVEVfTE9HT05fV0FJVCwKKwlTVEFURV9MT0dPTl9BQ0ssCisJU1RBVEVfU1dMT0FELAorCVNUQVRFX1FVRVJZLAorfTsKK3N0YXRpYyBlbnVtIGJzMTFjZmdfc3RhdGUgYnMxMWNmZ19zdGF0ZSA9IFNUQVRFX05PTkU7CitzdGF0aWMgY2hhciAqY29tbWFuZCwgKnZhbHVlOworc3RydWN0IHRpbWVyX2xpc3Qgc3RhdHVzX3RpbWVyOworCitzdGF0aWMgY29uc3QgdV9pbnQ4X3Qgb2JqX2xpX2F0dHJbXSA9IHsKKwlOTV9BVFRfQlMxMV9CSVRfRVJSX1RIRVNILCAweDA5LCAweDAwLAorCU5NX0FUVF9CUzExX0wxX1BST1RfVFlQRSwgMHgwMCwKKwlOTV9BVFRfQlMxMV9MSU5FX0NGRywgMHgwMCwKK307CitzdGF0aWMgY29uc3QgdV9pbnQ4X3Qgb2JqX2Jic2lnMF9hdHRyW10gPSB7CisJTk1fQVRUX0JTMTFfUlNTSV9PRkZTLCAweDAyLCAweDAwLCAweDAwLAorCU5NX0FUVF9CUzExX0RJVkVSU0lUWSwgMHgwMSwgMHgwMCwKK307CitzdGF0aWMgY29uc3QgdV9pbnQ4X3Qgb2JqX3BhMF9hdHRyW10gPSB7CisJTk1fQVRUX0JTMTFfVFhQV1IsIDB4MDEsIEJTMTFfVFJYX1BPV0VSX0dTTV8zMG1XLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICp0cngxX3Bhc3N3b3JkID0gIjExMTExMTExMTEiOworI2RlZmluZSBURUlfT01MCTI1CisKK3N0YXRpYyBjb25zdCB1X2ludDhfdCB0b29fZmFzdFtdID0geyAweDEyLCAweDgwLCAweDAwLCAweDAwLCAweDAyLCAweDAyIH07CisKK3N0YXRpYyBzdHJ1Y3QgbG9nX3RhcmdldCAqc3RkZXJyX3RhcmdldDsKKworLyogZHVtbXkgZnVuY3Rpb24gdG8ga2VlcCBnc21fZGF0YS5jIGhhcHB5ICovCitzdHJ1Y3QgY291bnRlciAqY291bnRlcl9hbGxvYyhjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiBOVUxMOworfQorCitpbnQgaGFuZGxlX3NlcmlhbF9tc2coc3RydWN0IG1zZ2IgKnJ4X21zZyk7CisKKy8qIGNyZWF0ZSBhbGwgb2JqZWN0cyBmb3IgYW4gaW5pdGlhbCBjb25maWd1cmF0aW9uICovCitzdGF0aWMgaW50IGNyZWF0ZV9vYmplY3RzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJZnByaW50ZihzdGRvdXQsICJDcmF0aW5nIE9iamVjdHMgZm9yIG1pbmltYWwgY29uZmlnXG4iKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX29iamVjdChidHMsIEJTMTFfT0JKX0xJLCAwLCBzaXplb2Yob2JqX2xpX2F0dHIpLAorCQkJCSAgIG9ial9saV9hdHRyKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX29iamVjdChidHMsIEJTMTFfT0JKX0dQU1UsIDAsIDAsIE5VTEwpOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfb2JqZWN0KGJ0cywgQlMxMV9PQkpfQUxDTywgMCwgMCwgTlVMTCk7CisJYWJpc19ubV9iczExX2NyZWF0ZV9vYmplY3QoYnRzLCBCUzExX09CSl9DQ0xLLCAwLCAwLCBOVUxMKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX29iamVjdChidHMsIEJTMTFfT0JKX0JCU0lHLCAwLAorCQkJCSAgIHNpemVvZihvYmpfYmJzaWcwX2F0dHIpLCBvYmpfYmJzaWcwX2F0dHIpOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfb2JqZWN0KGJ0cywgQlMxMV9PQkpfUEEsIDAsCisJCQkJICAgc2l6ZW9mKG9ial9wYTBfYXR0ciksIG9ial9wYTBfYXR0cik7CisJYWJpc19ubV9iczExX2NyZWF0ZV9lbnZhQlRTRShidHMsIDApOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfZW52YUJUU0UoYnRzLCAxKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX2VudmFCVFNFKGJ0cywgMik7CisJYWJpc19ubV9iczExX2NyZWF0ZV9lbnZhQlRTRShidHMsIDMpOworCisJYWJpc19ubV9iczExX2Nvbm5fb21sX3RlaShidHMsIDAsIDEsIDB4ZmYsIFRFSV9PTUwpOworCisJYWJpc19ubV9iczExX3NldF90cnhfcG93ZXIoYnRzLT5jMCwgQlMxMV9UUlhfUE9XRVJfR1NNXzMwbVcpOworCQorCXNsZWVwKDEpOworCisJYWJpc19ubV9iczExX3NldF90cngxX3B3KGJ0cywgdHJ4MV9wYXNzd29yZCk7CisKKwlzbGVlcCgxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNyZWF0ZV90cngxKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJdV9pbnQ4X3QgYmJzaWcxX2F0dHJbc2l6ZW9mKG9ial9iYnNpZzBfYXR0cikrMTJdOworCXVfaW50OF90ICpjdXIgPSBiYnNpZzFfYXR0cjsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIDEpOworCisJaWYgKCF0cngpCisJCXRyeCA9IGdzbV9idHNfdHJ4X2FsbG9jKGJ0cyk7CisKKwlmcHJpbnRmKHN0ZG91dCwgIkNyYXRpbmcgT2JqZWN0cyBmb3IgVFJYMVxuIik7CisKKwlhYmlzX25tX2JzMTFfc2V0X3RyeDFfcHcoYnRzLCB0cngxX3Bhc3N3b3JkKTsKKworCXNsZWVwKDEpOworCisJY3VyID0gdGx2X3B1dChjdXIsIE5NX0FUVF9CUzExX1BBU1NXT1JELCAxMCwKKwkJICAgICAgKHVfaW50OF90ICopdHJ4MV9wYXNzd29yZCk7CisJbWVtY3B5KGN1ciwgb2JqX2Jic2lnMF9hdHRyLCBzaXplb2Yob2JqX2Jic2lnMF9hdHRyKSk7CisJYWJpc19ubV9iczExX2NyZWF0ZV9vYmplY3QoYnRzLCBCUzExX09CSl9CQlNJRywgMSwKKwkJCQkgICBzaXplb2YoYmJzaWcxX2F0dHIpLCBiYnNpZzFfYXR0cik7CisJYWJpc19ubV9iczExX2NyZWF0ZV9vYmplY3QoYnRzLCBCUzExX09CSl9QQSwgMSwKKwkJCQkgICBzaXplb2Yob2JqX3BhMF9hdHRyKSwgb2JqX3BhMF9hdHRyKTsKKwlhYmlzX25tX2JzMTFfc2V0X3RyeF9wb3dlcih0cngsIEJTMTFfVFJYX1BPV0VSX0dTTV8zMG1XKTsKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNoYXIgKnNlcmlhbF9wb3J0ID0gIi9kZXYvdHR5VVNCMCI7CitzdGF0aWMgY2hhciAqZm5hbWVfc2FmZXR5ID0gIkJUU0JNQzc2LlNXSSI7CitzdGF0aWMgY2hhciAqZm5hbWVfc29mdHdhcmUgPSAiSFMwMTExMDYuU1dMIjsKK3N0YXRpYyBpbnQgZGVsYXlfbXMgPSAwOworc3RhdGljIGludCB3aW5fc2l6ZSA9IDg7CitzdGF0aWMgaW50IHBhcmFtX2Rpc2Nvbm5lY3QgPSAwOworc3RhdGljIGludCBwYXJhbV9yZXN0YXJ0ID0gMDsKK3N0YXRpYyBpbnQgcGFyYW1fZm9yY2VkID0gMDsKK3N0YXRpYyBzdHJ1Y3QgZ3NtX2J0cyAqZ19idHM7CisKK3N0YXRpYyBpbnQgZmlsZV9pc19yZWFkYWJsZShjb25zdCBjaGFyICpmbmFtZSkKK3sKKwlpbnQgcmM7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlyYyA9IHN0YXQoZm5hbWUsICZzdCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoU19JU1JFRyhzdC5zdF9tb2RlKSAmJiAoc3Quc3RfbW9kZSAmIFNfSVJVU1IpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBlcmNlbnQ7CitzdGF0aWMgaW50IHBlcmNlbnRfb2xkOworCisvKiBjYWxsYmFjayBmdW5jdGlvbiBwYXNzZWQgdG8gdGhlIEFCSVMgT01MIGNvZGUgKi8KK3N0YXRpYyBpbnQgc3dsb2FkX2NiZm4odW5zaWduZWQgaW50IGhvb2ssIHVuc2lnbmVkIGludCBldmVudCwgc3RydWN0IG1zZ2IgKm1zZywKKwkJICAgICAgIHZvaWQgKmRhdGEsIHZvaWQgKnBhcmFtKQoreworCWlmIChob29rICE9IEdTTV9IT09LX05NX1NXTE9BRCkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBOTV9NVF9MT0FEX0lOSVRfQUNLOgorCQlmcHJpbnRmKHN0ZG91dCwgIlNvZnR3YXJlIExvYWQgSW5pdGlhdGUgQUNLXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9MT0FEX0lOSVRfTkFDSzoKKwkJZnByaW50ZihzdGRlcnIsICJFUlJPUjogU29mdHdhcmUgTG9hZCBJbml0aWF0ZSBOQUNLXG4iKTsKKwkJZXhpdCg1KTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9MT0FEX0VORF9BQ0s6CisJCWlmIChkYXRhKSB7CisJCQkvKiB3ZSBkaWQgYSBzYWZldHkgbG9hZCBhbmQgbXVzdCBhY3RpdmF0ZSBpdCAqLworCQkJYWJpc19ubV9zb2Z0d2FyZV9hY3RpdmF0ZShnX2J0cywgZm5hbWVfc2FmZXR5LAorCQkJCQkJICBzd2xvYWRfY2JmbiwgZ19idHMpOworCQkJc2xlZXAoNSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9MT0FEX0VORF9OQUNLOgorCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBTb2Z0d2FyZSBMb2FkIEVuZCBOQUNLXG4iKTsKKwkJZXhpdCgzKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9BQ1RJVkFURV9TV19OQUNLOgorCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBBY3RpdmF0ZSBTb2Z0d2FyZSBOQUNLXG4iKTsKKwkJZXhpdCg0KTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9BQ1RJVkFURV9TV19BQ0s6CisJCWJzMTFjZmdfc3RhdGUgPSBTVEFURV9OT05FOworCQkKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9MT0FEX1NFR19BQ0s6CisJCXBlcmNlbnQgPSBhYmlzX25tX3NvZnR3YXJlX2xvYWRfc3RhdHVzKGdfYnRzKTsKKwkJaWYgKHBlcmNlbnQgPiBwZXJjZW50X29sZCkKKwkJCXByaW50ZigiU29mdHdhcmUgRG93bmxvYWQgUHJvZ3Jlc3M6ICVkJSVcbiIsIHBlcmNlbnQpOworCQlwZXJjZW50X29sZCA9IHBlcmNlbnQ7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmJzMTFfbGlua19zdGF0ZVtdID0geworCVsweDAwXQk9ICJEb3duIiwKKwlbMHgwMV0JPSAiVXAiLAorCVsweDAyXQk9ICJSZXN0b3JpbmciLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmxpbmtzdGF0ZV9uYW1lKHVfaW50OF90IGxpbmtzdGF0ZSkKK3sKKwlpZiAobGlua3N0YXRlID4gQVJSQVlfU0laRShiczExX2xpbmtfc3RhdGUpKQorCQlyZXR1cm4gIlVua25vd24iOworCisJcmV0dXJuIGJzMTFfbGlua19zdGF0ZVtsaW5rc3RhdGVdOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqbWJjY3VfbG9hZFtdID0geworCVswXQk9ICJObyBMb2FkIiwKKwlbMV0JPSAiTG9hZCBCVFNDQUMiLAorCVsyXQk9ICJMb2FkIEJUU0RSWCIsCisJWzNdCT0gIkxvYWQgQlRTQkJYIiwKKwlbNF0JPSAiTG9hZCBCVFNBUkMiLAorCVs1XQk9ICJMb2FkIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICptYmNjdV9sb2FkX25hbWUodV9pbnQ4X3QgbGlua3N0YXRlKQoreworCWlmIChsaW5rc3RhdGUgPiBBUlJBWV9TSVpFKG1iY2N1X2xvYWQpKQorCQlyZXR1cm4gIlVua25vd24iOworCisJcmV0dXJuIG1iY2N1X2xvYWRbbGlua3N0YXRlXTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmJ0c19waGFzZV9uYW1lKHVfaW50OF90IHBoYXNlKQoreworCXN3aXRjaCAocGhhc2UpIHsKKwljYXNlIEJTMTFfU1RBVEVfV0FSTV9VUDoKKwljYXNlIEJTMTFfU1RBVEVfV0FSTV9VUF8yOgorCQlyZXR1cm4gIldhcm0gVXAiOworCQlicmVhazsKKwljYXNlIEJTMTFfU1RBVEVfTE9BRF9TTVVfU0FGRVRZOgorCQlyZXR1cm4gIkxvYWQgU01VIFNhZmV0eSI7CisJCWJyZWFrOworCWNhc2UgQlMxMV9TVEFURV9MT0FEX1NNVV9JTlRFTkRFRDoKKwkJcmV0dXJuICJMb2FkIFNNVSBJbnRlbmRlZCI7CisJCWJyZWFrOworCWNhc2UgQlMxMV9TVEFURV9MT0FEX01CQ0NVOgorCQlyZXR1cm4gIkxvYWQgTUJDQ1UiOworCQlicmVhazsKKwljYXNlIEJTMTFfU1RBVEVfU09GVFdBUkVfUlFEOgorCQlyZXR1cm4gIlNvZnR3YXJlIHJlcXVpcmVkIjsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX1dBSVRfTUlOX0NGRzoKKwljYXNlIEJTMTFfU1RBVEVfV0FJVF9NSU5fQ0ZHXzI6CisJCXJldHVybiAiV2FpdCBtaW5pbWFsIGNvbmZpZyI7CisJCWJyZWFrOworCWNhc2UgQlMxMV9TVEFURV9NQUlOVEVOQU5DRToKKwkJcmV0dXJuICJNYWludGVuYW5jZSI7CisJCWJyZWFrOworCWNhc2UgQlMxMV9TVEFURV9OT1JNQUw6CisJCXJldHVybiAiTm9ybWFsIjsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX0FCSVNfTE9BRDoKKwkJcmV0dXJuICJBYmlzIGxvYWQiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gIlVua25vd24iOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICp0cnhfcG93ZXJfbmFtZSh1X2ludDhfdCBwd3IpCit7CisJc3dpdGNoIChwd3IpIHsKKwljYXNlIEJTMTFfVFJYX1BPV0VSX0dTTV8yVzoJCisJCXJldHVybiAiMlcgKEdTTSkiOworCWNhc2UgQlMxMV9UUlhfUE9XRVJfR1NNXzI1MG1XOgorCQlyZXR1cm4gIjI1MG1XIChHU00pIjsKKwljYXNlIEJTMTFfVFJYX1BPV0VSX0dTTV84MG1XOgorCQlyZXR1cm4gIjgwbVcgKEdTTSkiOworCWNhc2UgQlMxMV9UUlhfUE9XRVJfR1NNXzMwbVc6CisJCXJldHVybiAiMzBtVyAoR1NNKSI7CisJY2FzZSBCUzExX1RSWF9QT1dFUl9EQ1NfM1c6CisJCXJldHVybiAiM1cgKERDUykiOworCWNhc2UgQlMxMV9UUlhfUE9XRVJfRENTXzFXNjoKKwkJcmV0dXJuICIxLjZXIChEQ1MpIjsKKwljYXNlIEJTMTFfVFJYX1BPV0VSX0RDU181MDBtVzoKKwkJcmV0dXJuICI1MDBtVyAoRENTKSI7CisJY2FzZSBCUzExX1RSWF9QT1dFUl9EQ1NfMTYwbVc6CisJCXJldHVybiAiMTYwbVcgKERDUykiOworCWRlZmF1bHQ6CisJCXJldHVybiAidW5rbm93biB2YWx1ZSI7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqcGxsX21vZGVfbmFtZSh1X2ludDhfdCBtb2RlKQoreworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgQlMxMV9MSV9QTExfTE9DS0VEOgorCQlyZXR1cm4gIkUxIExvY2tlZCI7CisJY2FzZSBCUzExX0xJX1BMTF9TVEFOREFMT05FOgorCQlyZXR1cm4gIlN0YW5kYWxvbmUiOworCWRlZmF1bHQ6CisJCXJldHVybiAidW5rbm93biI7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqY2Nsa19hY2NfbmFtZSh1X2ludDhfdCBhY2MpCit7CisJc3dpdGNoIChhY2MpIHsKKwljYXNlIDA6CisJCS8qIE91dCBvZiB0aGUgZGVtYW5kZWQgKy8tIDAuMDVwcG0gKi8KKwkJcmV0dXJuICJNZWRpdW0iOworCWNhc2UgMToKKwkJLyogU3luY2hyb25pemVkIHdpdGggQWJpcywgd2l0aGluIGRlbWFuZGVkIHRvbGVyYW5jZSArLy0gMC4wNXBwbSAqLworCQlyZXR1cm4gIkhpZ2giOworCWRlZmF1bHQ6CisJCXJldHVybiAidW5rbm93biI7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqb2JqX25hbWUoc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oKQoreworCXN0YXRpYyBjaGFyIHJldGJ1ZlsyNTZdOworCisJcmV0YnVmWzBdID0gMDsKKworCXN3aXRjaCAoZm9oLT5vYmpfY2xhc3MpIHsKKwljYXNlIE5NX09DX0JTMTE6CisJCXN0cmNhdChyZXRidWYsICJCUzExICIpOworCQlzd2l0Y2ggKGZvaC0+b2JqX2luc3QuYnRzX25yKSB7CisJCWNhc2UgQlMxMV9PQkpfUEE6CisJCQlzcHJpbnRmKHJldGJ1ZitzdHJsZW4ocmV0YnVmKSwgIlBvd2VyIEFtcGxpZmllciAlZCAiLAorCQkJCWZvaC0+b2JqX2luc3QudHNfbnIpOworCQkJYnJlYWs7CisJCWNhc2UgQlMxMV9PQkpfTEk6CisJCQlzcHJpbnRmKHJldGJ1ZitzdHJsZW4ocmV0YnVmKSwgIkxpbmUgSW50ZXJmYWNlICIpOworCQkJYnJlYWs7CisJCWNhc2UgQlMxMV9PQkpfQ0NMSzoKKwkJCXNwcmludGYocmV0YnVmK3N0cmxlbihyZXRidWYpLCAiQ0NMSyAiKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgTk1fT0NfU0lURV9NQU5BR0VSOgorCQlzdHJjYXQocmV0YnVmLCAiU0lURSBNQU5BR0VSICIpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldGJ1ZjsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfc3RhdGUoc3RydWN0IHRsdl9wYXJzZWQgKnRwKQoreworCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX0JUU19TVEFURSkpIHsKKwkJdV9pbnQ4X3QgcGhhc2UsIG1iY2N1OworCQlpZiAoVExWUF9MRU4odHAsIE5NX0FUVF9CUzExX0JUU19TVEFURSkgPj0gMSkgeworCQkJcGhhc2UgPSAqVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX0JUU19TVEFURSk7CisJCQlwcmludGYoIlBIQVNFOiAldSAlLTIwcyAiLCBwaGFzZSAmIDB4ZiwKKwkJCQlidHNfcGhhc2VfbmFtZShwaGFzZSkpOworCQl9CisJCWlmIChUTFZQX0xFTih0cCwgTk1fQVRUX0JTMTFfQlRTX1NUQVRFKSA+PSAyKSB7CisJCQltYmNjdSA9ICooVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX0JUU19TVEFURSkrMSk7CisJCQlwcmludGYoIk1CQ0NVMDogJS0xMXMgTUJDQ1UxOiAlLTExcyAiLAorCQkJCW1iY2N1X2xvYWRfbmFtZShtYmNjdSAmIDB4ZiksIG1iY2N1X2xvYWRfbmFtZShtYmNjdSA+PiA0KSk7CisJCX0KKwl9CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0JTMTFfRTFfU1RBVEUpICYmCisJICAgIFRMVlBfTEVOKHRwLCBOTV9BVFRfQlMxMV9FMV9TVEFURSkgPj0gMSkgeworCQl1X2ludDhfdCBlMV9zdGF0ZSA9ICpUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfRTFfU1RBVEUpOworCQlwcmludGYoIkFiaXMtbGluazogJS05cyAiLCBsaW5rc3RhdGVfbmFtZShlMV9zdGF0ZSAmIDB4ZikpOworCX0KKwlwcmludGYoIlxuIik7Cit9CisKK3N0YXRpYyBpbnQgcHJpbnRfYXR0cihzdHJ1Y3QgdGx2X3BhcnNlZCAqdHApCit7CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0JTMTFfRVNOX1BDQl9TRVJJQUwpKSB7CisJCXByaW50ZigiXHRCUy0xMSBFU04gUENCIFNlcmlhbCBOdW1iZXI6ICVzXG4iLAorCQkJVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX0VTTl9QQ0JfU0VSSUFMKSk7CisJfQorCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX0VTTl9IV19DT0RFX05PKSkgeworCQlwcmludGYoIlx0QlMtMTEgRVNOIEhhcmR3YXJlIENvZGUgTnVtYmVyOiAlc1xuIiwKKwkJCVRMVlBfVkFMKHRwLCBOTV9BVFRfQlMxMV9FU05fSFdfQ09ERV9OTykrNik7CisJfQorCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX0VTTl9GV19DT0RFX05PKSkgeworCQlwcmludGYoIlx0QlMtMTEgRVNOIEZpcm13YXJlIENvZGUgTnVtYmVyOiAlc1xuIiwKKwkJCVRMVlBfVkFMKHRwLCBOTV9BVFRfQlMxMV9FU05fRldfQ09ERV9OTykrNik7CisJfQorI2lmIDAKKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfQlMxMV9CT09UX1NXX1ZFUlMpKSB7CisJCXByaW50ZigiQlMtMTEgQm9vdCBTb2Z0d2FyZSBWZXJzaW9uOiAlc1xuIiwKKwkJCVRMVlBfVkFMKHRwLCBOTV9BVFRfQlMxMV9CT09UX1NXX1ZFUlMpKzYpOworCX0KKyNlbmRpZgorCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9BQklTX0NIQU5ORUwpICYmCisJICAgIFRMVlBfTEVOKHRwLCBOTV9BVFRfQUJJU19DSEFOTkVMKSA+PSAzKSB7CisJCWNvbnN0IHVfaW50OF90ICpjaGFuID0gVExWUF9WQUwodHAsIE5NX0FUVF9BQklTX0NIQU5ORUwpOworCQlwcmludGYoIlx0RTEgQ2hhbm5lbDogUG9ydD0ldSBUaW1lc2xvdD0ldSAiLAorCQkJY2hhblswXSwgY2hhblsxXSk7CisJCWlmIChjaGFuWzJdID09IDB4ZmYpCisJCQlwcmludGYoIihGdWxsIFNsb3QpXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRmKCJTdWJzbG90PSV1XG4iLCBjaGFuWzJdKTsKKwl9CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX1RFSSkpCisJCXByaW50ZigiXHRURUk6ICVkXG4iLCAqVExWUF9WQUwodHAsIE5NX0FUVF9URUkpKTsKKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfQlMxMV9UWFBXUikgJiYKKwkgICAgVExWUF9MRU4odHAsIE5NX0FUVF9CUzExX1RYUFdSKSA+PSAxKSB7CisJCXByaW50ZigiXHRUUlggUG93ZXI6ICVzXG4iLAorCQkJdHJ4X3Bvd2VyX25hbWUoKlRMVlBfVkFMKHRwLCBOTV9BVFRfQlMxMV9UWFBXUikpKTsKKwl9CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0JTMTFfUExMX01PREUpICYmCisJICAgIFRMVlBfTEVOKHRwLCBOTV9BVFRfQlMxMV9QTExfTU9ERSkgPj0gMSkgeworCQlwcmludGYoIlx0UExMIE1vZGU6ICVzXG4iLAorCQkJcGxsX21vZGVfbmFtZSgqVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX1BMTF9NT0RFKSkpOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfQlMxMV9QTEwpICYmCisJICAgIFRMVlBfTEVOKHRwLCBOTV9BVFRfQlMxMV9QTEwpID49IDQpIHsKKwkJY29uc3QgdV9pbnQ4X3QgKnZwID0gVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX1BMTCk7CisJCXByaW50ZigiXHRQTEwgU2V0IFZhbHVlPSVkLCBXb3JrIFZhbHVlPSVkXG4iLAorCQkJdnBbMF0gPDwgOCB8IHZwWzFdLCB2cFsyXSA8PCA4IHwgdnBbM10pOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfQlMxMV9DQ0xLX0FDQ1VSQUNZKSAmJgorCSAgICBUTFZQX0xFTih0cCwgTk1fQVRUX0JTMTFfQ0NMS19BQ0NVUkFDWSkgPj0gMSkgeworCQljb25zdCB1X2ludDhfdCAqYWNjID0gVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX0NDTEtfQUNDVVJBQ1kpOworCQlwcmludGYoIlx0Q0NMSyBBY2N1cmFjeTogJXMgKCVkKVxuIiwgY2Nsa19hY2NfbmFtZSgqYWNjKSwgKmFjYyk7CisJfQorCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX0NDTEtfVFlQRSkgJiYKKwkgICAgVExWUF9MRU4odHAsIE5NX0FUVF9CUzExX0NDTEtfVFlQRSkgPj0gMSkgeworCQljb25zdCB1X2ludDhfdCAqYWNjID0gVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX0NDTEtfVFlQRSk7CisJCXByaW50ZigiXHRDQ0xLIFR5cGU9JWRcbiIsICphY2MpOworCX0KKworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNtZF9xdWVyeSh2b2lkKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gZ19idHMtPmMwOworCisJYnMxMWNmZ19zdGF0ZSA9IFNUQVRFX1FVRVJZOworCWFiaXNfbm1fYnMxMV9nZXRfc2Vybm8oZ19idHMpOworCWFiaXNfbm1fYnMxMV9nZXRfb21sX3RlaV90cyhnX2J0cyk7CisJYWJpc19ubV9iczExX2dldF9wbGxfbW9kZShnX2J0cyk7CisJYWJpc19ubV9iczExX2dldF9jY2xrKGdfYnRzKTsKKwlhYmlzX25tX2JzMTFfZ2V0X3RyeF9wb3dlcih0cngpOworCXRyeCA9IGdzbV9idHNfdHJ4X251bShnX2J0cywgMSk7CisJaWYgKHRyeCkKKwkJYWJpc19ubV9iczExX2dldF90cnhfcG93ZXIodHJ4KTsKKwlzbGVlcCgxKTsKKwlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJY29tbWFuZCA9IE5VTEw7Cit9CisKKy8qIGhhbmRsZSBhIHJlc3BvbnNlIGZyb20gdGhlIEJUUyB0byBhIEdFVCBTVEFURSBjb21tYW5kICovCitzdGF0aWMgaW50IGhhbmRsZV9zdGF0ZV9yZXNwKGVudW0gYWJpc19iczExX3BoYXNlIHN0YXRlKQoreworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBCUzExX1NUQVRFX1dBUk1fVVA6CisJY2FzZSBCUzExX1NUQVRFX0xPQURfU01VX1NBRkVUWToKKwljYXNlIEJTMTFfU1RBVEVfTE9BRF9TTVVfSU5URU5ERUQ6CisJY2FzZSBCUzExX1NUQVRFX0xPQURfTUJDQ1U6CisJCWJyZWFrOworCWNhc2UgQlMxMV9TVEFURV9TT0ZUV0FSRV9SUUQ6CisJCWJzMTFjZmdfc3RhdGUgPSBTVEFURV9TV0xPQUQ7CisJCS8qIHNlbmQgc2FmZXR5IGxvYWQuIFVzZSBnX2J0cyBhcyBwcml2YXRlICdwYXJhbScKKwkJICogYXJndW1lbnQsIHNvIG91ciBzd2xvYWRfY2JmbiBjYW4gZGlzdGluZ3Vpc2gKKwkJICogYSBzYWZldHkgbG9hZCBmcm9tIGEgcmVndWxhciBzb2Z0d2FyZSAqLworCQlpZiAoZmlsZV9pc19yZWFkYWJsZShmbmFtZV9zYWZldHkpKQorCQkJcmMgPSBhYmlzX25tX3NvZnR3YXJlX2xvYWQoZ19idHMsIDB4ZmYsIGZuYW1lX3NhZmV0eSwKKwkJCQkJCSAgIHdpbl9zaXplLCBwYXJhbV9mb3JjZWQsCisJCQkJCQkgICBzd2xvYWRfY2JmbiwgZ19idHMpOworCQllbHNlCisJCQlmcHJpbnRmKHN0ZGVyciwgIk5vIHZhbGlkIFNhZmV0eSBMb2FkIGZpbGUgXCIlc1wiXG4iLAorCQkJCWZuYW1lX3NhZmV0eSk7CisJCWJyZWFrOworCWNhc2UgQlMxMV9TVEFURV9XQUlUX01JTl9DRkc6CisJY2FzZSBCUzExX1NUQVRFX1dBSVRfTUlOX0NGR18yOgorCQliczExY2ZnX3N0YXRlID0gU1RBVEVfU1dMT0FEOworCQlyYyA9IGNyZWF0ZV9vYmplY3RzKGdfYnRzKTsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX01BSU5URU5BTkNFOgorCQlpZiAoY29tbWFuZCkgeworCQkJaWYgKCFzdHJjbXAoY29tbWFuZCwgImRpc2Nvbm5lY3QiKSkKKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQllbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJyZWNvbm5lY3QiKSkKKwkJCQlyYyA9IGFiaXNfbm1fYnMxMV9ic2NfZGlzY29ubmVjdChnX2J0cywgMSk7CisJCQllbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJzb2Z0d2FyZSIpCisJCQkgICAgJiYgYnMxMWNmZ19zdGF0ZSAhPSBTVEFURV9TV0xPQUQpIHsKKwkJCQliczExY2ZnX3N0YXRlID0gU1RBVEVfU1dMT0FEOworCQkJCS8qIHNlbmQgc29mdHdhcmUgKEZJWE1FOiBvdmVyIEEtYmlzPykgKi8KKwkJCQlpZiAoZmlsZV9pc19yZWFkYWJsZShmbmFtZV9zb2Z0d2FyZSkpCisJCQkJCXJjID0gYWJpc19ubV9iczExX2xvYWRfc3dsKGdfYnRzLCBmbmFtZV9zb2Z0d2FyZSwKKwkJCQkJCQkJICAgd2luX3NpemUsIHBhcmFtX2ZvcmNlZCwKKwkJCQkJCQkJICAgc3dsb2FkX2NiZm4pOworCQkJCWVsc2UKKwkJCQkJZnByaW50ZihzdGRlcnIsICJObyB2YWxpZCBTb2Z0d2FyZSBmaWxlIFwiJXNcIlxuIiwKKwkJCQkJCWZuYW1lX3NvZnR3YXJlKTsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAiZGVsZXRlLXRyeDEiKSkgeworCQkJCXByaW50ZigiTG9jaW5nIEJCU0lHIGFuZCBQQSBvYmplY3RzIG9mIFRSWDFcbiIpOworCQkJCWFiaXNfbm1fY2hnX2FkbV9zdGF0ZShnX2J0cywgTk1fT0NfQlMxMSwKKwkJCQkJCSAgICAgIEJTMTFfT0JKX0JCU0lHLCAwLCAxLAorCQkJCQkJICAgICAgTk1fU1RBVEVfTE9DS0VEKTsKKwkJCQlhYmlzX25tX2NoZ19hZG1fc3RhdGUoZ19idHMsIE5NX09DX0JTMTEsCisJCQkJCQkgICAgICBCUzExX09CSl9QQSwgMCwgMSwKKwkJCQkJCSAgICAgIE5NX1NUQVRFX0xPQ0tFRCk7CisJCQkJc2xlZXAoMSk7CisJCQkJcHJpbnRmKCJEZWxldGluZyBCQlNJRyBhbmQgUEEgb2JqZWN0cyBvZiBUUlgxXG4iKTsKKwkJCQlhYmlzX25tX2JzMTFfZGVsZXRlX29iamVjdChnX2J0cywgQlMxMV9PQkpfQkJTSUcsIDEpOworCQkJCWFiaXNfbm1fYnMxMV9kZWxldGVfb2JqZWN0KGdfYnRzLCBCUzExX09CSl9QQSwgMSk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJjcmVhdGUtdHJ4MSIpKSB7CisJCQkJY3JlYXRlX3RyeDEoZ19idHMpOworCQkJCXNsZWVwKDEpOworCQkJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJCQljb21tYW5kID0gTlVMTDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAicGxsLWUxLWxvY2tlZCIpKSB7CisJCQkJYWJpc19ubV9iczExX3NldF9wbGxfbG9ja2VkKGdfYnRzLCAxKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgInBsbC1zdGFuZGFsb25lIikpIHsKKwkJCQlhYmlzX25tX2JzMTFfc2V0X3BsbF9sb2NrZWQoZ19idHMsIDApOworCQkJCXNsZWVwKDEpOworCQkJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJCQljb21tYW5kID0gTlVMTDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAicGxsLXNldHZhbHVlIikpIHsKKwkJCQlhYmlzX25tX2JzMTFfc2V0X3BsbChnX2J0cywgYXRvaSh2YWx1ZSkpOworCQkJCXNsZWVwKDEpOworCQkJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJCQljb21tYW5kID0gTlVMTDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAicGxsLXdvcmt2YWx1ZSIpKSB7CisJCQkJLyogVG8gc2V0IHRoZSB3b3JrIHZhbHVlIHdlIG5lZWQgdG8gbG9naW4gYXMgRklFTEQgKi8KKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2luZmllbGRfbG9nb24oZ19idHMsIDEpOworCQkJCXNsZWVwKDEpOworCQkJCWFiaXNfbm1fYnMxMV9zZXRfcGxsKGdfYnRzLCBhdG9pKHZhbHVlKSk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2luZmllbGRfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJvbWwtdGVpIikpIHsKKwkJCQlhYmlzX25tX2JzMTFfY29ubl9vbWxfdGVpKGdfYnRzLCAwLCAxLCAweGZmLCBURUlfT01MKTsKKwkJCQljb21tYW5kID0gTlVMTDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAicmVzdGFydCIpKSB7CisJCQkJYWJpc19ubV9iczExX3Jlc3RhcnQoZ19idHMpOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJxdWVyeSIpKSB7CisJCQkJY21kX3F1ZXJ5KCk7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgImNyZWF0ZS1icG9ydDEiKSkgeworCQkJCWFiaXNfbm1fYnMxMV9jcmVhdGVfYnBvcnQoZ19idHMsIDEpOworCQkJCXNsZWVwKDEpOworCQkJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJCQljb21tYW5kID0gTlVMTDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAiZGVsZXRlLWJwb3J0MSIpKSB7CisJCQkJYWJpc19ubV9jaGdfYWRtX3N0YXRlKGdfYnRzLCBOTV9PQ19CUzExX0JQT1JULCAxLCAweGZmLCAweGZmLCBOTV9TVEFURV9MT0NLRUQpOworCQkJCXNsZWVwKDEpOworCQkJCWFiaXNfbm1fYnMxMV9kZWxldGVfYnBvcnQoZ19idHMsIDEpOworCQkJCXNsZWVwKDEpOworCQkJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJCQljb21tYW5kID0gTlVMTDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAiYnBvcnQwLXN0YXIiKSkgeworCQkJCWFiaXNfbm1fYnMxMV9zZXRfYnBvcnRfbGluZV9jZmcoZ19idHMsIDAsIEJTMTFfTElORV9DRkdfU1RBUik7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJicG9ydDAtbXVsdGlkcm9wIikpIHsKKwkJCQlhYmlzX25tX2JzMTFfc2V0X2Jwb3J0X2xpbmVfY2ZnKGdfYnRzLCAwLCBCUzExX0xJTkVfQ0ZHX01VTFRJRFJPUCk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgQlMxMV9TVEFURV9OT1JNQUw6CisJCWlmIChjb21tYW5kKSB7CisJCQlpZiAoIXN0cmNtcChjb21tYW5kLCAicmVjb25uZWN0IikpCisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAiZGlzY29ubmVjdCIpKQorCQkJCWFiaXNfbm1fYnMxMV9ic2NfZGlzY29ubmVjdChnX2J0cywgMCk7CisJCQllbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJxdWVyeSIpKSB7CisJCQkJY21kX3F1ZXJ5KCk7CisJCQl9CisJCX0gZWxzZSBpZiAocGFyYW1fZGlzY29ubmVjdCkgeworCQkJcGFyYW1fZGlzY29ubmVjdCA9IDA7CisJCQlhYmlzX25tX2JzMTFfYnNjX2Rpc2Nvbm5lY3QoZ19idHMsIDApOworCQkJaWYgKHBhcmFtX3Jlc3RhcnQpIHsKKwkJCQlwYXJhbV9yZXN0YXJ0ID0gMDsKKwkJCQlhYmlzX25tX2JzMTFfcmVzdGFydChnX2J0cyk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiByYzsKK30KKworLyogaGFuZGxlIGEgZnVsbHktcmVjZWl2ZWQgbWVzc2FnZS9wYWNrZXQgZnJvbSB0aGUgUlMyMzIgcG9ydCAqLworaW50IGhhbmRsZV9zZXJpYWxfbXNnKHN0cnVjdCBtc2diICpyeF9tc2cpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2g7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJaW50IHJjID0gLTE7CisKKyNpZiAwCisJaWYgKHJ4X21zZy0+bGVuIDwgTEFQRF9IRFJfTEVOCisJCQkgICsgc2l6ZW9mKHN0cnVjdCBhYmlzX29tX2ZvbV9oZHIpCisJCQkgICsgc2l6ZW9mKHN0cnVjdCBhYmlzX29tX2hkcikpIHsKKwkJaWYgKCFtZW1jbXAocnhfbXNnLT5kYXRhICsgMiwgdG9vX2Zhc3QsCisJCQkgICAgc2l6ZW9mKHRvb19mYXN0KSkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQlMxMSB0ZWxscyB1cyB3ZSdyZSB0b28gIgorCQkJCSJmYXN0LCB0cnkgLS1kZWxheSBiaWdnZXIgdGhhbiAldVxuIiwKKwkJCQlkZWxheV9tcyk7CisJCQlyZXR1cm4gLUUyQklHOworCQl9IGVsc2UKKwkJCWZwcmludGYoc3RkZXJyLCAidW5rbm93biBCUzExIG1lc3NhZ2VcbiIpOworCX0KKyNlbmRpZgorCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfbDIocnhfbXNnKTsKKwlmb2ggPSAoc3RydWN0IGFiaXNfb21fZm9tX2hkciAqKSBvaC0+ZGF0YTsKKwlzd2l0Y2ggKGZvaC0+bXNnX3R5cGUpIHsKKwljYXNlIE5NX01UX0JTMTFfTE1UX0xPR09OX0FDSzoKKwkJcHJpbnRmKCJMTVQgTE9HT046IEFDS1xuXG4iKTsKKwkJaWYgKGJzMTFjZmdfc3RhdGUgPT0gU1RBVEVfTk9ORSkKKwkJCWJzMTFjZmdfc3RhdGUgPSBTVEFURV9MT0dPTl9BQ0s7CisJCXJjID0gYWJpc19ubV9iczExX2dldF9zdGF0ZShnX2J0cyk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfQlMxMV9MTVRfTE9HT0ZGX0FDSzoKKwkJcHJpbnRmKCJMTVQgTE9HT0ZGOiBBQ0tcbiIpOworCQlleGl0KDApOworCQlicmVhazsKKwljYXNlIE5NX01UX0JTMTFfR0VUX1NUQVRFX0FDSzoKKwkJcmMgPSBhYmlzX25tX3Rsdl9wYXJzZSgmdHAsIGdfYnRzLCBmb2gtPmRhdGEsIG9oLT5sZW5ndGgtc2l6ZW9mKCpmb2gpKTsKKwkJcHJpbnRfc3RhdGUoJnRwKTsKKwkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9CUzExX0JUU19TVEFURSkgJiYKKwkJICAgIFRMVlBfTEVOKCZ0cCwgTk1fQVRUX0JTMTFfQlRTX1NUQVRFKSA+PSAxKQorCQkJcmMgPSBoYW5kbGVfc3RhdGVfcmVzcCgqVExWUF9WQUwoJnRwLCBOTV9BVFRfQlMxMV9CVFNfU1RBVEUpKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9HRVRfQVRUUl9SRVNQOgorCQlwcmludGYoIlxuJXNBVFRSSUJVVEVTOlxuIiwgb2JqX25hbWUoZm9oKSk7CisJCWFiaXNfbm1fdGx2X3BhcnNlKCZ0cCwgZ19idHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCQlyYyA9IHByaW50X2F0dHIoJnRwKTsKKwkJLy9oZXhkdW1wKGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCQlicmVhazsKKwljYXNlIE5NX01UX0JTMTFfU0VUX0FUVFJfQUNLOgorCQlwcmludGYoIlNFVCBBVFRSSUJVVEUgT2JqQ2xhc3M9MHglMDJ4IE9iakluc3Q9KCVkLCVkLCVkKSBBQ0tcbiIsCisJCQlmb2gtPm9ial9jbGFzcywgZm9oLT5vYmpfaW5zdC5idHNfbnIsCisJCQlmb2gtPm9ial9pbnN0LnRyeF9uciwgZm9oLT5vYmpfaW5zdC50c19ucik7CisJCXJjID0gMDsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9CUzExX1NFVF9BVFRSX05BQ0s6CisJCXByaW50ZigiU0VUIEFUVFJJQlVURSBPYmpDbGFzcz0weCUwMnggT2JqSW5zdD0oJWQsJWQsJWQpIE5BQ0tcbiIsCisJCQlmb2gtPm9ial9jbGFzcywgZm9oLT5vYmpfaW5zdC5idHNfbnIsCisJCQlmb2gtPm9ial9pbnN0LnRyeF9uciwgZm9oLT5vYmpfaW5zdC50c19ucik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gYWJpc19ubV9yY3Ztc2cocnhfbXNnKTsKKwl9CisJaWYgKHJjIDwgMCkgeworCQlwZXJyb3IoIkVSUk9SIGluIG1haW4gbG9vcCIpOworCQkvL2JyZWFrOworCX0KKwlpZiAocmMgPT0gMSkKKwkJcmV0dXJuIHJjOworCisJc3dpdGNoIChiczExY2ZnX3N0YXRlKSB7CisJY2FzZSBTVEFURV9OT05FOgorCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMSk7CisJCWJyZWFrOworCWNhc2UgU1RBVEVfTE9HT05fQUNLOgorCQlic2Nfc2NoZWR1bGVfdGltZXIoJnN0YXR1c190aW1lciwgNSwgMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworaW50IG5tX3N0YXRlX2V2ZW50KGVudW0gbm1fZXZ0IGV2dCwgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB2b2lkICpvYmosCisJCSAgIHN0cnVjdCBnc21fbm1fc3RhdGUgKm9sZF9zdGF0ZSwgc3RydWN0IGdzbV9ubV9zdGF0ZSAqbmV3X3N0YXRlLAorCQkgICBzdHJ1Y3QgYWJpc19vbV9vYmpfaW5zdCAqb2JqX2lucykKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzdGF0dXNfdGltZXJfY2Iodm9pZCAqZGF0YSkKK3sKKwlhYmlzX25tX2JzMTFfZ2V0X3N0YXRlKGdfYnRzKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfYmFubmVyKHZvaWQpCit7CisJcHJpbnRmKCJiczExX2NvbmZpZyAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgYW5kIERpZXRlciBTcGFhclxuIik7CisJcHJpbnRmKCJUaGlzIGlzIEZSRUUgU09GVFdBUkUgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZXG5cbiIpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9oZWxwKHZvaWQpCit7CisJcHJpbnRmKCJiczExX2NvbmZpZyBbb3B0aW9uc10gW2NvbW1hbmRdXG4iKTsKKwlwcmludGYoIlxuU3VwcG9ydGVkIG9wdGlvbnM6XG4iKTsKKwlwcmludGYoIlx0LWggLS1oZWxwXHRcdFx0UHJpbnQgdGhpcyBoZWxwIHRleHRcbiIpOworCXByaW50ZigiXHQtcCAtLXBvcnQgPC9kZXYvdHR5WFhYPlx0XHRTcGVjaWZ5IHNlcmlhbCBwb3J0XG4iKTsKKwlwcmludGYoIlx0LXMgLS1zb2Z0d2FyZSA8ZmlsZT5cdFx0U3BlY2lmeSBTb2Z0d2FyZSBmaWxlXG4iKTsKKwlwcmludGYoIlx0LVMgLS1zYWZldHkgPGZpbGU+XHRcdFNwZWNpZnkgU2FmZXR5IExvYWQgZmlsZVxuIik7CisJcHJpbnRmKCJcdC1kIC0tZGVsYXkgPG1zPlx0XHRcdFNwZWNpZnkgZGVsYXkgaW4gbWlsbGlzZWNvbmRzXG4iKTsKKwlwcmludGYoIlx0LUQgLS1kaXNjb25uZWN0XHRcdFx0RGlzY29ubmVjdCBCVFMgZnJvbSBCU0NcbiIpOworCXByaW50ZigiXHQtdyAtLXdpbi1zaXplIDxudW0+XHRcdFNwZWNpZnkgV2luZG93IFNpemVcbiIpOworCXByaW50ZigiXHQtZiAtLWZvcmNlZFx0XHRcdEZvcmNlIFNvZnR3YXJlIExvYWRcbiIpOworCXByaW50ZigiXG5TdXBwb3J0ZWQgY29tbWFuZHM6XG4iKTsKKwlwcmludGYoIlx0cXVlcnlcdFx0XHRRdWVyeSB0aGUgQlMtMTEgYWJvdXQgc2VyaWFsIG51bWJlciBhbmQgY29uZmlndXJhdGlvblxuIik7CisJcHJpbnRmKCJcdGRpc2Nvbm5lY3RcdFx0RGlzY29ubmVjdCBBLWJpcyBsaW5rIChnbyBpbnRvIGFkbWluaXN0cmF0aXZlIHN0YXRlKVxuIik7CisJcHJpbnRmKCJcdHJlc2Nvbm5lY3RcdFx0UmVjb25uZWN0IEEtYmlzIGxpbmsgKGdvIGludG8gbm9ybWFsIHN0YXRlKVxuIik7CisJcHJpbnRmKCJcdHJlc3RhcnRcdFx0XHRSZXN0YXJ0IHRoZSBCVFNcbiIpOworCXByaW50ZigiXHRzb2Z0d2FyZVx0XHREb3dubG9hZCBTb2Z0d2FyZSAob25seSBpbiBhZG1pbmlzdHJhdGl2ZSBzdGF0ZSlcbiIpOworCXByaW50ZigiXHRjcmVhdGUtdHJ4MVx0XHRDcmVhdGUgb2JqZWN0cyBmb3IgVFJYMSAoRGFuZ2VyOiBZb3VyIEJTLTExIG1pZ2h0IG92ZXJoZWF0KVxuIik7CisJcHJpbnRmKCJcdGRlbGV0ZS10cngxXHRcdERlbGV0ZSBvYmplY3RzIGZvciBUUlgxXG4iKTsKKwlwcmludGYoIlx0cGxsLWUxLWxvY2tlZFx0XHRTZXQgdGhlIFBMTCB0byBiZSBsb2NrZWQgdG8gRTEgY2xvY2tcbiIpOworCXByaW50ZigiXHRwbGwtc3RhbmRhbG9uZVx0XHRTZXQgdGhlIFBMTCB0byBiZSBpbiBzdGFuZGFsb25lIG1vZGVcbiIpOworCXByaW50ZigiXHRwbGwtc2V0dmFsdWUgPHZhbHVlPlx0U2V0IHRoZSBQTEwgc2V0IHZhbHVlXG4iKTsKKwlwcmludGYoIlx0cGxsLXdvcmt2YWx1ZSA8dmFsdWU+XHRTZXQgdGhlIFBMTCB3b3JrIHZhbHVlXG4iKTsKKwlwcmludGYoIlx0b21sLXRlaVx0XHRcdFNldCBPTUwgRTEgVFMgYW5kIFRFSVxuIik7CisJcHJpbnRmKCJcdGJwb3J0MC1zdGFyXHRcdFNldCBCUE9SVDAgbGluZSBjb25maWcgdG8gc3RhclxuIik7CisJcHJpbnRmKCJcdGJwb3J0MC1tdWx0aXBvcnRcdFNldCBCUE9SVDAgbGluZSBjb25maWcgdG8gbXVsdGlwb3J0XG4iKTsKKwlwcmludGYoIlx0Y3JlYXRlLWJwb3J0MVx0XHRDcmVhdGUgQlBPUlQxIG9iamVjdFxuIik7CisJcHJpbnRmKCJcdGRlbGV0ZS1icG9ydDFcdFx0RGVsZXRlIEJQT1JUMSBvYmplY3RcbiIpOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfb3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IG9wdGlvbl9pbmRleCA9IDA7CisJcHJpbnRfYmFubmVyKCk7CisKKwl3aGlsZSAoMSkgeworCQlpbnQgYzsKKwkJc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisJCQl7ICJoZWxwIiwgMCwgMCwgJ2gnIH0sCisJCQl7ICJwb3J0IiwgMSwgMCwgJ3AnIH0sCisJCQl7ICJzb2Z0d2FyZSIsIDEsIDAsICdzJyB9LAorCQkJeyAic2FmZXR5IiwgMSwgMCwgJ1MnIH0sCisJCQl7ICJkZWxheSIsIDEsIDAsICdkJyB9LAorCQkJeyAiZGlzY29ubmVjdCIsIDAsIDAsICdEJyB9LAorCQkJeyAid2luLXNpemUiLCAxLCAwLCAndycgfSwKKwkJCXsgImZvcmNlZCIsIDAsIDAsICdmJyB9LAorCQkJeyAicmVzdGFydCIsIDAsIDAsICdyJyB9LAorCQkJeyAiZGVidWciLCAxLCAwLCAnYid9LAorCQl9OworCisJCWMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiaHA6czpTOnRkOkR3OmZyYToiLAorCQkJCWxvbmdfb3B0aW9ucywgJm9wdGlvbl9pbmRleCk7CisKKwkJaWYgKGMgPT0gLTEpCisJCQlicmVhazsKKworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnaCc6CisJCQlwcmludF9oZWxwKCk7CisJCQlleGl0KDApOworCQljYXNlICdwJzoKKwkJCXNlcmlhbF9wb3J0ID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ2InOgorCQkJbG9nX3BhcnNlX2NhdGVnb3J5X21hc2soc3RkZXJyX3RhcmdldCwgb3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdzJzoKKwkJCWZuYW1lX3NvZnR3YXJlID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ1MnOgorCQkJZm5hbWVfc2FmZXR5ID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkJZGVsYXlfbXMgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAndyc6CisJCQl3aW5fc2l6ZSA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdEJzoKKwkJCXBhcmFtX2Rpc2Nvbm5lY3QgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2YnOgorCQkJcGFyYW1fZm9yY2VkID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCXBhcmFtX2Rpc2Nvbm5lY3QgPSAxOworCQkJcGFyYW1fcmVzdGFydCA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChvcHRpbmQgPCBhcmdjKQorCQljb21tYW5kID0gYXJndltvcHRpbmRdOworCSAgICAgICAgaWYgKG9wdGluZCsxIDwgYXJnYykKKwkJCXZhbHVlID0gYXJndltvcHRpbmQrMV07CisKK30KKworc3RhdGljIGludCBudW1fc2lnaW50OworCitzdGF0aWMgdm9pZCBzaWduYWxfaGFuZGxlcihpbnQgc2lnbmFsKQoreworCWZwcmludGYoc3Rkb3V0LCAiXG5zaWduYWwgJXUgcmVjZWl2ZWRcbiIsIHNpZ25hbCk7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU0lHSU5UOgorCQludW1fc2lnaW50Kys7CisJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJaWYgKG51bV9zaWdpbnQgPj0gMykKKwkJCWV4aXQoMCk7CisJCWJyZWFrOworCX0KK30KKworZXh0ZXJuIGludCBidHNfbW9kZWxfYnMxMV9pbml0KHZvaWQpOworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0OworCWludCByYzsKKworCWxvZ19pbml0KCZsb2dfaW5mbyk7CisJc3RkZXJyX3RhcmdldCA9IGxvZ190YXJnZXRfY3JlYXRlX3N0ZGVycigpOworCWxvZ19hZGRfdGFyZ2V0KHN0ZGVycl90YXJnZXQpOworCWxvZ19zZXRfYWxsX2ZpbHRlcihzdGRlcnJfdGFyZ2V0LCAxKTsKKwloYW5kbGVfb3B0aW9ucyhhcmdjLCBhcmd2KTsKKwlidHNfbW9kZWxfYnMxMV9pbml0KCk7CisKKwlnc21uZXQgPSBnc21fbmV0d29ya19pbml0KDEsIDEsIE5VTEwpOworCWlmICghZ3NtbmV0KSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGFsbG9jYXRlIGdzbSBuZXR3b3JrXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisJZ19idHMgPSBnc21fYnRzX2FsbG9jKGdzbW5ldCwgR1NNX0JUU19UWVBFX0JTMTEsIEhBUkRDT0RFRF9UU0MsCisJCQkJSEFSRENPREVEX0JTSUMpOworCisJcmMgPSByczIzMl9zZXR1cChzZXJpYWxfcG9ydCwgZGVsYXlfbXMsIGdfYnRzKTsKKwlpZiAocmMgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiUHJvYmxlbSBzZXR0aW5nIHVwIHNlcmlhbCBwb3J0XG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlzaWduYWwoU0lHSU5ULCAmc2lnbmFsX2hhbmRsZXIpOworCisJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDEpOworCS8vYWJpc19ubV9iczExX2dldF9zZXJubyhnX2J0cyk7CisKKwlzdGF0dXNfdGltZXIuY2IgPSBzdGF0dXNfdGltZXJfY2I7CisKKwl3aGlsZSAoMSkgeworCQlic2Nfc2VsZWN0X21haW4oMCk7CisJfQorCisJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCisJZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2JzY19hcGkuYyBiL29wZW5ic2Mvc3JjL2JzY19hcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTA0NzUyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvYnNjX2FwaS5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qIEdTTSAwOC4wOCBsaWtlIEFQSSBmb3IgT3BlbkJTQy4gVGhlIGJyaWRnZSBmcm9tIE1TQyB0byBCU0MgKi8KKworLyogKEMpIDIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5ic2MvYnNjX2FwaS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKworCitpbnQgZ3NtMDgwOF9zdWJtaXRfZHRhcChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubiwKKwkJCXN0cnVjdCBtc2diICptc2csIGludCBsaW5rX2lkKQoreworCW1zZy0+bGNoYW4gPSBjb25uLT5sY2hhbjsKKwltc2ctPnRyeCA9IG1zZy0+bGNoYW4tPnRzLT50cng7CisJcmV0dXJuIHJzbF9kYXRhX3JlcXVlc3QobXNnLCBsaW5rX2lkKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2JzY19oYWNrLmMgYi9vcGVuYnNjL3NyYy9ic2NfaGFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMDdmY2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ic2NfaGFjay5jCkBAIC0wLDAgKzEsMjczIEBACisvKiBBIGhhY2tpc2ggbWluaW1hbCBCU0MgKCtNU0MgK0hMUikgaW1wbGVtZW50YXRpb24gKi8KKworLyogKEMpIDIwMDgtMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNkZWZpbmUgX0dOVV9TT1VSQ0UKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZGIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9lMV9pbnB1dC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisKKyNpbmNsdWRlIDxvc21vY29tL3Z0eS9jb21tYW5kLmg+CisKKyNpbmNsdWRlICIuLi9ic2Njb25maWcuaCIKKworLyogTUNDIGFuZCBNTkMgZm9yIHRoZSBMb2NhdGlvbiBBcmVhIElkZW50aWZpZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgbG9nX3RhcmdldCAqc3RkZXJyX3RhcmdldDsKK3N0cnVjdCBnc21fbmV0d29yayAqYnNjX2dzbW5ldCA9IDA7CitzdGF0aWMgY29uc3QgY2hhciAqZGF0YWJhc2VfbmFtZSA9ICJobHIuc3FsaXRlMyI7CitzdGF0aWMgY29uc3QgY2hhciAqY29uZmlnX2ZpbGUgPSAib3BlbmJzYy5jZmciOworZXh0ZXJuIGNvbnN0IGNoYXIgKm9wZW5ic2NfY29weXJpZ2h0OworCisvKiB0aW1lciB0byBzdG9yZSBzdGF0aXN0aWNzICovCisjZGVmaW5lIERCX1NZTkNfSU5URVJWQUwJNjAsIDAKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBkYl9zeW5jX3RpbWVyOworCitleHRlcm4gaW50IGJzY19ib290c3RyYXBfbmV0d29yayhpbnQgKCptbWNfcmV2KShzdHJ1Y3QgZ3NtX25ldHdvcmsgKiwgaW50LCB2b2lkICopLAorCQkJCSBjb25zdCBjaGFyICpjZmdfZmlsZSk7CitleHRlcm4gaW50IGJzY19zaHV0ZG93bl9uZXQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpOworCitzdGF0aWMgdm9pZCBjcmVhdGVfcGNhcF9maWxlKGNoYXIgKmZpbGUpCit7CisJbW9kZV90IG1vZGUgPSBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIOworCWludCBmZCA9IG9wZW4oZmlsZSwgT19XUk9OTFl8T19UUlVOQ3xPX0NSRUFULCBtb2RlKTsKKworCWlmIChmZCA8IDApIHsKKwkJcGVycm9yKCJGYWlsZWQgdG8gb3BlbiBmaWxlIGZvciBwY2FwIik7CisJCXJldHVybjsKKwl9CisKKwllMV9zZXRfcGNhcF9mZChmZCk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3VzYWdlKCkKK3sKKwlwcmludGYoIlVzYWdlOiBic2NfaGFja1xuIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2hlbHAoKQoreworCXByaW50ZigiICBTb21lIHVzZWZ1bCBoZWxwLi4uXG4iKTsKKwlwcmludGYoIiAgLWggLS1oZWxwIHRoaXMgdGV4dFxuIik7CisJcHJpbnRmKCIgIC1kIG9wdGlvbiAtLWRlYnVnPURSTEw6RENDOkRNTTpEUlI6RFJTTDpETk0gZW5hYmxlIGRlYnVnZ2luZ1xuIik7CisJcHJpbnRmKCIgIC1jIC0tY29uZmlnLWZpbGUgZmlsZW5hbWUgVGhlIGNvbmZpZyBmaWxlIHRvIHVzZS5cbiIpOworCXByaW50ZigiICAtcyAtLWRpc2FibGUtY29sb3JcbiIpOworCXByaW50ZigiICAtbCAtLWRhdGFiYXNlIGRiLW5hbWUgVGhlIGRhdGFiYXNlIHRvIHVzZVxuIik7CisJcHJpbnRmKCIgIC1hIC0tYXV0aG9yaXplLWV2ZXJ5b25lLiBBdXRob3JpemUgZXZlcnkgbmV3IHN1YnNjcmliZXIuIERhbmdlcm91cyEuXG4iKTsKKwlwcmludGYoIiAgLXAgLS1wY2FwIGZpbGUgIFRoZSBmaWxlbmFtZSBvZiB0aGUgcGNhcCBmaWxlXG4iKTsKKwlwcmludGYoIiAgLVQgLS10aW1lc3RhbXAgUHJlZml4IGV2ZXJ5IGxvZyBsaW5lIHdpdGggYSB0aW1lc3RhbXBcbiIpOworCXByaW50ZigiICAtViAtLXZlcnNpb24uIFByaW50IHRoZSB2ZXJzaW9uIG9mIE9wZW5CU0MuXG4iKTsKKwlwcmludGYoIiAgLVAgLS1ydHAtcHJveHkgRW5hYmxlIHRoZSBSVFAgUHJveHkgY29kZSBpbnNpZGUgT3BlbkJTQ1xuIik7CisJcHJpbnRmKCIgIC1lIC0tbG9nLWxldmVsIG51bWJlci4gU2V0IGEgZ2xvYmFsIGxvZ2xldmVsLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9vcHRpb25zKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKwl3aGlsZSAoMSkgeworCQlpbnQgb3B0aW9uX2luZGV4ID0gMCwgYzsKKwkJc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisJCQl7ImhlbHAiLCAwLCAwLCAnaCd9LAorCQkJeyJkZWJ1ZyIsIDEsIDAsICdkJ30sCisJCQl7ImNvbmZpZy1maWxlIiwgMSwgMCwgJ2MnfSwKKwkJCXsiZGlzYWJsZS1jb2xvciIsIDAsIDAsICdzJ30sCisJCQl7ImRhdGFiYXNlIiwgMSwgMCwgJ2wnfSwKKwkJCXsiYXV0aG9yaXplLWV2ZXJ5b25lIiwgMCwgMCwgJ2EnfSwKKwkJCXsicGNhcCIsIDEsIDAsICdwJ30sCisJCQl7InRpbWVzdGFtcCIsIDAsIDAsICdUJ30sCisJCQl7InZlcnNpb24iLCAwLCAwLCAnVicgfSwKKwkJCXsicnRwLXByb3h5IiwgMCwgMCwgJ1AnfSwKKwkJCXsibG9nLWxldmVsIiwgMSwgMCwgJ2UnfSwKKwkJCXswLCAwLCAwLCAwfQorCQl9OworCisJCWMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiaGQ6c2w6YXI6cDpUUFZjOmU6IiwKKwkJCQlsb25nX29wdGlvbnMsICZvcHRpb25faW5kZXgpOworCQlpZiAoYyA9PSAtMSkKKwkJCWJyZWFrOworCisJCXN3aXRjaCAoYykgeworCQljYXNlICdoJzoKKwkJCXByaW50X3VzYWdlKCk7CisJCQlwcmludF9oZWxwKCk7CisJCQlleGl0KDApOworCQljYXNlICdzJzoKKwkJCWxvZ19zZXRfdXNlX2NvbG9yKHN0ZGVycl90YXJnZXQsIDApOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkJbG9nX3BhcnNlX2NhdGVnb3J5X21hc2soc3RkZXJyX3RhcmdldCwgb3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdsJzoKKwkJCWRhdGFiYXNlX25hbWUgPSBzdHJkdXAob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdjJzoKKwkJCWNvbmZpZ19maWxlID0gc3RyZHVwKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQljcmVhdGVfcGNhcF9maWxlKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnVCc6CisJCQlsb2dfc2V0X3ByaW50X3RpbWVzdGFtcChzdGRlcnJfdGFyZ2V0LCAxKTsKKwkJCWJyZWFrOworCQljYXNlICdQJzoKKwkJCWlwYWNjX3J0cF9kaXJlY3QgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgJ2UnOgorCQkJbG9nX3NldF9sb2dfbGV2ZWwoc3RkZXJyX3RhcmdldCwgYXRvaShvcHRhcmcpKTsKKwkJCWJyZWFrOworCQljYXNlICdWJzoKKwkJCXByaW50X3ZlcnNpb24oMSk7CisJCQlleGl0KDApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBpZ25vcmUgKi8KKwkJCWJyZWFrOworCQl9CisJfQorfQorCitleHRlcm4gdm9pZCAqdGFsbF92dHlfY3R4Oworc3RhdGljIHZvaWQgc2lnbmFsX2hhbmRsZXIoaW50IHNpZ25hbCkKK3sKKwlmcHJpbnRmKHN0ZG91dCwgInNpZ25hbCAldSByZWNlaXZlZFxuIiwgc2lnbmFsKTsKKworCXN3aXRjaCAoc2lnbmFsKSB7CisJY2FzZSBTSUdJTlQ6CisJCWJzY19zaHV0ZG93bl9uZXQoYnNjX2dzbW5ldCk7CisJCWRpc3BhdGNoX3NpZ25hbChTU19HTE9CQUwsIFNfR0xPQkFMX1NIVVRET1dOLCBOVUxMKTsKKwkJc2xlZXAoMyk7CisJCWV4aXQoMCk7CisJCWJyZWFrOworCWNhc2UgU0lHQUJSVDoKKwkJLyogaW4gY2FzZSBvZiBhYm9ydCwgd2Ugd2FudCB0byBvYnRhaW4gYSB0YWxsb2MgcmVwb3J0CisJCSAqIGFuZCB0aGVuIHJldHVybiB0byB0aGUgY2FsbGVyLCB3aG8gd2lsbCBhYm9ydCB0aGUgcHJvY2VzcyAqLworCWNhc2UgU0lHVVNSMToKKwkJdGFsbG9jX3JlcG9ydCh0YWxsX3Z0eV9jdHgsIHN0ZGVycik7CisJCXRhbGxvY19yZXBvcnRfZnVsbCh0YWxsX2JzY19jdHgsIHN0ZGVycik7CisJCWJyZWFrOworCWNhc2UgU0lHVVNSMjoKKwkJdGFsbG9jX3JlcG9ydF9mdWxsKHRhbGxfdnR5X2N0eCwgc3RkZXJyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCisvKiB0aW1lciBoYW5kbGluZyAqLworc3RhdGljIGludCBfZGJfc3RvcmVfY291bnRlcihzdHJ1Y3QgY291bnRlciAqY291bnRlciwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZGJfc3RvcmVfY291bnRlcihjb3VudGVyKTsKK30KKworc3RhdGljIHZvaWQgZGJfc3luY190aW1lcl9jYih2b2lkICpkYXRhKQoreworCS8qIHN0b3JlIGNvdW50ZXJzIHRvIGRhdGFiYXNlIGFuZCByZS1zY2hlZHVsZSAqLworCWNvdW50ZXJzX2Zvcl9lYWNoKF9kYl9zdG9yZV9jb3VudGVyLCBOVUxMKTsKKwlic2Nfc2NoZWR1bGVfdGltZXIoJmRiX3N5bmNfdGltZXIsIERCX1NZTkNfSU5URVJWQUwpOworfQorCitleHRlcm4gaW50IGJ0c19tb2RlbF91bmtub3duX2luaXQodm9pZCk7CitleHRlcm4gaW50IGJ0c19tb2RlbF9iczExX2luaXQodm9pZCk7CitleHRlcm4gaW50IGJ0c19tb2RlbF9uYW5vYnRzX2luaXQodm9pZCk7CisKK2V4dGVybiBpbnQgYnNjX3Z0eV9nb19wYXJlbnQoc3RydWN0IHZ0eSAqdnR5KTsKKworc3RhdGljIHN0cnVjdCB2dHlfYXBwX2luZm8gdnR5X2luZm8gPSB7CisJLm5hbWUgCQk9ICJPcGVuQlNDIiwKKwkudmVyc2lvbgk9IFBBQ0tBR0VfVkVSU0lPTiwKKwkuZ29fcGFyZW50X2NiCT0gYnNjX3Z0eV9nb19wYXJlbnQsCit9OworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IHJjOworCisJdnR5X2luZm8uY29weXJpZ2h0ID0gb3BlbmJzY19jb3B5cmlnaHQ7CisKKwlsb2dfaW5pdCgmbG9nX2luZm8pOworCXRhbGxfYnNjX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdChOVUxMLCAxLCAib3BlbmJzYyIpOworCXRhbGxvY19jdHhfaW5pdCgpOworCW9uX2Rzb19sb2FkX3Rva2VuKCk7CisJb25fZHNvX2xvYWRfcnJscCgpOworCW9uX2Rzb19sb2FkX2hvX2RlYygpOworCXN0ZGVycl90YXJnZXQgPSBsb2dfdGFyZ2V0X2NyZWF0ZV9zdGRlcnIoKTsKKwlsb2dfYWRkX3RhcmdldChzdGRlcnJfdGFyZ2V0KTsKKworCWJ0c19tb2RlbF91bmtub3duX2luaXQoKTsKKwlidHNfbW9kZWxfYnMxMV9pbml0KCk7CisJYnRzX21vZGVsX25hbm9idHNfaW5pdCgpOworCisJLyogZW5hYmxlIGZpbHRlcnMgKi8KKwlsb2dfc2V0X2FsbF9maWx0ZXIoc3RkZXJyX3RhcmdldCwgMSk7CisKKwkvKiBUaGlzIG5lZWRzIHRvIHByZWNlZGUgaGFuZGxlX29wdGlvbnMoKSAqLworCXZ0eV9pbml0KCZ2dHlfaW5mbyk7CisJYnNjX3Z0eV9pbml0KCk7CisKKwlyYyA9IGJzY19ib290c3RyYXBfbmV0d29yayhtbmNjX3JlY3YsIGNvbmZpZ19maWxlKTsKKwlpZiAocmMgPCAwKQorCQlleGl0KDEpOworCisJLyogcGFyc2Ugb3B0aW9ucyAqLworCWhhbmRsZV9vcHRpb25zKGFyZ2MsIGFyZ3YpOworCisJLyogc2VlZCB0aGUgUFJORyAqLworCXNyYW5kKHRpbWUoTlVMTCkpOworCisJaWYgKGRiX2luaXQoZGF0YWJhc2VfbmFtZSkpIHsKKwkJcHJpbnRmKCJEQjogRmFpbGVkIHRvIGluaXQgZGF0YWJhc2UuIFBsZWFzZSBjaGVjayB0aGUgb3B0aW9uIHNldHRpbmdzLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJcHJpbnRmKCJEQjogRGF0YWJhc2UgaW5pdGlhbGl6ZWQuXG4iKTsKKworCWlmIChkYl9wcmVwYXJlKCkpIHsKKwkJcHJpbnRmKCJEQjogRmFpbGVkIHRvIHByZXBhcmUgZGF0YWJhc2UuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwcmludGYoIkRCOiBEYXRhYmFzZSBwcmVwYXJlZC5cbiIpOworCisJLyogc2V0dXAgdGhlIHRpbWVyICovCisJZGJfc3luY190aW1lci5jYiA9IGRiX3N5bmNfdGltZXJfY2I7CisJZGJfc3luY190aW1lci5kYXRhID0gTlVMTDsKKwlic2Nfc2NoZWR1bGVfdGltZXIoJmRiX3N5bmNfdGltZXIsIERCX1NZTkNfSU5URVJWQUwpOworCisJc2lnbmFsKFNJR0lOVCwgJnNpZ25hbF9oYW5kbGVyKTsKKwlzaWduYWwoU0lHQUJSVCwgJnNpZ25hbF9oYW5kbGVyKTsKKwlzaWduYWwoU0lHVVNSMSwgJnNpZ25hbF9oYW5kbGVyKTsKKwlzaWduYWwoU0lHVVNSMiwgJnNpZ25hbF9oYW5kbGVyKTsKKwlzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisKKwl3aGlsZSAoMSkgeworCQlic2NfdXBxdWV1ZShic2NfZ3NtbmV0KTsKKwkJbG9nX3Jlc2V0X2NvbnRleHQoKTsKKwkJYnNjX3NlbGVjdF9tYWluKDApOworCX0KK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2JzY19pbml0LmMgYi9vcGVuYnNjL3NyYy9ic2NfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNGQ4NTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ic2NfaW5pdC5jCkBAIC0wLDAgKzEsMTEwNCBAQAorLyogQSBoYWNraXNoIG1pbmltYWwgQlNDICgrTVNDICtITFIpIGltcGxlbWVudGF0aW9uICovCisKKy8qIChDKSAyMDA4LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21pc2RuLmg+CisjaW5jbHVkZSA8b3Ntb2NvbS92dHkvdGVsbmV0X2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc3lzdGVtX2luZm9ybWF0aW9uLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9wYWdpbmcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvY2hhbl9hbGxvYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisvKiBnbG9iYWwgcG9pbnRlciB0byB0aGUgZ3NtIG5ldHdvcmsgZGF0YSBzdHJ1Y3R1cmUgKi8KK2V4dGVybiBzdHJ1Y3QgZ3NtX25ldHdvcmsgKmJzY19nc21uZXQ7CisKK3N0YXRpYyB2b2lkIHBhdGNoX25tX3RhYmxlcyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBhcmUgZm9yIE9NIGFuZCBOTSBwYWNrZXRzIHRoYXQgd2UgY2Fubm90IHlldAorICogZ2VuZXJhdGUgYnkgY29kZSBidXQgd2UganVzdCBwYXNzIG9uICovCisKKy8vIEJUUyBTaXRlIE1hbmFnZXIsIFNFVCBBVFRSSUJVVEVTCisKKy8qCisgIE9iamVjdCBDbGFzczogQlRTIFNpdGUgTWFuYWdlcgorICBJbnN0YW5jZSAxOiBGRgorICBJbnN0YW5jZSAyOiBGRgorICBJbnN0YW5jZSAzOiBGRgorU0VUIEFUVFJJQlVURVMKKyAgc0FiaXNFeHRlcm5hbFRpbWU6IDIwMDcvMDkvMDggICAxNDozNjoxMQorICBvbUxBUERSZWxUaW1lcjogMzBzZWMKKyAgc2hvcnRMQVBESW50VGltZXI6IDVzZWMKKyAgZW1lcmdlbmN5VGltZXIxOiAxMCBtaW51dGVzCisgIGVtZXJnZW5jeVRpbWVyMjogMCBtaW51dGVzCisqLworCit1bnNpZ25lZCBjaGFyIG1zZ18xW10gPQoreworCU5NX01UX0JTMTFfU0VUX0FUVFIsIE5NX09DX1NJVEVfTUFOQUdFUiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkJTk1fQVRUX0JTMTFfQUJJU19FWFRfVElNRSwgMHgwNywKKwkJCTB4RDcsIDB4MDksIDB4MDgsIDB4MEUsIDB4MjQsIDB4MEIsIDB4Q0UsCisJCTB4MDIsCisJCQkweDAwLCAweDFFLAorCQlOTV9BVFRfQlMxMV9TSF9MQVBEX0lOVF9USU1FUiwKKwkJCTB4MDEsIDB4MDUsCisJCTB4NDIsIDB4MDIsIDB4MDAsIDB4MEEsCisJCTB4NDQsIDB4MDIsIDB4MDAsIDB4MDAKK307CisKKy8vIEJUUywgU0VUIEJUUyBBVFRSSUJVVEVTCisKKy8qCisgIE9iamVjdCBDbGFzczogQlRTCisgIEJUUyByZWxhdC4gTnVtYmVyOiAwCisgIEluc3RhbmNlIDI6IEZGCisgIEluc3RhbmNlIDM6IEZGCitTRVQgQlRTIEFUVFJJQlVURVMKKyAgYnNJZGVudGl0eUNvZGUgLyBCU0lDOgorICAgIFBMTU5fY29sb3VyX2NvZGU6IDdoCisgICAgQlNfY29sb3VyX2NvZGU6ICAgN2gKKyAgQlRTIEFpciBUaW1lciBUMzEwNTogNCAgLHVuaXQgMTAgbXMKKyAgYnRzSXNIb3BwaW5nOiBGQUxTRQorICBwZXJpb2RDQ0NITG9hZEluZGljYXRpb246IDFzZWMKKyAgdGhyZXNob2xkQ0NDSExvYWRJbmRpY2F0aW9uOiAwJQorICBjZWxsQWxsb2NhdGlvbk51bWJlcjogMDBoID0gR1NNIDkwMAorICBlbmFibGVJbnRlcmZlcmVuY2VDbGFzczogMDBoID0gIERpc2FibGVkCisgIGZBQ0NIUXVhbDogNiAoRkFDQ0ggc3RlYWxpbmcgZmxhZ3MgbWludXMgMSkKKyAgaW50YXZlUGFyYW1ldGVyOiAzMSBTQUNDSCBtdWx0aWZyYW1lcworICBpbnRlcmZlcmVuY2VMZXZlbEJvdW5kYXJpZXM6CisgICAgSW50ZXJmZXJlbmNlIEJvdW5kYXJ5IDE6IDBBaAorICAgIEludGVyZmVyZW5jZSBCb3VuZGFyeSAyOiAwRmgKKyAgICBJbnRlcmZlcmVuY2UgQm91bmRhcnkgMzogMTRoCisgICAgSW50ZXJmZXJlbmNlIEJvdW5kYXJ5IDQ6IDE5aAorICAgIEludGVyZmVyZW5jZSBCb3VuZGFyeSA1OiAxRWgKKyAgbVNUeFB3ck1heDogMTEKKyAgICAgIEdTTSByYW5nZTogICAgIDI9MzlkQm0sIDE1PTEzZEJtLCBzdGVwc2l6ZSAyIGRCbQorICAgICAgRENTMTgwMCByYW5nZTogMD0zMGRCbSwgMTU9MGRCbSwgc3RlcHNpemUgMiBkQm0KKyAgICAgIFBDUzE5MDAgcmFuZ2U6IDA9MzBkQm0sIDE1PTBkQm0sIHN0ZXBzaXplIDIgZEJtCisgICAgICAgICAgICAgICAgICAgIDMwPTMzZEJtLCAzMT0zMmRCbQorICBueTE6CisgICAgTWF4aW11bSBudW1iZXIgb2YgcmVwZXRpdGlvbnMgZm9yIFBIWVNJQ0FMIElORk9STUFUSU9OIG1lc3NhZ2UgKEdTTSAwNC4wOCk6IDIwCisgIHBvd2VyT3V0cHV0VGhyZXNob2xkczoKKyAgICBPdXQgUG93ZXIgRmF1bHQgVGhyZXNob2xkOiAgICAgLTEwIGRCCisgICAgUmVkIE91dCBQb3dlciBUaHJlc2hvbGQ6ICAgICAgIC0gNiBkQgorICAgIEV4Y2Vzc2l2ZSBPdXQgUG93ZXIgVGhyZXNob2xkOiAgIDUgZEIKKyAgckFDSEJ1c3lUaHJlc2hvbGQ6IC0xMjcgZEJtCisgIHJBQ0hMb2FkQXZlcmFnaW5nU2xvdHM6IDI1MCAsbnVtYmVyIG9mIFJBQ0ggYnVyc3QgcGVyaW9kcworICByZlJlc291cmNlSW5kaWNhdGlvblBlcmlvZDogMTI1ICBTQUNDSCBtdWx0aWZyYW1lcworICBUMjAwOgorICAgIFNEQ0NIOiAgICAgICAgICAgICAgICAwNDQgaW4gIDUgbXMKKyAgICBGQUNDSC9GdWxsIHJhdGU6ICAgICAgMDMxIGluICA1IG1zCisgICAgRkFDQ0gvSGFsZiByYXRlOiAgICAgIDA0MSBpbiAgNSBtcworICAgIFNBQ0NIIHdpdGggVENIIFNBUEkwOiAwOTAgaW4gMTAgbXMKKyAgICBTQUNDSCB3aXRoIFNEQ0NIOiAgICAgMDkwIGluIDEwIG1zCisgICAgU0RDQ0ggd2l0aCBTQVBJMzogICAgIDA5MCBpbiAgNSBtcworICAgIFNBQ0NIIHdpdGggVENIIFNBUEkzOiAxMzUgaW4gMTAgbXMKKyAgdFN5bmM6IDkwMDAgdW5pdHMgb2YgMTAgbXNlYworICB0VHJhdTogOTAwMCB1bml0cyBvZiAxMCBtc2VjCisgIGVuYWJsZVVtTG9vcFRlc3Q6IDAwaCA9ICBkaXNhYmxlZAorICBlbmFibGVFeGNlc3NpdmVEaXN0YW5jZTogMDBoID0gIERpc2FibGVkCisgIGV4Y2Vzc2l2ZURpc3RhbmNlOiA2NGttCisgIGhvcHBpbmdNb2RlOiAwMGggPSBiYXNlYmFuZCBob3BwaW5nCisgIGNlbGxUeXBlOiAwMGggPSAgU3RhbmRhcmQgQ2VsbAorICBCQ0NIIEFSRkNOIC8gYkNDSEZyZXF1ZW5jeTogMQorKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYnMxMV9hdHRyX2J0c1tdID0KK3sKKwkJTk1fQVRUX0JTSUMsIEhBUkRDT0RFRF9CU0lDLAorCQlOTV9BVFRfQlRTX0FJUl9USU1FUiwgMHgwNCwKKwkJTk1fQVRUX0JTMTFfQlRTTFNfSE9QUElORywgMHgwMCwKKwkJTk1fQVRUX0NDQ0hfTF9JX1AsIDB4MDEsCisJCU5NX0FUVF9DQ0NIX0xfVCwgMHgwMCwKKwkJTk1fQVRUX0JTMTFfQ0VMTF9BTExPQ19OUiwgTk1fQlMxMV9DQU5SX0dTTSwKKwkJTk1fQVRUX0JTMTFfRU5BX0lOVEVSRl9DTEFTUywgMHgwMSwKKwkJTk1fQVRUX0JTMTFfRkFDQ0hfUVVBTCwgMHgwNiwKKwkJLyogaW50ZXJmZXJlbmNlIGF2Zy4gcGVyaW9kIGluIG51bWJlcnMgb2YgU0FDQ0ggbXVsdGlmciAqLworCQlOTV9BVFRfSU5UQVZFX1BBUkFNLCAweDFGLAorCQlOTV9BVFRfSU5URVJGX0JPVU5ELCAweDBBLCAweDBGLCAweDE0LCAweDE5LCAweDFFLCAweDdCLAorCQlOTV9BVFRfQ0NDSF9MX1QsIDB4MjMsCisJCU5NX0FUVF9HU01fVElNRSwgMHgyOCwgMHgwMCwKKwkJTk1fQVRUX0FETV9TVEFURSwgMHgwMywKKwkJTk1fQVRUX1JBQ0hfQl9USFJFU0gsIDB4N0YsCisJCU5NX0FUVF9MREFWR19TTE9UUywgMHgwMCwgMHhGQSwKKwkJTk1fQVRUX0JTMTFfUkZfUkVTX0lORF9QRVIsIDB4N0QsCisJCU5NX0FUVF9UMjAwLCAweDJDLCAweDFGLCAweDI5LCAweDVBLCAweDVBLCAweDVBLCAweDg3LAorCQlOTV9BVFRfQlMxMV9UU1lOQywgMHgyMywgMHgyOCwKKwkJTk1fQVRUX0JTMTFfVFRSQVUsIDB4MjMsIDB4MjgsCisJCU5NX0FUVF9URVNUX0RVUiwgMHgwMSwgMHgwMCwKKwkJTk1fQVRUX09VVFNUX0FMQVJNLCAweDAxLCAweDAwLAorCQlOTV9BVFRfQlMxMV9FWENFU1NJVkVfRElTVEFOQ0UsIDB4MDEsIDB4NDAsCisJCU5NX0FUVF9CUzExX0hPUFBJTkdfTU9ERSwgMHgwMSwgMHgwMCwKKwkJTk1fQVRUX0JTMTFfUExMLCAweDAxLCAweDAwLAorCQlOTV9BVFRfQkNDSF9BUkZDTiwgMHgwMCwgSEFSRENPREVEX0FSRkNOLyoweDAxKi8sCit9OworCisvLyBIYW5kb3ZlciBSZWNvZ25pdGlvbiwgU0VUIEFUVFJJQlVURVMKKworLyoKK0lsbGVnYWwgQ29udGVudHMgR1NNIEZvcm1hdHRlZCBPJk0gTXNnCisgIE9iamVjdCBDbGFzczogSGFuZG92ZXIgUmVjb2duaXRpb24KKyAgQlRTIHJlbGF0LiBOdW1iZXI6IDAKKyAgSW5zdGFuY2UgMjogRkYKKyAgSW5zdGFuY2UgMzogRkYKK1NFVCBBVFRSSUJVVEVTCisgIGVuYWJsZURlbGF5UG93ZXJCdWRnZXRITzogMDBoID0gRGlzYWJsZWQKKyAgZW5hYmxlRGlzdGFuY2VITzogMDBoID0gIERpc2FibGVkCisgIGVuYWJsZUludGVybmFsSW50ZXJDZWxsSGFuZG92ZXI6IDAwaCA9IERpc2FibGVkCisgIGVuYWJsZUludGVybmFsSW50cmFDZWxsSGFuZG92ZXI6IDAwaCA9ICBEaXNhYmxlZAorICBlbmFibGVQb3dlckJ1ZGdldEhPOiAwMGggPSBEaXNhYmxlZAorICBlbmFibGVSWExFVkhPOiAwMGggPSAgRGlzYWJsZWQKKyAgZW5hYmxlUlhRVUFMSE86IDAwaCA9ICBEaXNhYmxlZAorICBob0F2ZXJhZ2luZ0Rpc3RhbmNlOiA4ICBTQUNDSCBtdWx0aWZyYW1lcworICBob0F2ZXJhZ2luZ0xldjoKKyAgICBBX0xFVl9ITzogOCAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgICBXX0xFVl9ITzogMSAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgaG9BdmVyYWdpbmdQb3dlckJ1ZGdldDogIDE2ICBTQUNDSCBtdWx0aWZyYW1lcworICBob0F2ZXJhZ2luZ1F1YWw6CisgICAgQV9RVUFMX0hPOiA4ICBTQUNDSCBtdWx0aWZyYW1lcworICAgIFdfUVVBTF9ITzogMiAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgaG9Mb3dlclRocmVzaG9sZExldkRMOiAoMTAgLSAxMTApIGRCbQorICBob0xvd2VyVGhyZXNob2xkTGV2VUw6ICg1IC0gMTEwKSBkQm0KKyAgaG9Mb3dlclRocmVzaG9sZFF1YWxETDogMDZoID0gICA2LjQlIDwgQkVSIDwgMTIuOCUKKyAgaG9Mb3dlclRocmVzaG9sZFF1YWxVTDogMDZoID0gICA2LjQlIDwgQkVSIDwgMTIuOCUKKyAgaG9UaHJlc2hvbGRMZXZETGludHJhIDogKDIwIC0gMTEwKSBkQm0KKyAgaG9UaHJlc2hvbGRMZXZVTGludHJhOiAoMjAgLSAxMTApIGRCbQorICBob1RocmVzaG9sZE1zUmFuZ2VNYXg6IDIwIGttCisgIG5DZWxsOiAwNmgKKyAgdGltZXJIT1JlcXVlc3Q6IDMgICx1bml0IDIgU0FDQ0ggbXVsdGlmcmFtZXMKKyovCisKK3Vuc2lnbmVkIGNoYXIgbXNnXzNbXSA9Cit7CisJTk1fTVRfQlMxMV9TRVRfQVRUUiwgTk1fT0NfQlMxMV9IQU5ET1ZFUiwgMHgwMCwgMHhGRiwgMHhGRiwKKwkJMHhEMCwgMHgwMCwJCS8qIGVuYWJsZURlbGF5UG93ZXJCdWRnZXRITyAqLworCQkweDY0LCAweDAwLAkJLyogZW5hYmxlRGlzdGFuY2VITyAqLworCQkweDY3LCAweDAwLAkJLyogZW5hYmxlSW50ZXJuYWxJbnRlckNlbGxIYW5kb3ZlciAqLworCQkweDY4LCAweDAwLAkJLyogZW5hYmxlSW50ZXJuYWxJbnRlckNlbGxIYW5kb3ZlciAqLworCQkweDZBLCAweDAwLAkJLyogZW5hYmxlUG93ZXJCdWRnZXRITyAqLworCQkweDZDLCAweDAwLAkJLyogZW5hYmxlUlhMRVZITyAqLworCQkweDZELCAweDAwLAkJLyogZW5hYmxlUlhRVUFMSE8gKi8KKwkJMHg2RiwgMHgwOCwJCS8qIGhvQXZlcmFnaW5nRGlzdGFuY2UgKi8KKwkJMHg3MCwgMHgwOCwgMHgwMSwJLyogaG9BdmVyYWdpbmdMZXYgKi8KKwkJMHg3MSwgMHgxMCwgMHgxMCwgMHgxMCwKKwkJMHg3MiwgMHgwOCwgMHgwMiwJLyogaG9BdmVyYWdpbmdRdWFsICovCisJCTB4NzMsIDB4MEEsCQkvKiBob0xvd2VyVGhyZXNob2xkTGV2REwgKi8KKwkJMHg3NCwgMHgwNSwJCS8qIGhvTG93ZXJUaHJlc2hvbGRMZXZVTCAqLworCQkweDc1LCAweDA2LAkJLyogaG9Mb3dlclRocmVzaG9sZFF1YWxETCAqLworCQkweDc2LCAweDA2LAkJLyogaG9Mb3dlclRocmVzaG9sZFF1YWxVTCAqLworCQkweDc4LCAweDE0LAkJLyogaG9UaHJlc2hvbGRMZXZETGludHJhICovCisJCTB4NzksIDB4MTQsCQkvKiBob1RocmVzaG9sZExldlVMaW50cmEgKi8KKwkJMHg3QSwgMHgxNCwJCS8qIGhvVGhyZXNob2xkTXNSYW5nZU1heCAqLworCQkweDdELCAweDA2LAkJLyogbkNlbGwgKi8KKwkJTk1fQVRUX0JTMTFfVElNRVJfSE9fUkVRVUVTVCwgMHgwMywKKwkJMHgyMCwgMHgwMSwgMHgwMCwKKwkJMHg0NSwgMHgwMSwgMHgwMCwKKwkJMHg0OCwgMHgwMSwgMHgwMCwKKwkJMHg1QSwgMHgwMSwgMHgwMCwKKwkJMHg1QiwgMHgwMSwgMHgwNSwKKwkJMHg1RSwgMHgwMSwgMHgxQSwKKwkJMHg1RiwgMHgwMSwgMHgyMCwKKwkJMHg5RCwgMHgwMSwgMHgwMCwKKwkJMHg0NywgMHgwMSwgMHgwMCwKKwkJMHg1QywgMHgwMSwgMHg2NCwKKwkJMHg1RCwgMHgwMSwgMHgxRSwKKwkJMHg5NywgMHgwMSwgMHgyMCwKKwkJMHhGNywgMHgwMSwgMHgzQywKK307CisKKy8vIFBvd2VyIENvbnRyb2wsIFNFVCBBVFRSSUJVVEVTCisKKy8qCisgIE9iamVjdCBDbGFzczogUG93ZXIgQ29udHJvbAorICBCVFMgcmVsYXQuIE51bWJlcjogMAorICBJbnN0YW5jZSAyOiBGRgorICBJbnN0YW5jZSAzOiBGRgorU0VUIEFUVFJJQlVURVMKKyAgZW5hYmxlTXNQb3dlckNvbnRyb2w6IDAwaCA9ICBEaXNhYmxlZAorICBlbmFibGVQb3dlckNvbnRyb2xSTEZXOiAwMGggPSAgRGlzYWJsZWQKKyAgcGNBdmVyYWdpbmdMZXY6CisgICAgQV9MRVZfUEM6IDQgIFNBQ0NIIG11bHRpZnJhbWVzCisgICAgV19MRVZfUEM6IDEgIFNBQ0NIIG11bHRpZnJhbWVzCisgIHBjQXZlcmFnaW5nUXVhbDoKKyAgICBBX1FVQUxfUEM6IDQgIFNBQ0NIIG11bHRpZnJhbWVzCisgICAgV19RVUFMX1BDOiAyICBTQUNDSCBtdWx0aWZyYW1lcworICBwY0xvd2VyVGhyZXNob2xkTGV2REw6IDBGaAorICBwY0xvd2VyVGhyZXNob2xkTGV2VUw6IDBBaAorICBwY0xvd2VyVGhyZXNob2xkUXVhbERMOiAwNWggPSAgIDMuMiUgPCBCRVIgPCAgNi40JQorICBwY0xvd2VyVGhyZXNob2xkUXVhbFVMOiAwNWggPSAgIDMuMiUgPCBCRVIgPCAgNi40JQorICBwY1JMRlRocmVzaG9sZDogMENoCisgIHBjVXBwZXJUaHJlc2hvbGRMZXZETDogMTRoCisgIHBjVXBwZXJUaHJlc2hvbGRMZXZVTDogMEZoCisgIHBjVXBwZXJUaHJlc2hvbGRRdWFsREw6IDA0aCA9ICAgMS42JSA8IEJFUiA8ICAzLjIlCisgIHBjVXBwZXJUaHJlc2hvbGRRdWFsVUw6IDA0aCA9ICAgMS42JSA8IEJFUiA8ICAzLjIlCisgIHBvd2VyQ29uZmlybTogMiAgLHVuaXQgMiBTQUNDSCBtdWx0aWZyYW1lcworICBwb3dlckNvbnRyb2xJbnRlcnZhbDogMiAgLHVuaXQgMiBTQUNDSCBtdWx0aWZyYW1lcworICBwb3dlckluY3JTdGVwU2l6ZTogMDJoID0gNCBkQgorICBwb3dlclJlZFN0ZXBTaXplOiAwMWggPSAyIGRCCisgIHJhZGlvTGlua1RpbWVvdXRCczogNjQgIFNBQ0NIIG11bHRpZnJhbWVzCisgIGVuYWJsZUJTUG93ZXJDb250cm9sOiAwMGggPSAgZGlzYWJsZWQKKyovCisKK3Vuc2lnbmVkIGNoYXIgbXNnXzRbXSA9Cit7CisJTk1fTVRfQlMxMV9TRVRfQVRUUiwgTk1fT0NfQlMxMV9QV1JfQ1RSTCwgMHgwMCwgMHhGRiwgMHhGRiwKKwkJTk1fQVRUX0JTMTFfRU5BX01TX1BXUl9DVFJMLCAweDAwLAorCQlOTV9BVFRfQlMxMV9FTkFfUFdSX0NUUkxfUkxGVywgMHgwMCwKKwkJMHg3RSwgMHgwNCwgMHgwMSwJLyogcGNBdmVyYWdpbmdMZXYgKi8KKwkJMHg3RiwgMHgwNCwgMHgwMiwJLyogcGNBdmVyYWdpbmdRdWFsICovCisJCTB4ODAsIDB4MEYsCQkvKiBwY0xvd2VyVGhyZXNob2xkTGV2REwgKi8KKwkJMHg4MSwgMHgwQSwJCS8qIHBjTG93ZXJUaHJlc2hvbGRMZXZVTCAqLworCQkweDgyLCAweDA1LAkJLyogcGNMb3dlclRocmVzaG9sZFF1YWxETCAqLworCQkweDgzLCAweDA1LAkJLyogcGNMb3dlclRocmVzaG9sZFF1YWxVTCAqLworCQkweDg0LCAweDBDLCAJCS8qIHBjUkxGVGhyZXNob2xkICovCisJCTB4ODUsIDB4MTQsIAkJLyogcGNVcHBlclRocmVzaG9sZExldkRMICovCisJCTB4ODYsIDB4MEYsIAkJLyogcGNVcHBlclRocmVzaG9sZExldlVMICovCisJCTB4ODcsIDB4MDQsCQkvKiBwY1VwcGVyVGhyZXNob2xkUXVhbERMICovCisJCTB4ODgsIDB4MDQsCQkvKiBwY1VwcGVyVGhyZXNob2xkUXVhbFVMICovCisJCTB4ODksIDB4MDIsCQkvKiBwb3dlckNvbmZpcm0gKi8KKwkJMHg4QSwgMHgwMiwJCS8qIHBvd2VyQ29uZmlybUludGVydmFsICovCisJCTB4OEIsIDB4MDIsCQkvKiBwb3dlckluY3JTdGVwU2l6ZSAqLworCQkweDhDLCAweDAxLAkJLyogcG93ZXJSZWRTdGVwU2l6ZSAqLworCQkweDhELCAweDQwLAkJLyogcmFkaW9MaW5rVGltZW91dEJzICovCisJCTB4NjUsIDB4MDEsIDB4MDAgLy8gc2V0IHRvIDB4MDEgdG8gZW5hYmxlIEJTUG93ZXJDb250cm9sCit9OworCisKKy8vIFRyYW5zY2VpdmVyLCBTRVQgVFJYIEFUVFJJQlVURVMgKFRSWCAwKQorCisvKgorICBPYmplY3QgQ2xhc3M6IFRyYW5zY2VpdmVyCisgIEJUUyByZWxhdC4gTnVtYmVyOiAwCisgIFRyYW5jZWl2ZXIgbnVtYmVyOiAwCisgIEluc3RhbmNlIDM6IEZGCitTRVQgVFJYIEFUVFJJQlVURVMKKyAgYVJGQ05MaXN0IChIRVgpOiAgMDAwMQorICB0eFB3ck1heFJlZHVjdGlvbjogMDBoID0gICAzMGRCCisgIHJhZGlvTWVhc0dyYW46IDI1NCAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgcmFkaW9NZWFzUmVwOiAwMWggPSAgZW5hYmxlZAorICBtZW1iZXJPZkVtZXJnZW5jeUNvbmZpZzogMDFoID0gIFRSVUUKKyAgdHJ4QXJlYTogMDBoID0gVFJYIGRvZXNuJ3QgYmVsb25nIHRvIGEgY29uY2VudHJpYyBjZWxsCisqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBiczExX2F0dHJfcmFkaW9bXSA9Cit7CisJCU5NX0FUVF9BUkZDTl9MSVNULCAweDAxLCAweDAwLCBIQVJEQ09ERURfQVJGQ04gLyoweDAxKi8sCisJCU5NX0FUVF9SRl9NQVhQT1dSX1IsIDB4MDAsCisJCU5NX0FUVF9CUzExX1JBRElPX01FQVNfR1JBTiwgMHgwMSwgMHgwNSwKKwkJTk1fQVRUX0JTMTFfUkFESU9fTUVBU19SRVAsIDB4MDEsIDB4MDEsCisJCU5NX0FUVF9CUzExX0VNUkdfQ0ZHX01FTUJFUiwgMHgwMSwgMHgwMSwKKwkJTk1fQVRUX0JTMTFfVFJYX0FSRUEsIDB4MDEsIDB4MDAsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBuYW5vYnRzX2F0dHJfYnRzW10gPSB7CisJTk1fQVRUX0lOVEVSRl9CT1VORCwgMHg1NSwgMHg1YiwgMHg2MSwgMHg2NywgMHg2ZCwgMHg3MywKKwkvKiBpbnRlcmZlcmVuY2UgYXZnLiBwZXJpb2QgaW4gbnVtYmVycyBvZiBTQUNDSCBtdWx0aWZyICovCisJTk1fQVRUX0lOVEFWRV9QQVJBTSwgMHgwNiwKKwkvKiBjb25uIGZhaWwgYmFzZWQgb24gU0FDQ0ggZXJyb3IgcmF0ZSAqLworCU5NX0FUVF9DT05OX0ZBSUxfQ1JJVCwgMHgwMCwgMHgwMiwgMHgwMSwgMHgxMCwKKwlOTV9BVFRfVDIwMCwgMHgxZSwgMHgyNCwgMHgyNCwgMHhhOCwgMHgzNCwgMHgyMSwgMHhhOCwKKwlOTV9BVFRfTUFYX1RBLCAweDNmLAorCU5NX0FUVF9PVkVSTF9QRVJJT0QsIDB4MDAsIDB4MDEsIDEwLCAvKiBzZWNvbmRzICovCisJTk1fQVRUX0NDQ0hfTF9ULCAxMCwgLyogcGVyY2VudCAqLworCU5NX0FUVF9DQ0NIX0xfSV9QLCAxLCAvKiBzZWNvbmRzICovCisJTk1fQVRUX1JBQ0hfQl9USFJFU0gsIDEwLCAvKiBidXN5IHRocmVzaG9sZCBpbiAtIGRCbSAqLworCU5NX0FUVF9MREFWR19TTE9UUywgMHgwMywgMHhlOCwgLyogcmFjaCBsb2FkIGF2ZXJhZ2luZyAxMDAwIHNsb3RzICovCisJTk1fQVRUX0JUU19BSVJfVElNRVIsIDEyOCwgLyogbWlsaXNlY29uZHMgKi8KKwlOTV9BVFRfTlkxLCAxMCwgLyogMTAgcmV0cmFuc21pc3Npb25zIG9mIHBoeXNpY2FsIGNvbmZpZyAqLworCU5NX0FUVF9CQ0NIX0FSRkNOLCBIQVJEQ09ERURfQVJGQ04gPj4gOCwgSEFSRENPREVEX0FSRkNOICYgMHhmZiwKKwlOTV9BVFRfQlNJQywgSEFSRENPREVEX0JTSUMsCisJTk1fQVRUX0lQQUNDX0NHSSwgMCwgNywgIDB4MDAsIDB4ZjEsIDB4MTAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBuYW5vYnRzX2F0dHJfcmFkaW9bXSA9IHsKKwlOTV9BVFRfUkZfTUFYUE9XUl9SLCAweDBjLCAvKiBudW1iZXIgb2YgLTJkQiByZWR1Y3Rpb24gc3RlcHMgLyBQbiAqLworCU5NX0FUVF9BUkZDTl9MSVNULCAweDAwLCAweDAyLCBIQVJEQ09ERURfQVJGQ04gPj4gOCwgSEFSRENPREVEX0FSRkNOICYgMHhmZiwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG5hbm9idHNfYXR0cl9uc2VbXSA9IHsKKwlOTV9BVFRfSVBBQ0NfTlNFSSwgMCwgMiwgIDB4MDMsIDB4OWQsIC8qIE5TRUkgOTI1ICovCisJTk1fQVRUX0lQQUNDX05TX0NGRywgMCwgNywgIDMsICAvKiAodW4pYmxvY2tpbmcgdGltZXIgKFRucy1ibG9jaykgKi8KKwkJCQkgICAgMywgIC8qICh1bilibG9ja2luZyByZXRyaWVzICovCisJCQkJICAgIDMsICAvKiByZXNldCB0aW1lciAoVG5zLXJlc2V0KSAqLworCQkJCSAgICAzLCAgLyogcmVzZXQgcmV0cmllcyAqLworCQkJCSAgICAzMCwgIC8qIHRlc3QgdGltZXIgKFRucy10ZXN0KSAqLworCQkJCSAgICAzLCAgLyogYWxpdmUgdGltZXIgKFRucy1hbGl2ZSkgKi8KKwkJCQkgICAgMTAsIC8qIGFsaXZlIHJldHJpcmVzICovCisJTk1fQVRUX0lQQUNDX0JTU0dQX0NGRywgMCwgMTEsCisJCQkJICAgIDMsICAvKiBibG9ja2ltZyB0aW1lciAoVDEpICovCisJCQkJICAgIDMsICAvKiBibG9ja2luZyByZXRyaWVzICovCisJCQkJICAgIDMsICAvKiB1bmJsb2NraW5nIHJldHJpZXMgKi8KKwkJCQkgICAgMywgIC8qIHJlc2V0IHRpbWVyICovCisJCQkJICAgIDMsICAvKiByZXNldCByZXRyaWVzICovCisJCQkJICAgIDEwLCAvKiBzdXNwZW5kIHRpbWVyIChUMykgaW4gMTAwbXMgKi8KKwkJCQkgICAgMywgIC8qIHN1c3BlbmQgcmV0cmllcyAqLworCQkJCSAgICAxMCwgLyogcmVzdW1lIHRpbWVyIChUNCkgaW4gMTAwbXMgKi8KKwkJCQkgICAgMywgIC8qIHJlc3VtZSByZXRyaWVzICovCisJCQkJICAgIDEwLCAvKiBjYXBhYmlsaXR5IHVwZGF0ZSB0aW1lciAoVDUpICovCisJCQkJICAgIDMsICAvKiBjYXBhYmlsaXR5IHVwZGF0ZSByZXRyaWVzICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBuYW5vYnRzX2F0dHJfY2VsbFtdID0geworCU5NX0FUVF9JUEFDQ19SQUMsIDAsIDEsICAxLCAvKiByb3V0aW5nIGFyZWEgY29kZSAqLworCU5NX0FUVF9JUEFDQ19HUFJTX1BBR0lOR19DRkcsIDAsIDIsCisJCTUsCS8qIHJlcGVhdCB0aW1lICg1MG1zKSAqLworCQkzLAkvKiByZXBlYXQgY291bnQgKi8KKwlOTV9BVFRfSVBBQ0NfQlZDSSwgMCwgMiwgIDB4MDMsIDB4OWQsIC8qIEJWQ0kgOTI1ICovCisJTk1fQVRUX0lQQUNDX1JMQ19DRkcsIDAsIDksCisJCTIwLCAJLyogVDMxNDIgKi8KKwkJNSwgCS8qIFQzMTY5ICovCisJCTUsCS8qIFQzMTkxICovCisJCTIwMCwJLyogVDMxOTMgKi8KKwkJNSwJLyogVDMxOTUgKi8KKwkJMTAsCS8qIE4zMTAxICovCisJCTQsCS8qIE4zMTAzICovCisJCTgsCS8qIE4zMTA1ICovCisJCTE1LAkvKiBSTEMgQ1YgY291bnRkb3duICovCisJTk1fQVRUX0lQQUNDX0NPRElOR19TQ0hFTUVTLCAwLCAyLCAgMHgwZiwgMHgwMCwJLyogQ1MxLi5DUzQgKi8KKwlOTV9BVFRfSVBBQ0NfUkxDX0NGR18yLCAwLCA1LAorCQkweDAwLCAyNTAsCS8qIFQgZG93bmxpbmsgVEJGIGV4dGVuc2lvbiAoMC4uNTAwKSAqLworCQkweDAwLCAyNTAsCS8qIFQgdXBsaW5rIFRCRiBleHRlbnNpb24gKDAuLjUwMCkgKi8KKwkJMiwJLyogQ1MyICovCisjaWYgMAorCS8qIEVER0UgbW9kZWwgb25seSwgYnJlYWtzIG9sZGVyIG1vZGVscy4KKwkgKiBTaG91bGQgaW5xdWlyZSB0aGUgQlRTIGNhcGFiaWxpdGllcyAqLworCU5NX0FUVF9JUEFDQ19STENfQ0ZHXzMsIDAsIDEsCisJCTIsCS8qIE1DUzIgKi8KKyNlbmRpZgorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbmFub2J0c19hdHRyX25zdmMwW10gPSB7CisJTk1fQVRUX0lQQUNDX05TVkNJLCAwLCAyLCAgMHgwMywgMHg5ZCwgLyogOTI1ICovCisJTk1fQVRUX0lQQUNDX05TX0xJTktfQ0ZHLCAwLCA4LAorCQkweDU5LCAweGQ4LCAvKiByZW1vdGUgdWRwIHBvcnQgKDIzMDAwKSAqLworCQkxOTIsIDE2OCwgMTAwLCAxMSwgLyogcmVtb3RlIGlwIGFkZHJlc3MgKi8KKwkJMHg1OSwgMHhkOCwgLyogbG9jYWwgdWRwIHBvcnQgKDIzMDAwKSAqLworfTsKKworLyogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW5ldmVyIHdlIGdldCBhIEdTTSAxMi4yMSBzdGF0ZSBjaGFuZ2UgZXZlbnQgKi8KK2ludCBubV9zdGF0ZV9ldmVudChlbnVtIG5tX2V2dCBldnQsIHVfaW50OF90IG9ial9jbGFzcywgdm9pZCAqb2JqLAorCQkgICBzdHJ1Y3QgZ3NtX25tX3N0YXRlICpvbGRfc3RhdGUsIHN0cnVjdCBnc21fbm1fc3RhdGUgKm5ld19zdGF0ZSwKKwkJICAgc3RydWN0IGFiaXNfb21fb2JqX2luc3QgKm9ial9pbnN0KQoreworCXN0cnVjdCBnc21fYnRzICpidHM7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0czsKKwlzdHJ1Y3QgZ3NtX2J0c19ncHJzX25zdmMgKm5zdmM7CisKKwkvKiBUaGlzIGV2ZW50LWRyaXZlbiBCVFMgc2V0dXAgaXMgY3VycmVudGx5IG9ubHkgcmVxdWlyZWQgb24gbmFub0JUUyAqLworCisJLyogRVZUX1NUQVRFQ0hHX0FETSBpcyBjYWxsZWQgYWZ0ZXIgd2UgY2FsbCBjaGdfYWRtX3N0YXRlKCkgYW5kIHdvdWxkIGNyZWF0ZQorCSAqIGVuZGxlc3MgbG9vcCAqLworCWlmIChldnQgIT0gRVZUX1NUQVRFQ0hHX09QRVIpCisJCXJldHVybiAwOworCisJc3dpdGNoIChvYmpfY2xhc3MpIHsKKwljYXNlIE5NX09DX1NJVEVfTUFOQUdFUjoKKwkJYnRzID0gY29udGFpbmVyX29mKG9iaiwgc3RydWN0IGdzbV9idHMsIHNpdGVfbWdyKTsKKwkJaWYgKChuZXdfc3RhdGUtPm9wZXJhdGlvbmFsID09IE5NX09QU1RBVEVfRU5BQkxFRCAmJgorCQkgICAgIG5ld19zdGF0ZS0+YXZhaWxhYmlsaXR5ID09IE5NX0FWU1RBVEVfT0spIHx8CisJCSAgICAobmV3X3N0YXRlLT5vcGVyYXRpb25hbCA9PSBOTV9PUFNUQVRFX0RJU0FCTEVEICYmCisJCSAgICAgbmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gTk1fQVZTVEFURV9PRkZfTElORSkpCisJCQlhYmlzX25tX29wc3RhcnQoYnRzLCBvYmpfY2xhc3MsIDB4ZmYsIDB4ZmYsIDB4ZmYpOworCQlicmVhazsKKwljYXNlIE5NX09DX0JUUzoKKwkJYnRzID0gb2JqOworCQlpZiAobmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gTk1fQVZTVEFURV9ERVBFTkRFTkNZKSB7CisJCQlwYXRjaF9ubV90YWJsZXMoYnRzKTsKKwkJCWFiaXNfbm1fc2V0X2J0c19hdHRyKGJ0cywgbmFub2J0c19hdHRyX2J0cywKKwkJCQkJICAgICBzaXplb2YobmFub2J0c19hdHRyX2J0cykpOworCQkJYWJpc19ubV9jaGdfYWRtX3N0YXRlKGJ0cywgb2JqX2NsYXNzLAorCQkJCQkgICAgICBidHMtPmJ0c19uciwgMHhmZiwgMHhmZiwKKwkJCQkJICAgICAgTk1fU1RBVEVfVU5MT0NLRUQpOworCQkJYWJpc19ubV9vcHN0YXJ0KGJ0cywgb2JqX2NsYXNzLAorCQkJCQlidHMtPmJ0c19uciwgMHhmZiwgMHhmZik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19DSEFOTkVMOgorCQl0cyA9IG9iajsKKwkJdHJ4ID0gdHMtPnRyeDsKKwkJaWYgKG5ld19zdGF0ZS0+b3BlcmF0aW9uYWwgPT0gTk1fT1BTVEFURV9ESVNBQkxFRCAmJgorCQkgICAgbmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gTk1fQVZTVEFURV9ERVBFTkRFTkNZKSB7CisJCQlwYXRjaF9ubV90YWJsZXModHJ4LT5idHMpOworCQkJZW51bSBhYmlzX25tX2NoYW5fY29tYiBjY29tYiA9CisJCQkJCQlhYmlzX25tX2NoY29tYjRwY2hhbih0cy0+cGNoYW4pOworCQkJYWJpc19ubV9zZXRfY2hhbm5lbF9hdHRyKHRzLCBjY29tYik7CisJCQlhYmlzX25tX2NoZ19hZG1fc3RhdGUodHJ4LT5idHMsIG9ial9jbGFzcywKKwkJCQkJICAgICAgdHJ4LT5idHMtPmJ0c19uciwgdHJ4LT5uciwgdHMtPm5yLAorCQkJCQkgICAgICBOTV9TVEFURV9VTkxPQ0tFRCk7CisJCQlhYmlzX25tX29wc3RhcnQodHJ4LT5idHMsIG9ial9jbGFzcywKKwkJCQkJdHJ4LT5idHMtPmJ0c19uciwgdHJ4LT5uciwgdHMtPm5yKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5NX09DX1JBRElPX0NBUlJJRVI6CisJCXRyeCA9IG9iajsKKwkJaWYgKG5ld19zdGF0ZS0+b3BlcmF0aW9uYWwgPT0gTk1fT1BTVEFURV9ESVNBQkxFRCAmJgorCQkgICAgbmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gTk1fQVZTVEFURV9PSykKKwkJCWFiaXNfbm1fb3BzdGFydCh0cngtPmJ0cywgb2JqX2NsYXNzLCB0cngtPmJ0cy0+YnRzX25yLAorCQkJCQl0cngtPm5yLCAweGZmKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19HUFJTX05TRToKKwkJYnRzID0gY29udGFpbmVyX29mKG9iaiwgc3RydWN0IGdzbV9idHMsIGdwcnMubnNlKTsKKwkJaWYgKGJ0cy0+Z3Bycy5tb2RlID09IEJUU19HUFJTX05PTkUpCisJCQlicmVhazsKKwkJaWYgKG5ld19zdGF0ZS0+YXZhaWxhYmlsaXR5ID09IE5NX0FWU1RBVEVfREVQRU5ERU5DWSkgeworCQkJYWJpc19ubV9pcGFjY2Vzc19zZXRfYXR0cihidHMsIG9ial9jbGFzcywgYnRzLT5idHNfbnIsCisJCQkJCQkgIDB4ZmYsIDB4ZmYsIG5hbm9idHNfYXR0cl9uc2UsCisJCQkJCQkgIHNpemVvZihuYW5vYnRzX2F0dHJfbnNlKSk7CisJCQlhYmlzX25tX29wc3RhcnQoYnRzLCBvYmpfY2xhc3MsIGJ0cy0+YnRzX25yLAorCQkJCQkweGZmLCAweGZmKTsKKwkJCWFiaXNfbm1fY2hnX2FkbV9zdGF0ZShidHMsIG9ial9jbGFzcywgYnRzLT5idHNfbnIsCisJCQkJCSAgICAgIDB4ZmYsIDB4ZmYsIE5NX1NUQVRFX1VOTE9DS0VEKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5NX09DX0dQUlNfQ0VMTDoKKwkJYnRzID0gY29udGFpbmVyX29mKG9iaiwgc3RydWN0IGdzbV9idHMsIGdwcnMuY2VsbCk7CisJCWlmIChidHMtPmdwcnMubW9kZSA9PSBCVFNfR1BSU19OT05FKQorCQkJYnJlYWs7CisJCWlmIChuZXdfc3RhdGUtPmF2YWlsYWJpbGl0eSA9PSBOTV9BVlNUQVRFX0RFUEVOREVOQ1kpIHsKKwkJCWFiaXNfbm1faXBhY2Nlc3Nfc2V0X2F0dHIoYnRzLCBvYmpfY2xhc3MsIGJ0cy0+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+c2lfY29tbW9uLm5jY19wZXJtaXR0ZWQgPSAweGZmOworCisJcGFnaW5nX2luaXQoYnRzKTsKKworCXJldHVybiAwOworfQorCitpbnQgYnNjX2Jvb3RzdHJhcF9uZXR3b3JrKGludCAoKm1uY2NfcmVjdikoc3RydWN0IGdzbV9uZXR3b3JrICosIGludCwgdm9pZCAqKSwKKwkJCSAgY29uc3QgY2hhciAqY29uZmlnX2ZpbGUpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uIGR1bW15X2Nvbm47CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlpbnQgcmM7CisKKwkvKiBpbml0aWFsaXplIG91ciBkYXRhIHN0cnVjdHVyZXMgKi8KKwlic2NfZ3NtbmV0ID0gZ3NtX25ldHdvcmtfaW5pdCgxLCAxLCBtbmNjX3JlY3YpOworCWlmICghYnNjX2dzbW5ldCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlic2NfZ3NtbmV0LT5uYW1lX2xvbmcgPSB0YWxsb2Nfc3RyZHVwKGJzY19nc21uZXQsICJPcGVuQlNDIik7CisJYnNjX2dzbW5ldC0+bmFtZV9zaG9ydCA9IHRhbGxvY19zdHJkdXAoYnNjX2dzbW5ldCwgIk9wZW5CU0MiKTsKKworCS8qIG91ciB2dHkgY29tbWFuZCBjb2RlIGV4cGVjdHMgdnR5LT5wcml2IHRvIHBvaW50IHRvIGEgdGVsbmV0X2Nvbm5lY3Rpb24gKi8KKwlkdW1teV9jb25uLnByaXYgPSBic2NfZ3NtbmV0OworCXJjID0gdnR5X3JlYWRfY29uZmlnX2ZpbGUoY29uZmlnX2ZpbGUsICZkdW1teV9jb25uKTsKKwlpZiAocmMgPCAwKSB7CisJCUxPR1AoRE5NLCBMT0dMX0ZBVEFMLCAiRmFpbGVkIHRvIHBhcnNlIHRoZSBjb25maWcgZmlsZTogJyVzJ1xuIiwgY29uZmlnX2ZpbGUpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSB0ZWxuZXRfaW5pdCh0YWxsX2JzY19jdHgsIGJzY19nc21uZXQsIDQyNDIpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX05NLCBubV9zaWdfY2IsIE5VTEwpOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoYnRzLCAmYnNjX2dzbW5ldC0+YnRzX2xpc3QsIGxpc3QpIHsKKwkJYm9vdHN0cmFwX2J0cyhidHMpOworCQlpZiAoIWlzX2lwYWNjZXNzX2J0cyhidHMpKQorCQkJcmMgPSBlMV9yZWNvbmZpZ19idHMoYnRzKTsKKworCQlpZiAocmMgPCAwKQorCQkJZXhpdCAoMSk7CisJfQorCisJLyogaW5pdGlhbGl6ZSBuYW5vQlRTIHN1cHBvcnQgb21jZSAqLworCXJjID0gaXBhY2Nlc3Nfc2V0dXAoYnNjX2dzbW5ldCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2JzY19ybGwuYyBiL29wZW5ic2Mvc3JjL2JzY19ybGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTRmNWFhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvYnNjX3JsbC5jCkBAIC0wLDAgKzEsMTIyIEBACisvKiBHU00gQlNDIFJhZGlvIExpbmsgTGF5ZXIgQVBJCisgKiAzR1BQIFRTIDA4LjU4IHZlcnNpb24gOC42LjAgUmVsZWFzZSAxOTk5IC8gRVRTSSBUUyAxMDAgNTk2IFY4LjYuMCAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90aW1lci5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYnNjX3JsbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2NoYW5fYWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisKK3N0cnVjdCBic2NfcmxsX3JlcSB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCXVfaW50OF90IGxpbmtfaWQ7CisKKwl2b2lkICgqY2IpKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsaW5rX2lkLAorCQkgICB2b2lkICpkYXRhLCBlbnVtIGJzY19ybGxyX2luZCk7CisJdm9pZCAqZGF0YTsKK307CisKKy8qIHdlIG9ubHkgY29tcGFyZSBDMSwgQzIgYW5kIFNBUEkgKi8KKyNkZWZpbmUgTElOS0lEX01BU0sJMHhDNworCitzdGF0aWMgTExJU1RfSEVBRChic2NfcmxsX3JlcXMpOworCitzdGF0aWMgdm9pZCBjb21wbGV0ZV9ybGxyKHN0cnVjdCBic2NfcmxsX3JlcSAqcmxsciwgZW51bSBic2Nfcmxscl9pbmQgdHlwZSkKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubjsKKworCWNvbm4gPSAmcmxsci0+bGNoYW4tPmNvbm47CisJbGxpc3RfZGVsKCZybGxyLT5saXN0KTsKKwlwdXRfc3Vic2NyX2Nvbihjb25uKTsKKwlybGxyLT5jYihybGxyLT5sY2hhbiwgcmxsci0+bGlua19pZCwgcmxsci0+ZGF0YSwgdHlwZSk7CisJdGFsbG9jX2ZyZWUocmxscik7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVyX2NiKHZvaWQgKl9ybGxyKQoreworCXN0cnVjdCBic2NfcmxsX3JlcSAqcmxsciA9IF9ybGxyOworCisJY29tcGxldGVfcmxscihybGxyLCBCU0NfUkxMUl9JTkRfVElNRU9VVCk7Cit9CisKKy8qIGVzdGFibGlzaCBhIFJMTCBjb25uZWN0aW9uIHdpdGggZ2l2ZW4gU0FQSSAvIHByaW9yaXR5ICovCitpbnQgcmxsX2VzdGFibGlzaChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3Qgc2FwaSwKKwkJICB2b2lkICgqY2IpKHN0cnVjdCBnc21fbGNoYW4gKiwgdV9pbnQ4X3QsIHZvaWQgKiwKKwkJCSAgICAgZW51bSBic2Nfcmxscl9pbmQpLAorCQkgIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm47CisJc3RydWN0IGJzY19ybGxfcmVxICpybGxyID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgYnNjX3JsbF9yZXEpOworCXVfaW50OF90IGxpbmtfaWQ7CisJaWYgKCFybGxyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxpbmtfaWQgPSBzYXBpOworCisJLyogSWYgd2UgYXJlIGEgVENIIGFuZCBub3QgaW4gc2lnbmFsbGluZyBtb2RlLCB3ZSBuZWVkIHRvCisJICogaW5kaWNhdGUgdGhhdCB0aGUgbmV3IFJMTCBjb25uZWN0aW9uIGlzIHRvIGJlIG1hZGUgb24gdGhlIFNBQ0NIICovCisJaWYgKChsY2hhbi0+dHlwZSA9PSBHU01fTENIQU5fVENIX0YgfHwKKwkgICAgIGxjaGFuLT50eXBlID09IEdTTV9MQ0hBTl9UQ0hfSCkgJiYgc2FwaSAhPSAwKQorCQlsaW5rX2lkIHw9IDB4NDA7CisKKwljb25uID0gJmxjaGFuLT5jb25uOworCXVzZV9zdWJzY3JfY29uKGNvbm4pOworCXJsbHItPmxjaGFuID0gbGNoYW47CisJcmxsci0+bGlua19pZCA9IGxpbmtfaWQ7CisJcmxsci0+Y2IgPSBjYjsKKwlybGxyLT5kYXRhID0gZGF0YTsKKworCWxsaXN0X2FkZCgmcmxsci0+bGlzdCwgJmJzY19ybGxfcmVxcyk7CisKKwlybGxyLT50aW1lci5jYiA9ICZ0aW1lcl9jYjsKKwlybGxyLT50aW1lci5kYXRhID0gcmxscjsKKworCWJzY19zY2hlZHVsZV90aW1lcigmcmxsci0+dGltZXIsIDEwLCAwKTsKKworCS8qIHNlbmQgdGhlIFJTTCBSTEwgRVNUYWJsaXNoIFJFUXVlc3QgKi8KKwlyZXR1cm4gcnNsX2VzdGFibGlzaF9yZXF1ZXN0KHJsbHItPmxjaGFuLCBybGxyLT5saW5rX2lkKTsKK30KKworLyogQ2FsbGVkIGZyb20gUlNMIGNvZGUgaW4gY2FzZSB3ZSBoYXZlIHJlY2VpdmVkIGFuIGluZGljYXRpb24gcmVnYXJkaW5nCisgKiBhbnkgUkxMIGxpbmsgKi8KK3ZvaWQgcmxsX2luZGljYXRpb24oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxpbmtfaWQsIHVfaW50OF90IHR5cGUpCit7CisJc3RydWN0IGJzY19ybGxfcmVxICpybGxyLCAqcmxscjI7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJsbHIsIHJsbHIyLCAmYnNjX3JsbF9yZXFzLCBsaXN0KSB7CisJCWlmIChybGxyLT5sY2hhbiA9PSBsY2hhbiAmJgorCQkgICAgKHJsbHItPmxpbmtfaWQgJiBMSU5LSURfTUFTSykgPT0gKGxpbmtfaWQgJiBMSU5LSURfTUFTSykpIHsKKwkJCWJzY19kZWxfdGltZXIoJnJsbHItPnRpbWVyKTsKKwkJCWNvbXBsZXRlX3JsbHIocmxsciwgdHlwZSk7CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ic2NfdmVyc2lvbi5jIGIvb3BlbmJzYy9zcmMvYnNjX3ZlcnNpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzJlNjNiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvYnNjX3ZlcnNpb24uYwpAQCAtMCwwICsxLDMxIEBACisvKiBIb2xkIHRoZSBjb3B5cmlnaHQgYW5kIHZlcnNpb24gc3RyaW5nICovCisvKiAoQykgMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlICJic2Njb25maWcuaCIKKworY29uc3QgY2hhciAqb3BlbmJzY19jb3B5cmlnaHQgPQorCSJDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBIYXJhbGQgV2VsdGUsIEhvbGdlciBGcmV5dGhlclxuIgorCSJDb250cmlidXRpb25zIGJ5IERhbmllbCBXaWxsbWFubiwgSmFuIEzDvGJiZSxTdGVmYW4gU2NobWlkdFxuIgorCSJEaWV0ZXIgU3BhYXIsIEFuZHJlYXMgRXZlcnNiZXJnXG5cbiIKKwkiTGljZW5zZSBHUEx2Mis6IEdOVSBHUEwgdmVyc2lvbiAyIG9yIGxhdGVyIDxodHRwOi8vZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbD5cbiIKKwkiVGhpcyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgYXJlIGZyZWUgdG8gY2hhbmdlIGFuZCByZWRpc3RyaWJ1dGUgaXQuXG4iCisJIlRoZXJlIGlzIE5PIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXcuXG4iOworCisKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2JzY192dHkuYyBiL29wZW5ic2Mvc3JjL2JzY192dHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDQ5YmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvYnNjX3Z0eS5jCkBAIC0wLDAgKzEsMjEzNyBAQAorLyogT3BlbkJTQyBpbnRlcmZhY2UgdG8gcXVhZ2dhIFZUWSAqLworLyogKEMpIDIwMDktMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9zbW9jb20vdnR5L2NvbW1hbmQuaD4KKyNpbmNsdWRlIDxvc21vY29tL3Z0eS9idWZmZXIuaD4KKyNpbmNsdWRlIDxvc21vY29tL3Z0eS92dHkuaD4KKyNpbmNsdWRlIDxvc21vY29tL3Z0eS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8b3Ntb2NvbS92dHkvdGVsbmV0X2ludGVyZmFjZS5oPgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9lMV9pbnB1dC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvY2hhbl9hbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWVhc19yZXAuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RiLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy92dHkuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfbnMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisKKyNpbmNsdWRlICIuLi9ic2Njb25maWcuaCIKKworLyogRklYTUU6IHRoaXMgc2hvdWxkIGdvIHRvIHNvbWUgY29tbW9uIGZpbGUgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGdwcnNfbnNfdGltZXJfc3Ryc1tdID0geworCXsgMCwgInRucy1ibG9jayIgfSwKKwl7IDEsICJ0bnMtYmxvY2stcmV0cmllcyIgfSwKKwl7IDIsICJ0bnMtcmVzZXQiIH0sCisJeyAzLCAidG5zLXJlc2V0LXJldHJpZXMiIH0sCisJeyA0LCAidG5zLXRlc3QiIH0sCisJeyA1LCAidG5zLWFsaXZlIiB9LAorCXsgNiwgInRucy1hbGl2ZS1yZXRyaWVzIiB9LAorCXsgMCwgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBncHJzX2Jzc2dwX2NmZ19zdHJzW10gPSB7CisJeyAwLAkiYmxvY2tpbmctdGltZXIiIH0sCisJeyAxLAkiYmxvY2tpbmctcmV0cmllcyIgfSwKKwl7IDIsCSJ1bmJsb2NraW5nLXJldHJpZXMiIH0sCisJeyAzLAkicmVzZXQtdGltZXIiIH0sCisJeyA0LAkicmVzZXQtcmV0cmllcyIgfSwKKwl7IDUsCSJzdXNwZW5kLXRpbWVyIiB9LAorCXsgNiwJInN1c3BlbmQtcmV0cmllcyIgfSwKKwl7IDcsCSJyZXN1bWUtdGltZXIiIH0sCisJeyA4LAkicmVzdW1lLXJldHJpZXMiIH0sCisJeyA5LAkiY2FwYWJpbGl0eS11cGRhdGUtdGltZXIiIH0sCisJeyAxMCwJImNhcGFiaWxpdHktdXBkYXRlLXJldHJpZXMiIH0sCisJeyAwLAlOVUxMIH0KK307CisKK3N0cnVjdCBjbWRfbm9kZSBuZXRfbm9kZSA9IHsKKwlHU01ORVRfTk9ERSwKKwkiJXMobmV0d29yaykjIiwKKwkxLAorfTsKKworc3RydWN0IGNtZF9ub2RlIGJ0c19ub2RlID0geworCUJUU19OT0RFLAorCSIlcyhidHMpIyIsCisJMSwKK307CisKK3N0cnVjdCBjbWRfbm9kZSB0cnhfbm9kZSA9IHsKKwlUUlhfTk9ERSwKKwkiJXModHJ4KSMiLAorCTEsCit9OworCitzdHJ1Y3QgY21kX25vZGUgdHNfbm9kZSA9IHsKKwlUU19OT0RFLAorCSIlcyh0cykjIiwKKwkxLAorfTsKKworc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXRfZnJvbV92dHkoc3RydWN0IHZ0eSAqdikKK3sKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm4gPSB2LT5wcml2OworCXJldHVybiAoc3RydWN0IGdzbV9uZXR3b3JrICopIGNvbm4tPnByaXY7Cit9CisKK3N0YXRpYyBpbnQgZHVtbXlfY29uZmlnX3dyaXRlKHN0cnVjdCB2dHkgKnYpCit7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBuZXRfZHVtcF9ubXN0YXRlKHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9ubV9zdGF0ZSAqbm1zKQoreworCXZ0eV9vdXQodnR5LCJPcGVyICclcycsIEFkbWluICV1LCBBdmFpbCAnJXMnJXMiLAorCQlubV9vcHN0YXRlX25hbWUobm1zLT5vcGVyYXRpb25hbCksIG5tcy0+YWRtaW5pc3RyYXRpdmUsCisJCW5tX2F2YWlsX25hbWUobm1zLT5hdmFpbGFiaWxpdHkpLCBWVFlfTkVXTElORSk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfcGNoYW5fbG9hZF92dHkoc3RydWN0IHZ0eSAqdnR5LCBjaGFyICpwcmVmaXgsCisJCQkJY29uc3Qgc3RydWN0IHBjaGFuX2xvYWQgKnBsKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGwtPnBjaGFuKTsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBsb2FkX2NvdW50ZXIgKmxjID0gJnBsLT5wY2hhbltpXTsKKwkJdW5zaWduZWQgaW50IHBlcmNlbnQ7CisKKwkJaWYgKGxjLT50b3RhbCA9PSAwKQorCQkJY29udGludWU7CisKKwkJcGVyY2VudCA9IChsYy0+dXNlZCAqIDEwMCkgLyBsYy0+dG90YWw7CisKKwkJdnR5X291dCh2dHksICIlcyUyMHM6ICUzdSUlICgldS8ldSklcyIsIHByZWZpeCwKKwkJCWdzbV9wY2hhbl9uYW1lKGkpLCBwZXJjZW50LCBsYy0+dXNlZCwgbGMtPnRvdGFsLAorCQkJVlRZX05FV0xJTkUpOworCX0KK30KKworc3RhdGljIHZvaWQgbmV0X2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpCit7CisJc3RydWN0IHBjaGFuX2xvYWQgcGw7CisKKwl2dHlfb3V0KHZ0eSwgIkJTQyBpcyBvbiBDb3VudHJ5IENvZGUgJXUsIE5ldHdvcmsgQ29kZSAldSAiCisJCSJhbmQgaGFzICV1IEJUUyVzIiwgbmV0LT5jb3VudHJ5X2NvZGUsIG5ldC0+bmV0d29ya19jb2RlLAorCQluZXQtPm51bV9idHMsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgTG9uZyBuZXR3b3JrIG5hbWU6ICclcyclcyIsCisJCW5ldC0+bmFtZV9sb25nLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIFNob3J0IG5ldHdvcmsgbmFtZTogJyVzJyVzIiwKKwkJbmV0LT5uYW1lX3Nob3J0LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIEF1dGhlbnRpY2F0aW9uIHBvbGljeTogJXMlcyIsCisJCWdzbV9hdXRoX3BvbGljeV9uYW1lKG5ldC0+YXV0aF9wb2xpY3kpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIExvY2F0aW9uIHVwZGF0aW5nIHJlamVjdCBjYXVzZTogJXUlcyIsCisJCW5ldC0+cmVqZWN0X2NhdXNlLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIEVuY3J5cHRpb246IEE1LyV1JXMiLCBuZXQtPmE1X2VuY3J5cHRpb24sCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgTkVDSSAoVENIL0gpOiAldSVzIiwgbmV0LT5uZWNpLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIFJSTFAgTW9kZTogJXMlcyIsIHJybHBfbW9kZV9uYW1lKG5ldC0+cnJscC5tb2RlKSwKKwkJVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBNTSBJbmZvOiAlcyVzIiwgbmV0LT5zZW5kX21tX2luZm8gPyAiT24iIDogIk9mZiIsCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgSGFuZG92ZXI6ICVzJXMiLCBuZXQtPmhhbmRvdmVyLmFjdGl2ZSA/ICJPbiIgOiAiT2ZmIiwKKwkJVlRZX05FV0xJTkUpOworCW5ldHdvcmtfY2hhbl9sb2FkKCZwbCwgbmV0KTsKKwl2dHlfb3V0KHZ0eSwgIiAgQ3VycmVudCBDaGFubmVsIExvYWQ6JXMiLCBWVFlfTkVXTElORSk7CisJZHVtcF9wY2hhbl9sb2FkX3Z0eSh2dHksICIgICAgIiwgJnBsKTsKK30KKworREVGVU4oc2hvd19uZXQsIHNob3dfbmV0X2NtZCwgInNob3cgbmV0d29yayIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBHU00gTkVUV09SS1xuIikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGdzbW5ldF9mcm9tX3Z0eSh2dHkpOworCW5ldF9kdW1wX3Z0eSh2dHksIG5ldCk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIGUxaXNsX2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGUxaW5wX3NpZ25fbGluayAqZTFsKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCisJaWYgKCFlMWwpIHsKKwkJdnR5X291dCh2dHksICIgICBOb25lJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybjsKKwl9CisKKwlsaW5lID0gZTFsLT50cy0+bGluZTsKKworCXZ0eV9vdXQodnR5LCAiICAgIEUxIExpbmUgJXUsIFR5cGUgJXM6IFRpbWVzbG90ICV1LCBNb2RlICVzJXMiLAorCQlsaW5lLT5udW0sIGxpbmUtPmRyaXZlci0+bmFtZSwgZTFsLT50cy0+bnVtLAorCQllMWlucF9zaWdudHlwZV9uYW1lKGUxbC0+dHlwZSksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgICBFMSBURUkgJXUsIFNBUEkgJXUlcyIsCisJCWUxbC0+dGVpLCBlMWwtPnNhcGksIFZUWV9ORVdMSU5FKTsKK30KKworc3RhdGljIHZvaWQgYnRzX2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgcGNoYW5fbG9hZCBwbDsKKworCXZ0eV9vdXQodnR5LCAiQlRTICV1IGlzIG9mICVzIHR5cGUgaW4gYmFuZCAlcywgaGFzIENJICV1IExBQyAldSwgIgorCQkiQlNJQyAldSwgVFNDICV1IGFuZCAldSBUUlglcyIsCisJCWJ0cy0+bnIsIGJ0c3R5cGUyc3RyKGJ0cy0+dHlwZSksIGdzbV9iYW5kX25hbWUoYnRzLT5iYW5kKSwKKwkJYnRzLT5jZWxsX2lkZW50aXR5LAorCQlidHMtPmxvY2F0aW9uX2FyZWFfY29kZSwgYnRzLT5ic2ljLCBidHMtPnRzYywKKwkJYnRzLT5udW1fdHJ4LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJEZXNjcmlwdGlvbjogJXMlcyIsCisJCWJ0cy0+ZGVzY3JpcHRpb24gPyBidHMtPmRlc2NyaXB0aW9uIDogIihudWxsKSIsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIk1TIE1heCBwb3dlcjogJXUgZEJtJXMiLCBidHMtPm1zX21heF9wb3dlciwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiTWluaW11bSBSeCBMZXZlbCBmb3IgQWNjZXNzOiAlaSBkQm0lcyIsCisJCXJ4bGV2MmRibShidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIucnhsZXZfYWNjX21pbiksCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIkNlbGwgUmVzZWxlY3Rpb24gSHlzdGVyZXNpczogJXUgZEJtJXMiLAorCQlidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIuY2VsbF9yZXNlbF9oeXN0KjIsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIlJBQ0ggVFgtSW50ZWdlcjogJXUlcyIsIGJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC50eF9pbnRlZ2VyLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJSQUNIIE1heCB0cmFuc21pc3Npb25zOiAldSVzIiwKKwkJcmFjaF9tYXhfdHJhbnNfcmF3MnZhbChidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wubWF4X3RyYW5zKSwKKwkJVlRZX05FV0xJTkUpOworCWlmIChidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wuY2VsbF9iYXIpCisJCXZ0eV9vdXQodnR5LCAiICBDRUxMIElTIEJBUlJFRCVzIiwgVlRZX05FV0xJTkUpOworCWlmIChpc19pcGFjY2Vzc19idHMoYnRzKSkKKwkJdnR5X291dCh2dHksICIgIFVuaXQgSUQ6ICV1LyV1LzAsIE9NTCBTdHJlYW0gSUQgMHglMDJ4JXMiLAorCQkJYnRzLT5pcF9hY2Nlc3Muc2l0ZV9pZCwgYnRzLT5pcF9hY2Nlc3MuYnRzX2lkLAorCQkJYnRzLT5vbWxfdGVpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIE5NIFN0YXRlOiAiKTsKKwluZXRfZHVtcF9ubXN0YXRlKHZ0eSwgJmJ0cy0+bm1fc3RhdGUpOworCXZ0eV9vdXQodnR5LCAiICBTaXRlIE1nciBOTSBTdGF0ZTogIik7CisJbmV0X2R1bXBfbm1zdGF0ZSh2dHksICZidHMtPnNpdGVfbWdyLm5tX3N0YXRlKTsKKwl2dHlfb3V0KHZ0eSwgIiAgUGFnaW5nOiBGSVhNRSBwZW5kaW5nIHJlcXVlc3RzLCAldSBmcmVlIHNsb3RzJXMiLAorCQlidHMtPnBhZ2luZy5hdmFpbGFibGVfc2xvdHMsIFZUWV9ORVdMSU5FKTsKKwlpZiAoIWlzX2lwYWNjZXNzX2J0cyhidHMpKSB7CisJCXZ0eV9vdXQodnR5LCAiICBFMSBTaWduYWxsaW5nIExpbms6JXMiLCBWVFlfTkVXTElORSk7CisJCWUxaXNsX2R1bXBfdnR5KHZ0eSwgYnRzLT5vbWxfbGluayk7CisJfQorCS8qIEZJWE1FOiBvbWxfbGluaywgY2hhbl9kZXNjICovCisJbWVtc2V0KCZwbCwgMCwgc2l6ZW9mKHBsKSk7CisJYnRzX2NoYW5fbG9hZCgmcGwsIGJ0cyk7CisJdnR5X291dCh2dHksICIgIEN1cnJlbnQgQ2hhbm5lbCBMb2FkOiVzIiwgVlRZX05FV0xJTkUpOworCWR1bXBfcGNoYW5fbG9hZF92dHkodnR5LCAiICAgICIsICZwbCk7Cit9CisKK0RFRlVOKHNob3dfYnRzLCBzaG93X2J0c19jbWQsICJzaG93IGJ0cyBbbnVtYmVyXSIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBCVFNcbiIKKwkJIkJUUyBudW1iZXIiKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gZ3NtbmV0X2Zyb21fdnR5KHZ0eSk7CisJaW50IGJ0c19ucjsKKworCWlmIChhcmdjICE9IDApIHsKKwkJLyogdXNlIHRoZSBCVFMgbnVtYmVyIHRoYXQgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCAqLworCQlidHNfbnIgPSBhdG9pKGFyZ3ZbMF0pOworCQlpZiAoYnRzX25yID4gbmV0LT5udW1fYnRzKSB7CisJCQl2dHlfb3V0KHZ0eSwgIiUlIGNhbid0IGZpbmQgQlRTICclcyclcyIsIGFyZ3ZbMF0sCisJCQkJVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCWJ0c19kdW1wX3Z0eSh2dHksIGdzbV9idHNfbnVtKG5ldCwgYnRzX25yKSk7CisJCXJldHVybiBDTURfU1VDQ0VTUzsKKwl9CisJLyogcHJpbnQgYWxsIEJUUydzICovCisJZm9yIChidHNfbnIgPSAwOyBidHNfbnIgPCBuZXQtPm51bV9idHM7IGJ0c19ucisrKQorCQlidHNfZHVtcF92dHkodnR5LCBnc21fYnRzX251bShuZXQsIGJ0c19ucikpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiB1dGlsaXR5IGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgcGFyc2VfZTFfbGluayhzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKmUxX2xpbmssIGNvbnN0IGNoYXIgKmxpbmUsCisJCQkgIGNvbnN0IGNoYXIgKnRzLCBjb25zdCBjaGFyICpzcykKK3sKKwllMV9saW5rLT5lMV9uciA9IGF0b2kobGluZSk7CisJZTFfbGluay0+ZTFfdHMgPSBhdG9pKHRzKTsKKwlpZiAoIXN0cmNtcChzcywgImZ1bGwiKSkKKwkJZTFfbGluay0+ZTFfdHNfc3MgPSAyNTU7CisJZWxzZQorCQllMV9saW5rLT5lMV90c19zcyA9IGF0b2koc3MpOworfQorCitzdGF0aWMgdm9pZCBjb25maWdfd3JpdGVfZTFfbGluayhzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqZTFfbGluaywKKwkJCQkgY29uc3QgY2hhciAqcHJlZml4KQoreworCWlmICghZTFfbGluay0+ZTFfdHMpCisJCXJldHVybjsKKworCWlmIChlMV9saW5rLT5lMV90c19zcyA9PSAyNTUpCisJCXZ0eV9vdXQodnR5LCAiJXNlMSBsaW5lICV1IHRpbWVzbG90ICV1IHN1Yi1zbG90IGZ1bGwlcyIsCisJCQlwcmVmaXgsIGUxX2xpbmstPmUxX25yLCBlMV9saW5rLT5lMV90cywgVlRZX05FV0xJTkUpOworCWVsc2UKKwkJdnR5X291dCh2dHksICIlc2UxIGxpbmUgJXUgdGltZXNsb3QgJXUgc3ViLXNsb3QgJXUlcyIsCisJCQlwcmVmaXgsIGUxX2xpbmstPmUxX25yLCBlMV9saW5rLT5lMV90cywKKwkJCWUxX2xpbmstPmUxX3RzX3NzLCBWVFlfTkVXTElORSk7Cit9CisKKworc3RhdGljIHZvaWQgY29uZmlnX3dyaXRlX3RzX3NpbmdsZShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMpCit7CisJdnR5X291dCh2dHksICIgICAgdGltZXNsb3QgJXUlcyIsIHRzLT5uciwgVlRZX05FV0xJTkUpOworCWlmICh0cy0+cGNoYW4gIT0gR1NNX1BDSEFOX05PTkUpCisJCXZ0eV9vdXQodnR5LCAiICAgICBwaHlzX2NoYW5fY29uZmlnICVzJXMiLAorCQkJZ3NtX3BjaGFuX25hbWUodHMtPnBjaGFuKSwgVlRZX05FV0xJTkUpOworCWNvbmZpZ193cml0ZV9lMV9saW5rKHZ0eSwgJnRzLT5lMV9saW5rLCAiICAgICAiKTsKK30KKworc3RhdGljIHZvaWQgY29uZmlnX3dyaXRlX3RyeF9zaW5nbGUoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlpbnQgaTsKKworCXZ0eV9vdXQodnR5LCAiICB0cnggJXUlcyIsIHRyeC0+bnIsIFZUWV9ORVdMSU5FKTsKKwlpZiAodHJ4LT5kZXNjcmlwdGlvbikKKwkJdnR5X291dCh2dHksICIgICBkZXNjcmlwdGlvbiAlcyVzIiwgdHJ4LT5kZXNjcmlwdGlvbiwKKwkJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgIHJmX2xvY2tlZCAldSVzIiwKKwkJdHJ4LT5ubV9zdGF0ZS5hZG1pbmlzdHJhdGl2ZSA9PSBOTV9TVEFURV9MT0NLRUQgPyAxIDogMCwKKwkJVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICAgYXJmY24gJXUlcyIsIHRyeC0+YXJmY24sIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgIG5vbWluYWwgcG93ZXIgJXUlcyIsIHRyeC0+bm9taW5hbF9wb3dlciwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICAgbWF4X3Bvd2VyX3JlZCAldSVzIiwgdHJ4LT5tYXhfcG93ZXJfcmVkLCBWVFlfTkVXTElORSk7CisJY29uZmlnX3dyaXRlX2UxX2xpbmsodnR5LCAmdHJ4LT5yc2xfZTFfbGluaywgIiAgIHJzbCAiKTsKKwl2dHlfb3V0KHZ0eSwgIiAgIHJzbCBlMSB0ZWkgJXUlcyIsIHRyeC0+cnNsX3RlaSwgVlRZX05FV0xJTkUpOworCisJZm9yIChpID0gMDsgaSA8IFRSWF9OUl9UUzsgaSsrKQorCQljb25maWdfd3JpdGVfdHNfc2luZ2xlKHZ0eSwgJnRyeC0+dHNbaV0pOworfQorCitzdGF0aWMgdm9pZCBjb25maWdfd3JpdGVfYnRzX2dwcnMoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXVuc2lnbmVkIGludCBpOworCXZ0eV9vdXQodnR5LCAiICBncHJzIG1vZGUgJXMlcyIsIGJ0c19ncHJzX21vZGVfbmFtZShidHMtPmdwcnMubW9kZSksCisJCVZUWV9ORVdMSU5FKTsKKwlpZiAoYnRzLT5ncHJzLm1vZGUgPT0gQlRTX0dQUlNfTk9ORSkKKwkJcmV0dXJuOworCisJdnR5X291dCh2dHksICIgIGdwcnMgcm91dGluZyBhcmVhICV1JXMiLCBidHMtPmdwcnMucmFjLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIGdwcnMgY2VsbCBidmNpICV1JXMiLCBidHMtPmdwcnMuY2VsbC5idmNpLAorCQlWVFlfTkVXTElORSk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYnRzLT5ncHJzLmNlbGwudGltZXIpOyBpKyspCisJCXZ0eV9vdXQodnR5LCAiICBncHJzIGNlbGwgdGltZXIgJXMgJXUlcyIsCisJCQlnZXRfdmFsdWVfc3RyaW5nKGdwcnNfYnNzZ3BfY2ZnX3N0cnMsIGkpLAorCQkJYnRzLT5ncHJzLmNlbGwudGltZXJbaV0sIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgZ3BycyBuc2VpICV1JXMiLCBidHMtPmdwcnMubnNlLm5zZWksCisJCVZUWV9ORVdMSU5FKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidHMtPmdwcnMubnNlLnRpbWVyKTsgaSsrKQorCQl2dHlfb3V0KHZ0eSwgIiAgZ3BycyBucyB0aW1lciAlcyAldSVzIiwKKwkJCWdldF92YWx1ZV9zdHJpbmcoZ3Byc19uc190aW1lcl9zdHJzLCBpKSwKKwkJCWJ0cy0+Z3Bycy5uc2UudGltZXJbaV0sIFZUWV9ORVdMSU5FKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidHMtPmdwcnMubnN2Yyk7IGkrKykgeworCQlzdHJ1Y3QgZ3NtX2J0c19ncHJzX25zdmMgKm5zdmMgPQorCQkJCQkmYnRzLT5ncHJzLm5zdmNbaV07CisJCXN0cnVjdCBpbl9hZGRyIGlhOworCisJCWlhLnNfYWRkciA9IGh0b25sKG5zdmMtPnJlbW90ZV9pcCk7CisJCXZ0eV9vdXQodnR5LCAiICBncHJzIG5zdmMgJXUgbnN2Y2kgJXUlcyIsIGksCisJCQluc3ZjLT5uc3ZjaSwgVlRZX05FV0xJTkUpOworCQl2dHlfb3V0KHZ0eSwgIiAgZ3BycyBuc3ZjICV1IGxvY2FsIHVkcCBwb3J0ICV1JXMiLCBpLAorCQkJbnN2Yy0+bG9jYWxfcG9ydCwgVlRZX05FV0xJTkUpOworCQl2dHlfb3V0KHZ0eSwgIiAgZ3BycyBuc3ZjICV1IHJlbW90ZSB1ZHAgcG9ydCAldSVzIiwgaSwKKwkJCW5zdmMtPnJlbW90ZV9wb3J0LCBWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAiICBncHJzIG5zdmMgJXUgcmVtb3RlIGlwICVzJXMiLCBpLAorCQkJaW5ldF9udG9hKGlhKSwgVlRZX05FV0xJTkUpOworCX0KK30KKworc3RhdGljIHZvaWQgY29uZmlnX3dyaXRlX2J0c19zaW5nbGUoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCisJdnR5X291dCh2dHksICIgYnRzICV1JXMiLCBidHMtPm5yLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIHR5cGUgJXMlcyIsIGJ0c3R5cGUyc3RyKGJ0cy0+dHlwZSksIFZUWV9ORVdMSU5FKTsKKwlpZiAoYnRzLT5kZXNjcmlwdGlvbikKKwkJdnR5X291dCh2dHksICIgIGRlc2NyaXB0aW9uICVzJXMiLCBidHMtPmRlc2NyaXB0aW9uLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIGJhbmQgJXMlcyIsIGdzbV9iYW5kX25hbWUoYnRzLT5iYW5kKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBjZWxsX2lkZW50aXR5ICV1JXMiLCBidHMtPmNlbGxfaWRlbnRpdHksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgbG9jYXRpb25fYXJlYV9jb2RlICV1JXMiLCBidHMtPmxvY2F0aW9uX2FyZWFfY29kZSwKKwkJVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICB0cmFpbmluZ19zZXF1ZW5jZV9jb2RlICV1JXMiLCBidHMtPnRzYywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBiYXNlX3N0YXRpb25faWRfY29kZSAldSVzIiwgYnRzLT5ic2ljLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIG1zIG1heCBwb3dlciAldSVzIiwgYnRzLT5tc19tYXhfcG93ZXIsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgY2VsbCByZXNlbGVjdGlvbiBoeXN0ZXJlc2lzICV1JXMiLAorCQlidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIuY2VsbF9yZXNlbF9oeXN0KjIsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgcnhsZXYgYWNjZXNzIG1pbiAldSVzIiwKKwkJYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyLnJ4bGV2X2FjY19taW4sIFZUWV9ORVdMSU5FKTsKKwlpZiAoYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLnQzMjEyKQorCQl2dHlfb3V0KHZ0eSwgIiAgcGVyaW9kaWMgbG9jYXRpb24gdXBkYXRlICV1JXMiLAorCQkJYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLnQzMjEyICogMTAsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgY2hhbm5lbCBhbGxvY2F0b3IgJXMlcyIsCisJCWJ0cy0+Y2hhbl9hbGxvY19yZXZlcnNlID8gImRlc2NlbmRpbmciIDogImFzY2VuZGluZyIsCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgcmFjaCB0eCBpbnRlZ2VyICV1JXMiLAorCQlidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wudHhfaW50ZWdlciwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICByYWNoIG1heCB0cmFuc21pc3Npb24gJXUlcyIsCisJCXJhY2hfbWF4X3RyYW5zX3JhdzJ2YWwoYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLm1heF90cmFucyksCisJCVZUWV9ORVdMSU5FKTsKKworCWlmIChidHMtPnJhY2hfYl90aHJlc2ggIT0gLTEpCisJCXZ0eV9vdXQodnR5LCAiICByYWNoIG5tIGJ1c3kgdGhyZXNob2xkICV1JXMiLAorCQkJYnRzLT5yYWNoX2JfdGhyZXNoLCBWVFlfTkVXTElORSk7CisJaWYgKGJ0cy0+cmFjaF9sZGF2Z19zbG90cyAhPSAtMSkKKwkJdnR5X291dCh2dHksICIgIHJhY2ggbm0gbG9hZCBhdmVyYWdlICV1JXMiLAorCQkJYnRzLT5yYWNoX2xkYXZnX3Nsb3RzLCBWVFlfTkVXTElORSk7CisJaWYgKGJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC5jZWxsX2JhcikKKwkJdnR5X291dCh2dHksICIgIGNlbGwgYmFycmVkIDElcyIsIFZUWV9ORVdMSU5FKTsKKwlpZiAoKGJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC50MiAmIDB4NCkgPT0gMCkKKwkJdnR5X291dCh2dHksICIgIHJhY2ggZW1lcmdlbmN5IGNhbGwgYWxsb3dlZCAxJXMiLCBWVFlfTkVXTElORSk7CisJaWYgKGlzX2lwYWNjZXNzX2J0cyhidHMpKSB7CisJCXZ0eV9vdXQodnR5LCAiICBpcC5hY2Nlc3MgdW5pdF9pZCAldSAldSVzIiwKKwkJCWJ0cy0+aXBfYWNjZXNzLnNpdGVfaWQsIGJ0cy0+aXBfYWNjZXNzLmJ0c19pZCwgVlRZX05FV0xJTkUpOworCQl2dHlfb3V0KHZ0eSwgIiAgb21sIGlwLmFjY2VzcyBzdHJlYW1faWQgJXUlcyIsIGJ0cy0+b21sX3RlaSwgVlRZX05FV0xJTkUpOworCX0gZWxzZSB7CisJCWNvbmZpZ193cml0ZV9lMV9saW5rKHZ0eSwgJmJ0cy0+b21sX2UxX2xpbmssICIgIG9tbCAiKTsKKwkJdnR5X291dCh2dHksICIgIG9tbCBlMSB0ZWkgJXUlcyIsIGJ0cy0+b21sX3RlaSwgVlRZX05FV0xJTkUpOworCX0KKwljb25maWdfd3JpdGVfYnRzX2dwcnModnR5LCBidHMpOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJ4LCAmYnRzLT50cnhfbGlzdCwgbGlzdCkKKwkJY29uZmlnX3dyaXRlX3RyeF9zaW5nbGUodnR5LCB0cngpOworfQorCitzdGF0aWMgaW50IGNvbmZpZ193cml0ZV9idHMoc3RydWN0IHZ0eSAqdikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCA9IGdzbW5ldF9mcm9tX3Z0eSh2KTsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoYnRzLCAmZ3NtbmV0LT5idHNfbGlzdCwgbGlzdCkKKwkJY29uZmlnX3dyaXRlX2J0c19zaW5nbGUodiwgYnRzKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBjb25maWdfd3JpdGVfbmV0KHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCA9IGdzbW5ldF9mcm9tX3Z0eSh2dHkpOworCisJdnR5X291dCh2dHksICJuZXR3b3JrJXMiLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgbmV0d29yayBjb3VudHJ5IGNvZGUgJXUlcyIsIGdzbW5ldC0+Y291bnRyeV9jb2RlLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgbW9iaWxlIG5ldHdvcmsgY29kZSAldSVzIiwgZ3NtbmV0LT5uZXR3b3JrX2NvZGUsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBzaG9ydCBuYW1lICVzJXMiLCBnc21uZXQtPm5hbWVfc2hvcnQsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBsb25nIG5hbWUgJXMlcyIsIGdzbW5ldC0+bmFtZV9sb25nLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgYXV0aCBwb2xpY3kgJXMlcyIsIGdzbV9hdXRoX3BvbGljeV9uYW1lKGdzbW5ldC0+YXV0aF9wb2xpY3kpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgbG9jYXRpb24gdXBkYXRpbmcgcmVqZWN0IGNhdXNlICV1JXMiLAorCQlnc21uZXQtPnJlamVjdF9jYXVzZSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIGVuY3J5cHRpb24gYTUgJXUlcyIsIGdzbW5ldC0+YTVfZW5jcnlwdGlvbiwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIG5lY2kgJXUlcyIsIGdzbW5ldC0+bmVjaSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIHJybHAgbW9kZSAlcyVzIiwgcnJscF9tb2RlX25hbWUoZ3NtbmV0LT5ycmxwLm1vZGUpLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgbW0gaW5mbyAldSVzIiwgZ3NtbmV0LT5zZW5kX21tX2luZm8sIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBoYW5kb3ZlciAldSVzIiwgZ3NtbmV0LT5oYW5kb3Zlci5hY3RpdmUsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBoYW5kb3ZlciB3aW5kb3cgcnhsZXYgYXZlcmFnaW5nICV1JXMiLAorCQlnc21uZXQtPmhhbmRvdmVyLndpbl9yeGxldl9hdmcsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBoYW5kb3ZlciB3aW5kb3cgcnhxdWFsIGF2ZXJhZ2luZyAldSVzIiwKKwkJZ3NtbmV0LT5oYW5kb3Zlci53aW5fcnhxdWFsX2F2ZywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIGhhbmRvdmVyIHdpbmRvdyByeGxldiBuZWlnaGJvciBhdmVyYWdpbmcgJXUlcyIsCisJCWdzbW5ldC0+aGFuZG92ZXIud2luX3J4bGV2X2F2Z19uZWlnaCwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIGhhbmRvdmVyIHBvd2VyIGJ1ZGdldCBpbnRlcnZhbCAldSVzIiwKKwkJZ3NtbmV0LT5oYW5kb3Zlci5wd3JfaW50ZXJ2YWwsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBoYW5kb3ZlciBwb3dlciBidWRnZXQgaHlzdGVyZXNpcyAldSVzIiwKKwkJZ3NtbmV0LT5oYW5kb3Zlci5wd3JfaHlzdGVyZXNpcywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIGhhbmRvdmVyIG1heGltdW0gZGlzdGFuY2UgJXUlcyIsCisJCWdzbW5ldC0+aGFuZG92ZXIubWF4X2Rpc3RhbmNlLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgdGltZXIgdDMxMDEgJXUlcyIsIGdzbW5ldC0+VDMxMDEsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiB0aW1lciB0MzEwMyAldSVzIiwgZ3NtbmV0LT5UMzEwMywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIHRpbWVyIHQzMTA1ICV1JXMiLCBnc21uZXQtPlQzMTA1LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgdGltZXIgdDMxMDcgJXUlcyIsIGdzbW5ldC0+VDMxMDcsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiB0aW1lciB0MzEwOSAldSVzIiwgZ3NtbmV0LT5UMzEwOSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIHRpbWVyIHQzMTExICV1JXMiLCBnc21uZXQtPlQzMTExLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgdGltZXIgdDMxMTMgJXUlcyIsIGdzbW5ldC0+VDMxMTMsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiB0aW1lciB0MzExNSAldSVzIiwgZ3NtbmV0LT5UMzExNSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIHRpbWVyIHQzMTE3ICV1JXMiLCBnc21uZXQtPlQzMTE3LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgdGltZXIgdDMxMTkgJXUlcyIsIGdzbW5ldC0+VDMxMTksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiB0aW1lciB0MzE0MSAldSVzIiwgZ3NtbmV0LT5UMzE0MSwgVlRZX05FV0xJTkUpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCB0cnhfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwl2dHlfb3V0KHZ0eSwgIlRSWCAldSBvZiBCVFMgJXUgaXMgb24gQVJGQ04gJXUlcyIsCisJCXRyeC0+bnIsIHRyeC0+YnRzLT5uciwgdHJ4LT5hcmZjbiwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiRGVzY3JpcHRpb246ICVzJXMiLAorCQl0cngtPmRlc2NyaXB0aW9uID8gdHJ4LT5kZXNjcmlwdGlvbiA6ICIobnVsbCkiLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIFJGIE5vbWluYWwgUG93ZXI6ICVkIGRCbSwgcmVkdWNlZCBieSAldSBkQiwgIgorCQkicmVzdWx0aW5nIEJTIHBvd2VyOiAlZCBkQm0lcyIsCisJCXRyeC0+bm9taW5hbF9wb3dlciwgdHJ4LT5tYXhfcG93ZXJfcmVkLAorCQl0cngtPm5vbWluYWxfcG93ZXIgLSB0cngtPm1heF9wb3dlcl9yZWQsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgTk0gU3RhdGU6ICIpOworCW5ldF9kdW1wX25tc3RhdGUodnR5LCAmdHJ4LT5ubV9zdGF0ZSk7CisJdnR5X291dCh2dHksICIgIEJhc2ViYW5kIFRyYW5zY2VpdmVyIE5NIFN0YXRlOiAiKTsKKwluZXRfZHVtcF9ubXN0YXRlKHZ0eSwgJnRyeC0+YmJfdHJhbnNjLm5tX3N0YXRlKTsKKwlpZiAoaXNfaXBhY2Nlc3NfYnRzKHRyeC0+YnRzKSkgeworCQl2dHlfb3V0KHZ0eSwgIiAgaXAuYWNjZXNzIHN0cmVhbSBJRDogMHglMDJ4JXMiLAorCQkJdHJ4LT5yc2xfdGVpLCBWVFlfTkVXTElORSk7CisJfSBlbHNlIHsKKwkJdnR5X291dCh2dHksICIgIEUxIFNpZ25hbGxpbmcgTGluazolcyIsIFZUWV9ORVdMSU5FKTsKKwkJZTFpc2xfZHVtcF92dHkodnR5LCB0cngtPnJzbF9saW5rKTsKKwl9Cit9CisKK0RFRlVOKHNob3dfdHJ4LAorICAgICAgc2hvd190cnhfY21kLAorICAgICAgInNob3cgdHJ4IFtidHNfbnJdIFt0cnhfbnJdIiwKKwlTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBhIFRSWFxuIgorCSJCVFMgTnVtYmVyXG4iCisJIlRSWCBOdW1iZXJcbiIpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBnc21uZXRfZnJvbV92dHkodnR5KTsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gTlVMTDsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwlpbnQgYnRzX25yLCB0cnhfbnI7CisKKwlpZiAoYXJnYyA+PSAxKSB7CisJCS8qIHVzZSB0aGUgQlRTIG51bWJlciB0aGF0IHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgKi8KKwkJYnRzX25yID0gYXRvaShhcmd2WzBdKTsKKwkJaWYgKGJ0c19uciA+PSBuZXQtPm51bV9idHMpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBCVFMgJyVzJyVzIiwgYXJndlswXSwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJYnRzID0gZ3NtX2J0c19udW0obmV0LCBidHNfbnIpOworCX0KKwlpZiAoYXJnYyA+PSAyKSB7CisJCXRyeF9uciA9IGF0b2koYXJndlsxXSk7CisJCWlmICh0cnhfbnIgPj0gYnRzLT5udW1fdHJ4KSB7CisJCQl2dHlfb3V0KHZ0eSwgIiUlIGNhbid0IGZpbmQgVFJYICclcyclcyIsIGFyZ3ZbMV0sCisJCQkJVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIHRyeF9ucik7CisJCXRyeF9kdW1wX3Z0eSh2dHksIHRyeCk7CisJCXJldHVybiBDTURfU1VDQ0VTUzsKKwl9CisJaWYgKGJ0cykgeworCQkvKiBwcmludCBhbGwgVFJYIGluIHRoaXMgQlRTICovCisJCWZvciAodHJ4X25yID0gMDsgdHJ4X25yIDwgYnRzLT5udW1fdHJ4OyB0cnhfbnIrKykgeworCQkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgdHJ4X25yKTsKKwkJCXRyeF9kdW1wX3Z0eSh2dHksIHRyeCk7CisJCX0KKwkJcmV0dXJuIENNRF9TVUNDRVNTOworCX0KKworCWZvciAoYnRzX25yID0gMDsgYnRzX25yIDwgbmV0LT5udW1fYnRzOyBidHNfbnIrKykgeworCQlidHMgPSBnc21fYnRzX251bShuZXQsIGJ0c19ucik7CisJCWZvciAodHJ4X25yID0gMDsgdHJ4X25yIDwgYnRzLT5udW1fdHJ4OyB0cnhfbnIrKykgeworCQkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgdHJ4X25yKTsKKwkJCXRyeF9kdW1wX3Z0eSh2dHksIHRyeCk7CisJCX0KKwl9CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKworc3RhdGljIHZvaWQgdHNfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzKQoreworCXZ0eV9vdXQodnR5LCAiVGltZXNsb3QgJXUgb2YgVFJYICV1IGluIEJUUyAldSwgcGh5cyBjZmcgJXMlcyIsCisJCXRzLT5uciwgdHMtPnRyeC0+bnIsIHRzLT50cngtPmJ0cy0+bnIsCisJCWdzbV9wY2hhbl9uYW1lKHRzLT5wY2hhbiksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgTk0gU3RhdGU6ICIpOworCW5ldF9kdW1wX25tc3RhdGUodnR5LCAmdHMtPm5tX3N0YXRlKTsKKwlpZiAoIWlzX2lwYWNjZXNzX2J0cyh0cy0+dHJ4LT5idHMpKQorCQl2dHlfb3V0KHZ0eSwgIiAgRTEgTGluZSAldSwgVGltZXNsb3QgJXUsIFN1YnNsb3QgJXUlcyIsCisJCQl0cy0+ZTFfbGluay5lMV9uciwgdHMtPmUxX2xpbmsuZTFfdHMsCisJCQl0cy0+ZTFfbGluay5lMV90c19zcywgVlRZX05FV0xJTkUpOworfQorCitERUZVTihzaG93X3RzLAorICAgICAgc2hvd190c19jbWQsCisgICAgICAic2hvdyB0aW1lc2xvdCBbYnRzX25yXSBbdHJ4X25yXSBbdHNfbnJdIiwKKwlTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBhIFRTXG4iCisJIkJUUyBOdW1iZXJcbiIgIlRSWCBOdW1iZXJcbiIgIlRpbWVzbG90IE51bWJlclxuIikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGdzbW5ldF9mcm9tX3Z0eSh2dHkpOworCXN0cnVjdCBnc21fYnRzICpidHM7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0czsKKwlpbnQgYnRzX25yLCB0cnhfbnIsIHRzX25yOworCisJaWYgKGFyZ2MgPj0gMSkgeworCQkvKiB1c2UgdGhlIEJUUyBudW1iZXIgdGhhdCB0aGUgdXNlciBoYXMgc3BlY2lmaWVkICovCisJCWJ0c19uciA9IGF0b2koYXJndlswXSk7CisJCWlmIChidHNfbnIgPj0gbmV0LT5udW1fYnRzKSB7CisJCQl2dHlfb3V0KHZ0eSwgIiUlIGNhbid0IGZpbmQgQlRTICclcyclcyIsIGFyZ3ZbMF0sCisJCQkJVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCWJ0cyA9IGdzbV9idHNfbnVtKG5ldCwgYnRzX25yKTsKKwl9CisJaWYgKGFyZ2MgPj0gMikgeworCQl0cnhfbnIgPSBhdG9pKGFyZ3ZbMV0pOworCQlpZiAodHJ4X25yID49IGJ0cy0+bnVtX3RyeCkgeworCQkJdnR5X291dCh2dHksICIlJSBjYW4ndCBmaW5kIFRSWCAnJXMnJXMiLCBhcmd2WzFdLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCB0cnhfbnIpOworCX0KKwlpZiAoYXJnYyA+PSAzKSB7CisJCXRzX25yID0gYXRvaShhcmd2WzJdKTsKKwkJaWYgKHRzX25yID49IFRSWF9OUl9UUykgeworCQkJdnR5X291dCh2dHksICIlJSBjYW4ndCBmaW5kIFRTICclcyclcyIsIGFyZ3ZbMl0sCisJCQkJVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCXRzID0gJnRyeC0+dHNbdHNfbnJdOworCQl0c19kdW1wX3Z0eSh2dHksIHRzKTsKKwkJcmV0dXJuIENNRF9TVUNDRVNTOworCX0KKwlmb3IgKGJ0c19uciA9IDA7IGJ0c19uciA8IG5ldC0+bnVtX2J0czsgYnRzX25yKyspIHsKKwkJYnRzID0gZ3NtX2J0c19udW0obmV0LCBidHNfbnIpOworCQlmb3IgKHRyeF9uciA9IDA7IHRyeF9uciA8IGJ0cy0+bnVtX3RyeDsgdHJ4X25yKyspIHsKKwkJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIHRyeF9ucik7CisJCQlmb3IgKHRzX25yID0gMDsgdHNfbnIgPCBUUlhfTlJfVFM7IHRzX25yKyspIHsKKwkJCQl0cyA9ICZ0cngtPnRzW3RzX25yXTsKKwkJCQl0c19kdW1wX3Z0eSh2dHksIHRzKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgc3Vic2NyX2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJdnR5X291dCh2dHksICIgICAgSUQ6ICVsbHUsIEF1dGhvcml6ZWQ6ICVkJXMiLCBzdWJzY3ItPmlkLAorCQlzdWJzY3ItPmF1dGhvcml6ZWQsIFZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT5uYW1lKQorCQl2dHlfb3V0KHZ0eSwgIiAgICBOYW1lOiAnJXMnJXMiLCBzdWJzY3ItPm5hbWUsIFZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT5leHRlbnNpb24pCisJCXZ0eV9vdXQodnR5LCAiICAgIEV4dGVuc2lvbjogJXMlcyIsIHN1YnNjci0+ZXh0ZW5zaW9uLAorCQkJVlRZX05FV0xJTkUpOworCWlmIChzdWJzY3ItPmltc2kpCisJCXZ0eV9vdXQodnR5LCAiICAgIElNU0k6ICVzJXMiLCBzdWJzY3ItPmltc2ksIFZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT50bXNpICE9IEdTTV9SRVNFUlZFRF9UTVNJKQorCQl2dHlfb3V0KHZ0eSwgIiAgICBUTVNJOiAlMDhYJXMiLCBzdWJzY3ItPnRtc2ksCisJCQlWVFlfTkVXTElORSk7CisKKwl2dHlfb3V0KHZ0eSwgIiAgICBVc2UgY291bnQ6ICV1JXMiLCBzdWJzY3ItPnVzZV9jb3VudCwgVlRZX05FV0xJTkUpOworfQorCitzdGF0aWMgdm9pZCBtZWFzX3JlcF9kdW1wX3VuaV92dHkoc3RydWN0IHZ0eSAqdnR5LAorCQkJCSAgc3RydWN0IGdzbV9tZWFzX3JlcF91bmlkaXIgKm1ydSwKKwkJCQkgIGNvbnN0IGNoYXIgKnByZWZpeCwKKwkJCQkgIGNvbnN0IGNoYXIgKmRpcikKK3sKKwl2dHlfb3V0KHZ0eSwgIiVzICBSWEwtRlVMTC0lczogJTRkIGRCbSwgUlhMLVNVQi0lczogJTRkIGRCbSAiLAorCQlwcmVmaXgsIGRpciwgcnhsZXYyZGJtKG1ydS0+ZnVsbC5yeF9sZXYpLAorCQkJZGlyLCByeGxldjJkYm0obXJ1LT5zdWIucnhfbGV2KSk7CisJdnR5X291dCh2dHksICJSWFEtRlVMTC0lczogJWQsIFJYUS1TVUItJXM6ICVkJXMiLAorCQlkaXIsIG1ydS0+ZnVsbC5yeF9xdWFsLCBkaXIsIG1ydS0+c3ViLnJ4X3F1YWwsCisJCVZUWV9ORVdMSU5FKTsKK30KKworc3RhdGljIHZvaWQgbWVhc19yZXBfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX21lYXNfcmVwICptciwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwl2dHlfb3V0KHZ0eSwgIiVzTWVhc3VyZW1lbnQgUmVwb3J0OiVzIiwgcHJlZml4LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIlcyAgRmxhZ3M6ICVzJXMlcyVzJXMiLCBwcmVmaXgsCisJCQltci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX1VMX0RUWCA/ICJEVFh1ICIgOiAiIiwKKwkJCW1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfRExfRFRYID8gIkRUWGQgIiA6ICIiLAorCQkJbXItPmZsYWdzICYgTUVBU19SRVBfRl9GUEMgPyAiRlBDICIgOiAiIiwKKwkJCW1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfRExfVkFMSUQgPyAiICIgOiAiRExpbnZhbCAiLAorCQkJVlRZX05FV0xJTkUpOworCWlmIChtci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX01TX1RPKQorCQl2dHlfb3V0KHZ0eSwgIiVzICBNUyBUaW1pbmcgT2Zmc2V0OiAldSVzIiwgcHJlZml4LAorCQkJbXItPm1zX3RpbWluZ19vZmZzZXQsIFZUWV9ORVdMSU5FKTsKKwlpZiAobXItPmZsYWdzICYgTUVBU19SRVBfRl9NU19MMSkKKwkJdnR5X291dCh2dHksICIlcyAgTDEgTVMgUG93ZXI6ICV1IGRCbSwgVGltaW5nIEFkdmFuY2U6ICV1JXMiLAorCQkJcHJlZml4LCBtci0+bXNfbDEucHdyLCBtci0+bXNfbDEudGEsIFZUWV9ORVdMSU5FKTsKKwlpZiAobXItPmZsYWdzICYgTUVBU19SRVBfRl9ETF9WQUxJRCkKKwkJbWVhc19yZXBfZHVtcF91bmlfdnR5KHZ0eSwgJm1yLT5kbCwgcHJlZml4LCAiZGwiKTsKKwltZWFzX3JlcF9kdW1wX3VuaV92dHkodnR5LCAmbXItPnVsLCBwcmVmaXgsICJ1bCIpOworfQorCitzdGF0aWMgdm9pZCBsY2hhbl9kdW1wX2Z1bGxfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJaW50IGlkeDsKKworCXZ0eV9vdXQodnR5LCAiTGNoYW4gJXUgaW4gVGltZXNsb3QgJXUgb2YgVFJYICV1IGluIEJUUyAldSwgVHlwZSAlcyVzIiwKKwkJbGNoYW4tPm5yLCBsY2hhbi0+dHMtPm5yLCBsY2hhbi0+dHMtPnRyeC0+bnIsCisJCWxjaGFuLT50cy0+dHJ4LT5idHMtPm5yLCBnc21fbGNoYW50X25hbWUobGNoYW4tPnR5cGUpLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIFVzZSBDb3VudDogJXUsIFN0YXRlOiAlcyVzIiwgbGNoYW4tPmNvbm4udXNlX2NvdW50LAorCQlnc21fbGNoYW5zX25hbWUobGNoYW4tPnN0YXRlKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBCUyBQb3dlcjogJXUgZEJtLCBNUyBQb3dlcjogJXUgZEJtJXMiLAorCQlsY2hhbi0+dHMtPnRyeC0+bm9taW5hbF9wb3dlciAtIGxjaGFuLT50cy0+dHJ4LT5tYXhfcG93ZXJfcmVkCisJCS0gbGNoYW4tPmJzX3Bvd2VyKjIsCisJCW1zX3B3cl9kYm0obGNoYW4tPnRzLT50cngtPmJ0cy0+YmFuZCwgbGNoYW4tPm1zX3Bvd2VyKSwKKwkJVlRZX05FV0xJTkUpOworCWlmIChsY2hhbi0+Y29ubi5zdWJzY3IpIHsKKwkJdnR5X291dCh2dHksICIgIFN1YnNjcmliZXI6JXMiLCBWVFlfTkVXTElORSk7CisJCXN1YnNjcl9kdW1wX3Z0eSh2dHksIGxjaGFuLT5jb25uLnN1YnNjcik7CisJfSBlbHNlCisJCXZ0eV9vdXQodnR5LCAiICBObyBTdWJzY3JpYmVyJXMiLCBWVFlfTkVXTElORSk7CisJaWYgKGlzX2lwYWNjZXNzX2J0cyhsY2hhbi0+dHMtPnRyeC0+YnRzKSkgeworCQlzdHJ1Y3QgaW5fYWRkciBpYTsKKwkJaWEuc19hZGRyID0gaHRvbmwobGNoYW4tPmFiaXNfaXAuYm91bmRfaXApOworCQl2dHlfb3V0KHZ0eSwgIiAgQm91bmQgSVA6ICVzIFBvcnQgJXUgUlRQX1RZUEUyPSV1IENPTk5fSUQ9JXUlcyIsCisJCQlpbmV0X250b2EoaWEpLCBsY2hhbi0+YWJpc19pcC5ib3VuZF9wb3J0LAorCQkJbGNoYW4tPmFiaXNfaXAucnRwX3BheWxvYWQyLCBsY2hhbi0+YWJpc19pcC5jb25uX2lkLAorCQkJVlRZX05FV0xJTkUpOworCX0KKworCS8qIHdlIHdhbnQgdG8gcmVwb3J0IHRoZSBsYXN0IG1lYXN1cmVtZW50IHJlcG9ydCAqLworCWlkeCA9IGNhbGNfaW5pdGlhbF9pZHgoQVJSQVlfU0laRShsY2hhbi0+bWVhc19yZXApLAorCQkJICAgICAgIGxjaGFuLT5tZWFzX3JlcF9pZHgsIDEpOworCW1lYXNfcmVwX2R1bXBfdnR5KHZ0eSwgJmxjaGFuLT5tZWFzX3JlcFtpZHhdLCAiICAiKTsKK30KKworc3RhdGljIHZvaWQgbGNoYW5fZHVtcF9zaG9ydF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX21lYXNfcmVwICptcjsKKwlpbnQgaWR4OworCisJLyogd2Ugd2FudCB0byByZXBvcnQgdGhlIGxhc3QgbWVhc3VyZW1lbnQgcmVwb3J0ICovCisJaWR4ID0gY2FsY19pbml0aWFsX2lkeChBUlJBWV9TSVpFKGxjaGFuLT5tZWFzX3JlcCksCisJCQkgICAgICAgbGNoYW4tPm1lYXNfcmVwX2lkeCwgMSk7CisJbXIgPSAgJmxjaGFuLT5tZWFzX3JlcFtpZHhdOworCisJdnR5X291dCh2dHksICJMY2hhbjogJXUgVGltZXNsb3Q6ICV1IFRSWDogJXUgQlRTOiAldSBUeXBlOiAlcyAtIEwxIE1TIFBvd2VyOiAldSBkQm0gIgorCQkgICAgICJSWEwtRlVMTC1kbDogJTRkIGRCbSBSWEwtRlVMTC11bDogJTRkIGRCbSVzIiwKKwkJbGNoYW4tPm5yLCBsY2hhbi0+dHMtPm5yLCBsY2hhbi0+dHMtPnRyeC0+bnIsCisJCWxjaGFuLT50cy0+dHJ4LT5idHMtPm5yLCBnc21fbGNoYW50X25hbWUobGNoYW4tPnR5cGUpLAorCQltci0+bXNfbDEucHdyLAorCQlyeGxldjJkYm0obXItPmRsLmZ1bGwucnhfbGV2KSwKKwkJcnhsZXYyZGJtKG1yLT51bC5mdWxsLnJ4X2xldiksCisJCVZUWV9ORVdMSU5FKTsKK30KKworc3RhdGljIGludCBsY2hhbl9zdW1tYXJ5KHN0cnVjdCB2dHkgKnZ0eSwgaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LAorCQkJIHZvaWQgKCpkdW1wX2NiKShzdHJ1Y3QgdnR5ICosIHN0cnVjdCBnc21fbGNoYW4gKikpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBnc21uZXRfZnJvbV92dHkodnR5KTsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHM7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisJaW50IGJ0c19uciwgdHJ4X25yLCB0c19uciwgbGNoYW5fbnI7CisKKwlpZiAoYXJnYyA+PSAxKSB7CisJCS8qIHVzZSB0aGUgQlRTIG51bWJlciB0aGF0IHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgKi8KKwkJYnRzX25yID0gYXRvaShhcmd2WzBdKTsKKwkJaWYgKGJ0c19uciA+PSBuZXQtPm51bV9idHMpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBCVFMgJXMlcyIsIGFyZ3ZbMF0sCisJCQkJVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCWJ0cyA9IGdzbV9idHNfbnVtKG5ldCwgYnRzX25yKTsKKwl9CisJaWYgKGFyZ2MgPj0gMikgeworCQl0cnhfbnIgPSBhdG9pKGFyZ3ZbMV0pOworCQlpZiAodHJ4X25yID49IGJ0cy0+bnVtX3RyeCkgeworCQkJdnR5X291dCh2dHksICIlJSBjYW4ndCBmaW5kIFRSWCAlcyVzIiwgYXJndlsxXSwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgdHJ4X25yKTsKKwl9CisJaWYgKGFyZ2MgPj0gMykgeworCQl0c19uciA9IGF0b2koYXJndlsyXSk7CisJCWlmICh0c19uciA+PSBUUlhfTlJfVFMpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBUUyAlcyVzIiwgYXJndlsyXSwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJdHMgPSAmdHJ4LT50c1t0c19ucl07CisJfQorCWlmIChhcmdjID49IDQpIHsKKwkJbGNoYW5fbnIgPSBhdG9pKGFyZ3ZbM10pOworCQlpZiAobGNoYW5fbnIgPj0gVFNfTUFYX0xDSEFOKSB7CisJCQl2dHlfb3V0KHZ0eSwgIiUlIGNhbid0IGZpbmQgTENIQU4gJXMlcyIsIGFyZ3ZbM10sCisJCQkJVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCWxjaGFuID0gJnRzLT5sY2hhbltsY2hhbl9ucl07CisJCWR1bXBfY2IodnR5LCBsY2hhbik7CisJCXJldHVybiBDTURfU1VDQ0VTUzsKKwl9CisJZm9yIChidHNfbnIgPSAwOyBidHNfbnIgPCBuZXQtPm51bV9idHM7IGJ0c19ucisrKSB7CisJCWJ0cyA9IGdzbV9idHNfbnVtKG5ldCwgYnRzX25yKTsKKwkJZm9yICh0cnhfbnIgPSAwOyB0cnhfbnIgPCBidHMtPm51bV90cng7IHRyeF9ucisrKSB7CisJCQl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCB0cnhfbnIpOworCQkJZm9yICh0c19uciA9IDA7IHRzX25yIDwgVFJYX05SX1RTOyB0c19ucisrKSB7CisJCQkJdHMgPSAmdHJ4LT50c1t0c19ucl07CisJCQkJZm9yIChsY2hhbl9uciA9IDA7IGxjaGFuX25yIDwgVFNfTUFYX0xDSEFOOworCQkJCSAgICAgbGNoYW5fbnIrKykgeworCQkJCQlsY2hhbiA9ICZ0cy0+bGNoYW5bbGNoYW5fbnJdOworCQkJCQlpZiAobGNoYW4tPnR5cGUgPT0gR1NNX0xDSEFOX05PTkUpCisJCQkJCQljb250aW51ZTsKKwkJCQkJZHVtcF9jYih2dHksIGxjaGFuKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKworREVGVU4oc2hvd19sY2hhbiwKKyAgICAgIHNob3dfbGNoYW5fY21kLAorICAgICAgInNob3cgbGNoYW4gW2J0c19ucl0gW3RyeF9ucl0gW3RzX25yXSBbbGNoYW5fbnJdIiwKKwlTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBhIGxvZ2ljYWwgY2hhbm5lbFxuIgorCSJCVFMgTnVtYmVyXG4iICJUUlggTnVtYmVyXG4iICJUaW1lc2xvdCBOdW1iZXJcbiIKKwkiTG9naWNhbCBDaGFubmVsIE51bWJlclxuIikKKworeworCXJldHVybiBsY2hhbl9zdW1tYXJ5KHZ0eSwgYXJnYywgYXJndiwgbGNoYW5fZHVtcF9mdWxsX3Z0eSk7Cit9CisKK0RFRlVOKHNob3dfbGNoYW5fc3VtbWFyeSwKKyAgICAgIHNob3dfbGNoYW5fc3VtbWFyeV9jbWQsCisgICAgICAic2hvdyBsY2hhbiBzdW1tYXJ5IFtidHNfbnJdIFt0cnhfbnJdIFt0c19ucl0gW2xjaGFuX25yXSIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBsb2dpY2FsIGNoYW5uZWxcbiIKKwkiQlRTIE51bWJlclxuIiAiVFJYIE51bWJlclxuIiAiVGltZXNsb3QgTnVtYmVyXG4iCisJIkxvZ2ljYWwgQ2hhbm5lbCBOdW1iZXJcbiIpCit7CisJcmV0dXJuIGxjaGFuX3N1bW1hcnkodnR5LCBhcmdjLCBhcmd2LCBsY2hhbl9kdW1wX3Nob3J0X3Z0eSk7Cit9CisKK3N0YXRpYyB2b2lkIGUxZHJ2X2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGUxaW5wX2RyaXZlciAqZHJ2KQoreworCXZ0eV9vdXQodnR5LCAiRTEgSW5wdXQgRHJpdmVyICVzJXMiLCBkcnYtPm5hbWUsIFZUWV9ORVdMSU5FKTsKK30KKworREVGVU4oc2hvd19lMWRydiwKKyAgICAgIHNob3dfZTFkcnZfY21kLAorICAgICAgInNob3cgZTFfZHJpdmVyIiwKKwlTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBhdmFpbGFibGUgRTEgZHJpdmVyc1xuIikKK3sKKwlzdHJ1Y3QgZTFpbnBfZHJpdmVyICpkcnY7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShkcnYsICZlMWlucF9kcml2ZXJfbGlzdCwgbGlzdCkKKwkJZTFkcnZfZHVtcF92dHkodnR5LCBkcnYpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBlMWxpbmVfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSkKK3sKKwl2dHlfb3V0KHZ0eSwgIkUxIExpbmUgTnVtYmVyICV1LCBOYW1lICVzLCBEcml2ZXIgJXMlcyIsCisJCWxpbmUtPm51bSwgbGluZS0+bmFtZSA/IGxpbmUtPm5hbWUgOiAiIiwKKwkJbGluZS0+ZHJpdmVyLT5uYW1lLCBWVFlfTkVXTElORSk7Cit9CisKK0RFRlVOKHNob3dfZTFsaW5lLAorICAgICAgc2hvd19lMWxpbmVfY21kLAorICAgICAgInNob3cgZTFfbGluZSBbbGluZV9ucl0iLAorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGEgRTEgbGluZVxuIgorCSJFMSBMaW5lIE51bWJlclxuIikKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKworCWlmIChhcmdjID49IDEpIHsKKwkJaW50IG51bSA9IGF0b2koYXJndlswXSk7CisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpbmUsICZlMWlucF9saW5lX2xpc3QsIGxpc3QpIHsKKwkJCWlmIChsaW5lLT5udW0gPT0gbnVtKSB7CisJCQkJZTFsaW5lX2R1bXBfdnR5KHZ0eSwgbGluZSk7CisJCQkJcmV0dXJuIENNRF9TVUNDRVNTOworCQkJfQorCQl9CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CQorCQorCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpbmUsICZlMWlucF9saW5lX2xpc3QsIGxpc3QpCisJCWUxbGluZV9kdW1wX3Z0eSh2dHksIGxpbmUpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBlMXRzX2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGUxaW5wX3RzICp0cykKK3sKKwlpZiAodHMtPnR5cGUgPT0gRTFJTlBfVFNfVFlQRV9OT05FKQorCQlyZXR1cm47CisJdnR5X291dCh2dHksICJFMSBUaW1lc2xvdCAlMnUgb2YgTGluZSAldSBpcyBUeXBlICVzJXMiLAorCQl0cy0+bnVtLCB0cy0+bGluZS0+bnVtLCBlMWlucF90c3R5cGVfbmFtZSh0cy0+dHlwZSksCisJCVZUWV9ORVdMSU5FKTsKK30KKworREVGVU4oc2hvd19lMXRzLAorICAgICAgc2hvd19lMXRzX2NtZCwKKyAgICAgICJzaG93IGUxX3RpbWVzbG90IFtsaW5lX25yXSBbdHNfbnJdIiwKKwlTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBhIEUxIHRpbWVzbG90XG4iCisJIkUxIExpbmUgTnVtYmVyXG4iICJFMSBUaW1lc2xvdCBOdW1iZXJcbiIpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUgPSBOVUxMOworCXN0cnVjdCBlMWlucF90cyAqdHM7CisJaW50IHRzX25yOworCisJaWYgKGFyZ2MgPT0gMCkgeworCQlsbGlzdF9mb3JfZWFjaF9lbnRyeShsaW5lLCAmZTFpbnBfbGluZV9saXN0LCBsaXN0KSB7CisJCQlmb3IgKHRzX25yID0gMDsgdHNfbnIgPCBOVU1fRTFfVFM7IHRzX25yKyspIHsKKwkJCQl0cyA9ICZsaW5lLT50c1t0c19ucl07CisJCQkJZTF0c19kdW1wX3Z0eSh2dHksIHRzKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfQorCWlmIChhcmdjID49IDEpIHsKKwkJaW50IG51bSA9IGF0b2koYXJndlswXSk7CisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpbmUsICZlMWlucF9saW5lX2xpc3QsIGxpc3QpIHsKKwkJCWlmIChsaW5lLT5udW0gPT0gbnVtKQorCQkJCWJyZWFrOworCQl9CisJCWlmICghbGluZSB8fCBsaW5lLT5udW0gIT0gbnVtKSB7CisJCQl2dHlfb3V0KHZ0eSwgIkUxIGxpbmUgJXMgaXMgaW52YWxpZCVzIiwKKwkJCQlhcmd2WzBdLCBWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwl9CQorCWlmIChhcmdjID49IDIpIHsKKwkJdHNfbnIgPSBhdG9pKGFyZ3ZbMV0pOworCQlpZiAodHNfbnIgPiBOVU1fRTFfVFMpIHsKKwkJCXZ0eV9vdXQodnR5LCAiRTEgdGltZXNsb3QgJXMgaXMgaW52YWxpZCVzIiwKKwkJCQlhcmd2WzFdLCBWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJdHMgPSAmbGluZS0+dHNbdHNfbnJdOworCQllMXRzX2R1bXBfdnR5KHZ0eSwgdHMpOworCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfSBlbHNlIHsKKwkJZm9yICh0c19uciA9IDA7IHRzX25yIDwgTlVNX0UxX1RTOyB0c19ucisrKSB7CisJCQl0cyA9ICZsaW5lLT50c1t0c19ucl07CisJCQllMXRzX2R1bXBfdnR5KHZ0eSwgdHMpOworCQl9CisJCXJldHVybiBDTURfU1VDQ0VTUzsKKwl9CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBwYWdpbmdfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICpwYWcpCit7CisJdnR5X291dCh2dHksICJQYWdpbmcgb24gQlRTICV1JXMiLCBwYWctPmJ0cy0+bnIsIFZUWV9ORVdMSU5FKTsKKwlzdWJzY3JfZHVtcF92dHkodnR5LCBwYWctPnN1YnNjcik7Cit9CisKK3N0YXRpYyB2b2lkIGJ0c19wYWdpbmdfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKnBhZzsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHBhZywgJmJ0cy0+cGFnaW5nLnBlbmRpbmdfcmVxdWVzdHMsIGVudHJ5KQorCQlwYWdpbmdfZHVtcF92dHkodnR5LCBwYWcpOworfQorCitERUZVTihzaG93X3BhZ2luZywKKyAgICAgIHNob3dfcGFnaW5nX2NtZCwKKyAgICAgICJzaG93IHBhZ2luZyBbYnRzX25yXSIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgcGFnaW5nIHJldXFlc3RzIG9mIGEgQlRTXG4iCisJIkJUUyBOdW1iZXJcbiIpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBnc21uZXRfZnJvbV92dHkodnR5KTsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCWludCBidHNfbnI7CisKKwlpZiAoYXJnYyA+PSAxKSB7CisJCS8qIHVzZSB0aGUgQlRTIG51bWJlciB0aGF0IHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgKi8KKwkJYnRzX25yID0gYXRvaShhcmd2WzBdKTsKKwkJaWYgKGJ0c19uciA+PSBuZXQtPm51bV9idHMpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBCVFMgJXMlcyIsIGFyZ3ZbMF0sCisJCQkJVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCWJ0cyA9IGdzbV9idHNfbnVtKG5ldCwgYnRzX25yKTsKKwkJYnRzX3BhZ2luZ19kdW1wX3Z0eSh2dHksIGJ0cyk7CisJCQorCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfQorCWZvciAoYnRzX25yID0gMDsgYnRzX25yIDwgbmV0LT5udW1fYnRzOyBidHNfbnIrKykgeworCQlidHMgPSBnc21fYnRzX251bShuZXQsIGJ0c19ucik7CisJCWJ0c19wYWdpbmdfZHVtcF92dHkodnR5LCBidHMpOworCX0KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworI2RlZmluZSBORVRXT1JLX1NUUiAiQ29uZmlndXJlIHRoZSBHU00gbmV0d29ya1xuIgorCitERUZVTihjZmdfbmV0LAorICAgICAgY2ZnX25ldF9jbWQsCisgICAgICAibmV0d29yayIsIE5FVFdPUktfU1RSKQoreworCXZ0eS0+aW5kZXggPSBnc21uZXRfZnJvbV92dHkodnR5KTsKKwl2dHktPm5vZGUgPSBHU01ORVRfTk9ERTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworCitERUZVTihjZmdfbmV0X25jYywKKyAgICAgIGNmZ19uZXRfbmNjX2NtZCwKKyAgICAgICJuZXR3b3JrIGNvdW50cnkgY29kZSA8MS05OTk+IiwKKyAgICAgICJTZXQgdGhlIEdTTSBuZXR3b3JrIGNvdW50cnkgY29kZSIpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQgPSBnc21uZXRfZnJvbV92dHkodnR5KTsKKworCWdzbW5ldC0+Y291bnRyeV9jb2RlID0gYXRvaShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9tbmMsCisgICAgICBjZmdfbmV0X21uY19jbWQsCisgICAgICAibW9iaWxlIG5ldHdvcmsgY29kZSA8MS05OTk+IiwKKyAgICAgICJTZXQgdGhlIEdTTSBtb2JpbGUgbmV0d29yayBjb2RlIikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCA9IGdzbW5ldF9mcm9tX3Z0eSh2dHkpOworCisJZ3NtbmV0LT5uZXR3b3JrX2NvZGUgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X25hbWVfc2hvcnQsCisgICAgICBjZmdfbmV0X25hbWVfc2hvcnRfY21kLAorICAgICAgInNob3J0IG5hbWUgTkFNRSIsCisgICAgICAiU2V0IHRoZSBzaG9ydCBHU00gbmV0d29yayBuYW1lIikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCA9IGdzbW5ldF9mcm9tX3Z0eSh2dHkpOworCisJaWYgKGdzbW5ldC0+bmFtZV9zaG9ydCkKKwkJdGFsbG9jX2ZyZWUoZ3NtbmV0LT5uYW1lX3Nob3J0KTsKKworCWdzbW5ldC0+bmFtZV9zaG9ydCA9IHRhbGxvY19zdHJkdXAoZ3NtbmV0LCBhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9uYW1lX2xvbmcsCisgICAgICBjZmdfbmV0X25hbWVfbG9uZ19jbWQsCisgICAgICAibG9uZyBuYW1lIE5BTUUiLAorICAgICAgIlNldCB0aGUgbG9uZyBHU00gbmV0d29yayBuYW1lIikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCA9IGdzbW5ldF9mcm9tX3Z0eSh2dHkpOworCisJaWYgKGdzbW5ldC0+bmFtZV9sb25nKQorCQl0YWxsb2NfZnJlZShnc21uZXQtPm5hbWVfbG9uZyk7CisKKwlnc21uZXQtPm5hbWVfbG9uZyA9IHRhbGxvY19zdHJkdXAoZ3NtbmV0LCBhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9hdXRoX3BvbGljeSwKKyAgICAgIGNmZ19uZXRfYXV0aF9wb2xpY3lfY21kLAorICAgICAgImF1dGggcG9saWN5IChjbG9zZWR8YWNjZXB0LWFsbHx0b2tlbikiLAorCSJBdXRoZW50aWNhdGlvbiAobm90IGNyeXB0b2dyYXBoaWMpXG4iCisJIlNldCB0aGUgR1NNIG5ldHdvcmsgYXV0aGVudGljYXRpb24gcG9saWN5XG4iCisJIlJlcXVpcmUgdGhlIE1TIHRvIGJlIGFjdGl2YXRlZCBpbiBITFJcbiIKKwkiQWNjZXB0IGFsbCBNUywgd2hldGhlciBpbiBITFIgb3Igbm90XG4iCisJIlVzZSBTTVMtdG9rZW4gYmFzZWQgYXV0aGVudGljYXRpb25cbiIpCit7CisJZW51bSBnc21fYXV0aF9wb2xpY3kgcG9saWN5ID0gZ3NtX2F1dGhfcG9saWN5X3BhcnNlKGFyZ3ZbMF0pOworCXN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0ID0gZ3NtbmV0X2Zyb21fdnR5KHZ0eSk7CisKKwlnc21uZXQtPmF1dGhfcG9saWN5ID0gcG9saWN5OworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X3JlamVjdF9jYXVzZSwKKyAgICAgIGNmZ19uZXRfcmVqZWN0X2NhdXNlX2NtZCwKKyAgICAgICJsb2NhdGlvbiB1cGRhdGluZyByZWplY3QgY2F1c2UgPDItMTExPiIsCisgICAgICAiU2V0IHRoZSByZWplY3QgY2F1c2Ugb2YgbG9jYXRpb24gdXBkYXRpbmcgcmVqZWN0XG4iKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0ID0gZ3NtbmV0X2Zyb21fdnR5KHZ0eSk7CisKKwlnc21uZXQtPnJlamVjdF9jYXVzZSA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfZW5jcnlwdGlvbiwKKyAgICAgIGNmZ19uZXRfZW5jcnlwdGlvbl9jbWQsCisgICAgICAiZW5jcnlwdGlvbiBhNSAoMHwxfDIpIiwKKwkiRW5jcnlwdGlvbiBvcHRpb25zXG4iCisJIkE1IGVuY3J5cHRpb25cbiIgIkE1LzA6IE5vIGVuY3J5cHRpb25cbiIKKwkiQTUvMTogRW5jcnlwdGlvblxuIiAiQTUvMjogRXhwb3J0LWdyYWRlIEVuY3J5cHRpb25cbiIpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQgPSBnc21uZXRfZnJvbV92dHkodnR5KTsKKworCWdzbW5ldC0+YTVfZW5jcnlwdGlvbj0gYXRvaShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9uZWNpLAorICAgICAgY2ZnX25ldF9uZWNpX2NtZCwKKyAgICAgICJuZWNpICgwfDEpIiwKKwkiTmV3IEVzdGFibGlzaCBDYXVzZSBJbmRpY2F0aW9uXG4iCisJIkRvbid0IHNldCB0aGUgTkVDSSBiaXRcbiIgIlNldCB0aGUgTkVDSSBiaXRcbiIpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQgPSBnc21uZXRfZnJvbV92dHkodnR5KTsKKworCWdzbW5ldC0+bmVjaSA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X3JybHBfbW9kZSwgY2ZnX25ldF9ycmxwX21vZGVfY21kLAorICAgICAgInJybHAgbW9kZSAobm9uZXxtcy1iYXNlZHxtcy1wcmVmZXJyZWR8YXNzLXByZWZlcnJlZCkiLAorCSJSYWRpbyBSZXNvdXJjZSBMb2NhdGlvbiBQcm90b2NvbFxuIgorCSJTZXQgdGhlIFJhZGlvIFJlc291cmNlIExvY2F0aW9uIFByb3RvY29sIE1vZGVcbiIKKwkiRG9uJ3Qgc2VuZCBSUkxQIHJlcXVlc3RcbiIKKwkiUmVxdWVzdCBNUy1iYXNlZCBsb2NhdGlvblxuIgorCSJSZXF1ZXN0IGFueSBsb2NhdGlvbiwgcHJlZmVyIE1TLWJhc2VkXG4iCisJIlJlcXVlc3QgYW55IGxvY2F0aW9uLCBwcmVmZXIgTVMtYXNzaXN0ZWRcbiIpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQgPSBnc21uZXRfZnJvbV92dHkodnR5KTsKKworCWdzbW5ldC0+cnJscC5tb2RlID0gcnJscF9tb2RlX3BhcnNlKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X21tX2luZm8sIGNmZ19uZXRfbW1faW5mb19jbWQsCisgICAgICAibW0gaW5mbyAoMHwxKSIsCisJIldoZXRoZXIgdG8gc2VuZCBNTSBJTkZPIGFmdGVyIExPQyBVUEQgQUNDRVBUIikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCA9IGdzbW5ldF9mcm9tX3Z0eSh2dHkpOworCisJZ3NtbmV0LT5zZW5kX21tX2luZm8gPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisjZGVmaW5lIEhBTkRPVkVSX1NUUgkiSGFuZG92ZXIgT3B0aW9uc1xuIgorCitERUZVTihjZmdfbmV0X2hhbmRvdmVyLCBjZmdfbmV0X2hhbmRvdmVyX2NtZCwKKyAgICAgICJoYW5kb3ZlciAoMHwxKSIsCisJSEFORE9WRVJfU1RSCisJIkRvbid0IHBlcmZvcm0gaW4tY2FsbCBoYW5kb3ZlclxuIgorCSJQZXJmb3JtIGluLWNhbGwgaGFuZG92ZXJcbiIpCit7CisJaW50IGVuYWJsZSA9IGF0b2koYXJndlswXSk7CisJc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQgPSBnc21uZXRfZnJvbV92dHkodnR5KTsKKworCWlmIChlbmFibGUgJiYgaXBhY2NfcnRwX2RpcmVjdCkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIENhbm5vdCBlbmFibGUgaGFuZG92ZXIgdW5sZXNzIFJUUCBQcm94eSBtb2RlICIKKwkJCSJpcyBlbmFibGVkIGJ5IHVzaW5nIHRoZSAtUCBjb21tYW5kIGxpbmUgb3B0aW9uJXMiLAorCQkJVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCWdzbW5ldC0+aGFuZG92ZXIuYWN0aXZlID0gZW5hYmxlOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisjZGVmaW5lIEhPX1dJTl9TVFIgSEFORE9WRVJfU1RSICJNZWFzdXJlbWVudCBXaW5kb3dcbiIKKyNkZWZpbmUgSE9fV0lOX1JYTEVWX1NUUiBIT19XSU5fU1RSICJSZWNlaXZlZCBMZXZlbCBBdmVyYWdpbmdcbiIKKyNkZWZpbmUgSE9fV0lOX1JYUVVBTF9TVFIgSE9fV0lOX1NUUiAiUmVjZWl2ZWQgUXVhbGl0eSBBdmVyYWdpbmdcbiIKKyNkZWZpbmUgSE9fUEJVREdFVF9TVFIgSEFORE9WRVJfU1RSICJQb3dlciBCdWRnZXRcbiIKKworREVGVU4oY2ZnX25ldF9ob193aW5fcnhsZXZfYXZnLCBjZmdfbmV0X2hvX3dpbl9yeGxldl9hdmdfY21kLAorICAgICAgImhhbmRvdmVyIHdpbmRvdyByeGxldiBhdmVyYWdpbmcgPDEtMTA+IiwKKwlIT19XSU5fUlhMRVZfU1RSCisJIkhvdyBtYW55IFJ4TGV2IG1lYXN1cmVtZW50cyBhcmUgdXNlZCBmb3IgYXZlcmFnaW5nIikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCA9IGdzbW5ldF9mcm9tX3Z0eSh2dHkpOworCWdzbW5ldC0+aGFuZG92ZXIud2luX3J4bGV2X2F2ZyA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2hvX3dpbl9yeHF1YWxfYXZnLCBjZmdfbmV0X2hvX3dpbl9yeHF1YWxfYXZnX2NtZCwKKyAgICAgICJoYW5kb3ZlciB3aW5kb3cgcnhxdWFsIGF2ZXJhZ2luZyA8MS0xMD4iLAorCUhPX1dJTl9SWFFVQUxfU1RSCisJIkhvdyBtYW55IFJ4UXVhbCBtZWFzdXJlbWVudHMgYXJlIHVzZWQgZm9yIGF2ZXJhZ2luZyIpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQgPSBnc21uZXRfZnJvbV92dHkodnR5KTsKKwlnc21uZXQtPmhhbmRvdmVyLndpbl9yeHF1YWxfYXZnID0gYXRvaShhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfaG9fd2luX3J4bGV2X25laWdoX2F2ZywgY2ZnX25ldF9ob193aW5fcnhsZXZfYXZnX25laWdoX2NtZCwKKyAgICAgICJoYW5kb3ZlciB3aW5kb3cgcnhsZXYgbmVpZ2hib3IgYXZlcmFnaW5nIDwxLTEwPiIsCisJSE9fV0lOX1JYTEVWX1NUUgorCSJIb3cgbWFueSBSeFF1YWwgbWVhc3VyZW1lbnRzIGFyZSB1c2VkIGZvciBhdmVyYWdpbmciKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0ID0gZ3NtbmV0X2Zyb21fdnR5KHZ0eSk7CisJZ3NtbmV0LT5oYW5kb3Zlci53aW5fcnhsZXZfYXZnX25laWdoID0gYXRvaShhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfaG9fcHdyX2ludGVydmFsLCBjZmdfbmV0X2hvX3B3cl9pbnRlcnZhbF9jbWQsCisgICAgICAiaGFuZG92ZXIgcG93ZXIgYnVkZ2V0IGludGVydmFsIDwxLTk5PiIsCisJSE9fUEJVREdFVF9TVFIKKwkiSG93IG9mdGVuIHRvIGNoZWNrIGlmIHdlIGhhdmUgYSBiZXR0ZXIgY2VsbCAoU0FDQ0ggZnJhbWVzKSIpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQgPSBnc21uZXRfZnJvbV92dHkodnR5KTsKKwlnc21uZXQtPmhhbmRvdmVyLnB3cl9pbnRlcnZhbCA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2hvX3B3cl9oeXN0ZXJlc2lzLCBjZmdfbmV0X2hvX3B3cl9oeXN0ZXJlc2lzX2NtZCwKKyAgICAgICJoYW5kb3ZlciBwb3dlciBidWRnZXQgaHlzdGVyZXNpcyA8MC05OTk+IiwKKwlIT19QQlVER0VUX1NUUgorCSJIb3cgbWFueSBkQiBkb2VzIGEgbmVpZ2hib3IgdG8gYmUgc3Ryb25nZXIgdG8gYmVjb21lIGEgSE8gY2FuZGlkYXRlIikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCA9IGdzbW5ldF9mcm9tX3Z0eSh2dHkpOworCWdzbW5ldC0+aGFuZG92ZXIucHdyX2h5c3RlcmVzaXMgPSBhdG9pKGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9ob19tYXhfZGlzdGFuY2UsIGNmZ19uZXRfaG9fbWF4X2Rpc3RhbmNlX2NtZCwKKyAgICAgICJoYW5kb3ZlciBtYXhpbXVtIGRpc3RhbmNlIDwwLTk5OTk+IiwKKwlIQU5ET1ZFUl9TVFIKKwkiSG93IGJpZyBpcyB0aGUgbWF4aW11bSB0aW1pbmcgYWR2YW5jZSBiZWZvcmUgSE8gaXMgZm9yY2VkIikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCA9IGdzbW5ldF9mcm9tX3Z0eSh2dHkpOworCWdzbW5ldC0+aGFuZG92ZXIubWF4X2Rpc3RhbmNlID0gYXRvaShhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKyNkZWZpbmUgREVDTEFSRV9USU1FUihudW1iZXIsIGRvYykgXAorICAgIERFRlVOKGNmZ19uZXRfVCMjbnVtYmVyLAkJCQkJXAorICAgICAgY2ZnX25ldF9UIyNudW1iZXIjI19jbWQsCQkJCQlcCisgICAgICAidGltZXIgdCIgI251bWJlciAgIiA8MC02NTUzNT4iLAkJCQlcCisgICAgICAiQ29uZmlndXJlIEdTTSBUaW1lcnNcbiIJCQkJCVwKKyAgICAgIGRvYykJCQkJCQkJXAorewkJCQkJCQkJXAorCXN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0ID0gZ3NtbmV0X2Zyb21fdnR5KHZ0eSk7CVwKKwlpbnQgdmFsdWUgPSBhdG9pKGFyZ3ZbMF0pOwkJCQlcCisJCQkJCQkJCVwKKwlpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gNjU1MzUpIHsJCQlcCisJCXZ0eV9vdXQodnR5LCAiVGltZXIgdmFsdWUgJXMgb3V0IG9mIHJhbmdlLiVzIiwJXAorCQkgICAgICAgIGFyZ3ZbMF0sIFZUWV9ORVdMSU5FKTsJCQlcCisJCXJldHVybiBDTURfV0FSTklORzsJCQkJXAorCX0JCQkJCQkJXAorCQkJCQkJCQlcCisJZ3NtbmV0LT5UIyNudW1iZXIgPSB2YWx1ZTsJCQkJXAorCXJldHVybiBDTURfU1VDQ0VTUzsJCQkJCVwKK30KKworREVDTEFSRV9USU1FUigzMTAxLCAiU2V0IHRoZSB0aW1lb3V0IHZhbHVlIGZvciBJTU1FRElBVEUgQVNTSUdOTUVOVC4iKQorREVDTEFSRV9USU1FUigzMTAzLCAiU2V0IHRoZSB0aW1lb3V0IHZhbHVlIGZvciBIQU5ET1ZFUi4iKQorREVDTEFSRV9USU1FUigzMTA1LCAiQ3VycmVudGx5IG5vdCB1c2VkLiIpCitERUNMQVJFX1RJTUVSKDMxMDcsICJDdXJyZW50bHkgbm90IHVzZWQuIikKK0RFQ0xBUkVfVElNRVIoMzEwOSwgIkN1cnJlbnRseSBub3QgdXNlZC4iKQorREVDTEFSRV9USU1FUigzMTExLCAiQ3VycmVudGx5IG5vdCB1c2VkLiIpCitERUNMQVJFX1RJTUVSKDMxMTMsICJTZXQgdGhlIHRpbWUgdG8gdHJ5IHBhZ2luZyBhIHN1YnNjcmliZXIuIikKK0RFQ0xBUkVfVElNRVIoMzExNSwgIkN1cnJlbnRseSBub3QgdXNlZC4iKQorREVDTEFSRV9USU1FUigzMTE3LCAiQ3VycmVudGx5IG5vdCB1c2VkLiIpCitERUNMQVJFX1RJTUVSKDMxMTksICJDdXJyZW50bHkgbm90IHVzZWQuIikKK0RFQ0xBUkVfVElNRVIoMzE0MSwgIkN1cnJlbnRseSBub3QgdXNlZC4iKQorCisKKy8qIHBlci1CVFMgY29uZmlndXJhdGlvbiAqLworREVGVU4oY2ZnX2J0cywKKyAgICAgIGNmZ19idHNfY21kLAorICAgICAgImJ0cyBCVFNfTlIiLAorICAgICAgIlNlbGVjdCBhIEJUUyB0byBjb25maWd1cmVcbiIKKwkiQlRTIE51bWJlclxuIikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCA9IGdzbW5ldF9mcm9tX3Z0eSh2dHkpOworCWludCBidHNfbnIgPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBnc21fYnRzICpidHM7CisKKwlpZiAoYnRzX25yID4gZ3NtbmV0LT5udW1fYnRzKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgVGhlIG5leHQgdW51c2VkIEJUUyBudW1iZXIgaXMgJXUlcyIsCisJCQlnc21uZXQtPm51bV9idHMsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0gZWxzZSBpZiAoYnRzX25yID09IGdzbW5ldC0+bnVtX2J0cykgeworCQkvKiBhbGxvY2F0ZSBhIG5ldyBvbmUgKi8KKwkJYnRzID0gZ3NtX2J0c19hbGxvYyhnc21uZXQsIEdTTV9CVFNfVFlQRV9VTktOT1dOLAorCQkJCSAgICBIQVJEQ09ERURfVFNDLCBIQVJEQ09ERURfQlNJQyk7CisJfSBlbHNlCisJCWJ0cyA9IGdzbV9idHNfbnVtKGdzbW5ldCwgYnRzX25yKTsKKworCWlmICghYnRzKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgVW5hYmxlIHRvIGFsbG9jYXRlIEJUUyAldSVzIiwKKwkJCWdzbW5ldC0+bnVtX2J0cywgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJdnR5LT5pbmRleCA9IGJ0czsKKwl2dHktPmluZGV4X3N1YiA9ICZidHMtPmRlc2NyaXB0aW9uOworCXZ0eS0+bm9kZSA9IEJUU19OT0RFOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX3R5cGUsCisgICAgICBjZmdfYnRzX3R5cGVfY21kLAorICAgICAgInR5cGUgVFlQRSIsCisgICAgICAiU2V0IHRoZSBCVFMgdHlwZVxuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgcmM7CisKKwlyYyA9IGdzbV9zZXRfYnRzX3R5cGUoYnRzLCBwYXJzZV9idHN0eXBlKGFyZ3ZbMF0pKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfYmFuZCwKKyAgICAgIGNmZ19idHNfYmFuZF9jbWQsCisgICAgICAiYmFuZCBCQU5EIiwKKyAgICAgICJTZXQgdGhlIGZyZXF1ZW5jeSBiYW5kIG9mIHRoaXMgQlRTXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCBiYW5kID0gZ3NtX2JhbmRfcGFyc2UoYXJndlswXSk7CisKKwlpZiAoYmFuZCA8IDApIHsKKwkJdnR5X291dCh2dHksICIlJSBCQU5EICVkIGlzIG5vdCBhIHZhbGlkIEdTTSBiYW5kJXMiLAorCQkJYmFuZCwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5iYW5kID0gYmFuZDsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19jaSwKKyAgICAgIGNmZ19idHNfY2lfY21kLAorICAgICAgImNlbGxfaWRlbnRpdHkgPDAtNjU1MzU+IiwKKyAgICAgICJTZXQgdGhlIENlbGwgaWRlbnRpdHkgb2YgdGhpcyBCVFNcbiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IGNpID0gYXRvaShhcmd2WzBdKTsKKworCWlmIChjaSA8IDAgfHwgY2kgPiAweGZmZmYpIHsKKwkJdnR5X291dCh2dHksICIlJSBDSSAlZCBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlICgwLTY1NTM1KSVzIiwKKwkJCWNpLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisJYnRzLT5jZWxsX2lkZW50aXR5ID0gY2k7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfbGFjLAorICAgICAgY2ZnX2J0c19sYWNfY21kLAorICAgICAgImxvY2F0aW9uX2FyZWFfY29kZSA8MC02NTUzNT4iLAorICAgICAgIlNldCB0aGUgTG9jYXRpb24gQXJlYSBDb2RlIChMQUMpIG9mIHRoaXMgQlRTXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCBsYWMgPSBhdG9pKGFyZ3ZbMF0pOworCisJaWYgKGxhYyA8IDAgfHwgbGFjID4gMHhmZmZmKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgTEFDICVkIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2UgKDAtNjU1MzUpJXMiLAorCQkJbGFjLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAobGFjID09IEdTTV9MQUNfUkVTRVJWRURfREVUQUNIRUQgfHwgbGFjID09IEdTTV9MQUNfUkVTRVJWRURfQUxMX0JUUykgeworCQl2dHlfb3V0KHZ0eSwgIiUlIExBQyAlZCBpcyByZXNlcnZlZCBieSBHU00gMDQuMDglcyIsCisJCQlsYWMsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWJ0cy0+bG9jYXRpb25fYXJlYV9jb2RlID0gbGFjOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisKK0RFRlVOKGNmZ19idHNfdHNjLAorICAgICAgY2ZnX2J0c190c2NfY21kLAorICAgICAgInRyYWluaW5nX3NlcXVlbmNlX2NvZGUgPDAtMjU1PiIsCisgICAgICAiU2V0IHRoZSBUcmFpbmluZyBTZXF1ZW5jZSBDb2RlIChUU0MpIG9mIHRoaXMgQlRTXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCB0c2MgPSBhdG9pKGFyZ3ZbMF0pOworCisJaWYgKHRzYyA8IDAgfHwgdHNjID4gMHhmZikgeworCQl2dHlfb3V0KHZ0eSwgIiUlIFRTQyAlZCBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlICgwLTI1NSklcyIsCisJCQl0c2MsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwlidHMtPnRzYyA9IHRzYzsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19ic2ljLAorICAgICAgY2ZnX2J0c19ic2ljX2NtZCwKKyAgICAgICJiYXNlX3N0YXRpb25faWRfY29kZSA8MC02Mz4iLAorICAgICAgIlNldCB0aGUgQmFzZSBTdGF0aW9uIElkZW50aXR5IENvZGUgKEJTSUMpIG9mIHRoaXMgQlRTXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCBic2ljID0gYXRvaShhcmd2WzBdKTsKKworCWlmIChic2ljIDwgMCB8fCBic2ljID4gMHgzZikgeworCQl2dHlfb3V0KHZ0eSwgIiUlIEJTSUMgJWQgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSAoMC0yNTUpJXMiLAorCQkJYnNpYywgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCWJ0cy0+YnNpYyA9IGJzaWM7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKworREVGVU4oY2ZnX2J0c191bml0X2lkLAorICAgICAgY2ZnX2J0c191bml0X2lkX2NtZCwKKyAgICAgICJpcC5hY2Nlc3MgdW5pdF9pZCA8MC02NTUzND4gPDAtMjU1PiIsCisgICAgICAiU2V0IHRoZSBpcC5hY2Nlc3MgQlRTIFVuaXQgSUQgb2YgdGhpcyBCVFNcbiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IHNpdGVfaWQgPSBhdG9pKGFyZ3ZbMF0pOworCWludCBidHNfaWQgPSBhdG9pKGFyZ3ZbMV0pOworCisJaWYgKCFpc19pcGFjY2Vzc19idHMoYnRzKSkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIEJUUyBpcyBub3Qgb2YgaXAuYWNjZXNzIHR5cGUlcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWJ0cy0+aXBfYWNjZXNzLnNpdGVfaWQgPSBzaXRlX2lkOworCWJ0cy0+aXBfYWNjZXNzLmJ0c19pZCA9IGJ0c19pZDsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworI2RlZmluZSBPTUxfU1RSCSJPcmdhbml6YXRpb24gJiBNYWludGVuYW5jZSBMaW5rXG4iCisjZGVmaW5lIElQQV9TVFIgImlwLmFjY2VzcyBTcGVjaWZpYyBPcHRpb25zXG4iCisKK0RFRlVOKGNmZ19idHNfc3RyZWFtX2lkLAorICAgICAgY2ZnX2J0c19zdHJlYW1faWRfY21kLAorICAgICAgIm9tbCBpcC5hY2Nlc3Mgc3RyZWFtX2lkIDwwLTI1NT4iLAorCU9NTF9TVFIgSVBBX1NUUgorICAgICAgIlNldCB0aGUgaXAuYWNjZXNzIFN0cmVhbSBJRCBvZiB0aGUgT01MIGxpbmsgb2YgdGhpcyBCVFNcbiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IHN0cmVhbV9pZCA9IGF0b2koYXJndlswXSk7CisKKwlpZiAoIWlzX2lwYWNjZXNzX2J0cyhidHMpKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgQlRTIGlzIG5vdCBvZiBpcC5hY2Nlc3MgdHlwZSVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5vbWxfdGVpID0gc3RyZWFtX2lkOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisjZGVmaW5lIE9NTF9FMV9TVFIgT01MX1NUUiAiRTEgTGluZVxuIgorCitERUZVTihjZmdfYnRzX29tbF9lMSwKKyAgICAgIGNmZ19idHNfb21sX2UxX2NtZCwKKyAgICAgICJvbWwgZTEgbGluZSBFMV9MSU5FIHRpbWVzbG90IDwxLTMxPiBzdWItc2xvdCAoMHwxfDJ8M3xmdWxsKSIsCisJT01MX0UxX1NUUgorICAgICAgIkUxIGludGVyZmFjZSB0byBiZSB1c2VkIGZvciBPTUxcbiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlwYXJzZV9lMV9saW5rKCZidHMtPm9tbF9lMV9saW5rLCBhcmd2WzBdLCBhcmd2WzFdLCBhcmd2WzJdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworCitERUZVTihjZmdfYnRzX29tbF9lMV90ZWksCisgICAgICBjZmdfYnRzX29tbF9lMV90ZWlfY21kLAorICAgICAgIm9tbCBlMSB0ZWkgPDAtNjM+IiwKKwlPTUxfRTFfU1RSCisgICAgICAiU2V0IHRoZSBURUkgdG8gYmUgdXNlZCBmb3IgT01MIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKworCWJ0cy0+b21sX3RlaSA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfY2hhbGxvYywgY2ZnX2J0c19jaGFsbG9jX2NtZCwKKyAgICAgICJjaGFubmVsIGFsbG9jYXRvciAoYXNjZW5kaW5nfGRlc2NlbmRpbmcpIiwKKwkiQ2hhbm5uZWwgQWxsb2NhdG9yXG4iICJDaGFubmVsIEFsbG9jYXRvclxuIgorCSJBbGxvY2F0ZSBUaW1lc2xvdHMgYW5kIFRyYW5zY2VpdmVycyBpbiBhc2NlbmRpbmcgb3JkZXJcbiIKKwkiQWxsb2NhdGUgVGltZXNsb3RzIGFuZCBUcmFuc2NlaXZlcnMgaW4gZGVzY2VuZGluZyBvcmRlclxuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKworCWlmICghc3RyY21wKGFyZ3ZbMF0sICJhc2NlbmRpbmciKSkKKwkJYnRzLT5jaGFuX2FsbG9jX3JldmVyc2UgPSAwOworCWVsc2UKKwkJYnRzLT5jaGFuX2FsbG9jX3JldmVyc2UgPSAxOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisjZGVmaW5lIFJBQ0hfU1RSICJSYW5kb20gQWNjZXNzIENvbnRyb2wgQ2hhbm5lbFxuIgorCitERUZVTihjZmdfYnRzX3JhY2hfdHhfaW50ZWdlciwKKyAgICAgIGNmZ19idHNfcmFjaF90eF9pbnRlZ2VyX2NtZCwKKyAgICAgICJyYWNoIHR4IGludGVnZXIgPDAtMTU+IiwKKwlSQUNIX1NUUgorICAgICAgIlNldCB0aGUgcmF3IHR4IGludGVnZXIgdmFsdWUgaW4gUkFDSCBDb250cm9sIHBhcmFtZXRlcnMgSUUiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC50eF9pbnRlZ2VyID0gYXRvaShhcmd2WzBdKSAmIDB4ZjsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfcmFjaF9tYXhfdHJhbnMsCisgICAgICBjZmdfYnRzX3JhY2hfbWF4X3RyYW5zX2NtZCwKKyAgICAgICJyYWNoIG1heCB0cmFuc21pc3Npb24gKDF8Mnw0fDcpIiwKKwlSQUNIX1NUUgorICAgICAgIlNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgUkFDSCBidXJzdCB0cmFuc21pc3Npb25zIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wubWF4X3RyYW5zID0gcmFjaF9tYXhfdHJhbnNfdmFsMnJhdyhhdG9pKGFyZ3ZbMF0pKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKyNkZWZpbmUgTk1fU1RSICJOZXR3b3JrIE1hbmFnZW1lbnRcbiIKKworREVGVU4oY2ZnX2J0c19yYWNoX25tX2JfdGhyZXNoLAorICAgICAgY2ZnX2J0c19yYWNoX25tX2JfdGhyZXNoX2NtZCwKKyAgICAgICJyYWNoIG5tIGJ1c3kgdGhyZXNob2xkIDwwLTI1NT4iLAorCVJBQ0hfU1RSIE5NX1NUUgorICAgICAgIlNldCB0aGUgTk0gQnVzeSBUaHJlc2hvbGQgaW4gZEIiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWJ0cy0+cmFjaF9iX3RocmVzaCA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX3JhY2hfbm1fbGRhdmcsCisgICAgICBjZmdfYnRzX3JhY2hfbm1fbGRhdmdfY21kLAorICAgICAgInJhY2ggbm0gbG9hZCBhdmVyYWdlIDwwLTY1NTM1PiIsCisJUkFDSF9TVFIgTk1fU1RSCisgICAgICAiU2V0IHRoZSBOTSBMb2FkYXZlcmFnZSBTbG90cyB2YWx1ZSIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJYnRzLT5yYWNoX2xkYXZnX3Nsb3RzID0gYXRvaShhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfY2VsbF9iYXJyZWQsIGNmZ19idHNfY2VsbF9iYXJyZWRfY21kLAorICAgICAgImNlbGwgYmFycmVkICgwfDEpIiwKKyAgICAgICJTaG91bGQgdGhpcyBjZWxsIGJlIGJhcnJlZCBmcm9tIGFjY2Vzcz8iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLmNlbGxfYmFyID0gYXRvaShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19yYWNoX2VjX2FsbG93ZWQsIGNmZ19idHNfcmFjaF9lY19hbGxvd2VkX2NtZCwKKyAgICAgICJyYWNoIGVtZXJnZW5jeSBjYWxsIGFsbG93ZWQgKDB8MSkiLAorICAgICAgIlNob3VsZCB0aGlzIGNlbGwgYWxsb3cgZW1lcmdlbmN5IGNhbGxzPyIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlpZiAoYXRvaShhcmd2WzBdKSA9PSAwKQorCQlidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wudDIgfD0gMHg0OworCWVsc2UKKwkJYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLnQyICY9IH4weDQ7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfbXNfbWF4X3Bvd2VyLCBjZmdfYnRzX21zX21heF9wb3dlcl9jbWQsCisgICAgICAibXMgbWF4IHBvd2VyIDwwLTQwPiIsCisgICAgICAiTWF4aW11bSB0cmFuc21pdCBwb3dlciBvZiB0aGUgTVMiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJYnRzLT5tc19tYXhfcG93ZXIgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2NlbGxfcmVzZWxfaHlzdCwgY2ZnX2J0c19jZWxsX3Jlc2VsX2h5c3RfY21kLAorICAgICAgImNlbGwgcmVzZWxlY3Rpb24gaHlzdGVyZXNpcyA8MC0xND4iLAorICAgICAgIkNlbGwgUmUtU2VsZWN0aW9uIEh5c3RlcmVzaXMgaW4gZEIiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyLmNlbGxfcmVzZWxfaHlzdCA9IGF0b2koYXJndlswXSkvMjsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19yeGxldl9hY2NfbWluLCBjZmdfYnRzX3J4bGV2X2FjY19taW5fY21kLAorICAgICAgInJ4bGV2IGFjY2VzcyBtaW4gPDAtNjM+IiwKKyAgICAgICJNaW5pbXVtIFJ4TGV2IG5lZWRlZCBmb3IgY2VsbCBhY2Nlc3MgKGJldHRlciB0aGFuIC0xMTBkQm0pIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKworCWJ0cy0+c2lfY29tbW9uLmNlbGxfc2VsX3Bhci5yeGxldl9hY2NfbWluID0gYXRvaShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19wZXJfbG9jX3VwZCwgY2ZnX2J0c19wZXJfbG9jX3VwZF9jbWQsCisgICAgICAicGVyaW9kaWMgbG9jYXRpb24gdXBkYXRlIDwwLTE1MzA+IiwKKyAgICAgICJQZXJpb2RpYyBMb2NhdGlvbiBVcGRhdGluZyBJbnRlcnZhbCBpbiBNaW51dGVzIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKworCWJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy50MzIxMiA9IGF0b2koYXJndlswXSkgLyAxMDsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworI2RlZmluZSBHUFJTX1RFWFQJIkdQUlMgUGFja2V0IE5ldHdvcmtcbiIKKworREVGVU4oY2ZnX2J0c19wcnNfYnZjaSwgY2ZnX2J0c19ncHJzX2J2Y2lfY21kLAorCSJncHJzIGNlbGwgYnZjaSA8Mi02NTUzNT4iLAorCUdQUlNfVEVYVAorCSJHUFJTIENlbGwgU2V0dGluZ3NcbiIKKwkiR1BSUyBCU1NHUCBWQyBJZGVudGlmaWVyIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKworCWlmIChidHMtPmdwcnMubW9kZSA9PSBCVFNfR1BSU19OT05FKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgR1BSUyBub3QgZW5hYmxlZCBvbiB0aGlzIEJUUyVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5ncHJzLmNlbGwuYnZjaSA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfZ3Byc19uc2VpLCBjZmdfYnRzX2dwcnNfbnNlaV9jbWQsCisJImdwcnMgbnNlaSA8MC02NTUzNT4iLAorCUdQUlNfVEVYVAorCSJHUFJTIE5TIEVudGl0eSBJZGVudGlmaWVyIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKworCWlmIChidHMtPmdwcnMubW9kZSA9PSBCVFNfR1BSU19OT05FKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgR1BSUyBub3QgZW5hYmxlZCBvbiB0aGlzIEJUUyVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5ncHJzLm5zZS5uc2VpID0gYXRvaShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworI2RlZmluZSBOU1ZDX1RFWFQgIk5ldHdvcmsgU2VydmljZSBWaXJ0dWFsIENvbm5lY3Rpb24gKE5TLVZDKVxuIiBcCisJCSJOU1ZDIExvZ2ljYWwgTnVtYmVyXG4iCisKK0RFRlVOKGNmZ19idHNfZ3Byc19uc3ZjaSwgY2ZnX2J0c19ncHJzX25zdmNpX2NtZCwKKwkiZ3BycyBuc3ZjIDwwLTE+IG5zdmNpIDwwLTY1NTM1PiIsCisJR1BSU19URVhUIE5TVkNfVEVYVAorCSJOUyBWaXJ0dWFsIENvbm5lY3Rpb24gSWRlbnRpZmllclxuIgorCSJHUFJTIE5TIFZDIElkZW50aWZpZXIiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCBpZHggPSBhdG9pKGFyZ3ZbMF0pOworCisJaWYgKGJ0cy0+Z3Bycy5tb2RlID09IEJUU19HUFJTX05PTkUpIHsKKwkJdnR5X291dCh2dHksICIlJSBHUFJTIG5vdCBlbmFibGVkIG9uIHRoaXMgQlRTJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlidHMtPmdwcnMubnN2Y1tpZHhdLm5zdmNpID0gYXRvaShhcmd2WzFdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19ncHJzX25zdmNfbHBvcnQsIGNmZ19idHNfZ3Byc19uc3ZjX2xwb3J0X2NtZCwKKwkiZ3BycyBuc3ZjIDwwLTE+IGxvY2FsIHVkcCBwb3J0IDwwLTY1NTM1PiIsCisJR1BSU19URVhUIE5TVkNfVEVYVAorCSJHUFJTIE5TIExvY2FsIFVEUCBQb3J0IikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgaWR4ID0gYXRvaShhcmd2WzBdKTsKKworCWlmIChidHMtPmdwcnMubW9kZSA9PSBCVFNfR1BSU19OT05FKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgR1BSUyBub3QgZW5hYmxlZCBvbiB0aGlzIEJUUyVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5ncHJzLm5zdmNbaWR4XS5sb2NhbF9wb3J0ID0gYXRvaShhcmd2WzFdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19ncHJzX25zdmNfcnBvcnQsIGNmZ19idHNfZ3Byc19uc3ZjX3Jwb3J0X2NtZCwKKwkiZ3BycyBuc3ZjIDwwLTE+IHJlbW90ZSB1ZHAgcG9ydCA8MC02NTUzNT4iLAorCUdQUlNfVEVYVCBOU1ZDX1RFWFQKKwkiR1BSUyBOUyBSZW1vdGUgVURQIFBvcnQiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCBpZHggPSBhdG9pKGFyZ3ZbMF0pOworCisJaWYgKGJ0cy0+Z3Bycy5tb2RlID09IEJUU19HUFJTX05PTkUpIHsKKwkJdnR5X291dCh2dHksICIlJSBHUFJTIG5vdCBlbmFibGVkIG9uIHRoaXMgQlRTJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlidHMtPmdwcnMubnN2Y1tpZHhdLnJlbW90ZV9wb3J0ID0gYXRvaShhcmd2WzFdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19ncHJzX25zdmNfcmlwLCBjZmdfYnRzX2dwcnNfbnN2Y19yaXBfY21kLAorCSJncHJzIG5zdmMgPDAtMT4gcmVtb3RlIGlwIEEuQi5DLkQiLAorCUdQUlNfVEVYVCBOU1ZDX1RFWFQKKwkiR1BSUyBOUyBSZW1vdGUgSVAgQWRkcmVzcyIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IGlkeCA9IGF0b2koYXJndlswXSk7CisJc3RydWN0IGluX2FkZHIgaWE7CisKKwlpZiAoYnRzLT5ncHJzLm1vZGUgPT0gQlRTX0dQUlNfTk9ORSkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIEdQUlMgbm90IGVuYWJsZWQgb24gdGhpcyBCVFMlcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWluZXRfYXRvbihhcmd2WzFdLCAmaWEpOworCWJ0cy0+Z3Bycy5uc3ZjW2lkeF0ucmVtb3RlX2lwID0gbnRvaGwoaWEuc19hZGRyKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19ncHJzX25zX3RpbWVyLCBjZmdfYnRzX2dwcnNfbnNfdGltZXJfY21kLAorCSJncHJzIG5zIHRpbWVyICIgTlNfVElNRVJTICIgPDAtMjU1PiIsCisJR1BSU19URVhUICJOZXR3b3JrIFNlcnZpY2VcbiIKKwkiTmV0d29yayBTZXJ2aWNlIFRpbWVyXG4iCisJTlNfVElNRVJTX0hFTFAgIlRpbWVyIFZhbHVlXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCBpZHggPSBnZXRfc3RyaW5nX3ZhbHVlKGdwcnNfbnNfdGltZXJfc3RycywgYXJndlswXSk7CisJaW50IHZhbCA9IGF0b2koYXJndlsxXSk7CisKKwlpZiAoYnRzLT5ncHJzLm1vZGUgPT0gQlRTX0dQUlNfTk9ORSkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIEdQUlMgbm90IGVuYWJsZWQgb24gdGhpcyBCVFMlcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWlmIChpZHggPCAwIHx8IGlkeCA+PSBBUlJBWV9TSVpFKGJ0cy0+Z3Bycy5uc2UudGltZXIpKQorCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisKKwlidHMtPmdwcnMubnNlLnRpbWVyW2lkeF0gPSB2YWw7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKyNkZWZpbmUgQlNTR1BfVElNRVJTICIoYmxvY2tpbmctdGltZXJ8YmxvY2tpbmctcmV0cmllc3x1bmJsb2NraW5nLXJldHJpZXN8cmVzZXQtdGltZXJ8cmVzZXQtcmV0cmllc3xzdXNwZW5kLXRpbWVyfHN1c3BlbmQtcmV0cmllc3xyZXN1bWUtdGltZXJ8cmVzdW1lLXJldHJpZXN8Y2FwYWJpbGl0eS11cGRhdGUtdGltZXJ8Y2FwYWJpbGl0eS11cGRhdGUtcmV0cmllcykiCisjZGVmaW5lIEJTU0dQX1RJTUVSU19IRUxQCVwKKwkiVGJ2Yy1ibG9jayB0aW1lb3V0XG4iCQkJXAorCSJUYnZjLWJsb2NrIHJldHJpZXNcbiIJCQlcCisJIlRidmMtdW5ibG9jayByZXRyaWVzXG4iCQlcCisJIlRidmNjLXJlc2V0IHRpbWVvdXRcbiIJCQlcCisJIlRidmMtcmVzZXQgcmV0cmllc1xuIgkJCVwKKwkiVGJ2Yy1zdXNwZW5kIHRpbWVvdXRcbiIJCVwKKwkiVGJ2Yy1zdXNwZW5kIHJldHJpZXNcbiIJCVwKKwkiVGJ2Yy1yZXN1bWUgdGltZW91dFxuIgkJCVwKKwkiVGJ2Yy1yZXN1bWUgcmV0cmllc1xuIgkJCVwKKwkiVGJ2Yy1jYXBhLXVwZGF0ZSB0aW1lb3V0XG4iCQlcCisJIlRidmMtY2FwYS11cGRhdGUgcmV0cmllc1xuIgorCitERUZVTihjZmdfYnRzX2dwcnNfY2VsbF90aW1lciwgY2ZnX2J0c19ncHJzX2NlbGxfdGltZXJfY21kLAorCSJncHJzIGNlbGwgdGltZXIgIiBCU1NHUF9USU1FUlMgIiA8MC0yNTU+IiwKKwlHUFJTX1RFWFQgIkNlbGwgLyBCU1NHUFxuIgorCSJDZWxsL0JTU0dQIFRpbWVyXG4iCisJQlNTR1BfVElNRVJTX0hFTFAgIlRpbWVyIFZhbHVlXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCBpZHggPSBnZXRfc3RyaW5nX3ZhbHVlKGdwcnNfYnNzZ3BfY2ZnX3N0cnMsIGFyZ3ZbMF0pOworCWludCB2YWwgPSBhdG9pKGFyZ3ZbMV0pOworCisJaWYgKGJ0cy0+Z3Bycy5tb2RlID09IEJUU19HUFJTX05PTkUpIHsKKwkJdnR5X291dCh2dHksICIlJSBHUFJTIG5vdCBlbmFibGVkIG9uIHRoaXMgQlRTJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAoaWR4IDwgMCB8fCBpZHggPj0gQVJSQVlfU0laRShidHMtPmdwcnMuY2VsbC50aW1lcikpCisJCXJldHVybiBDTURfV0FSTklORzsKKworCWJ0cy0+Z3Bycy5jZWxsLnRpbWVyW2lkeF0gPSB2YWw7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfZ3Byc19yYWMsIGNmZ19idHNfZ3Byc19yYWNfY21kLAorCSJncHJzIHJvdXRpbmcgYXJlYSA8MC0yNTU+IiwKKwlHUFJTX1RFWFQKKwkiR1BSUyBSb3V0aW5nIEFyZWEgQ29kZSIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlpZiAoYnRzLT5ncHJzLm1vZGUgPT0gQlRTX0dQUlNfTk9ORSkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIEdQUlMgbm90IGVuYWJsZWQgb24gdGhpcyBCVFMlcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWJ0cy0+Z3Bycy5yYWMgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2dwcnNfbW9kZSwgY2ZnX2J0c19ncHJzX21vZGVfY21kLAorCSJncHJzIG1vZGUgKG5vbmV8Z3Byc3xlZ3BycykiLAorCUdQUlNfVEVYVAorCSJHUFJTIE1vZGUgZm9yIHRoaXMgQlRTXG4iCisJIkdQUlMgRGlzYWJsZWQgb24gdGhpcyBCVFNcbiIKKwkiR1BSUyBFbmFibGVkIG9uIHRoaXMgQlRTXG4iCisJIkVHUFJTIChFREdFKSBFbmFibGVkIG9uIHRoaXMgQlRTXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJYnRzLT5ncHJzLm1vZGUgPSBidHNfZ3Byc19tb2RlX3BhcnNlKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisjZGVmaW5lIFRSWF9URVhUICJSYWRpbyBUcmFuc2NlaXZlclxuIgorCisvKiBwZXIgVFJYIGNvbmZpZ3VyYXRpb24gKi8KK0RFRlVOKGNmZ190cngsCisgICAgICBjZmdfdHJ4X2NtZCwKKyAgICAgICJ0cnggVFJYX05SIiwKKwlUUlhfVEVYVAorICAgICAgIlNlbGVjdCBhIFRSWCB0byBjb25maWd1cmUiKQoreworCWludCB0cnhfbnIgPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCisJaWYgKHRyeF9uciA+IGJ0cy0+bnVtX3RyeCkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIFRoZSBuZXh0IHVudXNlZCBUUlggbnVtYmVyIGluIHRoaXMgQlRTIGlzICV1JXMiLAorCQkJYnRzLT5udW1fdHJ4LCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9IGVsc2UgaWYgKHRyeF9uciA9PSBidHMtPm51bV90cngpIHsKKwkJLyogd2UgbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBvbmUgKi8KKwkJdHJ4ID0gZ3NtX2J0c190cnhfYWxsb2MoYnRzKTsKKwl9IGVsc2UKKwkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgdHJ4X25yKTsKKworCWlmICghdHJ4KQorCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisKKwl2dHktPmluZGV4ID0gdHJ4OworCXZ0eS0+aW5kZXhfc3ViID0gJnRyeC0+ZGVzY3JpcHRpb247CisJdnR5LT5ub2RlID0gVFJYX05PREU7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ190cnhfYXJmY24sCisgICAgICBjZmdfdHJ4X2FyZmNuX2NtZCwKKyAgICAgICJhcmZjbiA8MC0xMDI0PiIsCisgICAgICAiU2V0IHRoZSBBUkZDTiBmb3IgdGhpcyBUUlhcbiIpCit7CisJaW50IGFyZmNuID0gYXRvaShhcmd2WzBdKTsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IHZ0eS0+aW5kZXg7CisKKwkvKiBGSVhNRTogY2hlY2sgaWYgdGhpcyBBUkZDTiBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBUUlggKi8KKworCXRyeC0+YXJmY24gPSBhcmZjbjsKKworCS8qIEZJWE1FOiBwYXRjaCBBUkZDTiBpbnRvIFNZU1RFTSBJTkZPUk1BVElPTiAqLworCS8qIEZJWE1FOiB1c2UgT01MIGxheWVyIHRvIHVwZGF0ZSB0aGUgQVJGQ04gKi8KKwkvKiBGSVhNRTogdXNlIFJTTCBsYXllciB0byB1cGRhdGUgU1lTVEVNIElORk9STUFUSU9OICovCisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ190cnhfbm9taW5hbF9wb3dlciwKKyAgICAgIGNmZ190cnhfbm9taW5hbF9wb3dlcl9jbWQsCisgICAgICAibm9taW5hbCBwb3dlciA8MC0xMDA+IiwKKyAgICAgICJOb21pbmFsIFRSWCBSRiBQb3dlciBpbiBkQlxuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IHZ0eS0+aW5kZXg7CisKKwl0cngtPm5vbWluYWxfcG93ZXIgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfdHJ4X21heF9wb3dlcl9yZWQsCisgICAgICBjZmdfdHJ4X21heF9wb3dlcl9yZWRfY21kLAorICAgICAgIm1heF9wb3dlcl9yZWQgPDAtMTAwPiIsCisgICAgICAiUmVkdWN0aW9uIG9mIG1heGltdW0gQlMgUkYgUG93ZXIgaW4gZEJcbiIpCit7CisJaW50IG1heHB3cl9yID0gYXRvaShhcmd2WzBdKTsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IHZ0eS0+aW5kZXg7CisJaW50IHVwcGVyX2xpbWl0ID0gMjQ7CS8qIGRlZmF1bHQgMTIuMjEgbWF4IHBvd2VyIHJlZC4gKi8KKworCS8qIEZJWE1FOiBjaGVjayBpZiBvdXIgQlRTIHR5cGUgc3VwcG9ydHMgbW9yZSB0aGFuIDEyICovCisJaWYgKG1heHB3cl9yIDwgMCB8fCBtYXhwd3JfciA+IHVwcGVyX2xpbWl0KSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgUG93ZXIgJWQgZEIgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSVzIiwKKwkJCW1heHB3cl9yLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisJaWYgKG1heHB3cl9yICYgMSkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIFBvd2VyICVkIGRCIGlzIG5vdCBhbiBldmVuIHZhbHVlJXMiLAorCQkJbWF4cHdyX3IsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCXRyeC0+bWF4X3Bvd2VyX3JlZCA9IG1heHB3cl9yOworCisJLyogRklYTUU6IG1ha2Ugc3VyZSB3ZSB1cGRhdGUgdGhpcyB1c2luZyBPTUwgKi8KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX3RyeF9yc2xfZTEsCisgICAgICBjZmdfdHJ4X3JzbF9lMV9jbWQsCisgICAgICAicnNsIGUxIGxpbmUgRTFfTElORSB0aW1lc2xvdCA8MS0zMT4gc3ViLXNsb3QgKDB8MXwyfDN8ZnVsbCkiLAorICAgICAgIkUxIGludGVyZmFjZSB0byBiZSB1c2VkIGZvciBSU0xcbiIpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSB2dHktPmluZGV4OworCisJcGFyc2VfZTFfbGluaygmdHJ4LT5yc2xfZTFfbGluaywgYXJndlswXSwgYXJndlsxXSwgYXJndlsyXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ190cnhfcnNsX2UxX3RlaSwKKyAgICAgIGNmZ190cnhfcnNsX2UxX3RlaV9jbWQsCisgICAgICAicnNsIGUxIHRlaSA8MC02Mz4iLAorICAgICAgIlNldCB0aGUgVEVJIHRvIGJlIHVzZWQgZm9yIFJTTCIpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSB2dHktPmluZGV4OworCisJdHJ4LT5yc2xfdGVpID0gYXRvaShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX3RyeF9yZl9sb2NrZWQsCisgICAgICBjZmdfdHJ4X3JmX2xvY2tlZF9jbWQsCisgICAgICAicmZfbG9ja2VkICgwfDEpIiwKKyAgICAgICJUdXJuIG9mZiBSRiBvZiB0aGUgVFJYLlxuIikKK3sKKwlpbnQgbG9ja2VkID0gYXRvaShhcmd2WzBdKTsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IHZ0eS0+aW5kZXg7CisKKwlnc21fdHJ4X2xvY2tfcmYodHJ4LCBsb2NrZWQpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogcGVyIFRTIGNvbmZpZ3VyYXRpb24gKi8KK0RFRlVOKGNmZ190cywKKyAgICAgIGNmZ190c19jbWQsCisgICAgICAidGltZXNsb3QgPDAtNz4iLAorICAgICAgIlNlbGVjdCBhIFRpbWVzbG90IHRvIGNvbmZpZ3VyZSIpCit7CisJaW50IHRzX25yID0gYXRvaShhcmd2WzBdKTsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IHZ0eS0+aW5kZXg7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0czsKKworCWlmICh0c19uciA+PSBUUlhfTlJfVFMpIHsKKwkJdnR5X291dCh2dHksICIlJSBBIEdTTSBUUlggb25seSBoYXMgJXUgVGltZXNsb3RzIHBlciBUUlglcyIsCisJCQlUUlhfTlJfVFMsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCXRzID0gJnRyeC0+dHNbdHNfbnJdOworCisJdnR5LT5pbmRleCA9IHRzOworCXZ0eS0+bm9kZSA9IFRTX05PREU7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ190c19wY2hhbiwKKyAgICAgIGNmZ190c19wY2hhbl9jbWQsCisgICAgICAicGh5c19jaGFuX2NvbmZpZyBQQ0hBTiIsCisgICAgICAiUGh5c2ljYWwgQ2hhbm5lbCBjb25maWd1cmF0aW9uIChUQ0gvU0RDQ0gvLi4uKSIpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9IHZ0eS0+aW5kZXg7CisJaW50IHBjaGFuYzsKKworCXBjaGFuYyA9IGdzbV9wY2hhbl9wYXJzZShhcmd2WzBdKTsKKwlpZiAocGNoYW5jIDwgMCkKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCisJdHMtPnBjaGFuID0gcGNoYW5jOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfdHNfZTFfc3Vic2xvdCwKKyAgICAgIGNmZ190c19lMV9zdWJzbG90X2NtZCwKKyAgICAgICJlMSBsaW5lIEUxX0xJTkUgdGltZXNsb3QgPDEtMzE+IHN1Yi1zbG90ICgwfDF8MnwzfGZ1bGwpIiwKKyAgICAgICJFMSBzdWItc2xvdCBjb25uZWN0ZWQgdG8gdGhpcyBvbi1haXIgdGltZXNsb3QiKQoreworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMgPSB2dHktPmluZGV4OworCisJcGFyc2VfZTFfbGluaygmdHMtPmUxX2xpbmssIGFyZ3ZbMF0sIGFyZ3ZbMV0sIGFyZ3ZbMl0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCit2b2lkIG9wZW5ic2NfdnR5X3ByaW50X3N0YXRpc3RpY3Moc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCkKK3sKKwl2dHlfb3V0KHZ0eSwgIkNoYW5uZWwgUmVxdWVzdHMgICAgICAgIDogJWx1IHRvdGFsLCAlbHUgbm8gY2hhbm5lbCVzIiwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5jaHJlcS50b3RhbCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuY2hyZXEubm9fY2hhbm5lbCksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIkNoYW5uZWwgRmFpbHVyZXMgICAgICAgIDogJWx1IHJmX2ZhaWx1cmVzLCAlbHUgcmxsIGZhaWx1cmVzJXMiLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmNoYW4ucmZfZmFpbCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuY2hhbi5ybGxfZXJyKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiUGFnaW5nICAgICAgICAgICAgICAgICAgOiAlbHUgYXR0ZW1wdGVkLCAlbHUgY29tcGxldGUsICVsdSBleHBpcmVkJXMiLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnBhZ2luZy5hdHRlbXB0ZWQpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnBhZ2luZy5jb21wbGV0ZWQpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnBhZ2luZy5leHBpcmVkKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiQlRTIGZhaWx1cmVzICAgICAgICAgICAgOiAlbHUgT01MLCAlbHUgUlNMJXMiLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmJ0cy5vbWxfZmFpbCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuYnRzLnJzbF9mYWlsKSwgVlRZX05FV0xJTkUpOworfQorCitERUZVTihsb2dnaW5nX2ZsdHJfaW1zaSwKKyAgICAgIGxvZ2dpbmdfZmx0cl9pbXNpX2NtZCwKKyAgICAgICJsb2dnaW5nIGZpbHRlciBpbXNpIElNU0kiLAorCUxPR0dJTkdfU1RSIEZJTFRFUl9TVFIKKyAgICAgICJGaWx0ZXIgbG9nIG1lc3NhZ2VzIGJ5IElNU0lcbiIgIklNU0kgdG8gYmUgdXNlZCBhcyBmaWx0ZXJcbiIpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOworCisJY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OworCWlmICghY29ubi0+ZGJnKSB7CisJCXZ0eV9vdXQodnR5LCAiTG9nZ2luZyB3YXMgbm90IGVuYWJsZWQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlsb2dfc2V0X2ltc2lfZmlsdGVyKGNvbm4tPmRiZywgYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitleHRlcm4gaW50IGJzY192dHlfaW5pdF9leHRyYSh2b2lkKTsKK2V4dGVybiBjb25zdCBjaGFyICpvcGVuYnNjX2NvcHlyaWdodDsKKworaW50IGJzY192dHlfaW5pdCh2b2lkKQoreworCWluc3RhbGxfZWxlbWVudF92ZSgmc2hvd19uZXRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnNob3dfYnRzX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50X3ZlKCZzaG93X3RyeF9jbWQpOworCWluc3RhbGxfZWxlbWVudF92ZSgmc2hvd190c19jbWQpOworCWluc3RhbGxfZWxlbWVudF92ZSgmc2hvd19sY2hhbl9jbWQpOworCWluc3RhbGxfZWxlbWVudF92ZSgmc2hvd19sY2hhbl9zdW1tYXJ5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50X3ZlKCZsb2dnaW5nX2ZsdHJfaW1zaV9jbWQpOworCisJaW5zdGFsbF9lbGVtZW50X3ZlKCZzaG93X2UxZHJ2X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50X3ZlKCZzaG93X2UxbGluZV9jbWQpOworCWluc3RhbGxfZWxlbWVudF92ZSgmc2hvd19lMXRzX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnNob3dfcGFnaW5nX2NtZCk7CisKKwlsb2dnaW5nX3Z0eV9hZGRfY21kcygpOworCisJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmY2ZnX25ldF9jbWQpOworCWluc3RhbGxfbm9kZSgmbmV0X25vZGUsIGNvbmZpZ193cml0ZV9uZXQpOworCWluc3RhbGxfZGVmYXVsdChHU01ORVRfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmb3Vybm9kZV9leGl0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmb3Vybm9kZV9lbmRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X25jY19jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfbW5jX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9uYW1lX3Nob3J0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9uYW1lX2xvbmdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2F1dGhfcG9saWN5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9yZWplY3RfY2F1c2VfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2VuY3J5cHRpb25fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X25lY2lfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X3JybHBfbW9kZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfbW1faW5mb19jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfaGFuZG92ZXJfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2hvX3dpbl9yeGxldl9hdmdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2hvX3dpbl9yeHF1YWxfYXZnX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9ob193aW5fcnhsZXZfYXZnX25laWdoX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9ob19wd3JfaW50ZXJ2YWxfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2hvX3B3cl9oeXN0ZXJlc2lzX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9ob19tYXhfZGlzdGFuY2VfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTAxX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9UMzEwM19jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfVDMxMDVfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTA3X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9UMzEwOV9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfVDMxMTFfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTEzX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9UMzExNV9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfVDMxMTdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTE5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9UMzE0MV9jbWQpOworCisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX2J0c19jbWQpOworCWluc3RhbGxfbm9kZSgmYnRzX25vZGUsIGNvbmZpZ193cml0ZV9idHMpOworCWluc3RhbGxfZGVmYXVsdChCVFNfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmb3Vybm9kZV9leGl0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmb3Vybm9kZV9lbmRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3R5cGVfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfZGVzY3JpcHRpb25fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfbm9fZGVzY3JpcHRpb25fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2JhbmRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2NpX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19sYWNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3RzY19jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfYnNpY19jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfdW5pdF9pZF9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfc3RyZWFtX2lkX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19vbWxfZTFfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX29tbF9lMV90ZWlfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2NoYWxsb2NfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3JhY2hfdHhfaW50ZWdlcl9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfcmFjaF9tYXhfdHJhbnNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3JhY2hfbm1fYl90aHJlc2hfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3JhY2hfbm1fbGRhdmdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2NlbGxfYmFycmVkX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19yYWNoX2VjX2FsbG93ZWRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX21zX21heF9wb3dlcl9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfcGVyX2xvY191cGRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2NlbGxfcmVzZWxfaHlzdF9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfcnhsZXZfYWNjX21pbl9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfZ3Byc19tb2RlX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19ncHJzX25zX3RpbWVyX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19ncHJzX3JhY19jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfZ3Byc19idmNpX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19ncHJzX2NlbGxfdGltZXJfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2dwcnNfbnNlaV9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfZ3Byc19uc3ZjaV9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfZ3Byc19uc3ZjX2xwb3J0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19ncHJzX25zdmNfcnBvcnRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2dwcnNfbnN2Y19yaXBfY21kKTsKKworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ190cnhfY21kKTsKKwlpbnN0YWxsX25vZGUoJnRyeF9ub2RlLCBkdW1teV9jb25maWdfd3JpdGUpOworCWluc3RhbGxfZGVmYXVsdChUUlhfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KFRSWF9OT0RFLCAmb3Vybm9kZV9leGl0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFRSWF9OT0RFLCAmb3Vybm9kZV9lbmRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVFJYX05PREUsICZjZmdfdHJ4X2FyZmNuX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFRSWF9OT0RFLCAmY2ZnX2Rlc2NyaXB0aW9uX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFRSWF9OT0RFLCAmY2ZnX25vX2Rlc2NyaXB0aW9uX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFRSWF9OT0RFLCAmY2ZnX3RyeF9ub21pbmFsX3Bvd2VyX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFRSWF9OT0RFLCAmY2ZnX3RyeF9tYXhfcG93ZXJfcmVkX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFRSWF9OT0RFLCAmY2ZnX3RyeF9yc2xfZTFfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVFJYX05PREUsICZjZmdfdHJ4X3JzbF9lMV90ZWlfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVFJYX05PREUsICZjZmdfdHJ4X3JmX2xvY2tlZF9jbWQpOworCisJaW5zdGFsbF9lbGVtZW50KFRSWF9OT0RFLCAmY2ZnX3RzX2NtZCk7CisJaW5zdGFsbF9ub2RlKCZ0c19ub2RlLCBkdW1teV9jb25maWdfd3JpdGUpOworCWluc3RhbGxfZGVmYXVsdChUU19OT0RFKTsKKwlpbnN0YWxsX2VsZW1lbnQoVFNfTk9ERSwgJm91cm5vZGVfZXhpdF9jbWQpOworCWluc3RhbGxfZWxlbWVudChUU19OT0RFLCAmb3Vybm9kZV9lbmRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVFNfTk9ERSwgJmNmZ190c19wY2hhbl9jbWQpOworCWluc3RhbGxfZWxlbWVudChUU19OT0RFLCAmY2ZnX3RzX2UxX3N1YnNsb3RfY21kKTsKKworCWJzY192dHlfaW5pdF9leHRyYSgpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9idHNfaXBhY2Nlc3NfbmFub2J0cy5jIGIvb3BlbmJzYy9zcmMvYnRzX2lwYWNjZXNzX25hbm9idHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjQ4ZWE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvYnRzX2lwYWNjZXNzX25hbm9idHMuYwpAQCAtMCwwICsxLDg0IEBACisvKiBpcC5hY2Nlc3MgbmFub0JUUyBzcGVjaWZpYyBjb2RlICovCisKKy8qIChDKSAyMDA5LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorCitzdGF0aWMgc3RydWN0IGdzbV9idHNfbW9kZWwgbW9kZWxfbmFub2J0cyA9IHsKKwkudHlwZSA9IEdTTV9CVFNfVFlQRV9OQU5PQlRTLAorCS5ubV9hdHRfdGx2ZGVmID0geworCQkuZGVmID0geworCQkJLyogaXAuYWNjZXNzIHNwZWNpZmljcyAqLworCQkJW05NX0FUVF9JUEFDQ19EU1RfSVBdID0JCXsgVExWX1RZUEVfRklYRUQsIDQgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfRFNUX0lQX1BPUlRdID0JeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQkJW05NX0FUVF9JUEFDQ19TVFJFQU1fSURdID0JeyBUTFZfVFlQRV9UViwgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfRlJFUV9DVFJMXSA9CXsgVExWX1RZUEVfVFYsIH0sCisJCQlbTk1fQVRUX0lQQUNDX1NFQ19PTUxfQ0ZHXSA9CXsgVExWX1RZUEVfRklYRUQsIDYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfSVBfSUZfQ0ZHXSA9CXsgVExWX1RZUEVfRklYRUQsIDggfSwKKwkJCVtOTV9BVFRfSVBBQ0NfSVBfR1dfQ0ZHXSA9CXsgVExWX1RZUEVfRklYRUQsIDEyIH0sCisJCQlbTk1fQVRUX0lQQUNDX0lOX1NFUlZfVElNRV0gPQl7IFRMVl9UWVBFX0ZJWEVELCA0IH0sCisJCQlbTk1fQVRUX0lQQUNDX0xPQ0FUSU9OXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfUEFHSU5HX0NGR10gPQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCQlbTk1fQVRUX0lQQUNDX1VOSVRfSURdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19VTklUX05BTUVdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19TTk1QX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1BSSU1fT01MX0NGR19MSVNUXSA9IHsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfTlZfRkxBR1NdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19GUkVRX0NUUkxdID0JeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQkJW05NX0FUVF9JUEFDQ19QUklNX09NTF9GQl9UT1VUXSA9IHsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfQ1VSX1NXX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1RJTUlOR19CVVNdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19DR0ldID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfUkFDXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX09CSl9WRVJTSU9OXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfR1BSU19QQUdJTkdfQ0ZHXT0geyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19OU0VJXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX0JWQ0ldID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfTlNWQ0ldID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfTlNfQ0ZHXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX0JTU0dQX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX05TX0xJTktfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfUkxDX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX0FMTV9USFJFU0hfTElTVF09CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfTU9OSVRfVkFMX0xJU1RdID0geyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19USUJfQ09OVFJPTF0gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1NVUFBfRkVBVFVSRVNdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19DT0RJTkdfU0NIRU1FU10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1JMQ19DRkdfMl0gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX0hFQVJUQl9UT1VUXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfVVBUSU1FXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1JMQ19DRkdfM10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1NTTF9DRkddID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19TRUNfUE9TU0lCTEVdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19JTUxfU1NMX1NUQVRFXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfUkVWT0NfREFURV0gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCX0sCisJfSwKK307CisKK2ludCBidHNfbW9kZWxfbmFub2J0c19pbml0KHZvaWQpCit7CisJcmV0dXJuIGdzbV9idHNfbW9kZWxfcmVnaXN0ZXIoJm1vZGVsX25hbm9idHMpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvYnRzX3NpZW1lbnNfYnMxMS5jIGIvb3BlbmJzYy9zcmMvYnRzX3NpZW1lbnNfYnMxMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NjY4MjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9idHNfc2llbWVuc19iczExLmMKQEAgLTAsMCArMSw2NiBAQAorLyogU2llbWVucyBCUy0xMSBzcGVjaWZpYyBjb2RlICovCisKKy8qIChDKSAyMDA5LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorCitzdGF0aWMgc3RydWN0IGdzbV9idHNfbW9kZWwgbW9kZWxfYnMxMSA9IHsKKwkudHlwZSA9IEdTTV9CVFNfVFlQRV9CUzExLAorCS5ubV9hdHRfdGx2ZGVmID0geworCQkuZGVmID0geworCQkJW05NX0FUVF9BVkFJTF9TVEFUVVNdID0JCXsgVExWX1RZUEVfVExWIH0sCisJCQkvKiBCUzExIHNwZWNpZmljcyAqLworCQkJW05NX0FUVF9CUzExX0VTTl9GV19DT0RFX05PXSA9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfRVNOX0hXX0NPREVfTk9dID0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9FU05fUENCX1NFUklBTF0gPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX0JPT1RfU1dfVkVSU10gPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJWzB4ZDVdID0JCQl7IFRMVl9UWVBFX1RMViB9LAorCQkJWzB4YThdID0JCQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX1BBU1NXT1JEXSA9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfVFhQV1JdID0JCXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfUlNTSV9PRkZTXSA9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfTElORV9DRkddID0gCXsgVExWX1RZUEVfVFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9MMV9QUk9UX1RZUEVdID0JeyBUTFZfVFlQRV9UViB9LAorCQkJW05NX0FUVF9CUzExX0JJVF9FUlJfVEhFU0hdID0JeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQkJW05NX0FUVF9CUzExX0RJVkVSU0lUWV0gPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX0xNVF9MT0dPTl9TRVNTSU9OXT17IFRMVl9UWVBFX1RMViB9LAkKKwkJCVtOTV9BVFRfQlMxMV9MTVRfTE9HSU5fVElNRV0gPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX0xNVF9VU0VSX0FDQ19MRVZdID17IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX0xNVF9VU0VSX05BTUVdID0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9CVFNfU1RBVEVdCT0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9FMV9TVEFURV0JPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX1BMTF9NT0RFXQk9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfUExMXQk9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfQ0NMS19BQ0NVUkFDWV0gPQl7IFRMVl9UWVBFX1RWIH0sCisJCQlbTk1fQVRUX0JTMTFfQ0NMS19UWVBFXSA9CXsgVExWX1RZUEVfVFYgfSwKKwkJCVsweDk1XSA9CQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQl9LAorCX0sCit9OworCitpbnQgYnRzX21vZGVsX2JzMTFfaW5pdCh2b2lkKQoreworCXJldHVybiBnc21fYnRzX21vZGVsX3JlZ2lzdGVyKCZtb2RlbF9iczExKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2J0c191bmtub3duLmMgYi9vcGVuYnNjL3NyYy9idHNfdW5rbm93bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYzVkOTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9idHNfdW5rbm93bi5jCkBAIC0wLDAgKzEsNDAgQEAKKy8qIEdlbmVyaWMgQlRTIC0gVlRZIGNvZGUgdHJpZXMgdG8gYWxsb2NhdGUgdGhpcyBCVFMgYmVmb3JlIHR5cGUgaXMga25vd24gKi8KKworLyogKEMpIDIwMTAgYnkgRGFuaWVsIFdpbGxtYW5uIDxkYW5pZWxAdG90YWx1ZWJlcndhY2h1bmcuZGU+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKworc3RhdGljIHN0cnVjdCBnc21fYnRzX21vZGVsIG1vZGVsX3Vua25vd24gPSB7CisJLnR5cGUgPSBHU01fQlRTX1RZUEVfVU5LTk9XTiwKKwkubm1fYXR0X3RsdmRlZiA9IHsKKwkJLmRlZiA9IHsKKwkJfSwKKwl9LAorfTsKKworaW50IGJ0c19tb2RlbF91bmtub3duX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gZ3NtX2J0c19tb2RlbF9yZWdpc3RlcigmbW9kZWxfdW5rbm93bik7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9jaGFuX2FsbG9jLmMgYi9vcGVuYnNjL3NyYy9jaGFuX2FsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA3YWJkYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2NoYW5fYWxsb2MuYwpAQCAtMCwwICsxLDQ1OCBAQAorLyogR1NNIENoYW5uZWwgYWxsb2NhdGlvbiByb3V0aW5lcworICoKKyAqIChDKSAyMDA4IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOCwgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorCitzdGF0aWMgdm9pZCBhdXRvX3JlbGVhc2VfY2hhbm5lbCh2b2lkICpfbGNoYW4pOworCitzdGF0aWMgaW50IHRzX2lzX3VzYWJsZShzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzKQoreworCS8qIEZJWE1FOiBIb3cgZG9lcyB0aGlzIGJlaGF2ZSBmb3IgQlMtMTEgPyAqLworCWlmIChpc19pcGFjY2Vzc19idHModHMtPnRyeC0+YnRzKSkgeworCQlpZiAoIW5tX2lzX3J1bm5pbmcoJnRzLT5ubV9zdGF0ZSkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworaW50IHRyeF9pc191c2FibGUoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJLyogRklYTUU6IEhvdyBkb2VzIHRoaXMgYmVoYXZlIGZvciBCUy0xMSA/ICovCisJaWYgKGlzX2lwYWNjZXNzX2J0cyh0cngtPmJ0cykpIHsKKwkJaWYgKCFubV9pc19ydW5uaW5nKCZ0cngtPm5tX3N0YXRlKSB8fAorCQkgICAgIW5tX2lzX3J1bm5pbmcoJnRyeC0+YmJfdHJhbnNjLm5tX3N0YXRlKSkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzX2MwX2FsbG9jKHN0cnVjdCBnc21fYnRzICpidHMsCisJCQkJICAgZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBwY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IGJ0cy0+YzA7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9ICZ0cngtPnRzWzBdOworCisJaWYgKHBjaGFuICE9IEdTTV9QQ0hBTl9DQ0NIICYmCisJICAgIHBjaGFuICE9IEdTTV9QQ0hBTl9DQ0NIX1NEQ0NINCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAodHMtPnBjaGFuICE9IEdTTV9QQ0hBTl9OT05FKQorCQlyZXR1cm4gTlVMTDsKKworCXRzLT5wY2hhbiA9IHBjaGFuOworCisJcmV0dXJuIHRzOworfQorCisvKiBBbGxvY2F0ZSBhIHBoeXNpY2FsIGNoYW5uZWwgKFRTKSAqLworc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0c19hbGxvYyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLAorCQkJCWVudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgcGNoYW4pCit7CisJaW50IGo7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KSB7CisJCWludCBmcm9tLCB0bzsKKworCQlpZiAoIXRyeF9pc191c2FibGUodHJ4KSkKKwkJCWNvbnRpbnVlOworCisJCS8qIHRoZSBmb2xsb3dpbmcgY29uc3RyYWludHMgYXJlIHB1cmUgcG9saWN5LAorCQkgKiBubyByZXF1aXJlbWVudCB0byBwdXQgdGhpcyByZXN0cmljdGlvbiBpbiBwbGFjZSAqLworCQlpZiAodHJ4ID09IGJ0cy0+YzApIHsKKwkJCS8qIE9uIHRoZSBmaXJzdCBUUlggd2UgcnVuIG9uZSBDQ0NIIGFuZCBvbmUgU0RDQ0g4ICovCisJCQlzd2l0Y2ggKHBjaGFuKSB7CisJCQljYXNlIEdTTV9QQ0hBTl9DQ0NIOgorCQkJY2FzZSBHU01fUENIQU5fQ0NDSF9TRENDSDQ6CisJCQkJZnJvbSA9IDA7IHRvID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgR1NNX1BDSEFOX1RDSF9GOgorCQkJY2FzZSBHU01fUENIQU5fVENIX0g6CisJCQkJZnJvbSA9IDE7IHRvID0gNzsKKwkJCQlicmVhazsKKwkJCWNhc2UgR1NNX1BDSEFOX1NEQ0NIOF9TQUNDSDhDOgorCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIEV2ZXJ5IHNlY29uZGFyeSBUUlggaXMgY29uZmlndXJlZCBmb3IgVENIL0YKKwkJCSAqIGFuZCBUQ0gvSCBvbmx5ICovCisJCQlzd2l0Y2ggKHBjaGFuKSB7CisJCQljYXNlIEdTTV9QQ0hBTl9TRENDSDhfU0FDQ0g4QzoKKwkJCQlmcm9tID0gMTsgdG8gPSAxOworCQkJY2FzZSBHU01fUENIQU5fVENIX0Y6CisJCQljYXNlIEdTTV9QQ0hBTl9UQ0hfSDoKKwkJCQlmcm9tID0gMTsgdG8gPSA3OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCisJCWZvciAoaiA9IGZyb207IGogPD0gdG87IGorKykgeworCQkJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9ICZ0cngtPnRzW2pdOworCisJCQlpZiAoIXRzX2lzX3VzYWJsZSh0cykpCisJCQkJY29udGludWU7CisKKwkJCWlmICh0cy0+cGNoYW4gPT0gR1NNX1BDSEFOX05PTkUpIHsKKwkJCQl0cy0+cGNoYW4gPSBwY2hhbjsKKwkJCQkvKiBzZXQgY2hhbm5lbCBhdHRyaWJ1dGUgb24gT01MICovCisJCQkJYWJpc19ubV9zZXRfY2hhbm5lbF9hdHRyKHRzLCBhYmlzX25tX2NoY29tYjRwY2hhbihwY2hhbikpOworCQkJCXJldHVybiB0czsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogRnJlZSBhIHBoeXNpY2FsIGNoYW5uZWwgKFRTKSAqLwordm9pZCB0c19mcmVlKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMpCit7CisJdHMtPnBjaGFuID0gR1NNX1BDSEFOX05PTkU7Cit9CisKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBzdWJzbG90c19wZXJfcGNoYW5bXSA9IHsKKwlbR1NNX1BDSEFOX05PTkVdID0gMCwKKwlbR1NNX1BDSEFOX0NDQ0hdID0gMCwKKwlbR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0XSA9IDQsCisJW0dTTV9QQ0hBTl9UQ0hfRl0gPSAxLAorCVtHU01fUENIQU5fVENIX0hdID0gMiwKKwlbR1NNX1BDSEFOX1NEQ0NIOF9TQUNDSDhDXSA9IDgsCisJLyogRklYTUU6IHdoYXQgYWJvdXQgZHluYW1pYyBUQ0hfRl9UQ0hfSCA/ICovCisJW0dTTV9QQ0hBTl9UQ0hfRl9QRENIXSA9IDEsCit9OworCitzdGF0aWMgc3RydWN0IGdzbV9sY2hhbiAqCitfbGNfZmluZF90cngoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIGVudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgcGNoYW4pCit7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0czsKKwlpbnQgaiwgc3M7CisKKwlpZiAoIXRyeF9pc191c2FibGUodHJ4KSkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisJCXRzID0gJnRyeC0+dHNbal07CisJCWlmICghdHNfaXNfdXNhYmxlKHRzKSkKKwkJCWNvbnRpbnVlOworCQkvKiBpcC5hY2Nlc3MgZHluYW1pYyBUQ0gvRiArIFBEQ0ggY29tYmluYXRpb24gKi8KKwkJaWYgKHRzLT5wY2hhbiA9PSBHU01fUENIQU5fVENIX0ZfUERDSCAmJgorCQkgICAgcGNoYW4gPT0gR1NNX1BDSEFOX1RDSF9GKSB7CisJCQkvKiB3ZSBjYW4gb25seSBjb25zaWRlciBzdWNoIGEgZHluYW1pYyBjaGFubmVsCisJCQkgKiBpZiB0aGUgUERDSCBpcyBjdXJyZW50bHkgaW5hY3RpdmUgKi8KKwkJCWlmICh0cy0+ZmxhZ3MgJiBUU19GX1BEQ0hfTU9ERSkKKwkJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmICh0cy0+cGNoYW4gIT0gcGNoYW4pCisJCQljb250aW51ZTsKKwkJLyogY2hlY2sgaWYgYWxsIHN1Yi1zbG90cyBhcmUgYWxsb2NhdGVkIHlldCAqLworCQlmb3IgKHNzID0gMDsgc3MgPCBzdWJzbG90c19wZXJfcGNoYW5bcGNoYW5dOyBzcysrKSB7CisJCQlzdHJ1Y3QgZ3NtX2xjaGFuICpsYyA9ICZ0cy0+bGNoYW5bc3NdOworCQkJaWYgKGxjLT50eXBlID09IEdTTV9MQ0hBTl9OT05FICYmCisJCQkgICAgbGMtPnN0YXRlID09IExDSEFOX1NfTk9ORSkKKwkJCQlyZXR1cm4gbGM7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBnc21fbGNoYW4gKgorX2xjX2ZpbmRfYnRzKHN0cnVjdCBnc21fYnRzICpidHMsIGVudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgcGNoYW4pCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0czsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsYzsKKworCWlmIChidHMtPmNoYW5fYWxsb2NfcmV2ZXJzZSkgeworCQlsbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKHRyeCwgJmJ0cy0+dHJ4X2xpc3QsIGxpc3QpIHsKKwkJCWxjID0gX2xjX2ZpbmRfdHJ4KHRyeCwgcGNoYW4pOworCQkJaWYgKGxjKQorCQkJCXJldHVybiBsYzsKKwkJfQorCX0gZWxzZSB7CisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyeCwgJmJ0cy0+dHJ4X2xpc3QsIGxpc3QpIHsKKwkJCWxjID0gX2xjX2ZpbmRfdHJ4KHRyeCwgcGNoYW4pOworCQkJaWYgKGxjKQorCQkJCXJldHVybiBsYzsKKwkJfQorCX0KKworCS8qIHdlIGNhbm5vdCBhbGxvY2F0ZSBtb3JlIG9mIHRoZXNlICovCisJaWYgKHBjaGFuID09IEdTTV9QQ0hBTl9DQ0NIX1NEQ0NINCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBpZiB3ZSd2ZSByZWFjaGVkIGhlcmUsIHdlIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgcGh5c2ljYWwKKwkgKiBjaGFubmVsIGZvciB0aGUgbG9naWNhbCBjaGFubmVsIHR5cGUgcmVxdWVzdGVkICovCisJdHMgPSB0c19hbGxvYyhidHMsIHBjaGFuKTsKKwlpZiAoIXRzKSB7CisJCS8qIG5vIG1vcmUgcmFkaW8gcmVzb3VyY2VzICovCisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gJnRzLT5sY2hhblswXTsKK30KKworLyogQWxsb2NhdGUgYSBsb2dpY2FsIGNoYW5uZWwgKi8KK3N0cnVjdCBnc21fbGNoYW4gKmxjaGFuX2FsbG9jKHN0cnVjdCBnc21fYnRzICpidHMsIGVudW0gZ3NtX2NoYW5fdCB0eXBlKQoreworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gTlVMTDsKKwllbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIGZpcnN0LCBzZWNvbmQ7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEdTTV9MQ0hBTl9TRENDSDoKKwkJaWYgKGJ0cy0+Y2hhbl9hbGxvY19yZXZlcnNlKSB7CisJCQlmaXJzdCA9IEdTTV9QQ0hBTl9TRENDSDhfU0FDQ0g4QzsKKwkJCXNlY29uZCA9IEdTTV9QQ0hBTl9DQ0NIX1NEQ0NINDsKKwkJfSBlbHNlIHsKKwkJCWZpcnN0ID0gR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0OworCQkJc2Vjb25kID0gR1NNX1BDSEFOX1NEQ0NIOF9TQUNDSDhDOworCQl9CisKKwkJbGNoYW4gPSBfbGNfZmluZF9idHMoYnRzLCBmaXJzdCk7CisJCWlmIChsY2hhbiA9PSBOVUxMKQorCQkJbGNoYW4gPSBfbGNfZmluZF9idHMoYnRzLCBzZWNvbmQpOworCQlicmVhazsKKwljYXNlIEdTTV9MQ0hBTl9UQ0hfRjoKKwkJbGNoYW4gPSBfbGNfZmluZF9idHMoYnRzLCBHU01fUENIQU5fVENIX0YpOworCQlicmVhazsKKwljYXNlIEdTTV9MQ0hBTl9UQ0hfSDoKKwkJbGNoYW4gPV9sY19maW5kX2J0cyhidHMsIEdTTV9QQ0hBTl9UQ0hfSCk7CisJCS8qIElmIHdlIGRvbid0IGhhdmUgVENIL0ggYXZhaWxhYmxlLCBmYWxsLWJhY2sgdG8gVENIL0YgKi8KKwkJaWYgKCFsY2hhbikgeworCQkJbGNoYW4gPSBfbGNfZmluZF9idHMoYnRzLCBHU01fUENIQU5fVENIX0YpOworCQkJdHlwZSA9IEdTTV9MQ0hBTl9UQ0hfRjsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERSTEwsIExPR0xfRVJST1IsICJVbmtub3duIGdzbV9jaGFuX3QgJXVcbiIsIHR5cGUpOworCX0KKworCWlmIChsY2hhbikgeworCQlsY2hhbi0+dHlwZSA9IHR5cGU7CisKKwkJLyogY2xlYXIgc2FwaXMgKi8KKwkJbWVtc2V0KGxjaGFuLT5zYXBpcywgMCwgQVJSQVlfU0laRShsY2hhbi0+c2FwaXMpKTsKKworCQkvKiBjbGVhciBtdWx0aSByYXRlIGNvbmZpZyAqLworCQltZW1zZXQoJmxjaGFuLT5tcl9jb25mLCAwLCBzaXplb2YobGNoYW4tPm1yX2NvbmYpKTsKKworCQkvKiBjbGVhciBwZXIgTVNDL0JTQyBkYXRhICovCisJCW1lbXNldCgmbGNoYW4tPmNvbm4sIDAsIHNpemVvZihsY2hhbi0+Y29ubikpOworCisJCS8qIENvbmZpZ3VyZSB0aGUgdGltZSBhbmQgc3RhcnQgaXQgc28gaXQgd2lsbCBiZSBjbG9zZWQgKi8KKwkJbGNoYW4tPmNvbm4ubGNoYW4gPSBsY2hhbjsKKwkJbGNoYW4tPmNvbm4uYnRzID0gbGNoYW4tPnRzLT50cngtPmJ0czsKKwkJbGNoYW4tPmNvbm4ucmVsZWFzZV90aW1lci5jYiA9IGF1dG9fcmVsZWFzZV9jaGFubmVsOworCQlsY2hhbi0+Y29ubi5yZWxlYXNlX3RpbWVyLmRhdGEgPSBsY2hhbjsKKwkJYnNjX3NjaGVkdWxlX3RpbWVyKCZsY2hhbi0+Y29ubi5yZWxlYXNlX3RpbWVyLCBMQ0hBTl9SRUxFQVNFX1RJTUVPVVQpOworCisJfSBlbHNlIHsKKwkJc3RydWN0IGNoYWxsb2Nfc2lnbmFsX2RhdGEgc2lnOworCQlzaWcuYnRzID0gYnRzOworCQlzaWcudHlwZSA9IHR5cGU7CisJCWRpc3BhdGNoX3NpZ25hbChTU19DSEFMTE9DLCBTX0NIQUxMT0NfQUxMT0NfRkFJTCwgJnNpZyk7CisJfQorCisJcmV0dXJuIGxjaGFuOworfQorCisvKiBGcmVlIGEgbG9naWNhbCBjaGFubmVsICovCit2b2lkIGxjaGFuX2ZyZWUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IGNoYWxsb2Nfc2lnbmFsX2RhdGEgc2lnOworCWludCBpOworCisJc2lnLnR5cGUgPSBsY2hhbi0+dHlwZTsKKwlsY2hhbi0+dHlwZSA9IEdTTV9MQ0hBTl9OT05FOworCWlmIChsY2hhbi0+Y29ubi5zdWJzY3IpIHsKKwkJc3Vic2NyX3B1dChsY2hhbi0+Y29ubi5zdWJzY3IpOworCQlsY2hhbi0+Y29ubi5zdWJzY3IgPSBOVUxMOworCX0KKworCS8qIFdlIG1pZ2h0IGtpbGwgYW4gYWN0aXZlIGNoYW5uZWwuLi4gKi8KKwlpZiAobGNoYW4tPmNvbm4udXNlX2NvdW50ICE9IDApIHsKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX0xDSEFOLCBTX0xDSEFOX1VORVhQRUNURURfUkVMRUFTRSwgbGNoYW4pOworCQlsY2hhbi0+Y29ubi51c2VfY291bnQgPSAwOworCX0KKworCS8qIHN0b3AgdGhlIHRpbWVyICovCisJYnNjX2RlbF90aW1lcigmbGNoYW4tPmNvbm4ucmVsZWFzZV90aW1lcik7CisJYnNjX2RlbF90aW1lcigmbGNoYW4tPlQzMTAxKTsKKworCS8qIGNsZWFyIGNhY2hlZCBtZWFzdWVtZW50IHJlcG9ydHMgKi8KKwlsY2hhbi0+bWVhc19yZXBfaWR4ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsY2hhbi0+bWVhc19yZXApOyBpKyspIHsKKwkJbGNoYW4tPm1lYXNfcmVwW2ldLmZsYWdzID0gMDsKKwkJbGNoYW4tPm1lYXNfcmVwW2ldLm5yID0gMDsKKwl9CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobGNoYW4tPm5laWdoX21lYXMpOyBpKyspCisJCWxjaGFuLT5uZWlnaF9tZWFzW2ldLmFyZmNuID0gMDsKKworCWxjaGFuLT5jb25uLnNpbGVudF9jYWxsID0gMDsKKworCXNpZy5sY2hhbiA9IGxjaGFuOworCXNpZy5idHMgPSBsY2hhbi0+dHMtPnRyeC0+YnRzOworCWRpc3BhdGNoX3NpZ25hbChTU19DSEFMTE9DLCBTX0NIQUxMT0NfRlJFRUQsICZzaWcpOworCisJLyogRklYTUU6IHRzX2ZyZWUoKSB0aGUgdGltZXNsb3QsIGlmIHdlJ3JlIHRoZSBsYXN0IGxvZ2ljYWwKKwkgKiBjaGFubmVsIHVzaW5nIGl0ICovCit9CisKKy8qCisgKiBUaGVyZSB3YXMgYW4gZXJyb3Igd2l0aCB0aGUgVFJYIGFuZCB3ZSBuZWVkIHRvIGZvcmdldAorICogYW55IHN0YXRlIHNvIHRoYXQgYSBsY2hhbiBjYW4gYmUgYWxsb2NhdGVkIGFnYWluIGFmdGVyCisgKiB0aGUgdHJ4IGlzIGZ1bGx5IHVzYWJsZS4KKyAqLwordm9pZCBsY2hhbl9yZXNldChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlic2NfZGVsX3RpbWVyKCZsY2hhbi0+VDMxMDEpOworCisJbGNoYW4tPnR5cGUgPSBHU01fTENIQU5fTk9ORTsKKwlsY2hhbi0+c3RhdGUgPSBMQ0hBTl9TX05PTkU7Cit9CisKKworLyogQ29uc2lkZXIgcmVsZWFzaW5nIHRoZSBjaGFubmVsIG5vdyAqLworaW50IGxjaGFuX2F1dG9fcmVsZWFzZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlpZiAobGNoYW4tPmNvbm4udXNlX2NvdW50ID4gMCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBBc3N1bWUgd2UgaGF2ZSBHU00wNC4wOCBydW5uaW5nIGFuZCBzZW5kIGEgcmVsZWFzZSAqLworCWlmIChsY2hhbi0+Y29ubi5zdWJzY3IpIHsKKwkJZ3NtNDhfc2VuZF9ycl9yZWxlYXNlKGxjaGFuKTsKKwl9CisKKwkvKiBzcG9vZmVkPyBtZXNzYWdlICovCisJaWYgKGxjaGFuLT5jb25uLnVzZV9jb3VudCA8IDApCisJCUxPR1AoRFJMTCwgTE9HTF9FUlJPUiwgIkNoYW5uZWwgY291bnQgaXMgbmVnYXRpdmU6ICVkXG4iLAorCQkJbGNoYW4tPmNvbm4udXNlX2NvdW50KTsKKworCURFQlVHUChEUkxMLCAiJXMgUmVjeWNsaW5nIENoYW5uZWxcbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSk7CisJcnNsX2xjaGFuX3NldF9zdGF0ZShsY2hhbiwgTENIQU5fU19SRUxfUkVRKTsKKwlyc2xfcmVsZWFzZV9yZXF1ZXN0KGxjaGFuLCAwKTsKKwlyZXR1cm4gMTsKK30KKworLyogQXV0byByZWxlYXNlIHRoZSBjaGFubmVsIHdoZW4gdGhlIHVzZSBjb3VudCBpcyB6ZXJvICovCitzdGF0aWMgdm9pZCBhdXRvX3JlbGVhc2VfY2hhbm5lbCh2b2lkICpfbGNoYW4pCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBfbGNoYW47CisKKwlpZiAoIWxjaGFuX2F1dG9fcmVsZWFzZShsY2hhbikpCisJCWJzY19zY2hlZHVsZV90aW1lcigmbGNoYW4tPmNvbm4ucmVsZWFzZV90aW1lciwgTENIQU5fUkVMRUFTRV9USU1FT1VUKTsKK30KKworc3RydWN0IGdzbV9sY2hhbiogbGNoYW5fZmluZChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikgeworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCWludCB0c19ubywgbGNoYW5fbm87CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KSB7CisJCWZvciAodHNfbm8gPSAwOyB0c19ubyA8IDg7ICsrdHNfbm8pIHsKKwkJCWZvciAobGNoYW5fbm8gPSAwOyBsY2hhbl9ubyA8IFRTX01BWF9MQ0hBTjsgKytsY2hhbl9ubykgeworCQkJCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0KKwkJCQkJJnRyeC0+dHNbdHNfbm9dLmxjaGFuW2xjaGFuX25vXTsKKwkJCQlpZiAoc3Vic2NyID09IGxjaGFuLT5jb25uLnN1YnNjcikKKwkJCQkJcmV0dXJuIGxjaGFuOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBnc21fbGNoYW4gKmxjaGFuX2Zvcl9zdWJzY3Ioc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IHN1YnNjci0+bmV0OworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoYnRzLCAmbmV0LT5idHNfbGlzdCwgbGlzdCkgeworCQlsY2hhbiA9IGxjaGFuX2ZpbmQoYnRzLCBzdWJzY3IpOworCQlpZiAobGNoYW4pCisJCQlyZXR1cm4gbGNoYW47CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgYnRzX2NoYW5fbG9hZChzdHJ1Y3QgcGNoYW5fbG9hZCAqY2wsIGNvbnN0IHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KSB7CisJCWludCBpOworCisJCS8qIHNraXAgYWRtaW5pc3RyYXRpdmVseSBkZWFjdGl2YXRlZCB0cmFueHNjZWl2ZXJzICovCisJCWlmICghbm1faXNfcnVubmluZygmdHJ4LT5ubV9zdGF0ZSkgfHwKKwkJICAgICFubV9pc19ydW5uaW5nKCZ0cngtPmJiX3RyYW5zYy5ubV9zdGF0ZSkpCisJCQljb250aW51ZTsKKworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0cngtPnRzKTsgaSsrKSB7CisJCQlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gJnRyeC0+dHNbaV07CisJCQlzdHJ1Y3QgbG9hZF9jb3VudGVyICpwbCA9ICZjbC0+cGNoYW5bdHMtPnBjaGFuXTsKKwkJCWludCBqOworCisJCQkvKiBza2lwIGFkbWluaXN0cmF0aXZlbHkgZGVhY3RpdmF0ZWQgdGltZXNsb3RzICovCisJCQlpZiAoIW5tX2lzX3J1bm5pbmcoJnRzLT5ubV9zdGF0ZSkpCisJCQkJY29udGludWU7CisKKwkJCWZvciAoaiA9IDA7IGogPCBzdWJzbG90c19wZXJfcGNoYW5bdHMtPnBjaGFuXTsgaisrKSB7CisJCQkJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSAmdHMtPmxjaGFuW2pdOworCisJCQkJcGwtPnRvdGFsKys7CisKKwkJCQlzd2l0Y2ggKGxjaGFuLT5zdGF0ZSkgeworCQkJCWNhc2UgTENIQU5fU19OT05FOgorCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlwbC0+dXNlZCsrOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKK3ZvaWQgbmV0d29ya19jaGFuX2xvYWQoc3RydWN0IHBjaGFuX2xvYWQgKnBsLCBzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCkKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCisJbWVtc2V0KHBsLCAwLCBzaXplb2YoKnBsKSk7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShidHMsICZuZXQtPmJ0c19saXN0LCBsaXN0KQorCQlidHNfY2hhbl9sb2FkKHBsLCBidHMpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvY29tbW9uX3Z0eS5jIGIvb3BlbmJzYy9zcmMvY29tbW9uX3Z0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMGQyOWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9jb21tb25fdnR5LmMKQEAgLTAsMCArMSwxNjAgQEAKKy8qIE9wZW5CU0MgVlRZIGNvbW1vbiBoZWxwZXJzICovCisvKiAoQykgMjAwOS0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOS0yMDEwIGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL3Z0eS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorCisjaW5jbHVkZSA8b3Ntb2NvbS92dHkvdGVsbmV0X2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPG9zbW9jb20vdnR5L2NvbW1hbmQuaD4KKyNpbmNsdWRlIDxvc21vY29tL3Z0eS9idWZmZXIuaD4KKyNpbmNsdWRlIDxvc21vY29tL3Z0eS92dHkuaD4KKworCitpbnQgYnNjX3Z0eV9nb19wYXJlbnQoc3RydWN0IHZ0eSAqdnR5KQoreworCXN3aXRjaCAodnR5LT5ub2RlKSB7CisJY2FzZSBHU01ORVRfTk9ERToKKwkJdnR5LT5ub2RlID0gQ09ORklHX05PREU7CisJCXZ0eS0+aW5kZXggPSBOVUxMOworCQlicmVhazsKKwljYXNlIEJUU19OT0RFOgorCQl2dHktPm5vZGUgPSBHU01ORVRfTk9ERTsKKwkJeworCQkJLyogc2V0IHZ0eS0+aW5kZXggY29ycmVjdGx5ICEgKi8KKwkJCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCQkJdnR5LT5pbmRleCA9IGJ0cy0+bmV0d29yazsKKwkJfQorCQlicmVhazsKKwljYXNlIFRSWF9OT0RFOgorCQl2dHktPm5vZGUgPSBCVFNfTk9ERTsKKwkJeworCQkJLyogc2V0IHZ0eS0+aW5kZXggY29ycmVjdGx5ICEgKi8KKwkJCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKwkJCXZ0eS0+aW5kZXggPSB0cngtPmJ0czsKKwkJfQorCQlicmVhazsKKwljYXNlIFRTX05PREU6CisJCXZ0eS0+bm9kZSA9IFRSWF9OT0RFOworCQl7CisJCQkvKiBzZXQgdnR5LT5pbmRleCBjb3JyZWN0bHkgISAqLworCQkJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9IHZ0eS0+aW5kZXg7CisJCQl2dHktPmluZGV4ID0gdHMtPnRyeDsKKwkJfQorCQlicmVhazsKKwljYXNlIFNVQlNDUl9OT0RFOgorCQl2dHktPm5vZGUgPSBWSUVXX05PREU7CisJCXN1YnNjcl9wdXQodnR5LT5pbmRleCk7CisJCXZ0eS0+aW5kZXggPSBOVUxMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl2dHktPm5vZGUgPSBDT05GSUdfTk9ERTsKKwl9CisKKwlyZXR1cm4gdnR5LT5ub2RlOworfQorCisvKiBEb3duIHZ0eSBub2RlIGxldmVsLiAqLworZ0RFRlVOKG91cm5vZGVfZXhpdCwKKyAgICAgICBvdXJub2RlX2V4aXRfY21kLCAiZXhpdCIsICJFeGl0IGN1cnJlbnQgbW9kZSBhbmQgZG93biB0byBwcmV2aW91cyBtb2RlXG4iKQoreworCXN3aXRjaCAodnR5LT5ub2RlKSB7CisJY2FzZSBHU01ORVRfTk9ERToKKwkJdnR5LT5ub2RlID0gQ09ORklHX05PREU7CisJCXZ0eS0+aW5kZXggPSBOVUxMOworCQlicmVhazsKKwljYXNlIEJUU19OT0RFOgorCQl2dHktPm5vZGUgPSBHU01ORVRfTk9ERTsKKwkJeworCQkJLyogc2V0IHZ0eS0+aW5kZXggY29ycmVjdGx5ICEgKi8KKwkJCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCQkJdnR5LT5pbmRleCA9IGJ0cy0+bmV0d29yazsKKwkJCXZ0eS0+aW5kZXhfc3ViID0gTlVMTDsKKwkJfQorCQlicmVhazsKKwljYXNlIFRSWF9OT0RFOgorCQl2dHktPm5vZGUgPSBCVFNfTk9ERTsKKwkJeworCQkJLyogc2V0IHZ0eS0+aW5kZXggY29ycmVjdGx5ICEgKi8KKwkJCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKwkJCXZ0eS0+aW5kZXggPSB0cngtPmJ0czsKKwkJCXZ0eS0+aW5kZXhfc3ViID0gJnRyeC0+YnRzLT5kZXNjcmlwdGlvbjsKKwkJfQorCQlicmVhazsKKwljYXNlIFRTX05PREU6CisJCXZ0eS0+bm9kZSA9IFRSWF9OT0RFOworCQl7CisJCQkvKiBzZXQgdnR5LT5pbmRleCBjb3JyZWN0bHkgISAqLworCQkJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9IHZ0eS0+aW5kZXg7CisJCQl2dHktPmluZGV4ID0gdHMtPnRyeDsKKwkJCXZ0eS0+aW5kZXhfc3ViID0gJnRzLT50cngtPmRlc2NyaXB0aW9uOworCQl9CisJCWJyZWFrOworCWNhc2UgTUdDUF9OT0RFOgorCWNhc2UgR0JQUk9YWV9OT0RFOgorCWNhc2UgU0dTTl9OT0RFOgorCWNhc2UgTlNfTk9ERToKKwljYXNlIEJTU0dQX05PREU6CisJCXZ0eS0+bm9kZSA9IENPTkZJR19OT0RFOworCQl2dHktPmluZGV4ID0gTlVMTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogRW5kIG9mIGNvbmZpZ3VyYXRpb24uICovCitnREVGVU4ob3Vybm9kZV9lbmQsCisgICAgICAgb3Vybm9kZV9lbmRfY21kLCAiZW5kIiwgIkVuZCBjdXJyZW50IG1vZGUgYW5kIGNoYW5nZSB0byBlbmFibGUgbW9kZS4iKQoreworCXN3aXRjaCAodnR5LT5ub2RlKSB7CisJY2FzZSBWSUVXX05PREU6CisJY2FzZSBFTkFCTEVfTk9ERToKKwkJLyogTm90aGluZyB0byBkby4gKi8KKwkJYnJlYWs7CisJY2FzZSBDT05GSUdfTk9ERToKKwljYXNlIEdTTU5FVF9OT0RFOgorCWNhc2UgQlRTX05PREU6CisJY2FzZSBUUlhfTk9ERToKKwljYXNlIFRTX05PREU6CisJY2FzZSBNR0NQX05PREU6CisJY2FzZSBHQlBST1hZX05PREU6CisJY2FzZSBTR1NOX05PREU6CisJY2FzZSBOU19OT0RFOgorCWNhc2UgVlRZX05PREU6CisJCXZ0eV9jb25maWdfdW5sb2NrKHZ0eSk7CisJCXZ0eS0+bm9kZSA9IEVOQUJMRV9OT0RFOworCQl2dHktPmluZGV4ID0gTlVMTDsKKwkJdnR5LT5pbmRleF9zdWIgPSBOVUxMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9kYi5jIGIvb3BlbmJzYy9zcmMvZGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjNjMjIxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZGIuYwpAQCAtMCwwICsxLDEyMzEgQEAKKy8qIFNpbXBsZSBITFIvVkxSIGRhdGFiYXNlIGJhY2tlbmQgdXNpbmcgZGJpICovCisvKiAoQykgMjAwOCBieSBKYW4gTHVlYmJlIDxqbHVlYmJlQGRlYmlhbi5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGxpYmdlbi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxkYmkvZGJpLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMTEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RiLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3N0YXRpc3RpY3MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9yYXRlX2N0ci5oPgorCitzdGF0aWMgY2hhciAqZGJfYmFzZW5hbWUgPSBOVUxMOworc3RhdGljIGNoYXIgKmRiX2Rpcm5hbWUgPSBOVUxMOworc3RhdGljIGRiaV9jb25uIGNvbm47CisKK3N0YXRpYyBjaGFyICpjcmVhdGVfc3RtdHNbXSA9IHsKKwkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgTWV0YSAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJrZXkgVEVYVCBVTklRVUUgTk9UIE5VTEwsICIKKwkJInZhbHVlIFRFWFQgTk9UIE5VTEwiCisJCSIpIiwKKwkiSU5TRVJUIE9SIElHTk9SRSBJTlRPIE1ldGEgIgorCQkiKGtleSwgdmFsdWUpICIKKwkJIlZBTFVFUyAiCisJCSIoJ3JldmlzaW9uJywgJzInKSIsCisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIFN1YnNjcmliZXIgKCIKKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkiY3JlYXRlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJInVwZGF0ZWQgVElNRVNUQU1QIE5PVCBOVUxMLCAiCisJCSJpbXNpIE5VTUVSSUMgVU5JUVVFIE5PVCBOVUxMLCAiCisJCSJuYW1lIFRFWFQsICIKKwkJImV4dGVuc2lvbiBURVhUIFVOSVFVRSwgIgorCQkiYXV0aG9yaXplZCBJTlRFR0VSIE5PVCBOVUxMIERFRkFVTFQgMCwgIgorCQkidG1zaSBURVhUIFVOSVFVRSwgIgorCQkibGFjIElOVEVHRVIgTk9UIE5VTEwgREVGQVVMVCAwIgorCQkiKSIsCisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIEF1dGhUb2tlbiAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJzdWJzY3JpYmVyX2lkIElOVEVHRVIgVU5JUVVFIE5PVCBOVUxMLCAiCisJCSJjcmVhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkidG9rZW4gVEVYVCBVTklRVUUgTk9UIE5VTEwiCisJCSIpIiwKKwkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgRXF1aXBtZW50ICgiCisJCSJpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsICIKKwkJImNyZWF0ZWQgVElNRVNUQU1QIE5PVCBOVUxMLCAiCisJCSJ1cGRhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkibmFtZSBURVhULCAiCisJCSJjbGFzc21hcmsxIE5VTUVSSUMsICIKKwkJImNsYXNzbWFyazIgQkxPQiwgIgorCQkiY2xhc3NtYXJrMyBCTE9CLCAiCisJCSJpbWVpIE5VTUVSSUMgVU5JUVVFIE5PVCBOVUxMIgorCQkiKSIsCisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIEVxdWlwbWVudFdhdGNoICgiCisJCSJpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsICIKKwkJImNyZWF0ZWQgVElNRVNUQU1QIE5PVCBOVUxMLCAiCisJCSJ1cGRhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkic3Vic2NyaWJlcl9pZCBOVU1FUklDIE5PVCBOVUxMLCAiCisJCSJlcXVpcG1lbnRfaWQgTlVNRVJJQyBOT1QgTlVMTCwgIgorCQkiVU5JUVVFIChzdWJzY3JpYmVyX2lkLCBlcXVpcG1lbnRfaWQpICIKKwkJIikiLAorCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBTTVMgKCIKKwkJLyogbWV0YWRhdGEsIG5vdCBwYXJ0IG9mIHNtcyAqLworCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJjcmVhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkic2VudCBUSU1FU1RBTVAsICIKKwkJInNlbmRlcl9pZCBJTlRFR0VSIE5PVCBOVUxMLCAiCisJCSJyZWNlaXZlcl9pZCBJTlRFR0VSIE5PVCBOVUxMLCAiCisJCSJkZWxpdmVyX2F0dGVtcHRzIElOVEVHRVIgTk9UIE5VTEwgREVGQVVMVCAwLCAiCisJCS8qIGRhdGEgZGlyZWN0bHkgY29waWVkL2Rlcml2ZWQgZnJvbSBTTVMgKi8KKwkJInZhbGlkX3VudGlsIFRJTUVTVEFNUCwgIgorCQkicmVwbHlfcGF0aF9yZXEgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkic3RhdHVzX3JlcF9yZXEgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkicHJvdG9jb2xfaWQgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkiZGF0YV9jb2Rpbmdfc2NoZW1lIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJInVkX2hkcl9pbmQgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkiZGVzdF9hZGRyIFRFWFQsICIKKwkJInVzZXJfZGF0YSBCTE9CLCAiCS8qIFRQLVVEICovCisJCS8qIGFkZGl0aW9uYWwgZGF0YSwgaW50ZXJwcmV0ZWQgZnJvbSBTTVMgKi8KKwkJImhlYWRlciBCTE9CLCAiCQkvKiBVRCBIZWFkZXIgKi8KKwkJInRleHQgVEVYVCAiCQkvKiBkZWNvZGVkIFVEIGFmdGVyIFVESCAqLworCQkiKSIsCisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIFZMUiAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJjcmVhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkidXBkYXRlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJInN1YnNjcmliZXJfaWQgTlVNRVJJQyBVTklRVUUgTk9UIE5VTEwsICIKKwkJImxhc3RfYnRzIE5VTUVSSUMgTk9UIE5VTEwgIgorCQkiKSIsCisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIEFwZHVCbG9icyAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJjcmVhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkiYXBkdV9pZF9mbGFncyBJTlRFR0VSIE5PVCBOVUxMLCAiCisJCSJzdWJzY3JpYmVyX2lkIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJImFwZHUgQkxPQiAiCisJCSIpIiwKKwkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgQ291bnRlcnMgKCIKKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkidGltZXN0YW1wIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkidmFsdWUgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkibmFtZSBURVhUIE5PVCBOVUxMICIKKwkJIikiLAorCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBSYXRlQ291bnRlcnMgKCIKKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkidGltZXN0YW1wIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkidmFsdWUgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkibmFtZSBURVhUIE5PVCBOVUxMLCAiCisJCSJpZHggSU5URUdFUiBOT1QgTlVMTCAiCisJCSIpIiwKKwkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgQXV0aEtleXMgKCIKKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkic3Vic2NyaWJlcl9pZCBJTlRFR0VSIFVOSVFVRSBOT1QgTlVMTCwgIgorCQkiYWxnb3JpdGhtX2lkIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJImEzYThfa2kgQkxPQiAiCisJCSIpIiwKKwkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgQXV0aFR1cGxlcyAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJzdWJzY3JpYmVyX2lkIE5VTUVSSUMgVU5JUVVFIE5PVCBOVUxMLCAiCisJCSJpc3N1ZWQgVElNRVNUQU1QIE5PVCBOVUxMLCAiCisJCSJ1c2VfY291bnQgSU5URUdFUiBOT1QgTlVMTCBERUZBVUxUIDAsICIKKwkJImtleV9zZXEgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkicmFuZCBCTE9CIE5PVCBOVUxMLCAiCisJCSJzcmVzIEJMT0IgTk9UIE5VTEwsICIKKwkJImtjIEJMT0IgTk9UIE5VTEwgIgorCQkiKSIsCit9OworCit2b2lkIGRiX2Vycm9yX2Z1bmMoZGJpX2Nvbm4gY29ubiwgdm9pZCAqZGF0YSkKK3sKKwljb25zdCBjaGFyICptc2c7CisJZGJpX2Nvbm5fZXJyb3IoY29ubiwgJm1zZyk7CisJTE9HUChEREIsIExPR0xfRVJST1IsICJEQkk6ICVzXG4iLCBtc2cpOworfQorCitzdGF0aWMgaW50IGNoZWNrX2RiX3JldmlzaW9uKHZvaWQpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJY29uc3QgY2hhciAqcmV2OworCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnkoY29ubiwKKwkJCQkiU0VMRUNUIHZhbHVlIEZST00gTWV0YSBXSEVSRSBrZXk9J3JldmlzaW9uJyIpOworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV2ID0gZGJpX3Jlc3VsdF9nZXRfc3RyaW5nKHJlc3VsdCwgInZhbHVlIik7CisJaWYgKCFyZXYgfHwgYXRvaShyZXYpICE9IDIpIHsKKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCXJldHVybiAwOworfQorCitpbnQgZGJfaW5pdChjb25zdCBjaGFyICpuYW1lKQoreworCWRiaV9pbml0aWFsaXplKE5VTEwpOworCisJY29ubiA9IGRiaV9jb25uX25ldygic3FsaXRlMyIpOworCWlmIChjb25uID09IE5VTEwpIHsKKwkJTE9HUChEREIsIExPR0xfRkFUQUwsICJGYWlsZWQgdG8gY3JlYXRlIGNvbm5lY3Rpb24uXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZGJpX2Nvbm5fZXJyb3JfaGFuZGxlciggY29ubiwgZGJfZXJyb3JfZnVuYywgTlVMTCApOworCisJLyogTXlTUUwKKwlkYmlfY29ubl9zZXRfb3B0aW9uKGNvbm4sICJob3N0IiwgImxvY2FsaG9zdCIpOworCWRiaV9jb25uX3NldF9vcHRpb24oY29ubiwgInVzZXJuYW1lIiwgInlvdXJfbmFtZSIpOworCWRiaV9jb25uX3NldF9vcHRpb24oY29ubiwgInBhc3N3b3JkIiwgInlvdXJfcGFzc3dvcmQiKTsKKwlkYmlfY29ubl9zZXRfb3B0aW9uKGNvbm4sICJkYm5hbWUiLCAieW91cl9kYm5hbWUiKTsKKwlkYmlfY29ubl9zZXRfb3B0aW9uKGNvbm4sICJlbmNvZGluZyIsICJVVEYtOCIpOworCSovCisKKwkvKiBTcUxpdGUgMyAqLworCWRiX2Jhc2VuYW1lID0gc3RyZHVwKG5hbWUpOworCWRiX2Rpcm5hbWUgPSBzdHJkdXAobmFtZSk7CisJZGJpX2Nvbm5fc2V0X29wdGlvbihjb25uLCAic3FsaXRlM19kYmRpciIsIGRpcm5hbWUoZGJfZGlybmFtZSkpOworCWRiaV9jb25uX3NldF9vcHRpb24oY29ubiwgImRibmFtZSIsIGJhc2VuYW1lKGRiX2Jhc2VuYW1lKSk7CisKKwlpZiAoZGJpX2Nvbm5fY29ubmVjdChjb25uKSA8IDApCisJCWdvdG8gb3V0X2VycjsKKworCXJldHVybiAwOworCitvdXRfZXJyOgorCWZyZWUoZGJfZGlybmFtZSk7CisJZnJlZShkYl9iYXNlbmFtZSk7CisJZGJfZGlybmFtZSA9IGRiX2Jhc2VuYW1lID0gTlVMTDsKKwlyZXR1cm4gLTE7Cit9CisKKworaW50IGRiX3ByZXBhcmUoKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3JlYXRlX3N0bXRzKTsgaSsrKSB7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5KGNvbm4sIGNyZWF0ZV9zdG10c1tpXSk7CisJCWlmICghcmVzdWx0KSB7CisJCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwKKwkJCSAgICAgIkZhaWxlZCB0byBjcmVhdGUgc29tZSB0YWJsZS5cbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJfQorCisJaWYgKGNoZWNrX2RiX3JldmlzaW9uKCkgPCAwKSB7CisJCUxPR1AoRERCLCBMT0dMX0ZBVEFMLCAiRGF0YWJhc2Ugc2NoZW1hIHJldmlzaW9uIGludmFsaWQsICIKKwkJCSJwbGVhc2UgdXBkYXRlIHlvdXIgZGF0YWJhc2Ugc2NoZW1hXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBkYl9maW5pKCkKK3sKKwlkYmlfY29ubl9jbG9zZShjb25uKTsKKwlkYmlfc2h1dGRvd24oKTsKKworCWlmIChkYl9kaXJuYW1lKQorCSAgICBmcmVlKGRiX2Rpcm5hbWUpOworCWlmIChkYl9iYXNlbmFtZSkKKwkgICAgZnJlZShkYl9iYXNlbmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqZGJfY3JlYXRlX3N1YnNjcmliZXIoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGNoYXIgKmltc2kpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisKKwkvKiBJcyB0aGlzIHN1YnNjcmliZXIga25vd24gaW4gdGhlIGRiPyAqLworCXN1YnNjciA9IGRiX2dldF9zdWJzY3JpYmVyKG5ldCwgR1NNX1NVQlNDUklCRVJfSU1TSSwgaW1zaSk7CisJaWYgKHN1YnNjcikgeworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVVBEQVRFIFN1YnNjcmliZXIgc2V0IHVwZGF0ZWQgPSBkYXRldGltZSgnbm93JykgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJXSEVSRSBpbXNpID0gJXMgIiAsIGltc2kpOworCQlpZiAoIXJlc3VsdCkKKwkJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiZmFpbGVkIHRvIHVwZGF0ZSB0aW1lc3RhbXBcbiIpOworCQllbHNlCisJCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJcmV0dXJuIHN1YnNjcjsKKwl9CisKKwlzdWJzY3IgPSBzdWJzY3JfYWxsb2MoKTsKKwlzdWJzY3ItPmZsYWdzIHw9IEdTTV9TVUJTQ1JJQkVSX0ZJUlNUX0NPTlRBQ1Q7CisJaWYgKCFzdWJzY3IpCisJCXJldHVybiBOVUxMOworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiSU5TRVJUIElOVE8gU3Vic2NyaWJlciAiCisJCSIoaW1zaSwgY3JlYXRlZCwgdXBkYXRlZCkgIgorCQkiVkFMVUVTICIKKwkJIiglcywgZGF0ZXRpbWUoJ25vdycpLCBkYXRldGltZSgnbm93JykpICIsCisJCWltc2kKKwkpOworCWlmICghcmVzdWx0KQorCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgU3Vic2NyaWJlciBieSBJTVNJLlxuIik7CisJc3Vic2NyLT5uZXQgPSBuZXQ7CisJc3Vic2NyLT5pZCA9IGRiaV9jb25uX3NlcXVlbmNlX2xhc3QoY29ubiwgTlVMTCk7CisJc3RybmNweShzdWJzY3ItPmltc2ksIGltc2ksIEdTTV9JTVNJX0xFTkdUSC0xKTsKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwlMT0dQKEREQiwgTE9HTF9JTkZPLCAiTmV3IFN1YnNjcmliZXI6IElEICVsbHUsIElNU0kgJXNcbiIsIHN1YnNjci0+aWQsIHN1YnNjci0+aW1zaSk7CisJZGJfc3Vic2NyaWJlcl9hbGxvY19leHRlbihzdWJzY3IpOworCXJldHVybiBzdWJzY3I7Cit9CisKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHVuc2lnbmVkIGNoYXIpID09IHNpemVvZihzdHJ1Y3QgZ3NtNDhfY2xhc3NtYXJrMSksIGNsYXNzbWFyazFfc2l6ZSk7CisKK3N0YXRpYyBpbnQgZ2V0X2VxdWlwbWVudF9ieV9zdWJzY3Ioc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJY29uc3QgY2hhciAqc3RyaW5nOworCXVuc2lnbmVkIGNoYXIgY20xOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNtMiwgKmNtMzsKKwlzdHJ1Y3QgZ3NtX2VxdWlwbWVudCAqZXF1aXAgPSAmc3Vic2NyLT5lcXVpcG1lbnQ7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCQkiU0VMRUNUIGVxdWlwbWVudC4qIEZST00gRXF1aXBtZW50LEVxdWlwbWVudFdhdGNoICIKKwkJCQkiV0hFUkUgRXF1aXBtZW50V2F0Y2guZXF1aXBtZW50X2lkPUVxdWlwbWVudC5pZCAiCisJCQkJIkFORCBFcXVpcG1lbnRXYXRjaC5zdWJzY3JpYmVyX2lkID0gJWxsdSAiCisJCQkJIk9SREVSIEJZIHVwZGF0ZWQgREVTQyIsIHN1YnNjci0+aWQpOworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVJTzsKKworCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwllcXVpcC0+aWQgPSBkYmlfcmVzdWx0X2dldF91bG9uZ2xvbmcocmVzdWx0LCAiaWQiKTsKKworCXN0cmluZyA9IGRiaV9yZXN1bHRfZ2V0X3N0cmluZyhyZXN1bHQsICJpbWVpIik7CisJaWYgKHN0cmluZykKKwkJc3RybmNweShlcXVpcC0+aW1laSwgc3RyaW5nLCBzaXplb2YoZXF1aXAtPmltZWkpKTsKKworCXN0cmluZyA9IGRiaV9yZXN1bHRfZ2V0X3N0cmluZyhyZXN1bHQsICJjbGFzc21hcmsxIik7CisJaWYgKHN0cmluZykgeworCQljbTEgPSBhdG9pKHN0cmluZykgJiAweGZmOworCQltZW1jcHkoJmVxdWlwLT5jbGFzc21hcmsxLCAmY20xLCBzaXplb2YoZXF1aXAtPmNsYXNzbWFyazEpKTsKKwl9CisKKwllcXVpcC0+Y2xhc3NtYXJrMl9sZW4gPSBkYmlfcmVzdWx0X2dldF9maWVsZF9sZW5ndGgocmVzdWx0LCAiY2xhc3NtYXJrMiIpOworCWNtMiA9IGRiaV9yZXN1bHRfZ2V0X2JpbmFyeShyZXN1bHQsICJjbGFzc21hcmsyIik7CisJaWYgKGVxdWlwLT5jbGFzc21hcmsyX2xlbiA+IHNpemVvZihlcXVpcC0+Y2xhc3NtYXJrMikpCisJCWVxdWlwLT5jbGFzc21hcmsyX2xlbiA9IHNpemVvZihlcXVpcC0+Y2xhc3NtYXJrMik7CisJbWVtY3B5KGVxdWlwLT5jbGFzc21hcmsyLCBjbTIsIGVxdWlwLT5jbGFzc21hcmsyX2xlbik7CisKKwllcXVpcC0+Y2xhc3NtYXJrM19sZW4gPSBkYmlfcmVzdWx0X2dldF9maWVsZF9sZW5ndGgocmVzdWx0LCAiY2xhc3NtYXJrMyIpOworCWNtMyA9IGRiaV9yZXN1bHRfZ2V0X2JpbmFyeShyZXN1bHQsICJjbGFzc21hcmszIik7CisJaWYgKGVxdWlwLT5jbGFzc21hcmszX2xlbiA+IHNpemVvZihlcXVpcC0+Y2xhc3NtYXJrMykpCisJCWVxdWlwLT5jbGFzc21hcmszX2xlbiA9IHNpemVvZihlcXVpcC0+Y2xhc3NtYXJrMyk7CisJbWVtY3B5KGVxdWlwLT5jbGFzc21hcmszLCBjbTMsIGVxdWlwLT5jbGFzc21hcmszX2xlbik7CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCXJldHVybiAwOworfQorCitpbnQgZ2V0X2F1dGhpbmZvX2J5X3N1YnNjcihzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyAqYWluZm8sCisJCQkgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICphM2E4X2tpOworCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQkiU0VMRUNUICogRlJPTSBBdXRoS2V5cyBXSEVSRSBzdWJzY3JpYmVyX2lkPSV1IiwKKwkJCSBzdWJzY3ItPmlkKTsKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoIWRiaV9yZXN1bHRfbmV4dF9yb3cocmVzdWx0KSkgeworCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJYWluZm8tPmF1dGhfYWxnbyA9IGRiaV9yZXN1bHRfZ2V0X3Vsb25nbG9uZyhyZXN1bHQsICJhbGdvcml0aG1faWQiKTsKKwlhaW5mby0+YTNhOF9raV9sZW4gPSBkYmlfcmVzdWx0X2dldF9maWVsZF9sZW5ndGgocmVzdWx0LCAiYTNhOF9raSIpOworCWEzYThfa2kgPSBkYmlfcmVzdWx0X2dldF9iaW5hcnkocmVzdWx0LCAiYTNhOF9raSIpOworCWlmIChhaW5mby0+YTNhOF9raV9sZW4gPiBzaXplb2YoYWluZm8tPmEzYThfa2kpKQorCQlhaW5mby0+YTNhOF9raV9sZW4gPSBzaXplb2YoYWluZm8tPmEzYThfa2lfbGVuKTsKKwltZW1jcHkoYWluZm8tPmEzYThfa2ksIGEzYThfa2ksIGFpbmZvLT5hM2E4X2tpX2xlbik7CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCXJldHVybiAwOworfQorCitpbnQgc2V0X2F1dGhpbmZvX2Zvcl9zdWJzY3Ioc3RydWN0IGdzbV9hdXRoX2luZm8gKmFpbmZvLAorCQkJICAgIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCXN0cnVjdCBnc21fYXV0aF9pbmZvIGFpbmZvX29sZDsKKwlpbnQgcmMsIHVwZDsKKwl1bnNpZ25lZCBjaGFyICpraV9zdHI7CisKKwkvKiBEZWxldGlvbiA/ICovCisJaWYgKGFpbmZvID09IE5VTEwpIHsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQkiREVMRVRFIEZST00gQXV0aEtleXMgV0hFUkUgc3Vic2NyaWJlcl9pZD0ldSIsCisJCQlzdWJzY3ItPmlkKTsKKworCQlpZiAoIXJlc3VsdCkKKwkJCXJldHVybiAtRUlPOworCisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJCXJldHVybiAwOworCX0KKworCS8qIENoZWNrIGlmIGFscmVhZHkgZXhpc3RpbmcgKi8KKwlyYyA9IGdldF9hdXRoaW5mb19ieV9zdWJzY3IoJmFpbmZvX29sZCwgc3Vic2NyKTsKKwlpZiAocmMgJiYgcmMgIT0gLUVOT0VOVCkKKwkJcmV0dXJuIHJjOworCXVwZCA9IHJjID8gMCA6IDE7CisKKwkvKiBVcGRhdGUgLyBJbnNlcnQgKi8KKwlkYmlfY29ubl9xdW90ZV9iaW5hcnlfY29weShjb25uLAorCQlhaW5mby0+YTNhOF9raSwgYWluZm8tPmEzYThfa2lfbGVuLCAma2lfc3RyKTsKKworCWlmICghdXBkKSB7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJCSJJTlNFUlQgSU5UTyBBdXRoS2V5cyAiCisJCQkJIihzdWJzY3JpYmVyX2lkLCBhbGdvcml0aG1faWQsIGEzYThfa2kpICIKKwkJCQkiVkFMVUVTICgldSwgJXUsICVzKSIsCisJCQkJc3Vic2NyLT5pZCwgYWluZm8tPmF1dGhfYWxnbywga2lfc3RyKTsKKwl9IGVsc2UgeworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCQkiVVBEQVRFIEF1dGhLZXlzICIKKwkJCQkiU0VUIGFsZ29yaXRobV9pZD0ldSwgYTNhOF9raT0lcyAiCisJCQkJIldIRVJFIHN1YnNjcmliZXJfaWQ9JXUiLAorCQkJCWFpbmZvLT5hdXRoX2FsZ28sIGtpX3N0ciwgc3Vic2NyLT5pZCk7CisJfQorCisJZnJlZShraV9zdHIpOworCisJaWYgKCFyZXN1bHQpCisJCXJldHVybiAtRUlPOworCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGdldF9hdXRodHVwbGVfYnlfc3Vic2NyKHN0cnVjdCBnc21fYXV0aF90dXBsZSAqYXR1cGxlLAorCQkJICAgIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCWludCBsZW47CisJY29uc3QgdW5zaWduZWQgY2hhciAqYmxvYjsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJIlNFTEVDVCAqIEZST00gQXV0aFR1cGxlcyBXSEVSRSBzdWJzY3JpYmVyX2lkPSV1IiwKKwkJCXN1YnNjci0+aWQpOworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVJTzsKKworCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwltZW1zZXQoYXR1cGxlLCAwLCBzaXplb2YoYXR1cGxlKSk7CisKKwlhdHVwbGUtPnVzZV9jb3VudCA9IGRiaV9yZXN1bHRfZ2V0X3Vsb25nbG9uZyhyZXN1bHQsICJ1c2VfY291bnQiKTsKKwlhdHVwbGUtPmtleV9zZXEgPSBkYmlfcmVzdWx0X2dldF91bG9uZ2xvbmcocmVzdWx0LCAia2V5X3NlcSIpOworCisJbGVuID0gZGJpX3Jlc3VsdF9nZXRfZmllbGRfbGVuZ3RoKHJlc3VsdCwgInJhbmQiKTsKKwlpZiAobGVuICE9IHNpemVvZihhdHVwbGUtPnJhbmQpKQorCQlnb3RvIGVycl9zaXplOworCisJYmxvYiA9IGRiaV9yZXN1bHRfZ2V0X2JpbmFyeShyZXN1bHQsICJyYW5kIik7CisJbWVtY3B5KGF0dXBsZS0+cmFuZCwgYmxvYiwgbGVuKTsKKworCWxlbiA9IGRiaV9yZXN1bHRfZ2V0X2ZpZWxkX2xlbmd0aChyZXN1bHQsICJzcmVzIik7CisJaWYgKGxlbiAhPSBzaXplb2YoYXR1cGxlLT5zcmVzKSkKKwkJZ290byBlcnJfc2l6ZTsKKworCWJsb2IgPSBkYmlfcmVzdWx0X2dldF9iaW5hcnkocmVzdWx0LCAic3JlcyIpOworCW1lbWNweShhdHVwbGUtPnNyZXMsIGJsb2IsIGxlbik7CisKKwlsZW4gPSBkYmlfcmVzdWx0X2dldF9maWVsZF9sZW5ndGgocmVzdWx0LCAia2MiKTsKKwlpZiAobGVuICE9IHNpemVvZihhdHVwbGUtPmtjKSkKKwkJZ290byBlcnJfc2l6ZTsKKworCWJsb2IgPSBkYmlfcmVzdWx0X2dldF9iaW5hcnkocmVzdWx0LCAia2MiKTsKKwltZW1jcHkoYXR1cGxlLT5rYywgYmxvYiwgbGVuKTsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJcmV0dXJuIDA7CisKK2Vycl9zaXplOgorCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCXJldHVybiAtRUlPOworfQorCitpbnQgc2V0X2F1dGh0dXBsZV9mb3Jfc3Vic2NyKHN0cnVjdCBnc21fYXV0aF90dXBsZSAqYXR1cGxlLAorCQkJICAgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwlpbnQgcmMsIHVwZDsKKwlzdHJ1Y3QgZ3NtX2F1dGhfdHVwbGUgYXR1cGxlX29sZDsKKwl1bnNpZ25lZCBjaGFyICpyYW5kX3N0ciwgKnNyZXNfc3RyLCAqa2Nfc3RyOworCisJLyogRGVsZXRpb24gPyAqLworCWlmIChhdHVwbGUgPT0gTlVMTCkgeworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCSJERUxFVEUgRlJPTSBBdXRoVHVwbGVzIFdIRVJFIHN1YnNjcmliZXJfaWQ9JXUiLAorCQkJc3Vic2NyLT5pZCk7CisKKwkJaWYgKCFyZXN1bHQpCisJCQlyZXR1cm4gLUVJTzsKKworCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDaGVjayBpZiBhbHJlYWR5IGV4aXN0aW5nICovCisJcmMgPSBnZXRfYXV0aHR1cGxlX2J5X3N1YnNjcigmYXR1cGxlX29sZCwgc3Vic2NyKTsKKwlpZiAocmMgJiYgcmMgIT0gLUVOT0VOVCkKKwkJcmV0dXJuIHJjOworCXVwZCA9IHJjID8gMCA6IDE7CisKKwkvKiBVcGRhdGUgLyBJbnNlcnQgKi8KKwlkYmlfY29ubl9xdW90ZV9iaW5hcnlfY29weShjb25uLAorCQlhdHVwbGUtPnJhbmQsIHNpemVvZihhdHVwbGUtPnJhbmQpLCAmcmFuZF9zdHIpOworCWRiaV9jb25uX3F1b3RlX2JpbmFyeV9jb3B5KGNvbm4sCisJCWF0dXBsZS0+c3Jlcywgc2l6ZW9mKGF0dXBsZS0+c3JlcyksICZzcmVzX3N0cik7CisJZGJpX2Nvbm5fcXVvdGVfYmluYXJ5X2NvcHkoY29ubiwKKwkJYXR1cGxlLT5rYywgc2l6ZW9mKGF0dXBsZS0+a2MpLCAma2Nfc3RyKTsKKworCWlmICghdXBkKSB7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJCSJJTlNFUlQgSU5UTyBBdXRoVHVwbGVzICIKKwkJCQkiKHN1YnNjcmliZXJfaWQsIGlzc3VlZCwgdXNlX2NvdW50LCAiCisJCQkJICJrZXlfc2VxLCByYW5kLCBzcmVzLCBrYykgIgorCQkJCSJWQUxVRVMgKCV1LCBkYXRldGltZSgnbm93JyksICV1LCAiCisJCQkJICIldSwgJXMsICVzLCAlcyApICIsCisJCQkJc3Vic2NyLT5pZCwgYXR1cGxlLT51c2VfY291bnQsIGF0dXBsZS0+a2V5X3NlcSwKKwkJCQlyYW5kX3N0ciwgc3Jlc19zdHIsIGtjX3N0cik7CisJfSBlbHNlIHsKKwkJY2hhciAqaXNzdWVkID0gYXR1cGxlLT5rZXlfc2VxID09IGF0dXBsZV9vbGQua2V5X3NlcSA/CisJCQkJCSJpc3N1ZWQiIDogImRhdGV0aW1lKCdub3cnKSI7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJCSJVUERBVEUgQXV0aEtleXMgIgorCQkJCSJTRVQgaXNzdWVkPSVzLCB1c2VfY291bnQ9JXUsICIKKwkJCQkgImtleV9zZXE9JXUsIHJhbmQ9JXMsIHNyZXM9JXMsIGtjPSVzICIKKwkJCQkiV0hFUkUgc3Vic2NyaWJlcl9pZCA9ICV1IiwKKwkJCQlpc3N1ZWQsIGF0dXBsZS0+dXNlX2NvdW50LCBhdHVwbGUtPmtleV9zZXEsCisJCQkJcmFuZF9zdHIsIHNyZXNfc3RyLCBrY19zdHIsIHN1YnNjci0+aWQpOworCX0KKworCWZyZWUocmFuZF9zdHIpOworCWZyZWUoc3Jlc19zdHIpOworCWZyZWUoa2Nfc3RyKTsKKworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVJTzsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQkFTRV9RVUVSWSAiU0VMRUNUICogRlJPTSBTdWJzY3JpYmVyICIKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqZGJfZ2V0X3N1YnNjcmliZXIoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCSBlbnVtIGdzbV9zdWJzY3JpYmVyX2ZpZWxkIGZpZWxkLAorCQkJCQkgY29uc3QgY2hhciAqaWQpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJY29uc3QgY2hhciAqc3RyaW5nOworCWNoYXIgKnF1b3RlZDsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCXN3aXRjaCAoZmllbGQpIHsKKwljYXNlIEdTTV9TVUJTQ1JJQkVSX0lNU0k6CisJCWRiaV9jb25uX3F1b3RlX3N0cmluZ19jb3B5KGNvbm4sIGlkLCAmcXVvdGVkKTsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQlCQVNFX1FVRVJZCisJCQkiV0hFUkUgaW1zaSA9ICVzICIsCisJCQlxdW90ZWQKKwkJKTsKKwkJZnJlZShxdW90ZWQpOworCQlicmVhazsKKwljYXNlIEdTTV9TVUJTQ1JJQkVSX1RNU0k6CisJCWRiaV9jb25uX3F1b3RlX3N0cmluZ19jb3B5KGNvbm4sIGlkLCAmcXVvdGVkKTsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQlCQVNFX1FVRVJZCisJCQkiV0hFUkUgdG1zaSA9ICVzICIsCisJCQlxdW90ZWQKKwkJKTsKKwkJZnJlZShxdW90ZWQpOworCQlicmVhazsKKwljYXNlIEdTTV9TVUJTQ1JJQkVSX0VYVEVOU0lPTjoKKwkJZGJpX2Nvbm5fcXVvdGVfc3RyaW5nX2NvcHkoY29ubiwgaWQsICZxdW90ZWQpOworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCUJBU0VfUVVFUlkKKwkJCSJXSEVSRSBleHRlbnNpb24gPSAlcyAiLAorCQkJcXVvdGVkCisJCSk7CisJCWZyZWUocXVvdGVkKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fU1VCU0NSSUJFUl9JRDoKKwkJZGJpX2Nvbm5fcXVvdGVfc3RyaW5nX2NvcHkoY29ubiwgaWQsICZxdW90ZWQpOworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCUJBU0VfUVVFUlkKKwkJCSJXSEVSRSBpZCA9ICVzICIsIHF1b3RlZCk7CisJCWZyZWUocXVvdGVkKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEREIsIExPR0xfTk9USUNFLCAiVW5rbm93biBxdWVyeSBzZWxlY3RvciBmb3IgU3Vic2NyaWJlci5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKCFyZXN1bHQpIHsKKwkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gcXVlcnkgU3Vic2NyaWJlci5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKCFkYmlfcmVzdWx0X25leHRfcm93KHJlc3VsdCkpIHsKKwkJREVCVUdQKEREQiwgIkZhaWxlZCB0byBmaW5kIHRoZSBTdWJzY3JpYmVyLiAnJXUnICclcydcbiIsCisJCQlmaWVsZCwgaWQpOworCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc3Vic2NyID0gc3Vic2NyX2FsbG9jKCk7CisJc3Vic2NyLT5uZXQgPSBuZXQ7CisJc3Vic2NyLT5pZCA9IGRiaV9yZXN1bHRfZ2V0X3Vsb25nbG9uZyhyZXN1bHQsICJpZCIpOworCXN0cmluZyA9IGRiaV9yZXN1bHRfZ2V0X3N0cmluZyhyZXN1bHQsICJpbXNpIik7CisJaWYgKHN0cmluZykKKwkJc3RybmNweShzdWJzY3ItPmltc2ksIHN0cmluZywgR1NNX0lNU0lfTEVOR1RIKTsKKworCXN0cmluZyA9IGRiaV9yZXN1bHRfZ2V0X3N0cmluZyhyZXN1bHQsICJ0bXNpIik7CisJaWYgKHN0cmluZykKKwkJc3Vic2NyLT50bXNpID0gdG1zaV9mcm9tX3N0cmluZyhzdHJpbmcpOworCisJc3RyaW5nID0gZGJpX3Jlc3VsdF9nZXRfc3RyaW5nKHJlc3VsdCwgIm5hbWUiKTsKKwlpZiAoc3RyaW5nKQorCQlzdHJuY3B5KHN1YnNjci0+bmFtZSwgc3RyaW5nLCBHU01fTkFNRV9MRU5HVEgpOworCisJc3RyaW5nID0gZGJpX3Jlc3VsdF9nZXRfc3RyaW5nKHJlc3VsdCwgImV4dGVuc2lvbiIpOworCWlmIChzdHJpbmcpCisJCXN0cm5jcHkoc3Vic2NyLT5leHRlbnNpb24sIHN0cmluZywgR1NNX0VYVEVOU0lPTl9MRU5HVEgpOworCisJc3Vic2NyLT5sYWMgPSBkYmlfcmVzdWx0X2dldF91aW50KHJlc3VsdCwgImxhYyIpOworCXN1YnNjci0+YXV0aG9yaXplZCA9IGRiaV9yZXN1bHRfZ2V0X3VpbnQocmVzdWx0LCAiYXV0aG9yaXplZCIpOworCURFQlVHUChEREIsICJGb3VuZCBTdWJzY3JpYmVyOiBJRCAlbGx1LCBJTVNJICVzLCBOQU1FICclcycsIFRNU0kgJXUsIEVYVEVOICclcycsIExBQyAlaHUsIEFVVEggJXVcbiIsCisJCXN1YnNjci0+aWQsIHN1YnNjci0+aW1zaSwgc3Vic2NyLT5uYW1lLCBzdWJzY3ItPnRtc2ksIHN1YnNjci0+ZXh0ZW5zaW9uLAorCQlzdWJzY3ItPmxhYywgc3Vic2NyLT5hdXRob3JpemVkKTsKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCWdldF9lcXVpcG1lbnRfYnlfc3Vic2NyKHN1YnNjcik7CisKKwlyZXR1cm4gc3Vic2NyOworfQorCitpbnQgZGJfc3luY19zdWJzY3JpYmVyKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyaWJlcikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwljaGFyIHRtc2lbMTRdOworCWNoYXIgKnFfdG1zaTsKKworCWlmIChzdWJzY3JpYmVyLT50bXNpICE9IEdTTV9SRVNFUlZFRF9UTVNJKSB7CisJCXNwcmludGYodG1zaSwgIiV1Iiwgc3Vic2NyaWJlci0+dG1zaSk7CisJCWRiaV9jb25uX3F1b3RlX3N0cmluZ19jb3B5KGNvbm4sCisJCQkJICAgdG1zaSwKKwkJCQkgICAmcV90bXNpKTsKKwl9IGVsc2UKKwkJcV90bXNpID0gc3RyZHVwKCJOVUxMIik7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIlVQREFURSBTdWJzY3JpYmVyICIKKwkJIlNFVCB1cGRhdGVkID0gZGF0ZXRpbWUoJ25vdycpLCAiCisJCSJuYW1lID0gJyVzJywgIgorCQkiZXh0ZW5zaW9uID0gJyVzJywgIgorCQkiYXV0aG9yaXplZCA9ICVpLCAiCisJCSJ0bXNpID0gJXMsICIKKwkJImxhYyA9ICVpICIKKwkJIldIRVJFIGltc2kgPSAlcyAiLAorCQlzdWJzY3JpYmVyLT5uYW1lLAorCQlzdWJzY3JpYmVyLT5leHRlbnNpb24sCisJCXN1YnNjcmliZXItPmF1dGhvcml6ZWQsCisJCXFfdG1zaSwKKwkJc3Vic2NyaWJlci0+bGFjLAorCQlzdWJzY3JpYmVyLT5pbXNpKTsKKworCWZyZWUocV90bXNpKTsKKworCWlmICghcmVzdWx0KSB7CisJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIHVwZGF0ZSBTdWJzY3JpYmVyIChieSBJTVNJKS5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCXJldHVybiAwOworfQorCitpbnQgZGJfc3luY19lcXVpcG1lbnQoc3RydWN0IGdzbV9lcXVpcG1lbnQgKmVxdWlwKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCXVuc2lnbmVkIGNoYXIgKmNtMiwgKmNtMzsKKwl1X2ludDhfdCBjbGFzc21hcmsxOworCisJbWVtY3B5KCZjbGFzc21hcmsxLCAmZXF1aXAtPmNsYXNzbWFyazEsIHNpemVvZihjbGFzc21hcmsxKSk7CisJREVCVUdQKEREQiwgIlN5bmMgRXF1aXBtZW50IElNRUk9JXMsIGNsYXNzbWFyazE9JTAyeCIsCisJCWVxdWlwLT5pbWVpLCBjbGFzc21hcmsxKTsKKwlpZiAoZXF1aXAtPmNsYXNzbWFyazJfbGVuKQorCQlERUJVR1BDKEREQiwgIiwgY2xhc3NtYXJrMj0lcyIsCisJCQloZXhkdW1wKGVxdWlwLT5jbGFzc21hcmsyLCBlcXVpcC0+Y2xhc3NtYXJrMl9sZW4pKTsKKwlpZiAoZXF1aXAtPmNsYXNzbWFyazNfbGVuKQorCQlERUJVR1BDKEREQiwgIiwgY2xhc3NtYXJrMz0lcyIsCisJCQloZXhkdW1wKGVxdWlwLT5jbGFzc21hcmszLCBlcXVpcC0+Y2xhc3NtYXJrM19sZW4pKTsKKwlERUJVR1BDKEREQiwgIlxuIik7CisKKwlkYmlfY29ubl9xdW90ZV9iaW5hcnlfY29weShjb25uLCBlcXVpcC0+Y2xhc3NtYXJrMiwKKwkJCQkgICBlcXVpcC0+Y2xhc3NtYXJrMl9sZW4sICZjbTIpOworCWRiaV9jb25uX3F1b3RlX2JpbmFyeV9jb3B5KGNvbm4sIGVxdWlwLT5jbGFzc21hcmszLAorCQkJCSAgIGVxdWlwLT5jbGFzc21hcmszX2xlbiwgJmNtMyk7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIlVQREFURSBFcXVpcG1lbnQgU0VUICIKKwkJCSJ1cGRhdGVkID0gZGF0ZXRpbWUoJ25vdycpLCAiCisJCQkiY2xhc3NtYXJrMSA9ICV1LCAiCisJCQkiY2xhc3NtYXJrMiA9ICVzLCAiCisJCQkiY2xhc3NtYXJrMyA9ICVzICIKKwkJIldIRVJFIGltZWkgPSAnJXMnICIsCisJCWNsYXNzbWFyazEsIGNtMiwgY20zLCBlcXVpcC0+aW1laSk7CisKKwlmcmVlKGNtMik7CisJZnJlZShjbTMpOworCisJaWYgKCFyZXN1bHQpIHsKKwkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gdXBkYXRlIEVxdWlwbWVudFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCXJldHVybiAwOworfQorCitpbnQgZGJfc3Vic2NyaWJlcl9hbGxvY190bXNpKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyaWJlcikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdCA9IE5VTEw7CisJY2hhciB0bXNpWzE0XTsKKwljaGFyKiB0bXNpX3F1b3RlZDsKKworCWZvciAoOzspIHsKKwkJc3Vic2NyaWJlci0+dG1zaSA9IHJhbmQoKTsKKwkJaWYgKHN1YnNjcmliZXItPnRtc2kgPT0gR1NNX1JFU0VSVkVEX1RNU0kpCisJCQljb250aW51ZTsKKworCQlzcHJpbnRmKHRtc2ksICIldSIsIHN1YnNjcmliZXItPnRtc2kpOworCQlkYmlfY29ubl9xdW90ZV9zdHJpbmdfY29weShjb25uLCB0bXNpLCAmdG1zaV9xdW90ZWQpOworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCSJTRUxFQ1QgKiBGUk9NIFN1YnNjcmliZXIgIgorCQkJIldIRVJFIHRtc2kgPSAlcyAiLAorCQkJdG1zaV9xdW90ZWQpOworCisJCWZyZWUodG1zaV9xdW90ZWQpOworCisJCWlmICghcmVzdWx0KSB7CisJCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBxdWVyeSBTdWJzY3JpYmVyICIKKwkJCQkid2hpbGUgYWxsb2NhdGluZyBuZXcgVE1TSS5cbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKGRiaV9yZXN1bHRfZ2V0X251bXJvd3MocmVzdWx0KSkgeworCQkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIWRiaV9yZXN1bHRfbmV4dF9yb3cocmVzdWx0KSkgeworCQkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCQlERUJVR1AoRERCLCAiQWxsb2NhdGVkIFRNU0kgJXUgZm9yIElNU0kgJXMuXG4iLAorCQkJCXN1YnNjcmliZXItPnRtc2ksIHN1YnNjcmliZXItPmltc2kpOworCQkJcmV0dXJuIGRiX3N5bmNfc3Vic2NyaWJlcihzdWJzY3JpYmVyKTsKKwkJfQorCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBkYl9zdWJzY3JpYmVyX2FsbG9jX2V4dGVuKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyaWJlcikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdCA9IE5VTEw7CisJdV9pbnQzMl90IHRyeTsKKworCWZvciAoOzspIHsKKwkJdHJ5ID0gKHJhbmQoKSUoR1NNX01BWF9FWFRFTi1HU01fTUlOX0VYVEVOKzEpK0dTTV9NSU5fRVhURU4pOworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCSJTRUxFQ1QgKiBGUk9NIFN1YnNjcmliZXIgIgorCQkJIldIRVJFIGV4dGVuc2lvbiA9ICVpIiwKKwkJCXRyeQorCQkpOworCQlpZiAoIXJlc3VsdCkgeworCQkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gcXVlcnkgU3Vic2NyaWJlciAiCisJCQkJIndoaWxlIGFsbG9jYXRpbmcgbmV3IGV4dGVuc2lvbi5cbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKGRiaV9yZXN1bHRfZ2V0X251bXJvd3MocmVzdWx0KSl7CisJCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJCWJyZWFrOworCQl9CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCX0KKwlzcHJpbnRmKHN1YnNjcmliZXItPmV4dGVuc2lvbiwgIiVpIiwgdHJ5KTsKKwlERUJVR1AoRERCLCAiQWxsb2NhdGVkIGV4dGVuc2lvbiAlaSBmb3IgSU1TSSAlcy5cbiIsIHRyeSwgc3Vic2NyaWJlci0+aW1zaSk7CisJcmV0dXJuIGRiX3N5bmNfc3Vic2NyaWJlcihzdWJzY3JpYmVyKTsKK30KKy8qCisgKiB0cnkgdG8gYWxsb2NhdGUgYSBuZXcgdW5pcXVlIHRva2VuIGZvciB0aGlzIHN1YnNjcmliZXIgYW5kIHJldHVybiBpdAorICogdmlhIGEgcGFyYW1ldGVyLiBpZiB0aGUgc3Vic2NyaWJlciBhbHJlYWR5IGhhcyBhIHRva2VuLCByZXR1cm4KKyAqIGFuIGVycm9yLgorICovCisKK2ludCBkYl9zdWJzY3JpYmVyX2FsbG9jX3Rva2VuKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyaWJlciwgdV9pbnQzMl90ICp0b2tlbikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwl1X2ludDMyX3QgdHJ5OworCisJZm9yICg7OykgeworCQl0cnkgPSByYW5kKCk7CisJCWlmICghdHJ5KSAvKiAwIGlzIGFuIGludmFsaWQgdG9rZW4gKi8KKwkJCWNvbnRpbnVlOworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCSJTRUxFQ1QgKiBGUk9NIEF1dGhUb2tlbiAiCisJCQkiV0hFUkUgc3Vic2NyaWJlcl9pZCA9ICVsbHUgT1IgdG9rZW4gPSBcIiUwOFhcIiAiLAorCQkJc3Vic2NyaWJlci0+aWQsIHRyeSk7CisJCWlmICghcmVzdWx0KSB7CisJCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBxdWVyeSBBdXRoVG9rZW4gIgorCQkJCSJ3aGlsZSBhbGxvY2F0aW5nIG5ldyB0b2tlbi5cbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKGRiaV9yZXN1bHRfZ2V0X251bXJvd3MocmVzdWx0KSkgeworCQkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIWRiaV9yZXN1bHRfbmV4dF9yb3cocmVzdWx0KSkgeworCQkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCQlicmVhazsKKwkJfQorCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwl9CisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJJTlNFUlQgSU5UTyBBdXRoVG9rZW4gIgorCQkiKHN1YnNjcmliZXJfaWQsIGNyZWF0ZWQsIHRva2VuKSAiCisJCSJWQUxVRVMgIgorCQkiKCVsbHUsIGRhdGV0aW1lKCdub3cnKSwgXCIlMDhYXCIpICIsCisJCXN1YnNjcmliZXItPmlkLCB0cnkpOworCWlmICghcmVzdWx0KSB7CisJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSB0b2tlbiAlMDhYIGZvciAiCisJCQkiSU1TSSAlcy5cbiIsIHRyeSwgc3Vic2NyaWJlci0+aW1zaSk7CisJCXJldHVybiAxOworCX0KKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkqdG9rZW4gPSB0cnk7CisJREVCVUdQKEREQiwgIkFsbG9jYXRlZCB0b2tlbiAlMDhYIGZvciBJTVNJICVzLlxuIiwgdHJ5LCBzdWJzY3JpYmVyLT5pbXNpKTsKKworCXJldHVybiAwOworfQorCitpbnQgZGJfc3Vic2NyaWJlcl9hc3NvY19pbWVpKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyaWJlciwgY2hhciBpbWVpW0dTTV9JTUVJX0xFTkdUSF0pCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGVxdWlwbWVudF9pZCwgd2F0Y2hfaWQ7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisKKwlzdHJuY3B5KHN1YnNjcmliZXItPmVxdWlwbWVudC5pbWVpLCBpbWVpLAorCQlzaXplb2Yoc3Vic2NyaWJlci0+ZXF1aXBtZW50LmltZWkpLTEpLAorCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJJTlNFUlQgT1IgSUdOT1JFIElOVE8gRXF1aXBtZW50ICIKKwkJIihpbWVpLCBjcmVhdGVkLCB1cGRhdGVkKSAiCisJCSJWQUxVRVMgIgorCQkiKCVzLCBkYXRldGltZSgnbm93JyksIGRhdGV0aW1lKCdub3cnKSkgIiwKKwkJaW1laSk7CisJaWYgKCFyZXN1bHQpIHsKKwkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIEVxdWlwbWVudCBieSBJTUVJLlxuIik7CisJCXJldHVybiAxOworCX0KKworCWVxdWlwbWVudF9pZCA9IDA7CisJaWYgKGRiaV9yZXN1bHRfZ2V0X251bXJvd3NfYWZmZWN0ZWQocmVzdWx0KSkgeworCQllcXVpcG1lbnRfaWQgPSBkYmlfY29ubl9zZXF1ZW5jZV9sYXN0KGNvbm4sIE5VTEwpOworCX0KKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCWlmIChlcXVpcG1lbnRfaWQpCisJCURFQlVHUChEREIsICJOZXcgRXF1aXBtZW50OiBJRCAlbGx1LCBJTUVJICVzXG4iLCBlcXVpcG1lbnRfaWQsIGltZWkpOworCWVsc2UgeworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCSJTRUxFQ1QgaWQgRlJPTSBFcXVpcG1lbnQgIgorCQkJIldIRVJFIGltZWkgPSAlcyAiLAorCQkJaW1laQorCQkpOworCQlpZiAoIXJlc3VsdCkgeworCQkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gcXVlcnkgRXF1aXBtZW50IGJ5IElNRUkuXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBmaW5kIHRoZSBFcXVpcG1lbnQuXG4iKTsKKwkJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZXF1aXBtZW50X2lkID0gZGJpX3Jlc3VsdF9nZXRfdWxvbmdsb25nKHJlc3VsdCwgImlkIik7CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCX0KKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiSU5TRVJUIE9SIElHTk9SRSBJTlRPIEVxdWlwbWVudFdhdGNoICIKKwkJIihzdWJzY3JpYmVyX2lkLCBlcXVpcG1lbnRfaWQsIGNyZWF0ZWQsIHVwZGF0ZWQpICIKKwkJIlZBTFVFUyAiCisJCSIoJWxsdSwgJWxsdSwgZGF0ZXRpbWUoJ25vdycpLCBkYXRldGltZSgnbm93JykpICIsCisJCXN1YnNjcmliZXItPmlkLCBlcXVpcG1lbnRfaWQpOworCWlmICghcmVzdWx0KSB7CisJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBFcXVpcG1lbnRXYXRjaC5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwl3YXRjaF9pZCA9IDA7CisJaWYgKGRiaV9yZXN1bHRfZ2V0X251bXJvd3NfYWZmZWN0ZWQocmVzdWx0KSkKKwkJd2F0Y2hfaWQgPSBkYmlfY29ubl9zZXF1ZW5jZV9sYXN0KGNvbm4sIE5VTEwpOworCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJaWYgKHdhdGNoX2lkKQorCQlERUJVR1AoRERCLCAiTmV3IEVxdWlwbWVudFdhdGNoOiBJRCAlbGx1LCBJTVNJICVzLCBJTUVJICVzXG4iLAorCQkJZXF1aXBtZW50X2lkLCBzdWJzY3JpYmVyLT5pbXNpLCBpbWVpKTsKKwllbHNlIHsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQkiVVBEQVRFIEVxdWlwbWVudFdhdGNoICIKKwkJCSJTRVQgdXBkYXRlZCA9IGRhdGV0aW1lKCdub3cnKSAiCisJCQkiV0hFUkUgc3Vic2NyaWJlcl9pZCA9ICVsbHUgQU5EIGVxdWlwbWVudF9pZCA9ICVsbHUgIiwKKwkJCXN1YnNjcmliZXItPmlkLCBlcXVpcG1lbnRfaWQpOworCQlpZiAoIXJlc3VsdCkgeworCQkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gdXBkYXRlIEVxdWlwbWVudFdhdGNoLlxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJREVCVUdQKEREQiwgIlVwZGF0ZWQgRXF1aXBtZW50V2F0Y2g6IElEICVsbHUsIElNU0kgJXMsIElNRUkgJXNcbiIsCisJCQllcXVpcG1lbnRfaWQsIHN1YnNjcmliZXItPmltc2ksIGltZWkpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBzdG9yZSBhbiBbdW5zZW50XSBTTVMgdG8gdGhlIGRhdGFiYXNlICovCitpbnQgZGJfc21zX3N0b3JlKHN0cnVjdCBnc21fc21zICpzbXMpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJY2hhciAqcV90ZXh0LCAqcV9kYWRkcjsKKwl1bnNpZ25lZCBjaGFyICpxX3VkYXRhOworCWNoYXIgKnZhbGlkaXR5X3RpbWVzdGFtcCA9ICIyMjIyLTItMiI7CisKKwkvKiBGSVhNRTogZ2VuZXJhdGUgdmFsaWRpdHkgdGltZXN0YW1wIGJhc2VkIG9uIHZhbGlkaXR5X21pbnV0ZXMgKi8KKworCWRiaV9jb25uX3F1b3RlX3N0cmluZ19jb3B5KGNvbm4sIChjaGFyICopc21zLT50ZXh0LCAmcV90ZXh0KTsKKwlkYmlfY29ubl9xdW90ZV9zdHJpbmdfY29weShjb25uLCAoY2hhciAqKXNtcy0+ZGVzdF9hZGRyLCAmcV9kYWRkcik7CisJZGJpX2Nvbm5fcXVvdGVfYmluYXJ5X2NvcHkoY29ubiwgc21zLT51c2VyX2RhdGEsIHNtcy0+dXNlcl9kYXRhX2xlbiwKKwkJCQkgICAmcV91ZGF0YSk7CisJLyogRklYTUU6IGNvcnJlY3QgdmFsaWRpdHkgcGVyaW9kICovCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJJTlNFUlQgSU5UTyBTTVMgIgorCQkiKGNyZWF0ZWQsIHNlbmRlcl9pZCwgcmVjZWl2ZXJfaWQsIHZhbGlkX3VudGlsLCAiCisJCSAicmVwbHlfcGF0aF9yZXEsIHN0YXR1c19yZXBfcmVxLCBwcm90b2NvbF9pZCwgIgorCQkgImRhdGFfY29kaW5nX3NjaGVtZSwgdWRfaGRyX2luZCwgZGVzdF9hZGRyLCAiCisJCSAidXNlcl9kYXRhLCB0ZXh0KSBWQUxVRVMgIgorCQkiKGRhdGV0aW1lKCdub3cnKSwgJWxsdSwgJWxsdSwgJXUsICIKKwkJICIldSwgJXUsICV1LCAldSwgJXUsICVzLCAlcywgJXMpIiwKKwkJc21zLT5zZW5kZXItPmlkLAorCQlzbXMtPnJlY2VpdmVyID8gc21zLT5yZWNlaXZlci0+aWQgOiAwLCB2YWxpZGl0eV90aW1lc3RhbXAsCisJCXNtcy0+cmVwbHlfcGF0aF9yZXEsIHNtcy0+c3RhdHVzX3JlcF9yZXEsIHNtcy0+cHJvdG9jb2xfaWQsCisJCXNtcy0+ZGF0YV9jb2Rpbmdfc2NoZW1lLCBzbXMtPnVkX2hkcl9pbmQsCisJCXFfZGFkZHIsIHFfdWRhdGEsIHFfdGV4dCk7CisJZnJlZShxX3RleHQpOworCWZyZWUocV9kYWRkcik7CisJZnJlZShxX3VkYXRhKTsKKworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVJTzsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGdzbV9zbXMgKnNtc19mcm9tX3Jlc3VsdChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgZGJpX3Jlc3VsdCByZXN1bHQpCit7CisJc3RydWN0IGdzbV9zbXMgKnNtcyA9IHNtc19hbGxvYygpOworCWxvbmcgbG9uZyB1bnNpZ25lZCBpbnQgc2VuZGVyX2lkLCByZWNlaXZlcl9pZDsKKwljb25zdCBjaGFyICp0ZXh0LCAqZGFkZHI7CisJY29uc3QgdW5zaWduZWQgY2hhciAqdXNlcl9kYXRhOworCisJaWYgKCFzbXMpCisJCXJldHVybiBOVUxMOworCisJc21zLT5pZCA9IGRiaV9yZXN1bHRfZ2V0X3Vsb25nbG9uZyhyZXN1bHQsICJpZCIpOworCisJc2VuZGVyX2lkID0gZGJpX3Jlc3VsdF9nZXRfdWxvbmdsb25nKHJlc3VsdCwgInNlbmRlcl9pZCIpOworCXNtcy0+c2VuZGVyID0gc3Vic2NyX2dldF9ieV9pZChuZXQsIHNlbmRlcl9pZCk7CisKKwlyZWNlaXZlcl9pZCA9IGRiaV9yZXN1bHRfZ2V0X3Vsb25nbG9uZyhyZXN1bHQsICJyZWNlaXZlcl9pZCIpOworCXNtcy0+cmVjZWl2ZXIgPSBzdWJzY3JfZ2V0X2J5X2lkKG5ldCwgcmVjZWl2ZXJfaWQpOworCisJLyogRklYTUU6IHZhbGlkaXR5ICovCisJLyogRklYTUU6IHRob3NlIHNob3VsZCBhbGwgYmUgZ2V0X3VjaGFyLCBidXQgc3FsaXRlMyBpcyBicmFpbmRlYWQgKi8KKwlzbXMtPnJlcGx5X3BhdGhfcmVxID0gZGJpX3Jlc3VsdF9nZXRfdWludChyZXN1bHQsICJyZXBseV9wYXRoX3JlcSIpOworCXNtcy0+c3RhdHVzX3JlcF9yZXEgPSBkYmlfcmVzdWx0X2dldF91aW50KHJlc3VsdCwgInN0YXR1c19yZXBfcmVxIik7CisJc21zLT51ZF9oZHJfaW5kID0gZGJpX3Jlc3VsdF9nZXRfdWludChyZXN1bHQsICJ1ZF9oZHJfaW5kIik7CisJc21zLT5wcm90b2NvbF9pZCA9IGRiaV9yZXN1bHRfZ2V0X3VpbnQocmVzdWx0LCAicHJvdG9jb2xfaWQiKTsKKwlzbXMtPmRhdGFfY29kaW5nX3NjaGVtZSA9IGRiaV9yZXN1bHRfZ2V0X3VpbnQocmVzdWx0LAorCQkJCQkJICAiZGF0YV9jb2Rpbmdfc2NoZW1lIik7CisJLyogc21zLT5tc2dfcmVmIGlzIHRlbXBvcmFyeSBhbmQgbm90IHN0b3JlZCBpbiBEQiAqLworCisJZGFkZHIgPSBkYmlfcmVzdWx0X2dldF9zdHJpbmcocmVzdWx0LCAiZGVzdF9hZGRyIik7CisJaWYgKGRhZGRyKSB7CisJCXN0cm5jcHkoc21zLT5kZXN0X2FkZHIsIGRhZGRyLCBzaXplb2Yoc21zLT5kZXN0X2FkZHIpKTsKKwkJc21zLT5kZXN0X2FkZHJbc2l6ZW9mKHNtcy0+ZGVzdF9hZGRyKS0xXSA9ICdcMCc7CisJfQorCisJc21zLT51c2VyX2RhdGFfbGVuID0gZGJpX3Jlc3VsdF9nZXRfZmllbGRfbGVuZ3RoKHJlc3VsdCwgInVzZXJfZGF0YSIpOworCXVzZXJfZGF0YSA9IGRiaV9yZXN1bHRfZ2V0X2JpbmFyeShyZXN1bHQsICJ1c2VyX2RhdGEiKTsKKwlpZiAoc21zLT51c2VyX2RhdGFfbGVuID4gc2l6ZW9mKHNtcy0+dXNlcl9kYXRhKSkKKwkJc21zLT51c2VyX2RhdGFfbGVuID0gKHVfaW50OF90KSBzaXplb2Yoc21zLT51c2VyX2RhdGEpOworCW1lbWNweShzbXMtPnVzZXJfZGF0YSwgdXNlcl9kYXRhLCBzbXMtPnVzZXJfZGF0YV9sZW4pOworCisJdGV4dCA9IGRiaV9yZXN1bHRfZ2V0X3N0cmluZyhyZXN1bHQsICJ0ZXh0Iik7CisJaWYgKHRleHQpIHsKKwkJc3RybmNweShzbXMtPnRleHQsIHRleHQsIHNpemVvZihzbXMtPnRleHQpKTsKKwkJc21zLT50ZXh0W3NpemVvZihzbXMtPnRleHQpLTFdID0gJ1wwJzsKKwl9CisJcmV0dXJuIHNtczsKK30KKworLyogcmV0cmlldmUgdGhlIG5leHQgdW5zZW50IFNNUyB3aXRoIElEID49IG1pbl9pZCAqLworc3RydWN0IGdzbV9zbXMgKmRiX3Ntc19nZXRfdW5zZW50KHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCB1bnNpZ25lZCBsb25nIGxvbmcgbWluX2lkKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCXN0cnVjdCBnc21fc21zICpzbXM7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIlNFTEVDVCAqIEZST00gU01TLFN1YnNjcmliZXIgIgorCQkiV0hFUkUgc21zLmlkID49ICVsbHUgQU5EIHNtcy5zZW50IGlzIE5VTEwgIgorCQkJIkFORCBzbXMucmVjZWl2ZXJfaWQgPSBzdWJzY3JpYmVyLmlkICIKKwkJCSJBTkQgc3Vic2NyaWJlci5sYWMgPiAwICIKKwkJIk9SREVSIEJZIHNtcy5pZCBMSU1JVCAxIiwKKwkJbWluX2lkKTsKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIWRiaV9yZXN1bHRfbmV4dF9yb3cocmVzdWx0KSkgeworCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc21zID0gc21zX2Zyb21fcmVzdWx0KG5ldCwgcmVzdWx0KTsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJcmV0dXJuIHNtczsKK30KKworc3RydWN0IGdzbV9zbXMgKmRiX3Ntc19nZXRfdW5zZW50X2J5X3N1YnNjcihzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgdW5zaWduZWQgbG9uZyBsb25nIG1pbl9zdWJzY3JfaWQpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJc3RydWN0IGdzbV9zbXMgKnNtczsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiU0VMRUNUICogRlJPTSBTTVMsU3Vic2NyaWJlciAiCisJCSJXSEVSRSBzbXMucmVjZWl2ZXJfaWQgPj0gJWxsdSBBTkQgc21zLnNlbnQgaXMgTlVMTCAiCisJCQkiQU5EIHNtcy5yZWNlaXZlcl9pZCA9IHN1YnNjcmliZXIuaWQgIgorCQkJIkFORCBzdWJzY3JpYmVyLmxhYyA+IDAgIgorCQkiT1JERVIgQlkgc21zLnJlY2VpdmVyX2lkLCBpZCBMSU1JVCAxIiwKKwkJbWluX3N1YnNjcl9pZCk7CisJaWYgKCFyZXN1bHQpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFkYmlfcmVzdWx0X25leHRfcm93KHJlc3VsdCkpIHsKKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXNtcyA9IHNtc19mcm9tX3Jlc3VsdChuZXQsIHJlc3VsdCk7CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCXJldHVybiBzbXM7Cit9CisKKy8qIHJldHJpZXZlIHRoZSBuZXh0IHVuc2VudCBTTVMgZm9yIGEgZ2l2ZW4gc3Vic2NyaWJlciAqLworc3RydWN0IGdzbV9zbXMgKmRiX3Ntc19nZXRfdW5zZW50X2Zvcl9zdWJzY3Ioc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJc3RydWN0IGdzbV9zbXMgKnNtczsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiU0VMRUNUICogRlJPTSBTTVMsU3Vic2NyaWJlciAiCisJCSJXSEVSRSBzbXMucmVjZWl2ZXJfaWQgPSAlbGx1IEFORCBzbXMuc2VudCBpcyBOVUxMICIKKwkJCSJBTkQgc21zLnJlY2VpdmVyX2lkID0gc3Vic2NyaWJlci5pZCAiCisJCQkiQU5EIHN1YnNjcmliZXIubGFjID4gMCAiCisJCSJPUkRFUiBCWSBzbXMuaWQgTElNSVQgMSIsCisJCXN1YnNjci0+aWQpOworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzbXMgPSBzbXNfZnJvbV9yZXN1bHQoc3Vic2NyLT5uZXQsIHJlc3VsdCk7CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCXJldHVybiBzbXM7Cit9CisKKy8qIG1hcmsgYSBnaXZlbiBTTVMgYXMgcmVhZCAqLworaW50IGRiX3Ntc19tYXJrX3NlbnQoc3RydWN0IGdzbV9zbXMgKnNtcykKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiVVBEQVRFIFNNUyAiCisJCSJTRVQgc2VudCA9IGRhdGV0aW1lKCdub3cnKSAiCisJCSJXSEVSRSBpZCA9ICVsbHUiLCBzbXMtPmlkKTsKKwlpZiAoIXJlc3VsdCkgeworCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBtYXJrIFNNUyAlbGx1IGFzIHNlbnQuXG4iLCBzbXMtPmlkKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgYXR0ZW1wdGVkIGRlbGl2ZXJpZXMgKi8KK2ludCBkYl9zbXNfaW5jX2RlbGl2ZXJfYXR0ZW1wdHMoc3RydWN0IGdzbV9zbXMgKnNtcykKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiVVBEQVRFIFNNUyAiCisJCSJTRVQgZGVsaXZlcl9hdHRlbXB0cyA9IGRlbGl2ZXJfYXR0ZW1wdHMgKyAxICIKKwkJIldIRVJFIGlkID0gJWxsdSIsIHNtcy0+aWQpOworCWlmICghcmVzdWx0KSB7CisJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIGluYyBkZWxpdmVyIGF0dGVtcHRzIGZvciAiCisJCQkiU01TICVsbHUuXG4iLCBzbXMtPmlkKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkYl9hcGR1X2Jsb2Jfc3RvcmUoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQl1X2ludDhfdCBhcGR1X2lkX2ZsYWdzLCB1X2ludDhfdCBsZW4sCisJCQl1X2ludDhfdCAqYXBkdSkKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwl1bnNpZ25lZCBjaGFyICpxX2FwZHU7CisKKwlkYmlfY29ubl9xdW90ZV9iaW5hcnlfY29weShjb25uLCBhcGR1LCBsZW4sICZxX2FwZHUpOworCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJJTlNFUlQgSU5UTyBBcGR1QmxvYnMgIgorCQkiKGNyZWF0ZWQsc3Vic2NyaWJlcl9pZCxhcGR1X2lkX2ZsYWdzLGFwZHUpIFZBTFVFUyAiCisJCSIoZGF0ZXRpbWUoJ25vdycpLCVsbHUsJXUsJXMpIiwKKwkJc3Vic2NyLT5pZCwgYXBkdV9pZF9mbGFncywgcV9hcGR1KTsKKworCWZyZWUocV9hcGR1KTsKKworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVJTzsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCXJldHVybiAwOworfQorCitpbnQgZGJfc3RvcmVfY291bnRlcihzdHJ1Y3QgY291bnRlciAqY3RyKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCWNoYXIgKnFfbmFtZTsKKworCWRiaV9jb25uX3F1b3RlX3N0cmluZ19jb3B5KGNvbm4sIGN0ci0+bmFtZSwgJnFfbmFtZSk7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIklOU0VSVCBJTlRPIENvdW50ZXJzICIKKwkJIih0aW1lc3RhbXAsbmFtZSx2YWx1ZSkgVkFMVUVTICIKKwkJIihkYXRldGltZSgnbm93JyksJXMsJWx1KSIsIHFfbmFtZSwgY3RyLT52YWx1ZSk7CisKKwlmcmVlKHFfbmFtZSk7CisKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIC1FSU87CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkYl9zdG9yZV9yYXRlX2N0cihzdHJ1Y3QgcmF0ZV9jdHJfZ3JvdXAgKmN0cmcsIHVuc2lnbmVkIGludCBudW0sCisJCQkgICAgIGNoYXIgKnFfcHJlZml4KQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCWNoYXIgKnFfbmFtZTsKKworCWRiaV9jb25uX3F1b3RlX3N0cmluZ19jb3B5KGNvbm4sIGN0cmctPmRlc2MtPmN0cl9kZXNjW251bV0ubmFtZSwKKwkJCQkgICAmcV9uYW1lKTsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiSW5zZXJ0IElOVE8gUmF0ZUNvdW50ZXJzICIKKwkJIih0aW1lc3RhbXAsbmFtZSxpZHgsdmFsdWUpIFZBTFVFUyAiCisJCSIoZGF0ZXRpbWUoJ25vdycpLCVzLiVzLCV1LCUiUFJJdTY0IikiLAorCQlxX3ByZWZpeCwgcV9uYW1lLCBjdHJnLT5pZHgsIGN0cmctPmN0cltudW1dLmN1cnJlbnQpOworCisJZnJlZShxX25hbWUpOworCisJaWYgKCFyZXN1bHQpCisJCXJldHVybiAtRUlPOworCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkYl9zdG9yZV9yYXRlX2N0cl9ncm91cChzdHJ1Y3QgcmF0ZV9jdHJfZ3JvdXAgKmN0cmcpCit7CisJdW5zaWduZWQgaW50IGk7CisJY2hhciAqcV9wcmVmaXg7CisKKwlkYmlfY29ubl9xdW90ZV9zdHJpbmdfY29weShjb25uLCBjdHJnLT5kZXNjLT5ncm91cF9uYW1lX3ByZWZpeCwgJnFfcHJlZml4KTsKKworCWZvciAoaSA9IDA7IGkgPCBjdHJnLT5kZXNjLT5udW1fY3RyOyBpKyspCisJCWRiX3N0b3JlX3JhdGVfY3RyKGN0cmcsIGksIHFfcHJlZml4KTsKKworCWZyZWUocV9wcmVmaXgpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9kZWJ1Zy5jIGIvb3BlbmJzYy9zcmMvZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTI5MzVhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZGVidWcuYwpAQCAtMCwwICsxLDI0NSBAQAorLyogT3BlbkJTQyBEZWJ1Z2dpbmcvTG9nZ2luZyBzdXBwb3J0IGNvZGUgKi8KKworLyogKEMpIDIwMDgtMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDggYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3V0aWxzLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbG9nZ2luZy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorCisvKiBkZWZhdWx0IGNhdGVnb3JpZXMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbG9nX2luZm9fY2F0IGRlZmF1bHRfY2F0ZWdvcmllc1tdID0geworCVtEUkxMXSA9IHsKKwkJLm5hbWUgPSAiRFJMTCIsCisJCS5kZXNjcmlwdGlvbiA9ICJBLWJpcyBSYWRpbyBMaW5rIExheWVyIChSTEwpIiwKKwkJLmNvbG9yID0gIlwwMzNbMTszMW0iLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0RDQ10gPSB7CisJCS5uYW1lID0gIkRDQyIsCisJCS5kZXNjcmlwdGlvbiA9ICJMYXllcjMgQ2FsbCBDb250cm9sIChDQykiLAorCQkuY29sb3IgPSAiXDAzM1sxOzMybSIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRE1NXSA9IHsKKwkJLm5hbWUgPSAiRE1NIiwKKwkJLmRlc2NyaXB0aW9uID0gIkxheWVyMyBNb2JpbGl0eSBNYW5hZ2VtZW50IChNTSkiLAorCQkuY29sb3IgPSAiXDAzM1sxOzMzbSIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRFJSXSA9IHsKKwkJLm5hbWUgPSAiRFJSIiwKKwkJLmRlc2NyaXB0aW9uID0gIkxheWVyMyBSYWRpbyBSZXNvdXJjZSAoUlIpIiwKKwkJLmNvbG9yID0gIlwwMzNbMTszNG0iLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0RSU0xdID0geworCQkubmFtZSA9ICJEUlNMIiwKKwkJLmRlc2NyaXB0aW9uID0gIkEtYmlzIFJhZGlvIFNpZ2FubGxpbmcgTGluayAoUlNMKSIsCisJCS5jb2xvciA9ICJcMDMzWzE7MzVtIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtETk1dID0JeworCQkubmFtZSA9ICJETk0iLAorCQkuZGVzY3JpcHRpb24gPSAiQS1iaXMgTmV0d29yayBNYW5hZ2VtZW50IC8gTyZNIChOTS9PTUwpIiwKKwkJLmNvbG9yID0gIlwwMzNbMTszNm0iLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfSU5GTywKKwl9LAorCVtETU5DQ10gPSB7CisJCS5uYW1lID0gIkRNTkNDIiwKKwkJLmRlc2NyaXB0aW9uID0gIk1OQ0MgQVBJIGZvciBDYWxsIENvbnRyb2wgYXBwbGljYXRpb24iLAorCQkuY29sb3IgPSAiXDAzM1sxOzM5bSIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRFNNU10gPSB7CisJCS5uYW1lID0gIkRTTVMiLAorCQkuZGVzY3JpcHRpb24gPSAiTGF5ZXIzIFNob3J0IE1lc3NhZ2UgU2VydmljZSAoU01TKSIsCisJCS5jb2xvciA9ICJcMDMzWzE7MzdtIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtEUEFHXQk9IHsKKwkJLm5hbWUgPSAiRFBBRyIsCisJCS5kZXNjcmlwdGlvbiA9ICJQYWdpbmcgU3Vic3lzdGVtIiwKKwkJLmNvbG9yID0gIlwwMzNbMTszOG0iLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0RNRUFTXSA9IHsKKwkJLm5hbWUgPSAiRE1FQVMiLAorCQkuZGVzY3JpcHRpb24gPSAiUmFkaW8gTWVhc3VyZW1lbnQgUHJvY2Vzc2luZyIsCisJCS5lbmFibGVkID0gMCwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRE1JXSA9IHsKKwkJLm5hbWUgPSAiRE1JIiwKKwkJLmRlc2NyaXB0aW9uID0gIkEtYmlzIElucHV0IERyaXZlciBmb3IgU2lnbmFsbGluZyIsCisJCS5lbmFibGVkID0gMCwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRE1JQl0gPSB7CisJCS5uYW1lID0gIkRNSUIiLAorCQkuZGVzY3JpcHRpb24gPSAiQS1iaXMgSW5wdXQgRHJpdmVyIGZvciBCLUNoYW5uZWxzICh2b2ljZSkiLAorCQkuZW5hYmxlZCA9IDAsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0RNVVhdID0geworCQkubmFtZSA9ICJETVVYIiwKKwkJLmRlc2NyaXB0aW9uID0gIkEtYmlzIEItU3ViY2hhbm5lbCBUUkFVIEZyYW1lIE11bHRpcGxleCIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRElOUF0gPSB7CisJCS5uYW1lID0gIkRJTlAiLAorCQkuZGVzY3JpcHRpb24gPSAiQS1iaXMgSW50cHV0IFN1YnN5c3RlbSIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRFNDQ1BdID0geworCQkubmFtZSA9ICJEU0NDUCIsCisJCS5kZXNjcmlwdGlvbiA9ICJTQ0NQIFByb3RvY29sIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtETVNDXSA9IHsKKwkJLm5hbWUgPSAiRE1TQyIsCisJCS5kZXNjcmlwdGlvbiA9ICJNb2JpbGUgU3dpdGNoaW5nIENlbnRlciIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRE1HQ1BdID0geworCQkubmFtZSA9ICJETUdDUCIsCisJCS5kZXNjcmlwdGlvbiA9ICJNZWRpYSBHYXRld2F5IENvbnRyb2wgUHJvdG9jb2wiLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0RIT10gPSB7CisJCS5uYW1lID0gIkRITyIsCisJCS5kZXNjcmlwdGlvbiA9ICJIYW5kLU92ZXIiLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0REQl0gPSB7CisJCS5uYW1lID0gIkREQiIsCisJCS5kZXNjcmlwdGlvbiA9ICJEYXRhYmFzZSBMYXllciIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRFJFRl0gPSB7CisJCS5uYW1lID0gIkRSRUYiLAorCQkuZGVzY3JpcHRpb24gPSAiUmVmZXJlbmNlIENvdW50aW5nIiwKKwkJLmVuYWJsZWQgPSAwLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtER1BSU10gPSB7CisJCS5uYW1lID0gIkRHUFJTIiwKKwkJLmRlc2NyaXB0aW9uID0gIkdQUlMgUGFja2V0IFNlcnZpY2UiLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfREVCVUcsCisJfSwKKwlbRE5TXSA9IHsKKwkJLm5hbWUgPSAiRE5TIiwKKwkJLmRlc2NyaXB0aW9uID0gIkdQUlMgTmV0d29yayBTZXJ2aWNlIChOUykiLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfSU5GTywKKwl9LAorCVtEQlNTR1BdID0geworCQkubmFtZSA9ICJEQlNTR1AiLAorCQkuZGVzY3JpcHRpb24gPSAiR1BSUyBCU1MgR2F0ZXdheSBQcm90b2NvbCAoQlNTR1ApIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX0RFQlVHLAorCX0sCisJW0RMTENdID0geworCQkubmFtZSA9ICJETExDIiwKKwkJLmRlc2NyaXB0aW9uID0gIkdQUlMgTG9naWNhbCBMaW5rIENvbnRyb2wgUHJvdG9jb2wgKExMQykiLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfREVCVUcsCisJfSwKKwlbRFNORENQXSA9IHsKKwkJLm5hbWUgPSAiRFNORENQIiwKKwkJLmRlc2NyaXB0aW9uID0gIkdQUlMgU3ViLU5ldHdvcmsgRGVwZW5kZW50IENvbnRyb2wgUHJvdG9jb2wgKFNORENQKSIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9ERUJVRywKKwl9LAorfTsKKworZW51bSBsb2dfZmlsdGVyIHsKKwlfRkxUX0FMTCA9IExPR19GSUxURVJfQUxMLAkvKiBsaWJvc21vY29yZSAqLworCUZMVF9JTVNJID0gMSwKKwlGTFRfTlNWQyA9IDIsCisJRkxUX0JWQyAgPSAzLAorfTsKKworc3RhdGljIGludCBmaWx0ZXJfZm4oY29uc3Qgc3RydWN0IGxvZ19jb250ZXh0ICpjdHgsCisJCSAgICAgc3RydWN0IGxvZ190YXJnZXQgKnRhcikKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IGN0eC0+Y3R4W0JTQ19DVFhfU1VCU0NSXTsKKwljb25zdCBzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjID0gY3R4LT5jdHhbQlNDX0NUWF9OU1ZDXTsKKwljb25zdCBzdHJ1Y3QgZ3Byc19uc3ZjICpidmMgPSBjdHgtPmN0eFtCU0NfQ1RYX0JWQ107CisKKwlpZiAoKHRhci0+ZmlsdGVyX21hcCAmICgxIDw8IEZMVF9JTVNJKSkgIT0gMAorCSAgICAmJiBzdWJzY3IgJiYgc3RyY21wKHN1YnNjci0+aW1zaSwgdGFyLT5maWx0ZXJfZGF0YVtGTFRfSU1TSV0pID09IDApCisJCXJldHVybiAxOworCisJLyogRmlsdGVyIG9uIHRoZSBOUyBWaXJ0dWFsIENvbm5lY3Rpb24gKi8KKwlpZiAoKHRhci0+ZmlsdGVyX21hcCAmICgxIDw8IEZMVF9OU1ZDKSkgIT0gMAorCSAgICAmJiBuc3ZjICYmIChuc3ZjID09IHRhci0+ZmlsdGVyX2RhdGFbRkxUX05TVkNdKSkKKwkJcmV0dXJuIDE7CisKKwkvKiBGaWx0ZXIgb24gdGhlIE5TIFZpcnR1YWwgQ29ubmVjdGlvbiAqLworCWlmICgodGFyLT5maWx0ZXJfbWFwICYgKDEgPDwgRkxUX0JWQykpICE9IDAKKwkgICAgJiYgYnZjICYmIChidmMgPT0gdGFyLT5maWx0ZXJfZGF0YVtGTFRfQlZDXSkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK2NvbnN0IHN0cnVjdCBsb2dfaW5mbyBsb2dfaW5mbyA9IHsKKwkuZmlsdGVyX2ZuID0gZmlsdGVyX2ZuLAorCS5jYXQgPSBkZWZhdWx0X2NhdGVnb3JpZXMsCisJLm51bV9jYXQgPSBBUlJBWV9TSVpFKGRlZmF1bHRfY2F0ZWdvcmllcyksCit9OworCit2b2lkIGxvZ19zZXRfaW1zaV9maWx0ZXIoc3RydWN0IGxvZ190YXJnZXQgKnRhcmdldCwgY29uc3QgY2hhciAqaW1zaSkKK3sKKwlpZiAoaW1zaSkgeworCQl0YXJnZXQtPmZpbHRlcl9tYXAgfD0gKDEgPDwgRkxUX0lNU0kpOworCQl0YXJnZXQtPmZpbHRlcl9kYXRhW0ZMVF9JTVNJXSA9IHRhbGxvY19zdHJkdXAodGFyZ2V0LCBpbXNpKTsKKwl9IGVsc2UgaWYgKHRhcmdldC0+ZmlsdGVyX2RhdGFbRkxUX0lNU0ldKSB7CisJCXRhcmdldC0+ZmlsdGVyX21hcCAmPSB+KDEgPDwgRkxUX0lNU0kpOworCQl0YWxsb2NfZnJlZSh0YXJnZXQtPmZpbHRlcl9kYXRhW0ZMVF9JTVNJXSk7CisJCXRhcmdldC0+ZmlsdGVyX2RhdGFbRkxUX0lNU0ldID0gTlVMTDsKKwl9Cit9CisKK3ZvaWQgbG9nX3NldF9uc3ZjX2ZpbHRlcihzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyZ2V0LCBzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjKQoreworCWlmIChuc3ZjKSB7CisJCXRhcmdldC0+ZmlsdGVyX21hcCB8PSAoMSA8PCBGTFRfTlNWQyk7CisJCXRhcmdldC0+ZmlsdGVyX2RhdGFbRkxUX05TVkNdID0gbnN2YzsKKwl9IGVsc2UgaWYgKHRhcmdldC0+ZmlsdGVyX2RhdGFbRkxUX05TVkNdKSB7CisJCXRhcmdldC0+ZmlsdGVyX21hcCA9IH4oMSA8PCBGTFRfTlNWQyk7CisJCXRhcmdldC0+ZmlsdGVyX2RhdGFbRkxUX05TVkNdID0gTlVMTDsKKwl9Cit9CisKK3ZvaWQgbG9nX3NldF9idmNfZmlsdGVyKHN0cnVjdCBsb2dfdGFyZ2V0ICp0YXJnZXQsIHN0cnVjdCBic3NncF9idmNfY3R4ICpiY3R4KQoreworCWlmIChiY3R4KSB7CisJCXRhcmdldC0+ZmlsdGVyX21hcCB8PSAoMSA8PCBGTFRfQlZDKTsKKwkJdGFyZ2V0LT5maWx0ZXJfZGF0YVtGTFRfQlZDXSA9IGJjdHg7CisJfSBlbHNlIGlmICh0YXJnZXQtPmZpbHRlcl9kYXRhW0ZMVF9OU1ZDXSkgeworCQl0YXJnZXQtPmZpbHRlcl9tYXAgPSB+KDEgPDwgRkxUX0JWQyk7CisJCXRhcmdldC0+ZmlsdGVyX2RhdGFbRkxUX0JWQ10gPSBOVUxMOworCX0KK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2UxX2NvbmZpZy5jIGIvb3BlbmJzYy9zcmMvZTFfY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBmYmNlYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2UxX2NvbmZpZy5jCkBAIC0wLDAgKzEsMjM2IEBACisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2UxX2lucHV0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmF1X2ZyYW1lLmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmF1X211eC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWlzZG4uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2lwYWNjZXNzLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorCisjZGVmaW5lIFNBUElfTDJNTAkwCisjZGVmaW5lIFNBUElfT01MCTYyCisjZGVmaW5lIFNBUElfUlNMCTAJLyogNjMgPyAqLworCisvKiBUaGUgZTFfcmVjb25maWdfKigpIGZ1bmN0aW9ucyBiZWxvdyB0YWxlIHRoZSBjb25maWd1cmF0aW9uIHByZXNlbnQgaW4gdGhlCisgKiBidHMvdHJ4L3RzIGRhdGEgc3RydWN0dXJlcyBhbmQgZW5zdXJlIHRoZSBFMSBjb25maWd1cmF0aW9uIHJlZmxlY3RzIHRoZQorICogdGltZXNsb3Qvc3Vic2xvdC9URUkgY29uZmlndXJhdGlvbiAqLworCitpbnQgZTFfcmVjb25maWdfdHMoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cykKK3sKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKmUxX2xpbmsgPSAmdHMtPmUxX2xpbms7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CisJc3RydWN0IGUxaW5wX3RzICplMV90czsKKworCURFQlVHUChETUksICJlMV9yZWNvbmZpZ190cygldSwldSwldSlcbiIsIHRzLT50cngtPmJ0cy0+bnIsIHRzLT50cngtPm5yLCB0cy0+bnIpOworCisJaWYgKCFlMV9saW5rLT5lMV90cykKKwkJcmV0dXJuIDA7CisKKwlsaW5lID0gZTFpbnBfbGluZV9nZXRfY3JlYXRlKGUxX2xpbmstPmUxX25yKTsKKwlpZiAoIWxpbmUpCisJCXJldHVybiAtRU5PTUVNOworCisJc3dpdGNoICh0cy0+cGNoYW4pIHsKKwljYXNlIEdTTV9QQ0hBTl9UQ0hfRjoKKwljYXNlIEdTTV9QQ0hBTl9UQ0hfSDoKKwkJZTFfdHMgPSAmbGluZS0+dHNbZTFfbGluay0+ZTFfdHMtMV07CisJCWUxaW5wX3RzX2NvbmZpZyhlMV90cywgbGluZSwgRTFJTlBfVFNfVFlQRV9UUkFVKTsKKwkJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmUxX3RzLT50cmF1LmRlbXV4LCBlMV9saW5rLT5lMV90c19zcyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgZTFfcmVjb25maWdfdHJ4KHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KQoreworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCAqZTFfbGluayA9ICZ0cngtPnJzbF9lMV9saW5rOworCXN0cnVjdCBlMWlucF90cyAqc2lnbl90czsKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpyc2xfbGluazsKKwlpbnQgaTsKKworCWlmICghZTFfbGluay0+ZTFfdHMpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogUlNMIExpbmsgKi8KKwlsaW5lID0gZTFpbnBfbGluZV9nZXRfY3JlYXRlKGUxX2xpbmstPmUxX25yKTsKKwlpZiAoIWxpbmUpCisJCXJldHVybiAtRU5PTUVNOworCXNpZ25fdHMgPSAmbGluZS0+dHNbZTFfbGluay0+ZTFfdHMtMV07CisJZTFpbnBfdHNfY29uZmlnKHNpZ25fdHMsIGxpbmUsIEUxSU5QX1RTX1RZUEVfU0lHTik7CisJcnNsX2xpbmsgPSBlMWlucF9zaWduX2xpbmtfY3JlYXRlKHNpZ25fdHMsIEUxSU5QX1NJR05fUlNMLAorCQkJCQkgIHRyeCwgdHJ4LT5yc2xfdGVpLCBTQVBJX1JTTCk7CisJaWYgKCFyc2xfbGluaykKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKHRyeC0+cnNsX2xpbmspCisJCWUxaW5wX3NpZ25fbGlua19kZXN0cm95KHRyeC0+cnNsX2xpbmspOworCXRyeC0+cnNsX2xpbmsgPSByc2xfbGluazsKKworCWZvciAoaSA9IDA7IGkgPCBUUlhfTlJfVFM7IGkrKykKKwkJZTFfcmVjb25maWdfdHMoJnRyeC0+dHNbaV0pOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBlMV9yZWNvbmZpZ19idHMoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKmUxX2xpbmsgPSAmYnRzLT5vbWxfZTFfbGluazsKKwlzdHJ1Y3QgZTFpbnBfdHMgKnNpZ25fdHM7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqb21sX2xpbms7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisKKwlERUJVR1AoRE1JLCAiZTFfcmVjb25maWdfYnRzKCV1KVxuIiwgYnRzLT5ucik7CisKKwlpZiAoIWUxX2xpbmstPmUxX3RzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIE9NTCBsaW5rICovCisJbGluZSA9IGUxaW5wX2xpbmVfZ2V0X2NyZWF0ZShlMV9saW5rLT5lMV9ucik7CisJaWYgKCFsaW5lKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzaWduX3RzID0gJmxpbmUtPnRzW2UxX2xpbmstPmUxX3RzLTFdOworCWUxaW5wX3RzX2NvbmZpZyhzaWduX3RzLCBsaW5lLCBFMUlOUF9UU19UWVBFX1NJR04pOworCW9tbF9saW5rID0gZTFpbnBfc2lnbl9saW5rX2NyZWF0ZShzaWduX3RzLCBFMUlOUF9TSUdOX09NTCwKKwkJCQkJICBidHMtPmMwLCBidHMtPm9tbF90ZWksIFNBUElfT01MKTsKKwlpZiAoIW9tbF9saW5rKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoYnRzLT5vbWxfbGluaykKKwkJZTFpbnBfc2lnbl9saW5rX2Rlc3Ryb3koYnRzLT5vbWxfbGluayk7CisJYnRzLT5vbWxfbGluayA9IG9tbF9saW5rOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJ4LCAmYnRzLT50cnhfbGlzdCwgbGlzdCkKKwkJZTFfcmVjb25maWdfdHJ4KHRyeCk7CisKKwkvKiBub3RpZnkgRTEgaW5wdXQgc29tZXRoaW5nIGhhcyBjaGFuZ2VkICovCisJcmV0dXJuIGUxaW5wX2xpbmVfdXBkYXRlKGxpbmUpOworfQorCisjaWYgMAorLyogZG8gc29tZSBjb21waWxlZC1pbiBjb25maWd1cmF0aW9uIGZvciBvdXIgQlRTL0UxIHNldHVwICovCitpbnQgZTFfY29uZmlnKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBjYXJkbnIsIGludCByZWxlYXNlX2wyKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCXN0cnVjdCBlMWlucF90cyAqc2lnbl90czsKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpvbWxfbGluaywgKnJzbF9saW5rOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gYnRzLT5jMDsKKwlpbnQgYmFzZV90czsKKworCXN3aXRjaCAoYnRzLT5ucikgeworCWNhc2UgMDoKKwkJLyogRmlyc3QgQlRTIHVzZXMgRTEgVFMgMDEsMDIsMDMsMDQsMDUgKi8KKwkJYmFzZV90cyA9IEhBUkRDT0RFRF9CVFMwX1RTIC0gMTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQkvKiBTZWNvbmQgQlRTIHVzZXMgRTEgVFMgMDYsMDcsMDgsMDksMTAgKi8KKwkJYmFzZV90cyA9IEhBUkRDT0RFRF9CVFMxX1RTIC0gMTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQkvKiBUaGlyZCBCVFMgdXNlcyBFMSBUUyAxMSwxMiwxMywxNCwxNSAqLworCQliYXNlX3RzID0gSEFSRENPREVEX0JUUzJfVFMgLSAxOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWxpbmUgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBlMWlucF9saW5lKTsKKwlpZiAoIWxpbmUpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogY3JlYXRlIEUxIHRpbWVzbG90cyBmb3Igc2lnbmFsbGluZyBhbmQgVFJBVSBmcmFtZXMgKi8KKwllMWlucF90c19jb25maWcoJmxpbmUtPnRzW2Jhc2VfdHMrMS0xXSwgbGluZSwgRTFJTlBfVFNfVFlQRV9TSUdOKTsKKwllMWlucF90c19jb25maWcoJmxpbmUtPnRzW2Jhc2VfdHMrMi0xXSwgbGluZSwgRTFJTlBfVFNfVFlQRV9UUkFVKTsKKwllMWlucF90c19jb25maWcoJmxpbmUtPnRzW2Jhc2VfdHMrMy0xXSwgbGluZSwgRTFJTlBfVFNfVFlQRV9UUkFVKTsKKworCS8qIGNyZWF0ZSBzaWduYWxsaW5nIGxpbmtzIGZvciBUUzEgKi8KKwlzaWduX3RzID0gJmxpbmUtPnRzW2Jhc2VfdHMrMS0xXTsKKwlvbWxfbGluayA9IGUxaW5wX3NpZ25fbGlua19jcmVhdGUoc2lnbl90cywgRTFJTlBfU0lHTl9PTUwsCisJCQkJCSAgdHJ4LCBURUlfT01MLCBTQVBJX09NTCk7CisJcnNsX2xpbmsgPSBlMWlucF9zaWduX2xpbmtfY3JlYXRlKHNpZ25fdHMsIEUxSU5QX1NJR05fUlNMLAorCQkJCQkgIHRyeCwgVEVJX1JTTCwgU0FQSV9SU0wpOworCisJLyogY3JlYXRlIGJhY2stbGlua3MgZnJvbSBidHMvdHJ4ICovCisJYnRzLT5vbWxfbGluayA9IG9tbF9saW5rOworCXRyeC0+cnNsX2xpbmsgPSByc2xfbGluazsKKworCS8qIGVuYWJsZSBzdWJjaGFubmVsIGRlbXV4ZXIgb24gVFMyICovCisJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrMi0xXS50cmF1LmRlbXV4LCAxKTsKKwlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cysyLTFdLnRyYXUuZGVtdXgsIDIpOworCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzItMV0udHJhdS5kZW11eCwgMyk7CisKKwkvKiBlbmFibGUgc3ViY2hhbm5lbCBkZW11eGVyIG9uIFRTMyAqLworCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzMtMV0udHJhdS5kZW11eCwgMCk7CisJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrMy0xXS50cmF1LmRlbXV4LCAxKTsKKwlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cyszLTFdLnRyYXUuZGVtdXgsIDIpOworCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzMtMV0udHJhdS5kZW11eCwgMyk7CisKKwl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCAxKTsKKwlpZiAodHJ4KSB7CisJCS8qIGNyZWF0ZSBFMSB0aW1lc2xvdHMgZm9yIFRSQVUgZnJhbWVzIG9mIFRSWDEgKi8KKwkJZTFpbnBfdHNfY29uZmlnKCZsaW5lLT50c1tiYXNlX3RzKzQtMV0sIGxpbmUsIEUxSU5QX1RTX1RZUEVfVFJBVSk7CisJCWUxaW5wX3RzX2NvbmZpZygmbGluZS0+dHNbYmFzZV90cys1LTFdLCBsaW5lLCBFMUlOUF9UU19UWVBFX1RSQVUpOworCisJCS8qIGNyZWF0ZSBSU0wgc2lnbmFsbGluZyBsaW5rIGZvciBUUlgxICovCisJCXNpZ25fdHMgPSAmbGluZS0+dHNbYmFzZV90cysxLTFdOworCQlyc2xfbGluayA9IGUxaW5wX3NpZ25fbGlua19jcmVhdGUoc2lnbl90cywgRTFJTlBfU0lHTl9SU0wsCisJCQkJCSAgdHJ4LCBURUlfUlNMKzEsIFNBUElfUlNMKTsKKwkJLyogY3JlYXRlIGJhY2stbGlua3MgZnJvbSB0cnggKi8KKwkJdHJ4LT5yc2xfbGluayA9IHJzbF9saW5rOworCisJCS8qIGVuYWJsZSBzdWJjaGFubmVsIGRlbXV4ZXIgb24gVFMyICovCisJCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzQtMV0udHJhdS5kZW11eCwgMCk7CisJCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzQtMV0udHJhdS5kZW11eCwgMSk7CisJCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzQtMV0udHJhdS5kZW11eCwgMik7CisJCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzQtMV0udHJhdS5kZW11eCwgMyk7CisKKwkJLyogZW5hYmxlIHN1YmNoYW5uZWwgZGVtdXhlciBvbiBUUzMgKi8KKwkJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrNS0xXS50cmF1LmRlbXV4LCAwKTsKKwkJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrNS0xXS50cmF1LmRlbXV4LCAxKTsKKwkJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrNS0xXS50cmF1LmRlbXV4LCAyKTsKKwkJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrNS0xXS50cmF1LmRlbXV4LCAzKTsKKwl9CisKKwlyZXR1cm4gbWlfc2V0dXAoY2FyZG5yLCBsaW5lLCByZWxlYXNlX2wyKTsKK30KKyNlbmRpZgorCisvKiBjb25maWd1cmUgcHNldWRvIEUxIGxpbmUgaW4gaXAuYWNjZXNzIHN0eWxlIGFuZCBjb25uZWN0IHRvIEJUUyAqLworaW50IGlhX2NvbmZpZ19jb25uZWN0KHN0cnVjdCBnc21fYnRzICpidHMsIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCXN0cnVjdCBlMWlucF90cyAqc2lnbl90cywgKnJzbF90czsKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpvbWxfbGluaywgKnJzbF9saW5rOworCisJbGluZSA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGUxaW5wX2xpbmUpOworCWlmICghbGluZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBjcmVhdGUgRTEgdGltZXNsb3RzIGZvciBzaWduYWxsaW5nIGFuZCBUUkFVIGZyYW1lcyAqLworCWUxaW5wX3RzX2NvbmZpZygmbGluZS0+dHNbMS0xXSwgbGluZSwgRTFJTlBfVFNfVFlQRV9TSUdOKTsKKwllMWlucF90c19jb25maWcoJmxpbmUtPnRzWzItMV0sIGxpbmUsIEUxSU5QX1RTX1RZUEVfU0lHTik7CisKKwkvKiBjcmVhdGUgc2lnbmFsbGluZyBsaW5rcyBmb3IgVFMxICovCisJc2lnbl90cyA9ICZsaW5lLT50c1sxLTFdOworCXJzbF90cyA9ICZsaW5lLT50c1syLTFdOworCW9tbF9saW5rID0gZTFpbnBfc2lnbl9saW5rX2NyZWF0ZShzaWduX3RzLCBFMUlOUF9TSUdOX09NTCwKKwkJCQkJICBidHMtPmMwLCAweGZmLCAwKTsKKwlyc2xfbGluayA9IGUxaW5wX3NpZ25fbGlua19jcmVhdGUocnNsX3RzLCBFMUlOUF9TSUdOX1JTTCwKKwkJCQkJICBidHMtPmMwLCAwLCAwKTsKKworCS8qIGNyZWF0ZSBiYWNrLWxpbmtzIGZyb20gYnRzL3RyeCAqLworCWJ0cy0+b21sX2xpbmsgPSBvbWxfbGluazsKKwlidHMtPmMwLT5yc2xfbGluayA9IHJzbF9saW5rOworCisJLyogZGVmYXVsdCBwb3J0IGF0IEJUUyBmb3IgaW5jb21pbmcgY29ubmVjdGlvbnMgaXMgMzAwNiAqLworCWlmIChzaW4tPnNpbl9wb3J0ID09IDApCisJCXNpbi0+c2luX3BvcnQgPSBodG9ucygzMDA2KTsKKworCXJldHVybiBpcGFjY2Vzc19jb25uZWN0KGxpbmUsIHNpbik7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9lMV9pbnB1dC5jIGIvb3BlbmJzYy9zcmMvZTFfaW5wdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWRmZTliCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZTFfaW5wdXQuYwpAQCAtMCwwICsxLDU2NSBAQAorLyogT3BlbkJTQyBBYmlzIGludGVyZmFjZSB0byBFMSAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy9mY250bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxtSVNETmlmLmg+CisKKy8vI2RlZmluZSBBRl9DT01QQVRJQklMSVRZX0ZVTkMKKy8vI2luY2x1ZGUgPGNvbXBhdF9hZl9pc2RuLmg+CisjaWZuZGVmIEFGX0lTRE4KKyNkZWZpbmUgQUZfSVNETiAzNAorI2RlZmluZSBQRl9JU0ROIEFGX0lTRE4KKyNlbmRpZgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9lMV9pbnB1dC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3N1YmNoYW5fZGVtdXguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYXVfZnJhbWUuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYXVfbXV4Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21pc2RuLmg+CisKKyNkZWZpbmUgTlVNX0UxX1RTCTMyCisKKy8qIGxpc3Qgb2YgYWxsIEUxIGRyaXZlcnMgKi8KK0xMSVNUX0hFQUQoZTFpbnBfZHJpdmVyX2xpc3QpOworCisvKiBsaXN0IG9mIGFsbCBFMSBsaW5lcyAqLworTExJU1RfSEVBRChlMWlucF9saW5lX2xpc3QpOworCitzdGF0aWMgdm9pZCAqdGFsbF9zaWdsX2N0eDsKKworLyogdG8gYmUgaW1wbGVtZW50ZWQsIGUuZy4gYnkgYnNjX2hhY2suYyAqLwordm9pZCBpbnB1dF9ldmVudChpbnQgZXZlbnQsIGVudW0gZTFpbnBfc2lnbl90eXBlIHR5cGUsIHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KTsKKworLyoKKyAqIHBjYXAgd3JpdGluZyBvZiB0aGUgbWlzZG4gbG9hZAorICogcGNhcCBmb3JtYXQgaXMgZnJvbSBodHRwOi8vd2lraS53aXJlc2hhcmsub3JnL0RldmVsb3BtZW50L0xpYnBjYXBGaWxlRm9ybWF0CisgKi8KKyNkZWZpbmUgRExUX0xJTlVYX0xBUEQJCTE3NworI2RlZmluZSBQQ0FQX0lOUFVUCQkwCisjZGVmaW5lIFBDQVBfT1VUUFVUCQkxCisKK3N0cnVjdCBwY2FwX2hkciB7CisJdV9pbnQzMl90IG1hZ2ljX251bWJlcjsKKwl1X2ludDE2X3QgdmVyc2lvbl9tYWpvcjsKKwl1X2ludDE2X3QgdmVyc2lvbl9taW5vcjsKKwlpbnQzMl90ICB0aGlzem9uZTsKKwl1X2ludDMyX3Qgc2lnZmlnczsKKwl1X2ludDMyX3Qgc25hcGxlbjsKKwl1X2ludDMyX3QgbmV0d29yazsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBwY2FwcmVjX2hkciB7CisJdV9pbnQzMl90IHRzX3NlYzsKKwl1X2ludDMyX3QgdHNfdXNlYzsKKwl1X2ludDMyX3QgaW5jbF9sZW47CisJdV9pbnQzMl90IG9yaWdfbGVuOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGZha2VfbGludXhfbGFwZF9oZWFkZXIgeworICAgICAgICB1X2ludDE2X3QgcGt0dHlwZTsKKwl1X2ludDE2X3QgaGF0eXBlOworCXVfaW50MTZfdCBoYWxlbjsKKwl1X2ludDY0X3QgYWRkcjsKKwlpbnQxNl90IHByb3RvY29sOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGxhcGRfaGVhZGVyIHsKKwl1X2ludDhfdCBlYTEgOiAxOworCXVfaW50OF90IGNyIDogMTsKKwl1X2ludDhfdCBzYXBpIDogNjsKKwl1X2ludDhfdCBlYTIgOiAxOworCXVfaW50OF90IHRlaSA6IDc7CisJdV9pbnQ4X3QgY29udHJvbF9mb287IC8qIGZha2UgVU0ncyAuLi4gKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0YXRpY19hc3NlcnQoKGludCkmKChzdHJ1Y3QgZmFrZV9saW51eF9sYXBkX2hlYWRlciopTlVMTCktPmhhdHlwZSA9PSAyLAloYXR5cGVfb2Zmc2V0KTsKK3N0YXRpY19hc3NlcnQoKGludCkmKChzdHJ1Y3QgZmFrZV9saW51eF9sYXBkX2hlYWRlciopTlVMTCktPmhhbGVuID09IDQsCQloYWxlbl9vZmZzZXQpOworc3RhdGljX2Fzc2VydCgoaW50KSYoKHN0cnVjdCBmYWtlX2xpbnV4X2xhcGRfaGVhZGVyKilOVUxMKS0+YWRkciA9PSA2LAkJYWRkcl9vZmZzZXQpOworc3RhdGljX2Fzc2VydCgoaW50KSYoKHN0cnVjdCBmYWtlX2xpbnV4X2xhcGRfaGVhZGVyKilOVUxMKS0+cHJvdG9jb2wgPT0gMTQsCXByb3RvX29mZnNldCk7CitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgZmFrZV9saW51eF9sYXBkX2hlYWRlcikgPT0gMTYsCQkJbGFwZF9oZWFkZXJfc2l6ZSk7CisKKworc3RhdGljIGludCBwY2FwX2ZkID0gLTE7CisKK3ZvaWQgZTFfc2V0X3BjYXBfZmQoaW50IGZkKQoreworCWludCByZXQ7CisJc3RydWN0IHBjYXBfaGRyIGhlYWRlciA9IHsKKwkJLm1hZ2ljX251bWJlcgk9IDB4YTFiMmMzZDQsCisJCS52ZXJzaW9uX21ham9yCT0gMiwKKwkJLnZlcnNpb25fbWlub3IJPSA0LAorCQkudGhpc3pvbmUJPSAwLAorCQkuc2lnZmlncwk9IDAsCisJCS5zbmFwbGVuCT0gNjU1MzUsCisJCS5uZXR3b3JrCT0gRExUX0xJTlVYX0xBUEQsCisJfTsKKworCXBjYXBfZmQgPSBmZDsKKwlyZXQgPSB3cml0ZShwY2FwX2ZkLCAmaGVhZGVyLCBzaXplb2YoaGVhZGVyKSk7Cit9CisKKy8qIFRoaXMgY3VycmVudGx5IG9ubHkgd29ya3MgZm9yIHRoZSBELUNoYW5uZWwgKi8KK3N0YXRpYyB2b2lkIHdyaXRlX3BjYXBfcGFja2V0KGludCBkaXJlY3Rpb24sIGludCBzYXBpLCBpbnQgdGVpLAorCQkJICAgICAgc3RydWN0IG1zZ2IgKm1zZykgeworCWlmIChwY2FwX2ZkIDwgMCkKKwkJcmV0dXJuOworCisJaW50IHJldDsKKwl0aW1lX3QgY3VyX3RpbWU7CisJc3RydWN0IHRtICp0bTsKKwlpbnQgbWlfaGVhZCA9IChkaXJlY3Rpb249PVBDQVBfSU5QVVQpID8gTUlTRE5fSEVBREVSX0xFTiA6IDA7CisKKwlzdHJ1Y3QgZmFrZV9saW51eF9sYXBkX2hlYWRlciBoZWFkZXIgPSB7CisJCS5wa3R0eXBlCT0gNCwKKwkJLmhhdHlwZQkJPSAwLAorCQkuaGFsZW4JCT0gMCwKKwkJLmFkZHIJCT0gZGlyZWN0aW9uID09IFBDQVBfT1VUUFVUID8gMHgwIDogMHgxLAorCQkucHJvdG9jb2wJPSBudG9ocyg0OCksCisJfTsKKworCXN0cnVjdCBsYXBkX2hlYWRlciBsYXBkX2hlYWRlciA9IHsKKwkJLmVhMQkJPSAwLAorCQkuY3IJCT0gZGlyZWN0aW9uID09IFBDQVBfT1VUUFVUID8gMSA6IDAsCisJCS5zYXBpCQk9IHNhcGkgJiAweDNGLAorCQkuZWEyCQk9IDEsCisJCS50ZWkJCT0gdGVpICYgMHg3RiwKKwkJLmNvbnRyb2xfZm9vCT0gMHgwMyAvKiBVSSAqLywKKwl9OwkKKworCXN0cnVjdCBwY2FwcmVjX2hkciBwYXlsb2FkX2hlYWRlciA9IHsKKwkJLnRzX3NlYwkgICAgPSAwLAorCQkudHNfdXNlYyAgICA9IDAsCisJCS5pbmNsX2xlbiAgID0gbXNnLT5sZW4gKyBzaXplb2Yoc3RydWN0IGZha2VfbGludXhfbGFwZF9oZWFkZXIpCisJCQkJKyBzaXplb2Yoc3RydWN0IGxhcGRfaGVhZGVyKQorCQkJCS0gbWlfaGVhZCwKKwkJLm9yaWdfbGVuICAgPSBtc2ctPmxlbiArIHNpemVvZihzdHJ1Y3QgZmFrZV9saW51eF9sYXBkX2hlYWRlcikKKwkJCQkrIHNpemVvZihzdHJ1Y3QgbGFwZF9oZWFkZXIpCisJCQkJLSBtaV9oZWFkLAorCX07CisKKworCWN1cl90aW1lID0gdGltZShOVUxMKTsKKwl0bSA9IGxvY2FsdGltZSgmY3VyX3RpbWUpOworCXBheWxvYWRfaGVhZGVyLnRzX3NlYyA9IG1rdGltZSh0bSk7CisKKwlyZXQgPSB3cml0ZShwY2FwX2ZkLCAmcGF5bG9hZF9oZWFkZXIsIHNpemVvZihwYXlsb2FkX2hlYWRlcikpOworCXJldCA9IHdyaXRlKHBjYXBfZmQsICZoZWFkZXIsIHNpemVvZihoZWFkZXIpKTsKKwlyZXQgPSB3cml0ZShwY2FwX2ZkLCAmbGFwZF9oZWFkZXIsIHNpemVvZihsYXBkX2hlYWRlcikpOworCXJldCA9IHdyaXRlKHBjYXBfZmQsIG1zZy0+ZGF0YSArIG1pX2hlYWQsCisJCQltc2ctPmxlbiAtIG1pX2hlYWQpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqc2lnbl90eXBlc1tdID0geworCVtFMUlOUF9TSUdOX05PTkVdCT0gIk5vbmUiLAorCVtFMUlOUF9TSUdOX09NTF0JPSAiT01MIiwKKwlbRTFJTlBfU0lHTl9SU0xdCT0gIlJTTCIsCit9OworY29uc3QgY2hhciAqZTFpbnBfc2lnbnR5cGVfbmFtZShlbnVtIGUxaW5wX3NpZ25fdHlwZSB0cCkKK3sKKwlpZiAodHAgPj0gQVJSQVlfU0laRShzaWduX3R5cGVzKSkKKwkJcmV0dXJuICJ1bmRlZmluZWQiOworCXJldHVybiBzaWduX3R5cGVzW3RwXTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnRzX3R5cGVzW10gPSB7CisJW0UxSU5QX1RTX1RZUEVfTk9ORV0JPSAiTm9uZSIsCisJW0UxSU5QX1RTX1RZUEVfU0lHTl0JPSAiU2lnbmFsbGluZyIsCisJW0UxSU5QX1RTX1RZUEVfVFJBVV0JPSAiVFJBVSIsCit9OworCitjb25zdCBjaGFyICplMWlucF90c3R5cGVfbmFtZShlbnVtIGUxaW5wX3RzX3R5cGUgdHApCit7CisJaWYgKHRwID49IEFSUkFZX1NJWkUodHNfdHlwZXMpKQorCQlyZXR1cm4gInVuZGVmaW5lZCI7CisJcmV0dXJuIHRzX3R5cGVzW3RwXTsKK30KKworLyogY2FsbGJhY2sgd2hlbiBhIFRSQVUgZnJhbWUgd2FzIHJlY2VpdmVkICovCitzdGF0aWMgaW50IHN1YmNoX2NiKHN0cnVjdCBzdWJjaF9kZW11eCAqZG14LCBpbnQgY2gsIHVfaW50OF90ICpkYXRhLCBpbnQgbGVuLAorCQkgICAgdm9pZCAqX3ByaXYpCit7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSBfcHJpdjsKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3Qgc3JjX3NzOworCisJc3JjX3NzLmUxX25yID0gZTFpX3RzLT5saW5lLT5udW07CisJc3JjX3NzLmUxX3RzID0gZTFpX3RzLT5udW07CisJc3JjX3NzLmUxX3RzX3NzID0gY2g7CisKKwlyZXR1cm4gdHJhdV9tdXhfaW5wdXQoJnNyY19zcywgZGF0YSwgbGVuKTsKK30KKworaW50IGFiaXNfcnNsX3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpzaWduX2xpbms7CisJc3RydWN0IGUxaW5wX2RyaXZlciAqZTFpbnBfZHJpdmVyOworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzOworCisJbXNnLT5sMmggPSBtc2ctPmRhdGE7CisKKwlpZiAoIW1zZy0+dHJ4KSB7CisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgInJzbF9zZW5kbXNnOiBtc2ctPnRyeCA9PSBOVUxMOiAlc1xuIiwKKwkJCWhleGR1bXAobXNnLT5kYXRhLCBtc2ctPmxlbikpOworCQl0YWxsb2NfZnJlZShtc2cpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgaWYgKCFtc2ctPnRyeC0+cnNsX2xpbmspIHsKKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAicnNsX3NlbmRtc2c6IG1zZy0+dHJ4LT5yc2xfbGluayA9PSBOVUxMOiAlc1xuIiwKKwkJCWhleGR1bXAobXNnLT5kYXRhLCBtc2ctPmxlbikpOworCQl0YWxsb2NfZnJlZShtc2cpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzaWduX2xpbmsgPSBtc2ctPnRyeC0+cnNsX2xpbms7CisJZTFpX3RzID0gc2lnbl9saW5rLT50czsKKwlpZiAoIWJzY190aW1lcl9wZW5kaW5nKCZlMWlfdHMtPnNpZ24udHhfdGltZXIpKSB7CisJCS8qIG5vdGlmeSB0aGUgZHJpdmVyIHdlIGhhdmUgc29tZXRoaW5nIHRvIHdyaXRlICovCisJCWUxaW5wX2RyaXZlciA9IHNpZ25fbGluay0+dHMtPmxpbmUtPmRyaXZlcjsKKwkJZTFpbnBfZHJpdmVyLT53YW50X3dyaXRlKGUxaV90cyk7CisJfQorCW1zZ2JfZW5xdWV1ZSgmc2lnbl9saW5rLT50eF9saXN0LCBtc2cpOworCisJLyogZHVtcCBpdCAqLworCXdyaXRlX3BjYXBfcGFja2V0KFBDQVBfT1VUUFVULCBzaWduX2xpbmstPnNhcGksIHNpZ25fbGluay0+dGVpLCBtc2cpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBfYWJpc19ubV9zZW5kbXNnKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqc2lnbl9saW5rOworCXN0cnVjdCBlMWlucF9kcml2ZXIgKmUxaW5wX2RyaXZlcjsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90czsKKworCW1zZy0+bDJoID0gbXNnLT5kYXRhOworCisJaWYgKCFtc2ctPnRyeCB8fCAhbXNnLT50cngtPmJ0cyB8fCAhbXNnLT50cngtPmJ0cy0+b21sX2xpbmspIHsKKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAibm1fc2VuZG1zZzogbXNnLT50cnggPT0gTlVMTFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNpZ25fbGluayA9IG1zZy0+dHJ4LT5idHMtPm9tbF9saW5rOworCWUxaV90cyA9IHNpZ25fbGluay0+dHM7CisJaWYgKCFic2NfdGltZXJfcGVuZGluZygmZTFpX3RzLT5zaWduLnR4X3RpbWVyKSkgeworCQkvKiBub3RpZnkgdGhlIGRyaXZlciB3ZSBoYXZlIHNvbWV0aGluZyB0byB3cml0ZSAqLworCQllMWlucF9kcml2ZXIgPSBzaWduX2xpbmstPnRzLT5saW5lLT5kcml2ZXI7CisJCWUxaW5wX2RyaXZlci0+d2FudF93cml0ZShlMWlfdHMpOworCX0KKwltc2diX2VucXVldWUoJnNpZ25fbGluay0+dHhfbGlzdCwgbXNnKTsKKworCS8qIGR1bXAgaXQgKi8KKwl3cml0ZV9wY2FwX3BhY2tldChQQ0FQX09VVFBVVCwgc2lnbl9saW5rLT5zYXBpLCBzaWduX2xpbmstPnRlaSwgbXNnKTsKKworCXJldHVybiAwOworfQorCisvKiBUaW1lc2xvdCAqLworCisvKiBjb25maWd1cmUgYW5kIGluaXRpYWxpemUgb25lIGUxaW5wX3RzICovCitpbnQgZTFpbnBfdHNfY29uZmlnKHN0cnVjdCBlMWlucF90cyAqdHMsIHN0cnVjdCBlMWlucF9saW5lICpsaW5lLAorCQkgICAgZW51bSBlMWlucF90c190eXBlIHR5cGUpCit7CisJaWYgKHRzLT50eXBlID09IHR5cGUgJiYgdHMtPmxpbmUgJiYgbGluZSkKKwkJcmV0dXJuIDA7CisKKwl0cy0+dHlwZSA9IHR5cGU7CisJdHMtPmxpbmUgPSBsaW5lOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBFMUlOUF9UU19UWVBFX1NJR046CisJCUlOSVRfTExJU1RfSEVBRCgmdHMtPnNpZ24uc2lnbl9saW5rcyk7CisJCWJyZWFrOworCWNhc2UgRTFJTlBfVFNfVFlQRV9UUkFVOgorCQlzdWJjaGFuX211eF9pbml0KCZ0cy0+dHJhdS5tdXgpOworCQl0cy0+dHJhdS5kZW11eC5vdXRfY2IgPSBzdWJjaF9jYjsKKwkJdHMtPnRyYXUuZGVtdXguZGF0YSA9IHRzOworCQlzdWJjaF9kZW11eF9pbml0KCZ0cy0+dHJhdS5kZW11eCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE1JLCBMT0dMX0VSUk9SLCAidW5zdXBwb3J0ZWQgRTEgdGltZXNsb3QgdHlwZSAldVxuIiwKKwkJCXRzLT50eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGUxaW5wX2xpbmUgKmUxaW5wX2xpbmVfZ2V0KHVfaW50OF90IGUxX25yKQoreworCXN0cnVjdCBlMWlucF9saW5lICplMWlfbGluZTsKKworCS8qIGl0ZXJhdGUgb3ZlciBnbG9iYWwgbGlzdCBvZiBlMSBsaW5lcyAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGUxaV9saW5lLCAmZTFpbnBfbGluZV9saXN0LCBsaXN0KSB7CisJCWlmIChlMWlfbGluZS0+bnVtID09IGUxX25yKQorCQkJcmV0dXJuIGUxaV9saW5lOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGUxaW5wX2xpbmUgKmUxaW5wX2xpbmVfZ2V0X2NyZWF0ZSh1X2ludDhfdCBlMV9ucikKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKwlpbnQgaTsKKworCWxpbmUgPSBlMWlucF9saW5lX2dldChlMV9ucik7CisJaWYgKGxpbmUpCisJCXJldHVybiBsaW5lOworCisJbGluZSA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGUxaW5wX2xpbmUpOworCWlmICghbGluZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlsaW5lLT5udW0gPSBlMV9ucjsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0UxX1RTOyBpKyspIHsKKwkJbGluZS0+dHNbaV0ubnVtID0gaSsxOworCQlsaW5lLT50c1tpXS5saW5lID0gbGluZTsKKwl9CisJbGxpc3RfYWRkX3RhaWwoJmxpbmUtPmxpc3QsICZlMWlucF9saW5lX2xpc3QpOworCisJcmV0dXJuIGxpbmU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZTFpbnBfdHMgKmUxaW5wX3RzX2dldCh1X2ludDhfdCBlMV9uciwgdV9pbnQ4X3QgdHNfbnIpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmUxaV9saW5lOworCisJZTFpX2xpbmUgPSBlMWlucF9saW5lX2dldChlMV9ucik7CisJaWYgKCFlMWlfbGluZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gJmUxaV9saW5lLT50c1t0c19uci0xXTsKK30KKworc3RydWN0IHN1YmNoX211eCAqZTFpbnBfZ2V0X211eCh1X2ludDhfdCBlMV9uciwgdV9pbnQ4X3QgdHNfbnIpCit7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSBlMWlucF90c19nZXQoZTFfbnIsIHRzX25yKTsKKworCWlmICghZTFpX3RzKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiAmZTFpX3RzLT50cmF1Lm11eDsKK30KKworLyogU2lnbmFsbGluZyBMaW5rICovCisKK3N0cnVjdCBlMWlucF9zaWduX2xpbmsgKmUxaW5wX2xvb2t1cF9zaWduX2xpbmsoc3RydWN0IGUxaW5wX3RzICplMWksCisJCQkJCSAJdV9pbnQ4X3QgdGVpLCB1X2ludDhfdCBzYXBpKQoreworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKmxpbms7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShsaW5rLCAmZTFpLT5zaWduLnNpZ25fbGlua3MsIGxpc3QpIHsKKwkJaWYgKGxpbmstPnNhcGkgPT0gc2FwaSAmJiBsaW5rLT50ZWkgPT0gdGVpKQorCQkJcmV0dXJuIGxpbms7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIGNyZWF0ZSBhIG5ldyBzaWduYWxsaW5nIGxpbmsgaW4gYSBFMSB0aW1lc2xvdCAqLworCitzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICoKK2UxaW5wX3NpZ25fbGlua19jcmVhdGUoc3RydWN0IGUxaW5wX3RzICp0cywgZW51bSBlMWlucF9zaWduX3R5cGUgdHlwZSwKKwkJCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCB0ZWksCisJCQl1X2ludDhfdCBzYXBpKQoreworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKmxpbms7CisKKwlpZiAodHMtPnR5cGUgIT0gRTFJTlBfVFNfVFlQRV9TSUdOKQorCQlyZXR1cm4gTlVMTDsKKworCWxpbmsgPSB0YWxsb2NfemVybyh0YWxsX3NpZ2xfY3R4LCBzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rKTsKKwlpZiAoIWxpbmspCisJCXJldHVybiBOVUxMOworCisJbGluay0+dHMgPSB0czsKKwlsaW5rLT50eXBlID0gdHlwZTsKKwlJTklUX0xMSVNUX0hFQUQoJmxpbmstPnR4X2xpc3QpOworCWxpbmstPnRyeCA9IHRyeDsKKwlsaW5rLT50ZWkgPSB0ZWk7CisJbGluay0+c2FwaSA9IHNhcGk7CisKKwlsbGlzdF9hZGRfdGFpbCgmbGluay0+bGlzdCwgJnRzLT5zaWduLnNpZ25fbGlua3MpOworCisJcmV0dXJuIGxpbms7Cit9CisKK3ZvaWQgZTFpbnBfc2lnbl9saW5rX2Rlc3Ryb3koc3RydWN0IGUxaW5wX3NpZ25fbGluayAqbGluaykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCisJbGxpc3RfZGVsKCZsaW5rLT5saXN0KTsKKwl3aGlsZSAoIWxsaXN0X2VtcHR5KCZsaW5rLT50eF9saXN0KSkgeworCQltc2cgPSBtc2diX2RlcXVldWUoJmxpbmstPnR4X2xpc3QpOworCQltc2diX2ZyZWUobXNnKTsKKwl9CisKKwlpZiAobGluay0+dHMtPnR5cGUgPT0gRTFJTlBfVFNfVFlQRV9TSUdOKQorCQlic2NfZGVsX3RpbWVyKCZsaW5rLT50cy0+c2lnbi50eF90aW1lcik7CisKKwl0YWxsb2NfZnJlZShsaW5rKTsKK30KKworLyogdGhlIEUxIGRyaXZlciB0ZWxscyB1cyBoZSBoYXMgcmVjZWl2ZWQgc29tZXRoaW5nIG9uIGEgVFMgKi8KK2ludCBlMWlucF9yeF90cyhzdHJ1Y3QgZTFpbnBfdHMgKnRzLCBzdHJ1Y3QgbXNnYiAqbXNnLAorCQl1X2ludDhfdCB0ZWksIHVfaW50OF90IHNhcGkpCit7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqbGluazsKKwlpbnQgcmV0OworCisJc3dpdGNoICh0cy0+dHlwZSkgeworCWNhc2UgRTFJTlBfVFNfVFlQRV9TSUdOOgorCQkvKiBjb25zdWx0IHRoZSBsaXN0IG9mIHNpZ25hbGxpbmcgbGlua3MgKi8KKwkJd3JpdGVfcGNhcF9wYWNrZXQoUENBUF9JTlBVVCwgc2FwaSwgdGVpLCBtc2cpOworCQlsaW5rID0gZTFpbnBfbG9va3VwX3NpZ25fbGluayh0cywgdGVpLCBzYXBpKTsKKwkJaWYgKCFsaW5rKSB7CisJCQlMT0dQKERNSSwgTE9HTF9FUlJPUiwgImRpZG4ndCBmaW5kIHNpZ25hbGxpbmcgbGluayBmb3IgIgorCQkJCSJ0ZWkgJWQsIHNhcGkgJWRcbiIsIHRlaSwgc2FwaSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWxvZ19zZXRfY29udGV4dChCU0NfQ1RYX0JUUywgbGluay0+dHJ4LT5idHMpOworCQlzd2l0Y2ggKGxpbmstPnR5cGUpIHsKKwkJY2FzZSBFMUlOUF9TSUdOX09NTDoKKwkJCW1zZy0+dHJ4ID0gbGluay0+dHJ4OworCQkJcmV0ID0gYWJpc19ubV9yY3Ztc2cobXNnKTsKKwkJCWJyZWFrOworCQljYXNlIEUxSU5QX1NJR05fUlNMOgorCQkJbXNnLT50cnggPSBsaW5rLT50cng7CisJCQlyZXQgPSBhYmlzX3JzbF9yY3Ztc2cobXNnKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVJTlZBTDsKKwkJCUxPR1AoRE1JLCBMT0dMX0VSUk9SLCAidW5rbm93biBsaW5rIHR5cGUgJXVcbiIsIGxpbmstPnR5cGUpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFMUlOUF9UU19UWVBFX1RSQVU6CisJCXJldCA9IHN1YmNoX2RlbXV4X2luKCZ0cy0+dHJhdS5kZW11eCwgbXNnLT5sMmgsIG1zZ2JfbDJsZW4obXNnKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCUxPR1AoRE1JLCBMT0dMX0VSUk9SLCAidW5rbm93biBUUyB0eXBlICV1XG4iLCB0cy0+dHlwZSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgVFNYX0FMTE9DX1NJWkUgNDA5NgorCisvKiBjYWxsZWQgYnkgZHJpdmVyIGlmIGl0IHdhbnRzIHRvIHRyYW5zbWl0IG9uIGEgZ2l2ZW4gVFMgKi8KK3N0cnVjdCBtc2diICplMWlucF90eF90cyhzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cywKKwkJCSBzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICoqc2lnbl9saW5rKQoreworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKmxpbms7CisJc3RydWN0IG1zZ2IgKm1zZyA9IE5VTEw7CisJaW50IGxlbjsKKworCXN3aXRjaCAoZTFpX3RzLT50eXBlKSB7CisJY2FzZSBFMUlOUF9UU19UWVBFX1NJR046CisJCS8qIEZJWE1FOiBpbXBsZW1lbnQgdGhpcyByb3VuZCByb2JpbiAqLworCQlsbGlzdF9mb3JfZWFjaF9lbnRyeShsaW5rLCAmZTFpX3RzLT5zaWduLnNpZ25fbGlua3MsIGxpc3QpIHsKKwkJCW1zZyA9IG1zZ2JfZGVxdWV1ZSgmbGluay0+dHhfbGlzdCk7CisJCQlpZiAobXNnKSB7CisJCQkJaWYgKHNpZ25fbGluaykKKwkJCQkJKnNpZ25fbGluayA9IGxpbms7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFMUlOUF9UU19UWVBFX1RSQVU6CisJCW1zZyA9IG1zZ2JfYWxsb2MoVFNYX0FMTE9DX1NJWkUsICJUUkFVX1RYIik7CisJCWlmICghbXNnKQorCQkJcmV0dXJuIE5VTEw7CisJCWxlbiA9IHN1YmNoYW5fbXV4X291dCgmZTFpX3RzLT50cmF1Lm11eCwgbXNnLT5kYXRhLCA0MCk7CisJCW1zZ2JfcHV0KG1zZywgNDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERNSSwgTE9HTF9FUlJPUiwgInVuc3VwcG9ydGVkIEUxIFRTIHR5cGUgJXVcbiIsIGUxaV90cy0+dHlwZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gbXNnOworfQorCisvKiBjYWxsZWQgYnkgZHJpdmVyIGluIGNhc2Ugc29tZSBraW5kIG9mIGxpbmsgc3RhdGUgZXZlbnQgKi8KK2ludCBlMWlucF9ldmVudChzdHJ1Y3QgZTFpbnBfdHMgKnRzLCBpbnQgZXZ0LCB1X2ludDhfdCB0ZWksIHVfaW50OF90IHNhcGkpCit7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqbGluazsKKworCWxpbmsgPSBlMWlucF9sb29rdXBfc2lnbl9saW5rKHRzLCB0ZWksIHNhcGkpOworCWlmICghbGluaykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBGSVhNRTogcmVwb3J0IGZ1cnRoZXIgdXB3YXJkcyAqLworCWlucHV0X2V2ZW50KGV2dCwgbGluay0+dHlwZSwgbGluay0+dHJ4KTsKKwlyZXR1cm4gMDsKK30KKworLyogcmVnaXN0ZXIgYSBkcml2ZXIgd2l0aCB0aGUgRTEgY29yZSAqLworaW50IGUxaW5wX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgZTFpbnBfZHJpdmVyICpkcnYpCit7CisJbGxpc3RfYWRkX3RhaWwoJmRydi0+bGlzdCwgJmUxaW5wX2RyaXZlcl9saXN0KTsKKwlyZXR1cm4gMDsKK30KKworaW50IGUxaW5wX2xpbmVfdXBkYXRlKHN0cnVjdCBlMWlucF9saW5lICpsaW5lKQoreworCXJldHVybiBtaV9lMV9saW5lX3VwZGF0ZShsaW5lKTsKK30KKworc3RhdGljIGludCBlMWlfc2lnX2NiKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBzaWduYWwsCisJCSAgICAgIHZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpCit7CisJaWYgKHN1YnN5cyAhPSBTU19HTE9CQUwgfHwKKwkgICAgc2lnbmFsICE9IFNfR0xPQkFMX1NIVVRET1dOKQorCQlyZXR1cm4gMDsKKworCWlmIChwY2FwX2ZkKSB7CisJCWNsb3NlKHBjYXBfZmQpOworCQlwY2FwX2ZkID0gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpIHZvaWQgb25fZHNvX2xvYWRfZTFfaW5wKHZvaWQpCit7CisJdGFsbF9zaWdsX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDEsCisJCQkJCSAgICJlMWlucF9zaWduX2xpbmsiKTsKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19HTE9CQUwsIGUxaV9zaWdfY2IsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3Bycy9NYWtlZmlsZS5hbSBiL29wZW5ic2Mvc3JjL2dwcnMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFiMmFjOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dwcnMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyNSBAQAorSU5DTFVERVMgPSAkKGFsbF9pbmNsdWRlcykgLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUgLUkkKHRvcF9idWlsZGRpcikKK0FNX0NGTEFHUz0tV2FsbCAtZm5vLXN0cmljdC1hbGlhc2luZyAkKExJQk9TTU9DT1JFX0NGTEFHUykgJChMSUJPU01PVlRZX0NGTEFHUykKK0FNX0xERkxBR1MgPSAkKExJQk9TTU9DT1JFX0xJQlMpICQoTElCT1NNT1ZUWV9MSUJTKQorCitub2luc3RfTElCUkFSSUVTID0gbGliZ2IuYQorCitpZiBIQVZFX0xJQkdUUAorc2Jpbl9QUk9HUkFNUyA9IG9zbW8tZ2Jwcm94eSBvc21vLXNnc24KK2Vsc2UKK3NiaW5fUFJPR1JBTVMgPSBvc21vLWdicHJveHkKK2VuZGlmCisKKworbGliZ2JfYV9TT1VSQ0VTID0gZ3Byc19ucy5jIGdwcnNfbnNfZnJncmUuYyBncHJzX25zX3Z0eS5jIFwKKwkJICBncHJzX2Jzc2dwLmMgZ3Byc19ic3NncF91dGlsLmMgZ3Byc19ic3NncF92dHkuYyBcCisJCSAgZ3Byc19sbGMuYyBncHJzX2xsY192dHkuYyBjcmMyNC5jCisKK29zbW9fZ2Jwcm94eV9TT1VSQ0VTID0gZ2JfcHJveHkuYyBnYl9wcm94eV9tYWluLmMgZ2JfcHJveHlfdnR5LmMgXAorCQkJJCh0b3Bfc3JjZGlyKS9zcmMvc29ja2V0LmMgJCh0b3Bfc3JjZGlyKS9zcmMvZGVidWcuYworb3Ntb19nYnByb3h5X0xEQUREID0gbGliZ2IuYSAkKHRvcF9idWlsZGRpcikvc3JjL2xpYnZ0eS5hCisKK29zbW9fc2dzbl9TT1VSQ0VTID0JZ3Byc19nbW0uYyBncHJzX3Nnc24uYyBcCisJCQlzZ3NuX21haW4uYyBzZ3NuX3Z0eS5jIHNnc25fbGliZ3RwLmMgXAorCQkJJCh0b3Bfc3JjZGlyKS9zcmMvc29ja2V0LmMgJCh0b3Bfc3JjZGlyKS9zcmMvZGVidWcuYworb3Ntb19zZ3NuX0xEQUREID0gbGliZ2IuYSAkKHRvcF9idWlsZGRpcikvc3JjL2xpYnZ0eS5hIC1sZ3RwCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ncHJzL2NyYzI0LmMgYi9vcGVuYnNjL3NyYy9ncHJzL2NyYzI0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA4MjEyMAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dwcnMvY3JjMjQuYwpAQCAtMCwwICsxLDY5IEBACisvKiBHUFJTIExMQyBDUkMtMjQgSW1wbGVtZW50YXRpb24gKi8KKworLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jcmMyNC5oPgorCisvKiBDUkMyNCB0YWJsZSAtIEZDUyAqLworc3RhdGljIGNvbnN0IHVfaW50MzJfdCB0YmxfY3JjMjRbMjU2XSA9IHsKKwkweDAwMDAwMDAwLCAweDAwZDZhNzc2LCAweDAwZjY0NTU3LCAweDAwMjBlMjIxLCAweDAwYjc4MTE1LCAweDAwNjEyNjYzLCAweDAwNDFjNDQyLCAweDAwOTc2MzM0LAorCTB4MDAzNDA5OTEsIDB4MDBlMmFlZTcsIDB4MDBjMjRjYzYsIDB4MDAxNGViYjAsIDB4MDA4Mzg4ODQsIDB4MDA1NTJmZjIsIDB4MDA3NWNkZDMsIDB4MDBhMzZhYTUsCisJMHgwMDY4MTMyMiwgMHgwMGJlYjQ1NCwgMHgwMDllNTY3NSwgMHgwMDQ4ZjEwMywgMHgwMGRmOTIzNywgMHgwMDA5MzU0MSwgMHgwMDI5ZDc2MCwgMHgwMGZmNzAxNiwKKwkweDAwNWMxYWIzLCAweDAwOGFiZGM1LCAweDAwYWE1ZmU0LCAweDAwN2NmODkyLCAweDAwZWI5YmE2LCAweDAwM2QzY2QwLCAweDAwMWRkZWYxLCAweDAwY2I3OTg3LAorCTB4MDBkMDI2NDQsIDB4MDAwNjgxMzIsIDB4MDAyNjYzMTMsIDB4MDBmMGM0NjUsIDB4MDA2N2E3NTEsIDB4MDBiMTAwMjcsIDB4MDA5MWUyMDYsIDB4MDA0NzQ1NzAsCisJMHgwMGU0MmZkNSwgMHgwMDMyODhhMywgMHgwMDEyNmE4MiwgMHgwMGM0Y2RmNCwgMHgwMDUzYWVjMCwgMHgwMDg1MDliNiwgMHgwMGE1ZWI5NywgMHgwMDczNGNlMSwKKwkweDAwYjgzNTY2LCAweDAwNmU5MjEwLCAweDAwNGU3MDMxLCAweDAwOThkNzQ3LCAweDAwMGZiNDczLCAweDAwZDkxMzA1LCAweDAwZjlmMTI0LCAweDAwMmY1NjUyLAorCTB4MDA4YzNjZjcsIDB4MDA1YTliODEsIDB4MDA3YTc5YTAsIDB4MDBhY2RlZDYsIDB4MDAzYmJkZTIsIDB4MDBlZDFhOTQsIDB4MDBjZGY4YjUsIDB4MDAxYjVmYzMsCisJMHgwMGZiNDczMywgMHgwMDJkZTA0NSwgMHgwMDBkMDI2NCwgMHgwMGRiYTUxMiwgMHgwMDRjYzYyNiwgMHgwMDlhNjE1MCwgMHgwMGJhODM3MSwgMHgwMDZjMjQwNywKKwkweDAwY2Y0ZWEyLCAweDAwMTllOWQ0LCAweDAwMzkwYmY1LCAweDAwZWZhYzgzLCAweDAwNzhjZmI3LCAweDAwYWU2OGMxLCAweDAwOGU4YWUwLCAweDAwNTgyZDk2LAorCTB4MDA5MzU0MTEsIDB4MDA0NWYzNjcsIDB4MDA2NTExNDYsIDB4MDBiM2I2MzAsIDB4MDAyNGQ1MDQsIDB4MDBmMjcyNzIsIDB4MDBkMjkwNTMsIDB4MDAwNDM3MjUsCisJMHgwMGE3NWQ4MCwgMHgwMDcxZmFmNiwgMHgwMDUxMThkNywgMHgwMDg3YmZhMSwgMHgwMDEwZGM5NSwgMHgwMGM2N2JlMywgMHgwMGU2OTljMiwgMHgwMDMwM2ViNCwKKwkweDAwMmI2MTc3LCAweDAwZmRjNjAxLCAweDAwZGQyNDIwLCAweDAwMGI4MzU2LCAweDAwOWNlMDYyLCAweDAwNGE0NzE0LCAweDAwNmFhNTM1LCAweDAwYmMwMjQzLAorCTB4MDAxZjY4ZTYsIDB4MDBjOWNmOTAsIDB4MDBlOTJkYjEsIDB4MDAzZjhhYzcsIDB4MDBhOGU5ZjMsIDB4MDA3ZTRlODUsIDB4MDA1ZWFjYTQsIDB4MDA4ODBiZDIsCisJMHgwMDQzNzI1NSwgMHgwMDk1ZDUyMywgMHgwMGI1MzcwMiwgMHgwMDYzOTA3NCwgMHgwMGY0ZjM0MCwgMHgwMDIyNTQzNiwgMHgwMDAyYjYxNywgMHgwMGQ0MTE2MSwKKwkweDAwNzc3YmM0LCAweDAwYTFkY2IyLCAweDAwODEzZTkzLCAweDAwNTc5OWU1LCAweDAwYzBmYWQxLCAweDAwMTY1ZGE3LCAweDAwMzZiZjg2LCAweDAwZTAxOGYwLAorCTB4MDBhZDg1ZGQsIDB4MDA3YjIyYWIsIDB4MDA1YmMwOGEsIDB4MDA4ZDY3ZmMsIDB4MDAxYTA0YzgsIDB4MDBjY2EzYmUsIDB4MDBlYzQxOWYsIDB4MDAzYWU2ZTksCisJMHgwMDk5OGM0YywgMHgwMDRmMmIzYSwgMHgwMDZmYzkxYiwgMHgwMGI5NmU2ZCwgMHgwMDJlMGQ1OSwgMHgwMGY4YWEyZiwgMHgwMGQ4NDgwZSwgMHgwMDBlZWY3OCwKKwkweDAwYzU5NmZmLCAweDAwMTMzMTg5LCAweDAwMzNkM2E4LCAweDAwZTU3NGRlLCAweDAwNzIxN2VhLCAweDAwYTRiMDljLCAweDAwODQ1MmJkLCAweDAwNTJmNWNiLAorCTB4MDBmMTlmNmUsIDB4MDAyNzM4MTgsIDB4MDAwN2RhMzksIDB4MDBkMTdkNGYsIDB4MDA0NjFlN2IsIDB4MDA5MGI5MGQsIDB4MDBiMDViMmMsIDB4MDA2NmZjNWEsCisJMHgwMDdkYTM5OSwgMHgwMGFiMDRlZiwgMHgwMDhiZTZjZSwgMHgwMDVkNDFiOCwgMHgwMGNhMjI4YywgMHgwMDFjODVmYSwgMHgwMDNjNjdkYiwgMHgwMGVhYzBhZCwKKwkweDAwNDlhYTA4LCAweDAwOWYwZDdlLCAweDAwYmZlZjVmLCAweDAwNjk0ODI5LCAweDAwZmUyYjFkLCAweDAwMjg4YzZiLCAweDAwMDg2ZTRhLCAweDAwZGVjOTNjLAorCTB4MDAxNWIwYmIsIDB4MDBjMzE3Y2QsIDB4MDBlM2Y1ZWMsIDB4MDAzNTUyOWEsIDB4MDBhMjMxYWUsIDB4MDA3NDk2ZDgsIDB4MDA1NDc0ZjksIDB4MDA4MmQzOGYsCisJMHgwMDIxYjkyYSwgMHgwMGY3MWU1YywgMHgwMGQ3ZmM3ZCwgMHgwMDAxNWIwYiwgMHgwMDk2MzgzZiwgMHgwMDQwOWY0OSwgMHgwMDYwN2Q2OCwgMHgwMGI2ZGExZSwKKwkweDAwNTZjMmVlLCAweDAwODA2NTk4LCAweDAwYTA4N2I5LCAweDAwNzYyMGNmLCAweDAwZTE0M2ZiLCAweDAwMzdlNDhkLCAweDAwMTcwNmFjLCAweDAwYzFhMWRhLAorCTB4MDA2MmNiN2YsIDB4MDBiNDZjMDksIDB4MDA5NDhlMjgsIDB4MDA0MjI5NWUsIDB4MDBkNTRhNmEsIDB4MDAwM2VkMWMsIDB4MDAyMzBmM2QsIDB4MDBmNWE4NGIsCisJMHgwMDNlZDFjYywgMHgwMGU4NzZiYSwgMHgwMGM4OTQ5YiwgMHgwMDFlMzNlZCwgMHgwMDg5NTBkOSwgMHgwMDVmZjdhZiwgMHgwMDdmMTU4ZSwgMHgwMGE5YjJmOCwKKwkweDAwMGFkODVkLCAweDAwZGM3ZjJiLCAweDAwZmM5ZDBhLCAweDAwMmEzYTdjLCAweDAwYmQ1OTQ4LCAweDAwNmJmZTNlLCAweDAwNGIxYzFmLCAweDAwOWRiYjY5LAorCTB4MDA4NmU0YWEsIDB4MDA1MDQzZGMsIDB4MDA3MGExZmQsIDB4MDBhNjA2OGIsIDB4MDAzMTY1YmYsIDB4MDBlN2MyYzksIDB4MDBjNzIwZTgsIDB4MDAxMTg3OWUsCisJMHgwMGIyZWQzYiwgMHgwMDY0NGE0ZCwgMHgwMDQ0YTg2YywgMHgwMDkyMGYxYSwgMHgwMDA1NmMyZSwgMHgwMGQzY2I1OCwgMHgwMGYzMjk3OSwgMHgwMDI1OGUwZiwKKwkweDAwZWVmNzg4LCAweDAwMzg1MGZlLCAweDAwMThiMmRmLCAweDAwY2UxNWE5LCAweDAwNTk3NjlkLCAweDAwOGZkMWViLCAweDAwYWYzM2NhLCAweDAwNzk5NGJjLAorCTB4MDBkYWZlMTksIDB4MDAwYzU5NmYsIDB4MDAyY2JiNGUsIDB4MDBmYTFjMzgsIDB4MDA2ZDdmMGMsIDB4MDBiYmQ4N2EsIDB4MDA5YjNhNWIsIDB4MDA0ZDlkMmQKK307CisKKyNkZWZpbmUgSU5JVF9DUkMyNAkweGZmZmZmZgorCit1X2ludDMyX3QgY3JjMjRfY2FsYyh1X2ludDMyX3QgZmNzLCB1X2ludDhfdCAqY3AsIHVuc2lnbmVkIGludCBsZW4pCit7CisJd2hpbGUgKGxlbi0tKQorCQlmY3MgPSAoZmNzID4+IDgpIF4gdGJsX2NyYzI0WyhmY3MgXiAqY3ArKykgJiAweGZmXTsKKwlyZXR1cm4gZmNzOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3Bycy9nYl9wcm94eS5jIGIvb3BlbmJzYy9zcmMvZ3Bycy9nYl9wcm94eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZmJhYzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ncHJzL2diX3Byb3h5LmMKQEAgLTAsMCArMSw1OTQgQEAKKy8qIE5TLW92ZXItSVAgcHJveHkgKi8KKworLyogKEMpIDIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDEwIGJ5IE9uIFdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfbnMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfYnNzZ3AuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2diX3Byb3h5Lmg+CisKK3N0cnVjdCBnYnByb3hfcGVlciB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKworCS8qIE5TLVZDIG92ZXIgd2hpY2ggd2Ugc2VuZC9yZWNlaXZlIGRhdGEgdG8gdGhpcyBCVkMgKi8KKwlzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjOworCisJLyogQlZDSSB1c2VkIGZvciBQb2ludC10by1Qb2ludCB0byB0aGlzIHBlZXIgKi8KKwl1aW50MTZfdCBidmNpOworCisJLyogUm91dGVpbmcgQXJlYSB0aGF0IHRoaXMgcGVlciBpcyBwYXJ0IG9mIChyYXcgMDQuMDggZW5jb2RpbmcpICovCisJdWludDhfdCByYVs2XTsKK307CisKKy8qIExpbmtlZCBsaXN0IG9mIGFsbCBHYiBwZWVycyAoZXhjZXB0IFNHU04pICovCitzdGF0aWMgTExJU1RfSEVBRChnYnByb3hfYnRzX3BlZXJzKTsKKworLyogRmluZCB0aGUgZ2Jwcm94X3BlZXIgYnkgaXRzIEJWQ0kgKi8KK3N0YXRpYyBzdHJ1Y3QgZ2Jwcm94X3BlZXIgKnBlZXJfYnlfYnZjaSh1aW50MTZfdCBidmNpKQoreworCXN0cnVjdCBnYnByb3hfcGVlciAqcGVlcjsKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShwZWVyLCAmZ2Jwcm94X2J0c19wZWVycywgbGlzdCkgeworCQlpZiAocGVlci0+YnZjaSA9PSBidmNpKQorCQkJcmV0dXJuIHBlZXI7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGdicHJveF9wZWVyICpwZWVyX2J5X25zdmMoc3RydWN0IGdwcnNfbnN2YyAqbnN2YykKK3sKKwlzdHJ1Y3QgZ2Jwcm94X3BlZXIgKnBlZXI7CisJbGxpc3RfZm9yX2VhY2hfZW50cnkocGVlciwgJmdicHJveF9idHNfcGVlcnMsIGxpc3QpIHsKKwkJaWYgKHBlZXItPm5zdmMgPT0gbnN2YykKKwkJCXJldHVybiBwZWVyOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogbG9vay11cCBhIHBlZXIgYnkgaXRzIFJvdXRlaW5nIEFyZWEgQ29kZSAoUkFDKSAqLworc3RhdGljIHN0cnVjdCBnYnByb3hfcGVlciAqcGVlcl9ieV9yYWMoY29uc3QgdWludDhfdCAqcmEpCit7CisJc3RydWN0IGdicHJveF9wZWVyICpwZWVyOworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHBlZXIsICZnYnByb3hfYnRzX3BlZXJzLCBsaXN0KSB7CisJCWlmICghbWVtY21wKHBlZXItPnJhLCByYSwgNikpCisJCQlyZXR1cm4gcGVlcjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIGxvb2stdXAgYSBwZWVyIGJ5IGl0cyBMb2NhdGlvbiBBcmVhIENvZGUgKExBQykgKi8KK3N0YXRpYyBzdHJ1Y3QgZ2Jwcm94X3BlZXIgKnBlZXJfYnlfbGFjKGNvbnN0IHVpbnQ4X3QgKmxhKQoreworCXN0cnVjdCBnYnByb3hfcGVlciAqcGVlcjsKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShwZWVyLCAmZ2Jwcm94X2J0c19wZWVycywgbGlzdCkgeworCQlpZiAoIW1lbWNtcChwZWVyLT5yYSwgbGEsIDUpKQorCQkJcmV0dXJuIHBlZXI7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGdicHJveF9wZWVyICpwZWVyX2FsbG9jKHVpbnQxNl90IGJ2Y2kpCit7CisJc3RydWN0IGdicHJveF9wZWVyICpwZWVyOworCisJcGVlciA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGdicHJveF9wZWVyKTsKKwlpZiAoIXBlZXIpCisJCXJldHVybiBOVUxMOworCisJcGVlci0+YnZjaSA9IGJ2Y2k7CisJbGxpc3RfYWRkKCZwZWVyLT5saXN0LCAmZ2Jwcm94X2J0c19wZWVycyk7CisKKwlyZXR1cm4gcGVlcjsKK30KKworc3RhdGljIHZvaWQgcGVlcl9mcmVlKHN0cnVjdCBnYnByb3hfcGVlciAqcGVlcikKK3sKKwlsbGlzdF9kZWwoJnBlZXItPmxpc3QpOworCXRhbGxvY19mcmVlKHBlZXIpOworfQorCisvKiBGSVhNRTogdGhpcyBuZWVkcyB0byBnbyB0byBsaWJvc21vY29yZS9tc2diLmMgKi8KK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqbXNnYl9jb3B5KGNvbnN0IHN0cnVjdCBtc2diICptc2csIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IG1zZ2IgKm5ld19tc2c7CisKKwluZXdfbXNnID0gbXNnYl9hbGxvY19oZWFkcm9vbShtc2ctPmRhdGFfbGVuLCBOU19BTExPQ19IRUFEUk9PTSwgbmFtZSk7CisJaWYgKCFuZXdfbXNnKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIGNvcHkgaGVhZGVyICovCisJbWVtY3B5KG5ld19tc2csIG1zZywgc2l6ZW9mKCpuZXdfbXNnKSk7CisJLyogY29weSBkYXRhICovCisJbWVtY3B5KG5ld19tc2ctPmRhdGEsIG1zZy0+ZGF0YSwgbmV3X21zZy0+ZGF0YV9sZW4pOworCisJcmV0dXJuIG5ld19tc2c7Cit9CisKKy8qIHN0cmlwIG9mZiB0aGUgTlMgaGVhZGVyICovCitzdGF0aWMgdm9pZCBzdHJpcF9uc19oZHIoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlpbnQgc3RyaXBfbGVuID0gbXNnYl9ic3NncGgobXNnKSAtIG1zZy0+ZGF0YTsKKwltc2diX3B1bGwobXNnLCBzdHJpcF9sZW4pOworfQorCisvKiBmZWVkIGEgbWVzc2FnZSBkb3duIHRoZSBOUy1WQyBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBwZWVyICovCitzdGF0aWMgaW50IGdicHJveF9yZWxheTJzZ3NuKHN0cnVjdCBtc2diICpvbGRfbXNnLCB1aW50MTZfdCBuc19idmNpKQoreworCS8qIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIG1lc3NhZ2Ugc28gdGhlIG9sZCBvbmUgY2FuCisJICogYmUgZnJlZSgpZCBzYWZlbHkgd2hlbiB3ZSByZXR1cm4gZnJvbSBnYnByb3hfcmN2bXNnKCkgKi8KKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9jb3B5KG9sZF9tc2csICJtc2diX3JlbGF5MnNnc24iKTsKKworCURFQlVHUChER1BSUywgIk5TRUk9JXUgcHJveHlpbmcgQlRTLT5TR1NOIChOU19CVkNJPSV1LCBOU0VJPSV1KVxuIiwKKwkJbXNnYl9uc2VpKG1zZyksIG5zX2J2Y2ksIGdiY2ZnLm5zaXBfc2dzbl9uc2VpKTsKKworCW1zZ2JfYnZjaShtc2cpID0gbnNfYnZjaTsKKwltc2diX25zZWkobXNnKSA9IGdiY2ZnLm5zaXBfc2dzbl9uc2VpOworCisJc3RyaXBfbnNfaGRyKG1zZyk7CisKKwlyZXR1cm4gZ3Byc19uc19zZW5kbXNnKGJzc2dwX25zaSwgbXNnKTsKK30KKworLyogZmVlZCBhIG1lc3NhZ2UgZG93biB0aGUgTlMtVkMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgcGVlciAqLworc3RhdGljIGludCBnYnByb3hfcmVsYXkycGVlcihzdHJ1Y3QgbXNnYiAqb2xkX21zZywgc3RydWN0IGdicHJveF9wZWVyICpwZWVyLAorCQkJICB1aW50MTZfdCBuc19idmNpKQoreworCS8qIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIG1lc3NhZ2Ugc28gdGhlIG9sZCBvbmUgY2FuCisJICogYmUgZnJlZSgpZCBzYWZlbHkgd2hlbiB3ZSByZXR1cm4gZnJvbSBnYnByb3hfcmN2bXNnKCkgKi8KKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9jb3B5KG9sZF9tc2csICJtc2diX3JlbGF5MnBlZXIiKTsKKworCURFQlVHUChER1BSUywgIk5TRUk9JXUgcHJveHlpbmcgU0dTTi0+QlNTIChOU19CVkNJPSV1LCBOU0VJPSV1KVxuIiwKKwkJbXNnYl9uc2VpKG1zZyksIG5zX2J2Y2ksIHBlZXItPm5zdmMtPm5zZWkpOworCisJbXNnYl9idmNpKG1zZykgPSBuc19idmNpOworCW1zZ2JfbnNlaShtc2cpID0gcGVlci0+bnN2Yy0+bnNlaTsKKworCS8qIFN0cmlwIHRoZSBvbGQgTlMgaGVhZGVyLCBpdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggYSBuZXcgb25lICovCisJc3RyaXBfbnNfaGRyKG1zZyk7CisKKwlyZXR1cm4gZ3Byc19uc19zZW5kbXNnKGJzc2dwX25zaSwgbXNnKTsKK30KKworLyogU2VuZCBhIG1lc3NhZ2UgdG8gYSBwZWVyIGlkZW50aWZpZWQgYnkgcHRwX2J2Y2kgYnV0IHVzaW5nIG5zX2J2Y2kKKyAqIGluIHRoZSBOUyBoZHIgKi8KK3N0YXRpYyBpbnQgZ2Jwcm94X3JlbGF5MmJ2Y2koc3RydWN0IG1zZ2IgKm1zZywgdWludDE2X3QgcHRwX2J2Y2ksCisJCQkgIHVpbnQxNl90IG5zX2J2Y2kpCit7CisJc3RydWN0IGdicHJveF9wZWVyICpwZWVyOworCisJcGVlciA9IHBlZXJfYnlfYnZjaShwdHBfYnZjaSk7CisJaWYgKCFwZWVyKSB7CisJCUxPR1AoREdQUlMsIExPR0xfRVJST1IsICJCVkNJPSV1OiBDYW5ub3QgZmluZCBCU1NcbiIsCisJCQlwdHBfYnZjaSk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCXJldHVybiBnYnByb3hfcmVsYXkycGVlcihtc2csIHBlZXIsIG5zX2J2Y2kpOworfQorCisvKiBSZWNlaXZlIGFuIGluY29taW5nIHNpZ25hbGxpbmcgbWVzc2FnZSBmcm9tIGEgQlNTLXNpZGUgTlMtVkMgKi8KK3N0YXRpYyBpbnQgZ2Jwcm94X3J4X3NpZ19mcm9tX2JzcyhzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjLAorCQkJCSAgdWludDE2X3QgbnNfYnZjaSkKK3sKKwlzdHJ1Y3QgYnNzZ3Bfbm9ybWFsX2hkciAqYmdwaCA9IChzdHJ1Y3QgYnNzZ3Bfbm9ybWFsX2hkciAqKSBtc2diX2Jzc2dwaChtc2cpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXVpbnQ4X3QgcGR1X3R5cGUgPSBiZ3BoLT5wZHVfdHlwZTsKKwlpbnQgZGF0YV9sZW4gPSBtc2diX2Jzc2dwX2xlbihtc2cpIC0gc2l6ZW9mKCpiZ3BoKTsKKwlzdHJ1Y3QgZ2Jwcm94X3BlZXIgKmZyb21fcGVlcjsKKwlzdHJ1Y3QgZ3Byc19yYV9pZCByYWlkOworCisJaWYgKG5zX2J2Y2kgIT0gMCkgeworCQlMT0dQKERHUFJTLCBMT0dMX05PVElDRSwgIk5TRUk9JXUgQlZDST0ldSBpcyBub3Qgc2lnbmFsbGluZ1xuIiwKKwkJCW5zdmMtPm5zZWksIG5zX2J2Y2kpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiB3ZSBhY3R1YWxseSBzaG91bGQgbmV2ZXIgc2VlIHRob3NlIHR3byBmb3IgQlZDSSA9PSAwLCBidXQgZG91YmxlLWNoZWNrCisJICoganVzdCB0byBtYWtlIHN1cmUgICovCisJaWYgKHBkdV90eXBlID09IEJTU0dQX1BEVVRfVUxfVU5JVERBVEEgfHwKKwkgICAgcGR1X3R5cGUgPT0gQlNTR1BfUERVVF9ETF9VTklUREFUQSkgeworCQlMT0dQKERHUFJTLCBMT0dMX05PVElDRSwgIk5TRUk9JXUgVU5JVERBVEEgbm90IGFsbG93ZWQgaW4gIgorCQkJInNpZ25hbGxpbmdcbiIsIG5zdmMtPm5zZWkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlic3NncF90bHZfcGFyc2UoJnRwLCBiZ3BoLT5kYXRhLCBkYXRhX2xlbik7CisKKwlzd2l0Y2ggKHBkdV90eXBlKSB7CisJY2FzZSBCU1NHUF9QRFVUX1NVU1BFTkQ6CisJY2FzZSBCU1NHUF9QRFVUX1JFU1VNRToKKwkJLyogV2UgaW1wbGVtZW50IFJBQyBzbm9vcGluZyBkdXJpbmcgU1VTUEVORC9SRVNVTUUsIHNpbmNlCisJCSAqIGl0IGVzdGFibGlzaGVzIGEgcmVsYXRpb25zaXAgYmV0d2VlbiBCVkNJL3BlZXIgYW5kIHRoZQorCQkgKiByb3V0ZWluZyBhcmVhIGNvZGUuICBUaGUgc25vb3BlZCBpbmZvcm1hdGlvbiBpcyB0aGVuCisJCSAqIHVzZWQgZm9yIHJvdXRpbmcgdGhlIHtTVVNQRU5ELFJFU1VNRX1fW05dQUNLIGJhY2sgdG8KKwkJICogdGhlIGNvcnJlY3QgQlNTR1AgKi8KKwkJaWYgKCFUTFZQX1BSRVNFTlQoJnRwLCBCU1NHUF9JRV9ST1VURUlOR19BUkVBKSkKKwkJCWdvdG8gZXJyX21hbmRfaWU7CisJCWZyb21fcGVlciA9IHBlZXJfYnlfbnN2Yyhuc3ZjKTsKKwkJaWYgKCFmcm9tX3BlZXIpCisJCQlnb3RvIGVycl9ub19wZWVyOworCQltZW1jcHkoZnJvbV9wZWVyLT5yYSwgVExWUF9WQUwoJnRwLCBCU1NHUF9JRV9ST1VURUlOR19BUkVBKSwKKwkJCXNpemVvZihmcm9tX3BlZXItPnJhKSk7CisJCWdzbTQ4X3BhcnNlX3JhKCZyYWlkLCBmcm9tX3BlZXItPnJhKTsKKwkJTE9HUChER1BSUywgTE9HTF9JTkZPLCAiTlNFST0ldSBCU1NHUCBTVVNQRU5EL1JFU1VNRSAiCisJCQkiUkFDIHNub29waW5nOiBSQUMgJXUtJXUtJXUtJXUgYmVoaW5kIEJWQ0k9JXUsICIKKwkJCSJOU1ZDST0ldVxuIixuc3ZjLT5uc2VpLCByYWlkLm1jYywgcmFpZC5tbmMsIHJhaWQubGFjLAorCQkJcmFpZC5yYWMgLCBmcm9tX3BlZXItPmJ2Y2ksIG5zdmMtPm5zdmNpKTsKKwkJLyogRklYTUU6IFRoaXMgb25seSBzdXBwb3J0cyBvbmUgQlNTIHBlciBSQSAqLworCQlicmVhazsKKwljYXNlIEJTU0dQX1BEVVRfQlZDX1JFU0VUOgorCQkvKiBJZiB3ZSByZWNlaXZlIGEgQlZDIHJlc2V0IG9uIHRoZSBzaWduYWxsaW5nIGVuZHBvaW50LCB3ZQorCQkgKiBkb24ndCB3YW50IHRoZSBTR1NOIHRvIHJlc2V0LCBhcyB0aGUgc2lnbmFsbGluZyBlbmRwb2ludAorCQkgKiBpcyBjb21tb24gZm9yIGFsbCBwb2ludC10by1wb2ludCBCVkNzIChhbmQgdGh1cyBhbGwgQlRTKSAqLworCQlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgQlNTR1BfSUVfQlZDSSkpIHsKKwkJCXVpbnQxNl90IGJ2Y2kgPSBudG9ocygqKHVpbnQxNl90ICopVExWUF9WQUwoJnRwLCBCU1NHUF9JRV9CVkNJKSk7CisJCQlMT0dQKERHUFJTLCBMT0dMX0lORk8sICJOU0VJPSV1IFJ4IEJWQyBSRVNFVCAoQlZDST0ldSlcbiIsCisJCQkJbnN2Yy0+bnNlaSwgYnZjaSk7CisJCQlpZiAoYnZjaSA9PSAwKSB7CisJCQkJLyogRklYTUU6IG9ubHkgZG8gdGhpcyBpZiBTR1NOIGlzIGFsaXZlISAqLworCQkJCUxPR1AoREdQUlMsIExPR0xfSU5GTywgIk5TRUk9JXUgVHggZmFrZSAiCisJCQkJCSJCVkMgUkVTRVQgQUNLIG9mIEJWQ0k9MFxuIiwgbnN2Yy0+bnNlaSk7CisJCQkJcmV0dXJuIGJzc2dwX3R4X3NpbXBsZV9idmNpKEJTU0dQX1BEVVRfQlZDX1JFU0VUX0FDSywKKwkJCQkJCQkgICAgbnN2Yy0+bnNlaSwgMCwgbnNfYnZjaSk7CisJCQl9CisJCQlmcm9tX3BlZXIgPSBwZWVyX2J5X2J2Y2koYnZjaSk7CisJCQlpZiAoIWZyb21fcGVlcikgeworCQkJCS8qIGlmIGEgUFRQLUJWQyBpcyByZXNldCwgYW5kIHdlIGRvbid0IGtub3cgdGhhdAorCQkJCSAqIFBUUC1CVkNJIHlldCwgd2Ugc2hvdWxkIGFsbG9jYXRlIGEgbmV3IHBlZXIgKi8KKwkJCQlMT0dQKERHUFJTLCBMT0dMX0lORk8sICJBbGxvY2F0aW9uZyBuZXcgcGVlciBmb3IgIgorCQkJCSAgICAgIkJWQ0k9JXUgdmlhIE5TVkNJPSV1L05TRUk9JXVcbiIsIGJ2Y2ksCisJCQkJICAgICBuc3ZjLT5uc3ZjaSwgbnN2Yy0+bnNlaSk7CisJCQkJZnJvbV9wZWVyID0gcGVlcl9hbGxvYyhidmNpKTsKKwkJCQlmcm9tX3BlZXItPm5zdmMgPSBuc3ZjOworCQkJfQorCQkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEJTU0dQX0lFX0NFTExfSUQpKSB7CisJCQkJc3RydWN0IGdwcnNfcmFfaWQgcmFpZDsKKwkJCQkvKiBXZSBoYXZlIGEgQ2VsbCBJZGVudGlmaWVyIHByZXNlbnQgaW4gdGhpcworCQkJCSAqIFBEVSwgdGhpcyBtZWFucyB3ZSBjYW4gZXh0ZW5kIG91ciBsb2NhbAorCQkJCSAqIHN0YXRlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcGFydGljdWxhciBjZWxsCisJCQkJICogKi8KKwkJCQltZW1jcHkoZnJvbV9wZWVyLT5yYSwKKwkJCQkJVExWUF9WQUwoJnRwLCBCU1NHUF9JRV9DRUxMX0lEKSwKKwkJCQkJc2l6ZW9mKGZyb21fcGVlci0+cmEpKTsKKwkJCQlnc200OF9wYXJzZV9yYSgmcmFpZCwgZnJvbV9wZWVyLT5yYSk7CisJCQkJTE9HUChER1BSUywgTE9HTF9JTkZPLCAiTlNFST0ldS9CVkNJPSV1ICIKKwkJCQkgICAgICJDZWxsIElEICV1LSV1LSV1LSV1XG4iLCBuc3ZjLT5uc2VpLAorCQkJCSAgICAgYnZjaSwgcmFpZC5tY2MsIHJhaWQubW5jLCByYWlkLmxhYywKKwkJCQkgICAgIHJhaWQucmFjKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisKKwkvKiBOb3JtYWxseSwgd2UgY2FuIHNpbXBseSBwYXNzIG9uIGFsbCBzaWduYWxsaW5nIG1lc3NhZ2VzIGZyb20gQlNTIHRvCisJICogU0dTTiAqLworCXJldHVybiBnYnByb3hfcmVsYXkyc2dzbihtc2csIG5zX2J2Y2kpOworZXJyX25vX3BlZXI6CisJTE9HUChER1BSUywgTE9HTF9FUlJPUiwgIk5TRUk9JXUoQlNTKSBjYW5ub3QgZmluZCBwZWVyIGJhc2VkIG9uIFJBQ1xuIiwKKwkJbnN2Yy0+bnNlaSk7CisJcmV0dXJuIGJzc2dwX3R4X3N0YXR1cyhCU1NHUF9DQVVTRV9VTktOT1dOX0JWQ0ksIE5VTEwsIG1zZyk7CitlcnJfbWFuZF9pZToKKwlMT0dQKERHUFJTLCBMT0dMX0VSUk9SLCAiTlNFST0ldShCU1MpIG1pc3NpbmcgbWFuZGF0b3J5IFJBIElFXG4iLAorCQluc3ZjLT5uc2VpKTsKKwlyZXR1cm4gYnNzZ3BfdHhfc3RhdHVzKEJTU0dQX0NBVVNFX01JU1NJTkdfTUFORF9JRSwgTlVMTCwgbXNnKTsKK30KKworLyogUmVjZWl2ZSBwYWdpbmcgcmVxdWVzdCBmcm9tIFNHU04sIHdlIG5lZWQgdG8gcmVsYXkgdG8gcHJvcGVyIEJTUyAqLworc3RhdGljIGludCBnYnByb3hfcnhfcGFnaW5nKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCB0bHZfcGFyc2VkICp0cCwKKwkJCSAgICBzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjLCB1aW50MTZfdCBuc19idmNpKQoreworCXN0cnVjdCBnYnByb3hfcGVlciAqcGVlciA9IE5VTEw7CisKKwlMT0dQKERHUFJTLCBMT0dMX0lORk8sICJOU0VJPSV1KFNHU04pIEJTU0dQIFBBR0lORyAiLAorCQluc3ZjLT5uc2VpKTsKKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBCU1NHUF9JRV9CVkNJKSkgeworCQl1aW50MTZfdCBidmNpID0gbnRvaHMoKih1aW50MTZfdCAqKVRMVlBfVkFMKHRwLCBCU1NHUF9JRV9CVkNJKSk7CisJCUxPR1BDKERHUFJTLCBMT0dMX0lORk8sICJyb3V0aW5nIGJ5IEJWQ0kgdG8gcGVlciBCVkNJPSV1XG4iLAorCQkJYnZjaSk7CisJfSBlbHNlIGlmIChUTFZQX1BSRVNFTlQodHAsIEJTU0dQX0lFX1JPVVRFSU5HX0FSRUEpKSB7CisJCXBlZXIgPSBwZWVyX2J5X3JhYyhUTFZQX1ZBTCh0cCwgQlNTR1BfSUVfUk9VVEVJTkdfQVJFQSkpOworCQlMT0dQQyhER1BSUywgTE9HTF9JTkZPLCAicm91dGluZyBieSBSQUMgdG8gcGVlciBCVkNJPSV1XG4iLAorCQkJcGVlci0+YnZjaSk7CisJfSBlbHNlIGlmIChUTFZQX1BSRVNFTlQodHAsIEJTU0dQX0lFX0xPQ0FUSU9OX0FSRUEpKSB7CisJCXBlZXIgPSBwZWVyX2J5X2xhYyhUTFZQX1ZBTCh0cCwgQlNTR1BfSUVfTE9DQVRJT05fQVJFQSkpOworCQlMT0dQQyhER1BSUywgTE9HTF9JTkZPLCAicm91dGluZyBieSBMQUMgdG8gcGVlciBCVkNJPSV1XG4iLAorCQkJcGVlci0+YnZjaSk7CisJfSBlbHNlCisJCUxPR1BDKERHUFJTLCBMT0dMX0lORk8sICJcbiIpOworCisJaWYgKCFwZWVyKSB7CisJCUxPR1AoREdQUlMsIExPR0xfRVJST1IsICJOU0VJPSV1KFNHU04pIEJTU0dQIFBBR0lORzogIgorCQkJInVuYWJsZSB0byByb3V0ZSwgbWlzc2luZyBJRVxuIiwgbnN2Yy0+bnNlaSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gZ2Jwcm94X3JlbGF5MnBlZXIobXNnLCBwZWVyLCBuc19idmNpKTsKK30KKworLyogUmVjZWl2ZSBhbiBpbmNvbWluZyBCVkMtUkVTRVQgbWVzc2FnZSBmcm9tIHRoZSBTR1NOICovCitzdGF0aWMgaW50IHJ4X3Jlc2V0X2Zyb21fc2dzbihzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgdGx2X3BhcnNlZCAqdHAsCisJCQkgICAgICBzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjLCB1aW50MTZfdCBuc19idmNpKQoreworCXN0cnVjdCBnYnByb3hfcGVlciAqcGVlcjsKKwl1aW50MTZfdCBwdHBfYnZjaTsKKworCWlmICghVExWUF9QUkVTRU5UKHRwLCBCU1NHUF9JRV9CVkNJKSkgeworCQlyZXR1cm4gYnNzZ3BfdHhfc3RhdHVzKEJTU0dQX0NBVVNFX01JU1NJTkdfTUFORF9JRSwKKwkJCQkgICAgICAgTlVMTCwgbXNnKTsKKwl9CisJcHRwX2J2Y2kgPSBudG9ocygqKHVpbnQxNl90ICopVExWUF9WQUwodHAsIEJTU0dQX0lFX0JWQ0kpKTsKKworCWlmIChwdHBfYnZjaSA+PSAyKSB7CisJCS8qIEEgcmVzZXQgZm9yIGEgUFRQIEJWQyB3YXMgcmVjZWl2ZWQsIGZvcndhcmQgaXQgdG8gaXRzCisJCSAqIHJlc3BlY3RpdmUgcGVlciAqLworCQlwZWVyID0gcGVlcl9ieV9idmNpKHB0cF9idmNpKTsKKwkJaWYgKCFwZWVyKSB7CisJCQlMT0dQKERHUFJTLCBMT0dMX0VSUk9SLCAiTlNFST0ldSBCVkNJPSV1OiBDYW5ub3QgZmluZCBCU1NcbiIsCisJCQkJbnN2Yy0+bnNlaSwgcHRwX2J2Y2kpOworCQkJcmV0dXJuIGJzc2dwX3R4X3N0YXR1cyhCU1NHUF9DQVVTRV9VTktOT1dOX0JWQ0ksCisJCQkJCSAgICAgICBOVUxMLCBtc2cpOworCQl9CisJCXJldHVybiBnYnByb3hfcmVsYXkycGVlcihtc2csIHBlZXIsIG5zX2J2Y2kpOworCX0KKworCS8qIEEgcmVzZXQgZm9yIHRoZSBTaWduYWxsaW5nIGVudGl0eSBoYXMgYmVlbiByZWNlaXZlZAorCSAqIGZyb20gdGhlIFNHU04uICBBcyB0aGUgc2lnbmFsbGluZyBCVkNJIGlzIHNoYXJlZAorCSAqIGFtb25nIGFsbCB0aGUgQlNTJ3MgdGhhdCB3ZSBtdWx0aXBsZXgsIGl0IG5lZWRzIHRvCisJICogYmUgcmVsYXllZCAgKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShwZWVyLCAmZ2Jwcm94X2J0c19wZWVycywgbGlzdCkKKwkJZ2Jwcm94X3JlbGF5MnBlZXIobXNnLCBwZWVyLCBuc19idmNpKTsKKworCXJldHVybiAwOworfQorCisvKiBSZWNlaXZlIGFuIGluY29taW5nIHNpZ25hbGxpbmcgbWVzc2FnZSBmcm9tIHRoZSBTR1NOLXNpZGUgTlMtVkMgKi8KK3N0YXRpYyBpbnQgZ2Jwcm94X3J4X3NpZ19mcm9tX3Nnc24oc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdwcnNfbnN2YyAqbnN2YywKKwkJCQkgICB1aW50MTZfdCBuc19idmNpKQoreworCXN0cnVjdCBic3NncF9ub3JtYWxfaGRyICpiZ3BoID0gKHN0cnVjdCBic3NncF9ub3JtYWxfaGRyICopIG1zZ2JfYnNzZ3BoKG1zZyk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJdWludDhfdCBwZHVfdHlwZSA9IGJncGgtPnBkdV90eXBlOworCWludCBkYXRhX2xlbiA9IG1zZ2JfYnNzZ3BfbGVuKG1zZykgLSBzaXplb2YoKmJncGgpOworCXN0cnVjdCBnYnByb3hfcGVlciAqcGVlcjsKKwl1aW50MTZfdCBidmNpOworCWludCByYyA9IDA7CisKKwlpZiAobnNfYnZjaSAhPSAwKSB7CisJCUxPR1AoREdQUlMsIExPR0xfTk9USUNFLCAiTlNFST0ldShTR1NOKSBCVkNJPSV1IGlzIG5vdCAiCisJCQkic2lnbmFsbGluZ1xuIiwgbnN2Yy0+bnNlaSwgbnNfYnZjaSk7CisJCS8qIEZJWE1FOiBTZW5kIHByb3BlciBlcnJvciBtZXNzYWdlICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHdlIGFjdHVhbGx5IHNob3VsZCBuZXZlciBzZWUgdGhvc2UgdHdvIGZvciBCVkNJID09IDAsIGJ1dCBkb3VibGUtY2hlY2sKKwkgKiBqdXN0IHRvIG1ha2Ugc3VyZSAgKi8KKwlpZiAocGR1X3R5cGUgPT0gQlNTR1BfUERVVF9VTF9VTklUREFUQSB8fAorCSAgICBwZHVfdHlwZSA9PSBCU1NHUF9QRFVUX0RMX1VOSVREQVRBKSB7CisJCUxPR1AoREdQUlMsIExPR0xfTk9USUNFLCAiTlNFST0ldShTR1NOKSBVTklUREFUQSBub3QgYWxsb3dlZCBpbiAiCisJCQkic2lnbmFsbGluZ1xuIiwgbnN2Yy0+bnNlaSk7CisJCXJldHVybiBic3NncF90eF9zdGF0dXMoQlNTR1BfQ0FVU0VfUFJPVE9fRVJSX1VOU1BFQywgTlVMTCwgbXNnKTsKKwl9CisKKwlyYyA9IGJzc2dwX3Rsdl9wYXJzZSgmdHAsIGJncGgtPmRhdGEsIGRhdGFfbGVuKTsKKworCXN3aXRjaCAocGR1X3R5cGUpIHsKKwljYXNlIEJTU0dQX1BEVVRfQlZDX1JFU0VUOgorCQlyYyA9IHJ4X3Jlc2V0X2Zyb21fc2dzbihtc2csICZ0cCwgbnN2YywgbnNfYnZjaSk7CisJCWJyZWFrOworCWNhc2UgQlNTR1BfUERVVF9GTFVTSF9MTDoKKwljYXNlIEJTU0dQX1BEVVRfQlZDX0JMT0NLX0FDSzoKKwljYXNlIEJTU0dQX1BEVVRfQlZDX1VOQkxPQ0tfQUNLOgorCWNhc2UgQlNTR1BfUERVVF9CVkNfUkVTRVRfQUNLOgorCQkvKiBzaW1wbGUgY2FzZTogQlZDSSBJRSBpcyBtYW5kYXRvcnkgKi8KKwkJaWYgKCFUTFZQX1BSRVNFTlQoJnRwLCBCU1NHUF9JRV9CVkNJKSkKKwkJCWdvdG8gZXJyX21hbmRfaWU7CisJCWJ2Y2kgPSBudG9ocygqKHVpbnQxNl90ICopVExWUF9WQUwoJnRwLCBCU1NHUF9JRV9CVkNJKSk7CisJCXJjID0gZ2Jwcm94X3JlbGF5MmJ2Y2kobXNnLCBidmNpLCBuc19idmNpKTsKKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QRFVUX1BBR0lOR19QUzoKKwljYXNlIEJTU0dQX1BEVVRfUEFHSU5HX0NTOgorCQkvKiBwcm9jZXNzIHRoZSBwYWdpbmcgcmVxdWVzdCAoTEFDL1JBQyBsb29rdXApICovCisJCXJjID0gZ2Jwcm94X3J4X3BhZ2luZyhtc2csICZ0cCwgbnN2YywgbnNfYnZjaSk7CisJCWJyZWFrOworCWNhc2UgQlNTR1BfUERVVF9TVEFUVVM6CisJCS8qIFNvbWUgZXhjZXB0aW9uIGhhcyBvY2N1cnJlZCAqLworCQlMT0dQKERHUFJTLCBMT0dMX05PVElDRSwKKwkJCSJOU0VJPSV1KFNHU04pIEJTU0dQIFNUQVRVUyAiLCBuc3ZjLT5uc2VpKTsKKwkJaWYgKCFUTFZQX1BSRVNFTlQoJnRwLCBCU1NHUF9JRV9DQVVTRSkpIHsKKwkJCUxPR1BDKERHUFJTLCBMT0dMX05PVElDRSwgIlxuIik7CisJCQlnb3RvIGVycl9tYW5kX2llOworCQl9CisJCUxPR1BDKERHUFJTLCBMT0dMX05PVElDRSwKKwkJCSJjYXVzZT0weCUwMngoJXMpICIsICpUTFZQX1ZBTCgmdHAsIEJTU0dQX0lFX0NBVVNFKSwKKwkJCWJzc2dwX2NhdXNlX3N0cigqVExWUF9WQUwoJnRwLCBCU1NHUF9JRV9DQVVTRSkpKTsKKwkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEJTU0dQX0lFX0JWQ0kpKSB7CisJCQl1aW50MTZfdCAqYnZjaSA9ICh1aW50MTZfdCAqKQorCQkJCQkJVExWUF9WQUwoJnRwLCBCU1NHUF9JRV9CVkNJKTsKKwkJCUxPR1BDKERHUFJTLCBMT0dMX05PVElDRSwKKwkJCQkiQlZDST0ldVxuIiwgbnRvaHMoKmJ2Y2kpKTsKKwkJfSBlbHNlCisJCQlMT0dQQyhER1BSUywgTE9HTF9OT1RJQ0UsICJcbiIpOworCQlicmVhazsKKwkvKiB0aG9zZSBvbmx5IGV4aXN0IGluIHRoZSBTR1NOIC0+IEJTUyBkaXJlY3Rpb24gKi8KKwljYXNlIEJTU0dQX1BEVVRfU1VTUEVORF9BQ0s6CisJY2FzZSBCU1NHUF9QRFVUX1NVU1BFTkRfTkFDSzoKKwljYXNlIEJTU0dQX1BEVVRfUkVTVU1FX0FDSzoKKwljYXNlIEJTU0dQX1BEVVRfUkVTVU1FX05BQ0s6CisJCS8qIFJBQyBJRSBpcyBtYW5kYXRvcnkgKi8KKwkJaWYgKCFUTFZQX1BSRVNFTlQoJnRwLCBCU1NHUF9JRV9ST1VURUlOR19BUkVBKSkKKwkJCWdvdG8gZXJyX21hbmRfaWU7CisJCXBlZXIgPSBwZWVyX2J5X3JhYyhUTFZQX1ZBTCgmdHAsIEJTU0dQX0lFX1JPVVRFSU5HX0FSRUEpKTsKKwkJaWYgKCFwZWVyKQorCQkJZ290byBlcnJfbm9fcGVlcjsKKwkJcmMgPSBnYnByb3hfcmVsYXkycGVlcihtc2csIHBlZXIsIG5zX2J2Y2kpOworCQlicmVhazsKKwljYXNlIEJTU0dQX1BEVVRfU0dTTl9JTlZPS0VfVFJBQ0U6CisJCUxPR1AoREdQUlMsIExPR0xfRVJST1IsCisJCSAgICAgIk5TRUk9JXUoU0dTTikgQlNTR1AgSU5WT0tFIFRSQUNFIG5vdCBzdXBwb3J0ZWRcbiIsbnN2Yy0+bnNlaSk7CisJCXJjID0gYnNzZ3BfdHhfc3RhdHVzKEJTU0dQX0NBVVNFX1BEVV9JTkNPTVBfRkVBVCwgTlVMTCwgbXNnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChER1BSUywgTE9HTF9OT1RJQ0UsICJCU1NHUCBQRFUgdHlwZSAweCUwMnggdW5rbm93blxuIiwKKwkJCXBkdV90eXBlKTsKKwkJcmMgPSBic3NncF90eF9zdGF0dXMoQlNTR1BfQ0FVU0VfUFJPVE9fRVJSX1VOU1BFQywgTlVMTCwgbXNnKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworZXJyX21hbmRfaWU6CisJTE9HUChER1BSUywgTE9HTF9FUlJPUiwgIk5TRUk9JXUoU0dTTikgbWlzc2luZyBtYW5kYXRvcnkgSUVcbiIsCisJCW5zdmMtPm5zZWkpOworCXJldHVybiBic3NncF90eF9zdGF0dXMoQlNTR1BfQ0FVU0VfTUlTU0lOR19NQU5EX0lFLCBOVUxMLCBtc2cpOworZXJyX25vX3BlZXI6CisJTE9HUChER1BSUywgTE9HTF9FUlJPUiwgIk5TRUk9JXUoU0dTTikgY2Fubm90IGZpbmQgcGVlciBiYXNlZCBvbiBSQUNcbiIsCisJCW5zdmMtPm5zZWkpOworCXJldHVybiBic3NncF90eF9zdGF0dXMoQlNTR1BfQ0FVU0VfVU5LTk9XTl9CVkNJLCBOVUxMLCBtc2cpOworfQorCisvKiBNYWluIGlucHV0IGZ1bmN0aW9uIGZvciBHYiBwcm94eSAqLworaW50IGdicHJveF9yY3Ztc2coc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdwcnNfbnN2YyAqbnN2YywgdWludDE2X3QgbnNfYnZjaSkKK3sKKwlpbnQgcmM7CisKKwkvKiBPbmx5IEJWQ0k9MCBtZXNzYWdlcyBuZWVkIHNwZWNpYWwgdHJlYXRtZW50ICovCisJaWYgKG5zX2J2Y2kgPT0gMCB8fCBuc19idmNpID09IDEpIHsKKwkJaWYgKG5zdmMtPnJlbW90ZV9lbmRfaXNfc2dzbikKKwkJCXJjID0gZ2Jwcm94X3J4X3NpZ19mcm9tX3Nnc24obXNnLCBuc3ZjLCBuc19idmNpKTsKKwkJZWxzZQorCQkJcmMgPSBnYnByb3hfcnhfc2lnX2Zyb21fYnNzKG1zZywgbnN2YywgbnNfYnZjaSk7CisJfSBlbHNlIHsKKwkJLyogQWxsIG90aGVyIEJWQ0kgYXJlIFBUUCBhbmQgdGh1cyBjYW4gYmUgc2ltcGx5IGZvcndhcmRlZCAqLworCQlpZiAoIW5zdmMtPnJlbW90ZV9lbmRfaXNfc2dzbikgeworCQkJcmMgPSBnYnByb3hfcmVsYXkyc2dzbihtc2csIG5zX2J2Y2kpOworCQl9IGVsc2UgeworCQkJc3RydWN0IGdicHJveF9wZWVyICpwZWVyID0gcGVlcl9ieV9idmNpKG5zX2J2Y2kpOworCQkJaWYgKCFwZWVyKSB7CisJCQkJTE9HUChER1BSUywgTE9HTF9JTkZPLCAiQWxsb2NhdGlvbmcgbmV3IHBlZXIgZm9yICIKKwkJCQkgICAgICJCVkNJPSV1IHZpYSBOU1ZDPSV1L05TRUk9JXVcbiIsIG5zX2J2Y2ksCisJCQkJICAgICBuc3ZjLT5uc3ZjaSwgbnN2Yy0+bnNlaSk7CisJCQkJcGVlciA9IHBlZXJfYWxsb2MobnNfYnZjaSk7CisJCQkJcGVlci0+bnN2YyA9IG5zdmM7CisJCQl9CisJCQlyYyA9IGdicHJveF9yZWxheTJwZWVyKG1zZywgcGVlciwgbnNfYnZjaSk7CisJCX0KKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBnYnByb3hfcmVzZXRfcGVyc2lzdGVudF9uc3ZjcyhzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2kpCit7CisJc3RydWN0IGdwcnNfbnN2YyAqbnN2YzsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KG5zdmMsICZuc2ktPmdwcnNfbnN2Y3MsIGxpc3QpIHsKKwkJaWYgKCFuc3ZjLT5wZXJzaXN0ZW50KQorCQkJY29udGludWU7CisJCWdwcnNfbnN2Y19yZXNldChuc3ZjLCBOU19DQVVTRV9PTV9JTlRFUlZFTlRJT04pOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogU2lnbmFsIGhhbmRsZXIgZm9yIHNpZ25hbHMgZnJvbSBOUyBsYXllciAqLworaW50IGdicHJveF9zaWduYWwodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJICB2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCXN0cnVjdCBuc19zaWduYWxfZGF0YSAqbnNzZCA9IHNpZ25hbF9kYXRhOworCXN0cnVjdCBncHJzX25zdmMgKm5zdmMgPSBuc3NkLT5uc3ZjOworCXN0cnVjdCBnYnByb3hfcGVlciAqcGVlcjsKKworCWlmIChzdWJzeXMgIT0gU1NfTlMpCisJCXJldHVybiAwOworCisJaWYgKHNpZ25hbCA9PSBTX05TX1JFU0VUICYmIG5zdmMtPm5zZWkgPT0gZ2JjZmcubnNpcF9zZ3NuX25zZWkpIHsKKwkJLyogV2UgaGF2ZSByZWNlaXZlZCBhIE5TLVJFU0VUIGZyb20gdGhlIE5TRUkgYW5kIE5TVkMKKwkJICogb2YgdGhlIFNHU04uICBUaGlzIG1pZ2h0IGhhcHBlbiB3aXRoIFNHU04gdGhhdCBzdGFydAorCQkgKiB0aGVpciBvd24gTlMtUkVTRVQgcHJvY2VkdXJlIHdpdGhvdXQgd2FpdGluZyBmb3Igb3VyCisJCSAqIE5TLVJFU0VUICovCisJCW5zdmMtPnJlbW90ZV9lbmRfaXNfc2dzbiA9IDE7CisJfQorCisJaWYgKHNpZ25hbCA9PSBTX05TX0FMSVZFX0VYUCAmJiBuc3ZjLT5yZW1vdGVfZW5kX2lzX3Nnc24pIHsKKwkJTE9HUChER1BSUywgTE9HTF9OT1RJQ0UsICJUbnMgYWxpdmUgZXhwaXJlZCB0b28gb2Z0ZW4sICIKKwkJCSJyZS1zdGFydGluZyBSRVNFVCBwcm9jZWR1cmVcbiIpOworCQluc2lwX2Nvbm5lY3QobnN2Yy0+bnNpLCAmbnN2Yy0+aXAuYnRzX2FkZHIsIG5zdmMtPm5zZWksCisJCQkgICAgIG5zdmMtPm5zdmNpKTsKKwl9CisKKwkvKiBXZSBjdXJyZW50bHkgb25seSBjYXJlIGFib3V0IHNpZ25hbHMgZnJvbSB0aGUgU0dTTiAqLworCWlmICghbnN2Yy0+cmVtb3RlX2VuZF9pc19zZ3NuKQorCQlyZXR1cm4gMDsKKworCS8qIGl0ZXJhdGUgb3ZlciBhbGwgQlRTIHBlZXJzIGFuZCBzZW5kIHRoZSByZXNwZWN0aXZlIFBEVSAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHBlZXIsICZnYnByb3hfYnRzX3BlZXJzLCBsaXN0KSB7CisJCXN3aXRjaCAoc2lnbmFsKSB7CisJCWNhc2UgU19OU19SRVNFVDoKKwkJCWdwcnNfbnNfdHhfcmVzZXQocGVlci0+bnN2YywgbnNzZC0+Y2F1c2UpOworCQkJYnJlYWs7CisJCWNhc2UgU19OU19CTE9DSzoKKwkJCWdwcnNfbnNfdHhfYmxvY2socGVlci0+bnN2YywgbnNzZC0+Y2F1c2UpOworCQkJYnJlYWs7CisJCWNhc2UgU19OU19VTkJMT0NLOgorCQkJZ3Byc19uc190eF91bmJsb2NrKHBlZXItPm5zdmMpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKworI2luY2x1ZGUgPG9zbW9jb20vdnR5L2NvbW1hbmQuaD4KKworZ0RFRlVOKHNob3dfZ2Jwcm94eSwgc2hvd19nYnByb3h5X2NtZCwgInNob3cgZ2Jwcm94eSIsCisgICAgICAgU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEdiIHByb3h5IikKK3sKKwlzdHJ1Y3QgZ2Jwcm94X3BlZXIgKnBlZXI7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShwZWVyLCAmZ2Jwcm94X2J0c19wZWVycywgbGlzdCkgeworCQlzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjID0gcGVlci0+bnN2YzsKKwkJc3RydWN0IGdwcnNfcmFfaWQgcmFpZDsKKwkJZ3NtNDhfcGFyc2VfcmEoJnJhaWQsIHBlZXItPnJhKTsKKworCQl2dHlfb3V0KHZ0eSwgIk5TRUkgJTV1LCBOUy1WQyAlNXUsIFBUUC1CVkNJICU1dSwgIgorCQkJIlJBQyAldS0ldS0ldS0ldSIsCisJCQluc3ZjLT5uc2VpLCBuc3ZjLT5uc3ZjaSwgcGVlci0+YnZjaSwKKwkJCXJhaWQubWNjLCByYWlkLm1uYywgcmFpZC5sYWMsIHJhaWQucmFjKTsKKwkJaWYgKG5zdmMtPmxsID09IEdQUlNfTlNfTExfVURQIHx8IG5zdmMtPmxsID09IEdQUlNfTlNfTExfRlJfR1JFKQorCQkJdnR5X291dCh2dHksICIgJXM6JXUlcyIsCisJCQkJaW5ldF9udG9hKG5zdmMtPmlwLmJ0c19hZGRyLnNpbl9hZGRyKSwKKwkJCQludG9ocyhuc3ZjLT5pcC5idHNfYWRkci5zaW5fcG9ydCksIFZUWV9ORVdMSU5FKTsKKwkJZWxzZQorCQkJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKwl9CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3Bycy9nYl9wcm94eV9tYWluLmMgYi9vcGVuYnNjL3NyYy9ncHJzL2diX3Byb3h5X21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2VmYjIxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3Bycy9nYl9wcm94eV9tYWluLmMKQEAgLTAsMCArMSwyNzMgQEAKKy8qIE5TLW92ZXItSVAgcHJveHkgKi8KKworLyogKEMpIDIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDEwIGJ5IE9uIFdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9yYXRlX2N0ci5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX25zLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX2Jzc2dwLmg+CisjaW5jbHVkZSA8b3BlbmJzYy92dHkuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2diX3Byb3h5Lmg+CisKKyNpbmNsdWRlIDxvc21vY29tL3Z0eS9jb21tYW5kLmg+CisjaW5jbHVkZSA8b3Ntb2NvbS92dHkvdGVsbmV0X2ludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiLi4vLi4vYnNjY29uZmlnLmgiCisKKy8qIHRoaXMgaXMgaGVyZSBmb3IgdGhlIHZ0eS4uLiBpdCB3aWxsIG5ldmVyIGJlIGNhbGxlZCAqLwordm9pZCBzdWJzY3JfcHV0KCkgeyBhYm9ydCgpOyB9CisKKyNkZWZpbmUgX0dOVV9TT1VSQ0UKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKwordm9pZCAqdGFsbF9ic2NfY3R4OworCitjb25zdCBjaGFyICpvcGVuYnNjX2NvcHlyaWdodCA9CisJIkNvcHlyaWdodCAoQykgMjAxMCBIYXJhbGQgV2VsdGUgYW5kIE9uLVdhdmVzXG4iCisJIkxpY2Vuc2UgR1BMdjIrOiBHTlUgR1BMIHZlcnNpb24gMiBvciBsYXRlciA8aHR0cDovL2dudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWw+XG4iCisJIlRoaXMgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGFyZSBmcmVlIHRvIGNoYW5nZSBhbmQgcmVkaXN0cmlidXRlIGl0LlxuIgorCSJUaGVyZSBpcyBOTyBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3LlxuIjsKKworc3RhdGljIHN0cnVjdCBsb2dfdGFyZ2V0ICpzdGRlcnJfdGFyZ2V0Oworc3RhdGljIGNoYXIgKmNvbmZpZ19maWxlID0gIm9zbW9fZ2Jwcm94eS5jZmciOworc3RydWN0IGdicHJveHlfY29uZmlnIGdiY2ZnOworCisvKiBQb2ludGVyIHRvIHRoZSBTR1NOIHBlZXIgKi8KK2V4dGVybiBzdHJ1Y3QgZ2Jwcm94X3BlZXIgKmdicHJveF9wZWVyX3Nnc247CisKKy8qIGNhbGwtYmFjayBmdW5jdGlvbiBmb3IgdGhlIE5TIHByb3RvY29sICovCitzdGF0aWMgaW50IHByb3h5X25zX2NiKGVudW0gZ3Byc19uc19ldnQgZXZlbnQsIHN0cnVjdCBncHJzX25zdmMgKm5zdmMsCisJCSAgICAgIHN0cnVjdCBtc2diICptc2csIHVfaW50MTZfdCBidmNpKQoreworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBHUFJTX05TX0VWVF9VTklUX0RBVEE6CisJCXJjID0gZ2Jwcm94X3Jjdm1zZyhtc2csIG5zdmMsIGJ2Y2kpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERHUFJTLCBMT0dMX0VSUk9SLCAiU0dTTjogVW5rbm93biBldmVudCAldSBmcm9tIE5TXG4iLCBldmVudCk7CisJCWlmIChtc2cpCisJCQl0YWxsb2NfZnJlZShtc2cpOworCQlyYyA9IC1FSU87CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIHNpZ25hbF9oYW5kbGVyKGludCBzaWduYWwpCit7CisJZnByaW50ZihzdGRvdXQsICJzaWduYWwgJXUgcmVjZWl2ZWRcbiIsIHNpZ25hbCk7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU0lHSU5UOgorCQlkaXNwYXRjaF9zaWduYWwoU1NfR0xPQkFMLCBTX0dMT0JBTF9TSFVURE9XTiwgTlVMTCk7CisJCXNsZWVwKDEpOworCQlleGl0KDApOworCQlicmVhazsKKwljYXNlIFNJR0FCUlQ6CisJCS8qIGluIGNhc2Ugb2YgYWJvcnQsIHdlIHdhbnQgdG8gb2J0YWluIGEgdGFsbG9jIHJlcG9ydAorCQkgKiBhbmQgdGhlbiByZXR1cm4gdG8gdGhlIGNhbGxlciwgd2hvIHdpbGwgYWJvcnQgdGhlIHByb2Nlc3MgKi8KKwljYXNlIFNJR1VTUjE6CisJCXRhbGxvY19yZXBvcnQodGFsbF92dHlfY3R4LCBzdGRlcnIpOworCQl0YWxsb2NfcmVwb3J0X2Z1bGwodGFsbF9ic2NfY3R4LCBzdGRlcnIpOworCQlicmVhazsKKwljYXNlIFNJR1VTUjI6CisJCXRhbGxvY19yZXBvcnRfZnVsbCh0YWxsX3Z0eV9jdHgsIHN0ZGVycik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgcHJpbnRfdXNhZ2UoKQoreworCXByaW50ZigiVXNhZ2U6IGJzY19oYWNrXG4iKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfaGVscCgpCit7CisJcHJpbnRmKCIgIFNvbWUgdXNlZnVsIGhlbHAuLi5cbiIpOworCXByaW50ZigiICAtaCAtLWhlbHAgdGhpcyB0ZXh0XG4iKTsKKwlwcmludGYoIiAgLWQgb3B0aW9uIC0tZGVidWc9RE5TOkRHUFJTLDA6MCBlbmFibGUgZGVidWdnaW5nXG4iKTsKKwlwcmludGYoIiAgLWMgLS1jb25maWctZmlsZSBmaWxlbmFtZSBUaGUgY29uZmlnIGZpbGUgdG8gdXNlLlxuIik7CisJcHJpbnRmKCIgIC1zIC0tZGlzYWJsZS1jb2xvclxuIik7CisJcHJpbnRmKCIgIC1UIC0tdGltZXN0YW1wIFByZWZpeCBldmVyeSBsb2cgbGluZSB3aXRoIGEgdGltZXN0YW1wXG4iKTsKKwlwcmludGYoIiAgLVYgLS12ZXJzaW9uLiBQcmludCB0aGUgdmVyc2lvbiBvZiBPcGVuQlNDLlxuIik7CisJcHJpbnRmKCIgIC1lIC0tbG9nLWxldmVsIG51bWJlci4gU2V0IGEgZ2xvYmFsIGxvZ2xldmVsLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9vcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwl3aGlsZSAoMSkgeworCQlpbnQgb3B0aW9uX2luZGV4ID0gMCwgYzsKKwkJc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisJCQl7ICJoZWxwIiwgMCwgMCwgJ2gnIH0sCisJCQl7ICJkZWJ1ZyIsIDEsIDAsICdkJyB9LAorCQkJeyAiY29uZmlnLWZpbGUiLCAxLCAwLCAnYycgfSwKKwkJCXsgImRpc2FibGUtY29sb3IiLCAwLCAwLCAncycgfSwKKwkJCXsgInRpbWVzdGFtcCIsIDAsIDAsICdUJyB9LAorCQkJeyAidmVyc2lvbiIsIDAsIDAsICdWJyB9LAorCQkJeyAibG9nLWxldmVsIiwgMSwgMCwgJ2UnIH0sCisJCQl7IDAsIDAsIDAsIDAgfQorCQl9OworCisJCWMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiaGQ6YzpzVFZlOiIsCisJCQkJbG9uZ19vcHRpb25zLCAmb3B0aW9uX2luZGV4KTsKKwkJaWYgKGMgPT0gLTEpCisJCQlicmVhazsKKworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnaCc6CisJCQlwcmludF91c2FnZSgpOworCQkJcHJpbnRfaGVscCgpOworCQkJZXhpdCgwKTsKKwkJY2FzZSAncyc6CisJCQlsb2dfc2V0X3VzZV9jb2xvcihzdGRlcnJfdGFyZ2V0LCAwKTsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCWxvZ19wYXJzZV9jYXRlZ29yeV9tYXNrKHN0ZGVycl90YXJnZXQsIG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnYyc6CisJCQljb25maWdfZmlsZSA9IHN0cmR1cChvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ1QnOgorCQkJbG9nX3NldF9wcmludF90aW1lc3RhbXAoc3RkZXJyX3RhcmdldCwgMSk7CisJCQlicmVhazsKKwkJY2FzZSAnZSc6CisJCQlsb2dfc2V0X2xvZ19sZXZlbChzdGRlcnJfdGFyZ2V0LCBhdG9pKG9wdGFyZykpOworCQkJYnJlYWs7CisJCWNhc2UgJ1YnOgorCQkJcHJpbnRfdmVyc2lvbigxKTsKKwkJCWV4aXQoMCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitleHRlcm4gdm9pZCAqdGFsbF9tc2diX2N0eDsKKworZXh0ZXJuIGludCBic2NfdnR5X2dvX3BhcmVudChzdHJ1Y3QgdnR5ICp2dHkpOworCitzdGF0aWMgc3RydWN0IHZ0eV9hcHBfaW5mbyB2dHlfaW5mbyA9IHsKKwkubmFtZSAJCT0gIk9zbW9jb20gR2IgUHJveHkiLAorCS52ZXJzaW9uCT0gUEFDS0FHRV9WRVJTSU9OLAorCS5nb19wYXJlbnRfY2IJPSBic2NfdnR5X2dvX3BhcmVudCwKK307CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgZHVtbXlfbmV0d29yazsKKwlpbnQgcmM7CisKKwl0YWxsX2JzY19jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QoTlVMTCwgMCwgIm5zaXBfcHJveHkiKTsKKwl0YWxsX21zZ2JfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgIm1zZ2IiKTsKKworCXNpZ25hbChTSUdJTlQsICZzaWduYWxfaGFuZGxlcik7CisJc2lnbmFsKFNJR0FCUlQsICZzaWduYWxfaGFuZGxlcik7CisJc2lnbmFsKFNJR1VTUjEsICZzaWduYWxfaGFuZGxlcik7CisJc2lnbmFsKFNJR1VTUjIsICZzaWduYWxfaGFuZGxlcik7CisJc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworCisJbG9nX2luaXQoJmxvZ19pbmZvKTsKKwlzdGRlcnJfdGFyZ2V0ID0gbG9nX3RhcmdldF9jcmVhdGVfc3RkZXJyKCk7CisJbG9nX2FkZF90YXJnZXQoc3RkZXJyX3RhcmdldCk7CisJbG9nX3NldF9hbGxfZmlsdGVyKHN0ZGVycl90YXJnZXQsIDEpOworCisJdnR5X2luZm8uY29weXJpZ2h0ID0gb3BlbmJzY19jb3B5cmlnaHQ7CisJdnR5X2luaXQoJnZ0eV9pbmZvKTsKKwlsb2dnaW5nX3Z0eV9hZGRfY21kcygpOworCWdicHJveHlfdnR5X2luaXQoKTsKKworCWhhbmRsZV9vcHRpb25zKGFyZ2MsIGFyZ3YpOworCisJcmF0ZV9jdHJfaW5pdCh0YWxsX2JzY19jdHgpOworCisJcmMgPSB0ZWxuZXRfaW5pdCh0YWxsX2JzY19jdHgsICZkdW1teV9uZXR3b3JrLCA0MjQ2KTsKKwlpZiAocmMgPCAwKQorCQlleGl0KDEpOworCisJYnNzZ3BfbnNpID0gZ3Byc19uc19pbnN0YW50aWF0ZSgmcHJveHlfbnNfY2IpOworCWlmICghYnNzZ3BfbnNpKSB7CisJCUxPR1AoREdQUlMsIExPR0xfRVJST1IsICJVbmFibGUgdG8gaW5zdGFudGlhdGUgTlNcbiIpOworCQlleGl0KDEpOworCX0KKwlnYmNmZy5uc2kgPSBic3NncF9uc2k7CisJZ3Byc19uc192dHlfaW5pdChic3NncF9uc2kpOworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX05TLCAmZ2Jwcm94X3NpZ25hbCwgTlVMTCk7CisKKwlyYyA9IGdicHJveHlfcGFyc2VfY29uZmlnKGNvbmZpZ19maWxlLCAmZ2JjZmcpOworCWlmIChyYyA8IDApIHsKKwkJTE9HUChER1BSUywgTE9HTF9GQVRBTCwgIkNhbm5vdCBwYXJzZSBjb25maWcgZmlsZVxuIik7CisJCWV4aXQoMik7CisJfQorCisJaWYgKCFuc3ZjX2J5X25zZWkoZ2JjZmcubnNpLCBnYmNmZy5uc2lwX3Nnc25fbnNlaSkpIHsKKwkJTE9HUChER1BSUywgTE9HTF9GQVRBTCwgIllvdSBjYW5ub3QgcHJveHkgdG8gTlNFSSAldSAiCisJCQkid2l0aG91dCBjcmVhdGluZyB0aGF0IE5TRUkgYmVmb3JlXG4iLAorCQkJZ2JjZmcubnNpcF9zZ3NuX25zZWkpOworCQlleGl0KDIpOworCX0KKworCXJjID0gZ3Byc19uc19uc2lwX2xpc3Rlbihic3NncF9uc2kpOworCWlmIChyYyA8IDApIHsKKwkJTE9HUChER1BSUywgTE9HTF9GQVRBTCwgIkNhbm5vdCBiaW5kL2xpc3RlbiBvbiBOU0lQIHNvY2tldFxuIik7CisJCWV4aXQoMik7CisJfQorCisJcmMgPSBncHJzX25zX2ZyZ3JlX2xpc3Rlbihic3NncF9uc2kpOworCWlmIChyYyA8IDApIHsKKwkJTE9HUChER1BSUywgTE9HTF9GQVRBTCwgIkNhbm5vdCBiaW5kL2xpc3RlbiBHUkUgIgorCQkJInNvY2tldC4gRG8geW91IGhhdmUgQ0FQX05FVF9SQVc/XG4iKTsKKwkJZXhpdCgyKTsKKwl9CisKKwkvKiBSZXNldCBhbGwgdGhlIHBlcnNpc3RlbnQgTlMtVkNzIHRoYXQgd2UndmUgcmVhZCBmcm9tIHRoZSBjb25maWcgKi8KKwlnYnByb3hfcmVzZXRfcGVyc2lzdGVudF9uc3Zjcyhic3NncF9uc2kpOworCisJd2hpbGUgKDEpIHsKKwkJcmMgPSBic2Nfc2VsZWN0X21haW4oMCk7CisJCWlmIChyYyA8IDApCisJCQlleGl0KDMpOworCX0KKworCWV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ncHJzL2diX3Byb3h5X3Z0eS5jIGIvb3BlbmJzYy9zcmMvZ3Bycy9nYl9wcm94eV92dHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjZkMmRhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3Bycy9nYl9wcm94eV92dHkuYwpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIChDKSAyMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAxMCBieSBPbi1XYXZlcworICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nYl9wcm94eS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19ucy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdnR5Lmg+CisKKyNpbmNsdWRlIDxvc21vY29tL3Z0eS9jb21tYW5kLmg+CisjaW5jbHVkZSA8b3Ntb2NvbS92dHkvdnR5Lmg+CisKK3N0YXRpYyBzdHJ1Y3QgZ2Jwcm94eV9jb25maWcgKmdfY2ZnID0gTlVMTDsKKworLyoKKyAqIHZ0eSBjb2RlIGZvciBtZ2NwIGJlbG93CisgKi8KK3N0YXRpYyBzdHJ1Y3QgY21kX25vZGUgZ2Jwcm94eV9ub2RlID0geworCUdCUFJPWFlfTk9ERSwKKwkiJXMoZ2Jwcm94eSkjIiwKKwkxLAorfTsKKworc3RhdGljIGludCBjb25maWdfd3JpdGVfZ2Jwcm94eShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdnR5X291dCh2dHksICJnYnByb3h5JXMiLCBWVFlfTkVXTElORSk7CisKKwl2dHlfb3V0KHZ0eSwgIiBzZ3NuIG5zZWkgJXUlcyIsIGdfY2ZnLT5uc2lwX3Nnc25fbnNlaSwKKwkJVlRZX05FV0xJTkUpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfZ2Jwcm94eSwKKyAgICAgIGNmZ19nYnByb3h5X2NtZCwKKyAgICAgICJnYnByb3h5IiwKKyAgICAgICJDb25maWd1cmUgdGhlIEdiIHByb3h5IikKK3sKKwl2dHktPm5vZGUgPSBHQlBST1hZX05PREU7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbnNpcF9zZ3NuX25zZWksCisgICAgICBjZmdfbnNpcF9zZ3NuX25zZWlfY21kLAorICAgICAgInNnc24gbnNlaSA8MC02NTUzND4iLAorICAgICAgIlNldCB0aGUgTlNFSSB0byBiZSB1c2VkIGluIHRoZSBjb25uZWN0aW9uIHdpdGggdGhlIFNHU04iKQoreworCXVuc2lnbmVkIGludCBwb3J0ID0gYXRvaShhcmd2WzBdKTsKKworCWdfY2ZnLT5uc2lwX3Nnc25fbnNlaSA9IHBvcnQ7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitpbnQgZ2Jwcm94eV92dHlfaW5pdCh2b2lkKQoreworCWluc3RhbGxfZWxlbWVudF92ZSgmc2hvd19nYnByb3h5X2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZjZmdfZ2Jwcm94eV9jbWQpOworCWluc3RhbGxfbm9kZSgmZ2Jwcm94eV9ub2RlLCBjb25maWdfd3JpdGVfZ2Jwcm94eSk7CisJaW5zdGFsbF9kZWZhdWx0KEdCUFJPWFlfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KEdCUFJPWFlfTk9ERSwgJm91cm5vZGVfZXhpdF9jbWQpOworCWluc3RhbGxfZWxlbWVudChHQlBST1hZX05PREUsICZvdXJub2RlX2VuZF9jbWQpOworCWluc3RhbGxfZWxlbWVudChHQlBST1hZX05PREUsICZjZmdfbnNpcF9zZ3NuX25zZWlfY21kKTsKKworCXJldHVybiAwOworfQorCitpbnQgZ2Jwcm94eV9wYXJzZV9jb25maWcoY29uc3QgY2hhciAqY29uZmlnX2ZpbGUsIHN0cnVjdCBnYnByb3h5X2NvbmZpZyAqY2ZnKQoreworCWludCByYzsKKworCWdfY2ZnID0gY2ZnOworCXJjID0gdnR5X3JlYWRfY29uZmlnX2ZpbGUoY29uZmlnX2ZpbGUsIE5VTEwpOworCWlmIChyYyA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gcGFyc2UgdGhlIGNvbmZpZyBmaWxlOiAnJXMnXG4iLCBjb25maWdfZmlsZSk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX2Jzc2dwLmMgYi9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfYnNzZ3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTk5NDUxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX2Jzc2dwLmMKQEAgLTAsMCArMSw1OTEgQEAKKy8qIEdQUlMgQlNTR1AgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gYXMgcGVyIDNHUFAgVFMgMDguMTggKi8KKworLyogKEMpIDIwMDktMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFRPRE86CisgKiAgbyAgcHJvcGVybHkgY291bnQgaW5jb21pbmcgQlZDLVJFU0VUIHBhY2tldHMgaW4gY291bnRlciBncm91cAorICogIG8gIHNldCBsb2cgY29udGV4dCBhcyBlYXJseSBhcyBwb3NzaWJsZSBmb3Igb3V0Z29pbmcgcGFja2V0cworICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3JhdGVfY3RyLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4X2dwcnMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfYnNzZ3AuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfbGxjLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX25zLmg+CisKK3ZvaWQgKmJzc2dwX3RhbGxfY3R4ID0gTlVMTDsKKworI2RlZmluZSBCVkNfRl9CTE9DS0VECTB4MDAwMQorCitlbnVtIGJzc2dwX2N0ciB7CisJQlNTR1BfQ1RSX1BLVFNfSU4sCisJQlNTR1BfQ1RSX1BLVFNfT1VULAorCUJTU0dQX0NUUl9CWVRFU19JTiwKKwlCU1NHUF9DVFJfQllURVNfT1VULAorCUJTU0dQX0NUUl9CTE9DS0VELAorCUJTU0dQX0NUUl9ESVNDQVJERUQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJhdGVfY3RyX2Rlc2MgYnNzZ3BfY3RyX2Rlc2NyaXB0aW9uW10gPSB7CisJeyAicGFja2V0cy5pbiIsCSJQYWNrZXRzIGF0IEJTU0dQIExldmVsICggSW4pIiB9LAorCXsgInBhY2tldHMub3V0IiwiUGFja2V0cyBhdCBCU1NHUCBMZXZlbCAoT3V0KSIgfSwKKwl7ICJieXRlcy5pbiIsCSJCeXRlcyBhdCBCU1NHUCBMZXZlbCAgICggSW4pIiB9LAorCXsgImJ5dGVzLm91dCIsCSJCeXRlcyBhdCBCU1NHUCBMZXZlbCAgIChPdXQpIiB9LAorCXsgImJsb2NrZWQiLAkiQlZDIEJsb2NraW5nIGNvdW50IiB9LAorCXsgImRpc2NhcmRlZCIsCSJCVkMgTExDIERpc2NhcmRlZCBjb3VudCIgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmF0ZV9jdHJfZ3JvdXBfZGVzYyBic3NncF9jdHJnX2Rlc2MgPSB7CisJLmdyb3VwX25hbWVfcHJlZml4ID0gImJzc2dwLmJzc19jdHgiLAorCS5ncm91cF9kZXNjcmlwdGlvbiA9ICJCU1NHUCBQZWVyIFN0YXRpc3RpY3MiLAorCS5udW1fY3RyID0gQVJSQVlfU0laRShic3NncF9jdHJfZGVzY3JpcHRpb24pLAorCS5jdHJfZGVzYyA9IGJzc2dwX2N0cl9kZXNjcmlwdGlvbiwKK307CisKK0xMSVNUX0hFQUQoYnNzZ3BfYnZjX2N0eHRzKTsKKworLyogRmluZCBhIEJUUyBDb250ZXh0IGJhc2VkIG9uIHBhcnNlZCBSQSBJRCBhbmQgQ2VsbCBJRCAqLworc3RydWN0IGJzc2dwX2J2Y19jdHggKmJ0c2N0eF9ieV9yYWlkX2NpZChjb25zdCBzdHJ1Y3QgZ3Byc19yYV9pZCAqcmFpZCwgdWludDE2X3QgY2lkKQoreworCXN0cnVjdCBic3NncF9idmNfY3R4ICpiY3R4OworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoYmN0eCwgJmJzc2dwX2J2Y19jdHh0cywgbGlzdCkgeworCQlpZiAoIW1lbWNtcCgmYmN0eC0+cmFfaWQsIHJhaWQsIHNpemVvZihiY3R4LT5yYV9pZCkpICYmCisJCSAgICBiY3R4LT5jZWxsX2lkID09IGNpZCkKKwkJCXJldHVybiBiY3R4OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogRmluZCBhIEJUUyBjb250ZXh0IGJhc2VkIG9uIEJWQ0krTlNFSSB0dXBsZSAqLworc3RydWN0IGJzc2dwX2J2Y19jdHggKmJ0c2N0eF9ieV9idmNpX25zZWkodWludDE2X3QgYnZjaSwgdWludDE2X3QgbnNlaSkKK3sKKwlzdHJ1Y3QgYnNzZ3BfYnZjX2N0eCAqYmN0eDsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGJjdHgsICZic3NncF9idmNfY3R4dHMsIGxpc3QpIHsKKwkJaWYgKGJjdHgtPm5zZWkgPT0gbnNlaSAmJiBiY3R4LT5idmNpID09IGJ2Y2kpCisJCQlyZXR1cm4gYmN0eDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBic3NncF9idmNfY3R4ICpidHNjdHhfYWxsb2ModWludDE2X3QgYnZjaSwgdWludDE2X3QgbnNlaSkKK3sKKwlzdHJ1Y3QgYnNzZ3BfYnZjX2N0eCAqY3R4OworCisJY3R4ID0gdGFsbG9jX3plcm8oYnNzZ3BfdGFsbF9jdHgsIHN0cnVjdCBic3NncF9idmNfY3R4KTsKKwlpZiAoIWN0eCkKKwkJcmV0dXJuIE5VTEw7CisJY3R4LT5idmNpID0gYnZjaTsKKwljdHgtPm5zZWkgPSBuc2VpOworCS8qIEZJWE1FOiBCVkNJIGlzIG5vdCB1bmlxdWUsIG9ubHkgQlZDSStOU0VJID8hPyAqLworCWN0eC0+Y3RyZyA9IHJhdGVfY3RyX2dyb3VwX2FsbG9jKGN0eCwgJmJzc2dwX2N0cmdfZGVzYywgYnZjaSk7CisKKwlsbGlzdF9hZGQoJmN0eC0+bGlzdCwgJmJzc2dwX2J2Y19jdHh0cyk7CisKKwlyZXR1cm4gY3R4OworfQorCisvKiBDaGFwdGVyIDEwLjQuNTogRmxvdyBDb250cm9sIEJWQyBBQ0sgKi8KK3N0YXRpYyBpbnQgYnNzZ3BfdHhfZmNfYnZjX2Fjayh1aW50MTZfdCBuc2VpLCB1aW50OF90IHRhZywgdWludDE2X3QgbnNfYnZjaSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gYnNzZ3BfbXNnYl9hbGxvYygpOworCXN0cnVjdCBic3NncF9ub3JtYWxfaGRyICpiZ3BoID0KKwkJCShzdHJ1Y3QgYnNzZ3Bfbm9ybWFsX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqYmdwaCkpOworCisJbXNnYl9uc2VpKG1zZykgPSBuc2VpOworCW1zZ2JfYnZjaShtc2cpID0gbnNfYnZjaTsKKworCWJncGgtPnBkdV90eXBlID0gQlNTR1BfUERVVF9GTE9XX0NPTlRST0xfQlZDX0FDSzsKKwltc2diX3R2bHZfcHV0KG1zZywgQlNTR1BfSUVfVEFHLCAxLCAmdGFnKTsKKworCXJldHVybiBncHJzX25zX3NlbmRtc2coYnNzZ3BfbnNpLCBtc2cpOworfQorCit1aW50MTZfdCBic3NncF9wYXJzZV9jZWxsX2lkKHN0cnVjdCBncHJzX3JhX2lkICpyYWlkLCBjb25zdCB1aW50OF90ICpidWYpCit7CisJLyogNiBvY3RldHMgUkFDICovCisJZ3NtNDhfcGFyc2VfcmEocmFpZCwgYnVmKTsKKwkvKiAyIG9jdGV0cyBDSUQgKi8KKwlyZXR1cm4gbnRvaHMoKih1aW50MTZfdCAqKSAoYnVmKzYpKTsKK30KKworLyogQ2hhcHRlciA4LjQgQlZDLVJlc2V0IFByb2NlZHVyZSAqLworc3RhdGljIGludCBic3NncF9yeF9idmNfcmVzZXQoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IHRsdl9wYXJzZWQgKnRwLAkKKwkJCSAgICAgIHVpbnQxNl90IG5zX2J2Y2kpCit7CisJc3RydWN0IGJzc2dwX2J2Y19jdHggKmJjdHg7CisJdWludDE2X3QgbnNlaSA9IG1zZ2JfbnNlaShtc2cpOworCXVpbnQxNl90IGJ2Y2k7CisJaW50IHJjOworCisJYnZjaSA9IG50b2hzKCoodWludDE2X3QgKilUTFZQX1ZBTCh0cCwgQlNTR1BfSUVfQlZDSSkpOworCURFQlVHUEMoREJTU0dQLCAiQlZDST0ldSBSRVNFVCBjYXVzZT0lc1xuIiwgYnZjaSwKKwkJYnNzZ3BfY2F1c2Vfc3RyKCpUTFZQX1ZBTCh0cCwgQlNTR1BfSUVfQ0FVU0UpKSk7CisKKwkvKiBsb29rLXVwIG9yIGNyZWF0ZSB0aGUgQlRTIGNvbnRleHQgZm9yIHRoaXMgQlZDICovCisJYmN0eCA9IGJ0c2N0eF9ieV9idmNpX25zZWkoYnZjaSwgbnNlaSk7CisJaWYgKCFiY3R4KQorCQliY3R4ID0gYnRzY3R4X2FsbG9jKGJ2Y2ksIG5zZWkpOworCisJLyogQXMgb3Bwb3NlZCB0byBOUy1WQ3MsIEJWQ3MgYXJlIE5PVCBibG9ja2VkIGFmdGVyIFJFU0VUICovCisJYmN0eC0+c3RhdGUgJj0gfkJWQ19TX0JMT0NLRUQ7CisKKwkvKiBXaGVuIHdlIHJlY2VpdmUgYSBCVkMtUkVTRVQgUERVIChhdCBsZWFzdCBvZiBhIFBUUCBCVkNJKSwgdGhlIEJTUworCSAqIGluZm9ybXMgdXMgYWJvdXQgaXRzIFJBQyArIENlbGwgSUQsIHNvIHdlIGNhbiBjcmVhdGUgYSBtYXBwaW5nICovCisJaWYgKGJ2Y2kgIT0gMCAmJiBidmNpICE9IDEpIHsKKwkJaWYgKCFUTFZQX1BSRVNFTlQodHAsIEJTU0dQX0lFX0NFTExfSUQpKSB7CisJCQlMT0dQKERCU1NHUCwgTE9HTF9FUlJPUiwgIkJTU0dQIFJFU0VUIEJWQ0k9JXUgIgorCQkJCSJtaXNzaW5nIG1hbmRhdG9yeSBJRVxuIiwgYnZjaSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkvKiBhY3R1YWxseSBleHRyYWN0IFJBQyAvIENJRCAqLworCQliY3R4LT5jZWxsX2lkID0gYnNzZ3BfcGFyc2VfY2VsbF9pZCgmYmN0eC0+cmFfaWQsCisJCQkJCQlUTFZQX1ZBTCh0cCwgQlNTR1BfSUVfQ0VMTF9JRCkpOworCQlMT0dQKERCU1NHUCwgTE9HTF9OT1RJQ0UsICJDZWxsICV1LSV1LSV1LSV1IENJICV1IG9uIEJWQ0kgJXVcbiIsCisJCQliY3R4LT5yYV9pZC5tY2MsIGJjdHgtPnJhX2lkLm1uYywgYmN0eC0+cmFfaWQubGFjLAorCQkJYmN0eC0+cmFfaWQucmFjLCBiY3R4LT5jZWxsX2lkLCBidmNpKTsKKwl9CisKKwkvKiBBY2tub3dsZWRnZSB0aGUgUkVTRVQgdG8gdGhlIEJUUyAqLworCXJjID0gYnNzZ3BfdHhfc2ltcGxlX2J2Y2koQlNTR1BfUERVVF9CVkNfUkVTRVRfQUNLLAorCQkJCSAgbnNlaSwgYnZjaSwgbnNfYnZjaSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnNzZ3BfcnhfYnZjX2Jsb2NrKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCB0bHZfcGFyc2VkICp0cCkKK3sKKwl1aW50MTZfdCBidmNpOworCXN0cnVjdCBic3NncF9idmNfY3R4ICpwdHBfY3R4OworCisJYnZjaSA9IG50b2hzKCoodWludDE2X3QgKilUTFZQX1ZBTCh0cCwgQlNTR1BfSUVfQlZDSSkpOworCWlmIChidmNpID09IEJWQ0lfU0lHTkFMTElORykgeworCQkvKiA4LjMuMjogU2lnbmFsbGluZyBCVkMgc2hhbGwgbmV2ZXIgYmUgYmxvY2tlZCAqLworCQlMT0dQKERCU1NHUCwgTE9HTF9FUlJPUiwgIk5TRUk9JXUvQlZDST0ldSAiCisJCQkicmVjZWl2ZWQgYmxvY2sgZm9yIHNpZ25hbGxpbmcgQlZDIT8hXG4iLAorCQkJbXNnYl9uc2VpKG1zZyksIG1zZ2JfYnZjaShtc2cpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJTE9HUChEQlNTR1AsIExPR0xfSU5GTywgIkJWQ0k9JXUgQlZDLUJMT0NLXG4iLCBidmNpKTsKKworCXB0cF9jdHggPSBidHNjdHhfYnlfYnZjaV9uc2VpKGJ2Y2ksIG1zZ2JfbnNlaShtc2cpKTsKKwlpZiAoIXB0cF9jdHgpCisJCXJldHVybiBic3NncF90eF9zdGF0dXMoQlNTR1BfQ0FVU0VfVU5LTk9XTl9CVkNJLCAmYnZjaSwgbXNnKTsKKworCXB0cF9jdHgtPnN0YXRlIHw9IEJWQ19TX0JMT0NLRUQ7CisJcmF0ZV9jdHJfaW5jKCZwdHBfY3R4LT5jdHJnLT5jdHJbQlNTR1BfQ1RSX0JMT0NLRURdKTsKKworCS8qIEZJWE1FOiBTZW5kIE5NX0JWQ19CTE9DSy5pbmQgdG8gTk0gKi8KKworCS8qIFdlIGFsd2F5cyBhY2tub3dsZWRnZSB0aGUgQkxPQ0tpbmcgKi8KKwlyZXR1cm4gYnNzZ3BfdHhfc2ltcGxlX2J2Y2koQlNTR1BfUERVVF9CVkNfQkxPQ0tfQUNLLCBtc2diX25zZWkobXNnKSwKKwkJCQkgICAgYnZjaSwgbXNnYl9idmNpKG1zZykpOworfTsKKworc3RhdGljIGludCBic3NncF9yeF9idmNfdW5ibG9jayhzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgdGx2X3BhcnNlZCAqdHApCit7CisJdWludDE2X3QgYnZjaTsKKwlzdHJ1Y3QgYnNzZ3BfYnZjX2N0eCAqcHRwX2N0eDsKKworCWJ2Y2kgPSBudG9ocygqKHVpbnQxNl90ICopVExWUF9WQUwodHAsIEJTU0dQX0lFX0JWQ0kpKTsKKwlpZiAoYnZjaSA9PSBCVkNJX1NJR05BTExJTkcpIHsKKwkJLyogOC4zLjI6IFNpZ25hbGxpbmcgQlZDIHNoYWxsIG5ldmVyIGJlIGJsb2NrZWQgKi8KKwkJTE9HUChEQlNTR1AsIExPR0xfRVJST1IsICJOU0VJPSV1L0JWQ0k9JXUgIgorCQkJInJlY2VpdmVkIHVuYmxvY2sgZm9yIHNpZ25hbGxpbmcgQlZDIT8hXG4iLAorCQkJbXNnYl9uc2VpKG1zZyksIG1zZ2JfYnZjaShtc2cpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJREVCVUdQKERCU1NHUCwgIkJWQ0k9JXUgQlZDLVVOQkxPQ0tcbiIsIGJ2Y2kpOworCisJcHRwX2N0eCA9IGJ0c2N0eF9ieV9idmNpX25zZWkoYnZjaSwgbXNnYl9uc2VpKG1zZykpOworCWlmICghcHRwX2N0eCkKKwkJcmV0dXJuIGJzc2dwX3R4X3N0YXR1cyhCU1NHUF9DQVVTRV9VTktOT1dOX0JWQ0ksICZidmNpLCBtc2cpOworCisJcHRwX2N0eC0+c3RhdGUgJj0gfkJWQ19TX0JMT0NLRUQ7CisKKwkvKiBGSVhNRTogU2VuZCBOTV9CVkNfVU5CTE9DSy5pbmQgdG8gTk0gKi8KKworCS8qIFdlIGFsd2F5cyBhY2tub3dsZWRnZSB0aGUgdW5CTE9DS2luZyAqLworCXJldHVybiBic3NncF90eF9zaW1wbGVfYnZjaShCU1NHUF9QRFVUX0JWQ19VTkJMT0NLX0FDSywgbXNnYl9uc2VpKG1zZyksCisJCQkJICAgIGJ2Y2ksIG1zZ2JfYnZjaShtc2cpKTsKK307CisKKy8qIFVwbGluayB1bml0LWRhdGEgKi8KK3N0YXRpYyBpbnQgYnNzZ3BfcnhfdWxfdWQoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IHRsdl9wYXJzZWQgKnRwLAorCQkJICBzdHJ1Y3QgYnNzZ3BfYnZjX2N0eCAqY3R4KQoreworCXN0cnVjdCBic3NncF91ZF9oZHIgKmJ1ZGggPSAoc3RydWN0IGJzc2dwX3VkX2hkciAqKSBtc2diX2Jzc2dwaChtc2cpOworCisJREVCVUdQKERCU1NHUCwgIkJTU0dQIFVMLVVEXG4iKTsKKworCS8qIGV4dHJhY3QgVExMSSBhbmQgcGFyc2UgVExWIElFcyAqLworCW1zZ2JfdGxsaShtc2cpID0gbnRvaGwoYnVkaC0+dGxsaSk7CisKKwkvKiBDZWxsIElEIGFuZCBMTENfUERVIGFyZSB0aGUgb25seSBtYW5kYXRvcnkgSUUgKi8KKwlpZiAoIVRMVlBfUFJFU0VOVCh0cCwgQlNTR1BfSUVfQ0VMTF9JRCkgfHwKKwkgICAgIVRMVlBfUFJFU0VOVCh0cCwgQlNTR1BfSUVfTExDX1BEVSkpCisJCXJldHVybiBic3NncF90eF9zdGF0dXMoQlNTR1BfQ0FVU0VfTUlTU0lOR19NQU5EX0lFLCBOVUxMLCBtc2cpOworCisJLyogc3RvcmUgcG9pbnRlciB0byBMTEMgaGVhZGVyIGFuZCBDRUxMIElEIGluIG1zZ2ItPmNiICovCisJbXNnYl9sbGNoKG1zZykgPSAodWludDhfdCAqKSBUTFZQX1ZBTCh0cCwgQlNTR1BfSUVfTExDX1BEVSk7CisJbXNnYl9iY2lkKG1zZykgPSAodWludDhfdCAqKSBUTFZQX1ZBTCh0cCwgQlNTR1BfSUVfQ0VMTF9JRCk7CisKKwlyZXR1cm4gZ3Byc19sbGNfcmN2bXNnKG1zZywgdHApOworfQorCitzdGF0aWMgaW50IGJzc2dwX3J4X3N1c3BlbmQoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IHRsdl9wYXJzZWQgKnRwLAorCQkJICAgIHN0cnVjdCBic3NncF9idmNfY3R4ICpjdHgpCit7CisJc3RydWN0IGJzc2dwX25vcm1hbF9oZHIgKmJncGggPQorCQkJKHN0cnVjdCBic3NncF9ub3JtYWxfaGRyICopIG1zZ2JfYnNzZ3BoKG1zZyk7CisKKwlERUJVR1AoREJTU0dQLCAiQlNTR1AgU1VTUEVORFxuIik7CisKKwlpZiAoIVRMVlBfUFJFU0VOVCh0cCwgQlNTR1BfSUVfVExMSSkgfHwKKwkgICAgIVRMVlBfUFJFU0VOVCh0cCwgQlNTR1BfSUVfUk9VVEVJTkdfQVJFQSkpCisJCXJldHVybiBic3NncF90eF9zdGF0dXMoQlNTR1BfQ0FVU0VfTUlTU0lOR19NQU5EX0lFLCBOVUxMLCBtc2cpOworCisJLyogRklYTUU6IHBhc3MgdGhlIFNVU1BFTkQgcmVxdWVzdCB0byBHTU0gKi8KKwkvKiBTRU5EIFNVU1BFTkRfQUNLIG9yIFNVU1BFTkRfTkFDSyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJzc2dwX3J4X3Jlc3VtZShzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgdGx2X3BhcnNlZCAqdHAsCisJCQkgICBzdHJ1Y3QgYnNzZ3BfYnZjX2N0eCAqY3R4KQoreworCXN0cnVjdCBic3NncF9ub3JtYWxfaGRyICpiZ3BoID0KKwkJCShzdHJ1Y3QgYnNzZ3Bfbm9ybWFsX2hkciAqKSBtc2diX2Jzc2dwaChtc2cpOworCisJREVCVUdQKERCU1NHUCwgIkJTU0dQIFJFU1VNRVxuIik7CisKKwlpZiAoIVRMVlBfUFJFU0VOVCh0cCwgQlNTR1BfSUVfVExMSSkgfHwKKwkgICAgIVRMVlBfUFJFU0VOVCh0cCwgQlNTR1BfSUVfUk9VVEVJTkdfQVJFQSkgfHwKKwkgICAgIVRMVlBfUFJFU0VOVCh0cCwgQlNTR1BfSUVfU1VTUEVORF9SRUZfTlIpKQorCQlyZXR1cm4gYnNzZ3BfdHhfc3RhdHVzKEJTU0dQX0NBVVNFX01JU1NJTkdfTUFORF9JRSwgTlVMTCwgbXNnKTsKKworCS8qIEZJWE1FOiBwYXNzIHRoZSBSRVNVTUUgcmVxdWVzdCB0byBHTU0gKi8KKwkvKiBTRU5EIFJFU1VNRV9BQ0sgb3IgUkVTVU1FX05BQ0sgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBic3NncF9yeF9mY19idmMoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IHRsdl9wYXJzZWQgKnRwLAorCQkJICAgc3RydWN0IGJzc2dwX2J2Y19jdHggKmJjdHgpCit7CisKKwlERUJVR1AoREJTU0dQLCAiQlNTR1AgRkMgQlZDXG4iKTsKKworCWlmICghVExWUF9QUkVTRU5UKHRwLCBCU1NHUF9JRV9UQUcpIHx8CisJICAgICFUTFZQX1BSRVNFTlQodHAsIEJTU0dQX0lFX0JWQ19CVUNLRVRfU0laRSkgfHwKKwkgICAgIVRMVlBfUFJFU0VOVCh0cCwgQlNTR1BfSUVfQlVDS0VUX0xFQUtfUkFURSkgfHwKKwkgICAgIVRMVlBfUFJFU0VOVCh0cCwgQlNTR1BfSUVfQk1BWF9ERUZBVUxUX01TKSB8fAorCSAgICAhVExWUF9QUkVTRU5UKHRwLCBCU1NHUF9JRV9SX0RFRkFVTFRfTVMpKQorCQlyZXR1cm4gYnNzZ3BfdHhfc3RhdHVzKEJTU0dQX0NBVVNFX01JU1NJTkdfTUFORF9JRSwgTlVMTCwgbXNnKTsKKworCS8qIEZJWE1FOiBhY3R1YWxseSBpbXBsZW1lbnQgZmxvdyBjb250cm9sICovCisKKwkvKiBTZW5kIEZMT1dfQ09OVFJPTF9CVkNfQUNLICovCisJcmV0dXJuIGJzc2dwX3R4X2ZjX2J2Y19hY2sobXNnYl9uc2VpKG1zZyksICpUTFZQX1ZBTCh0cCwgQlNTR1BfSUVfVEFHKSwKKwkJCQkgICBtc2diX2J2Y2kobXNnKSk7Cit9CisKKy8qIFJlY2VpdmUgYSBCU1NHUCBQRFUgZnJvbSBhIEJTUyBvbiBhIFBUUCBCVkNJICovCitzdGF0aWMgaW50IGdwcnNfYnNzZ3BfcnhfcHRwKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCB0bHZfcGFyc2VkICp0cCwKKwkJCSAgICAgc3RydWN0IGJzc2dwX2J2Y19jdHggKmJjdHgpCit7CisJc3RydWN0IGJzc2dwX25vcm1hbF9oZHIgKmJncGggPQorCQkJKHN0cnVjdCBic3NncF9ub3JtYWxfaGRyICopIG1zZ2JfYnNzZ3BoKG1zZyk7CisJdWludDhfdCBwZHVfdHlwZSA9IGJncGgtPnBkdV90eXBlOworCWludCByYyA9IDA7CisKKwkvKiBJZiB0cmFmZmljIGlzIHJlY2VpdmVkIG9uIGEgQlZDIHRoYXQgaXMgbWFya2VkIGFzIGJsb2NrZWQsIHRoZQorCSAqIHJlY2VpdmVkIFBEVSBzaGFsbCBub3QgYmUgYWNjZXB0ZWQgYW5kIGEgU1RBVFVTIFBEVSAoQ2F1c2UgdmFsdWU6CisJICogQlZDIEJsb2NrZWQpIHNoYWxsIGJlIHNlbnQgdG8gdGhlIHBlZXIgZW50aXR5IG9uIHRoZSBzaWduYWxsaW5nIEJWQyAqLworCWlmIChiY3R4LT5zdGF0ZSAmIEJWQ19TX0JMT0NLRUQgJiYgcGR1X3R5cGUgIT0gQlNTR1BfUERVVF9TVEFUVVMpIHsKKwkJdWludDE2X3QgYnZjaSA9IG1zZ2JfYnZjaShtc2cpOworCQlyZXR1cm4gYnNzZ3BfdHhfc3RhdHVzKEJTU0dQX0NBVVNFX0JWQ0lfQkxPQ0tFRCwgJmJ2Y2ksIG1zZyk7CisJfQorCisJc3dpdGNoIChwZHVfdHlwZSkgeworCWNhc2UgQlNTR1BfUERVVF9VTF9VTklUREFUQToKKwkJLyogc29tZSBMTEMgZGF0YSBmcm9tIHRoZSBNUyAqLworCQlyYyA9IGJzc2dwX3J4X3VsX3VkKG1zZywgdHAsIGJjdHgpOworCQlicmVhazsKKwljYXNlIEJTU0dQX1BEVVRfUkFfQ0FQQUJJTElUWToKKwkJLyogQlNTIHJlcXVlc3RzIFJBIGNhcGFiaWxpdHkgb3IgSU1TSSAqLworCQlERUJVR1AoREJTU0dQLCAiQlNTR1AgUkEgQ0FQQUJJTElUWSBVUERBVEVcbiIpOworCQkvKiBGSVhNRTogc2VuZCBHTU1fUkFfQ0FQQUJJTElUWV9VUERBVEUuaW5kIHRvIEdNTSAqLworCQkvKiBGSVhNRTogc2VuZCBSQV9DQVBBX1VQREFURV9BQ0sgKi8KKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QRFVUX1JBRElPX1NUQVRVUzoKKwkJREVCVUdQKERCU1NHUCwgIkJTU0dQIFJBRElPIFNUQVRVU1xuIik7CisJCS8qIEJTUyBpbmZvcm1zIHVzIG9mIHNvbWUgZXhjZXB0aW9uICovCisJCS8qIEZJWE1FOiBzZW5kIEdNTV9SQURJT19TVEFUVVMuaW5kIHRvIEdNTSAqLworCQlicmVhazsKKwljYXNlIEJTU0dQX1BEVVRfRkxPV19DT05UUk9MX0JWQzoKKwkJLyogQlNTIGluZm9ybXMgdXMgb2YgYXZhaWxhYmxlIGJhbmR3aWR0aCBpbiBHYiBpbnRlcmZhY2UgKi8KKwkJcmMgPSBic3NncF9yeF9mY19idmMobXNnLCB0cCwgYmN0eCk7CisJCWJyZWFrOworCWNhc2UgQlNTR1BfUERVVF9GTE9XX0NPTlRST0xfTVM6CisJCS8qIEJTUyBpbmZvcm1zIHVzIG9mIGF2YWlsYWJsZSBiYW5kd2lkdGggdG8gb25lIE1TICovCisJCURFQlVHUChEQlNTR1AsICJCU1NHUCBGQyBNU1xuIik7CisJCS8qIEZJWE1FOiBhY3R1YWxseSBpbXBsZW1lbnQgZmxvdyBjb250cm9sICovCisJCS8qIEZJWE1FOiBTZW5kIEZMT1dfQ09OVFJPTF9NU19BQ0sgKi8KKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QRFVUX1NUQVRVUzoKKwkJLyogU29tZSBleGNlcHRpb24gaGFzIG9jY3VycmVkICovCisJCS8qIEZJWE1FOiBzZW5kIE5NX1NUQVRVUy5pbmQgdG8gTk0gKi8KKwljYXNlIEJTU0dQX1BEVVRfRE9XTkxPQURfQlNTX1BGQzoKKwljYXNlIEJTU0dQX1BEVVRfQ1JFQVRFX0JTU19QRkNfQUNLOgorCWNhc2UgQlNTR1BfUERVVF9DUkVBVEVfQlNTX1BGQ19OQUNLOgorCWNhc2UgQlNTR1BfUERVVF9NT0RJRllfQlNTX1BGQzoKKwljYXNlIEJTU0dQX1BEVVRfREVMRVRFX0JTU19QRkNfQUNLOgorCQlERUJVR1AoREJTU0dQLCAiQlNTR1AgUERVIHR5cGUgMHglMDJ4IG5vdCBbeWV0XSBpbXBsZW1lbnRlZFxuIiwKKwkJCXBkdV90eXBlKTsKKwkJcmMgPSBic3NncF90eF9zdGF0dXMoQlNTR1BfQ0FVU0VfUERVX0lOQ09NUF9GRUFULCBOVUxMLCBtc2cpOworCQlicmVhazsKKwkvKiB0aG9zZSBvbmx5IGV4aXN0IGluIHRoZSBTR1NOIC0+IEJTUyBkaXJlY3Rpb24gKi8KKwljYXNlIEJTU0dQX1BEVVRfRExfVU5JVERBVEE6CisJY2FzZSBCU1NHUF9QRFVUX1BBR0lOR19QUzoKKwljYXNlIEJTU0dQX1BEVVRfUEFHSU5HX0NTOgorCWNhc2UgQlNTR1BfUERVVF9SQV9DQVBBX1VQREFURV9BQ0s6CisJY2FzZSBCU1NHUF9QRFVUX0ZMT1dfQ09OVFJPTF9CVkNfQUNLOgorCWNhc2UgQlNTR1BfUERVVF9GTE9XX0NPTlRST0xfTVNfQUNLOgorCQlERUJVR1AoREJTU0dQLCAiQlNTR1AgUERVIHR5cGUgMHglMDJ4IG9ubHkgZXhpc3RzIGluIERMXG4iLAorCQkJcGR1X3R5cGUpOworCQlic3NncF90eF9zdGF0dXMoQlNTR1BfQ0FVU0VfUFJPVE9fRVJSX1VOU1BFQywgTlVMTCwgbXNnKTsKKwkJcmMgPSAtRUlOVkFMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1AoREJTU0dQLCAiQlNTR1AgUERVIHR5cGUgMHglMDJ4IHVua25vd25cbiIsIHBkdV90eXBlKTsKKwkJcmMgPSBic3NncF90eF9zdGF0dXMoQlNTR1BfQ0FVU0VfUFJPVE9fRVJSX1VOU1BFQywgTlVMTCwgbXNnKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKiBSZWNlaXZlIGEgQlNTR1AgUERVIGZyb20gYSBCU1Mgb24gYSBTSUdOQUxMSU5HIEJWQ0kgKi8KK3N0YXRpYyBpbnQgZ3Byc19ic3NncF9yeF9zaWduKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCB0bHZfcGFyc2VkICp0cCwKKwkJCQlzdHJ1Y3QgYnNzZ3BfYnZjX2N0eCAqYmN0eCkKK3sKKwlzdHJ1Y3QgYnNzZ3Bfbm9ybWFsX2hkciAqYmdwaCA9CisJCQkoc3RydWN0IGJzc2dwX25vcm1hbF9oZHIgKikgbXNnYl9ic3NncGgobXNnKTsKKwl1aW50OF90IHBkdV90eXBlID0gYmdwaC0+cGR1X3R5cGU7CisJaW50IHJjID0gMDsKKwl1aW50MTZfdCBuc19idmNpID0gbXNnYl9idmNpKG1zZyk7CisJdWludDE2X3QgYnZjaTsKKworCXN3aXRjaCAoYmdwaC0+cGR1X3R5cGUpIHsKKwljYXNlIEJTU0dQX1BEVVRfU1VTUEVORDoKKwkJLyogTVMgd2FudHMgdG8gc3VzcGVuZCAqLworCQlyYyA9IGJzc2dwX3J4X3N1c3BlbmQobXNnLCB0cCwgYmN0eCk7CisJCWJyZWFrOworCWNhc2UgQlNTR1BfUERVVF9SRVNVTUU6CisJCS8qIE1TIHdhbnRzIHRvIHJlc3VtZSAqLworCQlyYyA9IGJzc2dwX3J4X3Jlc3VtZShtc2csIHRwLCBiY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QRFVUX0ZMVVNIX0xMX0FDSzoKKwkJLyogQlNTIGluZm9ybXMgdXMgaXQgaGFzIHBlcmZvcm1lZCBMTCBGTFVTSCAqLworCQlERUJVR1AoREJTU0dQLCAiQlNTR1AgRkxVU0ggTExcbiIpOworCQkvKiBGSVhNRTogc2VuZCBOTV9GTFVTSF9MTC5yZXMgdG8gTk0gKi8KKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QRFVUX0xMQ19ESVNDQVJEOgorCQkvKiBCU1MgaW5mb3JtcyB0aGF0IHNvbWUgTExDIFBEVSdzIGhhdmUgYmVlbiBkaXNjYXJkZWQgKi8KKwkJcmF0ZV9jdHJfaW5jKCZiY3R4LT5jdHJnLT5jdHJbQlNTR1BfQ1RSX0RJU0NBUkRFRF0pOworCQlERUJVR1AoREJTU0dQLCAiQlNTR1AgTExDIERJU0NBUkRFRFxuIik7CisJCS8qIEZJWE1FOiBzZW5kIE5NX0xMQ19ESVNDQVJERUQgdG8gTk0gKi8KKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QRFVUX0JWQ19CTE9DSzoKKwkJLyogQlNTIHRlbGxzIHVzIHRoYXQgQlZDIHNoYWxsIGJlIGJsb2NrZWQgKi8KKwkJREVCVUdQKERCU1NHUCwgIkJTU0dQIEJWQyBCTE9DSyAiKTsKKwkJaWYgKCFUTFZQX1BSRVNFTlQodHAsIEJTU0dQX0lFX0JWQ0kpIHx8CisJCSAgICAhVExWUF9QUkVTRU5UKHRwLCBCU1NHUF9JRV9DQVVTRSkpCisJCQlnb3RvIGVycl9tYW5kX2llOworCQlyYyA9IGJzc2dwX3J4X2J2Y191bmJsb2NrKG1zZywgdHApOworCQlicmVhazsKKwljYXNlIEJTU0dQX1BEVVRfQlZDX1VOQkxPQ0s6CisJCS8qIEJTUyB0ZWxscyB1cyB0aGF0IEJWQyBzaGFsbCBiZSB1bmJsb2NrZWQgKi8KKwkJaWYgKCFUTFZQX1BSRVNFTlQodHAsIEJTU0dQX0lFX0JWQ0kpKQorCQkJZ290byBlcnJfbWFuZF9pZTsKKwkJcmMgPSBic3NncF9yeF9idmNfdW5ibG9jayhtc2csIHRwKTsKKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QRFVUX0JWQ19SRVNFVDoKKwkJLyogQlNTIHRlbGxzIHVzIHRoYXQgQlZDIGluaXQgaXMgcmVxdWlyZWQgKi8KKwkJREVCVUdQKERCU1NHUCwgIkJTU0dQIEJWQyBSRVNFVCAiKTsKKwkJaWYgKCFUTFZQX1BSRVNFTlQodHAsIEJTU0dQX0lFX0JWQ0kpIHx8CisJCSAgICAhVExWUF9QUkVTRU5UKHRwLCBCU1NHUF9JRV9DQVVTRSkpCisJCQlnb3RvIGVycl9tYW5kX2llOworCQlyYyA9IGJzc2dwX3J4X2J2Y19yZXNldChtc2csIHRwLCBuc19idmNpKTsKKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QRFVUX1NUQVRVUzoKKwkJLyogU29tZSBleGNlcHRpb24gaGFzIG9jY3VycmVkICovCisJCS8qIEZJWE1FOiBzZW5kIE5NX1NUQVRVUy5pbmQgdG8gTk0gKi8KKwkJYnJlYWs7CisJLyogdGhvc2Ugb25seSBleGlzdCBpbiB0aGUgU0dTTiAtPiBCU1MgZGlyZWN0aW9uICovCisJY2FzZSBCU1NHUF9QRFVUX1BBR0lOR19QUzoKKwljYXNlIEJTU0dQX1BEVVRfUEFHSU5HX0NTOgorCWNhc2UgQlNTR1BfUERVVF9TVVNQRU5EX0FDSzoKKwljYXNlIEJTU0dQX1BEVVRfU1VTUEVORF9OQUNLOgorCWNhc2UgQlNTR1BfUERVVF9SRVNVTUVfQUNLOgorCWNhc2UgQlNTR1BfUERVVF9SRVNVTUVfTkFDSzoKKwljYXNlIEJTU0dQX1BEVVRfRkxVU0hfTEw6CisJY2FzZSBCU1NHUF9QRFVUX0JWQ19CTE9DS19BQ0s6CisJY2FzZSBCU1NHUF9QRFVUX0JWQ19VTkJMT0NLX0FDSzoKKwljYXNlIEJTU0dQX1BEVVRfU0dTTl9JTlZPS0VfVFJBQ0U6CisJCURFQlVHUChEQlNTR1AsICJCU1NHUCBQRFUgdHlwZSAweCUwMnggb25seSBleGlzdHMgaW4gRExcbiIsCisJCQlwZHVfdHlwZSk7CisJCWJzc2dwX3R4X3N0YXR1cyhCU1NHUF9DQVVTRV9QUk9UT19FUlJfVU5TUEVDLCBOVUxMLCBtc2cpOworCQlyYyA9IC1FSU5WQUw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUChEQlNTR1AsICJCU1NHUCBQRFUgdHlwZSAweCUwMnggdW5rbm93blxuIiwgcGR1X3R5cGUpOworCQlyYyA9IGJzc2dwX3R4X3N0YXR1cyhCU1NHUF9DQVVTRV9QUk9UT19FUlJfVU5TUEVDLCBOVUxMLCBtc2cpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7CitlcnJfbWFuZF9pZToKKwlyZXR1cm4gYnNzZ3BfdHhfc3RhdHVzKEJTU0dQX0NBVVNFX01JU1NJTkdfTUFORF9JRSwgTlVMTCwgbXNnKTsKK30KKworLyogV2UgZXhwZWN0IG1zZ2JfYnNzZ3BoKCkgdG8gcG9pbnQgdG8gdGhlIEJTU0dQIGhlYWRlciAqLworaW50IGdwcnNfYnNzZ3BfcmN2bXNnKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGJzc2dwX25vcm1hbF9oZHIgKmJncGggPQorCQkJKHN0cnVjdCBic3NncF9ub3JtYWxfaGRyICopIG1zZ2JfYnNzZ3BoKG1zZyk7CisJc3RydWN0IGJzc2dwX3VkX2hkciAqYnVkaCA9IChzdHJ1Y3QgYnNzZ3BfdWRfaGRyICopIG1zZ2JfYnNzZ3BoKG1zZyk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJc3RydWN0IGJzc2dwX2J2Y19jdHggKmJjdHg7CisJdWludDhfdCBwZHVfdHlwZSA9IGJncGgtPnBkdV90eXBlOworCXVpbnQxNl90IG5zX2J2Y2kgPSBtc2diX2J2Y2kobXNnKTsKKwlpbnQgZGF0YV9sZW47CisJaW50IHJjID0gMDsKKworCS8qIElkZW50aWZpZXJzIGZyb20gRE9XTjogTlNFSSwgQlZDSSAoYm90aCBpbiBtc2ctPmNiKSAqLworCisJLyogVU5JVERBVEEgQlNTR1AgaGVhZGVycyBoYXZlIFRMTEkgaW4gZnJvbnQgKi8KKwlpZiAocGR1X3R5cGUgIT0gQlNTR1BfUERVVF9VTF9VTklUREFUQSAmJgorCSAgICBwZHVfdHlwZSAhPSBCU1NHUF9QRFVUX0RMX1VOSVREQVRBKSB7CisJCWRhdGFfbGVuID0gbXNnYl9ic3NncF9sZW4obXNnKSAtIHNpemVvZigqYmdwaCk7CisJCXJjID0gYnNzZ3BfdGx2X3BhcnNlKCZ0cCwgYmdwaC0+ZGF0YSwgZGF0YV9sZW4pOworCX0gZWxzZSB7CisJCWRhdGFfbGVuID0gbXNnYl9ic3NncF9sZW4obXNnKSAtIHNpemVvZigqYnVkaCk7CisJCXJjID0gYnNzZ3BfdGx2X3BhcnNlKCZ0cCwgYnVkaC0+ZGF0YSwgZGF0YV9sZW4pOworCX0KKworCS8qIGxvb2stdXAgb3IgY3JlYXRlIHRoZSBCVFMgY29udGV4dCBmb3IgdGhpcyBCVkMgKi8KKwliY3R4ID0gYnRzY3R4X2J5X2J2Y2lfbnNlaShuc19idmNpLCBtc2diX25zZWkobXNnKSk7CisJLyogT25seSBhIFJFU0VUIFBEVSBjYW4gY3JlYXRlIGEgbmV3IEJWQyBjb250ZXh0ICovCisJaWYgKCFiY3R4ICYmIHBkdV90eXBlICE9IEJTU0dQX1BEVVRfQlZDX1JFU0VUKSB7CisJCUxPR1AoREJTU0dQLCBMT0dMX05PVElDRSwgIk5TRUk9JXUvQlZDST0ldSBSZWplY3RpbmcgUERVICIKKwkJCSJ0eXBlICV1IGZvciB1bmtub3duIEJWQ0lcbiIsIG1zZ2JfbnNlaShtc2cpLCBuc19idmNpLAorCQkJcGR1X3R5cGUpOworCQlyZXR1cm4gYnNzZ3BfdHhfc3RhdHVzKEJTU0dQX0NBVVNFX1VOS05PV05fQlZDSSwgTlVMTCwgbXNnKTsKKwl9CisKKwlpZiAoYmN0eCkgeworCQlsb2dfc2V0X2NvbnRleHQoQlNDX0NUWF9CVkMsIGJjdHgpOworCQlyYXRlX2N0cl9pbmMoJmJjdHgtPmN0cmctPmN0cltCU1NHUF9DVFJfUEtUU19JTl0pOworCQlyYXRlX2N0cl9hZGQoJmJjdHgtPmN0cmctPmN0cltCU1NHUF9DVFJfQllURVNfSU5dLAorCQkJICAgICBtc2diX2Jzc2dwX2xlbihtc2cpKTsKKwl9CisKKwlpZiAobnNfYnZjaSA9PSBCVkNJX1NJR05BTExJTkcpCisJCXJjID0gZ3Byc19ic3NncF9yeF9zaWduKG1zZywgJnRwLCBiY3R4KTsKKwllbHNlIGlmIChuc19idmNpID09IEJWQ0lfUFRNKQorCQlyYyA9IGJzc2dwX3R4X3N0YXR1cyhCU1NHUF9DQVVTRV9QRFVfSU5DT01QX0ZFQVQsIE5VTEwsIG1zZyk7CisJZWxzZQorCQlyYyA9IGdwcnNfYnNzZ3BfcnhfcHRwKG1zZywgJnRwLCBiY3R4KTsKKworCXJldHVybiByYzsKK30KKworLyogRW50cnkgZnVuY3Rpb24gZnJvbSB1cHBlciBsZXZlbCAoTExDKSwgYXNraW5nIHVzIHRvIHRyYW5zbWl0IGEgQlNTR1AgUERVCisgKiB0byBhIHJlbW90ZSBNUyAoaWRlbnRpZmllZCBieSBUTExJKSBhdCBhIEJUUyBpZGVudGlmaWVkIGJ5IGl0cyBCVkNJIGFuZCBOU0VJICovCitpbnQgZ3Byc19ic3NncF90eF9kbF91ZChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBic3NncF9idmNfY3R4ICpiY3R4OworCXN0cnVjdCBic3NncF91ZF9oZHIgKmJ1ZGg7CisJdWludDhfdCBsbGNfcGR1X3Rsdl9oZHJfbGVuID0gMjsKKwl1aW50OF90ICpsbGNfcGR1X3RsdiwgKnFvc19wcm9maWxlOworCXVpbnQxNl90IHBkdV9saWZldGltZSA9IDEwMDA7IC8qIGNlbnRpLXNlY29uZHMgKi8KKwl1aW50OF90IHFvc19wcm9maWxlX2RlZmF1bHRbM10gPSB7IDB4MDAsIDB4MDAsIDB4MjEgfTsKKwl1aW50MTZfdCBtc2dfbGVuID0gbXNnLT5sZW47CisJdWludDE2X3QgYnZjaSA9IG1zZ2JfYnZjaShtc2cpOworCXVpbnQxNl90IG5zZWkgPSBtc2diX25zZWkobXNnKTsKKworCS8qIElkZW50aWZpZXJzIGZyb20gVVA6IFRMTEksIEJWQ0ksIE5TRUkgKGFsbCBpbiBtc2diLT5jYikgKi8KKwlpZiAoYnZjaSA8PSBCVkNJX1BUTSApIHsKKwkJTE9HUChEQlNTR1AsIExPR0xfRVJST1IsICJDYW5ub3Qgc2VuZCBETC1VRCB0byBCVkNJICV1XG4iLAorCQkJYnZjaSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWJjdHggPSBidHNjdHhfYnlfYnZjaV9uc2VpKGJ2Y2ksIG5zZWkpOworCWlmICghYmN0eCkgeworCQkvKiBGSVhNRTogZG9uJ3Qgc2ltcGx5IGNyZWF0ZSBtaXNzaW5nIGNvbnRleHQsIGJ1dCByZWplY3QgbWVzc2FnZSAqLworCQliY3R4ID0gYnRzY3R4X2FsbG9jKGJ2Y2ksIG5zZWkpOworCX0KKworCWlmIChtc2ctPmxlbiA+IFRWTFZfTUFYX09ORUJZVEUpCisJCWxsY19wZHVfdGx2X2hkcl9sZW4gKz0gMTsKKworCS8qIHByZXBlbmQgdGhlIHRhZyBhbmQgbGVuZ3RoIG9mIHRoZSBMTEMtUERVIFRMViAqLworCWxsY19wZHVfdGx2ID0gbXNnYl9wdXNoKG1zZywgbGxjX3BkdV90bHZfaGRyX2xlbik7CisJbGxjX3BkdV90bHZbMF0gPSBCU1NHUF9JRV9MTENfUERVOworCWlmIChsbGNfcGR1X3Rsdl9oZHJfbGVuID4gMikgeworCQlsbGNfcGR1X3RsdlsxXSA9IG1zZ19sZW4gPj4gODsKKwkJbGxjX3BkdV90bHZbMl0gPSBtc2dfbGVuICYgMHhmZjsKKwl9IGVsc2UgeworCQlsbGNfcGR1X3RsdlsxXSA9IG1zZ19sZW4gJiAweDNmOworCQlsbGNfcGR1X3RsdlsxXSB8PSAweDgwOworCX0KKworCS8qIEZJWE1FOiBvcHRpb25hbCBlbGVtZW50cyAqLworCisJLyogcHJlcGVuZCB0aGUgcGR1IGxpZmV0aW1lICovCisJcGR1X2xpZmV0aW1lID0gaHRvbnMocGR1X2xpZmV0aW1lKTsKKwltc2diX3R2bHZfcHVzaChtc2csIEJTU0dQX0lFX1BEVV9MSUZFVElNRSwgMiwgKHVpbnQ4X3QgKikmcGR1X2xpZmV0aW1lKTsKKworCS8qIHByZXBlbmQgdGhlIFFvUyBwcm9maWxlLCBUTExJIGFuZCBwZHUgdHlwZSAqLworCWJ1ZGggPSAoc3RydWN0IGJzc2dwX3VkX2hkciAqKSBtc2diX3B1c2gobXNnLCBzaXplb2YoKmJ1ZGgpKTsKKwltZW1jcHkoYnVkaC0+cW9zX3Byb2ZpbGUsIHFvc19wcm9maWxlX2RlZmF1bHQsIHNpemVvZihxb3NfcHJvZmlsZV9kZWZhdWx0KSk7CisJYnVkaC0+dGxsaSA9IGh0b25sKG1zZ2JfdGxsaShtc2cpKTsKKwlidWRoLT5wZHVfdHlwZSA9IEJTU0dQX1BEVVRfRExfVU5JVERBVEE7CisKKwlyYXRlX2N0cl9pbmMoJmJjdHgtPmN0cmctPmN0cltCU1NHUF9DVFJfUEtUU19PVVRdKTsKKwlyYXRlX2N0cl9hZGQoJmJjdHgtPmN0cmctPmN0cltCU1NHUF9DVFJfQllURVNfT1VUXSwgbXNnLT5sZW4pOworCisJLyogSWRlbnRpZmllcnMgZG93bjogQlZDSSwgTlNFSSAoaW4gbXNnYi0+Y2IpICovCisKKwlyZXR1cm4gZ3Byc19uc19zZW5kbXNnKGJzc2dwX25zaSwgbXNnKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19ic3NncF91dGlsLmMgYi9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfYnNzZ3BfdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YjUxNzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfYnNzZ3BfdXRpbC5jCkBAIC0wLDAgKzEsMTE5IEBACisvKiBHUFJTIEJTU0dQIHByb3RvY29sIGltcGxlbWVudGF0aW9uIGFzIHBlciAzR1BQIFRTIDA4LjE4ICovCisKKy8qIChDKSAyMDA5LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19ic3NncC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19ucy5oPgorCitzdHJ1Y3QgZ3Byc19uc19pbnN0ICpic3NncF9uc2k7CisKKy8qIEJTU0dQIFByb3RvY29sIHNwZWNpZmljLCBub3QgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgKi8KKy8qIEZJWE1FOiBUaGlzIG5lZWRzIHRvIGdvIGludG8gbGlib3Ntb2NvcmUgYWZ0ZXIgZmluaXNoZWQgKi8KKworLyogQ2hhcHRlciAxMS4zLjkgLyBUYWJsZSAxMS4xMDogQ2F1c2UgY29kaW5nICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBic3NncF9jYXVzZV9zdHJpbmdzW10gPSB7CisJeyBCU1NHUF9DQVVTRV9QUk9DX09WRVJMT0FELAkiUHJvY2Vzc29yIG92ZXJsb2FkIiB9LAorCXsgQlNTR1BfQ0FVU0VfRVFVSVBfRkFJTCwJIkVxdWlwbWVudCBGYWlsdXJlIiB9LAorCXsgQlNTR1BfQ0FVU0VfVFJBU0lUX05FVF9GQUlMLAkiVHJhbnNpdCBuZXRvd2tyIHNlcnZpY2UgZmFpbHVyZSIgfSwKKwl7IEJTU0dQX0NBVVNFX0NBUEFfR1JFQVRFUl8wS1BCUywiVHJhbnNtaXNzaW9uIGNhcGFjaXR5IG1vZGlmaWVkIiB9LAorCXsgQlNTR1BfQ0FVU0VfVU5LTk9XTl9NUywJIlVua25vd24gTVMiIH0sCisJeyBCU1NHUF9DQVVTRV9VTktOT1dOX0JWQ0ksCSJVbmtub3duIEJWQ0kiIH0sCisJeyBCU1NHUF9DQVVTRV9DRUxMX1RSQUZfQ09ORywJIkNlbGwgdHJhZmZpYyBjb25nZXN0aW9uIiB9LAorCXsgQlNTR1BfQ0FVU0VfU0dTTl9DT05HLAkiU0dTTiBjb25nZXN0aW9uIiB9LAorCXsgQlNTR1BfQ0FVU0VfT01MX0lOVEVSViwJIk8mTSBpbnRlcnZlbnRpb24iIH0sCisJeyBCU1NHUF9DQVVTRV9CVkNJX0JMT0NLRUQsCSJCVkNJIGJsb2NrZWQiIH0sCisJeyBCU1NHUF9DQVVTRV9QRkNfQ1JFQVRFX0ZBSUwsCSJQRkMgY3JlYXRlIGZhaWx1cmUiIH0sCisJeyBCU1NHUF9DQVVTRV9TRU1fSU5DT1JSX1BEVSwJIlNlbWFudGljYWxseSBpbmNvcnJlY3QgUERVIiB9LAorCXsgQlNTR1BfQ0FVU0VfSU5WX01BTkRfSU5GLAkiSW52YWxpZCBtYW5kYXRvcnkgaW5mb3JtYXRpb24iIH0sCisJeyBCU1NHUF9DQVVTRV9NSVNTSU5HX01BTkRfSUUsCSJNaXNzaW5nIG1hbmRhdG9yeSBJRSIgfSwKKwl7IEJTU0dQX0NBVVNFX01JU1NJTkdfQ09ORF9JRSwJIk1pc3NpbmcgY29uZGl0aW9uYWwgSUUiIH0sCisJeyBCU1NHUF9DQVVTRV9VTkVYUF9DT05EX0lFLAkiVW5leHBlY3RlZCBjb25kaXRpb25hbCBJRSIgfSwKKwl7IEJTU0dQX0NBVVNFX0NPTkRfSUVfRVJSLAkiQ29uZGl0aW9uYWwgSUUgZXJyb3IiIH0sCisJeyBCU1NHUF9DQVVTRV9QRFVfSU5DT01QX1NUQVRFLAkiUERVIGluY29tcGF0aWJsZSB3aXRoIHByb3RvY29sIHN0YXRlIiB9LAorCXsgQlNTR1BfQ0FVU0VfUFJPVE9fRVJSX1VOU1BFQywJIlByb3RvY29sIGVycm9yIC0gdW5zcGVjaWZpZWQiIH0sCisJeyBCU1NHUF9DQVVTRV9QRFVfSU5DT01QX0ZFQVQsIAkiUERVIG5vdCBjb21wYXRpYmxlIHdpdGggZmVhdHVyZSBzZXQiIH0sCisJeyAwLCBOVUxMIH0sCit9OworCitjb25zdCBjaGFyICpic3NncF9jYXVzZV9zdHIoZW51bSBncHJzX2Jzc2dwX2NhdXNlIGNhdXNlKQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKGJzc2dwX2NhdXNlX3N0cmluZ3MsIGNhdXNlKTsKK30KKworCitzdHJ1Y3QgbXNnYiAqYnNzZ3BfbXNnYl9hbGxvYyh2b2lkKQoreworCXJldHVybiBtc2diX2FsbG9jX2hlYWRyb29tKDQwOTYsIDEyOCwgIkJTU0dQIik7Cit9CisKKy8qIFRyYW5zbWl0IGEgc2ltcGxlIHJlc3BvbnNlIHN1Y2ggYXMgQkxPQ0svVU5CTE9DSy9SRVNFVCBBQ0svTkFDSyAqLworaW50IGJzc2dwX3R4X3NpbXBsZV9idmNpKHVpbnQ4X3QgcGR1X3R5cGUsIHVpbnQxNl90IG5zZWksCisJCQkgdWludDE2X3QgYnZjaSwgdWludDE2X3QgbnNfYnZjaSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gYnNzZ3BfbXNnYl9hbGxvYygpOworCXN0cnVjdCBic3NncF9ub3JtYWxfaGRyICpiZ3BoID0KKwkJCShzdHJ1Y3QgYnNzZ3Bfbm9ybWFsX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqYmdwaCkpOworCXVpbnQxNl90IF9idmNpOworCisJbXNnYl9uc2VpKG1zZykgPSBuc2VpOworCW1zZ2JfYnZjaShtc2cpID0gbnNfYnZjaTsKKworCWJncGgtPnBkdV90eXBlID0gcGR1X3R5cGU7CisJX2J2Y2kgPSBodG9ucyhidmNpKTsKKwltc2diX3R2bHZfcHV0KG1zZywgQlNTR1BfSUVfQlZDSSwgMiwgKHVpbnQ4X3QgKikgJl9idmNpKTsKKworCXJldHVybiBncHJzX25zX3NlbmRtc2coYnNzZ3BfbnNpLCBtc2cpOworfQorCisvKiBDaGFwdGVyIDEwLjQuMTQ6IFN0YXR1cyAqLworaW50IGJzc2dwX3R4X3N0YXR1cyh1aW50OF90IGNhdXNlLCB1aW50MTZfdCAqYnZjaSwgc3RydWN0IG1zZ2IgKm9yaWdfbXNnKQoreworCXN0cnVjdCBtc2diICptc2cgPSBic3NncF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGJzc2dwX25vcm1hbF9oZHIgKmJncGggPQorCQkJKHN0cnVjdCBic3NncF9ub3JtYWxfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpiZ3BoKSk7CisKKwlERUJVR1BDKERCU1NHUCwgIkJTU0dQOiBUWCBTVEFUVVMsIGNhdXNlPSVzXG4iLCBic3NncF9jYXVzZV9zdHIoY2F1c2UpKTsKKwltc2diX25zZWkobXNnKSA9IG1zZ2JfbnNlaShvcmlnX21zZyk7CisJbXNnYl9idmNpKG1zZykgPSAwOworCisJYmdwaC0+cGR1X3R5cGUgPSBCU1NHUF9QRFVUX1NUQVRVUzsKKwltc2diX3R2bHZfcHV0KG1zZywgQlNTR1BfSUVfQ0FVU0UsIDEsICZjYXVzZSk7CisJaWYgKGJ2Y2kpIHsKKwkJdWludDE2X3QgX2J2Y2kgPSBodG9ucygqYnZjaSk7CisJCW1zZ2JfdHZsdl9wdXQobXNnLCBCU1NHUF9JRV9CVkNJLCAyLCAodWludDhfdCAqKSAmX2J2Y2kpOworCX0KKwlpZiAob3JpZ19tc2cpCisJCW1zZ2JfdHZsdl9wdXQobXNnLCBCU1NHUF9JRV9QRFVfSU5fRVJST1IsCisJCQkgICAgICBtc2diX2Jzc2dwX2xlbihvcmlnX21zZyksIG1zZ2JfYnNzZ3BoKG9yaWdfbXNnKSk7CisKKwlyZXR1cm4gZ3Byc19uc19zZW5kbXNnKGJzc2dwX25zaSwgbXNnKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19ic3NncF92dHkuYyBiL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19ic3NncF92dHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGEwMmFiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX2Jzc2dwX3Z0eS5jCkBAIC0wLDAgKzEsMTc4IEBACisvKiBWVFkgaW50ZXJmYWNlIGZvciBvdXIgR1BSUyBCU1MgR2F0ZXdheSBQcm90b2NvbCAoQlNTR1ApIGltcGxlbWVudGF0aW9uICovCisKKy8qIChDKSAyMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3JhdGVfY3RyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX25zLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX2Jzc2dwLmg+CisjaW5jbHVkZSA8b3BlbmJzYy92dHkuaD4KKworI2luY2x1ZGUgPG9zbW9jb20vdnR5L3Z0eS5oPgorI2luY2x1ZGUgPG9zbW9jb20vdnR5L2NvbW1hbmQuaD4KKyNpbmNsdWRlIDxvc21vY29tL3Z0eS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8b3Ntb2NvbS92dHkvdGVsbmV0X2ludGVyZmFjZS5oPgorCisvKiBGSVhNRTogdGhpcyBzaG91bGQgZ28gdG8gc29tZSBjb21tb24gZmlsZSBhcyBpdCBpcyBjb3BpZWQKKyAqIGluIHZ0eV9pbnRlcmZhY2UuYyBvZiB0aGUgQlNDICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBncHJzX2Jzc2dwX3RpbWVyX3N0cnNbXSA9IHsKKwl7IDAsIE5VTEwgfQorfTsKKworc3RhdGljIHN0cnVjdCBjbWRfbm9kZSBic3NncF9ub2RlID0geworCUJTU0dQX05PREUsCisJIiVzKGJzc2dwKSMiLAorCTEsCit9OworCitzdGF0aWMgaW50IGNvbmZpZ193cml0ZV9ic3NncChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdnR5X291dCh2dHksICJic3NncCVzIiwgVlRZX05FV0xJTkUpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnNzZ3AsIGNmZ19ic3NncF9jbWQsCisgICAgICAiYnNzZ3AiLAorICAgICAgIkNvbmZpZ3VyZSB0aGUgR1BSUyBCU1MgR2F0ZXdheSBQcm90b2NvbCIpCit7CisJdnR5LT5ub2RlID0gQlNTR1BfTk9ERTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfYnZjKHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGJzc2dwX2J2Y19jdHggKmJ2YywgaW50IHN0YXRzKQoreworCXZ0eV9vdXQodnR5LCAiTlNFSSAlNXUsIEJWQ0kgJTV1LCBSQS1JRDogJXUtJXUtJXUtJXUsIENJRDogJXUsICIKKwkJIlNUQVRFOiAlcyVzIiwgYnZjLT5uc2VpLCBidmMtPmJ2Y2ksIGJ2Yy0+cmFfaWQubWNjLAorCQlidmMtPnJhX2lkLm1uYywgYnZjLT5yYV9pZC5sYWMsIGJ2Yy0+cmFfaWQucmFjLCBidmMtPmNlbGxfaWQsCisJCWJ2Yy0+c3RhdGUgJiBCVkNfU19CTE9DS0VEID8gIkJMT0NLRUQiIDogIlVOQkxPQ0tFRCIsCisJCVZUWV9ORVdMSU5FKTsKKwlpZiAoc3RhdHMpCisJCXZ0eV9vdXRfcmF0ZV9jdHJfZ3JvdXAodnR5LCAiICIsIGJ2Yy0+Y3RyZyk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfYnNzZ3Aoc3RydWN0IHZ0eSAqdnR5LCBpbnQgc3RhdHMpCit7CisJc3RydWN0IGJzc2dwX2J2Y19jdHggKmJ2YzsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ2YywgJmJzc2dwX2J2Y19jdHh0cywgbGlzdCkgeworCQlkdW1wX2J2Yyh2dHksIGJ2Yywgc3RhdHMpOworCX0KK30KKworI2RlZmluZSBCU1NHUF9TVFIgIlNob3cgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEJTU0dQIHByb3RvY29sXG4iCisKK0RFRlVOKHNob3dfYnNzZ3AsIHNob3dfYnNzZ3BfY21kLCAic2hvdyBic3NncCIsCisJU0hPV19TVFIgQlNTR1BfU1RSKQoreworCWR1bXBfYnNzZ3AodnR5LCAwKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHNob3dfYnNzZ3Bfc3RhdHMsIHNob3dfYnNzZ3Bfc3RhdHNfY21kLCAic2hvdyBic3NncCBzdGF0cyIsCisJU0hPV19TVFIgQlNTR1BfU1RSCisJIkluY2x1ZGUgc3RhdGlzdGljc1xuIikKK3sKKwlkdW1wX2Jzc2dwKHZ0eSwgMSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihzaG93X2J2Yywgc2hvd19idmNfY21kLCAic2hvdyBic3NncCBuc2VpIDwwLTY1NTM1PiBbc3RhdHNdIiwKKwlTSE9XX1NUUiBCU1NHUF9TVFIKKwkiU2hvdyBhbGwgQlZDU0UgYnkgaXRzIE5TRSBJZGVudGlmaWVyXG4iCisJIlRoZSBOU0VJXG4iICJJbmNsdWRlIFN0YXRpc3RpY3NcbiIpCit7CisJc3RydWN0IGJzc2dwX2J2Y19jdHggKmJ2YzsKKwl1aW50MTZfdCBuc2VpID0gYXRvaShhcmd2WzFdKTsKKwlpbnQgc2hvd19zdGF0cyA9IDA7CisKKwlpZiAoYXJnYyA+PSAyKQorCQlzaG93X3N0YXRzID0gMTsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ2YywgJmJzc2dwX2J2Y19jdHh0cywgbGlzdCkgeworCQlpZiAoYnZjLT5uc2VpICE9IG5zZWkpCisJCQljb250aW51ZTsKKwkJZHVtcF9idmModnR5LCBidmMsIHNob3dfc3RhdHMpOworCX0KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obG9nZ2luZ19mbHRyX2J2YywKKyAgICAgIGxvZ2dpbmdfZmx0cl9idmNfY21kLAorICAgICAgImxvZ2dpbmcgZmlsdGVyIGJ2YyBuc2VpIDwwLTY1NTM1PiBidmNpIDwwLTY1NTM1PiIsCisJTE9HR0lOR19TVFIgRklMVEVSX1NUUgorCSJGaWx0ZXIgYmFzZWQgb24gQlNTR1AgVmlydHVhbCBDb25uZWN0aW9uXG4iCisJIk5TRUkgb2YgdGhlIEJWQyB0byBiZSBmaWx0ZXJlZFxuIgorCSJOZXR3b3JrIFNlcnZpY2UgRW50aXR5IElkZW50aWZpZXIgKE5TRUkpXG4iCisJIkJWQ0kgb2YgdGhlIEJWQyB0byBiZSBmaWx0ZXJlZFxuIgorCSJCU1NHUCBWaXJ0dWFsIENvbm5lY3Rpb24gSWRlbnRpZmllciAoQlZDSSlcbiIpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCBic3NncF9idmNfY3R4ICpidmM7CisJdWludDE2X3QgbnNlaSA9IGF0b2koYXJndlswXSk7CisJdWludDE2X3QgYnZjaSA9IGF0b2koYXJndlsxXSk7CisKKwljb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqKSB2dHktPnByaXY7CisJaWYgKCFjb25uLT5kYmcpIHsKKwkJdnR5X291dCh2dHksICJMb2dnaW5nIHdhcyBub3QgZW5hYmxlZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWJ2YyA9IGJ0c2N0eF9ieV9idmNpX25zZWkoYnZjaSwgbnNlaSk7CisJaWYgKCFidmMpIHsKKwkJdnR5X291dCh2dHksICJObyBCVkMgYnkgdGhhdCBpZGVudGlmaWVyJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlsb2dfc2V0X2J2Y19maWx0ZXIoY29ubi0+ZGJnLCBidmMpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworaW50IGdwcnNfYnNzZ3BfdnR5X2luaXQodm9pZCkKK3sKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnNob3dfYnNzZ3BfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnNob3dfYnNzZ3Bfc3RhdHNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnNob3dfYnZjX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50X3ZlKCZsb2dnaW5nX2ZsdHJfYnZjX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZjZmdfYnNzZ3BfY21kKTsKKwlpbnN0YWxsX25vZGUoJmJzc2dwX25vZGUsIGNvbmZpZ193cml0ZV9ic3NncCk7CisJaW5zdGFsbF9kZWZhdWx0KEJTU0dQX05PREUpOworCWluc3RhbGxfZWxlbWVudChCU1NHUF9OT0RFLCAmb3Vybm9kZV9leGl0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJTU0dQX05PREUsICZvdXJub2RlX2VuZF9jbWQpOworCS8vaW5zdGFsbF9lbGVtZW50KEJTU0dQX05PREUsICZjZmdfYnNzZ3BfdGltZXJfY21kKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX2dtbS5jIGIvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX2dtbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwOWYxNDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfZ21tLmMKQEAgLTAsMCArMSw5ODIgQEAKKy8qIEdTTSBNb2JpbGUgUmFkaW8gSW50ZXJmYWNlIExheWVyIDMgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZQorICogM0dQUCBUUyAwNC4wOCB2ZXJzaW9uIDcuMjEuMCBSZWxlYXNlIDE5OTggLyBFVFNJIFRTIDEwMCA5NDAgVjcuMjEuMCAqLworCisvKiAoQykgMjAwOS0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2RiLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3JhdGVfY3RyLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4X2dwcnMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3BhZ2luZy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdHJhbnNhY3Rpb24uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfYnNzZ3AuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfbGxjLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX3Nnc24uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfZ21tLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zZ3NuLmg+CisKKyNpbmNsdWRlIDxwZHAuaD4KKworZXh0ZXJuIHN0cnVjdCBzZ3NuX2luc3RhbmNlICpzZ3NuOworCisvKiBQcm90b2NvbCByZWxhdGVkIHN0dWZmLCBzaG91bGQgZ28gaW50byBsaWJvc21vY29yZSAqLworCisvKiAxMC41LjUuMTQgR1BSUyBNTSBDYXVzZSAvIFRhYmxlIDEwLjUuMTQ3ICovCitjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGdtbV9jYXVzZV9uYW1lc1tdID0geworCS8qIEZJWE1FICovCisJeyBHTU1fQ0FVU0VfU0VNX0lOQ09SUl9NU0csICJTZW1hbnRpY2FsbHkgaW5jb3JyZWN0IG1lc3NhZ2UiIH0sCisJeyBHTU1fQ0FVU0VfSU5WX01BTkRfSU5GTywgIkludmFsaWQgbWFuZGF0b3J5IGluZm9ybWF0aW9uIiB9LAorCXsgR01NX0NBVVNFX01TR1RfTk9URVhJU1RfTk9USU1QTCwKKwkJCSJNZXNzYWdlIHR5cGUgbm9uLWV4aXN0YW50IG9yIG5vdCBpbXBsZW1lbnRlZCIgfSwKKwl7IEdNTV9DQVVTRV9NU0dUX0lOQ09NUF9QX1NUQVRFLAorCQkJIk1lc3NhZ2UgdHlwZSBub3QgY29tcGF0aWJsZSB3aXRoIHByb3RvY29sIHN0YXRlIiB9LAorCXsgR01NX0NBVVNFX0lFX05PVEVYSVNUX05PVElNUEwsCisJCQkiSW5mb3JtYXRpb24gZWxlbWVudCBub24tZXhpc3RlbnQgb3Igbm90IGltcGxlbWVudGVkIiB9LAorCXsgR01NX0NBVVNFX0NPTkRfSUVfRVJSLCAiQ29uZGl0aW9uYWwgSUUgZXJyb3IiIH0sCisJeyBHTU1fQ0FVU0VfTVNHX0lOQ09NUF9QX1NUQVRFLAorCQkJCSJNZXNzYWdlIG5vdCBjb21wYXRpYmxlIHdpdGggcHJvdG9jb2wgc3RhdGUgIiB9LAorCXsgR01NX0NBVVNFX1BST1RPX0VSUl9VTlNQRUMsICJQcm90b2NvbCBlcnJvciwgdW5zcGVjaWZpZWQiIH0sCisJeyAwLCBOVUxMIH0KK307CisKKy8qIDEwLjUuNi42IFNNIENhdXNlIC8gVGFibGUgMTAuNS4xNTcgKi8KK2NvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgZ3NtX2NhdXNlX25hbWVzW10gPSB7CisJeyBHU01fQ0FVU0VfSU5TVUZGX1JTUkMsICJJbnN1ZmZpY2llbnQgcmVzb3VyY2VzIiB9LAorCXsgR1NNX0NBVVNFX01JU1NJTkdfQVBOLCAiTWlzc2luZyBvciB1bmtub3duIEFQTiIgfSwKKwl7IEdTTV9DQVVTRV9VTktOT1dOX1BEUCwgIlVua25vd24gUERQIGFkZHJlc3Mgb3IgUERQIHR5cGUiIH0sCisJeyBHU01fQ0FVU0VfQVVUSF9GQUlMRUQsICJVc2VyIEF1dGhlbnRpY2F0aW9uIGZhaWxlZCIgfSwKKwl7IEdTTV9DQVVTRV9BQ1RfUkVKX0dHU04sICJBY3RpdmF0aW9uIHJlamVjdGVkIGJ5IEdHU04iIH0sCisJeyBHU01fQ0FVU0VfQUNUX1JFSl9VTlNQRUMsICJBY3RpdmF0aW9uIHJlamVjdGVkLCB1bnNwZWNpZmllZCIgfSwKKwl7IEdTTV9DQVVTRV9TRVJWX09QVF9OT1RTVVBQLCAiU2VydmljZSBvcHRpb24gbm90IHN1cHBvcnRlZCIgfSwKKwl7IEdTTV9DQVVTRV9SRVFfU0VSVl9PUFRfTk9UU1VCLAorCQkJCSJSZXF1ZXN0ZWQgc2VydmljZSBvcHRpb24gbm90IHN1YnNjcmliZWQiIH0sCisJeyBHU01fQ0FVU0VfU0VSVl9PUFRfVEVNUF9PT08sCisJCQkJIlNlcnZpY2Ugb3B0aW9uIHRlbXBvcmFyaWx5IG91dCBvZiBvcmRlciIgfSwKKwl7IEdTTV9DQVVTRV9OU0FQSV9JTl9VU0UsICJOU0FQSSBhbHJlYWR5IHVzZWQiIH0sCisJeyBHU01fQ0FVU0VfREVBQ1RfUkVHVUxBUiwgIlJlZ3VsYXIgZGVhY3RpdmF0aW9uIiB9LAorCXsgR1NNX0NBVVNFX1FPU19OT1RfQUNDRVBURUQsICJRb1Mgbm90IGFjY2VwdGVkIiB9LAorCXsgR1NNX0NBVVNFX05FVF9GQUlMLCAiTmV0d29yayBGYWlsdXJlIiB9LAorCXsgR1NNX0NBVVNFX1JFQUNUX1JRRCwgIlJlYWN0aXZhdGlvbiByZXF1aXJlZCIgfSwKKwl7IEdTTV9DQVVTRV9GRUFUVVJFX05PVFNVUFAsICJGZWF0dXJlIG5vdCBzdXBwb3J0ZWQgIiB9LAorCXsgR1NNX0NBVVNFX0lOVkFMSURfVFJBTlNfSUQsICJJbnZhbGlkIHRyYW5zYWN0aW9uIGlkZW50aWZpZXIiIH0sCisJeyBHU01fQ0FVU0VfU0VNX0lOQ09SUl9NU0csICJTZW1hbnRpY2FsbHkgaW5jb3JyZWN0IG1lc3NhZ2UiIH0sCisJeyBHU01fQ0FVU0VfSU5WX01BTkRfSU5GTywgIkludmFsaWQgbWFuZGF0b3J5IGluZm9ybWF0aW9uIiB9LAorCXsgR1NNX0NBVVNFX01TR1RfTk9URVhJU1RfTk9USU1QTCwKKwkJCSJNZXNzYWdlIHR5cGUgbm9uLWV4aXN0YW50IG9yIG5vdCBpbXBsZW1lbnRlZCIgfSwKKwl7IEdTTV9DQVVTRV9NU0dUX0lOQ09NUF9QX1NUQVRFLAorCQkJIk1lc3NhZ2UgdHlwZSBub3QgY29tcGF0aWJsZSB3aXRoIHByb3RvY29sIHN0YXRlIiB9LAorCXsgR1NNX0NBVVNFX0lFX05PVEVYSVNUX05PVElNUEwsCisJCQkiSW5mb3JtYXRpb24gZWxlbWVudCBub24tZXhpc3RlbnQgb3Igbm90IGltcGxlbWVudGVkIiB9LAorCXsgR1NNX0NBVVNFX0NPTkRfSUVfRVJSLCAiQ29uZGl0aW9uYWwgSUUgZXJyb3IiIH0sCisJeyBHU01fQ0FVU0VfTVNHX0lOQ09NUF9QX1NUQVRFLAorCQkJCSJNZXNzYWdlIG5vdCBjb21wYXRpYmxlIHdpdGggcHJvdG9jb2wgc3RhdGUgIiB9LAorCXsgR1NNX0NBVVNFX1BST1RPX0VSUl9VTlNQRUMsICJQcm90b2NvbCBlcnJvciwgdW5zcGVjaWZpZWQiIH0sCisJeyAwLCBOVUxMIH0KK307CisKKy8qIDEwLjUuNS4yICovCitjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGdwcnNfYXR0X3Rfc3Ryc1tdID0geworCXsgR1BSU19BVFRfVF9BVFRBQ0gsIAkJIkdQUlMgYXR0YWNoIiB9LAorCXsgR1BSU19BVFRfVF9BVFRfV0hJTEVfSU1TSSwgCSJHUFJTIGF0dGFjaCB3aGlsZSBJTVNJIGF0dGFjaGVkIiB9LAorCXsgR1BSU19BVFRfVF9DT01CSU5FRCwgCQkiQ29tYmluZWQgR1BSUy9JTVNJIGF0dGFjaCIgfSwKKwl7IDAsIE5VTEwgfQorfTsKKworY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBncHJzX3VwZF90X3N0cnNbXSA9IHsKKwl7IEdQUlNfVVBEX1RfUkEsCQkiUkEgdXBkYXRpbmciIH0sCisJeyBHUFJTX1VQRF9UX1JBX0xBLAkJImNvbWJpbmVkIFJBL0xBIHVwZGF0aW5nIiB9LAorCXsgR1BSU19VUERfVF9SQV9MQV9JTVNJX0FUVCwJImNvbWJpbmVkIFJBL0xBIHVwZGF0aW5nICsgSU1TSSBhdHRhY2giIH0sCisJeyBHUFJTX1VQRF9UX1BFUklPRElDLAkJInBlcmlvZGljIHVwZGF0aW5nIiB9LAorCXsgMCwgTlVMTCB9Cit9OworCisvKiAxMC41LjUuNSAqLworY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBncHJzX2RldF90X21vX3N0cnNbXSA9IHsKKwl7IEdQUlNfREVUX1RfTU9fR1BSUywJCSJHUFJTIGRldGFjaCIgfSwKKwl7IEdQUlNfREVUX1RfTU9fSU1TSSwJCSJJTVNJIGRldGFjaCIgfSwKKwl7IEdQUlNfREVUX1RfTU9fQ09NQklORUQsCSJDb21iaW5lZCBHUFJTL0lNU0kgZGV0YWNoIiB9LAorCXsgMCwgTlVMTCB9Cit9OworCisvKiBPdXIgaW1wbGVtZW50YXRpb24sIHNob3VsZCBiZSBrZXB0IGluIFNHU04gKi8KKworLyogU2VuZCBhIG1lc3NhZ2UgdGhyb3VnaCB0aGUgdW5kZXJseWluZyBsYXllciAqLworc3RhdGljIGludCBnc200OF9nbW1fc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnLCBpbnQgY29tbWFuZCwKKwkJCSAgICAgY29uc3Qgc3RydWN0IHNnc25fbW1fY3R4ICptbSkKK3sKKwlpZiAobW0pCisJCXJhdGVfY3RyX2luYygmbW0tPmN0cmctPmN0cltHTU1fQ1RSX1BLVFNfU0lHX09VVF0pOworCisJLyogY2FsbGVyIG5lZWRzIHRvIHByb3ZpZGUgVExMSSwgQlZDSSBhbmQgTlNFSSAqLworCXJldHVybiBncHJzX2xsY190eF91aShtc2csIEdQUlNfU0FQSV9HTU0sIGNvbW1hbmQpOworfQorCisvKiBjb3B5IGlkZW50aWZpZXJzIGZyb20gb2xkIG1lc3NhZ2UgdG8gbmV3IG1lc3NhZ2UsIHRoaXMKKyAqIGlzIHJlcXVpcmVkIHNvIGxvd2VyIGxheWVycyBjYW4gcm91dGUgaXQgY29ycmVjdGx5ICovCitzdGF0aWMgdm9pZCBnbW1fY29weV9pZChzdHJ1Y3QgbXNnYiAqbXNnLCBjb25zdCBzdHJ1Y3QgbXNnYiAqb2xkKQoreworCW1zZ2JfdGxsaShtc2cpID0gbXNnYl90bGxpKG9sZCk7CisJbXNnYl9idmNpKG1zZykgPSBtc2diX2J2Y2kob2xkKTsKKwltc2diX25zZWkobXNnKSA9IG1zZ2JfbnNlaShvbGQpOworfQorCisvKiBTdG9yZSBCVkNJL05TRUkgaW4gTU0gY29udGV4dCAqLworc3RhdGljIHZvaWQgbXNnaWQybW1jdHgoc3RydWN0IHNnc25fbW1fY3R4ICptbSwgY29uc3Qgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwltbS0+YnZjaSA9IG1zZ2JfYnZjaShtc2cpOworCW1tLT5uc2VpID0gbXNnYl9uc2VpKG1zZyk7Cit9CisKKy8qIFN0b3JlIEJWQ0kvTlNFSSBpbiBNTSBjb250ZXh0ICovCitzdGF0aWMgdm9pZCBtbWN0eDJtc2dpZChzdHJ1Y3QgbXNnYiAqbXNnLCBjb25zdCBzdHJ1Y3Qgc2dzbl9tbV9jdHggKm1tKQoreworCW1zZ2JfdGxsaShtc2cpID0gbW0tPnRsbGk7CisJbXNnYl9idmNpKG1zZykgPSBtbS0+YnZjaTsKKwltc2diX25zZWkobXNnKSA9IG1tLT5uc2VpOworfQorCitzdGF0aWMgc3RydWN0IGdzbTQ4X3FvcyBkZWZhdWx0X3FvcyA9IHsKKwkuZGVsYXlfY2xhc3MgPSA0LAkvKiBiZXN0IGVmZm9ydCAqLworCS5yZWxpYWJfY2xhc3MgPSBHU000OF9RT1NfUkNfTExDX1VOX1JMQ19BQ0tfREFUQV9QUk9ULAorCS5wZWFrX3RwdXQgPSBHU000OF9RT1NfUEVBS19UUFVUXzMyMDAwYnBzLAorCS5wcmVjZWRfY2xhc3MgPSBHU000OF9RT1NfUENfTk9STUFMLAorCS5tZWFuX3RwdXQgPSBHU000OF9RT1NfTUVBTl9UUFVUX0JFU1RfRUZGT1JULAorCS50cmFmX2NsYXNzID0gR1NNNDhfUU9TX1RDX0lOVEVSQUNUSVZFLAorCS5kZWxpdl9vcmRlciA9IEdTTTQ4X1FPU19ET19VTk9SREVSRUQsCisJLmRlbGl2X2Vycl9zZHUgPSBHU000OF9RT1NfRVJSU0RVX1lFUywKKwkubWF4X3NkdV9zaXplID0gR1NNNDhfUU9TX01BWFNEVV8xNTIwLAorCS5tYXhfYml0cmF0ZV91cCA9IEdTTTQ4X1FPU19NQlJBVEVfNjNrLAorCS5tYXhfYml0cmF0ZV9kb3duID0gR1NNNDhfUU9TX01CUkFURV82M2ssCisJLnJlc2lkX2JlciA9IEdTTTQ4X1FPU19SQkVSXzVlXzIsCisJLnNkdV9lcnJfcmF0aW8gPSBHU000OF9RT1NfU0VSUl8xZV8yLAorCS5oYW5kbGluZ19wcmlvID0gMywKKwkueGZlcl9kZWxheSA9IDB4MTAsCS8qIDIwMG1zICovCisJLmd1YXJfYml0cmF0ZV91cCA9IEdTTTQ4X1FPU19NQlJBVEVfMGssCisJLmd1YXJfYml0cmF0ZV9kb3duID0gR1NNNDhfUU9TX01CUkFURV8waywKKwkuc2lnX2luZCA9IDAsCS8qIG5vdCBvcHRpbWlzZWQgZm9yIHNpZ25hbGxpbmcgKi8KKwkubWF4X2JpdHJhdGVfZG93bl9leHQgPSAwLAkvKiB1c2Ugb2N0ZXQgOSAqLworCS5ndWFyX2JpdHJhdGVfZG93bl9leHQgPSAwLAkvKiB1c2Ugb2N0ZXQgMTMgKi8KK307CisKKy8qIENoYXB0ZXIgOS40LjI6IEF0dGFjaCBhY2NlcHQgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfdHhfZ21tX2F0dF9hY2soc3RydWN0IHNnc25fbW1fY3R4ICptbSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCXN0cnVjdCBnc200OF9hdHRhY2hfYWNrICphYTsKKwl1aW50OF90ICpwdHNpZywgKm1pZDsKKworCURFQlVHUChETU0sICI8LSBHUFJTIEFUVEFDSCBBQ0NFUFRcbiIpOworCisJbW1jdHgybXNnaWQobXNnLCBtbSk7CisKKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX01NX0dQUlM7CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfR01NX0FUVEFDSF9BQ0s7CisKKwlhYSA9IChzdHJ1Y3QgZ3NtNDhfYXR0YWNoX2FjayAqKSBtc2diX3B1dChtc2csIHNpemVvZigqYWEpKTsKKwlhYS0+Zm9yY2Vfc3RieSA9IDA7CS8qIG5vdCBpbmRpY2F0ZWQgKi8KKwlhYS0+YXR0X3Jlc3VsdCA9IDE7CS8qIEdQUlMgb25seSAqLworCWFhLT5yYV91cGRfdGltZXIgPSBHUFJTX1RNUl9NSU5VVEUgfCAxMDsKKwlhYS0+cmFkaW9fcHJpbyA9IDQ7CS8qIGxvd2VzdCAqLworCWdzbTQ4X2NvbnN0cnVjdF9yYShhYS0+cmFfaWQuZGlnaXRzLCAmbW0tPnJhKTsKKworI2lmIDAKKwkvKiBPcHRpb25hbDogUC1UTVNJIHNpZ25hdHVyZSAqLworCW1zZ2Jfdl9wdXQobXNnLCBHU000OF9JRV9HTU1fUFRNU0lfU0lHKTsKKwlwdHNpZyA9IG1zZ2JfcHV0KG1zZywgMyk7CisJcHRzaWdbMF0gPSBtbS0+cF90bXNpX3NpZyA+PiAxNjsKKwlwdHNpZ1sxXSA9IG1tLT5wX3Rtc2lfc2lnID4+IDg7CisJcHRzaWdbMl0gPSBtbS0+cF90bXNpX3NpZyAmIDB4ZmY7CisKKwkvKiBPcHRpb25hbDogTmVnb3RpYXRlZCBSZWFkeSB0aW1lciB2YWx1ZSAqLworCisJLyogT3B0aW9uYWw6IEFsbG9jYXRlZCBQLVRNU0kgKi8KKwltaWQgPSBtc2diX3B1dChtc2csIEdTTTQ4X01JRF9UTVNJX0xFTik7CisJZ3NtNDhfZ2VuZXJhdGVfbWlkX2Zyb21fdG1zaShtaWQsIG1tLT5wX3Rtc2kpOworCW1pZFswXSA9IEdTTTQ4X0lFX0dNTV9BTExPQ19QVE1TSTsKKyNlbmRpZgorCS8qIE9wdGlvbmFsOiBNUy1pZGVudGl0eSAoY29tYmluZWQgYXR0YWNoKSAqLworCS8qIE9wdGlvbmFsOiBHTU0gY2F1c2UgKHBhcnRpYWwgYXR0YWNoIHJlc3VsdCBmb3IgY29tYmluZWQgYXR0YWNoKSAqLworCisJcmV0dXJuIGdzbTQ4X2dtbV9zZW5kbXNnKG1zZywgMCwgTlVMTCk7Cit9CisKKy8qIENoYXB0ZXIgOS40LjU6IEF0dGFjaCByZWplY3QgKi8KK3N0YXRpYyBpbnQgX3R4X2dtbV9hdHRfcmVqKHN0cnVjdCBtc2diICptc2csIHVpbnQ4X3QgZ21tX2NhdXNlKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCisJREVCVUdQKERNTSwgIjwtIEdQUlMgQVRUQUNIIFJFSkVDVFxuIik7CisKKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkgKyAxKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19NTV9HUFJTOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0dNTV9BVFRBQ0hfUkVKOworCWdoLT5kYXRhWzBdID0gZ21tX2NhdXNlOworCisJcmV0dXJuIGdzbTQ4X2dtbV9zZW5kbXNnKG1zZywgMCwgTlVMTCk7Cit9CitzdGF0aWMgaW50IGdzbTQ4X3R4X2dtbV9hdHRfcmVqX29sZG1zZyhjb25zdCBzdHJ1Y3QgbXNnYiAqb2xkX21zZywKKwkJCQkJdWludDhfdCBnbW1fY2F1c2UpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlnbW1fY29weV9pZChtc2csIG9sZF9tc2cpOworCXJldHVybiBfdHhfZ21tX2F0dF9yZWoobXNnLCBnbW1fY2F1c2UpOworfQorc3RhdGljIGludCBnc200OF90eF9nbW1fYXR0X3JlaihzdHJ1Y3Qgc2dzbl9tbV9jdHggKm1tLAorCQkJCXVpbnQ4X3QgZ21tX2NhdXNlKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJbW1jdHgybXNnaWQobXNnLCBtbSk7CisJcmV0dXJuIF90eF9nbW1fYXR0X3Jlaihtc2csIGdtbV9jYXVzZSk7Cit9CisKKy8qIENoYXB0ZXIgOS40LjYuMiBEZXRhY2ggYWNjZXB0ICovCitzdGF0aWMgaW50IGdzbTQ4X3R4X2dtbV9kZXRfYWNrKHN0cnVjdCBzZ3NuX21tX2N0eCAqbW0sIHVpbnQ4X3QgZm9yY2Vfc3RieSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCisJREVCVUdQKERNTSwgIjwtIEdQUlMgREVUQUNIIEFDQ0VQVFxuIik7CisKKwltbWN0eDJtc2dpZChtc2csIG1tKTsKKworCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSArIDEpOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX01NX0dQUlM7CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfR01NX0RFVEFDSF9BQ0s7CisJZ2gtPmRhdGFbMF0gPSBmb3JjZV9zdGJ5OworCisJcmV0dXJuIGdzbTQ4X2dtbV9zZW5kbXNnKG1zZywgMCwgTlVMTCk7Cit9CisKKy8qIFRyYW5zbWl0IENoYXB0ZXIgOS40LjEyIElkZW50aXR5IFJlcXVlc3QgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfdHhfZ21tX2lkX3JlcShzdHJ1Y3Qgc2dzbl9tbV9jdHggKm1tLCB1aW50OF90IGlkX3R5cGUpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaDsKKworCURFQlVHUChETU0sICItPiBHUFJTIElERU5USVRZIFJFUVVFU1Q6IG1pX3R5cGU9JTAyeFxuIiwgaWRfdHlwZSk7CisKKwltbWN0eDJtc2dpZChtc2csIG1tKTsKKworCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSArIDEpOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX01NX0dQUlM7CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfR01NX0lEX1JFUTsKKwkvKiAxMC41LjUuOSBJRCB0eXBlIDIgKyBpZGVudGl0eSB0eXBlIGFuZCAxMC41LjUuNyAnZm9yY2UgdG8gc3RhbmRieScgSUUgKi8KKwlnaC0+ZGF0YVswXSA9IGlkX3R5cGUgJiAweGY7CisKKwlyZXR1cm4gZ3NtNDhfZ21tX3NlbmRtc2cobXNnLCAwLCBOVUxMKTsKK30KKworLyogQ2hlY2sgaWYgd2UgY2FuIGFscmVhZHkgYXV0aG9yaXplIGEgc3Vic2NyaWJlciAqLworc3RhdGljIGludCBnc200OF9nbW1fYXV0aG9yaXplKHN0cnVjdCBzZ3NuX21tX2N0eCAqY3R4KQoreworCWlmIChzdHJsZW4oY3R4LT5pbWVpKSAmJiBzdHJsZW4oY3R4LT5pbXNpKSkgeworCQljdHgtPm1tX3N0YXRlID0gR01NX1JFR0lTVEVSRURfTk9STUFMOworCQlyZXR1cm4gZ3NtNDhfdHhfZ21tX2F0dF9hY2soY3R4KTsKKwl9IAorCWlmICghc3RybGVuKGN0eC0+aW1laSkpCisJCXJldHVybiBnc200OF90eF9nbW1faWRfcmVxKGN0eCwgR1NNX01JX1RZUEVfSU1FSSk7CisKKwlpZiAoIXN0cmxlbihjdHgtPmltc2kpKQorCQlyZXR1cm4gZ3NtNDhfdHhfZ21tX2lkX3JlcShjdHgsIEdTTV9NSV9UWVBFX0lNU0kpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFBhcnNlIENoYXB0ZXIgOS40LjEzIElkZW50aXR5IFJlc3BvbnNlICovCitzdGF0aWMgaW50IGdzbTQ4X3J4X2dtbV9pZF9yZXNwKHN0cnVjdCBzZ3NuX21tX2N0eCAqY3R4LCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9nbW1oKG1zZyk7CisJdWludDhfdCBtaV90eXBlID0gZ2gtPmRhdGFbMV0gJiBHU01fTUlfVFlQRV9NQVNLOworCWNoYXIgbWlfc3RyaW5nW0dTTTQ4X01JX1NJWkVdOworCisJZ3NtNDhfbWlfdG9fc3RyaW5nKG1pX3N0cmluZywgc2l6ZW9mKG1pX3N0cmluZyksICZnaC0+ZGF0YVsxXSwgZ2gtPmRhdGFbMF0pOworCURFQlVHUChETU0sICItPiBHTU0gSURFTlRJVFkgUkVTUE9OU0U6IG1pX3R5cGU9MHglMDJ4IE1JKCVzKSAiLAorCQltaV90eXBlLCBtaV9zdHJpbmcpOworCisJaWYgKCFjdHgpIHsKKwkJREVCVUdQKERNTSwgImZyb20gdW5rbm93biBUTExJIDB4JTA4eD8hP1xuIiwgbXNnYl90bGxpKG1zZykpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKG1pX3R5cGUpIHsKKwljYXNlIEdTTV9NSV9UWVBFX0lNU0k6CisJCS8qIHdlIGFscmVhZHkgaGF2ZSBhIG1tIGNvbnRleHQgd2l0aCBjdXJyZW50IFRMTEksIGJ1dCBubworCQkgKiBQLVRNU0kgLyBJTVNJIHlldC4gIFdoYXQgd2Ugbm93IG5lZWQgdG8gZG8gaXMgdG8gZmlsbAorCQkgKiB0aGlzIGluaXRpYWwgY29udGV4dCB3aXRoIGRhdGEgZnJvbSB0aGUgSExSICovCisJCXN0cm5jcHkoY3R4LT5pbXNpLCBtaV9zdHJpbmcsIHNpemVvZihjdHgtPmltZWkpKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fTUlfVFlQRV9JTUVJOgorCQlzdHJuY3B5KGN0eC0+aW1laSwgbWlfc3RyaW5nLCBzaXplb2YoY3R4LT5pbWVpKSk7CisJCWJyZWFrOworCWNhc2UgR1NNX01JX1RZUEVfSU1FSVNWOgorCQlicmVhazsKKwl9CisKKwlERUJVR1BDKERNTSwgIlxuIik7CisJLyogQ2hlY2sgaWYgd2UgY2FuIGxldCB0aGUgbW9iaWxlIHN0YXRpb24gZW50ZXIgKi8KKwlyZXR1cm4gZ3NtNDhfZ21tX2F1dGhvcml6ZShjdHgpOworfQorCitzdGF0aWMgdm9pZCBhdHRhY2hfcmVqX2NiKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNnc25fbW1fY3R4ICpjdHggPSBkYXRhOworCisJZ3NtNDhfdHhfZ21tX2F0dF9yZWooY3R4LCBHTU1fQ0FVU0VfTVNfSURfTk9UX0RFUklWRUQpOworCWN0eC0+bW1fc3RhdGUgPSBHTU1fREVSRUdJU1RFUkVEOworCS8qIEZJWE1FOiByZWxlYXNlIHRoZSBjb250ZXh0ICovCit9CisKK3N0YXRpYyB2b2lkIHNjaGVkdWxlX3JlamVjdChzdHJ1Y3Qgc2dzbl9tbV9jdHggKmN0eCkKK3sKKwljdHgtPlQgPSAzMzcwOworCWN0eC0+dGltZXIuY2IgPSBhdHRhY2hfcmVqX2NiOworCWN0eC0+dGltZXIuZGF0YSA9IGN0eDsKKwlic2Nfc2NoZWR1bGVfdGltZXIoJmN0eC0+dGltZXIsIDYsIDApOworfQorCisvKiBTZWN0aW9uIDkuNC4xIEF0dGFjaCByZXF1ZXN0ICovCitzdGF0aWMgaW50IGdzbTQ4X3J4X2dtbV9hdHRfcmVxKHN0cnVjdCBzZ3NuX21tX2N0eCAqbW1jdHgsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX2dtbWgobXNnKTsKKwl1aW50OF90ICpjdXIgPSBnaC0+ZGF0YSwgKm1zbmMsICptaSwgKm9sZF9yYV9pbmZvOworCXVpbnQ4X3QgbXNuY19sZW4sIGF0dF90eXBlLCBtaV9sZW4sIG1pX3R5cGU7CisJdWludDE2X3QgZHJ4X3BhcjsKKwl1aW50MzJfdCB0bXNpOworCWNoYXIgbWlfc3RyaW5nW0dTTTQ4X01JX1NJWkVdOworCXN0cnVjdCBncHJzX3JhX2lkIHJhX2lkOworCXVpbnQxNl90IGNpZDsKKwlzdHJ1Y3Qgc2dzbl9tbV9jdHggKmN0eDsKKworCURFQlVHUChETU0sICItPiBHTU0gQVRUQUNIIFJFUVVFU1QgIik7CisKKwkvKiBBcyBwZXIgVFMgMDQuMDggQ2hhcHRlciA0LjcuMS40LCB0aGUgYXR0YWNoIHJlcXVlc3QgYXJyaXZlcyBlaXRoZXIKKwkgKiB3aXRoIGEgZm9yZWlnbiBUTExJIChQLVRNU0kgdGhhdCB3YXMgYWxsb2NhdGVkIHRvIHRoZSBNUyBiZWZvcmUpLAorCSAqIG9yIHdpdGggcmFuZG9tIFRMTEkuICovCisKKwljaWQgPSBic3NncF9wYXJzZV9jZWxsX2lkKCZyYV9pZCwgbXNnYl9iY2lkKG1zZykpOworCisJLyogTVMgbmV0d29yayBjYXBhYmlsaXR5IDEwLjUuNS4xMiAqLworCW1zbmNfbGVuID0gKmN1cisrOworCW1zbmMgPSBjdXI7CisJaWYgKG1zbmNfbGVuID4gMikKKwkJZ290byBlcnJfaW52YWw7CisJY3VyICs9IG1zbmNfbGVuOworCisJLyogYVRUQUNIIFR5cGUgMTAuNS41LjIgKi8KKwlhdHRfdHlwZSA9ICpjdXIrKyAmIDB4MGY7CisKKwkvKiBEUlggcGFyYW1ldGVyIDEwLjUuNS42ICovCisJZHJ4X3BhciA9ICpjdXIrKzsKKwlkcnhfcGFyIHw9ICpjdXIrKyA8PCA4OworCisJLyogTW9iaWxlIElkZW50aXR5IChQLVRNU0kgb3IgSU1TSSkgMTAuNS4xLjQgKi8KKwltaV9sZW4gPSAqY3VyKys7CisJbWkgPSBjdXI7CisJaWYgKG1pX2xlbiA+IDgpCisJCWdvdG8gZXJyX2ludmFsOworCW1pX3R5cGUgPSAqbWkgJiBHU01fTUlfVFlQRV9NQVNLOworCWN1ciArPSBtaV9sZW47CisKKwlnc200OF9taV90b19zdHJpbmcobWlfc3RyaW5nLCBzaXplb2YobWlfc3RyaW5nKSwgbWksIG1pX2xlbik7CisKKwlERUJVR1BDKERNTSwgIk1JKCVzKSB0eXBlPVwiJXNcIiAiLCBtaV9zdHJpbmcsCisJCWdldF92YWx1ZV9zdHJpbmcoZ3Byc19hdHRfdF9zdHJzLCBhdHRfdHlwZSkpOworCisJLyogT2xkIHJvdXRpbmcgYXJlYSBpZGVudGlmaWNhdGlvbiAxMC41LjUuMTUgKi8KKwlvbGRfcmFfaW5mbyA9IGN1cjsKKwljdXIgKz0gNjsKKworCS8qIE1TIFJhZGlvIEFjY2VzcyBDYXBhYmlsaXR5IDEwLjUuNS4xMmEgKi8KKworCS8qIE9wdGlvbmFsOiBPbGQgUC1UTVNJIFNpZ25hdHVyZSwgUmVxdWVzdGVkIFJFQURZIHRpbWVyLCBUTVNJIFN0YXR1cyAqLworCisJc3dpdGNoIChtaV90eXBlKSB7CisJY2FzZSBHU01fTUlfVFlQRV9JTVNJOgorCQkvKiBUcnkgdG8gZmluZCBNTSBjb250ZXh0IGJhc2VkIG9uIElNU0kgKi8KKwkJY3R4ID0gc2dzbl9tbV9jdHhfYnlfaW1zaShtaV9zdHJpbmcpOworCQlpZiAoIWN0eCkgeworI2lmIDAKKwkJCXJldHVybiBnc200OF90eF9nbW1fYXR0X3Jlaihtc2csIEdNTV9DQVVTRV9JTVNJX1VOS05PV04pOworI2Vsc2UKKwkJCS8qIEFzIGEgdGVtb3JhcnkgaGFjaywgd2Ugc2ltcGx5IGFzc3VtZSB0aGF0IHRoZSBJTVNJIGV4aXN0cyAqLworCQkJY3R4ID0gc2dzbl9tbV9jdHhfYWxsb2MoMCwgJnJhX2lkKTsKKwkJCWlmICghY3R4KQorCQkJCXJldHVybiBnc200OF90eF9nbW1fYXR0X3Jlal9vbGRtc2cobXNnLCBHTU1fQ0FVU0VfTkVUX0ZBSUwpOworCQkJc3RybmNweShjdHgtPmltc2ksIG1pX3N0cmluZywgc2l6ZW9mKGN0eC0+aW1zaSkpOworI2VuZGlmCisJCX0KKwkJLyogRklYTUU6IFN0YXJ0IHNvbWUgdGltZXIgKi8KKwkJY3R4LT5tbV9zdGF0ZSA9IEdNTV9DT01NT05fUFJPQ19JTklUOworCQljdHgtPnRsbGkgPSBtc2diX3RsbGkobXNnKTsKKwkJbXNnaWQybW1jdHgoY3R4LCBtc2cpOworCQlicmVhazsKKwljYXNlIEdTTV9NSV9UWVBFX1RNU0k6CisJCW1lbWNweSgmdG1zaSwgbWkrMSwgNCk7CisJCXRtc2kgPSBudG9obCh0bXNpKTsKKwkJLyogVHJ5IHRvIGZpbmQgTU0gY29udGV4dCBiYXNlZCBvbiBQLVRNU0kgKi8KKwkJY3R4ID0gc2dzbl9tbV9jdHhfYnlfcHRtc2kodG1zaSk7CisJCWlmICghY3R4KSB7CisJCQljdHggPSBzZ3NuX21tX2N0eF9hbGxvYyhtc2diX3RsbGkobXNnKSwgJnJhX2lkKTsKKwkJCS8qIEZJWE1FOiBTdGFydCBzb21lIHRpbWVyICovCisJCQljdHgtPm1tX3N0YXRlID0gR01NX0NPTU1PTl9QUk9DX0lOSVQ7CisJCQljdHgtPnRsbGkgPSBtc2diX3RsbGkobXNnKTsKKwkJCW1zZ2lkMm1tY3R4KGN0eCwgbXNnKTsKKwkJfQorCQljdHgtPnBfdG1zaSA9IHRtc2k7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwkvKiBVcGRhdGUgTU0gQ29udGV4dCB3aXRoIGN1cnJpZW50IFJBIGFuZCBDZWxsIElEICovCisJY3R4LT5yYSA9IHJhX2lkOworCWN0eC0+Y2VsbF9pZCA9IGNpZDsKKyNpZiAwCisJLyogQWxsb2NhdGUgYSBuZXcgUC1UTVNJICgrIFAtVE1TSSBzaWduYXR1cmUpICovCisJY3R4LT5wX3Rtc2kgPSBzZ3NuX2FsbG9jX3B0bXNpKCk7CisjZW5kaWYKKwkvKiBGSVhNRTogdXBkYXRlIHRoZSBUTExJIHdpdGggdGhlIG5ldyBsb2NhbCBUTExJIGJhc2VkIG9uIHRoZSBQLVRNU0kgKi8KKworCURFQlVHUEMoRE1NLCAiXG4iKTsKKworCXJldHVybiBjdHggPyBnc200OF9nbW1fYXV0aG9yaXplKGN0eCkgOiAwOworCitlcnJfaW52YWw6CisJREVCVUdQQyhETU0sICJcbiIpOworCXJldHVybiBnc200OF90eF9nbW1fYXR0X3Jlal9vbGRtc2cobXNnLCBHTU1fQ0FVU0VfU0VNX0lOQ09SUl9NU0cpOworfQorCisvKiBTZWN0aW9uIDQuNy40LjEgLyA5LjQuNS4yIE1PIERldGFjaCByZXF1ZXN0ICovCitzdGF0aWMgaW50IGdzbTQ4X3J4X2dtbV9kZXRfcmVxKHN0cnVjdCBzZ3NuX21tX2N0eCAqY3R4LCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9nbW1oKG1zZyk7CisJdWludDhfdCBkZXRhY2hfdHlwZSwgcG93ZXJfb2ZmOworCisJZGV0YWNoX3R5cGUgPSBnaC0+ZGF0YVswXSAmIDB4NzsKKwlwb3dlcl9vZmYgPSBnaC0+ZGF0YVswXSAmIDB4ODsKKworCS8qIEZJWE1FOiBJbiAyNC4wMDggdGhlcmUgaXMgYW4gb3B0aW9uYWwgUC1UTVNJIGFuZCBQLVRNU0kgc2lnbmF0dXJlIElFICovCisKKwlERUJVR1AoRE1NLCAiLT4gR01NIERFVEFDSCBSRVFVRVNUIFRMTEk9MHglMDh4IHR5cGU9JXMgJXNcbiIsCisJCW1zZ2JfdGxsaShtc2cpLCBnZXRfdmFsdWVfc3RyaW5nKGdwcnNfZGV0X3RfbW9fc3RycywgZGV0YWNoX3R5cGUpLAorCQlwb3dlcl9vZmYgPyAiUG93ZXItb2ZmIiA6ICIiKTsKKworCS8qIE1hcmsgTU0gc3RhdGUgYXMgZGVyZWdpc3RlcmVkICovCisJY3R4LT5tbV9zdGF0ZSA9IEdNTV9ERVJFR0lTVEVSRUQ7CisKKwkvKiBmb3JjZV9zdGJ5ID0gMCAqLworCXJldHVybiBnc200OF90eF9nbW1fZGV0X2FjayhjdHgsIDApOworfQorCisvKiBDaGFwdGVyIDkuNC4xNTogUm91dGluZyBhcmVhIHVwZGF0ZSBhY2NlcHQgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfdHhfZ21tX3JhX3VwZF9hY2soc3RydWN0IHNnc25fbW1fY3R4ICptbSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCXN0cnVjdCBnc200OF9yYV91cGRfYWNrICpydWE7CisKKwlERUJVR1AoRE1NLCAiPC0gUk9VVElORyBBUkVBIFVQREFURSBBQ0NFUFRcbiIpOworCisJbW1jdHgybXNnaWQobXNnLCBtbSk7CisKKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX01NX0dQUlM7CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfR01NX1JBX1VQRF9BQ0s7CisKKwlydWEgPSAoc3RydWN0IGdzbTQ4X3JhX3VwZF9hY2sgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKnJ1YSkpOworCXJ1YS0+Zm9yY2Vfc3RieSA9IDA7CS8qIG5vdCBpbmRpY2F0ZWQgKi8KKwlydWEtPnVwZF9yZXN1bHQgPSAwOwkvKiBSQSB1cGRhdGVkICovCisJcnVhLT5yYV91cGRfdGltZXIgPSBHUFJTX1RNUl9NSU5VVEUgfCAxMDsKKworCWdzbTQ4X2NvbnN0cnVjdF9yYShydWEtPnJhX2lkLmRpZ2l0cywgJm1tLT5yYSk7CisKKwkvKiBPcHRpb246IFAtVE1TSSBzaWduYXR1cmUsIGFsbG9jYXRlZCBQLVRNU0ksIE1TIElELCAuLi4gKi8KKwlyZXR1cm4gZ3NtNDhfZ21tX3NlbmRtc2cobXNnLCAwLCBOVUxMKTsKK30KKworLyogQ2hhcHRlciA5LjQuMTc6IFJvdXRpbmcgYXJlYSB1cGRhdGUgcmVqZWN0ICovCitzdGF0aWMgaW50IGdzbTQ4X3R4X2dtbV9yYV91cGRfcmVqKHN0cnVjdCBtc2diICpvbGRfbXNnLCB1aW50OF90IGNhdXNlKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisKKwlERUJVR1AoRE1NLCAiPC0gUk9VVElORyBBUkVBIFVQREFURSBSRUpFQ1RcbiIpOworCisJZ21tX2NvcHlfaWQobXNnLCBvbGRfbXNnKTsKKworCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSArIDIpOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX01NX0dQUlM7CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfR01NX1JBX1VQRF9SRUo7CisJZ2gtPmRhdGFbMF0gPSBjYXVzZTsKKwlnaC0+ZGF0YVsxXSA9IDA7IC8qID8gKi8KKworCS8qIE9wdGlvbjogUC1UTVNJIHNpZ25hdHVyZSwgYWxsb2NhdGVkIFAtVE1TSSwgTVMgSUQsIC4uLiAqLworCXJldHVybiBnc200OF9nbW1fc2VuZG1zZyhtc2csIDAsIE5VTEwpOworfQorCisvKiBDaGFwdGVyIDkuNC4xNDogUm91dGluZyBhcmVhIHVwZGF0ZSByZXF1ZXN0ICovCitzdGF0aWMgaW50IGdzbTQ4X3J4X2dtbV9yYV91cGRfcmVxKHN0cnVjdCBzZ3NuX21tX2N0eCAqbW1jdHgsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX2dtbWgobXNnKTsKKwl1aW50OF90ICpjdXIgPSBnaC0+ZGF0YTsKKwlzdHJ1Y3QgZ3Byc19yYV9pZCBvbGRfcmFfaWQ7CisJdWludDhfdCB1cGRfdHlwZTsKKworCS8qIFVwZGF0ZSBUeXBlIDEwLjUuNS4xOCAqLworCXVwZF90eXBlID0gKmN1cisrICYgMHgwZjsKKworCURFQlVHUChETU0sICItPiBHTU0gUkEgVVBEQVRFIFJFUVVFU1QgdHlwZT1cIiVzXCIgIiwKKwkJZ2V0X3ZhbHVlX3N0cmluZyhncHJzX3VwZF90X3N0cnMsIHVwZF90eXBlKSk7CisKKwkvKiBPbGQgcm91dGluZyBhcmVhIGlkZW50aWZpY2F0aW9uIDEwLjUuNS4xNSAqLworCWdzbTQ4X3BhcnNlX3JhKCZvbGRfcmFfaWQsIGN1cik7CisJY3VyICs9IDY7CisKKwkvKiBNUyBSYWRpbyBBY2Nlc3MgQ2FwYWJpbGl0eSAxMC41LjUuMTJhICovCisKKwkvKiBPcHRpb25hbDogT2xkIFAtVE1TSSBTaWduYXR1cmUsIFJlcXVlc3RlZCBSRUFEWSB0aW1lciwgVE1TSSBTdGF0dXMsCisJICogRFJYIHBhcmFtZXRlciwgTVMgbmV0d29yayBjYXBhYmlsaXR5ICovCisKKwlzd2l0Y2ggKHVwZF90eXBlKSB7CisJY2FzZSBHUFJTX1VQRF9UX1JBX0xBOgorCWNhc2UgR1BSU19VUERfVF9SQV9MQV9JTVNJX0FUVDoKKwkJREVCVUdQQyhETU0sICIgdW5zdXBwb3J0ZWQgaW4gTW9kZSBJSUksIGlzIHlvdXIgU0kxMyBjb3JydXB0P1xuIik7CisJCXJldHVybiBnc200OF90eF9nbW1fcmFfdXBkX3Jlaihtc2csIEdNTV9DQVVTRV9QUk9UT19FUlJfVU5TUEVDKTsKKwkJYnJlYWs7CisJY2FzZSBHUFJTX1VQRF9UX1JBOgorCWNhc2UgR1BSU19VUERfVF9QRVJJT0RJQzoKKwkJYnJlYWs7CisJfQorCisJLyogTG9vay11cCB0aGUgTU0gY29udGV4dCBiYXNlZCBvbiBvbGQgUkEtSUQgYW5kIFRMTEkgKi8KKwlpZiAoIW1tY3R4IHx8IG1tY3R4LT5tbV9zdGF0ZSA9PSBHTU1fREVSRUdJU1RFUkVEKSB7CisJCS8qIFRoZSBNUyBoYXMgdG8gcGVyZm9ybSBHUFJTIGF0dGFjaCAqLworCQlERUJVR1BDKERNTSwgIiBSRUpFQ1RcbiIpOworCQlyZXR1cm4gZ3NtNDhfdHhfZ21tX3JhX3VwZF9yZWoobXNnLCBHTU1fQ0FVU0VfSU1QTF9ERVRBQ0hFRCk7CisJfQorCisJLyogVXBkYXRlIHRoZSBNTSBjb250ZXh0IHdpdGggdGhlIG5ldyBSQS1JRCAqLworCWJzc2dwX3BhcnNlX2NlbGxfaWQoJm1tY3R4LT5yYSwgbXNnYl9iY2lkKG1zZykpOworCS8qIFVwZGF0ZSB0aGUgTU0gY29udGV4dCB3aXRoIHRoZSBuZXcgVExMSSAqLworCW1tY3R4LT50bGxpID0gbXNnYl90bGxpKG1zZyk7CisJLyogRklYTUU6IFVwZGF0ZSB0aGUgTU0gY29udGV4dCB3aXRoIHRoZSBNUyByYWRpbyBhY2MgY2FwYWJpbGl0aWVzICovCisJLyogRklYTUU6IFVwZGF0ZSB0aGUgTU0gY29udGV4dCB3aXRoIHRoZSBNUyBuZXR3b3JrIGNhcGFiaWxpdGllcyAqLworCisJcmF0ZV9jdHJfaW5jKCZtbWN0eC0+Y3RyZy0+Y3RyW0dNTV9DVFJfUkFfVVBEQVRFXSk7CisKKwlERUJVR1BDKERNTSwgIiBBQ0NFUFRcbiIpOworCXJldHVybiBnc200OF90eF9nbW1fcmFfdXBkX2FjayhtbWN0eCk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfcnhfZ21tX3N0YXR1cyhzdHJ1Y3Qgc2dzbl9tbV9jdHggKm1tY3R4LCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCisJREVCVUdQKERNTSwgIi0+IEdQUlMgTU0gU1RBVFVTIChjYXVzZTogJXMpXG4iLAorCQlnZXRfdmFsdWVfc3RyaW5nKGdtbV9jYXVzZV9uYW1lcywgZ2gtPmRhdGFbMF0pKTsKKworCXJldHVybiAwOworfQorCisvKiBHUFJTIE1vYmlsaXR5IE1hbmFnZW1lbnQgKi8KK3N0YXRpYyBpbnQgZ3NtMDQwOF9yY3ZfZ21tKHN0cnVjdCBzZ3NuX21tX2N0eCAqbW1jdHgsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX2dtbWgobXNnKTsKKwlpbnQgcmM7CisKKwlpZiAoIW1tY3R4ICYmCisJICAgIGdoLT5tc2dfdHlwZSAhPSBHU000OF9NVF9HTU1fQVRUQUNIX1JFUSAmJgorCSAgICBnaC0+bXNnX3R5cGUgIT0gR1NNNDhfTVRfR01NX1JBX1VQRF9SRVEgJiYKKwkgICAgZ2gtPm1zZ190eXBlICE9IEdTTTQ4X01UX0dNTV9BVFRBQ0hfQ09NUEwgJiYKKwkgICAgZ2gtPm1zZ190eXBlICE9IEdTTTQ4X01UX0dNTV9SQV9VUERfQ09NUEwpIHsKKwkJTE9HUChETU0sIExPR0xfTk9USUNFLCAiQ2Fubm90IGhhbmRsZSBHTU0gZm9yIHVua25vd24gTU0gQ1RYXG4iKTsKKwkJLyogRklYTUU6IFNlbmQgR01NX0NBVVNFX0lNUExfREVUQUNIRUQgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisKKwlzd2l0Y2ggKGdoLT5tc2dfdHlwZSkgeworCWNhc2UgR1NNNDhfTVRfR01NX1JBX1VQRF9SRVE6CisJCXJjID0gZ3NtNDhfcnhfZ21tX3JhX3VwZF9yZXEobW1jdHgsIG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfR01NX0FUVEFDSF9SRVE6CisJCXJjID0gZ3NtNDhfcnhfZ21tX2F0dF9yZXEobW1jdHgsIG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfR01NX0lEX1JFU1A6CisJCXJjID0gZ3NtNDhfcnhfZ21tX2lkX3Jlc3AobW1jdHgsIG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfR01NX1NUQVRVUzoKKwkJcmMgPSBnc200OF9yeF9nbW1fc3RhdHVzKG1tY3R4LCBtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX0dNTV9ERVRBQ0hfUkVROgorCQlyYyA9IGdzbTQ4X3J4X2dtbV9kZXRfcmVxKG1tY3R4LCBtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX0dNTV9BVFRBQ0hfQ09NUEw6CisJCS8qIG9ubHkgaW4gY2FzZSBTR1NOIG9mZmVyZWQgbmV3IFAtVE1TSSAqLworCWNhc2UgR1NNNDhfTVRfR01NX1JBX1VQRF9DT01QTDoKKwkJLyogb25seSBpbiBjYXNlIFNHU04gb2ZmZXJlZCBuZXcgUC1UTVNJICovCisJY2FzZSBHU000OF9NVF9HTU1fUFRNU0lfUkVBTExfQ09NUEw6CisJY2FzZSBHU000OF9NVF9HTU1fQVVUSF9DSVBIX1JFU1A6CisJCURFQlVHUChETU0sICJVbmltcGxlbWVudGVkIEdTTSAwNC4wOCBHTU0gbXNnIHR5cGUgMHglMDJ4XG4iLAorCQkJZ2gtPm1zZ190eXBlKTsKKwkJLyogRklYTUU6IFNlbmQgR01NX0NBVVNFX01TR1RfTk9URVhJU1RfTk9USU1QTCAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1AoRE1NLCAiVW5rbm93biBHU00gMDQuMDggR01NIG1zZyB0eXBlIDB4JTAyeFxuIiwKKwkJCWdoLT5tc2dfdHlwZSk7CisJCS8qIEZJWE1FOiBTZW5kIEdNTV9DQVVTRV9NU0dUX05PVEVYSVNUX05PVElNUEwgKi8KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBtc2diX3B1dF9wZHBfYWRkcl9pcHY0KHN0cnVjdCBtc2diICptc2csIHVpbnQzMl90IGlwYWRkcikKK3sKKwl1aW50OF90IHZbNl07CisKKwl2WzBdID0gUERQX1RZUEVfT1JHX0lFVEY7CisJdlsxXSA9IFBEUF9UWVBFX05fSUVURl9JUHY0OworCSoodWludDMyX3QgKikodisyKSA9IGh0b25sKGlwYWRkcik7CisKKwltc2diX3Rsdl9wdXQobXNnLCBHU000OF9JRV9HU01fUERQX0FERFIsIHNpemVvZih2KSwgdik7Cit9CisKK3N0YXRpYyB2b2lkIG1zZ2JfcHV0X3BkcF9hZGRyX3BwcChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXVpbnQ4X3QgdlsyXTsKKworCXZbMF0gPSBQRFBfVFlQRV9PUkdfRVRTSTsKKwl2WzFdID0gUERQX1RZUEVfTl9FVFNJX1BQUDsKKworCW1zZ2JfdGx2X3B1dChtc2csIEdTTTQ4X0lFX0dTTV9QRFBfQUREUiwgc2l6ZW9mKHYpLCB2KTsKK30KKworLyogU2VjdGlvbiA5LjUuMjogQXRpdmF0ZSBQRFAgQ29udGV4dCBBY2NlcHQgKi8KK2ludCBnc200OF90eF9nc21fYWN0X3BkcF9hY2Moc3RydWN0IHNnc25fcGRwX2N0eCAqcGRwKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisJdWludDhfdCB0cmFuc2FjdGlvbl9pZCA9IHBkcC0+dGkgXiAweDg7IC8qIGZsaXAgKi8KKworCURFQlVHUChETU0sICI8LSBBQ1RJVkFURSBQRFAgQ09OVEVYVCBBQ0tcbiIpOworCisJbW1jdHgybXNnaWQobXNnLCBwZHAtPm1tKTsKKworCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfU01fR1BSUyB8ICh0cmFuc2FjdGlvbl9pZCA8PCA0KTsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9HU01fQUNUX1BEUF9BQ0s7CisKKwkvKiBOZWdvdGlhdGVkIExMQyBTQVBJICovCisJbXNnYl92X3B1dChtc2csIHBkcC0+c2FwaSk7CisKKwkvKiBGSVhNRTogY29weSBRb1MgcGFyYW1ldGVycyBmcm9tIG9yaWdpbmFsIHJlcXVlc3QgKi8KKwkvL21zZ2JfbHZfcHV0KG1zZywgcGRwLT5saWItPnFvc19uZWcubCwgcGRwLT5saWItPnFvc19uZWcudik7CisJbXNnYl9sdl9wdXQobXNnLCBzaXplb2YoZGVmYXVsdF9xb3MpLCAodWludDhfdCAqKSZkZWZhdWx0X3Fvcyk7CisKKwkvKiBSYWRpbyBwcmlvcml0eSAxMC41LjcuMiAqLworCW1zZ2Jfdl9wdXQobXNnLCBwZHAtPmxpYi0+cmFkaW9fcHJpKTsKKworCS8qIFBEUCBhZGRyZXNzICovCisJLyogSGlnaGVzdCA0IGJpdHMgb2YgZmlyc3QgYnl0ZSBuZWVkIHRvIGJlIHNldCB0byAxLCBvdGhlcndpc2UKKwkgKiB0aGUgSUUgaXMgaWRlbnRpY2FsIHdpdGggdGhlIDA0LjA4IFBEUCBBZGRyZXNzIElFICovCisJcGRwLT5saWItPmV1YS52WzBdICY9IH4weGYwOworCW1zZ2JfdGx2X3B1dChtc2csIEdTTTQ4X0lFX0dTTV9QRFBfQUREUiwKKwkJICAgICBwZHAtPmxpYi0+ZXVhLmwsIHBkcC0+bGliLT5ldWEudik7CisJcGRwLT5saWItPmV1YS52WzBdIHw9IDB4ZjA7CisKKwkvKiBPcHRpb25hbDogUHJvdG9jb2wgY29uZmlndXJhdGlvbiBvcHRpb25zIChGSVhNRTogd2h5ICdyZXEnKSAqLworCWlmIChwZHAtPmxpYi0+cGNvX3JlcS5sICYmIHBkcC0+bGliLT5wY29fcmVxLnYpCisJCW1zZ2JfdGx2X3B1dChtc2csIEdTTTQ4X0lFX0dTTV9QUk9UT19DT05GX09QVCwKKwkJCSAgICAgcGRwLT5saWItPnBjb19yZXEubCwgcGRwLT5saWItPnBjb19yZXEudik7CisKKwkvKiBPcHRpb25hbDogUGFja2V0IEZsb3cgSWRlbnRpZmllciAqLworCisJcmV0dXJuIGdzbTQ4X2dtbV9zZW5kbXNnKG1zZywgMCwgcGRwLT5tbSk7Cit9CisKKy8qIFNlY3Rpb24gOS41LjM6IEFjdGl2YXRlIFBEUCBDb250ZXh0IHJlamVjdCAqLworaW50IGdzbTQ4X3R4X2dzbV9hY3RfcGRwX3JlaihzdHJ1Y3Qgc2dzbl9tbV9jdHggKm1tLCB1aW50OF90IHRpZCwKKwkJCSAgICAgdWludDhfdCBjYXVzZSwgdWludDhfdCBwY29fbGVuLCB1aW50OF90ICpwY29fdikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCXVpbnQ4X3QgdHJhbnNhY3Rpb25faWQgPSB0aWQgXiAweDg7IC8qIGZsaXAgKi8KKworCURFQlVHUChETU0sICI8LSBBQ1RJVkFURSBQRFAgQ09OVEVYVCBSRUooY2F1c2U9JXUpXG4iLCBjYXVzZSk7CisKKwltbWN0eDJtc2dpZChtc2csIG1tKTsKKworCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfU01fR1BSUyB8ICh0cmFuc2FjdGlvbl9pZCA8PCA0KTsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9HU01fQUNUX1BEUF9SRUo7CisKKwltc2diX3ZfcHV0KG1zZywgY2F1c2UpOworCWlmIChwY29fbGVuICYmIHBjb192KQorCQltc2diX3Rsdl9wdXQobXNnLCBHU000OF9JRV9HU01fUFJPVE9fQ09ORl9PUFQsIHBjb19sZW4sIHBjb192KTsKKworCXJldHVybiBnc200OF9nbW1fc2VuZG1zZyhtc2csIDAsIG1tKTsKK30KKworLyogU2VjdGlvbiA5LjUuOTogRGVhY3RpdmF0ZSBQRFAgQ29udGV4dCBBY2NlcHQgKi8KK2ludCBnc200OF90eF9nc21fZGVhY3RfcGRwX2FjYyhzdHJ1Y3Qgc2dzbl9wZHBfY3R4ICpwZHApCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaDsKKwl1aW50OF90IHRyYW5zYWN0aW9uX2lkID0gcGRwLT50aSBeIDB4ODsgLyogZmxpcCAqLworCisJREVCVUdQKERNTSwgIjwtIERFQUNUSVZBVEUgUERQIENPTlRFWFQgQUNLXG4iKTsKKworCW1tY3R4Mm1zZ2lkKG1zZywgcGRwLT5tbSk7CisKKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX1NNX0dQUlMgfCAodHJhbnNhY3Rpb25faWQgPDwgNCk7CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfR1NNX0RFQUNUX1BEUF9BQ0s7CisKKwlyZXR1cm4gZ3NtNDhfZ21tX3NlbmRtc2cobXNnLCAwLCBwZHAtPm1tKTsKK30KKworLyogU2VjdGlvbiA5LjUuMTogQWN0aXZhdGUgUERQIENvbnRleHQgUmVxdWVzdCAqLworc3RhdGljIGludCBnc200OF9yeF9nc21fYWN0X3BkcF9yZXEoc3RydWN0IHNnc25fbW1fY3R4ICptbWN0eCwKKwkJCQkgICAgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfZ21taChtc2cpOworCXN0cnVjdCBnc200OF9hY3RfcGRwX2N0eF9yZXEgKmFjdF9yZXEgPSAoc3RydWN0IGdzbTQ4X2FjdF9wZHBfY3R4X3JlcSAqKSBnaC0+ZGF0YTsKKwl1aW50OF90IHJlcV9xb3NfbGVuLCByZXFfcGRwYV9sZW47CisJdWludDhfdCAqcmVxX3FvcywgKnJlcV9wZHBhOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXVpbnQ4X3QgdHJhbnNhY3Rpb25faWQgPSAoZ2gtPnByb3RvX2Rpc2NyID4+IDQpOworCXN0cnVjdCBzZ3NuX3BkcF9jdHggKnBkcDsKKworCW1lbXNldCgmdHAsIDAsIHNpemVvZih0cCkpOworCisJREVCVUdQKERNTSwgIi0+IEFDVElWQVRFIFBEUCBDT05URVhUIFJFUTogU0FQST0ldSBOU0FQST0ldSAiLAorCQlhY3RfcmVxLT5yZXFfbGxjX3NhcGksIGFjdF9yZXEtPnJlcV9uc2FwaSk7CisKKwlyYXRlX2N0cl9pbmMoJm1tY3R4LT5jdHJnLT5jdHJbR01NX0NUUl9QRFBfQ1RYX0FDVF0pOworCisJcmVxX3Fvc19sZW4gPSBhY3RfcmVxLT5kYXRhWzBdOworCXJlcV9xb3MgPSBhY3RfcmVxLT5kYXRhICsgMTsJLyogMTAuNS42LjUgKi8KKwlyZXFfcGRwYV9sZW4gPSBhY3RfcmVxLT5kYXRhWzEgKyByZXFfcW9zX2xlbl07CisJcmVxX3BkcGEgPSBhY3RfcmVxLT5kYXRhICsgMSArIHJlcV9xb3NfbGVuICsgMTsJLyogMTAuNS42LjQgKi8KKworCXN3aXRjaCAocmVxX3BkcGFbMF0gJiAweGYpIHsKKwljYXNlIDB4MDoKKwkJREVCVUdQQyhETU0sICJFVFNJICIpOworCQlicmVhazsKKwljYXNlIDB4MToKKwkJREVCVUdQQyhETU0sICJJRVRGICIpOworCQlicmVhazsKKwljYXNlIDB4ZjoKKwkJREVCVUdQQyhETU0sICJFbXB0eSAiKTsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChyZXFfcGRwYVsxXSkgeworCWNhc2UgMHgyMToKKwkJREVCVUdQQyhETU0sICJJUHY0ICIpOworCQlpZiAocmVxX3BkcGFfbGVuID49IDYpIHsKKwkJCXN0cnVjdCBpbl9hZGRyIGlhOworCQkJaWEuc19hZGRyID0gbnRvaGwoKigodWludDMyX3QgKikgKHJlcV9wZHBhKzIpKSk7CisJCQlERUJVR1BDKERNTSwgIiVzICIsIGluZXRfbnRvYShpYSkpOworCQl9CisJCWJyZWFrOworCWNhc2UgMHg1NzoKKwkJREVCVUdQQyhETU0sICJJUHY2ICIpOworCQlpZiAocmVxX3BkcGFfbGVuID49IDE4KSB7CisJCQkvKiBGSVhNRTogcHJpbnQgSVB2NiBhZGRyZXNzICovCisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoJCisJCURFQlVHUEMoRE1NLCAiMHglMDJ4ICIsIHJlcV9wZHBhWzFdKTsKKwkJYnJlYWs7CisJfQorCisJREVCVUdQQyhETU0sICJcbiIpOworCisJLyogcHV0IHRoZSBub24tVExWIGVsZW1lbnRzIGluIHRoZSBUTFYgcGFyc2VyIHN0cnVjdHVyZSB0bworCSAqIHBhc3MgdGhlbSBvbiB0byB0aGUgU0dTTiAvIEdUUCBjb2RlICovCisJdHAubHZbT1NNT19JRV9HU01fUkVRX1FPU10ubGVuID0gcmVxX3Fvc19sZW47CisJdHAubHZbT1NNT19JRV9HU01fUkVRX1FPU10udmFsID0gcmVxX3FvczsKKwl0cC5sdltPU01PX0lFX0dTTV9SRVFfUERQX0FERFJdLmxlbiA9IHJlcV9wZHBhX2xlbjsKKwl0cC5sdltPU01PX0lFX0dTTV9SRVFfUERQX0FERFJdLnZhbCA9IHJlcV9wZHBhOworCisJLyogRklYTUU6ICBkZXRlcm1pbmUgR0dTTiBiYXNlZCBvbiBBUE4gYW5kIHN1YnNjcmlwdGlvbiBvcHRpb25zICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0dTTV9BUE4pKSB7fQorCisJLyogQ2hlY2sgaWYgTlNBUEkgaXMgb3V0IG9mIHJhbmdlIChUUyAwNC42NSAvIDcuMikgKi8KKwlpZiAoYWN0X3JlcS0+cmVxX25zYXBpIDwgNSB8fCBhY3RfcmVxLT5yZXFfbnNhcGkgPiAxNSkgeworCQkvKiBTZW5kIHJlamVjdCB3aXRoIEdTTV9DQVVTRV9JTlZfTUFORF9JTkZPICovCisJCXJldHVybiBnc200OF90eF9nc21fYWN0X3BkcF9yZWoobW1jdHgsIHRyYW5zYWN0aW9uX2lkLAorCQkJCQkJR1NNX0NBVVNFX0lOVl9NQU5EX0lORk8sCisJCQkJCQkwLCBOVUxMKTsKKwl9CisKKwkvKiBDaGVjayBpZiBOU0FQSSBpcyBhbHJlYWR5IGluIHVzZSAqLworCWlmIChzZ3NuX3BkcF9jdHhfYnlfbnNhcGkobW1jdHgsIGFjdF9yZXEtPnJlcV9uc2FwaSkpIHsKKwkJLyogRklYTUU6IHNlbmQgcmVqZWN0IHdpdGggR1NNX0NBVVNFX05TQVBJX0lOX1VTRSAqLworCQlyZXR1cm4gZ3NtNDhfdHhfZ3NtX2FjdF9wZHBfcmVqKG1tY3R4LCB0cmFuc2FjdGlvbl9pZCwKKwkJCQkJCUdTTV9DQVVTRV9OU0FQSV9JTl9VU0UsCisJCQkJCQkwLCBOVUxMKTsKKwl9CisKKyNpZiAxCisJeworCQlzdHJ1Y3Qgc2dzbl9nZ3NuX2N0eCAqZ2dzbiA9IHNnc25fZ2dzbl9jdHhfYnlfaWQoMCk7CisJCWlmICghZ2dzbikgeworCQkJTE9HUChER1BSUywgTE9HTF9FUlJPUiwgIk5vIEdHU04gY29udGV4dCAwIGZvdW5kIVxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlnZ3NuLT5nc24gPSBzZ3NuLT5nc247CisJCXBkcCA9IHNnc25fY3JlYXRlX3BkcF9jdHgoZ2dzbiwgbW1jdHgsIGFjdF9yZXEtPnJlcV9uc2FwaSwgJnRwKTsKKwkJaWYgKCFwZHApCisJCQlyZXR1cm4gLTE7CisJCXBkcC0+c2FwaSA9IGFjdF9yZXEtPnJlcV9sbGNfc2FwaTsKKwkJcGRwLT50aSA9IHRyYW5zYWN0aW9uX2lkOworCQkKKwl9CisJcmV0dXJuIDA7CisjZWxzZQorCXJldHVybiBnc200OF90eF9nc21fYWN0X3BkcF9hY2MobW1jdHgsIHRyYW5zYWN0aW9uX2lkLCBhY3RfcmVxKTsKKyNlbmRpZgorfQorCisvKiBTZWN0aW9uIDkuNS44OiBEZWFjdGl2YXRlIFBEUCBDb250ZXh0IFJlcXVlc3QgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfcnhfZ3NtX2RlYWN0X3BkcF9yZXEoc3RydWN0IHNnc25fbW1fY3R4ICptbSwgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfZ21taChtc2cpOworCXVpbnQ4X3QgdHJhbnNhY3Rpb25faWQgPSAoZ2gtPnByb3RvX2Rpc2NyID4+IDQpOworCXN0cnVjdCBzZ3NuX3BkcF9jdHggKnBkcDsKKworCURFQlVHUChETU0sICItPiBERUFDVElWQVRFIFBEUCBDT05URVhUIFJFUSAoY2F1c2U6ICVzKVxuIiwKKwkJZ2V0X3ZhbHVlX3N0cmluZyhnc21fY2F1c2VfbmFtZXMsIGdoLT5kYXRhWzBdKSk7CisKKwlwZHAgPSBzZ3NuX3BkcF9jdHhfYnlfdGlkKG1tLCB0cmFuc2FjdGlvbl9pZCk7CisJaWYgKCFwZHApIHsKKwkJTE9HUChETU0sIExPR0xfTk9USUNFLCAiRGVhY3RpdmF0ZSBQRFAgQ29udGV4dCBSZXF1ZXN0IGZvciAiCisJCQkibm9uLWV4aXN0aW5nIFBEUCBDb250ZXh0IChJTVNJPSVzLCBUST0ldSlcbiIsCisJCQltbS0+aW1zaSwgdHJhbnNhY3Rpb25faWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gc2dzbl9kZWxldGVfcGRwX2N0eChwZHApOworfQorCitzdGF0aWMgaW50IGdzbTQ4X3J4X2dzbV9zdGF0dXMoc3RydWN0IHNnc25fbW1fY3R4ICpjdHgsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisKKwlERUJVR1AoRE1NLCAiLT4gR1BSUyBTTSBTVEFUVVMgKGNhdXNlOiAlcylcbiIsCisJCWdldF92YWx1ZV9zdHJpbmcoZ3NtX2NhdXNlX25hbWVzLCBnaC0+ZGF0YVswXSkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEdQUlMgU2Vzc2lvbiBNYW5hZ2VtZW50ICovCitzdGF0aWMgaW50IGdzbTA0MDhfcmN2X2dzbShzdHJ1Y3Qgc2dzbl9tbV9jdHggKm1tY3R4LCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9nbW1oKG1zZyk7CisJaW50IHJjOworCisJaWYgKCFtbWN0eCkgeworCQlMT0dQKERNTSwgTE9HTF9OT1RJQ0UsICJDYW5ub3QgaGFuZGxlIFNNIGZvciB1bmtub3duIE1NIENUWFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZ2gtPm1zZ190eXBlKSB7CisJY2FzZSBHU000OF9NVF9HU01fQUNUX1BEUF9SRVE6CisJCXJjID0gZ3NtNDhfcnhfZ3NtX2FjdF9wZHBfcmVxKG1tY3R4LCBtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX0dTTV9ERUFDVF9QRFBfUkVROgorCQlyYyA9IGdzbTQ4X3J4X2dzbV9kZWFjdF9wZHBfcmVxKG1tY3R4LCBtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX0dTTV9TVEFUVVM6CisJCXJjID0gZ3NtNDhfcnhfZ3NtX3N0YXR1cyhtbWN0eCwgbXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9HU01fUkVRX1BEUF9BQ1RfUkVKOgorCWNhc2UgR1NNNDhfTVRfR1NNX0FDVF9BQV9QRFBfUkVROgorCWNhc2UgR1NNNDhfTVRfR1NNX0RFQUNUX0FBX1BEUF9SRVE6CisJCURFQlVHUChETU0sICJVbmltcGxlbWVudGVkIEdTTSAwNC4wOCBHU00gbXNnIHR5cGUgMHglMDJ4XG4iLAorCQkJZ2gtPm1zZ190eXBlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdQKERNTSwgIlVua25vd24gR1NNIDA0LjA4IEdTTSBtc2cgdHlwZSAweCUwMnhcbiIsCisJCQlnaC0+bXNnX3R5cGUpOworCQlicmVhazsKKworCX0KKworCXJldHVybiByYzsKK30KKworLyogTWFpbiBlbnRyeSBwb2ludCBmb3IgaW5jb21pbmcgMDQuMDggR1BSUyBtZXNzYWdlcyAqLworaW50IGdzbTA0MDhfZ3Byc19yY3Ztc2coc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfZ21taChtc2cpOworCXVpbnQ4X3QgcGRpc2MgPSBnaC0+cHJvdG9fZGlzY3IgJiAweDBmOworCXN0cnVjdCBzZ3NuX21tX2N0eCAqbW1jdHg7CisJc3RydWN0IGdwcnNfcmFfaWQgcmFfaWQ7CisJaW50IHJjID0gLUVJTlZBTDsKKworCWJzc2dwX3BhcnNlX2NlbGxfaWQoJnJhX2lkLCBtc2diX2JjaWQobXNnKSk7CisJbW1jdHggPSBzZ3NuX21tX2N0eF9ieV90bGxpKG1zZ2JfdGxsaShtc2cpLCAmcmFfaWQpOworCWlmIChtbWN0eCkgeworCQltc2dpZDJtbWN0eChtbWN0eCwgbXNnKTsKKwkJcmF0ZV9jdHJfaW5jKCZtbWN0eC0+Y3RyZy0+Y3RyW0dNTV9DVFJfUEtUU19TSUdfSU5dKTsKKwl9CisKKwkvKiBNTUNUWCBjYW4gYmUgTlVMTCAqLworCisJc3dpdGNoIChwZGlzYykgeworCWNhc2UgR1NNNDhfUERJU0NfTU1fR1BSUzoKKwkJcmMgPSBnc20wNDA4X3Jjdl9nbW0obW1jdHgsIG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfUERJU0NfU01fR1BSUzoKKwkJcmMgPSBnc20wNDA4X3Jjdl9nc20obW1jdHgsIG1zZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUChETU0sICJVbmtub3duIEdTTSAwNC4wOCBkaXNjcmltaW5hdG9yIDB4JTAyeFxuIiwKKwkJCXBkaXNjKTsKKwkJLyogRklYTUU6IHJldHVybiBzdGF0dXMgbWVzc2FnZSAqLworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfbGxjLmMgYi9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfbGxjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkzYzY1NwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19sbGMuYwpAQCAtMCwwICsxLDU2NCBAQAorLyogR1BSUyBMTEMgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gYXMgcGVyIDNHUFAgVFMgMDQuNjQgKi8KKworLyogKEMpIDIwMDktMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90aW1lci5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfYnNzZ3AuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfbGxjLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jcmMyNC5oPgorCitMTElTVF9IRUFEKGdwcnNfbGxjX2xsZXMpOwordm9pZCAqbGxjX3RhbGxfY3R4OworCisvKiBsb29rdXAgTExDIEVudGl0eSBiYXNlZCBvbiBETENJIChUTExJK1NBUEkgdHVwbGUpICovCitzdGF0aWMgc3RydWN0IGdwcnNfbGxjX2xsZSAqbGxlX2J5X3RsbGlfc2FwaSh1aW50MzJfdCB0bGxpLCB1aW50MzJfdCBzYXBpKQoreworCXN0cnVjdCBncHJzX2xsY19sbGUgKmxsZTsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGxsZSwgJmdwcnNfbGxjX2xsZXMsIGxpc3QpIHsKKwkJaWYgKGxsZS0+dGxsaSA9PSB0bGxpICYmIGxsZS0+c2FwaSA9PSBzYXBpKQorCQkJcmV0dXJuIGxsZTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3Byc19sbGNfbGxlICpsbGVfYWxsb2ModWludDMyX3QgdGxsaSwgdWludDMyX3Qgc2FwaSkKK3sKKwlzdHJ1Y3QgZ3Byc19sbGNfbGxlICpsbGU7CisKKwlsbGUgPSB0YWxsb2NfemVybyhsbGNfdGFsbF9jdHgsIHN0cnVjdCBncHJzX2xsY19sbGUpOworCWlmICghbGxlKQorCQlyZXR1cm4gTlVMTDsKKworCWxsZS0+dGxsaSA9IHRsbGk7CisJbGxlLT5zYXBpID0gc2FwaTsKKwlsbGUtPnN0YXRlID0gR1BSU19MTFNfVU5BU1NJR05FRDsKKwlsbGlzdF9hZGQoJmxsZS0+bGlzdCwgJmdwcnNfbGxjX2xsZXMpOworCisJcmV0dXJuIGxsZTsKK30KKworZW51bSBncHJzX2xsY19jbWQgeworCUdQUlNfTExDX05VTEwsCisJR1BSU19MTENfUlIsCisJR1BSU19MTENfQUNLLAorCUdQUlNfTExDX1JOUiwKKwlHUFJTX0xMQ19TQUNLLAorCUdQUlNfTExDX0RNLAorCUdQUlNfTExDX0RJU0MsCisJR1BSU19MTENfVUEsCisJR1BSU19MTENfU0FCTSwKKwlHUFJTX0xMQ19GUk1SLAorCUdQUlNfTExDX1hJRCwKKwlHUFJTX0xMQ19VSSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGxsY19jbWRfc3Ryc1tdID0geworCXsgR1BSU19MTENfTlVMTCwJIk5VTEwiIH0sCisJeyBHUFJTX0xMQ19SUiwJCSJSUiIgfSwKKwl7IEdQUlNfTExDX0FDSywJCSJBQ0siIH0sCisJeyBHUFJTX0xMQ19STlIsCQkiUk5SIiB9LAorCXsgR1BSU19MTENfU0FDSywJIlNBQ0siIH0sCisJeyBHUFJTX0xMQ19ETSwJCSJETSIgfSwKKwl7IEdQUlNfTExDX0RJU0MsCSJESVNDIiB9LAorCXsgR1BSU19MTENfVUEsCQkiVUEiIH0sCisJeyBHUFJTX0xMQ19TQUJNLAkiU0FCTSIgfSwKKwl7IEdQUlNfTExDX0ZSTVIsCSJGUk1SIiB9LAorCXsgR1BSU19MTENfWElELAkJIlhJRCIgfSwKKwl7IEdQUlNfTExDX1VJLAkJIlVJIiB9LAorCXsgMCwgTlVMTCB9Cit9OworCitzdHJ1Y3QgZ3Byc19sbGNfaGRyX3BhcnNlZCB7CisJdWludDhfdCBzYXBpOworCXVpbnQ4X3QgaXNfY21kOjEsCisJCSBhY2tfcmVxOjEsCisJCSBpc19lbmNyeXB0ZWQ6MTsKKwl1aW50MzJfdCBzZXFfcng7CisJdWludDMyX3Qgc2VxX3R4OworCXVpbnQzMl90IGZjczsKKwl1aW50MzJfdCBmY3NfY2FsYzsKKwl1aW50OF90ICpkYXRhOworCXVpbnQxNl90IGRhdGFfbGVuOworCWVudW0gZ3Byc19sbGNfY21kIGNtZDsKK307CisKKyNkZWZpbmUgTExDX0FMTE9DX1NJWkUgMTYzODQKKyNkZWZpbmUgVUlfSERSX0xFTgkzCisjZGVmaW5lIE4yMDIJCTQKKyNkZWZpbmUgQ1JDMjRfTEVOR1RICTMKKworc3RhdGljIGludCBncHJzX2xsY19mY3ModWludDhfdCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbikKK3sKKwl1aW50MzJfdCBmY3NfY2FsYzsKKworCWZjc19jYWxjID0gY3JjMjRfY2FsYyhJTklUX0NSQzI0LCBkYXRhLCBsZW4pOworCWZjc19jYWxjID0gfmZjc19jYWxjOworCWZjc19jYWxjICY9IDB4ZmZmZmZmOworCisJcmV0dXJuIGZjc19jYWxjOworfQorCitzdGF0aWMgdm9pZCB0MjAwX2V4cGlyZWQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ3Byc19sbGNfbGxlICpsbGUgPSBkYXRhOworCisJLyogOC41LjEuMzogRXhwaXJ5IG9mIFQyMDAgKi8KKworCWlmIChsbGUtPnJldHJhbnNfY3RyID49IGxsZS0+bjIwMCkgeworCQkvKiBGSVhNRTogTExHTS1TVEFUVVMtSU5ELCBMTC1SRUxFQVNFLUlORC9DTkYgKi8KKwkJbGxlLT5zdGF0ZSA9IEdQUlNfTExTX0FTU0lHTkVEX0FETTsKKwl9CisKKwlzd2l0Y2ggKGxsZS0+c3RhdGUpIHsKKwljYXNlIEdQUlNfTExTX0xPQ0FMX0VTVDoKKwkJLyogRklYTUU6IHJldHJhbnNtaXQgU0FCTSAqLworCQkvKiBGSVhNRTogcmUtc3RhcnQgVDIwMCAqLworCQlsbGUtPnJldHJhbnNfY3RyKys7CisJCWJyZWFrOworCWNhc2UgR1BSU19MTFNfTE9DQUxfUkVMOgorCQkvKiBGSVhNRTogcmV0cmFuc21pdCBESVNDICovCisJCS8qIEZJWE1FOiByZS1zdGFydCBUMjAwICovCisJCWxsZS0+cmV0cmFuc19jdHIrKzsKKwkJYnJlYWs7CisJfQorCit9CisKK3N0YXRpYyB2b2lkIHQyMDFfZXhwaXJlZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBncHJzX2xsY19sbGUgKmxsZSA9IGRhdGE7CisKKwlpZiAobGxlLT5yZXRyYW5zX2N0ciA8IGxsZS0+bjIwMCkgeworCQkvKiBGSVhNRTogdHJhbnNtaXQgYXByb3ByaWF0ZSBzdXBlcnZpc29yeSBmcmFtZSAoOC42LjQuMSkgKi8KKwkJLyogRklYTUU6IHNldCB0aW1lciBUMjAxICovCisJCWxsZS0+cmV0cmFuc19jdHIrKzsKKwl9Cit9CisKK2ludCBncHJzX2xsY190eF91KHN0cnVjdCBtc2diICptc2csIHVpbnQ4X3Qgc2FwaSwgaW50IGNvbW1hbmQsCisJCSAgZW51bSBncHJzX2xsY191X2NtZCB1X2NtZCwgaW50IHBmX2JpdCkKK3sKKwl1aW50OF90ICpmY3MsICpsbGNoOworCXVpbnQ4X3QgYWRkciwgY3RybDsKKwl1aW50MzJfdCBmY3NfY2FsYzsKKworCS8qIElkZW50aWZpZXJzIGZyb20gVVA6IChUTExJLCBTQVBJKSArIChCVkNJLCBOU0VJKSAqLworCisJLyogQWRkcmVzcyBGaWVsZCAqLworCWFkZHIgPSBzYXBpICYgMHhmOworCWlmIChjb21tYW5kKQorCQlhZGRyIHw9IDB4NDA7CisKKwkvKiA2LjMgRmlndXJlIDggKi8KKwljdHJsID0gMHhlMCB8IHVfY21kOworCWlmIChwZl9iaXQpCisJCWN0cmwgfD0gMHgxMDsKKworCS8qIHByZXBlbmQgTExDIFVJIGhlYWRlciAqLworCWxsY2ggPSBtc2diX3B1c2gobXNnLCAyKTsKKwlsbGNoWzBdID0gYWRkcjsKKwlsbGNoWzFdID0gY3RybDsKKworCS8qIGFwcGVuZCBGQ1MgdG8gZW5kIG9mIGZyYW1lICovCisJZmNzID0gbXNnYl9wdXQobXNnLCAzKTsKKwlmY3NfY2FsYyA9IGdwcnNfbGxjX2ZjcyhsbGNoLCBmY3MgLSBsbGNoKTsKKwlmY3NbMF0gPSBmY3NfY2FsYyAmIDB4ZmY7CisJZmNzWzFdID0gKGZjc19jYWxjID4+IDgpICYgMHhmZjsKKwlmY3NbMl0gPSAoZmNzX2NhbGMgPj4gMTYpICYgMHhmZjsKKworCS8qIElkZW50aWZpZXJzIHBhc3NlZCBkb3duOiAoQlZDSSwgTlNFSSkgKi8KKworCS8qIFNlbmQgQlNTR1AtREwtVU5JVERBVEEucmVxICovCisJcmV0dXJuIGdwcnNfYnNzZ3BfdHhfZGxfdWQobXNnKTsKK30KKworLyogU2VuZCBYSUQgcmVzcG9uc2UgdG8gTExFICovCitzdGF0aWMgaW50IGdwcnNfbGxjX3R4X3hpZChzdHJ1Y3QgZ3Byc19sbGNfbGxlICpsbGUsIHN0cnVjdCBtc2diICptc2cpCit7CisJLyogY29weSBpZGVudGlmaWVycyBmcm9tIExMRSB0byBlbnN1cmUgbG93ZXIgbGF5ZXJzIGNhbiByb3V0ZSAqLworCW1zZ2JfdGxsaShtc2cpID0gbGxlLT50bGxpOworCW1zZ2JfYnZjaShtc2cpID0gbGxlLT5idmNpOworCW1zZ2JfbnNlaShtc2cpID0gbGxlLT5uc2VpOworCisJcmV0dXJuIGdwcnNfbGxjX3R4X3UobXNnLCBsbGUtPnNhcGksIDAsIEdQUlNfTExDX1VfWElELCAxKTsKK30KKworLyogVHJhbnNtaXQgYSBVSSBmcmFtZSBvdmVyIHRoZSBnaXZlbiBTQVBJICovCitpbnQgZ3Byc19sbGNfdHhfdWkoc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCBzYXBpLCBpbnQgY29tbWFuZCkKK3sKKwlzdHJ1Y3QgZ3Byc19sbGNfbGxlICpsbGU7CisJdWludDhfdCAqZmNzLCAqbGxjaDsKKwl1aW50OF90IGFkZHIsIGN0cmxbMl07CisJdWludDMyX3QgZmNzX2NhbGM7CisJdWludDE2X3QgbnUgPSAwOworCisJLyogSWRlbnRpZmllcnMgZnJvbSBVUDogKFRMTEksIFNBUEkpICsgKEJWQ0ksIE5TRUkpICovCisKKwkvKiBsb29rLXVwIG9yIGNyZWF0ZSB0aGUgTEwgRW50aXR5IGZvciB0aGlzIChUTExJLCBTQVBJKSB0dXBsZSAqLworCWxsZSA9IGxsZV9ieV90bGxpX3NhcGkobXNnYl90bGxpKG1zZyksIHNhcGkpOworCWlmICghbGxlKQorCQlsbGUgPSBsbGVfYWxsb2MobXNnYl90bGxpKG1zZyksIHNhcGkpOworCS8qIFVwZGF0ZSBMTEUncyAoQlZDSSwgTlNFSSkgdHVwbGUgKi8KKwlsbGUtPmJ2Y2kgPSBtc2diX2J2Y2kobXNnKTsKKwlsbGUtPm5zZWkgPSBtc2diX25zZWkobXNnKTsKKworCS8qIEFkZHJlc3MgRmllbGQgKi8KKwlhZGRyID0gc2FwaSAmIDB4ZjsKKwlpZiAoY29tbWFuZCkKKwkJYWRkciB8PSAweDQwOworCisJLyogQ29udHJvbCBGaWVsZCAqLworCWN0cmxbMF0gPSAweGMwOworCWN0cmxbMF0gfD0gbnUgPj4gNjsKKwljdHJsWzFdID0gKG51IDw8IDIpICYgMHhmYzsKKwljdHJsWzFdIHw9IDB4MDE7IC8qIFByb3RlY3RlZCBNb2RlICovCisKKwkvKiBwcmVwZW5kIExMQyBVSSBoZWFkZXIgKi8KKwlsbGNoID0gbXNnYl9wdXNoKG1zZywgMyk7CisJbGxjaFswXSA9IGFkZHI7CisJbGxjaFsxXSA9IGN0cmxbMF07CisJbGxjaFsyXSA9IGN0cmxbMV07CisKKwkvKiBhcHBlbmQgRkNTIHRvIGVuZCBvZiBmcmFtZSAqLworCWZjcyA9IG1zZ2JfcHV0KG1zZywgMyk7CisJZmNzX2NhbGMgPSBncHJzX2xsY19mY3MobGxjaCwgZmNzIC0gbGxjaCk7CisJZmNzWzBdID0gZmNzX2NhbGMgJiAweGZmOworCWZjc1sxXSA9IChmY3NfY2FsYyA+PiA4KSAmIDB4ZmY7CisJZmNzWzJdID0gKGZjc19jYWxjID4+IDE2KSAmIDB4ZmY7CisKKwkvKiBJZGVudGlmaWVycyBwYXNzZWQgZG93bjogKEJWQ0ksIE5TRUkpICovCisKKwkvKiBTZW5kIEJTU0dQLURMLVVOSVREQVRBLnJlcSAqLworCXJldHVybiBncHJzX2Jzc2dwX3R4X2RsX3VkKG1zZyk7Cit9CisKK3N0YXRpYyB2b2lkIGdwcnNfbGxjX2hkcl9kdW1wKHN0cnVjdCBncHJzX2xsY19oZHJfcGFyc2VkICpncGgpCit7CisJREVCVUdQKERMTEMsICJMTEMgU0FQST0ldSAlYyAlYyBGQ1M9MHglMDZ4KCVzKSAiLAorCQlncGgtPnNhcGksIGdwaC0+aXNfY21kID8gJ0MnIDogJ1InLCBncGgtPmFja19yZXEgPyAnQScgOiAnICcsCisJCWdwaC0+ZmNzLCBncGgtPmZjc19jYWxjID09IGdwaC0+ZmNzID8gImNvcnJlY3QiIDogIldST05HIik7CisKKwlpZiAoZ3BoLT5jbWQpCisJCURFQlVHUEMoRExMQywgIkNNRD0lcyAiLCBnZXRfdmFsdWVfc3RyaW5nKGxsY19jbWRfc3RycywgZ3BoLT5jbWQpKTsKKworCWlmIChncGgtPmRhdGEpCisJCURFQlVHUEMoRExMQywgIkRBVEEgIik7CisKKwlERUJVR1BDKERMTEMsICJcbiIpOworfQorc3RhdGljIGludCBncHJzX2xsY19oZHJfcngoc3RydWN0IGdwcnNfbGxjX2hkcl9wYXJzZWQgKmdwaCwKKwkJCSAgIHN0cnVjdCBncHJzX2xsY19sbGUgKmxsZSkKK3sKKwlzd2l0Y2ggKGdwaC0+Y21kKSB7CisJY2FzZSBHUFJTX0xMQ19TQUJNOiAvKiBTZWN0aW9uIDYuNC4xLjEgKi8KKwkJbGxlLT52X3NlbnQgPSBsbGUtPnZfYWNrID0gbGxlLT52X3JlY3YgPSAwOworCQlpZiAobGxlLT5zdGF0ZSA9PSBHUFJTX0xMU19BU1NJR05FRF9BRE0pIHsKKwkJCS8qIHN0YXJ0IHJlLWVzdGFibGlzaG1lbnQgKDguNy4xKSAqLworCQl9CisJCWxsZS0+c3RhdGUgPSBHUFJTX0xMU19SRU1PVEVfRVNUOworCQkvKiBGSVhNRTogU2VuZCBVQSAqLworCQlsbGUtPnN0YXRlID0gR1BSU19MTFNfQUJNOworCQkvKiBGSVhNRTogcHJvY2VzcyBkYXRhICovCisJCWJyZWFrOworCWNhc2UgR1BSU19MTENfRElTQzogLyogU2VjdGlvbiA2LjQuMS4yICovCisJCS8qIEZJWE1FOiBTZW5kIFVBICovCisJCS8qIHRlcm1pbmF0ZSBBQk0gKi8KKwkJbGxlLT5zdGF0ZSA9IEdQUlNfTExTX0FTU0lHTkVEX0FETTsKKwkJYnJlYWs7CisJY2FzZSBHUFJTX0xMQ19VQTogLyogU2VjdGlvbiA2LjQuMS4zICovCisJCWlmIChsbGUtPnN0YXRlID09IEdQUlNfTExTX0xPQ0FMX0VTVCkKKwkJCWxsZS0+c3RhdGUgPSBHUFJTX0xMU19BQk07CisJCWJyZWFrOworCWNhc2UgR1BSU19MTENfRE06IC8qIFNlY3Rpb24gNi40LjEuNDogQUJNIGNhbm5vdCBiZSBwZXJmb3JtZWQgKi8KKwkJaWYgKGxsZS0+c3RhdGUgPT0gR1BSU19MTFNfTE9DQUxfRVNUKQorCQkJbGxlLT5zdGF0ZSA9IEdQUlNfTExTX0FTU0lHTkVEX0FETTsKKwkJYnJlYWs7CisJY2FzZSBHUFJTX0xMQ19GUk1SOiAvKiBTZWN0aW9uIDYuNC4xLjUgKi8KKwkJYnJlYWs7CisJY2FzZSBHUFJTX0xMQ19YSUQ6IC8qIFNlY3Rpb24gNi40LjEuNiAqLworCQkvKiBGSVhNRTogaW1wbGVtZW50IFhJRCBuZWdvdGlhdGlvbiB1c2luZyBTTkRDUCAqLworCQl7CisJCQlzdHJ1Y3QgbXNnYiAqcmVzcDsKKwkJCXVpbnQ4X3QgKnhpZDsKKwkJCXJlc3AgPSBtc2diX2FsbG9jX2hlYWRyb29tKDQwOTYsIDEwMjQsICJMTENfWElEIik7CisJCQl4aWQgPSBtc2diX3B1dChyZXNwLCBncGgtPmRhdGFfbGVuKTsKKwkJCW1lbWNweSh4aWQsIGdwaC0+ZGF0YSwgZ3BoLT5kYXRhX2xlbik7CisJCQlncHJzX2xsY190eF94aWQobGxlLCByZXNwKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogcGFyc2UgYSBHUFJTIExMQyBoZWFkZXIsIGFsc28gY2hlY2sgZm9yIGludmFsaWQgZnJhbWVzICovCitzdGF0aWMgaW50IGdwcnNfbGxjX2hkcl9wYXJzZShzdHJ1Y3QgZ3Byc19sbGNfaGRyX3BhcnNlZCAqZ2hwLAorCQkJICAgICAgdWludDhfdCAqbGxjX2hkciwgaW50IGxlbikKK3sKKwl1aW50OF90ICpjdHJsID0gbGxjX2hkcisxOworCWludCBpc19zYWNrID0gMDsKKwl1bnNpZ25lZCBpbnQgY3JjX2xlbmd0aDsKKwl1aW50MzJfdCBmY3NfY2FsYzsKKworCWlmIChsZW4gPD0gQ1JDMjRfTEVOR1RIKQorCQlyZXR1cm4gLUVJTzsKKworCWNyY19sZW5ndGggPSBsZW4gLSBDUkMyNF9MRU5HVEg7CisKKwlnaHAtPmFja19yZXEgPSAwOworCisJLyogU2VjdGlvbiA1LjU6IEZDUyAqLworCWdocC0+ZmNzID0gKihsbGNfaGRyICsgbGVuIC0gMyk7CisJZ2hwLT5mY3MgfD0gKihsbGNfaGRyICsgbGVuIC0gMikgPDwgODsKKwlnaHAtPmZjcyB8PSAqKGxsY19oZHIgKyBsZW4gLSAxKSA8PCAxNjsKKworCS8qIFNlY3Rpb24gNi4yLjE6IGludmFsaWQgUEQgZmllbGQgKi8KKwlpZiAobGxjX2hkclswXSAmIDB4ODApCisJCXJldHVybiAtRUlPOworCisJLyogVGhpcyBvbmx5IHdvcmtzIGZvciB0aGUgTVMtPlNHU04gZGlyZWN0aW9uICovCisJaWYgKGxsY19oZHJbMF0gJiAweDQwKQorCQlnaHAtPmlzX2NtZCA9IDA7CisJZWxzZQorCQlnaHAtPmlzX2NtZCA9IDE7CisKKwlnaHAtPnNhcGkgPSBsbGNfaGRyWzBdICYgMHhmOworCisJLyogU2VjdGlvbiA2LjIuMzogY2hlY2sgZm9yIHJlc2VydmVkIFNBUEkgKi8KKwlzd2l0Y2ggKGdocC0+c2FwaSkgeworCWNhc2UgMDoKKwljYXNlIDQ6CisJY2FzZSA2OgorCWNhc2UgMHhhOgorCWNhc2UgMHhjOgorCWNhc2UgMHhkOgorCWNhc2UgMHhmOgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKGN0cmxbMF0gJiAweDgwKSA9PSAwKSB7CisJCS8qIEkgKEluZm9ybWF0aW9uIHRyYW5zZmVyICsgU3VwZXJ2aXNvcnkpIGZvcm1hdCAqLworCQl1aW50OF90IGs7CisKKwkJZ2hwLT5kYXRhID0gY3RybCArIDM7CisKKwkJaWYgKGN0cmxbMF0gJiAweDQwKQorCQkJZ2hwLT5hY2tfcmVxID0gMTsKKworCQlnaHAtPnNlcV90eCAgPSAoY3RybFswXSAmIDB4MWYpIDw8IDQ7CisJCWdocC0+c2VxX3R4IHw9IChjdHJsWzFdID4+IDQpOworCisJCWdocC0+c2VxX3J4ICA9IChjdHJsWzFdICYgMHg3KSA8PCA2OworCQlnaHAtPnNlcV9yeCB8PSAoY3RybFsyXSA+PiAyKTsKKworCQlzd2l0Y2ggKGN0cmxbMl0gJiAweDAzKSB7CisJCWNhc2UgMDoKKwkJCWdocC0+Y21kID0gR1BSU19MTENfUlI7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJZ2hwLT5jbWQgPSBHUFJTX0xMQ19BQ0s7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJZ2hwLT5jbWQgPSBHUFJTX0xMQ19STlI7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJZ2hwLT5jbWQgPSBHUFJTX0xMQ19TQUNLOworCQkJayA9IGN0cmxbM10gJiAweDFmOworCQkJZ2hwLT5kYXRhICs9IDEgKyBrOworCQkJYnJlYWs7CisJCX0KKwkJZ2hwLT5kYXRhX2xlbiA9IChsbGNfaGRyICsgbGVuIC0gMykgLSBnaHAtPmRhdGE7CisJfSBlbHNlIGlmICgoY3RybFswXSAmIDB4YzApID09IDB4ODApIHsKKwkJLyogUyAoU3VwZXJ2aXNvcnkpIGZvcm1hdCAqLworCQlnaHAtPmRhdGEgPSBOVUxMOworCQlnaHAtPmRhdGFfbGVuID0gMDsKKworCQlpZiAoY3RybFswXSAmIDB4MjApCisJCQlnaHAtPmFja19yZXEgPSAxOworCQlnaHAtPnNlcV9yeCAgPSAoY3RybFswXSAmIDB4NykgPDwgNjsKKwkJZ2hwLT5zZXFfcnggfD0gKGN0cmxbMV0gPj4gMik7CisKKwkJc3dpdGNoIChjdHJsWzFdICYgMHgwMykgeworCQljYXNlIDA6CisJCQlnaHAtPmNtZCA9IEdQUlNfTExDX1JSOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWdocC0+Y21kID0gR1BSU19MTENfQUNLOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWdocC0+Y21kID0gR1BSU19MTENfUk5SOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWdocC0+Y21kID0gR1BSU19MTENfU0FDSzsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIGlmICgoY3RybFswXSAmIDB4ZTApID09IDB4YzApIHsKKwkJLyogVUkgKFVuY29uZmlybWVkIEluZm9yYW10aW9uKSBmb3JtYXQgKi8KKwkJZ2hwLT5jbWQgPSBHUFJTX0xMQ19VSTsKKwkJZ2hwLT5kYXRhID0gY3RybCArIDI7CisJCWdocC0+ZGF0YV9sZW4gPSAobGxjX2hkciArIGxlbiAtIDMpIC0gZ2hwLT5kYXRhOworCisJCWdocC0+c2VxX3R4ICA9IChjdHJsWzBdICYgMHg3KSA8PCA2OworCQlnaHAtPnNlcV90eCB8PSAoY3RybFsxXSA+PiAyKTsKKwkJaWYgKGN0cmxbMV0gJiAweDAyKSB7CisJCQlnaHAtPmlzX2VuY3J5cHRlZCA9IDE7CisJCQkvKiBGSVhNRTogZW5jcnlwdGlvbiAqLworCQl9CisJCWlmIChjdHJsWzFdICYgMHgwMSkgeworCQkJLyogRkNTIG92ZXIgaGRyICsgYWxsIGluZiBmaWVsZHMgKi8KKwkJfSBlbHNlIHsKKwkJCS8qIEZDUyBvdmVyIGhkciArIE4yMDIgb2N0ZXRzICg0KSAqLworCQkJaWYgKGNyY19sZW5ndGggPiBVSV9IRFJfTEVOICsgTjIwMikKKwkJCQljcmNfbGVuZ3RoID0gVUlfSERSX0xFTiArIE4yMDI7CisJCX0KKwl9IGVsc2UgeworCQkvKiBVIChVbm51bWJlcmVkKSBmb3JtYXQ6IDEgMSAxIFAvRiBNNCBNMyBNMiBNMSAqLworCQlnaHAtPmRhdGEgPSBOVUxMOworCQlnaHAtPmRhdGFfbGVuID0gMDsKKworCQlzd2l0Y2ggKGN0cmxbMF0gJiAweGYpIHsKKwkJY2FzZSBHUFJTX0xMQ19VX05VTExfQ01EOgorCQkJZ2hwLT5jbWQgPSBHUFJTX0xMQ19OVUxMOworCQkJYnJlYWs7CisJCWNhc2UgR1BSU19MTENfVV9ETV9SRVNQOgorCQkJZ2hwLT5jbWQgPSBHUFJTX0xMQ19ETTsKKwkJCWJyZWFrOworCQljYXNlIEdQUlNfTExDX1VfRElTQ19DTUQ6CisJCQlnaHAtPmNtZCA9IEdQUlNfTExDX0RJU0M7CisJCQlicmVhazsKKwkJY2FzZSBHUFJTX0xMQ19VX1VBX1JFU1A6CisJCQlnaHAtPmNtZCA9IEdQUlNfTExDX1VBOworCQkJYnJlYWs7CisJCWNhc2UgR1BSU19MTENfVV9TQUJNX0NNRDoKKwkJCWdocC0+Y21kID0gR1BSU19MTENfU0FCTTsKKwkJCWJyZWFrOworCQljYXNlIEdQUlNfTExDX1VfRlJNUl9SRVNQOgorCQkJZ2hwLT5jbWQgPSBHUFJTX0xMQ19GUk1SOworCQkJYnJlYWs7CisJCWNhc2UgR1BSU19MTENfVV9YSUQ6CisJCQlnaHAtPmNtZCA9IEdQUlNfTExDX1hJRDsKKwkJCWdocC0+ZGF0YSA9IGN0cmwgKyAxOworCQkJZ2hwLT5kYXRhX2xlbiA9IChsbGNfaGRyICsgbGVuIC0gMykgLSBnaHAtPmRhdGE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCisJLyogY2FsY3VsYXRlIHdoYXQgRkNTIHdlIGV4cGVjdCAqLworCWdocC0+ZmNzX2NhbGMgPSBncHJzX2xsY19mY3MobGxjX2hkciwgY3JjX2xlbmd0aCk7CisKKwkvKiBGSVhNRTogcGFyc2Ugc2FjayBmcmFtZSAqLworCWlmIChnaHAtPmNtZCA9PSBHUFJTX0xMQ19TQUNLKSB7CisJCUxPR1AoRExMQywgTE9HTF9OT1RJQ0UsICJVbnN1cHBvcnRlZCBTQUNLIGZyYW1lXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHJlY2VpdmUgYW4gaW5jb21pbmcgTExDIFBEVSAoQlNTR1AtVUwtVU5JVERBVEEtSU5ELCA3LjIuNC4yKSAqLworaW50IGdwcnNfbGxjX3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgdGx2X3BhcnNlZCAqdHYpCit7CisJc3RydWN0IGJzc2dwX3VkX2hkciAqdWRoID0gKHN0cnVjdCBic3NncF91ZF9oZHIgKikgbXNnYl9ic3NncGgobXNnKTsKKwlzdHJ1Y3QgZ3Byc19sbGNfaGRyICpsaCA9IG1zZ2JfbGxjaChtc2cpOworCXN0cnVjdCBncHJzX2xsY19oZHJfcGFyc2VkIGxsaHA7CisJc3RydWN0IGdwcnNfbGxjX2xsZSAqbGxlOworCWludCByYyA9IDA7CisKKwkvKiBJZGVudGlmaWVycyBmcm9tIERPV046IE5TRUksIEJWQ0ksIFRMTEkgKi8KKworCW1lbXNldCgmbGxocCwgMCwgc2l6ZW9mKGxsaHApKTsKKwlyYyA9IGdwcnNfbGxjX2hkcl9wYXJzZSgmbGxocCwgKHVpbnQ4X3QgKikgbGgsIFRMVlBfTEVOKHR2LCBCU1NHUF9JRV9MTENfUERVKSk7CisJZ3Byc19sbGNfaGRyX2R1bXAoJmxsaHApOworCWlmIChyYyA8IDApIHsKKwkJTE9HUChETExDLCBMT0dMX05PVElDRSwgIkVycm9yIGR1cmluZyBMTEMgaGVhZGVyIHBhcnNpbmdcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJaWYgKGxsaHAuZmNzICE9IGxsaHAuZmNzX2NhbGMpIHsKKwkJTE9HUChETExDLCBMT0dMX0lORk8sICJEcm9wcGluZyBmcmFtZSB3aXRoIGludmFsaWQgRkNTXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogZmluZCB0aGUgTExDIEVudGl0eSBmb3IgdGhpcyBUTExJK1NBUEkgdHVwbGUgKi8KKwlsbGUgPSBsbGVfYnlfdGxsaV9zYXBpKG1zZ2JfdGxsaShtc2cpLCBsbGhwLnNhcGkpOworCisJLyogNy4yLjEuMSBMTEMgYmVsb25naW5nIHRvIHVuYXNzaWduZWQgVExMSStTQVBJIHNoYWxsIGJlIGRpc2NhcmRlZCwKKwkgKiBleGNlcHQgVUlEIGFuZCBYSUQgZnJhbWVzIHdpdGggU0FQST0xICovCisJaWYgKCFsbGUpIHsKKwkJaWYgKGxsaHAuc2FwaSA9PSBHUFJTX1NBUElfR01NICYmCisJCSAgICAobGxocC5jbWQgPT0gR1BSU19MTENfWElEIHx8IGxsaHAuY21kID09IEdQUlNfTExDX1VJKSkgeworCQkJLyogRklYTUU6IGRvbid0IHVzZSB0aGUgVExMSSBidXQgdGhlIDB4RkZGRiB1bmFzc2lnbmVkPyAqLworCQkJbGxlID0gbGxlX2FsbG9jKG1zZ2JfdGxsaShtc2cpLCBsbGhwLnNhcGkpOworCQl9IGVsc2UgeworCQkJTE9HUChETExDLCBMT0dMX05PVElDRSwKKwkJCQkidW5rbm93biBUTExJL1NBUEk6IFNpbGVudGx5IGRyb3BwaW5nXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyogVXBkYXRlIExMRSdzIChCVkNJLCBOU0VJKSB0dXBsZSAqLworCWxsZS0+YnZjaSA9IG1zZ2JfYnZjaShtc2cpOworCWxsZS0+bnNlaSA9IG1zZ2JfbnNlaShtc2cpOworCisJLyogUmVjZWl2ZSBhbmQgUHJvY2VzcyB0aGUgYWN0dWFsIExMQyBmcmFtZSAqLworCXJjID0gZ3Byc19sbGNfaGRyX3J4KCZsbGhwLCBsbGUpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCS8qIGxsaHAuZGF0YSBpcyBvbmx5IHNldCB3aGVuIHdlIG5lZWQgdG8gc2VuZCBMTF9bVU5JVF1EQVRBX0lORCB1cCAqLworCWlmIChsbGhwLmRhdGEpIHsKKwkJbXNnYl9nbW1oKG1zZykgPSBsbGhwLmRhdGE7CisJCXN3aXRjaCAobGxocC5zYXBpKSB7CisJCWNhc2UgR1BSU19TQVBJX0dNTToKKwkJCS8qIHNlbmQgTExfVU5JVERBVEFfSU5EIHRvIEdNTSAqLworCQkJcmMgPSBnc20wNDA4X2dwcnNfcmN2bXNnKG1zZyk7CisJCQlicmVhazsKKwkJY2FzZSBHUFJTX1NBUElfVE9NMjoKKwkJY2FzZSBHUFJTX1NBUElfVE9NODoKKwkJCS8qIEZJWE1FOiBzZW5kIExMX0RBVEFfSU5EL0xMX1VOSVREQVRBX0lORCB0byBUT00gKi8KKwkJY2FzZSBHUFJTX1NBUElfU05EQ1AzOgorCQljYXNlIEdQUlNfU0FQSV9TTkRDUDU6CisJCWNhc2UgR1BSU19TQVBJX1NORENQOToKKwkJY2FzZSBHUFJTX1NBUElfU05EQ1AxMToKKwkJCS8qIEZJWE1FOiBzZW5kIExMX0RBVEFfSU5EL0xMX1VOSVREQVRBX0lORCB0byBTTkRDUCAqLworCQljYXNlIEdQUlNfU0FQSV9TTVM6CisJCQkvKiBGSVhNRSAqLworCQlkZWZhdWx0OgorCQkJTE9HUChETExDLCBMT0dMX05PVElDRSwgIlVuc3VwcG9ydGVkIFNBUEkgJXVcbiIsIGxsaHAuc2FwaSk7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19sbGNfdnR5LmMgYi9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfbGxjX3Z0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljN2Y1NTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfbGxjX3Z0eS5jCkBAIC0wLDAgKzEsODEgQEAKKy8qIFZUWSBpbnRlcmZhY2UgZm9yIG91ciBHUFJTIExMQyBpbXBsZW1lbnRhdGlvbiAqLworCisvKiAoQykgMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9yYXRlX2N0ci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19sbGMuaD4KKworI2luY2x1ZGUgPG9zbW9jb20vdnR5L3Z0eS5oPgorI2luY2x1ZGUgPG9zbW9jb20vdnR5L2NvbW1hbmQuaD4KKworc3RydWN0IHZhbHVlX3N0cmluZyBncHJzX2xsY19zdGF0ZV9zdHJzW10gPSB7CisJeyBHUFJTX0xMU19VTkFTU0lHTkVELCAJCSJUTExJIFVuYXNzaWduZWQiIH0sCisJeyBHUFJTX0xMU19BU1NJR05FRF9BRE0sCSJBc3NpZ25lZCIgfSwKKwl7IEdQUlNfTExTX0xPQ0FMX0VTVCwJCSJMb2NhbCBFc3RhYmxpc2htZW50IiB9LAorCXsgR1BSU19MTFNfUkVNT1RFX0VTVCwJCSJSZW1vdGUgRXN0YWJsaXNobWVudCIgfSwKKwl7IEdQUlNfTExTX0FCTSwJCQkiQXN5bmNocm9ub3VzIEJhbGFuY2VkIE1vZGUiIH0sCisJeyBHUFJTX0xMU19MT0NBTF9SRUwsCQkiTG9jYWwgUmVsZWFzZSIgfSwKKwl7IEdQUlNfTExTX1RJTUVSX1JFQywJCSJUaW1lciBSZWNvdmVyeSIgfSwKK307CisKK3N0YXRpYyB2b2lkIHZ0eV9kdW1wX2xsZShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBncHJzX2xsY19sbGUgKmxsZSkKK3sKKwl2dHlfb3V0KHZ0eSwgIlRMTEkgMHglMDh4IFNBUEkgJXUgQlZDST0ldSBOU0VJPSV1OiBTdGF0ZSAlcyVzIiwKKwkJbGxlLT50bGxpLCBsbGUtPnNhcGksIGxsZS0+YnZjaSwgbGxlLT5uc2VpLAorCQlnZXRfdmFsdWVfc3RyaW5nKGdwcnNfbGxjX3N0YXRlX3N0cnMsIGxsZS0+c3RhdGUpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgVnNlbnQ9JXUgVmFjaz0ldSBWcmVjdj0ldSwgTjIwMD0ldSwgUmV0cmFucyBDdHI9JXUlcyIsCisJCWxsZS0+dl9zZW50LCBsbGUtPnZfYWNrLCBsbGUtPnZfcmVjdiwgbGxlLT5uMjAwLAorCQlsbGUtPnJldHJhbnNfY3RyLCBWVFlfTkVXTElORSk7Cit9CisKK0RFRlVOKHNob3dfbGxjLCBzaG93X2xsY19jbWQsCisJInNob3cgbGxjIiwKKwlTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgTExDIHByb3RvY29sIikKK3sKKwlzdHJ1Y3QgZ3Byc19sbGNfbGxlICpsbGU7CisKKwl2dHlfb3V0KHZ0eSwgIlN0YXRlIG9mIExMQyBFbnRpdGllcyVzIiwgVlRZX05FV0xJTkUpOworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGxsZSwgJmdwcnNfbGxjX2xsZXMsIGxpc3QpIHsKKwkJdnR5X2R1bXBfbGxlKHZ0eSwgbGxlKTsKKwl9CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitpbnQgZ3Byc19sbGNfdnR5X2luaXQodm9pZCkKK3sKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnNob3dfbGxjX2NtZCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19ucy5jIGIvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX25zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY1NjNjYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19ucy5jCkBAIC0wLDAgKzEsOTY0IEBACisvKiBHUFJTIE5ldHdvcmtzIFNlcnZpY2UgKE5TKSBtZXNzYWdlcyBvbiB0aGUgR2IgaW50ZXJmYWNlYnZjaSA9IG1zZ2JfYnZjaShtc2cpOworICogM0dQUCBUUyAwOC4xNiB2ZXJzaW9uIDguMC4xIFJlbGVhc2UgMTk5OSAvIEVUU0kgVFMgMTAxIDI5OSBWOC4wLjEgKDIwMDItMDUpICovCisKKy8qIChDKSAyMDA5LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworLyogU29tZSBpbnRyb2R1Y3Rpb24gaW50byBOUzogIE5TIGlzIHVzZWQgdHlwaWNhbGx5IG9uIHRvcCBvZiBmcmFtZSByZWxheSwKKyAqIGJ1dCBpbiB0aGUgaXAuYWNjZXNzIHdvcmxkIGl0IGlzIGVuY2Fwc3VsYXRlZCBpbiBVRFAgcGFja2V0cy4gIEl0IHNlcnZlcworICogYXMgYW4gaW50ZXJtZWRpYXRlIHNoaW0gYmV0d2VuIEJTU0dQIGFuZCB0aGUgdW5kZXJseWluZyBtZWRpdW0uICBJdCBkb2Vzbid0CisgKiBkbyBtdWNoLCBhcGFydCBmcm9tIHByb3ZpZGluZyBjb25nZXN0aW9uIG5vdGlmaWNhdGlvbiBhbmQgc3RhdHVzIGluZGljYXRpb24uCisgKgorICogVGVybXM6CisgKiAJTlMJCU5ldHdvcmsgU2VydmljZQorICoJTlNWQwkJTlMgVmlydHVhbCBDb25uZWN0aW9uCisgKglOU0VJCQlOUyBFbnRpdHkgSWRlbnRpZmllcgorICoJTlNWTAkJTlMgVmlydHVhbCBMaW5rCisgKglOU1ZMSQkJTlMgVmlydHVhbCBMaW5rIElkZW50aWZpZXIKKyAqCUJWQwkJQlNTR1AgVmlydHVhbCBDb25uZWN0aW9uCisgKglCVkNJCQlCU1NHUCBWaXJ0dWFsIENvbm5lY3Rpb24gSWRlbnRpZmllcgorICoJTlNWQ0cJCU5TIFZpcnR1YWwgQ29ubmVjdGlvbiBHb3VwCisgKglCbG9ja2VkCQlOUy1WQyBjYW5ub3QgYmUgdXNlZCBmb3IgdXNlciB0cmFmZmljCisgKglBbGl2ZQkJQWJpbGl0eSBvZiBhIE5TLVZDIHRvIHByb3ZpZGUgY29tbXVuaWNhdGlvbgorICoKKyAqICBUaGVyZSBjYW4gYmUgbXVsdGlwbGUgQlNTR1AgdmlydHVhbCBjb25uZWN0aW9ucyBvdmVyIG9uZSAoZ3JvdXAgb2YpIE5TVkMncy4gIEJTU0dQIHdpbGwKKyAqIHRoZXJlZm9yZSBpZGVudGlmeSB0aGUgQlNTR1AgdmlydHVhbCBjb25uZWN0aW9uIGJ5IGEgQlZDSSBwYXNzZWQgZG93biB0byBOUy4KKyAqIE5TIHRoZW4gaGFzIHRvIGZpcmd1cmUgb3V0IHdoaWNoIE5TVkMncyBhcmUgcmVzcG9uc2libGUgZm9yIHRoaXMgQlZDSS4KKyAqIFRob3NlIG1hcHBpbmdzIGFyZSBhZG1pbmlzdHJhdGl2ZWx5IGNvbmZpZ3VyZWQuCisgKi8KKworLyogVGhpcyBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIGZvbGxvd2luZyBsaW1pdGF0aW9uczoKKyAqICBvIE9ubHkgb25lIE5TLVZDIGZvciBlYWNoIE5TRTogTm8gbG9hZC1zaGFyaW5nIGZ1bmN0aW9uCisgKiAgbyBOU1ZDSSA2NTUzNSBhbmQgNjU1MzQgYXJlIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UKKyAqICBvIE9ubHkgVURQIGlzIHN1cHBvcnRlZCBhcyBvZiBub3csIG5vIGZyYW1lIHJlbGF5IHN1cHBvcnQKKyAqICBvIFRoZSBJUCBTdWItTmV0d29yay1TZXJ2aWNlIChTTlMpIGFzIHNwZWNpZmllZCBpbiA0OC4wMTYgaXMgbm90IGltcGxlbWVudGVkCisgKiAgbyBUaGVyZSBhcmUgbm8gQkxPQ0sgYW5kIFVOQkxPQ0sgdGltZXJzICh5ZXQ/KQorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3JhdGVfY3RyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX25zLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX2Jzc2dwLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX25zX2ZyZ3JlLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zb2NrZXQuaD4KKworc3RhdGljIGNvbnN0IHN0cnVjdCB0bHZfZGVmaW5pdGlvbiBuc19hdHRfdGx2ZGVmID0geworCS5kZWYgPSB7CisJCVtOU19JRV9DQVVTRV0JPSB7IFRMVl9UWVBFX1R2TFYsIDAgfSwKKwkJW05TX0lFX1ZDSV0JPSB7IFRMVl9UWVBFX1R2TFYsIDAgfSwKKwkJW05TX0lFX1BEVV0JPSB7IFRMVl9UWVBFX1R2TFYsIDAgfSwKKwkJW05TX0lFX0JWQ0ldCT0geyBUTFZfVFlQRV9UdkxWLCAwIH0sCisJCVtOU19JRV9OU0VJXQk9IHsgVExWX1RZUEVfVHZMViwgMCB9LAorCX0sCit9OworCitlbnVtIG5zX2N0ciB7CisJTlNfQ1RSX1BLVFNfSU4sCisJTlNfQ1RSX1BLVFNfT1VULAorCU5TX0NUUl9CWVRFU19JTiwKKwlOU19DVFJfQllURVNfT1VULAorCU5TX0NUUl9CTE9DS0VELAorCU5TX0NUUl9ERUFELAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByYXRlX2N0cl9kZXNjIG5zdmNfY3RyX2Rlc2NyaXB0aW9uW10gPSB7CisJeyAicGFja2V0cy5pbiIsICJQYWNrZXRzIGF0IE5TIExldmVsICggSW4pIiB9LAorCXsgInBhY2tldHMub3V0IiwiUGFja2V0cyBhdCBOUyBMZXZlbCAoT3V0KSIgfSwKKwl7ICJieXRlcy5pbiIsCSJCeXRlcyBhdCBOUyBMZXZlbCAgICggSW4pIiB9LAorCXsgImJ5dGVzLm91dCIsCSJCeXRlcyBhdCBOUyBMZXZlbCAgIChPdXQpIiB9LAorCXsgImJsb2NrZWQiLAkiTlMtVkMgQmxvY2sgY291bnQgICAgICAgICIgfSwKKwl7ICJkZWFkIiwJIk5TLVZDIGdvbmUgZGVhZCBjb3VudCAgICAiIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJhdGVfY3RyX2dyb3VwX2Rlc2MgbnN2Y19jdHJnX2Rlc2MgPSB7CisJLmdyb3VwX25hbWVfcHJlZml4ID0gIm5zLm5zdmMiLAorCS5ncm91cF9kZXNjcmlwdGlvbiA9ICJOU1ZDIFBlZXIgU3RhdGlzdGljcyIsCisJLm51bV9jdHIgPSBBUlJBWV9TSVpFKG5zdmNfY3RyX2Rlc2NyaXB0aW9uKSwKKwkuY3RyX2Rlc2MgPSBuc3ZjX2N0cl9kZXNjcmlwdGlvbiwKK307CisKKy8qIExvb2t1cCBzdHJ1Y3QgZ3Byc19uc3ZjIGJhc2VkIG9uIE5TVkNJICovCitzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjX2J5X25zdmNpKHN0cnVjdCBncHJzX25zX2luc3QgKm5zaSwgdWludDE2X3QgbnN2Y2kpCit7CisJc3RydWN0IGdwcnNfbnN2YyAqbnN2YzsKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShuc3ZjLCAmbnNpLT5ncHJzX25zdmNzLCBsaXN0KSB7CisJCWlmIChuc3ZjLT5uc3ZjaSA9PSBuc3ZjaSkKKwkJCXJldHVybiBuc3ZjOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogTG9va3VwIHN0cnVjdCBncHJzX25zdmMgYmFzZWQgb24gTlNWQ0kgKi8KK3N0cnVjdCBncHJzX25zdmMgKm5zdmNfYnlfbnNlaShzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2ksIHVpbnQxNl90IG5zZWkpCit7CisJc3RydWN0IGdwcnNfbnN2YyAqbnN2YzsKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShuc3ZjLCAmbnNpLT5ncHJzX25zdmNzLCBsaXN0KSB7CisJCWlmIChuc3ZjLT5uc2VpID09IG5zZWkpCisJCQlyZXR1cm4gbnN2YzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIExvb2t1cCBzdHJ1Y3QgZ3Byc19uc3ZjIGJhc2VkIG9uIHJlbW90ZSBwZWVyIHNvY2tldCBhZGRyICovCitzdGF0aWMgc3RydWN0IGdwcnNfbnN2YyAqbnN2Y19ieV9yZW1fYWRkcihzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2ksCisJCQkJCSAgc3RydWN0IHNvY2thZGRyX2luICpzaW4pCit7CisJc3RydWN0IGdwcnNfbnN2YyAqbnN2YzsKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShuc3ZjLCAmbnNpLT5ncHJzX25zdmNzLCBsaXN0KSB7CisJCWlmIChuc3ZjLT5pcC5idHNfYWRkci5zaW5fYWRkci5zX2FkZHIgPT0KKwkJCQkJc2luLT5zaW5fYWRkci5zX2FkZHIgJiYKKwkJICAgIG5zdmMtPmlwLmJ0c19hZGRyLnNpbl9wb3J0ID09IHNpbi0+c2luX3BvcnQpCisJCQlyZXR1cm4gbnN2YzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGdwcnNfbnNfdGltZXJfY2Iodm9pZCAqZGF0YSk7CisKK3N0cnVjdCBncHJzX25zdmMgKm5zdmNfY3JlYXRlKHN0cnVjdCBncHJzX25zX2luc3QgKm5zaSwgdWludDE2X3QgbnN2Y2kpCit7CisJc3RydWN0IGdwcnNfbnN2YyAqbnN2YzsKKworCUxPR1AoRE5TLCBMT0dMX0lORk8sICJOU1ZDST0ldSBDcmVhdGluZyBOUy1WQ1xuIiwgbnN2Y2kpOworCisJbnN2YyA9IHRhbGxvY196ZXJvKG5zaSwgc3RydWN0IGdwcnNfbnN2Yyk7CisJbnN2Yy0+bnN2Y2kgPSBuc3ZjaTsKKwkvKiBiZWZvcmUgUkVTRVQgcHJvY2VkdXJlOiBCTE9DS0VEIGFuZCBERUFEICovCisJbnN2Yy0+c3RhdGUgPSBOU0VfU19CTE9DS0VEOworCW5zdmMtPm5zaSA9IG5zaTsKKwluc3ZjLT50aW1lci5jYiA9IGdwcnNfbnNfdGltZXJfY2I7CisJbnN2Yy0+dGltZXIuZGF0YSA9IG5zdmM7CisJbnN2Yy0+Y3RyZyA9IHJhdGVfY3RyX2dyb3VwX2FsbG9jKG5zdmMsICZuc3ZjX2N0cmdfZGVzYywgbnN2Y2kpOworCisJbGxpc3RfYWRkKCZuc3ZjLT5saXN0LCAmbnNpLT5ncHJzX25zdmNzKTsKKworCXJldHVybiBuc3ZjOworfQorCit2b2lkIG5zdmNfZGVsZXRlKHN0cnVjdCBncHJzX25zdmMgKm5zdmMpCit7CisJaWYgKGJzY190aW1lcl9wZW5kaW5nKCZuc3ZjLT50aW1lcikpCisJCWJzY19kZWxfdGltZXIoJm5zdmMtPnRpbWVyKTsKKwlsbGlzdF9kZWwoJm5zdmMtPmxpc3QpOworCXRhbGxvY19mcmVlKG5zdmMpOworfQorCitzdGF0aWMgdm9pZCBuc19kaXNwYXRjaF9zaWduYWwoc3RydWN0IGdwcnNfbnN2YyAqbnN2YywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJCSAgICAgICB1aW50OF90IGNhdXNlKQoreworCXN0cnVjdCBuc19zaWduYWxfZGF0YSBuc3NkOworCisJbnNzZC5uc3ZjID0gbnN2YzsKKwluc3NkLmNhdXNlID0gY2F1c2U7CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfTlMsIHNpZ25hbCwgJm5zc2QpOworfQorCisvKiBTZWN0aW9uIDEwLjMuMiwgVGFibGUgMTMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIG5zX2NhdXNlX3N0cltdID0geworCXsgTlNfQ0FVU0VfVFJBTlNJVF9GQUlMLAkiVHJhbnNpdCBuZXR3b3JrIGZhaWx1cmUiIH0sCisJeyBOU19DQVVTRV9PTV9JTlRFUlZFTlRJT04sIAkiTyZNIGludGVydmVudGlvbiIgfSwKKwl7IE5TX0NBVVNFX0VRVUlQX0ZBSUwsCQkiRXF1aXBtZW50IGZhaWx1cmUiIH0sCisJeyBOU19DQVVTRV9OU1ZDX0JMT0NLRUQsCSJOUy1WQyBibG9ja2VkIiB9LAorCXsgTlNfQ0FVU0VfTlNWQ19VTktOT1dOLAkiTlMtVkMgdW5rbm93biIgfSwKKwl7IE5TX0NBVVNFX0JWQ0lfVU5LTk9XTiwJIkJWQ0kgdW5rbm93biIgfSwKKwl7IE5TX0NBVVNFX1NFTV9JTkNPUlJfUERVLAkiU2VtYW50aWNhbGx5IGluY29ycmVjdCBQRFUiIH0sCisJeyBOU19DQVVTRV9QRFVfSU5DT01QX1BTVEFURSwJIlBEVSBub3QgY29tcGF0aWJsZSB3aXRoIHByb3RvY29sIHN0YXRlIiB9LAorCXsgTlNfQ0FVU0VfUFJPVE9fRVJSX1VOU1BFQywJIlByb3RvY29sIGVycm9yLCB1bnNwZWNpZmllZCIgfSwKKwl7IE5TX0NBVVNFX0lOVkFMX0VTU0VOVF9JRSwJIkludmFsaWQgZXNzZW50aWFsIElFIiB9LAorCXsgTlNfQ0FVU0VfTUlTU0lOR19FU1NFTlRfSUUsCSJNaXNzaW5nIGVzc2VudGlhbCBJRSIgfSwKKwl7IDAsIE5VTEwgfQorfTsKKworY29uc3QgY2hhciAqZ3Byc19uc19jYXVzZV9zdHIoZW51bSBuc19jYXVzZSBjYXVzZSkKK3sKKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhuc19jYXVzZV9zdHIsIGNhdXNlKTsKK30KKworc3RhdGljIGludCBuc2lwX3NlbmRtc2coc3RydWN0IGdwcnNfbnN2YyAqbnN2Yywgc3RydWN0IG1zZ2IgKm1zZyk7CitleHRlcm4gaW50IGdycHNfbnNfZnJncmVfc2VuZG1zZyhzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKKworc3RhdGljIGludCBncHJzX25zX3R4KHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHN0cnVjdCBtc2diICptc2cpCit7CisJaW50IHJldDsKKworCWxvZ19zZXRfY29udGV4dChCU0NfQ1RYX05TVkMsIG5zdmMpOworCisJLyogSW5jcmVtZW50IG51bWJlciBvZiBVcGxpbmsgYnl0ZXMgKi8KKwlyYXRlX2N0cl9pbmMoJm5zdmMtPmN0cmctPmN0cltOU19DVFJfUEtUU19PVVRdKTsKKwlyYXRlX2N0cl9hZGQoJm5zdmMtPmN0cmctPmN0cltOU19DVFJfQllURVNfT1VUXSwgbXNnYl9sMmxlbihtc2cpKTsKKworCXN3aXRjaCAobnN2Yy0+bGwpIHsKKwljYXNlIEdQUlNfTlNfTExfVURQOgorCQlyZXQgPSBuc2lwX3NlbmRtc2cobnN2YywgbXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHUFJTX05TX0xMX0ZSX0dSRToKKwkJcmV0ID0gZ3Byc19uc19mcmdyZV9zZW5kbXNnKG5zdmMsIG1zZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE5TLCBMT0dMX0VSUk9SLCAidW5zdXBwb3J0ZWQgTlMgbGlua2xheWVyICV1XG4iLCBuc3ZjLT5sbCk7CisJCW1zZ2JfZnJlZShtc2cpOworCQlyZXQgPSAtRUlPOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBncHJzX25zX3R4X3NpbXBsZShzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjLCB1aW50OF90IHBkdV90eXBlKQoreworCXN0cnVjdCBtc2diICptc2cgPSBncHJzX25zX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3Byc19uc19oZHIgKm5zaDsKKworCWxvZ19zZXRfY29udGV4dChCU0NfQ1RYX05TVkMsIG5zdmMpOworCisJaWYgKCFtc2cpCisJCXJldHVybiAtRU5PTUVNOworCisJbXNnLT5sMmggPSBtc2diX3B1dChtc2csIHNpemVvZigqbnNoKSk7CisJbnNoID0gKHN0cnVjdCBncHJzX25zX2hkciAqKSBtc2ctPmwyaDsKKworCW5zaC0+cGR1X3R5cGUgPSBwZHVfdHlwZTsKKworCXJldHVybiBncHJzX25zX3R4KG5zdmMsIG1zZyk7Cit9CisKK2ludCBncHJzX25zX3R4X3Jlc2V0KHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHVpbnQ4X3QgY2F1c2UpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdwcnNfbnNfbXNnYl9hbGxvYygpOworCXN0cnVjdCBncHJzX25zX2hkciAqbnNoOworCXVpbnQxNl90IG5zdmNpID0gaHRvbnMobnN2Yy0+bnN2Y2kpOworCXVpbnQxNl90IG5zZWkgPSBodG9ucyhuc3ZjLT5uc2VpKTsKKworCWxvZ19zZXRfY29udGV4dChCU0NfQ1RYX05TVkMsIG5zdmMpOworCisJaWYgKCFtc2cpCisJCXJldHVybiAtRU5PTUVNOworCisJTE9HUChETlMsIExPR0xfSU5GTywgIk5TRUk9JXUgVHggTlMgUkVTRVQgKE5TVkNJPSV1LCBjYXVzZT0lcylcbiIsCisJCW5zdmMtPm5zZWksIG5zdmMtPm5zdmNpLCBncHJzX25zX2NhdXNlX3N0cihjYXVzZSkpOworCisJbXNnLT5sMmggPSBtc2diX3B1dChtc2csIHNpemVvZigqbnNoKSk7CisJbnNoID0gKHN0cnVjdCBncHJzX25zX2hkciAqKSBtc2ctPmwyaDsKKwluc2gtPnBkdV90eXBlID0gTlNfUERVVF9SRVNFVDsKKworCW1zZ2JfdHZsdl9wdXQobXNnLCBOU19JRV9DQVVTRSwgMSwgJmNhdXNlKTsKKwltc2diX3R2bHZfcHV0KG1zZywgTlNfSUVfVkNJLCAyLCAodWludDhfdCAqKSAmbnN2Y2kpOworCW1zZ2JfdHZsdl9wdXQobXNnLCBOU19JRV9OU0VJLCAyLCAodWludDhfdCAqKSAmbnNlaSk7CisKKwlyZXR1cm4gZ3Byc19uc190eChuc3ZjLCBtc2cpOworCit9CisKK2ludCBncHJzX25zX3R4X3N0YXR1cyhzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjLCB1aW50OF90IGNhdXNlLAorCQkgICAgICB1aW50MTZfdCBidmNpLCBzdHJ1Y3QgbXNnYiAqb3JpZ19tc2cpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdwcnNfbnNfbXNnYl9hbGxvYygpOworCXN0cnVjdCBncHJzX25zX2hkciAqbnNoOworCXVpbnQxNl90IG5zdmNpID0gaHRvbnMobnN2Yy0+bnN2Y2kpOworCisJbG9nX3NldF9jb250ZXh0KEJTQ19DVFhfTlNWQywgbnN2Yyk7CisKKwlidmNpID0gaHRvbnMoYnZjaSk7CisKKwlpZiAoIW1zZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlMT0dQKEROUywgTE9HTF9OT1RJQ0UsICJOU0VJPSV1IFR4IE5TIFNUQVRVUyAoTlNWQ0k9JXUsIGNhdXNlPSVzKVxuIiwKKwkJbnN2Yy0+bnNlaSwgbnN2Yy0+bnN2Y2ksIGdwcnNfbnNfY2F1c2Vfc3RyKGNhdXNlKSk7CisKKwltc2ctPmwyaCA9IG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpuc2gpKTsKKwluc2ggPSAoc3RydWN0IGdwcnNfbnNfaGRyICopIG1zZy0+bDJoOworCW5zaC0+cGR1X3R5cGUgPSBOU19QRFVUX1NUQVRVUzsKKworCW1zZ2JfdHZsdl9wdXQobXNnLCBOU19JRV9DQVVTRSwgMSwgJmNhdXNlKTsKKworCS8qIFNlY3Rpb24gOS4yLjcuMTogU3RhdGljIGNvbmRpdGlvbnMgZm9yIE5TLVZDSSAqLworCWlmIChjYXVzZSA9PSBOU19DQVVTRV9OU1ZDX0JMT0NLRUQgfHwKKwkgICAgY2F1c2UgPT0gTlNfQ0FVU0VfTlNWQ19VTktOT1dOKQorCQltc2diX3R2bHZfcHV0KG1zZywgTlNfSUVfVkNJLCAyLCAodWludDhfdCAqKSZuc3ZjaSk7CisKKwkvKiBTZWN0aW9uIDkuMi43LjI6IFN0YXRpYyBjb25kaXRpb25zIGZvciBOUyBQRFUgKi8KKwlzd2l0Y2ggKGNhdXNlKSB7CisJY2FzZSBOU19DQVVTRV9TRU1fSU5DT1JSX1BEVToKKwljYXNlIE5TX0NBVVNFX1BEVV9JTkNPTVBfUFNUQVRFOgorCWNhc2UgTlNfQ0FVU0VfUFJPVE9fRVJSX1VOU1BFQzoKKwljYXNlIE5TX0NBVVNFX0lOVkFMX0VTU0VOVF9JRToKKwljYXNlIE5TX0NBVVNFX01JU1NJTkdfRVNTRU5UX0lFOgorCQltc2diX3R2bHZfcHV0KG1zZywgTlNfSUVfUERVLCBtc2diX2wybGVuKG9yaWdfbXNnKSwKKwkJCSAgICAgIG9yaWdfbXNnLT5sMmgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwkvKiBTZWN0aW9uIDkuMi43LjM6IFN0YXRpYyBjb25kaXRpb25zIGZvciBCVkNJICovCisJaWYgKGNhdXNlID09IE5TX0NBVVNFX0JWQ0lfVU5LTk9XTikKKwkJbXNnYl90dmx2X3B1dChtc2csIE5TX0lFX1ZDSSwgMiwgKHVpbnQ4X3QgKikmYnZjaSk7CisKKwlyZXR1cm4gZ3Byc19uc190eChuc3ZjLCBtc2cpOworfQorCitpbnQgZ3Byc19uc190eF9ibG9jayhzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjLCB1aW50OF90IGNhdXNlKQoreworCXN0cnVjdCBtc2diICptc2cgPSBncHJzX25zX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3Byc19uc19oZHIgKm5zaDsKKwl1aW50MTZfdCBuc3ZjaSA9IGh0b25zKG5zdmMtPm5zdmNpKTsKKworCWxvZ19zZXRfY29udGV4dChCU0NfQ1RYX05TVkMsIG5zdmMpOworCisJaWYgKCFtc2cpCisJCXJldHVybiAtRU5PTUVNOworCisJTE9HUChETlMsIExPR0xfSU5GTywgIk5TRUk9JXUgVHggTlMgQkxPQ0sgKE5TVkNJPSV1LCBjYXVzZT0lcylcbiIsCisJCW5zdmMtPm5zZWksIG5zdmMtPm5zdmNpLCBncHJzX25zX2NhdXNlX3N0cihjYXVzZSkpOworCisJLyogYmUgY29uc2VydmF0aXZlIGFuZCBtYXJrIGl0IGFzIGJsb2NrZWQgZXZlbiBub3chICovCisJbnN2Yy0+c3RhdGUgfD0gTlNFX1NfQkxPQ0tFRDsKKwlyYXRlX2N0cl9pbmMoJm5zdmMtPmN0cmctPmN0cltOU19DVFJfQkxPQ0tFRF0pOworCisJbXNnLT5sMmggPSBtc2diX3B1dChtc2csIHNpemVvZigqbnNoKSk7CisJbnNoID0gKHN0cnVjdCBncHJzX25zX2hkciAqKSBtc2ctPmwyaDsKKwluc2gtPnBkdV90eXBlID0gTlNfUERVVF9CTE9DSzsKKworCW1zZ2JfdHZsdl9wdXQobXNnLCBOU19JRV9DQVVTRSwgMSwgJmNhdXNlKTsKKwltc2diX3R2bHZfcHV0KG1zZywgTlNfSUVfVkNJLCAyLCAodWludDhfdCAqKSAmbnN2Y2kpOworCisJcmV0dXJuIGdwcnNfbnNfdHgobnN2YywgbXNnKTsKK30KKworaW50IGdwcnNfbnNfdHhfdW5ibG9jayhzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjKQoreworCWxvZ19zZXRfY29udGV4dChCU0NfQ1RYX05TVkMsIG5zdmMpOworCUxPR1AoRE5TLCBMT0dMX0lORk8sICJOU0VJPSV1IFR4IE5TIFVOQkxPQ0sgKE5TVkNJPSV1KVxuIiwKKwkJbnN2Yy0+bnNlaSwgbnN2Yy0+bnN2Y2kpOworCisJcmV0dXJuIGdwcnNfbnNfdHhfc2ltcGxlKG5zdmMsIE5TX1BEVVRfVU5CTE9DSyk7Cit9CisKK2ludCBncHJzX25zX3R4X2FsaXZlKHN0cnVjdCBncHJzX25zdmMgKm5zdmMpCit7CisJbG9nX3NldF9jb250ZXh0KEJTQ19DVFhfTlNWQywgbnN2Yyk7CisJTE9HUChETlMsIExPR0xfREVCVUcsICJOU0VJPSV1IFR4IE5TIEFMSVZFIChOU1ZDST0ldSlcbiIsCisJCW5zdmMtPm5zZWksIG5zdmMtPm5zdmNpKTsKKworCXJldHVybiBncHJzX25zX3R4X3NpbXBsZShuc3ZjLCBOU19QRFVUX0FMSVZFKTsKK30KKworaW50IGdwcnNfbnNfdHhfYWxpdmVfYWNrKHN0cnVjdCBncHJzX25zdmMgKm5zdmMpCit7CisJbG9nX3NldF9jb250ZXh0KEJTQ19DVFhfTlNWQywgbnN2Yyk7CisJTE9HUChETlMsIExPR0xfREVCVUcsICJOU0VJPSV1IFR4IE5TIEFMSVZFX0FDSyAoTlNWQ0k9JXUpXG4iLAorCQluc3ZjLT5uc2VpLCBuc3ZjLT5uc3ZjaSk7CisKKwlyZXR1cm4gZ3Byc19uc190eF9zaW1wbGUobnN2YywgTlNfUERVVF9BTElWRV9BQ0spOworfQorCitzdGF0aWMgY29uc3QgZW51bSBuc190aW1lb3V0IHRpbWVyX21vZGVfdG91dFtfTlNWQ19USU1FUl9OUl0gPSB7CisJW05TVkNfVElNRVJfVE5TX1JFU0VUXQk9IE5TX1RPVVRfVE5TX1JFU0VULAorCVtOU1ZDX1RJTUVSX1ROU19BTElWRV0JPSBOU19UT1VUX1ROU19BTElWRSwKKwlbTlNWQ19USU1FUl9UTlNfVEVTVF0JPSBOU19UT1VUX1ROU19URVNULAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgdGltZXJfbW9kZV9zdHJzW10gPSB7CisJeyBOU1ZDX1RJTUVSX1ROU19SRVNFVCwgInRucy1yZXNldCIgfSwKKwl7IE5TVkNfVElNRVJfVE5TX0FMSVZFLCAidG5zLWFsaXZlIiB9LAorCXsgTlNWQ19USU1FUl9UTlNfVEVTVCwgInRucy10ZXN0IiB9LAorCXsgMCwgTlVMTCB9Cit9OworCitzdGF0aWMgdm9pZCBuc3ZjX3N0YXJ0X3RpbWVyKHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIGVudW0gbnN2Y190aW1lcl9tb2RlIG1vZGUpCit7CisJZW51bSBuc190aW1lb3V0IHRvdXQgPSB0aW1lcl9tb2RlX3RvdXRbbW9kZV07CisJdW5zaWduZWQgaW50IHNlY29uZHMgPSBuc3ZjLT5uc2ktPnRpbWVvdXRbdG91dF07CisKKwlsb2dfc2V0X2NvbnRleHQoQlNDX0NUWF9OU1ZDLCBuc3ZjKTsKKwlERUJVR1AoRE5TLCAiTlNFST0ldSBTdGFydGluZyB0aW1lciBpbiBtb2RlICVzICgldSBzZWNvbmRzKVxuIiwKKwkJbnN2Yy0+bnNlaSwgZ2V0X3ZhbHVlX3N0cmluZyh0aW1lcl9tb2RlX3N0cnMsIG1vZGUpLAorCQlzZWNvbmRzKTsKKwkJCisJaWYgKGJzY190aW1lcl9wZW5kaW5nKCZuc3ZjLT50aW1lcikpCisJCWJzY19kZWxfdGltZXIoJm5zdmMtPnRpbWVyKTsKKworCW5zdmMtPnRpbWVyX21vZGUgPSBtb2RlOworCWJzY19zY2hlZHVsZV90aW1lcigmbnN2Yy0+dGltZXIsIHNlY29uZHMsIDApOworfQorCitzdGF0aWMgdm9pZCBncHJzX25zX3RpbWVyX2NiKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGdwcnNfbnN2YyAqbnN2YyA9IGRhdGE7CisJZW51bSBuc190aW1lb3V0IHRvdXQgPSB0aW1lcl9tb2RlX3RvdXRbbnN2Yy0+dGltZXJfbW9kZV07CisJdW5zaWduZWQgaW50IHNlY29uZHMgPSBuc3ZjLT5uc2ktPnRpbWVvdXRbdG91dF07CisKKwlsb2dfc2V0X2NvbnRleHQoQlNDX0NUWF9OU1ZDLCBuc3ZjKTsKKwlERUJVR1AoRE5TLCAiTlNFST0ldSBUaW1lciBleHBpcmVkIGluIG1vZGUgJXMgKCV1IHNlY29uZHMpXG4iLAorCQluc3ZjLT5uc2VpLCBnZXRfdmFsdWVfc3RyaW5nKHRpbWVyX21vZGVfc3RycywgbnN2Yy0+dGltZXJfbW9kZSksCisJCXNlY29uZHMpOworCQkKKwlzd2l0Y2ggKG5zdmMtPnRpbWVyX21vZGUpIHsKKwljYXNlIE5TVkNfVElNRVJfVE5TX0FMSVZFOgorCQkvKiBUbnMtYWxpdmUgY2FzZTogd2UgZXhwaXJlZCB3aXRob3V0IHJlc3BvbnNlICEgKi8KKwkJbnN2Yy0+YWxpdmVfcmV0cmllcysrOworCQlpZiAobnN2Yy0+YWxpdmVfcmV0cmllcyA+CisJCQluc3ZjLT5uc2ktPnRpbWVvdXRbTlNfVE9VVF9UTlNfQUxJVkVfUkVUUklFU10pIHsKKwkJCS8qIG1hcmsgYXMgZGVhZCBhbmQgYmxvY2tlZCAqLworCQkJbnN2Yy0+c3RhdGUgPSBOU0VfU19CTE9DS0VEOworCQkJcmF0ZV9jdHJfaW5jKCZuc3ZjLT5jdHJnLT5jdHJbTlNfQ1RSX0JMT0NLRURdKTsKKwkJCXJhdGVfY3RyX2luYygmbnN2Yy0+Y3RyZy0+Y3RyW05TX0NUUl9ERUFEXSk7CisJCQlMT0dQKEROUywgTE9HTF9OT1RJQ0UsCisJCQkJIk5TRUk9JXUgVG5zLWFsaXZlIGV4cGlyZWQgbW9yZSB0aGVuICIKKwkJCQkiJXUgdGltZXMsIGJsb2NraW5nIE5TLVZDXG4iLCBuc3ZjLT5uc2VpLAorCQkJCW5zdmMtPm5zaS0+dGltZW91dFtOU19UT1VUX1ROU19BTElWRV9SRVRSSUVTXSk7CisJCQluc19kaXNwYXRjaF9zaWduYWwobnN2YywgU19OU19BTElWRV9FWFAsIDApOworCQkJbnNfZGlzcGF0Y2hfc2lnbmFsKG5zdmMsIFNfTlNfQkxPQ0ssIE5TX0NBVVNFX05TVkNfQkxPQ0tFRCk7CisJCQlyZXR1cm47CisJCX0KKwkJLyogVG5zLXRlc3QgY2FzZTogc2VuZCBOUy1BTElWRSBQRFUgKi8KKwkJZ3Byc19uc190eF9hbGl2ZShuc3ZjKTsKKwkJLyogc3RhcnQgVG5zLWFsaXZlIHRpbWVyICovCisJCW5zdmNfc3RhcnRfdGltZXIobnN2YywgTlNWQ19USU1FUl9UTlNfQUxJVkUpOworCQlicmVhazsKKwljYXNlIE5TVkNfVElNRVJfVE5TX1RFU1Q6CisJCS8qIFRucy10ZXN0IGNhc2U6IHNlbmQgTlMtQUxJVkUgUERVICovCisJCWdwcnNfbnNfdHhfYWxpdmUobnN2Yyk7CisJCS8qIHN0YXJ0IFRucy1hbGl2ZSB0aW1lciAodHJhbnNpdGlvbiBpbnRvIGZhc3RlcgorCQkgKiBhbGl2ZSByZXRyYW5zbWlzc2lvbnMpICovCisJCW5zdmMtPmFsaXZlX3JldHJpZXMgPSAwOworCQluc3ZjX3N0YXJ0X3RpbWVyKG5zdmMsIE5TVkNfVElNRVJfVE5TX0FMSVZFKTsKKwkJYnJlYWs7CisJY2FzZSBOU1ZDX1RJTUVSX1ROU19SRVNFVDoKKwkJLyogQ2hhcHRlciA3LjM6IFJlLXNlbmQgdGhlIFJFU0VUICovCisJCWdwcnNfbnNfdHhfcmVzZXQobnN2YywgTlNfQ0FVU0VfT01fSU5URVJWRU5USU9OKTsKKwkJLyogUmUtc3RhcnQgVG5zLXJlc2V0IHRpbWVyICovCisJCW5zdmNfc3RhcnRfdGltZXIobnN2YywgTlNWQ19USU1FUl9UTlNfUkVTRVQpOworCQlicmVhazsKKwljYXNlIF9OU1ZDX1RJTUVSX05SOgorCQlicmVhazsKKwl9Cit9CisKKy8qIFNlY3Rpb24gOS4yLjYgKi8KK3N0YXRpYyBpbnQgZ3Byc19uc190eF9yZXNldF9hY2soc3RydWN0IGdwcnNfbnN2YyAqbnN2YykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3Byc19uc19tc2diX2FsbG9jKCk7CisJc3RydWN0IGdwcnNfbnNfaGRyICpuc2g7CisJdWludDE2X3QgbnN2Y2ksIG5zZWk7CisKKwlsb2dfc2V0X2NvbnRleHQoQlNDX0NUWF9OU1ZDLCBuc3ZjKTsKKwlpZiAoIW1zZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwluc3ZjaSA9IGh0b25zKG5zdmMtPm5zdmNpKTsKKwluc2VpID0gaHRvbnMobnN2Yy0+bnNlaSk7CisKKwltc2ctPmwyaCA9IG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpuc2gpKTsKKwluc2ggPSAoc3RydWN0IGdwcnNfbnNfaGRyICopIG1zZy0+bDJoOworCisJbnNoLT5wZHVfdHlwZSA9IE5TX1BEVVRfUkVTRVRfQUNLOworCisJTE9HUChETlMsIExPR0xfSU5GTywgIk5TRUk9JXUgVHggTlMgUkVTRVQgQUNLIChOU1ZDST0ldSlcbiIsCisJCW5zdmMtPm5zZWksIG5zdmMtPm5zdmNpKTsKKworCW1zZ2JfdHZsdl9wdXQobXNnLCBOU19JRV9WQ0ksIDIsICh1aW50OF90ICopJm5zdmNpKTsKKwltc2diX3R2bHZfcHV0KG1zZywgTlNfSUVfTlNFSSwgMiwgKHVpbnQ4X3QgKikmbnNlaSk7CisKKwlyZXR1cm4gZ3Byc19uc190eChuc3ZjLCBtc2cpOworfQorCisvKiBTZWN0aW9uIDkuMi4xMDogdHJhbnNtaXQgc2lkZSAvIE5TLVVOSVREQVRBLVJFUVVFU1QgcHJpbWl0aXZlICovCitpbnQgZ3Byc19uc19zZW5kbXNnKHN0cnVjdCBncHJzX25zX2luc3QgKm5zaSwgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjOworCXN0cnVjdCBncHJzX25zX2hkciAqbnNoOworCXVpbnQxNl90IGJ2Y2kgPSBtc2diX2J2Y2kobXNnKTsKKworCW5zdmMgPSBuc3ZjX2J5X25zZWkobnNpLCBtc2diX25zZWkobXNnKSk7CisJaWYgKCFuc3ZjKSB7CisJCUxPR1AoRE5TLCBMT0dMX0VSUk9SLCAiVW5hYmxlIHRvIHJlc29sdmUgTlNFSSAldSAiCisJCQkidG8gTlMtVkMhXG4iLCBtc2diX25zZWkobXNnKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlsb2dfc2V0X2NvbnRleHQoQlNDX0NUWF9OU1ZDLCBuc3ZjKTsKKworCWlmICghKG5zdmMtPnN0YXRlICYgTlNFX1NfQUxJVkUpKSB7CisJCUxPR1AoRE5TLCBMT0dMX0VSUk9SLCAiTlNFST0ldSBpcyBub3QgYWxpdmUsIGNhbm5vdCBzZW5kXG4iLAorCQkJbnN2Yy0+bnNlaSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWlmIChuc3ZjLT5zdGF0ZSAmIE5TRV9TX0JMT0NLRUQpIHsKKwkJTE9HUChETlMsIExPR0xfRVJST1IsICJOU0VJPSV1IGlzIGJsb2NrZWQsIGNhbm5vdCBzZW5kXG4iLAorCQkJbnN2Yy0+bnNlaSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJbXNnLT5sMmggPSBtc2diX3B1c2gobXNnLCBzaXplb2YoKm5zaCkgKyAzKTsKKwluc2ggPSAoc3RydWN0IGdwcnNfbnNfaGRyICopIG1zZy0+bDJoOworCWlmICghbnNoKSB7CisJCUxPR1AoRE5TLCBMT0dMX0VSUk9SLCAiTm90IGVub3VnaCBoZWFkcm9vbSBmb3IgTlMgaGVhZGVyXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJbnNoLT5wZHVfdHlwZSA9IE5TX1BEVVRfVU5JVERBVEE7CisJLyogc3BhcmUgb2N0ZXQgaW4gZGF0YVswXSAqLworCW5zaC0+ZGF0YVsxXSA9IGJ2Y2kgPj4gODsKKwluc2gtPmRhdGFbMl0gPSBidmNpICYgMHhmZjsKKworCXJldHVybiBncHJzX25zX3R4KG5zdmMsIG1zZyk7Cit9CisKKy8qIFNlY3Rpb24gOS4yLjEwOiByZWNlaXZlIHNpZGUgKi8KK3N0YXRpYyBpbnQgZ3Byc19uc19yeF91bml0ZGF0YShzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBncHJzX25zX2hkciAqbnNoID0gKHN0cnVjdCBncHJzX25zX2hkciAqKW1zZy0+bDJoOworCXVpbnQxNl90IGJ2Y2k7CisKKwlpZiAobnN2Yy0+c3RhdGUgJiBOU0VfU19CTE9DS0VEKQorCQlyZXR1cm4gZ3Byc19uc190eF9zdGF0dXMobnN2YywgTlNfQ0FVU0VfTlNWQ19CTE9DS0VELAorCQkJCQkgMCwgbXNnKTsKKworCS8qIHNwYXJlIG9jdGV0IGluIGRhdGFbMF0gKi8KKwlidmNpID0gbnNoLT5kYXRhWzFdIDw8IDggfCBuc2gtPmRhdGFbMl07CisJbXNnYl9ic3NncGgobXNnKSA9ICZuc2gtPmRhdGFbM107CisJbXNnYl9idmNpKG1zZykgPSBidmNpOworCisJLyogY2FsbCB1cHBlciBsYXllciAoQlNTR1ApICovCisJcmV0dXJuIG5zdmMtPm5zaS0+Y2IoR1BSU19OU19FVlRfVU5JVF9EQVRBLCBuc3ZjLCBtc2csIGJ2Y2kpOworfQorCisvKiBTZWN0aW9uIDkuMi43ICovCitzdGF0aWMgaW50IGdwcnNfbnNfcnhfc3RhdHVzKHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdwcnNfbnNfaGRyICpuc2ggPSAoc3RydWN0IGdwcnNfbnNfaGRyICopIG1zZy0+bDJoOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXVpbnQ4X3QgY2F1c2U7CisJaW50IHJjOworCisJTE9HUChETlMsIExPR0xfTk9USUNFLCAiTlNFST0ldSBSeCBOUyBTVEFUVVMgIiwgbnN2Yy0+bnNlaSk7CisKKwlyYyA9IHRsdl9wYXJzZSgmdHAsICZuc19hdHRfdGx2ZGVmLCBuc2gtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKSwgMCwgMCk7CisKKwlpZiAoIVRMVlBfUFJFU0VOVCgmdHAsIE5TX0lFX0NBVVNFKSkgeworCQlMT0dQQyhETlMsIExPR0xfSU5GTywgIm1pc3NpbmcgY2F1c2UgSUVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljYXVzZSA9ICpUTFZQX1ZBTCgmdHAsIE5TX0lFX0NBVVNFKTsKKwlMT0dQQyhETlMsIExPR0xfTk9USUNFLCAiY2F1c2U9JXNcbiIsIGdwcnNfbnNfY2F1c2Vfc3RyKGNhdXNlKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogU2VjdGlvbiA3LjMgKi8KK3N0YXRpYyBpbnQgZ3Byc19uc19yeF9yZXNldChzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBncHJzX25zX2hkciAqbnNoID0gKHN0cnVjdCBncHJzX25zX2hkciAqKSBtc2ctPmwyaDsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwl1aW50OF90ICpjYXVzZTsKKwl1aW50MTZfdCAqbnN2Y2ksICpuc2VpOworCWludCByYzsKKworCXJjID0gdGx2X3BhcnNlKCZ0cCwgJm5zX2F0dF90bHZkZWYsIG5zaC0+ZGF0YSwgbXNnYl9sMmxlbihtc2cpLCAwLCAwKTsKKworCWlmICghVExWUF9QUkVTRU5UKCZ0cCwgTlNfSUVfQ0FVU0UpIHx8CisJICAgICFUTFZQX1BSRVNFTlQoJnRwLCBOU19JRV9WQ0kpIHx8CisJICAgICFUTFZQX1BSRVNFTlQoJnRwLCBOU19JRV9OU0VJKSkgeworCQlMT0dQKEROUywgTE9HTF9FUlJPUiwgIk5TIFJFU0VUIE1pc3NpbmcgbWFuZGF0b3J5IElFXG4iKTsKKwkJZ3Byc19uc190eF9zdGF0dXMobnN2YywgTlNfQ0FVU0VfTUlTU0lOR19FU1NFTlRfSUUsIDAsIG1zZyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNhdXNlID0gKHVpbnQ4X3QgKikgVExWUF9WQUwoJnRwLCBOU19JRV9DQVVTRSk7CisJbnN2Y2kgPSAodWludDE2X3QgKikgVExWUF9WQUwoJnRwLCBOU19JRV9WQ0kpOworCW5zZWkgPSAodWludDE2X3QgKikgVExWUF9WQUwoJnRwLCBOU19JRV9OU0VJKTsKKworCUxPR1AoRE5TLCBMT0dMX0lORk8sICJOU0VJPSV1IFJ4IE5TIFJFU0VUIChOU1ZDST0ldSwgY2F1c2U9JXMpXG4iLAorCQluc3ZjLT5uc3ZjaSwgbnN2Yy0+bnNlaSwgZ3Byc19uc19jYXVzZV9zdHIoKmNhdXNlKSk7CisKKwkvKiBNYXJrIE5TLVZDIGFzIGJsb2NrZWQgYW5kIGFsaXZlICovCisJbnN2Yy0+c3RhdGUgPSBOU0VfU19CTE9DS0VEIHwgTlNFX1NfQUxJVkU7CisKKwluc3ZjLT5uc2VpID0gbnRvaHMoKm5zZWkpOworCW5zdmMtPm5zdmNpID0gbnRvaHMoKm5zdmNpKTsKKworCS8qIHN0YXJ0IHRoZSB0ZXN0IHByb2NlZHVyZSAqLworCW5zdmNfc3RhcnRfdGltZXIobnN2YywgTlNWQ19USU1FUl9UTlNfQUxJVkUpOworCisJLyogaW5mb3JtIGludGVyZXN0ZWQgcGFydGllcyBhYm91dCB0aGUgZmFjdCB0aGF0IHRoaXMgTlNWQworCSAqIGhhcyByZWNlaXZlZCBSRVNFVCAqLworCW5zX2Rpc3BhdGNoX3NpZ25hbChuc3ZjLCBTX05TX1JFU0VULCAqY2F1c2UpOworCisJcmV0dXJuIGdwcnNfbnNfdHhfcmVzZXRfYWNrKG5zdmMpOworfQorCitzdGF0aWMgaW50IGdwcnNfbnNfcnhfYmxvY2soc3RydWN0IGdwcnNfbnN2YyAqbnN2Yywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3Byc19uc19oZHIgKm5zaCA9IChzdHJ1Y3QgZ3Byc19uc19oZHIgKikgbXNnLT5sMmg7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJdWludDhfdCAqY2F1c2U7CisJaW50IHJjOworCisJTE9HUChETlMsIExPR0xfSU5GTywgIk5TRUk9JXUgUnggTlMgQkxPQ0tcbiIsIG5zdmMtPm5zZWkpOworCisJbnN2Yy0+c3RhdGUgfD0gTlNFX1NfQkxPQ0tFRDsKKworCXJjID0gdGx2X3BhcnNlKCZ0cCwgJm5zX2F0dF90bHZkZWYsIG5zaC0+ZGF0YSwgbXNnYl9sMmxlbihtc2cpLCAwLCAwKTsKKworCWlmICghVExWUF9QUkVTRU5UKCZ0cCwgTlNfSUVfQ0FVU0UpIHx8CisJICAgICFUTFZQX1BSRVNFTlQoJnRwLCBOU19JRV9WQ0kpKSB7CisJCUxPR1AoRE5TLCBMT0dMX0VSUk9SLCAiTlMgUkVTRVQgTWlzc2luZyBtYW5kYXRvcnkgSUVcbiIpOworCQlncHJzX25zX3R4X3N0YXR1cyhuc3ZjLCBOU19DQVVTRV9NSVNTSU5HX0VTU0VOVF9JRSwgMCwgbXNnKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2F1c2UgPSAodWludDhfdCAqKSBUTFZQX1ZBTCgmdHAsIE5TX0lFX0NBVVNFKTsKKwkvL25zdmNpID0gKHVpbnQxNl90ICopIFRMVlBfVkFMKCZ0cCwgTlNfSUVfVkNJKTsKKworCW5zX2Rpc3BhdGNoX3NpZ25hbChuc3ZjLCBTX05TX0JMT0NLLCAqY2F1c2UpOworCXJhdGVfY3RyX2luYygmbnN2Yy0+Y3RyZy0+Y3RyW05TX0NUUl9CTE9DS0VEXSk7CisKKwlyZXR1cm4gZ3Byc19uc190eF9zaW1wbGUobnN2YywgTlNfUERVVF9CTE9DS19BQ0spOworfQorCisvKiBtYWluIGVudHJ5IHBvaW50LCBoZXJlIGluY29taW5nIE5TIGZyYW1lcyBlbnRlciAqLworaW50IGdwcnNfbnNfcmN2bXNnKHN0cnVjdCBncHJzX25zX2luc3QgKm5zaSwgc3RydWN0IG1zZ2IgKm1zZywKKwkJICAgc3RydWN0IHNvY2thZGRyX2luICpzYWRkciwgZW51bSBncHJzX25zX2xsIGxsKQoreworCXN0cnVjdCBncHJzX25zX2hkciAqbnNoID0gKHN0cnVjdCBncHJzX25zX2hkciAqKSBtc2ctPmwyaDsKKwlzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjOworCWludCByYyA9IDA7CisKKwkvKiBsb29rIHVwIHRoZSBOU1ZDIGJhc2VkIG9uIHNvdXJjZSBhZGRyZXNzICovCisJbnN2YyA9IG5zdmNfYnlfcmVtX2FkZHIobnNpLCBzYWRkcik7CisJaWYgKCFuc3ZjKSB7CisJCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCQl1aW50MTZfdCBuc2VpOworCQlpZiAobnNoLT5wZHVfdHlwZSA9PSBOU19QRFVUX1NUQVRVUykgeworCQkJTE9HUChETlMsIExPR0xfSU5GTywgIklnbm9yaW5nIE5TIFNUQVRVUyBmcm9tICVzOiV1ICIKKwkJCSAgICAgImZvciBub24tZXhpc3RpbmcgTlMtVkNcbiIsCisJCQkgICAgIGluZXRfbnRvYShzYWRkci0+c2luX2FkZHIpLCBudG9ocyhzYWRkci0+c2luX3BvcnQpKTsKKwkJCXJldHVybiAwOworCQl9CisJCS8qIE9ubHkgdGhlIFJFU0VUIHByb2NlZHVyZSBjcmVhdGVzIGEgbmV3IE5TVkMgKi8KKwkJaWYgKG5zaC0+cGR1X3R5cGUgIT0gTlNfUERVVF9SRVNFVCkgeworCQkJLyogU2luY2Ugd2UgaGF2ZSBubyBOU1ZDLCB3ZSBoYXZlIHRvIHVzZSBhIGZha2UgKi8KKwkJCW5zdmMgPSBuc2ktPnVua25vd25fbnN2YzsKKwkJCWxvZ19zZXRfY29udGV4dChCU0NfQ1RYX05TVkMsIG5zdmMpOworCQkJTE9HUChETlMsIExPR0xfSU5GTywgIlJlamVjdGluZyBOUyBQRFUgdHlwZSAweCUweCAiCisJCQkJImZyb20gJXM6JXUgZm9yIG5vbi1leGlzdGluZyBOUy1WQ1xuIiwKKwkJCQluc2gtPnBkdV90eXBlLCBpbmV0X250b2Eoc2FkZHItPnNpbl9hZGRyKSwKKwkJCQludG9ocyhzYWRkci0+c2luX3BvcnQpKTsKKwkJCW5zdmMtPm5zdmNpID0gbnN2Yy0+bnNlaSA9IDB4ZmZmZTsKKwkJCW5zdmMtPmlwLmJ0c19hZGRyID0gKnNhZGRyOworCQkJbnN2Yy0+c3RhdGUgPSBOU0VfU19BTElWRTsKKwkJCW5zdmMtPmxsID0gbGw7CisjaWYgMAorCQkJcmV0dXJuIGdwcnNfbnNfdHhfcmVzZXQobnN2YywgTlNfQ0FVU0VfUERVX0lOQ09NUF9QU1RBVEUpOworI2Vsc2UKKwkJCXJldHVybiBncHJzX25zX3R4X3N0YXR1cyhuc3ZjLAorCQkJCQkJTlNfQ0FVU0VfUERVX0lOQ09NUF9QU1RBVEUsIDAsCisJCQkJCQltc2cpOworI2VuZGlmCisJCX0KKwkJcmMgPSB0bHZfcGFyc2UoJnRwLCAmbnNfYXR0X3RsdmRlZiwgbnNoLT5kYXRhLAorCQkJCQkJbXNnYl9sMmxlbihtc2cpLCAwLCAwKTsKKwkJaWYgKCFUTFZQX1BSRVNFTlQoJnRwLCBOU19JRV9DQVVTRSkgfHwKKwkJICAgICFUTFZQX1BSRVNFTlQoJnRwLCBOU19JRV9WQ0kpIHx8CisJCSAgICAhVExWUF9QUkVTRU5UKCZ0cCwgTlNfSUVfTlNFSSkpIHsKKwkJCUxPR1AoRE5TLCBMT0dMX0VSUk9SLCAiTlMgUkVTRVQgTWlzc2luZyBtYW5kYXRvcnkgSUVcbiIpOworCQkJZ3Byc19uc190eF9zdGF0dXMobnN2YywgTlNfQ0FVU0VfTUlTU0lOR19FU1NFTlRfSUUsIDAsCisJCQkJCSAgbXNnKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCW5zZWkgPSBudG9ocygqKHVpbnQxNl90ICopVExWUF9WQUwoJnRwLCBOU19JRV9OU0VJKSk7CisJCS8qIENoZWNrIGlmIHdlIGFscmVhZHkga25vdyB0aGlzIE5TRUksIHRoZSByZW1vdGUgZW5kIG1pZ2h0CisJCSAqIHNpbXBseSBoYXZlIGNoYW5nZWQgYWRkcmVzc2VzLCBvciBpdCBpcyBhIFNHU04gKi8KKwkJbnN2YyA9IG5zdmNfYnlfbnNlaShuc2ksIG5zZWkpOworCQlpZiAoIW5zdmMpIHsKKwkJCW5zdmMgPSBuc3ZjX2NyZWF0ZShuc2ksIDB4ZmZmZik7CisJCQluc3ZjLT5sbCA9IGxsOworCQkJbG9nX3NldF9jb250ZXh0KEJTQ19DVFhfTlNWQywgbnN2Yyk7CisJCQlMT0dQKEROUywgTE9HTF9JTkZPLCAiQ3JlYXRpbmcgTlMtVkMgZm9yIEJTUyBhdCAlczoldVxuIiwKKwkJCQlpbmV0X250b2Eoc2FkZHItPnNpbl9hZGRyKSwgbnRvaHMoc2FkZHItPnNpbl9wb3J0KSk7CisJCX0KKwkJLyogVXBkYXRlIHRoZSByZW1vdGUgcGVlciBJUCBhZGRyZXNzL3BvcnQgKi8KKwkJbnN2Yy0+aXAuYnRzX2FkZHIgPSAqc2FkZHI7CisJfSBlbHNlCisJCW1zZ2JfbnNlaShtc2cpID0gbnN2Yy0+bnNlaTsKKworCWxvZ19zZXRfY29udGV4dChCU0NfQ1RYX05TVkMsIG5zdmMpOworCisJLyogSW5jcmVtZW50IG51bWJlciBvZiBJbmNvbWluZyBieXRlcyAqLworCXJhdGVfY3RyX2luYygmbnN2Yy0+Y3RyZy0+Y3RyW05TX0NUUl9QS1RTX0lOXSk7CisJcmF0ZV9jdHJfYWRkKCZuc3ZjLT5jdHJnLT5jdHJbTlNfQ1RSX0JZVEVTX0lOXSwgbXNnYl9sMmxlbihtc2cpKTsKKworCXN3aXRjaCAobnNoLT5wZHVfdHlwZSkgeworCWNhc2UgTlNfUERVVF9BTElWRToKKwkJLyogSWYgd2UncmUgZGVhZCBhbmQgYmxvY2tlZCBhbmQgc3VkZGVubHkgcmVjZWl2ZSBhCisJCSAqIE5TLUFMSVZFIG91dCBvZiB0aGUgYmx1ZSwgd2UgbWlnaHQgaGF2ZSBiZWVuIHJlLXN0YXJ0ZWQKKwkJICogYW5kIHNob3VsZCBzZW5kIGEgTlMtUkVTRVQgdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgcmVjb3ZlcnMKKwkJICogZmluZS4gKi8KKwkJaWYgKG5zdmMtPnN0YXRlID09IE5TRV9TX0JMT0NLRUQpCisJCQlyYyA9IGdwcnNfbnNfdHhfcmVzZXQobnN2YywgTlNfQ0FVU0VfUERVX0lOQ09NUF9QU1RBVEUpOworCQllbHNlCisJCQlyYyA9IGdwcnNfbnNfdHhfYWxpdmVfYWNrKG5zdmMpOworCQlicmVhazsKKwljYXNlIE5TX1BEVVRfQUxJVkVfQUNLOgorCQkvKiBzdG9wIFRucy1hbGl2ZSBhbmQgc3RhcnQgVG5zLXRlc3QgKi8KKwkJbnN2Y19zdGFydF90aW1lcihuc3ZjLCBOU1ZDX1RJTUVSX1ROU19URVNUKTsKKwkJaWYgKG5zdmMtPnJlbW90ZV9lbmRfaXNfc2dzbikgeworCQkJLyogRklYTUU6IHRoaXMgc2hvdWxkIGJlIG9uZSBsZXZlbCBoaWdoZXIgKi8KKwkJCWlmIChuc3ZjLT5zdGF0ZSAmIE5TRV9TX0JMT0NLRUQpCisJCQkJcmMgPSBncHJzX25zX3R4X3VuYmxvY2sobnN2Yyk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOU19QRFVUX1VOSVREQVRBOgorCQkvKiBhY3R1YWwgdXNlciBkYXRhICovCisJCXJjID0gZ3Byc19uc19yeF91bml0ZGF0YShuc3ZjLCBtc2cpOworCQlicmVhazsKKwljYXNlIE5TX1BEVVRfU1RBVFVTOgorCQlyYyA9IGdwcnNfbnNfcnhfc3RhdHVzKG5zdmMsIG1zZyk7CisJCWJyZWFrOworCWNhc2UgTlNfUERVVF9SRVNFVDoKKwkJcmMgPSBncHJzX25zX3J4X3Jlc2V0KG5zdmMsIG1zZyk7CisJCWJyZWFrOworCWNhc2UgTlNfUERVVF9SRVNFVF9BQ0s6CisJCUxPR1AoRE5TLCBMT0dMX0lORk8sICJOU0VJPSV1IFJ4IE5TIFJFU0VUIEFDS1xuIiwgbnN2Yy0+bnNlaSk7CisJCS8qIG1hcmsgTlMtVkMgYXMgYmxvY2tlZCArIGFjdGl2ZSAqLworCQluc3ZjLT5zdGF0ZSA9IE5TRV9TX0JMT0NLRUQgfCBOU0VfU19BTElWRTsKKwkJbnN2Yy0+cmVtb3RlX3N0YXRlID0gTlNFX1NfQkxPQ0tFRCB8IE5TRV9TX0FMSVZFOworCQlyYXRlX2N0cl9pbmMoJm5zdmMtPmN0cmctPmN0cltOU19DVFJfQkxPQ0tFRF0pOworCQlpZiAobnN2Yy0+cGVyc2lzdGVudCB8fCBuc3ZjLT5yZW1vdGVfZW5kX2lzX3Nnc24pIHsKKwkJCS8qIHN0b3AgUkVTRVQgdGltZXIgKi8KKwkJCWJzY19kZWxfdGltZXIoJm5zdmMtPnRpbWVyKTsKKwkJfQorCQkvKiBJbml0aWF0ZSBURVNUIHByb2MuOiBTZW5kIEFMSVZFIGFuZCBzdGFydCB0aW1lciAqLworCQlyYyA9IGdwcnNfbnNfdHhfc2ltcGxlKG5zdmMsIE5TX1BEVVRfQUxJVkUpOworCQluc3ZjX3N0YXJ0X3RpbWVyKG5zdmMsIE5TVkNfVElNRVJfVE5TX0FMSVZFKTsKKwkJYnJlYWs7CisJY2FzZSBOU19QRFVUX1VOQkxPQ0s6CisJCS8qIFNlY3Rpb24gNy4yOiB1bmJsb2NraW5nIHByb2NlZHVyZSAqLworCQlMT0dQKEROUywgTE9HTF9JTkZPLCAiTlNFST0ldSBSeCBOUyBVTkJMT0NLXG4iLCBuc3ZjLT5uc2VpKTsKKwkJbnN2Yy0+c3RhdGUgJj0gfk5TRV9TX0JMT0NLRUQ7CisJCW5zX2Rpc3BhdGNoX3NpZ25hbChuc3ZjLCBTX05TX1VOQkxPQ0ssIDApOworCQlyYyA9IGdwcnNfbnNfdHhfc2ltcGxlKG5zdmMsIE5TX1BEVVRfVU5CTE9DS19BQ0spOworCQlicmVhazsKKwljYXNlIE5TX1BEVVRfVU5CTE9DS19BQ0s6CisJCUxPR1AoRE5TLCBMT0dMX0lORk8sICJOU0VJPSV1IFJ4IE5TIFVOQkxPQ0sgQUNLXG4iLCBuc3ZjLT5uc2VpKTsKKwkJLyogbWFyayBOUy1WQyBhcyB1bmJsb2NrZWQgKyBhY3RpdmUgKi8KKwkJbnN2Yy0+c3RhdGUgPSBOU0VfU19BTElWRTsKKwkJbnN2Yy0+cmVtb3RlX3N0YXRlID0gTlNFX1NfQUxJVkU7CisJCW5zX2Rpc3BhdGNoX3NpZ25hbChuc3ZjLCBTX05TX1VOQkxPQ0ssIDApOworCQlicmVhazsKKwljYXNlIE5TX1BEVVRfQkxPQ0s6CisJCXJjID0gZ3Byc19uc19yeF9ibG9jayhuc3ZjLCBtc2cpOworCQlicmVhazsKKwljYXNlIE5TX1BEVVRfQkxPQ0tfQUNLOgorCQlMT0dQKEROUywgTE9HTF9JTkZPLCAiTlNFST0ldSBSeCBOUyBCTE9DSyBBQ0tcbiIsIG5zdmMtPm5zZWkpOworCQkvKiBtYXJrIHJlbW90ZSBOUy1WQyBhcyBibG9ja2VkICsgYWN0aXZlICovCisJCW5zdmMtPnJlbW90ZV9zdGF0ZSA9IE5TRV9TX0JMT0NLRUQgfCBOU0VfU19BTElWRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETlMsIExPR0xfTk9USUNFLCAiTlNFST0ldSBSeCBVbmtub3duIE5TIFBEVSB0eXBlIDB4JTAyeFxuIiwKKwkJCW5zdmMtPm5zZWksIG5zaC0+cGR1X3R5cGUpOworCQlyYyA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0cnVjdCBncHJzX25zX2luc3QgKmdwcnNfbnNfaW5zdGFudGlhdGUoZ3Byc19uc19jYl90ICpjYikKK3sKKwlzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2kgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBncHJzX25zX2luc3QpOworCisJbnNpLT5jYiA9IGNiOworCUlOSVRfTExJU1RfSEVBRCgmbnNpLT5ncHJzX25zdmNzKTsKKwluc2ktPnRpbWVvdXRbTlNfVE9VVF9UTlNfQkxPQ0tdID0gMzsKKwluc2ktPnRpbWVvdXRbTlNfVE9VVF9UTlNfQkxPQ0tfUkVUUklFU10gPSAzOworCW5zaS0+dGltZW91dFtOU19UT1VUX1ROU19SRVNFVF0gPSAzOworCW5zaS0+dGltZW91dFtOU19UT1VUX1ROU19SRVNFVF9SRVRSSUVTXSA9IDM7CisJbnNpLT50aW1lb3V0W05TX1RPVVRfVE5TX1RFU1RdID0gMzA7CisJbnNpLT50aW1lb3V0W05TX1RPVVRfVE5TX0FMSVZFXSA9IDM7CisJbnNpLT50aW1lb3V0W05TX1RPVVRfVE5TX0FMSVZFX1JFVFJJRVNdID0gMTA7CisKKwkvKiBDcmVhdGUgdGhlIGR1bW15IE5TVkMgdGhhdCB3ZSB1c2UgZm9yIHNlbmRpbmcKKwkgKiBtZXNzYWdlcyB0byBub24tZXhpc3RhbnQvdW5rbm93biBOUy1WQydzICovCisJbnNpLT51bmtub3duX25zdmMgPSBuc3ZjX2NyZWF0ZShuc2ksIDB4ZmZmZSk7CisJbGxpc3RfZGVsKCZuc2ktPnVua25vd25fbnN2Yy0+bGlzdCk7CisKKwlyZXR1cm4gbnNpOworfQorCit2b2lkIGdwcnNfbnNfZGVzdHJveShzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2kpCit7CisJLyogRklYTUU6IGNsZWFyIGFsbCB0aW1lcnMgKi8KKworCS8qIHJlY3Vyc2l2ZWx5IGZyZWUgdGhlIE5TSSBhbmQgYWxsIGl0cyBOU1ZDcyAqLworCXRhbGxvY19mcmVlKG5zaSk7Cit9CisKKworLyogTlMtb3Zlci1JUCBjb2RlLCBhY2NvcmRpbmcgdG8gM0dQUCBUUyA0OC4wMTYgQ2hhcHRlciA2LjIKKyAqIFdlIGRvbid0IHN1cHBvcnQgU2l6ZSBQcm9jZWR1cmUsIENvbmZpZ3VyYXRpb24gUHJvY2VkdXJlLCBDaGFuZ2VXZWlnaHQgUHJvY2VkdXJlICovCisKKy8qIFJlYWQgYSBzaW5nbGUgTlMtb3Zlci1JUCBtZXNzYWdlICovCitzdGF0aWMgc3RydWN0IG1zZ2IgKnJlYWRfbnNpcF9tc2coc3RydWN0IGJzY19mZCAqYmZkLCBpbnQgKmVycm9yLAorCQkJCSAgc3RydWN0IHNvY2thZGRyX2luICpzYWRkcikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3Byc19uc19tc2diX2FsbG9jKCk7CisJaW50IHJldCA9IDA7CisJc29ja2xlbl90IHNhZGRyX2xlbiA9IHNpemVvZigqc2FkZHIpOworCisJaWYgKCFtc2cpIHsKKwkJKmVycm9yID0gLUVOT01FTTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0ID0gcmVjdmZyb20oYmZkLT5mZCwgbXNnLT5kYXRhLCBOU19BTExPQ19TSVpFLCAwLAorCQkJKHN0cnVjdCBzb2NrYWRkciAqKXNhZGRyLCAmc2FkZHJfbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQlMT0dQKEROUywgTE9HTF9FUlJPUiwgInJlY3YgZXJyb3IgJXMgZHVyaW5nIE5TSVAgcmVjdlxuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCW1zZ2JfZnJlZShtc2cpOworCQkqZXJyb3IgPSByZXQ7CisJCXJldHVybiBOVUxMOworCX0gZWxzZSBpZiAocmV0ID09IDApIHsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCSplcnJvciA9IHJldDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbXNnLT5sMmggPSBtc2ctPmRhdGE7CisJbXNnYl9wdXQobXNnLCByZXQpOworCisJcmV0dXJuIG1zZzsKK30KKworc3RhdGljIGludCBoYW5kbGVfbnNpcF9yZWFkKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IHNvY2thZGRyX2luIHNhZGRyOworCXN0cnVjdCBncHJzX25zX2luc3QgKm5zaSA9IGJmZC0+ZGF0YTsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcmVhZF9uc2lwX21zZyhiZmQsICZlcnJvciwgJnNhZGRyKTsKKworCWlmICghbXNnKQorCQlyZXR1cm4gZXJyb3I7CisKKwllcnJvciA9IGdwcnNfbnNfcmN2bXNnKG5zaSwgbXNnLCAmc2FkZHIsIEdQUlNfTlNfTExfVURQKTsKKworCW1zZ2JfZnJlZShtc2cpOworCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9uc2lwX3dyaXRlKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwkvKiBGSVhNRTogYWN0dWFsbHkgc2VuZCB0aGUgZGF0YSBoZXJlIGluc3RlYWQgb2YgbnNpcF9zZW5kbXNnKCkgKi8KKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBuc2lwX3NlbmRtc2coc3RydWN0IGdwcnNfbnN2YyAqbnN2Yywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlpbnQgcmM7CisJc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpID0gbnN2Yy0+bnNpOworCXN0cnVjdCBzb2NrYWRkcl9pbiAqZGFkZHIgPSAmbnN2Yy0+aXAuYnRzX2FkZHI7CisKKwlyYyA9IHNlbmR0byhuc2ktPm5zaXAuZmQuZmQsIG1zZy0+ZGF0YSwgbXNnLT5sZW4sIDAsCisJCSAgKHN0cnVjdCBzb2NrYWRkciAqKWRhZGRyLCBzaXplb2YoKmRhZGRyKSk7CisKKwl0YWxsb2NfZnJlZShtc2cpOworCisJcmV0dXJuIHJjOworfQorCisvKiBVRFAgUG9ydCAyMzAwMCBjYXJyaWVzIHRoZSBMTEMtaW4tQlNTR1AtaW4tTlMgcHJvdG9jb2wgc3RhY2sgKi8KK3N0YXRpYyBpbnQgbnNpcF9mZF9jYihzdHJ1Y3QgYnNjX2ZkICpiZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCWludCByYyA9IDA7CisKKwlpZiAod2hhdCAmIEJTQ19GRF9SRUFEKQorCQlyYyA9IGhhbmRsZV9uc2lwX3JlYWQoYmZkKTsKKwlpZiAod2hhdCAmIEJTQ19GRF9XUklURSkKKwkJcmMgPSBoYW5kbGVfbnNpcF93cml0ZShiZmQpOworCisJcmV0dXJuIHJjOworfQorCisvKiBMaXN0ZW4gZm9yIGluY29taW5nIEdQUlMgcGFja2V0cyAqLworaW50IGdwcnNfbnNfbnNpcF9saXN0ZW4oc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpKQoreworCWludCByZXQ7CisKKwlyZXQgPSBtYWtlX3NvY2soJm5zaS0+bnNpcC5mZCwgSVBQUk9UT19VRFAsIG5zaS0+bnNpcC5sb2NhbF9pcCwKKwkJCW5zaS0+bnNpcC5sb2NhbF9wb3J0LCBuc2lwX2ZkX2NiKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW5zaS0+bnNpcC5mZC5kYXRhID0gbnNpOworCisJcmV0dXJuIHJldDsKK30KKworLyogSW5pdGlhdGUgYSBSRVNFVCBwcm9jZWR1cmUgKi8KK3ZvaWQgZ3Byc19uc3ZjX3Jlc2V0KHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHVpbnQ4X3QgY2F1c2UpCit7CisJTE9HUChETlMsIExPR0xfSU5GTywgIk5TRUk9JXUgUkVTRVQgcHJvY2VkdXJlIGJhc2VkIG9uIEFQSSByZXF1ZXN0XG4iLAorCQluc3ZjLT5uc2VpKTsKKworCS8qIE1hcmsgTlMtVkMgbG9jYWxseSBhcyBibG9ja2VkIGFuZCBkZWFkICovCisJbnN2Yy0+c3RhdGUgPSBOU0VfU19CTE9DS0VEOworCS8qIFNlbmQgTlMtUkVTRVQgUERVICovCisJaWYgKGdwcnNfbnNfdHhfcmVzZXQobnN2YywgY2F1c2UpIDwgMCkgeworCQlMT0dQKEROUywgTE9HTF9FUlJPUiwgIk5TRUk9JXUsIGVycm9yIHJlc2V0dGluZyBOUy1WQ1xuIiwKKwkJCW5zdmMtPm5zZWkpOworCX0KKwkvKiBTdGFydCBUbnMtcmVzZXQgKi8KKwluc3ZjX3N0YXJ0X3RpbWVyKG5zdmMsIE5TVkNfVElNRVJfVE5TX1JFU0VUKTsKK30KKworLyogRXN0YWJsaXNoIGEgY29ubmVjdGlvbiAoZnJvbSB0aGUgQlNTKSB0byB0aGUgU0dTTiAqLworc3RydWN0IGdwcnNfbnN2YyAqbnNpcF9jb25uZWN0KHN0cnVjdCBncHJzX25zX2luc3QgKm5zaSwKKwkJCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmRlc3QsIHVpbnQxNl90IG5zZWksCisJCQkJdWludDE2X3QgbnN2Y2kpCit7CisJc3RydWN0IGdwcnNfbnN2YyAqbnN2YzsKKworCW5zdmMgPSBuc3ZjX2J5X3JlbV9hZGRyKG5zaSwgZGVzdCk7CisJaWYgKCFuc3ZjKQorCQluc3ZjID0gbnN2Y19jcmVhdGUobnNpLCBuc3ZjaSk7CisJbnN2Yy0+aXAuYnRzX2FkZHIgPSAqZGVzdDsKKwluc3ZjLT5uc2VpID0gbnNlaTsKKwluc3ZjLT5uc3ZjaSA9IG5zdmNpOworCW5zdmMtPnJlbW90ZV9lbmRfaXNfc2dzbiA9IDE7CisKKwlncHJzX25zdmNfcmVzZXQobnN2YywgTlNfQ0FVU0VfT01fSU5URVJWRU5USU9OKTsKKwlyZXR1cm4gbnN2YzsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19uc19mcmdyZS5jIGIvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX25zX2ZyZ3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRmOTM3NAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19uc19mcmdyZS5jCkBAIC0wLDAgKzEsMjI5IEBACisvKiBHUFJTIE5ldHdvcmtzIFNlcnZpY2UgKE5TKSBtZXNzYWdlcyBvbiB0aGUgR2IgaW50ZXJmYWNlCisgKiAzR1BQIFRTIDA4LjE2IHZlcnNpb24gOC4wLjEgUmVsZWFzZSAxOTk5IC8gRVRTSSBUUyAxMDEgMjk5IFY4LjAuMSAoMjAwMi0wNSkgKi8KKworLyogTlMtb3Zlci1GUi1vdmVyLUdSRSBpbXBsZW1lbnRhdGlvbiAqLworCisvKiAoQykgMjAwOS0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL3NvY2tldC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfbnMuaD4KKworI2RlZmluZSBHUkVfUFRZUEVfRlIJMHg2NTU5CisKK3N0cnVjdCBncmVfaGRyIHsKKwl1aW50MTZfdCBmbGFnczsKKwl1aW50MTZfdCBwdHlwZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdGF0aWMgc3RydWN0IG1zZ2IgKnJlYWRfbnNmcmdyZV9tc2coc3RydWN0IGJzY19mZCAqYmZkLCBpbnQgKmVycm9yLAorCQkJCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNhZGRyKQoreworCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jKE5TX0FMTE9DX1NJWkUsICJHYi9OUy9GUi9HUkUgUngiKTsKKwlpbnQgcmV0ID0gMDsKKwlzb2NrbGVuX3Qgc2FkZHJfbGVuID0gc2l6ZW9mKCpzYWRkcik7CisJc3RydWN0IGlwaGRyICppcGg7CisJc3RydWN0IGdyZV9oZHIgKmdyZWg7CisJdWludDhfdCAqZnJoOworCXVpbnQxNl90IGRsY2k7CisKKwlpZiAoIW1zZykgeworCQkqZXJyb3IgPSAtRU5PTUVNOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXQgPSByZWN2ZnJvbShiZmQtPmZkLCBtc2ctPmRhdGEsIE5TX0FMTE9DX1NJWkUsIDAsCisJCQkoc3RydWN0IHNvY2thZGRyICopc2FkZHIsICZzYWRkcl9sZW4pOworCWlmIChyZXQgPCAwKSB7CisJCUxPR1AoRE5TLCBMT0dMX0VSUk9SLCAicmVjdiBlcnJvciAlcyBkdXJpbmcgTlMtRlItR1JFIHJlY3ZcbiIsCisJCQlzdHJlcnJvcihlcnJubykpOworCQkqZXJyb3IgPSByZXQ7CisJCWdvdG8gb3V0X2VycjsKKwl9IGVsc2UgaWYgKHJldCA9PSAwKSB7CisJCSplcnJvciA9IHJldDsKKwkJZ290byBvdXRfZXJyOworCX0KKworCW1zZ2JfcHV0KG1zZywgcmV0KTsKKworCWlmIChtc2ctPmxlbiA8IHNpemVvZigqaXBoKSArIHNpemVvZigqZ3JlaCkgKyAyKSB7CisJCUxPR1AoRE5TLCBMT0dMX0VSUk9SLCAiU2hvcnQgSVAgcGFja2V0OiAldSBieXRlc1xuIiwgbXNnLT5sZW4pOworCQkqZXJyb3IgPSAtRUlPOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJaXBoID0gKHN0cnVjdCBpcGhkciAqKSBtc2ctPmRhdGE7CisJaWYgKG1zZy0+bGVuIDwgKGlwaC0+aWhsKjQgKyBzaXplb2YoKmdyZWgpICsgMikpIHsKKwkJTE9HUChETlMsIExPR0xfRVJST1IsICJTaG9ydCBJUCBwYWNrZXQ6ICV1IGJ5dGVzXG4iLCBtc2ctPmxlbik7CisJCSplcnJvciA9IC1FSU87CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlncmVoID0gKHN0cnVjdCBncmVfaGRyICopIChtc2ctPmRhdGEgKyBpcGgtPmlobCo0KTsKKwlpZiAoZ3JlaC0+ZmxhZ3MpIHsKKwkJTE9HUChETlMsIExPR0xfTk9USUNFLCAiVW5rbm93biBHUkUgZmxhZ3MgMHglMDR4XG4iLAorCQkJbnRvaHMoZ3JlaC0+ZmxhZ3MpKTsKKwl9CisJaWYgKGdyZWgtPnB0eXBlICE9IGh0b25zKEdSRV9QVFlQRV9GUikpIHsKKwkJTE9HUChETlMsIExPR0xfTk9USUNFLCAiVW5rbm93biBHUkUgcHJvdG9jb2wgMHglMDR4ICE9IEZSXG4iLAorCQkJbnRvaHMoZ3JlaC0+cHR5cGUpKTsKKwkJKmVycm9yID0gLUVJTzsKKwkJZ290byBvdXRfZXJyOworCX0KKworCWlmIChtc2ctPmxlbiA8IHNpemVvZigqZ3JlaCkgKyAyKSB7CisJCUxPR1AoRE5TLCBMT0dMX0VSUk9SLCAiU2hvcnQgRlIgaGVhZGVyOiAldSBieXRlc1xuIiwgbXNnLT5sZW4pOworCQkqZXJyb3IgPSAtRUlPOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJZnJoID0gKHVpbnQ4X3QgKilncmVoICsgc2l6ZW9mKCpncmVoKTsKKwlpZiAoZnJoWzBdICYgMHgwMSkgeworCQlMT0dQKEROUywgTE9HTF9OT1RJQ0UsICJVbnN1cHBvcnRlZCBzaW5nbGUtYnl0ZSBGUiBhZGRyZXNzXG4iKTsKKwkJKmVycm9yID0gLUVJTzsKKwkJZ290byBvdXRfZXJyOworCX0KKwlkbGNpID0gKChmcmhbMF0gJiAweGZjKSA8PCAyKTsKKwlpZiAoKGZyaFsxXSAmIDB4MGYpICE9IDB4MDEpIHsKKwkJTE9HUChETlMsIExPR0xfTk9USUNFLCAiVW5rbm93biBzZWNvbmQgRlIgb2N0ZXQgMHglMDJ4XG4iLAorCQkJZnJoWzFdKTsKKwkJKmVycm9yID0gLUVJTzsKKwkJZ290byBvdXRfZXJyOworCX0KKwlkbGNpIHw9IChmcmhbMV0gPj4gNCk7CisKKwltc2ctPmwyaCA9IGZyaCsyOworCisJLyogU3RvcmUgRExDSSBpbiBORVRXT1JLIEJZVEVPUkRFUiBpbiBzb2NrYWRkciBwb3J0IG1lbWJlciAqLworCXNhZGRyLT5zaW5fcG9ydCA9IGh0b25zKGRsY2kpOworCisJcmV0dXJuIG1zZzsKKworb3V0X2VycjoKKwltc2diX2ZyZWUobXNnKTsKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IGdwcnNfbnNfcmN2bXNnKHN0cnVjdCBncHJzX25zX2luc3QgKm5zaSwgc3RydWN0IG1zZ2IgKm1zZywKKwkJICAgc3RydWN0IHNvY2thZGRyX2luICpzYWRkciwgZW51bSBncHJzX25zX2xsIGxsKTsKKworc3RhdGljIGludCBoYW5kbGVfbnNmcmdyZV9yZWFkKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IHNvY2thZGRyX2luIHNhZGRyOworCXN0cnVjdCBncHJzX25zX2luc3QgKm5zaSA9IGJmZC0+ZGF0YTsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcmVhZF9uc2ZyZ3JlX21zZyhiZmQsICZlcnJvciwgJnNhZGRyKTsKKworCWlmICghbXNnKQorCQlyZXR1cm4gZXJyb3I7CisKKwllcnJvciA9IGdwcnNfbnNfcmN2bXNnKG5zaSwgbXNnLCAmc2FkZHIsIEdQUlNfTlNfTExfRlJfR1JFKTsKKworCW1zZ2JfZnJlZShtc2cpOworCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9uc2ZyZ3JlX3dyaXRlKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwkvKiBGSVhNRTogYWN0dWFsbHkgc2VuZCB0aGUgZGF0YSBoZXJlIGluc3RlYWQgb2YgbnNpcF9zZW5kbXNnKCkgKi8KKwlyZXR1cm4gLUVJTzsKK30KKworaW50IGdwcnNfbnNfZnJncmVfc2VuZG1zZyhzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCWludCByYzsKKwlzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2kgPSBuc3ZjLT5uc2k7CisJc3RydWN0IHNvY2thZGRyX2luIGRhZGRyOworCXVpbnQxNl90IGRsY2kgPSBudG9ocyhuc3ZjLT5mcmdyZS5idHNfYWRkci5zaW5fcG9ydCk7CisJdWludDhfdCAqZnJoOworCXN0cnVjdCBncmVfaGRyICpncmVoOworCisJLyogQnVpbGQgc29ja2V0IGFkZHJlc3MgZm9yIHRoZSBwYWNrZXQgZGVzdGlvbmF0aW9uICovCisJZGFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJZGFkZHIuc2luX2FkZHIgPSBuc3ZjLT5mcmdyZS5idHNfYWRkci5zaW5fYWRkcjsKKwlkYWRkci5zaW5fcG9ydCA9IElQUFJPVE9fR1JFOworCisJLyogUHJlcGVuZCB0aGUgRlIgaGVhZGVyICovCisJZnJoID0gbXNnYl9wdXNoKG1zZywgMik7CisJZnJoWzBdID0gKGRsY2kgPj4gMikgJiAweGZjOworCWZyaFsxXSA9ICgoZGxjaSAmIDB4Zik8PDQpIHwgMHgwMTsKKworCS8qIFByZXBlbmQgdGhlIEdSRSBoZWFkZXIgKi8KKwlncmVoID0gKHN0cnVjdCBncmVfaGRyICopIG1zZ2JfcHVzaChtc2csIHNpemVvZigqZ3JlaCkpOworCWdyZWgtPmZsYWdzID0gMDsKKwlncmVoLT5wdHlwZSA9IGh0b25zKEdSRV9QVFlQRV9GUik7CisKKwlyYyA9IHNlbmR0byhuc2ktPmZyZ3JlLmZkLmZkLCBtc2ctPmRhdGEsIG1zZy0+bGVuLCAwLAorCQkgIChzdHJ1Y3Qgc29ja2FkZHIgKikmZGFkZHIsIHNpemVvZihkYWRkcikpOworCisJdGFsbG9jX2ZyZWUobXNnKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBuc2ZyZ3JlX2ZkX2NiKHN0cnVjdCBic2NfZmQgKmJmZCwgdW5zaWduZWQgaW50IHdoYXQpCit7CisJaW50IHJjID0gMDsKKworCWlmICh3aGF0ICYgQlNDX0ZEX1JFQUQpCisJCXJjID0gaGFuZGxlX25zZnJncmVfcmVhZChiZmQpOworCWlmICh3aGF0ICYgQlNDX0ZEX1dSSVRFKQorCQlyYyA9IGhhbmRsZV9uc2ZyZ3JlX3dyaXRlKGJmZCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBncHJzX25zX2ZyZ3JlX2xpc3RlbihzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2kpCit7CisJaW50IHJjOworCisJLyogTWFrZSBzdXJlIHdlIGNsb3NlIGFueSBleGlzdGluZyBzb2NrZXQgYmVmb3JlIGNoYW5naW5nIGl0ICovCisJaWYgKG5zaS0+ZnJncmUuZmQuZmQpCisJCWNsb3NlKG5zaS0+ZnJncmUuZmQuZmQpOworCisJaWYgKCFuc2ktPmZyZ3JlLmVuYWJsZWQpCisJCXJldHVybiAwOworCisJcmMgPSBtYWtlX3NvY2soJm5zaS0+ZnJncmUuZmQsIElQUFJPVE9fR1JFLCBuc2ktPmZyZ3JlLmxvY2FsX2lwLAorCQkJMCwgbnNmcmdyZV9mZF9jYik7CisJaWYgKHJjIDwgMCkgeworCQlMT0dQKEROUywgTE9HTF9FUlJPUiwgIkVycm9yIGNyZWF0aW5nIEdSRSBzb2NrZXQgKCVzKVxuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiByYzsKKwl9CisJbnNpLT5mcmdyZS5mZC5kYXRhID0gbnNpOworCisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX25zX3Z0eS5jIGIvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX25zX3Z0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMzQ2YzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfbnNfdnR5LmMKQEAgLTAsMCArMSw1NzEgQEAKKy8qIFZUWSBpbnRlcmZhY2UgZm9yIG91ciBHUFJTIE5ldHdvcmtzIFNlcnZpY2UgKE5TKSBpbXBsZW1lbnRhdGlvbiAqLworCisvKiAoQykgMjAwOS0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3JhdGVfY3RyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX25zLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX2Jzc2dwLmg+CisjaW5jbHVkZSA8b3BlbmJzYy92dHkuaD4KKworI2luY2x1ZGUgPG9zbW9jb20vdnR5L3Z0eS5oPgorI2luY2x1ZGUgPG9zbW9jb20vdnR5L2NvbW1hbmQuaD4KKyNpbmNsdWRlIDxvc21vY29tL3Z0eS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8b3Ntb2NvbS92dHkvdGVsbmV0X2ludGVyZmFjZS5oPgorCitzdGF0aWMgc3RydWN0IGdwcnNfbnNfaW5zdCAqdnR5X25zaSA9IE5VTEw7CisKKy8qIEZJWE1FOiB0aGlzIHNob3VsZCBnbyB0byBzb21lIGNvbW1vbiBmaWxlIGFzIGl0IGlzIGNvcGllZAorICogaW4gdnR5X2ludGVyZmFjZS5jIG9mIHRoZSBCU0MgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGdwcnNfbnNfdGltZXJfc3Ryc1tdID0geworCXsgMCwgInRucy1ibG9jayIgfSwKKwl7IDEsICJ0bnMtYmxvY2stcmV0cmllcyIgfSwKKwl7IDIsICJ0bnMtcmVzZXQiIH0sCisJeyAzLCAidG5zLXJlc2V0LXJldHJpZXMiIH0sCisJeyA0LCAidG5zLXRlc3QiIH0sCisJeyA1LCAidG5zLWFsaXZlIiB9LAorCXsgNiwgInRucy1hbGl2ZS1yZXRyaWVzIiB9LAorCXsgMCwgTlVMTCB9Cit9OworCitzdGF0aWMgc3RydWN0IGNtZF9ub2RlIG5zX25vZGUgPSB7CisJTlNfTk9ERSwKKwkiJXMobnMpIyIsCisJMSwKK307CisKK3N0YXRpYyBpbnQgY29uZmlnX3dyaXRlX25zKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjOworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBpbl9hZGRyIGlhOworCisJdnR5X291dCh2dHksICJucyVzIiwgVlRZX05FV0xJTkUpOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkobnN2YywgJnZ0eV9uc2ktPmdwcnNfbnN2Y3MsIGxpc3QpIHsKKwkJaWYgKCFuc3ZjLT5wZXJzaXN0ZW50KQorCQkJY29udGludWU7CisJCXZ0eV9vdXQodnR5LCAiIG5zZSAldSBuc3ZjaSAldSVzIiwKKwkJCW5zdmMtPm5zZWksIG5zdmMtPm5zdmNpLCBWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAiIG5zZSAldSByZW1vdGUtcm9sZSAlcyVzIiwKKwkJCW5zdmMtPm5zZWksIG5zdmMtPnJlbW90ZV9lbmRfaXNfc2dzbiA/ICJzZ3NuIiA6ICJic3MiLAorCQkJVlRZX05FV0xJTkUpOworCQlzd2l0Y2ggKG5zdmMtPmxsKSB7CisJCWNhc2UgR1BSU19OU19MTF9VRFA6CisJCQl2dHlfb3V0KHZ0eSwgIiBuc2UgJXUgZW5jYXBzdWxhdGlvbiB1ZHAlcyIsIG5zdmMtPm5zZWksCisJCQkJVlRZX05FV0xJTkUpOworCQkJdnR5X291dCh2dHksICIgbnNlICV1IHJlbW90ZS1pcCAlcyVzIiwKKwkJCQluc3ZjLT5uc2VpLAorCQkJCWluZXRfbnRvYShuc3ZjLT5pcC5idHNfYWRkci5zaW5fYWRkciksCisJCQkJVlRZX05FV0xJTkUpOworCQkJdnR5X291dCh2dHksICIgbnNlICV1IHJlbW90ZS1wb3J0ICV1JXMiLAorCQkJCW5zdmMtPm5zZWksIG50b2hzKG5zdmMtPmlwLmJ0c19hZGRyLnNpbl9wb3J0KSwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlicmVhazsKKwkJY2FzZSBHUFJTX05TX0xMX0ZSX0dSRToKKwkJCXZ0eV9vdXQodnR5LCAiIG5zZSAldSBlbmNhcHN1bGF0aW9uIGZyYW1lcmVsYXktZ3JlJXMiLAorCQkJCW5zdmMtPm5zZWksIFZUWV9ORVdMSU5FKTsKKwkJCXZ0eV9vdXQodnR5LCAiIG5zZSAldSByZW1vdGUtaXAgJXMlcyIsCisJCQkJbnN2Yy0+bnNlaSwKKwkJCQlpbmV0X250b2EobnN2Yy0+ZnJncmUuYnRzX2FkZHIuc2luX2FkZHIpLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXZ0eV9vdXQodnR5LCAiIG5zZSAldSBmci1kbGNpICV1JXMiLAorCQkJCW5zdmMtPm5zZWksIG50b2hzKG5zdmMtPmZyZ3JlLmJ0c19hZGRyLnNpbl9wb3J0KSwKKwkJCQlWVFlfTkVXTElORSk7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZ0eV9uc2ktPnRpbWVvdXQpOyBpKyspCisJCXZ0eV9vdXQodnR5LCAiIHRpbWVyICVzICV1JXMiLAorCQkJZ2V0X3ZhbHVlX3N0cmluZyhncHJzX25zX3RpbWVyX3N0cnMsIGkpLAorCQkJdnR5X25zaS0+dGltZW91dFtpXSwgVlRZX05FV0xJTkUpOworCisJaWYgKHZ0eV9uc2ktPm5zaXAubG9jYWxfaXApIHsKKwkJaWEuc19hZGRyID0gaHRvbmwodnR5X25zaS0+bnNpcC5sb2NhbF9pcCk7CisJCXZ0eV9vdXQodnR5LCAiIGVuY2Fwc3VsYXRpb24gdWRwIGxvY2FsLWlwICVzJXMiLAorCQkJaW5ldF9udG9hKGlhKSwgVlRZX05FV0xJTkUpOworCX0KKwlpZiAodnR5X25zaS0+bnNpcC5sb2NhbF9wb3J0KQorCQl2dHlfb3V0KHZ0eSwgIiBlbmNhcHN1bGF0aW9uIHVkcCBsb2NhbC1wb3J0ICV1JXMiLAorCQkJdnR5X25zaS0+bnNpcC5sb2NhbF9wb3J0LCBWVFlfTkVXTElORSk7CisKKwl2dHlfb3V0KHZ0eSwgIiBlbmNhcHN1bGF0aW9uIGZyYW1lcmVsYXktZ3JlIGVuYWJsZWQgJXUlcyIsCisJCXZ0eV9uc2ktPmZyZ3JlLmVuYWJsZWQgPyAxIDogMCwgVlRZX05FV0xJTkUpOworCWlmICh2dHlfbnNpLT5mcmdyZS5sb2NhbF9pcCkgeworCQlpYS5zX2FkZHIgPSBodG9ubCh2dHlfbnNpLT5mcmdyZS5sb2NhbF9pcCk7CisJCXZ0eV9vdXQodnR5LCAiIGVuY2Fwc3VsYXRpb24gZnJhbWVyZWxheS1ncmUgbG9jYWwtaXAgJXMlcyIsCisJCQlpbmV0X250b2EoaWEpLCBWVFlfTkVXTElORSk7CisJfQorCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbnMsIGNmZ19uc19jbWQsCisgICAgICAibnMiLAorICAgICAgIkNvbmZpZ3VyZSB0aGUgR1BSUyBOZXR3b3JrIFNlcnZpY2UiKQoreworCXZ0eS0+bm9kZSA9IE5TX05PREU7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBkdW1wX25zZShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIGludCBzdGF0cykKK3sKKwl2dHlfb3V0KHZ0eSwgIk5TRUkgJTV1LCBOUy1WQyAlNXUsIFJlbW90ZTogJS00cywgJTVzICU5cyIsCisJCW5zdmMtPm5zZWksIG5zdmMtPm5zdmNpLAorCQluc3ZjLT5yZW1vdGVfZW5kX2lzX3Nnc24gPyAiU0dTTiIgOiAiQlNTIiwKKwkJbnN2Yy0+c3RhdGUgJiBOU0VfU19BTElWRSA/ICJBTElWRSIgOiAiREVBRCIsCisJCW5zdmMtPnN0YXRlICYgTlNFX1NfQkxPQ0tFRCA/ICJCTE9DS0VEIiA6ICJVTkJMT0NLRUQiKTsKKwlpZiAobnN2Yy0+bGwgPT0gR1BSU19OU19MTF9VRFAgfHwgbnN2Yy0+bGwgPT0gR1BSU19OU19MTF9GUl9HUkUpCisJCXZ0eV9vdXQodnR5LCAiLCAlcyAlMTVzOiV1IiwKKwkJCW5zdmMtPmxsID09IEdQUlNfTlNfTExfVURQID8gIlVEUCAgICIgOiAiRlItR1JFIiwKKwkJCWluZXRfbnRvYShuc3ZjLT5pcC5idHNfYWRkci5zaW5fYWRkciksCisJCQludG9ocyhuc3ZjLT5pcC5idHNfYWRkci5zaW5fcG9ydCkpOworCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisJaWYgKHN0YXRzKQorCQl2dHlfb3V0X3JhdGVfY3RyX2dyb3VwKHZ0eSwgIiAiLCBuc3ZjLT5jdHJnKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9ucyhzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBncHJzX25zX2luc3QgKm5zaSwgaW50IHN0YXRzKQoreworCXN0cnVjdCBncHJzX25zdmMgKm5zdmM7CisJc3RydWN0IGluX2FkZHIgaWE7CisKKwlpYS5zX2FkZHIgPSBodG9ubCh2dHlfbnNpLT5uc2lwLmxvY2FsX2lwKTsKKwl2dHlfb3V0KHZ0eSwgIkVuY2Fwc3VsYXRpb24gTlMtVURQLUlQICAgICBMb2NhbCBJUDogJXMsIFVEUCBQb3J0OiAldSVzIiwKKwkJaW5ldF9udG9hKGlhKSwgdnR5X25zaS0+bnNpcC5sb2NhbF9wb3J0LCBWVFlfTkVXTElORSk7CisKKwlpYS5zX2FkZHIgPSBodG9ubCh2dHlfbnNpLT5mcmdyZS5sb2NhbF9pcCk7CisJdnR5X291dCh2dHksICJFbmNhcHN1bGF0aW9uIE5TLUZSLUdSRS1JUCAgTG9jYWwgSVA6ICVzJXMiLAorCQlpbmV0X250b2EoaWEpLCBWVFlfTkVXTElORSk7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShuc3ZjLCAmbnNpLT5ncHJzX25zdmNzLCBsaXN0KSB7CisJCWlmIChuc3ZjID09IG5zaS0+dW5rbm93bl9uc3ZjKQorCQkJY29udGludWU7CisJCWR1bXBfbnNlKHZ0eSwgbnN2Yywgc3RhdHMpOworCX0KK30KKworREVGVU4oc2hvd19ucywgc2hvd19uc19jbWQsICJzaG93IG5zIiwKKwlTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgTlMgcHJvdG9jb2wiKQoreworCXN0cnVjdCBncHJzX25zX2luc3QgKm5zaSA9IHZ0eV9uc2k7CisJZHVtcF9ucyh2dHksIG5zaSwgMCk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihzaG93X25zX3N0YXRzLCBzaG93X25zX3N0YXRzX2NtZCwgInNob3cgbnMgc3RhdHMiLAorCVNIT1dfU1RSCisJIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIE5TIHByb3RvY29sXG4iCisJIkluY2x1ZGUgc3RhdGlzdGljc1xuIikKK3sKKwlzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2kgPSB2dHlfbnNpOworCWR1bXBfbnModnR5LCBuc2ksIDEpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oc2hvd19uc2UsIHNob3dfbnNlX2NtZCwgInNob3cgbnMgKG5zZWl8bnN2YykgPDAtNjU1MzU+IFtzdGF0c10iLAorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IHRoZSBOUyBwcm90b2NvbFxuIgorCSJTZWxlY3Qgb25lIE5TRSBieSBpdHMgTlNFIElkZW50aWZpZXJcbiIKKwkiU2VsZWN0IG9uZSBOU0UgYnkgaXRzIE5TLVZDIElkZW50aWZpZXJcbiIKKwkiVGhlIElkZW50aWZpZXIgb2Ygc2VsZWN0ZWQgdHlwZVxuIgorCSJJbmNsdWRlIFN0YXRpc3RpY3NcbiIpCit7CisJc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpID0gdnR5X25zaTsKKwlzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjOworCXVpbnQxNl90IGlkID0gYXRvaShhcmd2WzFdKTsKKwlpbnQgc2hvd19zdGF0cyA9IDA7CisKKwlpZiAoIXN0cmNtcChhcmd2WzBdLCAibnNlaSIpKQorCQluc3ZjID0gbnN2Y19ieV9uc2VpKG5zaSwgaWQpOworCWVsc2UKKwkJbnN2YyA9IG5zdmNfYnlfbnN2Y2kobnNpLCBpZCk7CisKKwlpZiAoIW5zdmMpIHsKKwkJdnR5X291dCh2dHksICJObyBzdWNoIE5TIEVudGl0eSVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKGFyZ2MgPj0gMykKKwkJc2hvd19zdGF0cyA9IDE7CisKKwlkdW1wX25zZSh2dHksIG5zdmMsIHNob3dfc3RhdHMpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworI2RlZmluZSBOU0VfQ01EX1NUUiAiUGVyc2lzdGVudCBOUyBFbnRpdHlcbiIgIk5TIEVudGl0eSBJRCAoTlNFSSlcbiIKKworREVGVU4oY2ZnX25zZV9uc3ZjLCBjZmdfbnNlX25zdmNpX2NtZCwKKwkibnNlIDwwLTY1NTM1PiBuc3ZjaSA8MC02NTUzND4iLAorCU5TRV9DTURfU1RSCisJIk5TIFZpcnR1YWwgQ29ubmVjdGlvblxuIgorCSJOUyBWaXJ0dWFsIENvbm5lY3Rpb24gSUQgKE5TVkNJKVxuIgorCSkKK3sKKwl1aW50MTZfdCBuc2VpID0gYXRvaShhcmd2WzBdKTsKKwl1aW50MTZfdCBuc3ZjaSA9IGF0b2koYXJndlsxXSk7CisJc3RydWN0IGdwcnNfbnN2YyAqbnN2YzsKKworCW5zdmMgPSBuc3ZjX2J5X25zZWkodnR5X25zaSwgbnNlaSk7CisJaWYgKCFuc3ZjKSB7CisJCW5zdmMgPSBuc3ZjX2NyZWF0ZSh2dHlfbnNpLCBuc3ZjaSk7CisJCW5zdmMtPm5zZWkgPSBuc2VpOworCX0KKwluc3ZjLT5uc3ZjaSA9IG5zdmNpOworCS8qIEFsbCBOU1ZDcyB0aGF0IGFyZSBleHBsaWNpdGx5IGNvbmZpZ3VyZWQgYnkgVlRZIGFyZQorCSAqIG1hcmtlZCBhcyBwZXJzaXN0ZW50IHNvIHdlIGNhbiB3cml0ZSB0aGVtIHRvIHRoZSBjb25maWcKKwkgKiBmaWxlIGF0IHNvbWUgbGF0ZXIgcG9pbnQgKi8KKwluc3ZjLT5wZXJzaXN0ZW50ID0gMTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25zZV9yZW1vdGVpcCwgY2ZnX25zZV9yZW1vdGVpcF9jbWQsCisJIm5zZSA8MC02NTUzNT4gcmVtb3RlLWlwIEEuQi5DLkQiLAorCU5TRV9DTURfU1RSCisJIlJlbW90ZSBJUCBBZGRyZXNzXG4iCisJIlJlbW90ZSBJUCBBZGRyZXNzXG4iKQoreworCXVpbnQxNl90IG5zZWkgPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBncHJzX25zdmMgKm5zdmM7CisKKwluc3ZjID0gbnN2Y19ieV9uc2VpKHZ0eV9uc2ksIG5zZWkpOworCWlmICghbnN2YykgeworCQl2dHlfb3V0KHZ0eSwgIk5vIHN1Y2ggTlNFICgldSklcyIsIG5zZWksIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwlpbmV0X2F0b24oYXJndlsxXSwgJm5zdmMtPmlwLmJ0c19hZGRyLnNpbl9hZGRyKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKKworfQorCitERUZVTihjZmdfbnNlX3JlbW90ZXBvcnQsIGNmZ19uc2VfcmVtb3RlcG9ydF9jbWQsCisJIm5zZSA8MC02NTUzNT4gcmVtb3RlLXBvcnQgPDAtNjU1MzU+IiwKKwlOU0VfQ01EX1NUUgorCSJSZW1vdGUgVURQIFBvcnRcbiIKKwkiUmVtb3RlIFVEUCBQb3J0IE51bWJlclxuIikKK3sKKwl1aW50MTZfdCBuc2VpID0gYXRvaShhcmd2WzBdKTsKKwl1aW50MTZfdCBwb3J0ID0gYXRvaShhcmd2WzFdKTsKKwlzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjOworCisJbnN2YyA9IG5zdmNfYnlfbnNlaSh2dHlfbnNpLCBuc2VpKTsKKwlpZiAoIW5zdmMpIHsKKwkJdnR5X291dCh2dHksICJObyBzdWNoIE5TRSAoJXUpJXMiLCBuc2VpLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAobnN2Yy0+bGwgIT0gR1BSU19OU19MTF9VRFApIHsKKwkJdnR5X291dCh2dHksICJDYW5ub3Qgc2V0IFVEUCBQb3J0IG9uIG5vbi1VRFAgTlNFJXMiLAorCQkJVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJbnN2Yy0+aXAuYnRzX2FkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25zZV9mcl9kbGNpLCBjZmdfbnNlX2ZyX2RsY2lfY21kLAorCSJuc2UgPDAtNjU1MzU+IGZyLWRsY2kgPDAtMTAyMz4iLAorCU5TRV9DTURfU1RSCisJIkZyYW1lIFJlbGF5IERMQ0lcbiIKKwkiRnJhbWUgUmVsYXkgRExDSSBOdW1iZXJcbiIpCit7CisJdWludDE2X3QgbnNlaSA9IGF0b2koYXJndlswXSk7CisJdWludDE2X3QgZGxjaSA9IGF0b2koYXJndlsxXSk7CisJc3RydWN0IGdwcnNfbnN2YyAqbnN2YzsKKworCW5zdmMgPSBuc3ZjX2J5X25zZWkodnR5X25zaSwgbnNlaSk7CisJaWYgKCFuc3ZjKSB7CisJCXZ0eV9vdXQodnR5LCAiTm8gc3VjaCBOU0UgKCV1KSVzIiwgbnNlaSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKG5zdmMtPmxsICE9IEdQUlNfTlNfTExfRlJfR1JFKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2Fubm90IHNldCBGUiBETENJIG9uIG5vbi1GUiBOU0UlcyIsCisJCQlWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwluc3ZjLT5mcmdyZS5idHNfYWRkci5zaW5fcG9ydCA9IGh0b25zKGRsY2kpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbnNlX2VuY2FwcywgY2ZnX25zZV9lbmNhcHNfY21kLAorCSJuc2UgPDAtNjU1MzU+IGVuY2Fwc3VsYXRpb24gKHVkcHxmcmFtZXJlbGF5LWdyZSkiLAorCU5TRV9DTURfU1RSCisJIkVuY2Fwc3VsYXRpb24gZm9yIE5TXG4iCisJIlVEUC9JUCBFbmNhcHN1bGF0aW9uXG4iICJGcmFtZS1SZWxheS9HUkUvSVAgRW5jYXBzdWxhdGlvblxuIikKK3sKKwl1aW50MTZfdCBuc2VpID0gYXRvaShhcmd2WzBdKTsKKwlzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjOworCisJbnN2YyA9IG5zdmNfYnlfbnNlaSh2dHlfbnNpLCBuc2VpKTsKKwlpZiAoIW5zdmMpIHsKKwkJdnR5X291dCh2dHksICJObyBzdWNoIE5TRSAoJXUpJXMiLCBuc2VpLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAoIXN0cmNtcChhcmd2WzFdLCAidWRwIikpCisJCW5zdmMtPmxsID0gR1BSU19OU19MTF9VRFA7CisJZWxzZQorCQluc3ZjLT5sbCA9IEdQUlNfTlNfTExfRlJfR1JFOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisKK0RFRlVOKGNmZ19uc2VfcmVtb3Rlcm9sZSwgY2ZnX25zZV9yZW1vdGVyb2xlX2NtZCwKKwkibnNlIDwwLTY1NTM1PiByZW1vdGUtcm9sZSAoc2dzbnxic3MpIiwKKwlOU0VfQ01EX1NUUgorCSJSZW1vdGUgTlNFIFJvbGVcbiIKKwkiUmVtb3RlIFBlZXIgaXMgU0dTTlxuIgorCSJSZW1vdGUgUGVlciBpcyBCU1NcbiIpCit7CisJdWludDE2X3QgbnNlaSA9IGF0b2koYXJndlswXSk7CisJc3RydWN0IGdwcnNfbnN2YyAqbnN2YzsKKworCW5zdmMgPSBuc3ZjX2J5X25zZWkodnR5X25zaSwgbnNlaSk7CisJaWYgKCFuc3ZjKSB7CisJCXZ0eV9vdXQodnR5LCAiTm8gc3VjaCBOU0UgKCV1KSVzIiwgbnNlaSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKCFzdHJjbXAoYXJndlsxXSwgInNnc24iKSkKKwkJbnN2Yy0+cmVtb3RlX2VuZF9pc19zZ3NuID0gMTsKKwllbHNlCisJCW5zdmMtPnJlbW90ZV9lbmRfaXNfc2dzbiA9IDA7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19ub19uc2UsIGNmZ19ub19uc2VfY21kLAorCSJubyBuc2UgPDAtNjU1MzU+IiwKKwkiRGVsZXRlIFBlcnNpc3RlbnQgTlMgRW50aXR5XG4iCisJIkRlbGV0ZSAiIE5TRV9DTURfU1RSKQoreworCXVpbnQxNl90IG5zZWkgPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBncHJzX25zdmMgKm5zdmM7CisKKwluc3ZjID0gbnN2Y19ieV9uc2VpKHZ0eV9uc2ksIG5zZWkpOworCWlmICghbnN2YykgeworCQl2dHlfb3V0KHZ0eSwgIk5vIHN1Y2ggTlNFICgldSklcyIsIG5zZWksIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWlmICghbnN2Yy0+cGVyc2lzdGVudCkgeworCQl2dHlfb3V0KHZ0eSwgIk5TRUkgJXUgaXMgbm90IGEgcGVyc2lzdGVudCBOU0UlcyIsCisJCQluc2VpLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwluc3ZjLT5wZXJzaXN0ZW50ID0gMDsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25zX3RpbWVyLCBjZmdfbnNfdGltZXJfY21kLAorCSJ0aW1lciAiIE5TX1RJTUVSUyAiIDwwLTY1NTM1PiIsCisJIk5ldHdvcmsgU2VydmljZSBUaW1lclxuIgorCU5TX1RJTUVSU19IRUxQICJUaW1lciBWYWx1ZVxuIikKK3sKKwlpbnQgaWR4ID0gZ2V0X3N0cmluZ192YWx1ZShncHJzX25zX3RpbWVyX3N0cnMsIGFyZ3ZbMF0pOworCWludCB2YWwgPSBhdG9pKGFyZ3ZbMV0pOworCisJaWYgKGlkeCA8IDAgfHwgaWR4ID49IEFSUkFZX1NJWkUodnR5X25zaS0+dGltZW91dCkpCisJCXJldHVybiBDTURfV0FSTklORzsKKworCXZ0eV9uc2ktPnRpbWVvdXRbaWR4XSA9IHZhbDsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworI2RlZmluZSBFTkNBUFNfU1RSICJOUyBlbmNhcHN1bGF0aW9uIG9wdGlvbnNcbiIKKworREVGVU4oY2ZnX25zaXBfbG9jYWxfaXAsIGNmZ19uc2lwX2xvY2FsX2lwX2NtZCwKKyAgICAgICJlbmNhcHN1bGF0aW9uIHVkcCBsb2NhbC1pcCBBLkIuQy5EIiwKKwlFTkNBUFNfU1RSICJOUyBvdmVyIFVEUCBFbmNhcHN1bGF0aW9uXG4iCisJIlNldCB0aGUgSVAgYWRkcmVzcyBvbiB3aGljaCB3ZSBsaXN0ZW4gZm9yIE5TL1VEUFxuIgorCSJJUCBBZGRyZXNzXG4iKQoreworCXN0cnVjdCBpbl9hZGRyIGlhOworCisJaW5ldF9hdG9uKGFyZ3ZbMF0sICZpYSk7CisJdnR5X25zaS0+bnNpcC5sb2NhbF9pcCA9IG50b2hsKGlhLnNfYWRkcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uc2lwX2xvY2FsX3BvcnQsIGNmZ19uc2lwX2xvY2FsX3BvcnRfY21kLAorICAgICAgImVuY2Fwc3VsYXRpb24gdWRwIGxvY2FsLXBvcnQgPDAtNjU1MzU+IiwKKwlFTkNBUFNfU1RSICJOUyBvdmVyIFVEUCBFbmNhcHN1bGF0aW9uXG4iCisJIlNldCB0aGUgVURQIHBvcnQgb24gd2hpY2ggd2UgbGlzdGVuIGZvciBOUy9VRFBcbiIKKwkiVURQIHBvcnQgbnVtYmVyXG4iKQoreworCXVuc2lnbmVkIGludCBwb3J0ID0gYXRvaShhcmd2WzBdKTsKKworCXZ0eV9uc2ktPm5zaXAubG9jYWxfcG9ydCA9IHBvcnQ7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19mcmdyZV9sb2NhbF9pcCwgY2ZnX2ZyZ3JlX2xvY2FsX2lwX2NtZCwKKyAgICAgICJlbmNhcHN1bGF0aW9uIGZyYW1lcmVsYXktZ3JlIGxvY2FsLWlwIEEuQi5DLkQiLAorCUVOQ0FQU19TVFIgIk5TIG92ZXIgRnJhbWUgUmVsYXkgb3ZlciBHUkUgRW5jYXBzdWxhdGlvblxuIgorCSJTZXQgdGhlIElQIGFkZHJlc3Mgb24gd2hpY2ggd2UgbGlzdGVuIGZvciBOUy9GUi9HUkVcbiIKKwkiSVAgQWRkcmVzc1xuIikKK3sKKwlzdHJ1Y3QgaW5fYWRkciBpYTsKKworCWlmICghdnR5X25zaS0+ZnJncmUuZW5hYmxlZCkgeworCQl2dHlfb3V0KHZ0eSwgIkZSL0dSRSBpcyBub3QgZW5hYmxlZCVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCWluZXRfYXRvbihhcmd2WzBdLCAmaWEpOworCXZ0eV9uc2ktPmZyZ3JlLmxvY2FsX2lwID0gbnRvaGwoaWEuc19hZGRyKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2ZyZ3JlX2VuYWJsZSwgY2ZnX2ZyZ3JlX2VuYWJsZV9jbWQsCisgICAgICAiZW5jYXBzdWxhdGlvbiBmcmFtZXJlbGF5LWdyZSBlbmFibGVkICgxfDApIiwKKwlFTkNBUFNfU1RSICJOUyBvdmVyIEZyYW1lIFJlbGF5IG92ZXIgR1JFIEVuY2Fwc3VsYXRpb25cbiIKKwkiRW5hYmxlIG9yIGRpc2FibGUgRnJhbWUgUmVsYXkgb3ZlciBHUkVcbiIKKwkiRW5hYmxlXG4iICJEaXNhYmxlXG4iKQoreworCWludCBlbmFibGVkID0gYXRvaShhcmd2WzBdKTsKKworCXZ0eV9uc2ktPmZyZ3JlLmVuYWJsZWQgPSBlbmFibGVkOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihuc3ZjX25zZWksIG5zdmNfbnNlaV9jbWQsCisJIm5zdmMgbnNlaSA8MC02NTUzNT4gKGJsb2NrfHVuYmxvY2t8cmVzZXQpIiwKKwkiUGVyZm9ybSBhbiBvcGVyYXRpb24gb24gYSBOU1ZDXG4iCisJIk5TLVZDIElkZW50aWZpZXIgKE5TLVZDSSlcbiIKKwkiSW5pdGlhdGUgQkxPQ0sgcHJvY2VkdXJlXG4iCisJIkluaXRpYXRlIFVOQkxPQ0sgcHJvY2VkdXJlXG4iCisJIkluaXRpYXRlIFJFU0VUIHByb2NlZHVyZVxuIikKK3sKKwl1aW50MTZfdCBuc3ZjaSA9IGF0b2koYXJndlswXSk7CisJY29uc3QgY2hhciAqb3BlcmF0aW9uID0gYXJndlsxXTsKKwlzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjOworCisJbnN2YyA9IG5zdmNfYnlfbnNlaSh2dHlfbnNpLCBuc3ZjaSk7CisJaWYgKCFuc3ZjKSB7CisJCXZ0eV9vdXQodnR5LCAiTm8gc3VjaCBOU1ZDSSAoJXUpJXMiLCBuc3ZjaSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKCFzdHJjbXAob3BlcmF0aW9uLCAiYmxvY2siKSkKKwkJZ3Byc19uc190eF9ibG9jayhuc3ZjLCBOU19DQVVTRV9PTV9JTlRFUlZFTlRJT04pOworCWVsc2UgaWYgKCFzdHJjbXAob3BlcmF0aW9uLCAidW5ibG9jayIpKQorCQlncHJzX25zX3R4X3VuYmxvY2sobnN2Yyk7CisJZWxzZSBpZiAoIXN0cmNtcChvcGVyYXRpb24sICJyZXNldCIpKQorCQlncHJzX25zdmNfcmVzZXQobnN2YywgTlNfQ0FVU0VfT01fSU5URVJWRU5USU9OKTsKKwllbHNlCisJCXJldHVybiBDTURfV0FSTklORzsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obG9nZ2luZ19mbHRyX25zdmMsCisgICAgICBsb2dnaW5nX2ZsdHJfbnN2Y19jbWQsCisgICAgICAibG9nZ2luZyBmaWx0ZXIgbnN2YyAobnNlaXxuc3ZjaSkgPDAtNjU1MzU+IiwKKwlMT0dHSU5HX1NUUiBGSUxURVJfU1RSCisJIkZpbHRlciBiYXNlZCBvbiBOUyBWaXJ0dWFsIENvbm5lY3Rpb25cbiIKKwkiSWRlbnRpZnkgTlMtVkMgYnkgTlNFSVxuIgorCSJJZGVudGlmeSBOUy1WQyBieSBOU1ZDSVxuIgorCSJOdW1lcmljIGlkZW50aWZpZXJcbiIpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCBncHJzX25zdmMgKm5zdmM7CisJdWludDE2X3QgaWQgPSBhdG9pKGFyZ3ZbMV0pOworCisJY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OworCWlmICghY29ubi0+ZGJnKSB7CisJCXZ0eV9vdXQodnR5LCAiTG9nZ2luZyB3YXMgbm90IGVuYWJsZWQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAoIXN0cmNtcChhcmd2WzBdLCAibnNlaSIpKQorCQluc3ZjID0gbnN2Y19ieV9uc2VpKHZ0eV9uc2ksIGlkKTsKKwllbHNlCisJCW5zdmMgPSBuc3ZjX2J5X25zdmNpKHZ0eV9uc2ksIGlkKTsKKworCWlmICghbnN2YykgeworCQl2dHlfb3V0KHZ0eSwgIk5vIE5TLVZDIGJ5IHRoYXQgaWRlbnRpZmllciVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJbG9nX3NldF9uc3ZjX2ZpbHRlcihjb25uLT5kYmcsIG5zdmMpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworaW50IGdwcnNfbnNfdnR5X2luaXQoc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpKQoreworCXZ0eV9uc2kgPSBuc2k7CisKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnNob3dfbnNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnNob3dfbnNfc3RhdHNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnNob3dfbnNlX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50X3ZlKCZsb2dnaW5nX2ZsdHJfbnN2Y19jbWQpOworCisJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmY2ZnX25zX2NtZCk7CisJaW5zdGFsbF9ub2RlKCZuc19ub2RlLCBjb25maWdfd3JpdGVfbnMpOworCWluc3RhbGxfZGVmYXVsdChOU19OT0RFKTsKKwlpbnN0YWxsX2VsZW1lbnQoTlNfTk9ERSwgJm91cm5vZGVfZXhpdF9jbWQpOworCWluc3RhbGxfZWxlbWVudChOU19OT0RFLCAmb3Vybm9kZV9lbmRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTlNfTk9ERSwgJmNmZ19uc2VfbnN2Y2lfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTlNfTk9ERSwgJmNmZ19uc2VfcmVtb3RlaXBfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTlNfTk9ERSwgJmNmZ19uc2VfcmVtb3RlcG9ydF9jbWQpOworCWluc3RhbGxfZWxlbWVudChOU19OT0RFLCAmY2ZnX25zZV9mcl9kbGNpX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE5TX05PREUsICZjZmdfbnNlX2VuY2Fwc19jbWQpOworCWluc3RhbGxfZWxlbWVudChOU19OT0RFLCAmY2ZnX25zZV9yZW1vdGVyb2xlX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE5TX05PREUsICZjZmdfbm9fbnNlX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE5TX05PREUsICZjZmdfbnNfdGltZXJfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTlNfTk9ERSwgJmNmZ19uc2lwX2xvY2FsX2lwX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE5TX05PREUsICZjZmdfbnNpcF9sb2NhbF9wb3J0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE5TX05PREUsICZjZmdfZnJncmVfZW5hYmxlX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE5TX05PREUsICZjZmdfZnJncmVfbG9jYWxfaXBfY21kKTsKKworCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJm5zdmNfbnNlaV9jbWQpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfc2dzbi5jIGIvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX3Nnc24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTg3ZTYyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX3Nnc24uYwpAQCAtMCwwICsxLDI4NiBAQAorLyogR1BSUyBTR1NOIGZ1bmN0aW9uYWxpdHkgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGltZXIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9yYXRlX2N0ci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX3Nnc24uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfbnMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfYnNzZ3AuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3Nnc24uaD4KKworZXh0ZXJuIHN0cnVjdCBzZ3NuX2luc3RhbmNlICpzZ3NuOworCitMTElTVF9IRUFEKHNnc25fbW1fY3R4dHMpOworTExJU1RfSEVBRChzZ3NuX2dnc25fY3R4dHMpOworTExJU1RfSEVBRChzZ3NuX2Fwbl9jdHh0cyk7CitMTElTVF9IRUFEKHNnc25fcGRwX2N0eHRzKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByYXRlX2N0cl9kZXNjIG1tY3R4X2N0cl9kZXNjcmlwdGlvbltdID0geworCXsgInNpZ24ucGFja2V0cy5pbiIsCSJTaWduYWxsaW5nIE1lc3NhZ2VzICggSW4pIiB9LAorCXsgInNpZ24ucGFja2V0cy5vdXQiLAkiU2lnbmFsbGluZyBNZXNzYWdlcyAoT3V0KSIgfSwKKwl7ICJ1ZGF0YS5wYWNrZXRzLmluIiwJIlVzZXIgRGF0YSAgTWVzc2FnZXMgKCBJbikiIH0sCisJeyAidWRhdGEucGFja2V0cy5vdXQiLAkiVXNlciBEYXRhICBNZXNzYWdlcyAoT3V0KSIgfSwKKwl7ICJ1ZGF0YS5ieXRlcy5pbiIsCSJVc2VyIERhdGEgIEJ5dGVzICAgICggSW4pIiB9LAorCXsgInVkYXRhLmJ5dGVzLm91dCIsCSJVc2VyIERhdGEgIEJ5dGVzICAgIChPdXQpIiB9LAorCXsgInBkcF9jdHhfYWN0IiwJIlBEUCBDb250ZXh0IEFjdGl2YXRpb25zICAiIH0sCisJeyAic3VzcGVuZCIsCQkiU1VTUEVORCBDb3VudCAgICAgICAgICAgICIgfSwKKwl7ICJwYWdpbmcucHMiLAkJIlBhZ2luZyBQYWNrZXQgU3dpdGNoZWQgICAiIH0sCisJeyAicGFnaW5nLmNzIiwJCSJQYWdpbmcgQ2lyY3VpdCBTd2l0Y2hlZCAgIiB9LAorCXsgInJhX3VwZGF0ZSIsCQkiUm91dGluZyBBcmVhIFVwZGF0ZSAgICAgICIgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmF0ZV9jdHJfZ3JvdXBfZGVzYyBtbWN0eF9jdHJnX2Rlc2MgPSB7CisJLmdyb3VwX25hbWVfcHJlZml4ID0gInNnc24ubW1jdHgiLAorCS5ncm91cF9kZXNjcmlwdGlvbiA9ICJTR1NOIE1NIENvbnRleHQgU3RhdGlzdGljcyIsCisJLm51bV9jdHIgPSBBUlJBWV9TSVpFKG1tY3R4X2N0cl9kZXNjcmlwdGlvbiksCisJLmN0cl9kZXNjID0gbW1jdHhfY3RyX2Rlc2NyaXB0aW9uLAorfTsKKworc3RhdGljIGludCByYV9pZF9lcXVhbHMoY29uc3Qgc3RydWN0IGdwcnNfcmFfaWQgKmlkMSwKKwkJCWNvbnN0IHN0cnVjdCBncHJzX3JhX2lkICppZDIpCit7CisJcmV0dXJuIChpZDEtPm1jYyA9PSBpZDItPm1jYyAmJiBpZDEtPm1uYyA9PSBpZDItPm1uYyAmJgorCQlpZDEtPmxhYyA9PSBpZDItPmxhYyAmJiBpZDEtPnJhYyA9PSBpZDItPnJhYyk7Cit9CisKKy8qIGxvb2stdXAgYSBTR1NOIE1NIGNvbnRleHQgYmFzZWQgb24gVExMSSArIFJBSSAqLworc3RydWN0IHNnc25fbW1fY3R4ICpzZ3NuX21tX2N0eF9ieV90bGxpKHVpbnQzMl90IHRsbGksCisJCQkJCWNvbnN0IHN0cnVjdCBncHJzX3JhX2lkICpyYWlkKQoreworCXN0cnVjdCBzZ3NuX21tX2N0eCAqY3R4OworCWludCB0bGxpX3R5cGU7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjdHgsICZzZ3NuX21tX2N0eHRzLCBsaXN0KSB7CisJCWlmICh0bGxpID09IGN0eC0+dGxsaSAmJgorCQkgICAgcmFfaWRfZXF1YWxzKHJhaWQsICZjdHgtPnJhKSkKKwkJCXJldHVybiBjdHg7CisJfQorCisJdGxsaV90eXBlID0gZ3Byc190bGxpX3R5cGUodGxsaSk7CisJaWYgKHRsbGlfdHlwZSA9PSBUTExJX0xPQ0FMKSB7CisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGN0eCwgJnNnc25fbW1fY3R4dHMsIGxpc3QpIHsKKwkJCWlmICgoY3R4LT5wX3Rtc2kgfCAweEMwMDAwMDAwKSA9PSB0bGxpKSB7CisJCQkJY3R4LT50bGxpID0gdGxsaTsKKwkJCQlyZXR1cm4gY3R4OworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBzZ3NuX21tX2N0eCAqc2dzbl9tbV9jdHhfYnlfcHRtc2kodWludDMyX3QgcF90bXNpKQoreworCXN0cnVjdCBzZ3NuX21tX2N0eCAqY3R4OworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY3R4LCAmc2dzbl9tbV9jdHh0cywgbGlzdCkgeworCQlpZiAocF90bXNpID09IGN0eC0+cF90bXNpKQorCQkJcmV0dXJuIGN0eDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBzZ3NuX21tX2N0eCAqc2dzbl9tbV9jdHhfYnlfaW1zaShjb25zdCBjaGFyICppbXNpKQoreworCXN0cnVjdCBzZ3NuX21tX2N0eCAqY3R4OworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY3R4LCAmc2dzbl9tbV9jdHh0cywgbGlzdCkgeworCQlpZiAoIXN0cmNtcChpbXNpLCBjdHgtPmltc2kpKQorCQkJcmV0dXJuIGN0eDsKKwl9CisJcmV0dXJuIE5VTEw7CisKK30KKworLyogQWxsb2NhdGUgYSBuZXcgU0dTTiBNTSBjb250ZXh0ICovCitzdHJ1Y3Qgc2dzbl9tbV9jdHggKnNnc25fbW1fY3R4X2FsbG9jKHVpbnQzMl90IHRsbGksCisJCQkJCWNvbnN0IHN0cnVjdCBncHJzX3JhX2lkICpyYWlkKQoreworCXN0cnVjdCBzZ3NuX21tX2N0eCAqY3R4OworCisJY3R4ID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3Qgc2dzbl9tbV9jdHgpOworCWlmICghY3R4KQorCQlyZXR1cm4gTlVMTDsKKworCW1lbWNweSgmY3R4LT5yYSwgcmFpZCwgc2l6ZW9mKGN0eC0+cmEpKTsKKwljdHgtPnRsbGkgPSB0bGxpOworCWN0eC0+bW1fc3RhdGUgPSBHTU1fREVSRUdJU1RFUkVEOworCWN0eC0+Y3RyZyA9IHJhdGVfY3RyX2dyb3VwX2FsbG9jKGN0eCwgJm1tY3R4X2N0cmdfZGVzYywgdGxsaSk7CisJSU5JVF9MTElTVF9IRUFEKCZjdHgtPnBkcF9saXN0KTsKKworCWxsaXN0X2FkZCgmY3R4LT5saXN0LCAmc2dzbl9tbV9jdHh0cyk7CisKKwlyZXR1cm4gY3R4OworfQorCisKK3N0cnVjdCBzZ3NuX3BkcF9jdHggKnNnc25fcGRwX2N0eF9ieV9uc2FwaShjb25zdCBzdHJ1Y3Qgc2dzbl9tbV9jdHggKm1tLAorCQkJCQkgICB1aW50OF90IG5zYXBpKQoreworCXN0cnVjdCBzZ3NuX3BkcF9jdHggKnBkcDsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHBkcCwgJm1tLT5wZHBfbGlzdCwgbGlzdCkgeworCQlpZiAocGRwLT5uc2FwaSA9PSBuc2FwaSkKKwkJCXJldHVybiBwZHA7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3Qgc2dzbl9wZHBfY3R4ICpzZ3NuX3BkcF9jdHhfYnlfdGlkKGNvbnN0IHN0cnVjdCBzZ3NuX21tX2N0eCAqbW0sCisJCQkJCSB1aW50OF90IHRpZCkKK3sKKwlzdHJ1Y3Qgc2dzbl9wZHBfY3R4ICpwZHA7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShwZHAsICZtbS0+cGRwX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHBkcC0+dGkgPT0gdGlkKQorCQkJcmV0dXJuIHBkcDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKworc3RydWN0IHNnc25fcGRwX2N0eCAqc2dzbl9wZHBfY3R4X2FsbG9jKHN0cnVjdCBzZ3NuX21tX2N0eCAqbW0sCisJCQkJCXVpbnQ4X3QgbnNhcGkpCit7CisJc3RydWN0IHNnc25fcGRwX2N0eCAqcGRwOworCisJcGRwID0gc2dzbl9wZHBfY3R4X2J5X25zYXBpKG1tLCBuc2FwaSk7CisJaWYgKHBkcCkKKwkJcmV0dXJuIE5VTEw7CisKKwlwZHAgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBzZ3NuX3BkcF9jdHgpOworCWlmICghcGRwKQorCQlyZXR1cm4gTlVMTDsKKworCXBkcC0+bW0gPSBtbTsKKwlwZHAtPm5zYXBpID0gbnNhcGk7CisJbGxpc3RfYWRkKCZwZHAtPmxpc3QsICZtbS0+cGRwX2xpc3QpOworCWxsaXN0X2FkZCgmcGRwLT5nX2xpc3QsICZzZ3NuX3BkcF9jdHh0cyk7CisKKwlyZXR1cm4gcGRwOworfQorCit2b2lkIHNnc25fcGRwX2N0eF9mcmVlKHN0cnVjdCBzZ3NuX3BkcF9jdHggKnBkcCkKK3sKKwlsbGlzdF9kZWwoJnBkcC0+bGlzdCk7CisJbGxpc3RfZGVsKCZwZHAtPmdfbGlzdCk7CisJdGFsbG9jX2ZyZWUocGRwKTsKK30KKworLyogR0dTTiBjb250ZXh0cyAqLworCitzdHJ1Y3Qgc2dzbl9nZ3NuX2N0eCAqc2dzbl9nZ3NuX2N0eF9hbGxvYyh1aW50MzJfdCBpZCkKK3sKKwlzdHJ1Y3Qgc2dzbl9nZ3NuX2N0eCAqZ2djOworCisJZ2djID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3Qgc2dzbl9nZ3NuX2N0eCk7CisJaWYgKCFnZ2MpCisJCXJldHVybiBOVUxMOworCisJZ2djLT5pZCA9IGlkOworCWdnYy0+Z3RwX3ZlcnNpb24gPSAxOworCS8qIGlmIHdlIGFyZSBjYWxsZWQgZnJvbSBjb25maWcgZmlsZSBwYXJzZSwgdGhpcyBnc24gZG9lc24ndCBleGlzdCB5ZXQgKi8KKwlnZ2MtPmdzbiA9IHNnc24tPmdzbjsKKwlsbGlzdF9hZGQoJmdnYy0+bGlzdCwgJnNnc25fZ2dzbl9jdHh0cyk7CisKKwlyZXR1cm4gZ2djOworfQorCitzdHJ1Y3Qgc2dzbl9nZ3NuX2N0eCAqc2dzbl9nZ3NuX2N0eF9ieV9pZCh1aW50MzJfdCBpZCkKK3sKKwlzdHJ1Y3Qgc2dzbl9nZ3NuX2N0eCAqZ2djOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoZ2djLCAmc2dzbl9nZ3NuX2N0eHRzLCBsaXN0KSB7CisJCWlmIChpZCA9PSBnZ2MtPmlkKQorCQkJcmV0dXJuIGdnYzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBzZ3NuX2dnc25fY3R4ICpzZ3NuX2dnc25fY3R4X2ZpbmRfYWxsb2ModWludDMyX3QgaWQpCit7CisJc3RydWN0IHNnc25fZ2dzbl9jdHggKmdnYzsKKworCWdnYyA9IHNnc25fZ2dzbl9jdHhfYnlfaWQoaWQpOworCWlmICghZ2djKQorCQlnZ2MgPSBzZ3NuX2dnc25fY3R4X2FsbG9jKGlkKTsKKwlyZXR1cm4gZ2djOworfQorCisvKiBBUE4gY29udGV4dHMgKi8KKworI2lmIDAKK3N0cnVjdCBhcG5fY3R4ICphcG5fY3R4X2FsbG9jKGNvbnN0IGNoYXIgKmFwX25hbWUpCit7CisJc3RydWN0IGFwbl9jdHggKmFjdHg7CisKKwlhY3R4ID0gdGFsbG9jX3plcm8odGFsbG9jX2JzY19jdHgsIHN0cnVjdCBhcG5fY3R4KTsKKwlpZiAoIWFjdHgpCisJCXJldHVybiBOVUxMOworCWFjdHgtPm5hbWUgPSB0YWxsb2Nfc3RyZHVwKGFjdHgsIGFwX25hbWUpOworCisJcmV0dXJuIGFjdHg7Cit9CisKK3N0cnVjdCBhcG5fY3R4ICphcG5fY3R4X2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgYXBuX2N0eCAqYWN0eDsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGFjdHgsICZzZ3NuX2Fwbl9jdHh0cywgbGlzdCkgeworCQlpZiAoIXN0cmNtcChuYW1lLCBhY3R4LT5uYW1lKSkKKwkJCXJldHVybiBhY3R4OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGFwbl9jdHggKmFwbl9jdHhfZmluZF9hbGxvYyhjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBhcG5fY3R4ICphY3R4OworCisJYWN0eCA9IGFwbl9jdHhfYnlfbmFtZShuYW1lKTsKKwlpZiAoIWFjdHgpCisJCWFjdHggPSBhcG5fY3R4X2FsbG9jKG5hbWUpOworCisJcmV0dXJuIGFjdHg7Cit9CisjZW5kaWYKKwordWludDMyX3Qgc2dzbl9hbGxvY19wdG1zaSh2b2lkKQoreworCXN0cnVjdCBzZ3NuX21tX2N0eCAqbW07CisJdWludDMyX3QgcHRtc2k7CisKK3Jlc3RhcnQ6CisJcHRtc2kgPSByYW5kKCk7CisJbGxpc3RfZm9yX2VhY2hfZW50cnkobW0sICZzZ3NuX21tX2N0eHRzLCBsaXN0KSB7CisJCWlmIChtbS0+cF90bXNpID09IHB0bXNpKQorCQkJZ290byByZXN0YXJ0OworCX0KKworCXJldHVybiBwdG1zaTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19zbmRjcC5jIGIvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX3NuZGNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlhNzYzOAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19zbmRjcC5jCkBAIC0wLDAgKzEsMTI5IEBACisvKiBHUFJTIFNORENQIHByb3RvY29sIGltcGxlbWVudGF0aW9uIGFzIHBlciAzR1BQIFRTIDA0LjY1ICovCisKKy8qIChDKSAyMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RpbWVyLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19ic3NncC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19sbGMuaD4KKworLyogQ2hhcHRlciA3LjI6IFNOLVBEVSBGb3JtYXRzICovCitzdHJ1Y3Qgc25kY3BfY29tbW9uX2hkciB7CisJLyogb2N0ZXQgMSAqLworCXVpbnQ4X3QgbnNhcGk6NDsKKwl1aW50OF90IG1vcmU6MTsKKwl1aW50OF90IHR5cGU6MTsKKwl1aW50OF90IGZpcnN0OjE7CisJdWludDhfdCBzcGFyZToxOworCS8qIG9jdGV0IDIgKi8KKwl1aW50OF90IHBjb21wOworCXVpbnQ4X3QgZGNvbXA7Cit9OworCitzdHJ1Y3Qgc25kY3BfdWRhdGFfaGRyIHsKKwkvKiBvY3RldCAzICovCisJdWludDhfdCBucGR1X2hpZ2g6NDsKKwl1aW50OF90IHNlZ19ucjo0OworCS8qIG9jdGV0IDQgKi8KKwl1aW50OF90IG5wZHVfbG93OworfTsKKworc3RydWN0IHNuZGNwX2VudGl0eSB7Cit9OworCisvKiBFbnRyeSBwb2ludCBmb3IgdGhlIExMLVVOSVREQVRBLmluZGljYXRpb24gKi8KK2ludCBzbmRjcF91bml0ZGF0YV9pbmQoc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCBzYXBpLCB1aW50OF90ICpoZHIsIHVpbnQ4X3QgbGVuKQoreworCXN0cnVjdCBzbmRjcF91ZGF0YV9oZHIgKnN1aDsKKwl1aW50MTZfdCBucGR1OworCisJaWYgKHN1aC0+dHlwZSA9PSAwKSB7CisJCUxPR1AoREdQUlMsIExPR0xfRVJST1IsICJTTi1EQVRBIFBEVSBhdCB1bml0ZGF0YV9pbmQoKSBmdW5jdGlvblxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW5wZHUgPSAoc3VoLT5ucGR1X2hpZ2ggPDwgOCkgfCBzdWgtPm5wZHVfbG93OworfQorCisvKiBTZWN0aW9uIDUuMS4yLjEgTEwtUkVTRVQuaW5kICovCitzdGF0aWMgaW50IHNuZGNwX2xsX3Jlc2V0X2luZChzdHJ1Y3Qgc25kY3BfZW50aXR5ICpzZSwpCit7CisJLyogdHJlYXQgYWxsIG91dHN0YW5kaW5nIFNORENQLUxMQyByZXF1ZXN0IHR5cGUgcHJpbWl0aXZlcyBhcyBub3Qgc2VudCAqLworCS8qIHJlc2V0IGFsbCBTTkRDUCBYSUQgcGFyYW1ldGVycyB0byBkZWZhdWx0IHZhbHVlcyAqLworfQorCisvKiBTZWN0aW9uIDUuMS4yLjE3IExMLVVOSVREQVRBLmluZCAqLworc3RhdGljIGludCBzbmRjcF9sbF91bml0ZGF0YV9pbmQoKQoreworfQorCitzdGF0aWMgaW50IHNuZGNwX2xsX3N0YXR1c19pbmQoKQoreworCS8qIGluZm9ybSB0aGUgU00gc3ViLWxheWVyIGJ5IG1lYW5zIG9mIFNOU00tU1RBVFVTLnJlcSAqLworfQorCitzdGF0aWMgc3RydWN0IHNuZGNwX3N0YXRlX2xpc3Qge3sKKwl1aW50MzJfdAlzdGF0ZXM7CisJdW5zaWduZWQgaW50CXR5cGU7CisJaW50CQkoKnJvdXQpKHN0cnVjdCBzbmRjcF9lbnRpdHkgKnNlLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKK30gc25kY3Bfc3RhdGVfbGlzdFtdID0geworCXsgQUxMX1NUQVRFUywKKwkgIExMX1JFU0VUX0lORCwgc25kY3BfbGxfcmVzZXRfaW5kIH0sCisJeyBBTExfU1RBVEVTLAorCSAgTExfRVNUQUJMSVNIX0lORCwgc25kY3BfbGxfZXN0X2luZCB9LAorCXsgU0JJVChTTkRDUF9TX0VTVF9SUUQpLAorCSAgTExfRVNUQUJMSVNIX1JFU1AsIHNuZGNwX2xsX2VzdF9pbmQgfSwKKwl7IFNCSVQoU05EQ1BfU19FU1RfUlFEKSwKKwkgIExMX0VTVEFCTElTSF9DT05GLCBzbmRjcF9sbF9lc3RfY29uZiB9LAorCXsgU0JJVChTTkRDUF9TXworfTsKKworc3RhdGljIGludCBzbmRjcF9yeF9sbGNfcHJpbSgpCit7CisJY2FzZSBMTF9FU1RBQkxJU0hfUkVROgorCWNhc2UgTExfUkVMRUFTRV9SRVE6CisJY2FzZSBMTF9YSURfUkVROgorCWNhc2UgTExfREFUQV9SRVE6CisJTExfVU5JVERBVEFfUkVRLAkvKiBUTExJLCBTTi1QRFUsIFJlZiwgUW9TLCBSYWRpbyBQcmlvLCBDaXBoICovCisKKwlzd2l0Y2ggKHByaW0pIHsKKwljYXNlIExMX1JFU0VUX0lORDoKKwljYXNlIExMX0VTVEFCTElTSF9JTkQ6CisJY2FzZSBMTF9FU1RBQkxJU0hfUkVTUDoKKwljYXNlIExMX0VTVEFCTElTSF9DT05GOgorCWNhc2UgTExfUkVMRUFTRV9JTkQ6CisJY2FzZSBMTF9SRUxFQVNFX0NPTkY6CisJY2FzZSBMTF9YSURfSU5EOgorCWNhc2UgTExfWElEX1JFU1A6CisJY2FzZSBMTF9YSURfQ09ORjoKKwljYXNlIExMX0RBVEFfSU5EOgorCWNhc2UgTExfREFUQV9DT05GOgorCWNhc2UgTExfVU5JVERBVEFfSU5EOgorCWNhc2UgTExfU1RBVFVTX0lORDoKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dwcnMvb3Ntb19nYnByb3h5LmNmZyBiL29wZW5ic2Mvc3JjL2dwcnMvb3Ntb19nYnByb3h5LmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmI1NjE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3Bycy9vc21vX2dicHJveHkuY2ZnCkBAIC0wLDAgKzEsMjQgQEAKKyEKKyEgT3Ntb2NvbSBHYiBQcm94eSAoMC45LjAuNDA0LTY0NjMpIGNvbmZpZ3VyYXRpb24gc2F2ZWQgZnJvbSB2dHkKKyEhCishCitsaW5lIHZ0eQorIG5vIGxvZ2luCishCitnYnByb3h5Cisgc2dzbiBuc2VpIDEwMQorbnMKKyBuc2UgMTAxIG5zdmNpIDEwMQorIG5zZSAxMDEgcmVtb3RlLXJvbGUgc2dzbgorIG5zZSAxMDEgZW5jYXBzdWxhdGlvbiB1ZHAKKyBuc2UgMTAxIHJlbW90ZS1pcCAxOTIuMTY4LjEwMC4yMzkKKyBuc2UgMTAxIHJlbW90ZS1wb3J0IDc3NzcKKyB0aW1lciB0bnMtYmxvY2sgMworIHRpbWVyIHRucy1ibG9jay1yZXRyaWVzIDMKKyB0aW1lciB0bnMtcmVzZXQgMworIHRpbWVyIHRucy1yZXNldC1yZXRyaWVzIDMKKyB0aW1lciB0bnMtdGVzdCAzMAorIHRpbWVyIHRucy1hbGl2ZSAzCisgdGltZXIgdG5zLWFsaXZlLXJldHJpZXMgMTAKKyBlbmNhcHN1bGF0aW9uIGZyYW1lcmVsYXktZ3JlIGVuYWJsZWQgMQorIGVuY2Fwc3VsYXRpb24gZnJhbWVyZWxheS1ncmUgbG9jYWwtaXAgMC4wLjAuMApkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3Bycy9vc21vX3Nnc24uY2ZnIGIvb3BlbmJzYy9zcmMvZ3Bycy9vc21vX3Nnc24uY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5OGQyZDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ncHJzL29zbW9fc2dzbi5jZmcKQEAgLTAsMCArMSwyMiBAQAorIQorISBPc21vY29tIFNHU04gKDAuOS4wLjQwNC02NDYzKSBjb25maWd1cmF0aW9uIHNhdmVkIGZyb20gdnR5CishIQorIQorbGluZSB2dHkKKyBubyBsb2dpbgorIQorc2dzbgorICBnZ3NuIDAgcmVtb3RlLWlwIDEyNy4wLjAuMQorICBnZ3NuIDAgZ3RwLXZlcnNpb24gMQorbnMKKyBlbmNhcHN1bGF0aW9uIHVkcCBsb2NhbC1pcCAxOTIuMTY4LjEwMC4yMzkKKyBlbmNhcHN1bGF0aW9uIHVkcCBsb2NhbC1wb3J0IDIzMDAwCisgZW5jYXBzdWxhdGlvbiBmcmFtZXJlbGF5LWdyZSBlbmFibGVkIDEKKyB0aW1lciB0bnMtYmxvY2sgMworIHRpbWVyIHRucy1ibG9jay1yZXRyaWVzIDMKKyB0aW1lciB0bnMtcmVzZXQgMworIHRpbWVyIHRucy1yZXNldC1yZXRyaWVzIDMKKyB0aW1lciB0bnMtdGVzdCAzMAorIHRpbWVyIHRucy1hbGl2ZSAzCisgdGltZXIgdG5zLWFsaXZlLXJldHJpZXMgMTAKK2Jzc2dwCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ncHJzL3Nnc25fbGliZ3RwLmMgYi9vcGVuYnNjL3NyYy9ncHJzL3Nnc25fbGliZ3RwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYzOTJiOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dwcnMvc2dzbl9saWJndHAuYwpAQCAtMCwwICsxLDQ1OSBAQAorLyogR1BSUyBTR1NOIGludGVncmF0aW9uIHdpdGggbGliZ3RwIG9mIE9wZW5HR1NOICovCisKKy8qIChDKSAyMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAxMCBieSBPbiBXYXZlcworICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL2ZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvcmF0ZV9jdHIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOF9ncHJzLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3Nnc24uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfc2dzbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19nbW0uaD4KKworI2luY2x1ZGUgPGd0cC5oPgorI2luY2x1ZGUgPHBkcC5oPgorCitjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGd0cF9jYXVzZV9zdHJzW10gPSB7CisJeyBHVFBDQVVTRV9SRVFfSU1TSSwgIlJlcXVlc3QgSU1TSSIgfSwKKwl7IEdUUENBVVNFX1JFUV9JTUVJLCAiUmVxdWVzdCBJTUVJIiB9LAorCXsgR1RQQ0FVU0VfUkVRX0lNU0lfSU1FSSwgIlJlcXVlc3QgSU1TSSBhbmQgSU1FSSIgfSwKKwl7IEdUUENBVVNFX05PX0lEX05FRURFRCwgIk5vIGlkZW50aXR5IG5lZWRlZCIgfSwKKwl7IEdUUENBVVNFX01TX1JFRlVTRVNfWCwgIk1TIHJlZnVzZXMiIH0sCisJeyBHVFBDQVVTRV9NU19OT1RfUkVTUF9YLCAiTVMgaXMgbm90IEdQUlMgcmVzcG9uZGluZyIgfSwKKwl7IEdUUENBVVNFX0FDQ19SRVEsICJSZXF1ZXN0IGFjY2VwdGVkIiB9LAorCXsgR1RQQ0FVU0VfTk9OX0VYSVNULCAiTm9uLWV4aXN0ZW50IiB9LAorCXsgR1RQQ0FVU0VfSU5WQUxJRF9NRVNTQUdFLCAiSW52YWxpZCBtZXNzYWdlIGZvcm1hdCIgfSwKKwl7IEdUUENBVVNFX0lNU0lfTk9UX0tOT1dOLCAiSU1TSSBub3Qga25vd24iIH0sCisJeyBHVFBDQVVTRV9NU19ERVRBQ0hFRCwgIk1TIGlzIEdQUlMgZGV0YWNoZWQiIH0sCisJeyBHVFBDQVVTRV9NU19OT1RfUkVTUCwgIk1TIGlzIG5vdCBHUFJTIHJlc3BvbmRpbmciIH0sCisJeyBHVFBDQVVTRV9NU19SRUZVU0VTLCAiTVMgcmVmdXNlcyIgfSwKKwl7IEdUUENBVVNFX05PX1JFU09VUkNFUywgIk5vIHJlc291cmNlcyBhdmFpbGFibGUiIH0sCisJeyBHVFBDQVVTRV9OT1RfU1VQUE9SVEVELCAiU2VydmljZSBub3Qgc3VwcG9ydGVkIiB9LAorCXsgR1RQQ0FVU0VfTUFOX0lFX0lOQ09SUkVDVCwgIk1hbmRhdG9yeSBJRSBpbmNvcnJlY3QiIH0sCisJeyBHVFBDQVVTRV9NQU5fSUVfTUlTU0lORywgIk1hbmRhdG9yeSBJRSBtaXNzaW5nIiB9LAorCXsgR1RQQ0FVU0VfT1BUX0lFX0lOQ09SUkVDVCwgIk9wdGlvbmFsIElFIGluY29ycmVjdCIgfSwKKwl7IEdUUENBVVNFX1NZU19GQUlMLCAiU3lzdGVtIGZhaWx1cmUiIH0sCisJeyBHVFBDQVVTRV9ST0FNSU5HX1JFU1QsICJSb2FtaW5nIHJlc3RyaWN0aW9ucyIgfSwKKwl7IEdUUENBVVNFX1BUSU1TSV9NSVNNQVRDSCwgIlAtVE1TSSBTaWduYXR1cmUgbWlzbWF0Y2giIH0sCisJeyBHVFBDQVVTRV9DT05OX1NVU1AsICJHUFJTIGNvbm5lY3Rpb24gc3VzcGVuZGVkIiB9LAorCXsgR1RQQ0FVU0VfQVVUSF9GQUlMLCAiQXV0aGVudGljYXRpb24gZmFpbHVyZSIgfSwKKwl7IEdUUENBVVNFX1VTRVJfQVVUSF9GQUlMLCAiVXNlciBhdXRoZW50aWNhdGlvbiBmYWlsZWQiIH0sCisJeyBHVFBDQVVTRV9DT05URVhUX05PVF9GT1VORCwgIkNvbnRleHQgbm90IGZvdW5kIiB9LAorCXsgR1RQQ0FVU0VfQUREUl9PQ0NVUElFRCwgIkFsbCBkeW5hbWljIFBEUCBhZGRyZXNzZXMgb2NjdXBpZWQiIH0sCisJeyBHVFBDQVVTRV9OT19NRU1PUlksICJObyBtZW1vcnkgaXMgYXZhaWxhYmxlIiB9LAorCXsgR1RQQ0FVU0VfUkVMT0NfRkFJTCwgIlJlbG9jYXRpb24gZmFpbHVyZSIgfSwKKwl7IEdUUENBVVNFX1VOS05PV05fTUFOX0VYVEhFQURFUiwgIlVua25vd24gbWFuZGF0b3J5IGV4dC4gaGVhZGVyIiB9LAorCXsgR1RQQ0FVU0VfU0VNX0VSUl9URlQsICJTZW1hbnRpYyBlcnJvciBpbiBURlQgb3BlcmF0aW9uIiB9LAorCXsgR1RQQ0FVU0VfU1lOX0VSUl9URlQsICJTeW50YWN0aWMgZXJyb3IgaW4gVEZUIG9wZXJhdGlvbiIgfSwKKwl7IEdUUENBVVNFX1NFTV9FUlJfRklMVEVSLCAiU2VtYW50aWMgZXJyb3JzIGluIHBhY2tldCBmaWx0ZXIiIH0sCisJeyBHVFBDQVVTRV9TWU5fRVJSX0ZJTFRFUiwgIlN5bnRhY3RpYyBlcnJvcnMgaW4gcGFja2V0IGZpbHRlciIgfSwKKwl7IEdUUENBVVNFX01JU1NJTkdfQVBOLCAiTWlzc2luZyBvciB1bmtub3duIEFQTiIgfSwKKwl7IEdUUENBVVNFX1VOS05PV05fUERQLCAiVW5rbm93biBQRFAgYWRkcmVzcyBvciBQRFAgdHlwZSIgfSwKKwl7IDAsIE5VTEwgfQorfTsKKworLyogZ2VuZXJhdGUgYSBQRFAgY29udGV4dCBiYXNlZCBvbiB0aGUgSUUncyBmcm9tIHRoZSAwNC4wOCBtZXNzYWdlLAorICogYW5kIHNlbmQgdGhlIEdUUCBjcmVhdGUgcGRwIGNvbnRleHQgcmVxdWVzdCB0byB0aGUgR0dTTiAqLworc3RydWN0IHNnc25fcGRwX2N0eCAqc2dzbl9jcmVhdGVfcGRwX2N0eChzdHJ1Y3Qgc2dzbl9nZ3NuX2N0eCAqZ2dzbiwKKwkJCQkJIHN0cnVjdCBzZ3NuX21tX2N0eCAqbW1jdHgsCisJCQkJCSB1aW50MTZfdCBuc2FwaSwKKwkJCQkJIHN0cnVjdCB0bHZfcGFyc2VkICp0cCkKK3sKKwlzdHJ1Y3Qgc2dzbl9wZHBfY3R4ICpwY3R4OworCXN0cnVjdCBwZHBfdCAqcGRwOworCXVpbnQ2NF90IGltc2lfdWk2NCA9IDA7CisJaW50IHJjOworCisJTE9HUChER1BSUywgTE9HTF9FUlJPUiwgIkNyZWF0ZSBQRFAgQ29udGV4dFxuIik7CisJcGN0eCA9IHNnc25fcGRwX2N0eF9hbGxvYyhtbWN0eCwgbnNhcGkpOworCWlmICghcGN0eCkgeworCQlMT0dQKERHUFJTLCBMT0dMX0VSUk9SLCAiQ291bGRuJ3QgYWxsb2NhdGUgUERQIEN0eFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXJjID0gcGRwX25ld3BkcCgmcGRwLCBpbXNpX3VpNjQsIG5zYXBpLCBOVUxMKTsKKwlpZiAocmMpIHsKKwkJTE9HUChER1BSUywgTE9HTF9FUlJPUiwgIk91dCBvZiBsaWJndHAgUERQIENvbnRleHRzXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXBjdHgtPmxpYiA9IHBkcDsKKwlwY3R4LT5nZ3NuID0gZ2dzbjsKKworCS8vcGRwLT5wZWVyID0JLyogc29ja2FkZHJfaW4gb2YgR0dTTiAocmVjZWl2ZSkgKi8KKwkvL3BkcC0+aXBpZiA9CS8qIG5vdCB1c2VkIGJ5IGxpYnJhcnkgKi8KKwlwZHAtPnZlcnNpb24gPSBnZ3NuLT5ndHBfdmVyc2lvbjsKKwlwZHAtPmhpc2FkZHIwID0JZ2dzbi0+cmVtb3RlX2FkZHI7CisJcGRwLT5oaXNhZGRyMSA9IGdnc24tPnJlbW90ZV9hZGRyOworCS8vcGRwLT5jY2hfcGRwID0gNTEyOwkvKiBDaGFyZ2luZyBGbGF0IFJhdGUgKi8KKworCS8qIE1TIHByb3ZpZGVkIEFQTiwgc3Vic2NyaXB0aW9uIG5vdCB2ZXJpZmllZCAqLworCXBkcC0+c2VsbW9kZSA9IDB4MDE7CisKKwkvKiBJTVNJLCBURUlEL1RFSUMsIEZMTFUvRkxMQywgVElELCBOU0FQSSBzZXQgaW4gcGRwX25ld3BkcCAqLworCisJLyogRklYTUU6IE1TSVNETiBpbiBCQ0QgZm9ybWF0IGZyb20gbW1jdHggKi8KKwkvL3BkcC0+bXNpc2RuLmwvLnYKKworCS8qIEVuZCBVc2VyIEFkZHJlc3MgZnJvbSBHTU0gcmVxdWVzdGVkIFBEUCBhZGRyZXNzICovCisJcGRwLT5ldWEubCA9IFRMVlBfTEVOKHRwLCBPU01PX0lFX0dTTV9SRVFfUERQX0FERFIpOworCWlmIChwZHAtPmV1YS5sID4gc2l6ZW9mKHBkcC0+ZXVhLnYpKQorCQlwZHAtPmV1YS5sID0gc2l6ZW9mKHBkcC0+ZXVhLnYpOworCW1lbWNweShwZHAtPmV1YS52LCBUTFZQX1ZBTCh0cCwgT1NNT19JRV9HU01fUkVRX1BEUF9BRERSKSwKKwkJcGRwLT5ldWEubCk7CisJLyogSGlnaGVzdCA0IGJpdHMgb2YgZmlyc3QgYnl0ZSBuZWVkIHRvIGJlIHNldCB0byAxLCBvdGhlcndpc2UKKwkgKiB0aGUgSUUgaXMgaWRlbnRpY2FsIHdpdGggdGhlIDA0LjA4IFBEUCBBZGRyZXNzIElFICovCisJcGRwLT5ldWEudlswXSB8PSAweGYwOworCisJLyogQVBOIG5hbWUgZnJvbSBHTU0gKi8KKwlwZHAtPmFwbl91c2UubCA9IFRMVlBfTEVOKHRwLCBHU000OF9JRV9HU01fQVBOKTsKKwlpZiAocGRwLT5hcG5fdXNlLmwgPiBzaXplb2YocGRwLT5hcG5fdXNlLnYpKQorCQlwZHAtPmFwbl91c2UubCA9IHNpemVvZihwZHAtPmFwbl91c2Uudik7CisJbWVtY3B5KHBkcC0+YXBuX3VzZS52LCBUTFZQX1ZBTCh0cCwgR1NNNDhfSUVfR1NNX0FQTiksCisJCXBkcC0+YXBuX3VzZS5sKTsKKworCS8qIFByb3RvY29sIENvbmZpZ3VyYXRpb24gT3B0aW9ucyBmcm9tIEdNTSAqLworCXBkcC0+cGNvX3JlcS5sID0gVExWUF9MRU4odHAsIEdTTTQ4X0lFX0dTTV9QUk9UT19DT05GX09QVCk7CisJaWYgKHBkcC0+cGNvX3JlcS5sID4gc2l6ZW9mKHBkcC0+cGNvX3JlcS52KSkKKwkJcGRwLT5wY29fcmVxLmwgPSBzaXplb2YocGRwLT5wY29fcmVxLnYpOworCW1lbWNweShwZHAtPnBjb19yZXEudiwgVExWUF9WQUwodHAsIEdTTTQ4X0lFX0dTTV9QUk9UT19DT05GX09QVCksCisJCXBkcC0+cGNvX3JlcS5sKTsKKworCS8qIFFvUyBvcHRpb25zIGZyb20gR01NICovCisJcGRwLT5xb3NfcmVxLmwgPSBUTFZQX0xFTih0cCwgT1NNT19JRV9HU01fUkVRX1FPUyk7CisJaWYgKHBkcC0+cW9zX3JlcS5sID4gc2l6ZW9mKHBkcC0+cW9zX3JlcS52KSkKKwkJcGRwLT5xb3NfcmVxLmwgPSBzaXplb2YocGRwLT5xb3NfcmVxLnYpOworCW1lbWNweShwZHAtPnFvc19yZXEudiwgVExWUF9WQUwodHAsIE9TTU9fSUVfR1NNX1JFUV9RT1MpLAorCQlwZHAtPnFvc19yZXEubCk7CisKKwkvKiBTR1NOIGFkZHJlc3MgZm9yIGNvbnRyb2wgcGxhbmUgKi8KKwlwZHAtPmdzbmxjLmwgPSBzaXplb2Yoc2dzbi0+Y2ZnLmd0cF9saXN0ZW5hZGRyKTsKKwltZW1jcHkocGRwLT5nc25sYy52LCAmc2dzbi0+Y2ZnLmd0cF9saXN0ZW5hZGRyLAorCQlzaXplb2Yoc2dzbi0+Y2ZnLmd0cF9saXN0ZW5hZGRyKSk7CisKKwkvKiBTR1NOIGFkZHJlc3MgZm9yIHVzZXIgcGxhbmUgKi8KKwlwZHAtPmdzbmx1LmwgPSBzaXplb2Yoc2dzbi0+Y2ZnLmd0cF9saXN0ZW5hZGRyKTsKKwltZW1jcHkocGRwLT5nc25sdS52LCAmc2dzbi0+Y2ZnLmd0cF9saXN0ZW5hZGRyLAorCQlzaXplb2Yoc2dzbi0+Y2ZnLmd0cF9saXN0ZW5hZGRyKSk7CisKKwkvKiBjaGFuZ2UgcGRwIHN0YXRlIHRvICdyZXF1ZXN0ZWQnICovCisJcGN0eC0+c3RhdGUgPSBQRFBfU1RBVEVfQ1JfUkVROworCisJcmMgPSBndHBfY3JlYXRlX2NvbnRleHRfcmVxKGdnc24tPmdzbiwgcGRwLCBwY3R4KTsKKwkvKiBGSVhNRSAqLworCisJcmV0dXJuIHBjdHg7Cit9CisKK2ludCBzZ3NuX2RlbGV0ZV9wZHBfY3R4KHN0cnVjdCBzZ3NuX3BkcF9jdHggKnBjdHgpCit7CisJTE9HUChER1BSUywgTE9HTF9FUlJPUiwgIkRlbGV0ZSBQRFAgQ29udGV4dFxuIik7CisKKwkvKiBGSVhNRTogZGVjaWRlIGlmIHdlIG5lZWQgdGVhcmRvd24gb3Igbm90ICEgKi8KKwlyZXR1cm4gZ3RwX2RlbGV0ZV9jb250ZXh0X3JlcShwY3R4LT5nZ3NuLT5nc24sIHBjdHgtPmxpYiwgcGN0eCwgMSk7Cit9CisKK3N0cnVjdCBjYXVzZV9tYXAgeworCXVpbnQ4X3QgY2F1c2VfaW47CisJdWludDhfdCBjYXVzZV9vdXQ7Cit9OworCitzdGF0aWMgdWludDhfdCBjYXVzZV9tYXAoY29uc3Qgc3RydWN0IGNhdXNlX21hcCAqbWFwLCB1aW50OF90IGluLCB1aW50OF90IGRlZmx0KQoreworCWNvbnN0IHN0cnVjdCBjYXVzZV9tYXAgKm07CisKKwlmb3IgKG0gPSBtYXA7IG0tPmNhdXNlX2luICYmIG0tPmNhdXNlX291dDsgbSsrKSB7CisJCWlmIChtLT5jYXVzZV9pbiA9PSBpbikKKwkJCXJldHVybiBtLT5jYXVzZV9vdXQ7CisJfQorCXJldHVybiBkZWZsdDsKK30KKworLyogaG93IGRvIHdlIG1hcCBmcm9tIGd0cCBjYXVzZSB0byBTTSBjYXVzZSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBjYXVzZV9tYXAgZ3RwMnNtX2NhdXNlX21hcFtdID0geworCXsgR1RQQ0FVU0VfTk9fUkVTT1VSQ0VTLCAJR1NNX0NBVVNFX0lOU1VGRl9SU1JDIH0sCisJeyBHVFBDQVVTRV9OT1RfU1VQUE9SVEVELAlHU01fQ0FVU0VfU0VSVl9PUFRfTk9UU1VQUCB9LAorCXsgR1RQQ0FVU0VfTUFOX0lFX0lOQ09SUkVDVCwJR1NNX0NBVVNFX0lOVl9NQU5EX0lORk8gfSwKKwl7IEdUUENBVVNFX01BTl9JRV9NSVNTSU5HLAlHU01fQ0FVU0VfSU5WX01BTkRfSU5GTyB9LAorCXsgR1RQQ0FVU0VfT1BUX0lFX0lOQ09SUkVDVCwJR1NNX0NBVVNFX1BST1RPX0VSUl9VTlNQRUMgfSwKKwl7IEdUUENBVVNFX1NZU19GQUlMLAkJR1NNX0NBVVNFX05FVF9GQUlMIH0sCisJeyBHVFBDQVVTRV9ST0FNSU5HX1JFU1QsCUdTTV9DQVVTRV9SRVFfU0VSVl9PUFRfTk9UU1VCIH0sCisJeyBHVFBDQVVTRV9QVElNU0lfTUlTTUFUQ0gsCUdTTV9DQVVTRV9QUk9UT19FUlJfVU5TUEVDIH0sCisJeyBHVFBDQVVTRV9DT05OX1NVU1AsCQlHU01fQ0FVU0VfUFJPVE9fRVJSX1VOU1BFQyB9LAorCXsgR1RQQ0FVU0VfQVVUSF9GQUlMLAkJR1NNX0NBVVNFX0FVVEhfRkFJTEVEIH0sCisJeyBHVFBDQVVTRV9VU0VSX0FVVEhfRkFJTCwJR1NNX0NBVVNFX0FDVF9SRUpfR0dTTiB9LAorCXsgR1RQQ0FVU0VfQ09OVEVYVF9OT1RfRk9VTkQsCUdTTV9DQVVTRV9QUk9UT19FUlJfVU5TUEVDIH0sCisJeyBHVFBDQVVTRV9BRERSX09DQ1VQSUVELAlHU01fQ0FVU0VfSU5TVUZGX1JTUkMgfSwKKwl7IEdUUENBVVNFX05PX01FTU9SWSwJCUdTTV9DQVVTRV9JTlNVRkZfUlNSQyB9LAorCXsgR1RQQ0FVU0VfUkVMT0NfRkFJTCwJCUdTTV9DQVVTRV9QUk9UT19FUlJfVU5TUEVDIH0sCisJeyBHVFBDQVVTRV9VTktOT1dOX01BTl9FWFRIRUFERVIsIEdTTV9DQVVTRV9QUk9UT19FUlJfVU5TUEVDIH0sCisJeyBHVFBDQVVTRV9NSVNTSU5HX0FQTiwJCUdTTV9DQVVTRV9NSVNTSU5HX0FQTiB9LAorCXsgR1RQQ0FVU0VfVU5LTk9XTl9QRFAsCQlHU01fQ0FVU0VfVU5LTk9XTl9QRFAgfSwKKwl7IDAsIDAgfQorfTsKKworLyogVGhlIEdHU04gaGFzIGNvbmZpcm1lZCB0aGUgY3JlYXRpb24gb2YgYSBQRFAgQ29udGV4dCAqLworc3RhdGljIGludCBjcmVhdGVfcGRwX2NvbmYoc3RydWN0IHBkcF90ICpwZHAsIHZvaWQgKmNicCwgaW50IGNhdXNlKQoreworCXN0cnVjdCBzZ3NuX3BkcF9jdHggKnBjdHggPSBjYnA7CisJdWludDhfdCByZWplY3RfY2F1c2U7CisKKwlERUJVR1AoREdQUlMsICJSZWNlaXZlZCBDUkVBVEUgUERQIENUWCBDT05GLCBjYXVzZT0lZCglcylcbiIsCisJCWNhdXNlLCBnZXRfdmFsdWVfc3RyaW5nKGd0cF9jYXVzZV9zdHJzLCBjYXVzZSkpOworCisJLyogQ2hlY2sgZm9yIGNhdXNlIHZhbHVlIGlmIGl0IHdhcyByZWFsbHkgc3VjY2Vzc2Z1bCAqLworCWlmIChjYXVzZSA8IDApIHsKKwkJTE9HUChER1BSUywgTE9HTF9OT1RJQ0UsICJDcmVhdGUgUERQIGN0eCByZXEgdGltZWQgb3V0XG4iKTsKKwkJaWYgKHBkcC0+dmVyc2lvbiA9PSAxKSB7CisJCQlwZHAtPnZlcnNpb24gPSAwOworCQkJZ3RwX2NyZWF0ZV9jb250ZXh0X3JlcShzZ3NuLT5nc24sIHBkcCwgY2JwKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJcmVqZWN0X2NhdXNlID0gR1NNX0NBVVNFX05FVF9GQUlMOworCQkJZ290byByZWplY3Q7CisJCX0KKwl9CisKKwkvKiBDaGVjayBmb3IgY2F1c2UgdmFsdWUgaWYgaXQgd2FzIHJlYWxseSBzdWNjZXNzZnVsICovCisJaWYgKGNhdXNlICE9IEdUUENBVVNFX0FDQ19SRVEpIHsKKwkJcmVqZWN0X2NhdXNlID0gY2F1c2VfbWFwKGd0cDJzbV9jYXVzZV9tYXAsIGNhdXNlLAorCQkJCQkgR1NNX0NBVVNFX0FDVF9SRUpfR0dTTik7CisJCWdvdG8gcmVqZWN0OworCX0KKworCS8qIFNlbmQgUERQIENUWCBBQ1QgdG8gTVMgKi8KKwlyZXR1cm4gZ3NtNDhfdHhfZ3NtX2FjdF9wZHBfYWNjKHBjdHgpOworCityZWplY3Q6CisJcGN0eC0+c3RhdGUgPSBQRFBfU1RBVEVfTk9ORTsKKwlwZHBfZnJlZXBkcChwZHApOworCXNnc25fcGRwX2N0eF9mcmVlKHBjdHgpOworCS8qIFNlbmQgUERQIENUWCBBQ1QgUkVKIHRvIE1TICovCisJcmV0dXJuIGdzbTQ4X3R4X2dzbV9hY3RfcGRwX3JlaihwY3R4LT5tbSwgcGRwLT50aSwgcmVqZWN0X2NhdXNlLAorCQkJCQkwLCBOVUxMKTsKKworCXJldHVybiBFT0Y7Cit9CisKKy8qIENvbmZpcm1hdGlvbiBvZiBhIFBEUCBDb250ZXh0IERlbGV0ZSAqLworc3RhdGljIGludCBkZWxldGVfcGRwX2NvbmYoc3RydWN0IHBkcF90ICpwZHAsIHZvaWQgKmNicCwgaW50IGNhdXNlKQoreworCXN0cnVjdCBzZ3NuX3BkcF9jdHggKnBjdHggPSBjYnA7CisJaW50IHJjOworCisJREVCVUdQKERHUFJTLCAiUmVjZWl2ZWQgREVMRVRFIFBEUCBDVFggQ09ORiwgY2F1c2U9JWQoJXMpXG4iLAorCQljYXVzZSwgZ2V0X3ZhbHVlX3N0cmluZyhndHBfY2F1c2Vfc3RycywgY2F1c2UpKTsKKworCS8qIENvbmZpcm0gZGVhY3RpdmF0aW9uIG9mIFBEUCBjb250ZXh0IHRvIE1TICovCisJcmMgPSBnc200OF90eF9nc21fZGVhY3RfcGRwX2FjYyhwY3R4KTsKKworCXNnc25fcGRwX2N0eF9mcmVlKHBjdHgpOworCisJcmV0dXJuIHJjOworfQorCisvKiBDb25maXJtYXRpb24gb2YgYW4gR1RQIEVDSE8gcmVxdWVzdCAqLworc3RhdGljIGludCBlY2hvX2NvbmYoaW50IHJlY292ZXJ5KQoreworCWlmIChyZWNvdmVyeSA8IDApIHsKKwkJREVCVUdQKERHUFJTLCAiR1RQIEVjaG8gUmVxdWVzdCB0aW1lZCBvdXRcbiIpOworCQkvKiBGSVhNRTogaWYgdmVyc2lvbiA9PSAxLCByZXRyeSB3aXRoIHZlcnNpb24gMCAqLworCX0gZWxzZSB7CisJCURFQlVHUChER1BSUywgIkdUUCBSeCBFY2hvIFJlc3BvbnNlXG4iKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIGxpYmd0cCBjYWxsYmFjayBmb3IgY29uZmlybWF0aW9ucyAqLworc3RhdGljIGludCBjYl9jb25mKGludCB0eXBlLCBpbnQgY2F1c2UsIHN0cnVjdCBwZHBfdCAqcGRwLCB2b2lkICpjYnApCit7CisJREVCVUdQKERHUFJTLCAibGliZ3RwIGNiX2NvbmYodHlwZT0lZCwgY2F1c2U9JWQsIHBkcD0lcCwgY2JwPSVwKVxuIiwKKwkJdHlwZSwgY2F1c2UsIHBkcCwgY2JwKTsKKworCWlmIChjYXVzZSA9PSBFT0YpCisJCUxPR1AoREdQUlMsIExPR0xfRVJST1IsICJsaWJndHAgRU9GICh0eXBlPSV1LCBwZHA9JXAsIGNicD0lcClcbiIsCisJCQl0eXBlLCBwZHAsIGNicCk7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEdUUF9FQ0hPX1JFUToKKwkJcmV0dXJuIGVjaG9fY29uZihjYXVzZSk7CisJY2FzZSBHVFBfQ1JFQVRFX1BEUF9SRVE6CisJCXJldHVybiBjcmVhdGVfcGRwX2NvbmYocGRwLCBjYnAsIGNhdXNlKTsKKwljYXNlIEdUUF9ERUxFVEVfUERQX1JFUToKKwkJcmV0dXJuIGRlbGV0ZV9wZHBfY29uZihwZHAsIGNicCwgY2F1c2UpOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGVkIHdoZW5ldmVyIGEgUERQIGNvbnRleHQgaXMgZGVsZXRlZCBmb3IgYW55IHJlYXNvbiAqLworc3RhdGljIGludCBjYl9kZWxldGVfY29udGV4dChzdHJ1Y3QgcGRwX3QgKnBkcCkKK3sKKwlMT0dQKERHUFJTLCBMT0dMX0lORk8sICJQRFAgQ29udGV4dCB3YXMgZGVsZXRlZFxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxlZCB3aGVuIHdlIHJlY2VpdmUgYSBWZXJzaW9uIE5vdCBTdXBwb3J0ZWQgbWVzc2FnZSAqLworc3RhdGljIGludCBjYl91bnN1cF9pbmQoc3RydWN0IHNvY2thZGRyX2luICpwZWVyKQoreworCUxPR1AoREdQUlMsIExPR0xfSU5GTywgIkdUUCBWZXJzaW9uIG5vdCBzdXBwb3J0ZWQgSW5kaWNhdGlvbiAiCisJCSJmcm9tICVzOiV1XG4iLCBpbmV0X250b2EocGVlci0+c2luX2FkZHIpLAorCQludG9ocyhwZWVyLT5zaW5fcG9ydCkpOworCXJldHVybiAwOworfQorCisvKiBDYWxsZWQgd2hlbiB3ZSByZWNlaXZlIGEgU3VwcG9ydGVkIEV4dCBIZWFkZXJzIE5vdGlmaWNhdGlvbiAqLworc3RhdGljIGludCBjYl9leHRoZWFkZXJfaW5kKHN0cnVjdCBzb2NrYWRkcl9pbiAqcGVlcikKK3sKKwlMT0dQKERHUFJTLCBMT0dMX0lORk8sICJHVFAgU3VwcG9ydGVkIEV4dCBIZWFkZXJzIE5vZmljaWF0aW9uICIKKwkJImZyb20gJXM6JXVcbiIsIGluZXRfbnRvYShwZWVyLT5zaW5fYWRkciksCisJCW50b2hzKHBlZXItPnNpbl9wb3J0KSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxlZCB3aGVuZXZlciB3ZSByZWNpdmUgYSBEQVRBIHBhY2tldCAqLworc3RhdGljIGludCBjYl9kYXRhX2luZChzdHJ1Y3QgcGRwX3QgKnBkcCwgdm9pZCAqcGFja2V0LCB1bnNpZ25lZCBpbnQgbGVuKQoreworCURFQlVHUChER1BSUywgIkdUUCBEQVRBIElORCBmcm9tIEdHU04sIGxlbmd0aD0ldVxuIiwgbGVuKTsKKwkvKiBGSVhNRTogcmVzb2x2ZSBQRFAvTU0gY29udGV4dCwgZm9yd2FyZCB0byBTTkRDUCBsYXllciAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qIGxpYmd0cCBzZWxlY3QgbG9vcCBpbnRlZ3JhdGlvbiAqLworc3RhdGljIGludCBzZ3NuX2d0cF9mZF9jYihzdHJ1Y3QgYnNjX2ZkICpmZCwgdW5zaWduZWQgaW50IHdoYXQpCit7CisJc3RydWN0IHNnc25faW5zdGFuY2UgKnNnaSA9IGZkLT5kYXRhOworCWludCByYzsKKworCWlmICghKHdoYXQgJiBCU0NfRkRfUkVBRCkpCisJCXJldHVybiAwOworCisJc3dpdGNoIChmZC0+cHJpdl9ucikgeworCWNhc2UgMDoKKwkJcmMgPSBndHBfZGVjYXBzMChzZ2ktPmdzbik7CisJCWJyZWFrOworCWNhc2UgMToKKwkJcmMgPSBndHBfZGVjYXBzMWMoc2dpLT5nc24pOworCQlicmVhazsKKwljYXNlIDI6CisJCXJjID0gZ3RwX2RlY2FwczF1KHNnaS0+Z3NuKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBzZ3NuX2d0cF90bXJfc3RhcnQoc3RydWN0IHNnc25faW5zdGFuY2UgKnNnaSkKK3sKKwlzdHJ1Y3QgdGltZXZhbCBuZXh0OworCisJLyogUmV0cmlldmUgbmV4dCByZXRyYW5zbWlzc2lvbiBhcyBzdHJ1Y3QgdGltZXZhbCAqLworCWd0cF9yZXRyYW5zdGltZW91dChzZ2ktPmdzbiwgJm5leHQpOworCisJLyogcmUtc2NoZWR1bGUgdGhlIHRpbWVyICovCisJYnNjX3NjaGVkdWxlX3RpbWVyKCZzZ2ktPmd0cF90aW1lciwgbmV4dC50dl9zZWMsIG5leHQudHZfdXNlYy8xMDAwKTsKK30KKworLyogdGltZXIgY2FsbGJhY2sgZm9yIGxpYmd0cCByZXRyYW5zbWlzc2lvbnMgYW5kIHBpbmcgKi8KK3N0YXRpYyB2b2lkIHNnc25fZ3RwX3Rtcl9jYih2b2lkICpkYXRhKQoreworCXN0cnVjdCBzZ3NuX2luc3RhbmNlICpzZ2kgPSBkYXRhOworCisJLyogRG8gYWxsIHRoZSByZXRyYW5zbWlzc2lvbnMgYXMgbmVlZGVkICovCisJZ3RwX3JldHJhbnMoc2dpLT5nc24pOworCisJc2dzbl9ndHBfdG1yX3N0YXJ0KHNnaSk7Cit9CisKK2ludCBzZ3NuX2d0cF9pbml0KHN0cnVjdCBzZ3NuX2luc3RhbmNlICpzZ2kpCit7CisJaW50IHJjOworCXN0cnVjdCBnc25fdCAqZ3NuOworCisJcmMgPSBndHBfbmV3KCZzZ2ktPmdzbiwgc2dpLT5jZmcuZ3RwX3N0YXRlZGlyLAorCQkgICAgICZzZ2ktPmNmZy5ndHBfbGlzdGVuYWRkci5zaW5fYWRkciwgR1RQX01PREVfU0dTTik7CisJaWYgKHJjKSB7CisJCUxPR1AoREdQUlMsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIEdUUDogJWRcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKwlnc24gPSBzZ2ktPmdzbjsKKworCXNnaS0+Z3RwX2ZkMC5mZCA9IGdzbi0+ZmQwOworCXNnaS0+Z3RwX2ZkMC5wcml2X25yID0gMDsKKwlzZ2ktPmd0cF9mZDAuZGF0YSA9IHNnaTsKKwlzZ2ktPmd0cF9mZDAud2hlbiA9IEJTQ19GRF9SRUFEOworCXNnaS0+Z3RwX2ZkMC5jYiA9IHNnc25fZ3RwX2ZkX2NiOworCXJjID0gYnNjX3JlZ2lzdGVyX2ZkKCZzZ2ktPmd0cF9mZDApOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXNnaS0+Z3RwX2ZkMWMuZmQgPSBnc24tPmZkMWM7CisJc2dpLT5ndHBfZmQxYy5wcml2X25yID0gMTsKKwlzZ2ktPmd0cF9mZDFjLmRhdGEgPSBzZ2k7CisJc2dpLT5ndHBfZmQxYy53aGVuID0gQlNDX0ZEX1JFQUQ7CisJc2dpLT5ndHBfZmQxYy5jYiA9IHNnc25fZ3RwX2ZkX2NiOworCWJzY19yZWdpc3Rlcl9mZCgmc2dpLT5ndHBfZmQxYyk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJc2dpLT5ndHBfZmQxdS5mZCA9IGdzbi0+ZmQxdTsKKwlzZ2ktPmd0cF9mZDF1LnByaXZfbnIgPSAyOworCXNnaS0+Z3RwX2ZkMXUuZGF0YSA9IHNnaTsKKwlzZ2ktPmd0cF9mZDF1LndoZW4gPSBCU0NfRkRfUkVBRDsKKwlzZ2ktPmd0cF9mZDF1LmNiID0gc2dzbl9ndHBfZmRfY2I7CisJYnNjX3JlZ2lzdGVyX2ZkKCZzZ2ktPmd0cF9mZDF1KTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwkvKiBTdGFydCBHVFAgcmUtdHJhbnNtaXNzaW9uIHRpbWVyICovCisJc2dpLT5ndHBfdGltZXIuY2IgPSBzZ3NuX2d0cF90bXJfY2I7CisJc2dpLT5ndHBfdGltZXIuZGF0YSA9IHNnaTsKKwlzZ3NuX2d0cF90bXJfc3RhcnQoc2dpKTsKKworCS8qIFJlZ2lzdGVyIGNhbGxiYWNrY3Mgd2l0aCBsaWJndHAgKi8KKwlndHBfc2V0X2NiX2RlbGV0ZV9jb250ZXh0KGdzbiwgY2JfZGVsZXRlX2NvbnRleHQpOworCWd0cF9zZXRfY2JfY29uZihnc24sIGNiX2NvbmYpOworCWd0cF9zZXRfY2JfZGF0YV9pbmQoZ3NuLCBjYl9kYXRhX2luZCk7CisJZ3RwX3NldF9jYl91bnN1cF9pbmQoZ3NuLCBjYl91bnN1cF9pbmQpOworCWd0cF9zZXRfY2JfZXh0aGVhZGVyX2luZChnc24sIGNiX2V4dGhlYWRlcl9pbmQpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ncHJzL3Nnc25fbWFpbi5jIGIvb3BlbmJzYy9zcmMvZ3Bycy9zZ3NuX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzM4ZjcwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3Bycy9zZ3NuX21haW4uYwpAQCAtMCwwICsxLDIxMCBAQAorLyogR1BSUyBTR1NOIEltcGxlbWVudGF0aW9uICovCisKKy8qIChDKSAyMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAxMCBieSBPbiBXYXZlcworICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL2ZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvcmF0ZV9jdHIuaD4KKworI2luY2x1ZGUgPG9zbW9jb20vdnR5L3RlbG5ldF9pbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdnR5Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zZ3NuLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX25zLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX2Jzc2dwLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX2xsYy5oPgorCisjaW5jbHVkZSA8Z3RwLmg+CisKKyNpbmNsdWRlICIuLi8uLi9ic2Njb25maWcuaCIKKworLyogdGhpcyBpcyBoZXJlIGZvciB0aGUgdnR5Li4uIGl0IHdpbGwgbmV2ZXIgYmUgY2FsbGVkICovCit2b2lkIHN1YnNjcl9wdXQoKSB7IGFib3J0KCk7IH0KKworI2RlZmluZSBfR05VX1NPVVJDRQorI2luY2x1ZGUgPGdldG9wdC5oPgorCit2b2lkICp0YWxsX2JzY19jdHg7CisKK3N0cnVjdCBncHJzX25zX2luc3QgKnNnc25fbnNpOworY29uc3QgY2hhciAqb3BlbmJzY19jb3B5cmlnaHQgPQorCSJDb3B5cmlnaHQgKEMpIDIwMTAgSGFyYWxkIFdlbHRlIGFuZCBPbi1XYXZlc1xuIgorCSJMaWNlbnNlIEdQTHYyKzogR05VIEdQTCB2ZXJzaW9uIDIgb3IgbGF0ZXIgPGh0dHA6Ly9nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sPlxuIgorCSJUaGlzIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBhcmUgZnJlZSB0byBjaGFuZ2UgYW5kIHJlZGlzdHJpYnV0ZSBpdC5cbiIKKwkiVGhlcmUgaXMgTk8gV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdy5cbiI7CisKK3N0YXRpYyBzdHJ1Y3Qgc2dzbl9pbnN0YW5jZSBzZ3NuX2luc3QgPSB7CisJLmNvbmZpZ19maWxlID0gIm9zbW9fc2dzbi5jZmciLAorCS5jZmcgPSB7CisJCS5ndHBfc3RhdGVkaXIgPSAiLi8iLAorCX0sCit9Oworc3RydWN0IHNnc25faW5zdGFuY2UgKnNnc24gPSAmc2dzbl9pbnN0OworCisvKiBjYWxsLWJhY2sgZnVuY3Rpb24gZm9yIHRoZSBOUyBwcm90b2NvbCAqLworc3RhdGljIGludCBzZ3NuX25zX2NiKGVudW0gZ3Byc19uc19ldnQgZXZlbnQsIHN0cnVjdCBncHJzX25zdmMgKm5zdmMsCisJCSAgICAgIHN0cnVjdCBtc2diICptc2csIHVfaW50MTZfdCBidmNpKQoreworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBHUFJTX05TX0VWVF9VTklUX0RBVEE6CisJCS8qIGhhbmQgdGhlIG1lc3NhZ2UgaW50byB0aGUgQlNTR1AgaW1wbGVtZW50YXRpb24gKi8KKwkJcmMgPSBncHJzX2Jzc2dwX3Jjdm1zZyhtc2cpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERHUFJTLCBMT0dMX0VSUk9SLCAiU0dTTjogVW5rbm93biBldmVudCAldSBmcm9tIE5TXG4iLCBldmVudCk7CisJCWlmIChtc2cpCisJCQl0YWxsb2NfZnJlZShtc2cpOworCQlyYyA9IC1FSU87CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIHNpZ25hbF9oYW5kbGVyKGludCBzaWduYWwpCit7CisJZnByaW50ZihzdGRvdXQsICJzaWduYWwgJXUgcmVjZWl2ZWRcbiIsIHNpZ25hbCk7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU0lHSU5UOgorCQlkaXNwYXRjaF9zaWduYWwoU1NfR0xPQkFMLCBTX0dMT0JBTF9TSFVURE9XTiwgTlVMTCk7CisJCXNsZWVwKDEpOworCQlleGl0KDApOworCQlicmVhazsKKwljYXNlIFNJR0FCUlQ6CisJCS8qIGluIGNhc2Ugb2YgYWJvcnQsIHdlIHdhbnQgdG8gb2J0YWluIGEgdGFsbG9jIHJlcG9ydAorCQkgKiBhbmQgdGhlbiByZXR1cm4gdG8gdGhlIGNhbGxlciwgd2hvIHdpbGwgYWJvcnQgdGhlIHByb2Nlc3MgKi8KKwljYXNlIFNJR1VTUjE6CisJCXRhbGxvY19yZXBvcnQodGFsbF92dHlfY3R4LCBzdGRlcnIpOworCQl0YWxsb2NfcmVwb3J0X2Z1bGwodGFsbF9ic2NfY3R4LCBzdGRlcnIpOworCQlicmVhazsKKwljYXNlIFNJR1VTUjI6CisJCXRhbGxvY19yZXBvcnRfZnVsbCh0YWxsX3Z0eV9jdHgsIHN0ZGVycik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworLyogTlNJIHRoYXQgQlNTR1AgdXNlcyB3aGVuIHRyYW5zbWl0dGluZyBvbiBOUyAqLworZXh0ZXJuIHN0cnVjdCBncHJzX25zX2luc3QgKmJzc2dwX25zaTsKK2V4dGVybiB2b2lkICp0YWxsX21zZ2JfY3R4OworCitleHRlcm4gaW50IGJzY192dHlfZ29fcGFyZW50KHN0cnVjdCB2dHkgKnZ0eSk7CisKK3N0YXRpYyBzdHJ1Y3QgdnR5X2FwcF9pbmZvIHZ0eV9pbmZvID0geworCS5uYW1lIAkJPSAiT3Ntb2NvbSBTR1NOIiwKKwkudmVyc2lvbgk9IFBBQ0tBR0VfVkVSU0lPTiwKKwkuZ29fcGFyZW50X2NiCT0gYnNjX3Z0eV9nb19wYXJlbnQsCit9OworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrIGR1bW15X25ldHdvcms7CisJc3RydWN0IGxvZ190YXJnZXQgKnN0ZGVycl90YXJnZXQ7CisJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKwlpbnQgcmM7CisKKwl0YWxsX2JzY19jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QoTlVMTCwgMCwgIm9zbW9fc2dzbiIpOworCXRhbGxfbXNnYl9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAibXNnYiIpOworCisJc2lnbmFsKFNJR0lOVCwgJnNpZ25hbF9oYW5kbGVyKTsKKwlzaWduYWwoU0lHQUJSVCwgJnNpZ25hbF9oYW5kbGVyKTsKKwlzaWduYWwoU0lHVVNSMSwgJnNpZ25hbF9oYW5kbGVyKTsKKwlzaWduYWwoU0lHVVNSMiwgJnNpZ25hbF9oYW5kbGVyKTsKKwlzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisKKwlsb2dfaW5pdCgmbG9nX2luZm8pOworCXN0ZGVycl90YXJnZXQgPSBsb2dfdGFyZ2V0X2NyZWF0ZV9zdGRlcnIoKTsKKwlsb2dfYWRkX3RhcmdldChzdGRlcnJfdGFyZ2V0KTsKKwlsb2dfc2V0X2FsbF9maWx0ZXIoc3RkZXJyX3RhcmdldCwgMSk7CisKKwl2dHlfaW5mby5jb3B5cmlnaHQgPSBvcGVuYnNjX2NvcHlyaWdodDsKKwl2dHlfaW5pdCgmdnR5X2luZm8pOworCWxvZ2dpbmdfdnR5X2FkZF9jbWRzKCk7CisgICAgICAgIHNnc25fdnR5X2luaXQoKTsKKworCXJhdGVfY3RyX2luaXQodGFsbF9ic2NfY3R4KTsKKwlyYyA9IHRlbG5ldF9pbml0KHRhbGxfYnNjX2N0eCwgJmR1bW15X25ldHdvcmssIDQyNDUpOworCWlmIChyYyA8IDApCisJCWV4aXQoMSk7CisKKwlzZ3NuX25zaSA9IGdwcnNfbnNfaW5zdGFudGlhdGUoJnNnc25fbnNfY2IpOworCWlmICghc2dzbl9uc2kpIHsKKwkJTE9HUChER1BSUywgTE9HTF9FUlJPUiwgIlVuYWJsZSB0byBpbnN0YW50aWF0ZSBOU1xuIik7CisJCWV4aXQoMSk7CisJfQorCWJzc2dwX25zaSA9IHNnc25faW5zdC5jZmcubnNpID0gc2dzbl9uc2k7CisJZ3Byc19uc192dHlfaW5pdChic3NncF9uc2kpOworCWdwcnNfYnNzZ3BfdnR5X2luaXQoKTsKKwlncHJzX2xsY192dHlfaW5pdCgpOworCS8qIEZJWE1FOiByZWdpc3RlciBzaWduYWwgaGFuZGxlciBmb3IgU1NfTlMgKi8KKworCXJjID0gc2dzbl9wYXJzZV9jb25maWcoc2dzbl9pbnN0LmNvbmZpZ19maWxlLCAmc2dzbl9pbnN0LmNmZyk7CisJaWYgKHJjIDwgMCkgeworCQlMT0dQKERHUFJTLCBMT0dMX0ZBVEFMLCAiQ2Fubm90IHBhcnNlIGNvbmZpZyBmaWxlXG4iKTsKKwkJZXhpdCgyKTsKKwl9CisKKwlyYyA9IHNnc25fZ3RwX2luaXQoJnNnc25faW5zdCk7CisJaWYgKHJjKSB7CisJCUxPR1AoREdQUlMsIExPR0xfRkFUQUwsICJDYW5ub3QgYmluZC9saXN0ZW4gb24gR1RQIHNvY2tldFxuIik7CisJCWV4aXQoMik7CisJfQorCisJcmMgPSBncHJzX25zX25zaXBfbGlzdGVuKHNnc25fbnNpKTsKKwlpZiAocmMgPCAwKSB7CisJCUxPR1AoREdQUlMsIExPR0xfRkFUQUwsICJDYW5ub3QgYmluZC9saXN0ZW4gb24gTlNJUCBzb2NrZXRcbiIpOworCQlleGl0KDIpOworCX0KKworCXJjID0gZ3Byc19uc19mcmdyZV9saXN0ZW4oc2dzbl9uc2kpOworCWlmIChyYyA8IDApIHsKKwkJTE9HUChER1BSUywgTE9HTF9GQVRBTCwgIkNhbm5vdCBiaW5kL2xpc3RlbiBHUkUgIgorCQkJInNvY2tldC4gRG8geW91IGhhdmUgQ0FQX05FVF9SQVc/XG4iKTsKKwkJZXhpdCgyKTsKKwl9CisKKwl3aGlsZSAoMSkgeworCQlyYyA9IGJzY19zZWxlY3RfbWFpbigwKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWV4aXQoMyk7CisJfQorCisJZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dwcnMvc2dzbl92dHkuYyBiL29wZW5ic2Mvc3JjL2dwcnMvc2dzbl92dHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGRkOGM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3Bycy9zZ3NuX3Z0eS5jCkBAIC0wLDAgKzEsMjc2IEBACisvKgorICogKEMpIDIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDEwIGJ5IE9uLVdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS91dGlscy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3JhdGVfY3RyLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zZ3NuLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX25zLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX3Nnc24uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3Z0eS5oPgorCisjaW5jbHVkZSA8b3Ntb2NvbS92dHkvY29tbWFuZC5oPgorI2luY2x1ZGUgPG9zbW9jb20vdnR5L3Z0eS5oPgorCisjaW5jbHVkZSA8cGRwLmg+CisKK3N0YXRpYyBzdHJ1Y3Qgc2dzbl9jb25maWcgKmdfY2ZnID0gTlVMTDsKKworc3RhdGljIHN0cnVjdCBjbWRfbm9kZSBzZ3NuX25vZGUgPSB7CisJU0dTTl9OT0RFLAorCSIlcyhzZ3NuKSMiLAorCTEsCit9OworCitzdGF0aWMgaW50IGNvbmZpZ193cml0ZV9zZ3NuKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlzdHJ1Y3QgaW5fYWRkciBpYTsKKwlzdHJ1Y3Qgc2dzbl9nZ3NuX2N0eCAqZ2N0eDsKKworCXZ0eV9vdXQodnR5LCAic2dzbiVzIiwgVlRZX05FV0xJTkUpOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoZ2N0eCwgJnNnc25fZ2dzbl9jdHh0cywgbGlzdCkgeworCQl2dHlfb3V0KHZ0eSwgIiBnZ3NuICV1IHJlbW90ZS1pcCAlcyVzIiwgZ2N0eC0+aWQsCisJCQlpbmV0X250b2EoZ2N0eC0+cmVtb3RlX2FkZHIpLCBWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAiIGdnc24gJXUgZ3RwLXZlcnNpb24gJXUlcyIsIGdjdHgtPmlkLAorCQkJZ2N0eC0+Z3RwX3ZlcnNpb24sIFZUWV9ORVdMSU5FKTsKKwl9CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19zZ3NuLAorICAgICAgY2ZnX3Nnc25fY21kLAorICAgICAgInNnc24iLAorICAgICAgIkNvbmZpZ3VyZSB0aGUgU0dTTiIpCit7CisJdnR5LT5ub2RlID0gU0dTTl9OT0RFOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2dnc25fcmVtb3RlX2lwLCBjZmdfZ2dzbl9yZW1vdGVfaXBfY21kLAorCSJnZ3NuIDwwLTI1NT4gcmVtb3RlLWlwIEEuQi5DLkQiLAorCSIiKQoreworCXVpbnQzMl90IGlkID0gYXRvaShhcmd2WzBdKTsKKwlzdHJ1Y3Qgc2dzbl9nZ3NuX2N0eCAqZ2djID0gc2dzbl9nZ3NuX2N0eF9maW5kX2FsbG9jKGlkKTsKKworCWluZXRfYXRvbihhcmd2WzFdLCAmZ2djLT5yZW1vdGVfYWRkcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKyNpZiAwCitERUZVTihjZmdfZ2dzbl9yZW1vdGVfcG9ydCwgY2ZnX2dnc25fcmVtb3RlX3BvcnRfY21kLAorCSJnZ3NuIDwwLTI1NT4gcmVtb3RlLXBvcnQgPDAtNjU1MzU+IiwKKwkiIikKK3sKKwl1aW50MzJfdCBpZCA9IGF0b2koYXJndlswXSk7CisJc3RydWN0IHNnc25fZ2dzbl9jdHggKmdnYyA9IHNnc25fZ2dzbl9jdHhfZmluZF9hbGxvYyhpZCk7CisJdWludDE2X3QgcG9ydCA9IGF0b2koYXJndlsxXSk7CisKK30KKyNlbmRpZgorCitERUZVTihjZmdfZ2dzbl9ndHBfdmVyc2lvbiwgY2ZnX2dnc25fZ3RwX3ZlcnNpb25fY21kLAorCSJnZ3NuIDwwLTI1NT4gZ3RwLXZlcnNpb24gKDB8MSkiLAorCSIiKQoreworCXVpbnQzMl90IGlkID0gYXRvaShhcmd2WzBdKTsKKwlzdHJ1Y3Qgc2dzbl9nZ3NuX2N0eCAqZ2djID0gc2dzbl9nZ3NuX2N0eF9maW5kX2FsbG9jKGlkKTsKKworCWlmIChhdG9pKGFyZ3ZbMV0pKQorCQlnZ2MtPmd0cF92ZXJzaW9uID0gMTsKKwllbHNlCisJCWdnYy0+Z3RwX3ZlcnNpb24gPSAwOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisjaWYgMAorREVGVU4oY2ZnX2Fwbl9nZ3NuLCBjZmdfYXBuX2dnc25fY21kLAorCSJhcG4gQVBOQU1FIGdnc24gPDAtMjU1PiIsCisJIiIpCit7CisJc3RydWN0IGFwbl9jdHggKioKK30KKyNlbmRpZgorCitjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGdwcnNfbW1fc3Rfc3Ryc1tdID0geworCXsgR01NX0RFUkVHSVNURVJFRCwgIkRFUkVHSVNURVJFRCIgfSwKKwl7IEdNTV9DT01NT05fUFJPQ19JTklULCAiQ09NTU9OIFBST0NFRFVSRSAoSU5JVCkiIH0sCisJeyBHTU1fUkVHSVNURVJFRF9OT1JNQUwsICJSRUdJU1RFUkVEIChOT1JNQUwpIiB9LAorCXsgR01NX1JFR0lTVEVSRURfU1VTUEVOREVELCAiUkVHSVNUZVJFRCAoU1VTUEVOREVEKSIgfSwKKwl7IEdNTV9ERVJFR0lTVEVSRURfSU5JVCwgIkRFUkVHSVNURVJFRCAoSU5JVCkiIH0sCisJeyAwLCBOVUxMIH0KK307CisKK3N0YXRpYyB2b2lkIHZ0eV9kdW1wX3BkcChzdHJ1Y3QgdnR5ICp2dHksIGNvbnN0IGNoYXIgKnBmeCwKKwkJCSBzdHJ1Y3Qgc2dzbl9wZHBfY3R4ICpwZHApCit7CisJdnR5X291dCh2dHksICIlc1BEUCBDb250ZXh0IElNU0k6ICVzLCBTQVBJOiAldSwgTlNBUEk6ICV1JXMiLAorCQlwZngsIHBkcC0+bW0tPmltc2ksIHBkcC0+c2FwaSwgcGRwLT5uc2FwaSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiJXMgIEFQTjogJXNcbiIsIHBmeCwgcGRwLT5saWItPmFwbl91c2Uudik7CisJLyogRklYTUU6IHN0YXRpc3RpY3MgKi8KKwkvL3Z0eV9vdXRfcmF0ZV9jdHJfZ3JvdXAodnR5LCAiICIsIHBkcC0+Y3RyZyk7Cit9CisKK3N0YXRpYyB2b2lkIHZ0eV9kdW1wX21tY3R4KHN0cnVjdCB2dHkgKnZ0eSwgY29uc3QgY2hhciAqcGZ4LAorCQkJICAgc3RydWN0IHNnc25fbW1fY3R4ICptbSwgaW50IHBkcCkKK3sKKwl2dHlfb3V0KHZ0eSwgIiVzTU0gQ29udGV4dCBmb3IgSU1TSSAlcywgSU1FSSAlcywgUC1UTVNJICUwOHglcyIsCisJCXBmeCwgbW0tPmltc2ksIG1tLT5pbWVpLCBtbS0+cF90bXNpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIlcyAgTVNJU0ROOiAlcywgVExMSTogJTA4eCVzIiwgcGZ4LCBtbS0+bXNpc2RuLAorCQltbS0+dGxsaSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiJXMgIE1NIFN0YXRlOiAlcywgUm91dGVpbmcgQXJlYTogJXUtJXUtJXUtJXUsICIKKwkJIkNlbGwgSUQ6ICV1JXMiLCBwZngsCisJCWdldF92YWx1ZV9zdHJpbmcoZ3Byc19tbV9zdF9zdHJzLCBtbS0+bW1fc3RhdGUpLAorCQltbS0+cmEubWNjLCBtbS0+cmEubW5jLCBtbS0+cmEubGFjLCBtbS0+cmEucmFjLAorCQltbS0+Y2VsbF9pZCwgVlRZX05FV0xJTkUpOworCisJdnR5X291dF9yYXRlX2N0cl9ncm91cCh2dHksICIgIiwgbW0tPmN0cmcpOworCisJaWYgKHBkcCkgeworCQlzdHJ1Y3Qgc2dzbl9wZHBfY3R4ICpwZHA7CisKKwkJbGxpc3RfZm9yX2VhY2hfZW50cnkocGRwLCAmbW0tPnBkcF9saXN0LCBsaXN0KQorCQkJdnR5X2R1bXBfcGRwKHZ0eSwgIiAgIiwgcGRwKTsKKwl9Cit9CisKK0RFRlVOKHNob3dfc2dzbiwgc2hvd19zZ3NuX2NtZCwgInNob3cgc2dzbiIsCisgICAgICBTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgU0dTTiIpCit7CisJLyogRklYTUU6IHN0YXRpc3RpY3MgKi8KKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKyNkZWZpbmUgTU1DVFhfU1RSICJNTSBDb250ZXh0XG4iCisjZGVmaW5lIElOQ0xVREVfUERQX1NUUiAiSW5jbHVkZSBQRFAgQ29udGV4dCBJbmZvcm1hdGlvblxuIgorCisjaWYgMAorREVGVU4oc2hvd19tbWN0eF90bGxpLCBzaG93X21tY3R4X3RsbGlfY21kLAorCSJzaG93IG1tLWNvbnRleHQgdGxsaSBIRVggW3BkcF0iLAorCVNIT1dfU1RSIE1NQ1RYX1NUUiAiSWRlbnRpZnkgYnkgVExMSVxuIiAiVExMSVxuIiBJTkNMVURFX1BEUF9TVFIpCit7CisJdWludDMyX3QgdGxsaTsKKwlzdHJ1Y3Qgc2dzbl9tbV9jdHggKm1tOworCisJdGxsaSA9IHN0cnRvdWwoYXJndlswXSwgTlVMTCwgMTYpOworCW1tID0gc2dzbl9tbV9jdHhfYnlfdGxsaSh0bGxpKTsKKwlpZiAoIW1tKSB7CisJCXZ0eV9vdXQodnR5LCAiTm8gTU0gY29udGV4dCBmb3IgVExMSSAlMDh4JXMiLAorCQkJdGxsaSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCXZ0eV9kdW1wX21tY3R4KHZ0eSwgIiIsIG1tLCBhcmd2WzFdID8gMSA6IDApOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKyNlbmRpZgorCitERUZVTihzd293X21tY3R4X2ltc2ksIHNob3dfbW1jdHhfaW1zaV9jbWQsCisJInNob3cgbW0tY29udGV4dCBpbXNpIElNU0kgW3BkcF0iLAorCVNIT1dfU1RSIE1NQ1RYX1NUUiAiSWRlbnRpZnkgYnkgSU1TSVxuIiAiSU1TSSBvZiB0aGUgTU0gQ29udGV4dFxuIgorCUlOQ0xVREVfUERQX1NUUikKK3sKKwlzdHJ1Y3Qgc2dzbl9tbV9jdHggKm1tOworCisJbW0gPSBzZ3NuX21tX2N0eF9ieV9pbXNpKGFyZ3ZbMF0pOworCWlmICghbW0pIHsKKwkJdnR5X291dCh2dHksICJObyBNTSBjb250ZXh0IGZvciBJTVNJICVzJXMiLAorCQkJYXJndlswXSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCXZ0eV9kdW1wX21tY3R4KHZ0eSwgIiIsIG1tLCBhcmd2WzFdID8gMSA6IDApOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oc3dvd19tbWN0eF9hbGwsIHNob3dfbW1jdHhfYWxsX2NtZCwKKwkic2hvdyBtbS1jb250ZXh0IGFsbCBbcGRwXSIsCisJU0hPV19TVFIgTU1DVFhfU1RSICJBbGwgTU0gQ29udGV4dHNcbiIgSU5DTFVERV9QRFBfU1RSKQoreworCXN0cnVjdCBzZ3NuX21tX2N0eCAqbW07CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShtbSwgJnNnc25fbW1fY3R4dHMsIGxpc3QpCisJCXZ0eV9kdW1wX21tY3R4KHZ0eSwgIiIsIG1tLCBhcmd2WzBdID8gMSA6IDApOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihzaG93X2dnc24sIHNob3dfZ2dzbl9jbWQsCisJInNob3cgZ2dzbiIsCisJIiIpCit7CisKK30KKworREVGVU4oc2hvd19wZHBjdHhfYWxsLCBzaG93X3BkcGN0eF9hbGxfY21kLAorCSJzaG93IHBkcC1jb250ZXh0IGFsbCIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gb24gUERQIENvbnRleHRcbiIpCit7CisJc3RydWN0IHNnc25fcGRwX2N0eCAqcGRwOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkocGRwLCAmc2dzbl9wZHBfY3R4dHMsIGdfbGlzdCkKKwkJdnR5X2R1bXBfcGRwKHZ0eSwgIiIsIHBkcCk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK2ludCBzZ3NuX3Z0eV9pbml0KHZvaWQpCit7CisJaW5zdGFsbF9lbGVtZW50X3ZlKCZzaG93X3Nnc25fY21kKTsKKwkvL2luc3RhbGxfZWxlbWVudF92ZSgmc2hvd19tbWN0eF90bGxpX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50X3ZlKCZzaG93X21tY3R4X2ltc2lfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnNob3dfbW1jdHhfYWxsX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50X3ZlKCZzaG93X3BkcGN0eF9hbGxfY21kKTsKKworCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJmNmZ19zZ3NuX2NtZCk7CisJaW5zdGFsbF9ub2RlKCZzZ3NuX25vZGUsIGNvbmZpZ193cml0ZV9zZ3NuKTsKKwlpbnN0YWxsX2RlZmF1bHQoU0dTTl9OT0RFKTsKKwlpbnN0YWxsX2VsZW1lbnQoU0dTTl9OT0RFLCAmb3Vybm9kZV9leGl0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFNHU05fTk9ERSwgJm91cm5vZGVfZW5kX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFNHU05fTk9ERSwgJmNmZ19nZ3NuX3JlbW90ZV9pcF9jbWQpOworCS8vaW5zdGFsbF9lbGVtZW50KFNHU05fTk9ERSwgJmNmZ19nZ3NuX3JlbW90ZV9wb3J0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFNHU05fTk9ERSwgJmNmZ19nZ3NuX2d0cF92ZXJzaW9uX2NtZCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNnc25fcGFyc2VfY29uZmlnKGNvbnN0IGNoYXIgKmNvbmZpZ19maWxlLCBzdHJ1Y3Qgc2dzbl9jb25maWcgKmNmZykKK3sKKwlpbnQgcmM7CisKKwlnX2NmZyA9IGNmZzsKKwlyYyA9IHZ0eV9yZWFkX2NvbmZpZ19maWxlKGNvbmZpZ19maWxlLCBOVUxMKTsKKwlpZiAocmMgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHBhcnNlIHRoZSBjb25maWcgZmlsZTogJyVzJ1xuIiwgY29uZmlnX2ZpbGUpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9nc21fMDRfMDguYyBiL29wZW5ic2Mvc3JjL2dzbV8wNF8wOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZTE5YWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9nc21fMDRfMDguYwpAQCAtMCwwICsxLDI5MzkgQEAKKy8qIEdTTSBNb2JpbGUgUmFkaW8gSW50ZXJmYWNlIExheWVyIDMgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZQorICogM0dQUCBUUyAwNC4wOCB2ZXJzaW9uIDcuMjEuMCBSZWxlYXNlIDE5OTggLyBFVFNJIFRTIDEwMCA5NDAgVjcuMjEuMCAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+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+dHJ4LT5idHM7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJc3RydWN0IGdzbTQ4X3NlcnZpY2VfcmVxdWVzdCAqcmVxID0KKwkJCShzdHJ1Y3QgZ3NtNDhfc2VydmljZV9yZXF1ZXN0ICopZ2gtPmRhdGE7CisJLyogdW5mb3J0dW5hdGVseSBpbiBQaGFzZTEgdGhlIGNsYXNzbWFyazIgbGVuZ3RoIGlzIHZhcmlhYmxlICovCisJdV9pbnQ4X3QgY2xhc3NtYXJrMl9sZW4gPSBnaC0+ZGF0YVsxXTsKKwl1X2ludDhfdCAqY2xhc3NtYXJrMiA9IGdoLT5kYXRhKzI7CisJdV9pbnQ4X3QgbWlfbGVuID0gKihjbGFzc21hcmsyICsgY2xhc3NtYXJrMl9sZW4pOworCXVfaW50OF90ICptaSA9IChjbGFzc21hcmsyICsgY2xhc3NtYXJrMl9sZW4gKyAxKTsKKworCURFQlVHUChETU0sICI8LSBDTSBTRVJWSUNFIFJFUVVFU1QgIik7CisJaWYgKG1zZy0+ZGF0YV9sZW4gPCBzaXplb2Yoc3RydWN0IGdzbTQ4X3NlcnZpY2VfcmVxdWVzdCopKSB7CisJCURFQlVHUEMoRE1NLCAid3Jvbmcgc2l6ZWQgbWVzc2FnZVxuIik7CisJCXJldHVybiBnc200OF90eF9tbV9zZXJ2X3JlaigmbXNnLT5sY2hhbi0+Y29ubiwKKwkJCQkJICAgIEdTTTQ4X1JFSkVDVF9JTkNPUlJFQ1RfTUVTU0FHRSk7CisJfQorCisJaWYgKG1zZy0+ZGF0YV9sZW4gPCByZXEtPm1pX2xlbiArIDYpIHsKKwkJREVCVUdQQyhETU0sICJkb2VzIG5vdCBmaXQgaW4gcGFja2V0XG4iKTsKKwkJcmV0dXJuIGdzbTQ4X3R4X21tX3NlcnZfcmVqKCZtc2ctPmxjaGFuLT5jb25uLAorCQkJCQkgICAgR1NNNDhfUkVKRUNUX0lOQ09SUkVDVF9NRVNTQUdFKTsKKwl9CisKKwltaV90eXBlID0gbWlbMF0gJiBHU01fTUlfVFlQRV9NQVNLOworCWlmIChtaV90eXBlICE9IEdTTV9NSV9UWVBFX1RNU0kpIHsKKwkJREVCVUdQQyhETU0sICJtaV90eXBlIGlzIG5vdCBUTVNJOiAlZFxuIiwgbWlfdHlwZSk7CisJCXJldHVybiBnc200OF90eF9tbV9zZXJ2X3JlaigmbXNnLT5sY2hhbi0+Y29ubiwKKwkJCQkJICAgIEdTTTQ4X1JFSkVDVF9JTkNPUlJFQ1RfTUVTU0FHRSk7CisJfQorCisJZ3NtNDhfbWlfdG9fc3RyaW5nKG1pX3N0cmluZywgc2l6ZW9mKG1pX3N0cmluZyksIG1pLCBtaV9sZW4pOworCURFQlVHUEMoRE1NLCAic2Vydl90eXBlPTB4JTAyeCBtaV90eXBlPTB4JTAyeCBNKCVzKVxuIiwKKwkJcmVxLT5jbV9zZXJ2aWNlX3R5cGUsIG1pX3R5cGUsIG1pX3N0cmluZyk7CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfU1VCU0NSLCBTX1NVQlNDUl9JREVOVElUWSwgKGNsYXNzbWFyazIgKyBjbGFzc21hcmsyX2xlbikpOworCisJaWYgKGlzX3NpZW1lbnNfYnRzKGJ0cykpCisJCXNlbmRfc2llbWVuc19tcnBjaShtc2ctPmxjaGFuLCBjbGFzc21hcmsyLTEpOworCisJc3Vic2NyID0gc3Vic2NyX2dldF9ieV90bXNpKGJ0cy0+bmV0d29yaywKKwkJCQkgICAgdG1zaV9mcm9tX3N0cmluZyhtaV9zdHJpbmcpKTsKKworCS8qIEZJWE1FOiBpZiB3ZSBkb24ndCBrbm93IHRoZSBUTVNJLCBpbnF1aXJlIGFiaXQgSU1TSSBhbmQgYWxsb2NhdGUgbmV3IFRNU0kgKi8KKwlpZiAoIXN1YnNjcikKKwkJcmV0dXJuIGdzbTQ4X3R4X21tX3NlcnZfcmVqKCZtc2ctPmxjaGFuLT5jb25uLAorCQkJCQkgICAgR1NNNDhfUkVKRUNUX0lNU0lfVU5LTk9XTl9JTl9ITFIpOworCisJaWYgKCFtc2ctPmxjaGFuLT5jb25uLnN1YnNjcikKKwkJbXNnLT5sY2hhbi0+Y29ubi5zdWJzY3IgPSBzdWJzY3I7CisJZWxzZSBpZiAobXNnLT5sY2hhbi0+Y29ubi5zdWJzY3IgPT0gc3Vic2NyKQorCQlzdWJzY3JfcHV0KHN1YnNjcik7IC8qIGxjaGFuIGFscmVhZHkgaGFzIGEgcmVmLCBkb24ndCBuZWVkIGFub3RoZXIgb25lICovCisJZWxzZSB7CisJCURFQlVHUChETU0sICI8LSBDTSBDaGFubmVsIGFscmVhZHkgb3duZWQgYnkgc29tZW9uZSBlbHNlP1xuIik7CisJCXN1YnNjcl9wdXQoc3Vic2NyKTsKKwl9CisKKwlzdWJzY3ItPmVxdWlwbWVudC5jbGFzc21hcmsyX2xlbiA9IGNsYXNzbWFyazJfbGVuOworCW1lbWNweShzdWJzY3ItPmVxdWlwbWVudC5jbGFzc21hcmsyLCBjbGFzc21hcmsyLCBjbGFzc21hcmsyX2xlbik7CisJZGJfc3luY19lcXVpcG1lbnQoJnN1YnNjci0+ZXF1aXBtZW50KTsKKworCXJldHVybiBnc200OF90eF9tbV9zZXJ2X2Fjayhtc2ctPmxjaGFuKTsKK30KKworc3RhdGljIGludCBnc200OF9yeF9tbV9pbXNpX2RldGFjaF9pbmQoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbXNnLT5sY2hhbi0+dHMtPnRyeC0+YnRzOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXN0cnVjdCBnc200OF9pbXNpX2RldGFjaF9pbmQgKmlkaSA9CisJCQkJKHN0cnVjdCBnc200OF9pbXNpX2RldGFjaF9pbmQgKikgZ2gtPmRhdGE7CisJdV9pbnQ4X3QgbWlfdHlwZSA9IGlkaS0+bWlbMF0gJiBHU01fTUlfVFlQRV9NQVNLOworCWNoYXIgbWlfc3RyaW5nW0dTTTQ4X01JX1NJWkVdOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gTlVMTDsKKworCWdzbTQ4X21pX3RvX3N0cmluZyhtaV9zdHJpbmcsIHNpemVvZihtaV9zdHJpbmcpLCBpZGktPm1pLCBpZGktPm1pX2xlbik7CisJREVCVUdQKERNTSwgIklNU0kgREVUQUNIIElORElDQVRJT046IG1pX3R5cGU9MHglMDJ4IE1JKCVzKTogIiwKKwkJbWlfdHlwZSwgbWlfc3RyaW5nKTsKKworCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMubG9jX3VwZF90eXBlLmRldGFjaCk7CisKKwlzd2l0Y2ggKG1pX3R5cGUpIHsKKwljYXNlIEdTTV9NSV9UWVBFX1RNU0k6CisJCXN1YnNjciA9IHN1YnNjcl9nZXRfYnlfdG1zaShidHMtPm5ldHdvcmssCisJCQkJCSAgICB0bXNpX2Zyb21fc3RyaW5nKG1pX3N0cmluZykpOworCQlicmVhazsKKwljYXNlIEdTTV9NSV9UWVBFX0lNU0k6CisJCXN1YnNjciA9IHN1YnNjcl9nZXRfYnlfaW1zaShidHMtPm5ldHdvcmssIG1pX3N0cmluZyk7CisJCWJyZWFrOworCWNhc2UgR1NNX01JX1RZUEVfSU1FSToKKwljYXNlIEdTTV9NSV9UWVBFX0lNRUlTVjoKKwkJLyogbm8gc2ltIGNhcmQuLi4gRklYTUU6IHdoYXQgdG8gZG8gPyAqLworCQlERUJVR1BDKERNTSwgInVuaW1wbGVtZW50ZWQgbW9iaWxlIGlkZW50aXR5IHR5cGVcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgkKKwkJREVCVUdQQyhETU0sICJ1bmtub3duIG1vYmlsZSBpZGVudGl0eSB0eXBlXG4iKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHN1YnNjcikgeworCQlzdWJzY3JfdXBkYXRlKHN1YnNjciwgbXNnLT50cngtPmJ0cywKKwkJCQlHU01fU1VCU0NSSUJFUl9VUERBVEVfREVUQUNIRUQpOworCQlERUJVR1AoRE1NLCAiU3Vic2NyaWJlcjogJXNcbiIsIHN1YnNjcl9uYW1lKHN1YnNjcikpOworCisJCXN1YnNjci0+ZXF1aXBtZW50LmNsYXNzbWFyazEgPSBpZGktPmNsYXNzbWFyazE7CisJCWRiX3N5bmNfZXF1aXBtZW50KCZzdWJzY3ItPmVxdWlwbWVudCk7CisKKwkJc3Vic2NyX3B1dChzdWJzY3IpOworCX0gZWxzZQorCQlERUJVR1AoRE1NLCAiVW5rbm93biBTdWJzY3JpYmVyID8hP1xuIik7CisKKwkvKiBGSVhNRTogaXRlcmF0ZSBvdmVyIGFsbCB0cmFuc2FjdGlvbnMgYW5kIHJlbGVhc2UgdGhlbSwKKwkgKiBpbWFnaW5lIGFuIElNU0kgREVUQUNIIGhhcHBlbmluZyBkdXJpbmcgYW4gYWN0aXZlIGNhbGwhICovCisKKwkvKiBzdWJzY3JpYmVyIGlzIGRldGFjaGVkOiBzaG91bGQgd2UgcmVsZWFzZSBsY2hhbj8gKi8KKwlsY2hhbl9hdXRvX3JlbGVhc2UobXNnLT5sY2hhbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnc200OF9yeF9tbV9zdGF0dXMoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKworCURFQlVHUChETU0sICJNTSBTVEFUVVMgKHJlamVjdCBjYXVzZSAweCUwMngpXG4iLCBnaC0+ZGF0YVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogUmVjZWl2ZSBhIEdTTSAwNC4wOCBNb2JpbGl0eSBNYW5hZ2VtZW50IChNTSkgbWVzc2FnZSAqLworc3RhdGljIGludCBnc20wNDA4X3Jjdl9tbShzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGdoLT5tc2dfdHlwZSAmIDB4YmYpIHsKKwljYXNlIEdTTTQ4X01UX01NX0xPQ19VUERfUkVRVUVTVDoKKwkJREVCVUdQKERNTSwgIkxPQ0FUSU9OIFVQREFUSU5HIFJFUVVFU1Q6ICIpOworCQlyYyA9IG1tX3J4X2xvY191cGRfcmVxKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfTU1fSURfUkVTUDoKKwkJcmMgPSBtbV9yeF9pZF9yZXNwKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfTU1fQ01fU0VSVl9SRVE6CisJCXJjID0gZ3NtNDhfcnhfbW1fc2Vydl9yZXEobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9NTV9TVEFUVVM6CisJCXJjID0gZ3NtNDhfcnhfbW1fc3RhdHVzKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfTU1fVE1TSV9SRUFMTF9DT01QTDoKKwkJREVCVUdQKERNTSwgIlRNU0kgUmVhbGxvY2F0aW9uIENvbXBsZXRlZC4gU3Vic2NyaWJlcjogJXNcbiIsCisJCSAgICAgICBtc2ctPmxjaGFuLT5jb25uLnN1YnNjciA/CisJCQkJc3Vic2NyX25hbWUobXNnLT5sY2hhbi0+Y29ubi5zdWJzY3IpIDoKKwkJCQkidW5rbm93biBzdWJzY3JpYmVyIik7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfTU1fSU1TSV9ERVRBQ0hfSU5EOgorCQlyYyA9IGdzbTQ4X3J4X21tX2ltc2lfZGV0YWNoX2luZChtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX01NX0NNX1JFRVNUX1JFUToKKwkJREVCVUdQKERNTSwgIkNNIFJFRVNUQUJMSVNIIFJFUVVFU1Q6IE5vdCBpbXBsZW1lbnRlZFxuIik7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfTU1fQVVUSF9SRVNQOgorCQlERUJVR1AoRE1NLCAiQVVUSEVOVElDQVRJT04gUkVTUE9OU0U6IE5vdCBpbXBsZW1lbnRlZFxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE1NLCBMT0dMX05PVElDRSwgIlVua25vd24gR1NNIDA0LjA4IE1NIG1zZyB0eXBlIDB4JTAyeFxuIiwKKwkJCWdoLT5tc2dfdHlwZSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworLyogUmVjZWl2ZSBhIFBBR0lORyBSRVNQT05TRSBtZXNzYWdlIGZyb20gdGhlIE1TICovCitzdGF0aWMgaW50IGdzbTQ4X3J4X3JyX3BhZ19yZXNwKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IG1zZy0+bGNoYW4tPnRzLT50cngtPmJ0czsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwlzdHJ1Y3QgZ3NtNDhfcGFnX3Jlc3AgKnJlc3A7CisJdV9pbnQ4X3QgKmNsYXNzbWFyazJfbHYgPSBnaC0+ZGF0YSArIDE7CisJdV9pbnQ4X3QgbWlfdHlwZTsKKwljaGFyIG1pX3N0cmluZ1tHU000OF9NSV9TSVpFXTsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IE5VTEw7CisJaW50IHJjID0gMDsKKworCXJlc3AgPSAoc3RydWN0IGdzbTQ4X3BhZ19yZXNwICopICZnaC0+ZGF0YVswXTsKKwlnc200OF9wYWdpbmdfZXh0cmFjdF9taShyZXNwLCBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKSwKKwkJCQltaV9zdHJpbmcsICZtaV90eXBlKTsKKwlERUJVR1AoRFJSLCAiUEFHSU5HIFJFU1BPTlNFOiBtaV90eXBlPTB4JTAyeCBNSSglcylcbiIsCisJCW1pX3R5cGUsIG1pX3N0cmluZyk7CisKKwlzd2l0Y2ggKG1pX3R5cGUpIHsKKwljYXNlIEdTTV9NSV9UWVBFX1RNU0k6CisJCXN1YnNjciA9IHN1YnNjcl9nZXRfYnlfdG1zaShidHMtPm5ldHdvcmssCisJCQkJCSAgICB0bXNpX2Zyb21fc3RyaW5nKG1pX3N0cmluZykpOworCQlicmVhazsKKwljYXNlIEdTTV9NSV9UWVBFX0lNU0k6CisJCXN1YnNjciA9IHN1YnNjcl9nZXRfYnlfaW1zaShidHMtPm5ldHdvcmssIG1pX3N0cmluZyk7CisJCWJyZWFrOworCX0KKworCWlmICghc3Vic2NyKSB7CisJCURFQlVHUChEUlIsICI8LSBDYW4ndCBmaW5kIGFueSBzdWJzY3JpYmVyIGZvciB0aGlzIElEXG4iKTsKKwkJLyogRklYTUU6IHJlcXVlc3QgaWQ/IGNsb3NlIGNoYW5uZWw/ICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKwlERUJVR1AoRFJSLCAiPC0gQ2hhbm5lbCB3YXMgcmVxdWVzdGVkIGJ5ICVzXG4iLAorCQlzdWJzY3ItPm5hbWUgJiYgc3RybGVuKHN1YnNjci0+bmFtZSkgPyBzdWJzY3ItPm5hbWUgOiBzdWJzY3ItPmltc2kpOworCisJc3Vic2NyLT5lcXVpcG1lbnQuY2xhc3NtYXJrMl9sZW4gPSAqY2xhc3NtYXJrMl9sdjsKKwltZW1jcHkoc3Vic2NyLT5lcXVpcG1lbnQuY2xhc3NtYXJrMiwgY2xhc3NtYXJrMl9sdisxLCAqY2xhc3NtYXJrMl9sdik7CisJZGJfc3luY19lcXVpcG1lbnQoJnN1YnNjci0+ZXF1aXBtZW50KTsKKworCXJjID0gZ3NtNDhfaGFuZGxlX3BhZ2luZ19yZXNwKG1zZywgc3Vic2NyKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfcnhfcnJfY2xhc3NtYXJrKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSBtc2ctPmxjaGFuLT5jb25uLnN1YnNjcjsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwl1X2ludDhfdCBjbTJfbGVuLCBjbTNfbGVuID0gMDsKKwl1X2ludDhfdCAqY20yLCAqY20zID0gTlVMTDsKKworCURFQlVHUChEUlIsICJDTEFTU01BUksgQ0hBTkdFICIpOworCisJLyogY2xhc3NtYXJrIDIgKi8KKwljbTJfbGVuID0gZ2gtPmRhdGFbMF07CisJY20yID0gJmdoLT5kYXRhWzFdOworCURFQlVHUEMoRFJSLCAiQ00yKGxlbj0ldSkgIiwgY20yX2xlbik7CisKKwlpZiAocGF5bG9hZF9sZW4gPiBjbTJfbGVuICsgMSkgeworCQkvKiB3ZSBtdXN0IGhhdmUgYSBjbGFzc21hcmszICovCisJCWlmIChnaC0+ZGF0YVtjbTJfbGVuKzFdICE9IDB4MjApIHsKKwkJCURFQlVHUEMoRFJSLCAiRVJSIENNMyBUQUdcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKGNtMl9sZW4gPiAzKSB7CisJCQlERUJVR1BDKERSUiwgIkNNMiB0b28gbG9uZyFcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJCisJCWNtM19sZW4gPSBnaC0+ZGF0YVtjbTJfbGVuKzJdOworCQljbTMgPSAmZ2gtPmRhdGFbY20yX2xlbiszXTsKKwkJaWYgKGNtM19sZW4gPiAxNCkgeworCQkJREVCVUdQQyhEUlIsICJDTTMgbGVuICV1IHRvbyBsb25nIVxuIiwgY20zX2xlbik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlERUJVR1BDKERSUiwgIkNNMyhsZW49JXUpXG4iLCBjbTNfbGVuKTsKKwl9CisJaWYgKHN1YnNjcikgeworCQlzdWJzY3ItPmVxdWlwbWVudC5jbGFzc21hcmsyX2xlbiA9IGNtMl9sZW47CisJCW1lbWNweShzdWJzY3ItPmVxdWlwbWVudC5jbGFzc21hcmsyLCBjbTIsIGNtMl9sZW4pOworCQlpZiAoY20zKSB7CisJCQlzdWJzY3ItPmVxdWlwbWVudC5jbGFzc21hcmszX2xlbiA9IGNtM19sZW47CisJCQltZW1jcHkoc3Vic2NyLT5lcXVpcG1lbnQuY2xhc3NtYXJrMywgY20zLCBjbTNfbGVuKTsKKwkJfQorCQlkYl9zeW5jX2VxdWlwbWVudCgmc3Vic2NyLT5lcXVpcG1lbnQpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdzbTQ4X3J4X3JyX3N0YXR1cyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCisJREVCVUdQKERSUiwgIlNUQVRVUyBycl9jYXVzZSA9ICVzXG4iLAorCQlycl9jYXVzZV9uYW1lKGdoLT5kYXRhWzBdKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnc200OF9yeF9ycl9tZWFzX3JlcChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc21fbWVhc19yZXAgKm1lYXNfcmVwID0gbGNoYW5fbmV4dF9tZWFzX3JlcChtc2ctPmxjaGFuKTsKKworCS8qIFRoaXMgc2hvdWxkbid0IGFjdHVhbGx5IGVuZCB1cCBoZXJlLCBhcyBSU0wgdHJlYXRzCisJICogTDMgSW5mbyBvZiAwOC41OCBNRUFTVVJFTUVOVCBSRVBPUlQgZGlmZmVyZW50IGJ5IGNhbGxpbmcKKwkgKiBkaXJlY3RseSBpbnRvIGdzbTQ4X3BhcnNlX21lYXNfcmVwICovCisJREVCVUdQKERNRUFTLCAiRElSRUNUIEdTTTQ4IE1FQVNVUkVNRU5UIFJFUE9SVCA/IT8gIik7CisJZ3NtNDhfcGFyc2VfbWVhc19yZXAobWVhc19yZXAsIG1zZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnc200OF9yeF9ycl9hcHBfaW5mbyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVfaW50OF90IGFwZHVfaWRfZmxhZ3M7CisJdV9pbnQ4X3QgYXBkdV9sZW47CisJdV9pbnQ4X3QgKmFwZHVfZGF0YTsKKworCWFwZHVfaWRfZmxhZ3MgPSBnaC0+ZGF0YVswXTsKKwlhcGR1X2xlbiA9IGdoLT5kYXRhWzFdOworCWFwZHVfZGF0YSA9IGdoLT5kYXRhKzI7CisJCisJREVCVUdQKEROTSwgIlJYIEFQUExJQ0FUSU9OIElORk8gaWQvZmxhZ3M9MHglMDJ4IGFwZHVfbGVuPSV1IGFwZHU9JXMiLAorCQlhcGR1X2lkX2ZsYWdzLCBhcGR1X2xlbiwgaGV4ZHVtcChhcGR1X2RhdGEsIGFwZHVfbGVuKSk7CisKKwlyZXR1cm4gZGJfYXBkdV9ibG9iX3N0b3JlKG1zZy0+bGNoYW4tPmNvbm4uc3Vic2NyLCBhcGR1X2lkX2ZsYWdzLCBhcGR1X2xlbiwgYXBkdV9kYXRhKTsKK30KKworLyogQ2hhcHRlciA5LjEuMTYgSGFuZG92ZXIgY29tcGxldGUgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfcnhfcnJfaG9fY29tcGwoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKworCURFQlVHUChEUlIsICJIQU5ET1ZFUiBDT01QTEVURSBjYXVzZSA9ICVzXG4iLAorCQlycl9jYXVzZV9uYW1lKGdoLT5kYXRhWzBdKSk7CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfTENIQU4sIFNfTENIQU5fSEFORE9WRVJfQ09NUEwsIG1zZy0+bGNoYW4pOworCS8qIEZJWE1FOiByZWxlYXNlIG9sZCBjaGFubmVsICovCisKKwlyZXR1cm4gMDsKK30KKworLyogQ2hhcHRlciA5LjEuMTcgSGFuZG92ZXIgRmFpbHVyZSAqLworc3RhdGljIGludCBnc200OF9yeF9ycl9ob19mYWlsKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisKKwlERUJVR1AoRFJSLCAiSEFORE9WRVIgRkFJTEVEIGNhdXNlID0gJXNcbiIsCisJCXJyX2NhdXNlX25hbWUoZ2gtPmRhdGFbMF0pKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19MQ0hBTiwgU19MQ0hBTl9IQU5ET1ZFUl9GQUlMLCBtc2ctPmxjaGFuKTsKKwkvKiBGSVhNRTogcmVsZWFzZSBhbGxvY2F0ZWQgbmV3IGNoYW5uZWwgKi8KKworCXJldHVybiAwOworfQorCisvKiBSZWNlaXZlIGEgR1NNIDA0LjA4IFJhZGlvIFJlc291cmNlIChSUikgbWVzc2FnZSAqLworc3RhdGljIGludCBnc20wNDA4X3Jjdl9ycihzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGdoLT5tc2dfdHlwZSkgeworCWNhc2UgR1NNNDhfTVRfUlJfQ0xTTV9DSEc6CisJCXJjID0gZ3NtNDhfcnhfcnJfY2xhc3NtYXJrKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfUlJfR1BSU19TVVNQX1JFUToKKwkJREVCVUdQKERSUiwgIkdSUFMgU1VTUEVORCBSRVFVRVNUXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9SUl9QQUdfUkVTUDoKKwkJcmMgPSBnc200OF9yeF9ycl9wYWdfcmVzcChtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX1JSX0NIQU5fTU9ERV9NT0RJRl9BQ0s6CisJCXJjID0gZ3NtNDhfcnhfcnJfbW9kaWZfYWNrKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfUlJfU1RBVFVTOgorCQlyYyA9IGdzbTQ4X3J4X3JyX3N0YXR1cyhtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX1JSX01FQVNfUkVQOgorCQlyYyA9IGdzbTQ4X3J4X3JyX21lYXNfcmVwKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfUlJfQVBQX0lORk86CisJCXJjID0gZ3NtNDhfcnhfcnJfYXBwX2luZm8obXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9SUl9DSVBIX01fQ09NUEw6CisJCURFQlVHUChEUlIsICJDSVBIRVJJTkcgTU9ERSBDT01QTEVURVxuIik7CisJCS8qIEZJWE1FOiBjaGVjayBmb3IgTUkgKGlmIGFueSkgKi8KKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9SUl9IQU5ET19DT01QTDoKKwkJcmMgPSBnc200OF9yeF9ycl9ob19jb21wbChtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX1JSX0hBTkRPX0ZBSUw6CisJCXJjID0gZ3NtNDhfcnhfcnJfaG9fZmFpbChtc2cpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERSUiwgTE9HTF9OT1RJQ0UsICJVbmltcGxlbWVudGVkICIKKwkJCSJHU00gMDQuMDggUlIgbXNnIHR5cGUgMHglMDJ4XG4iLCBnaC0+bXNnX3R5cGUpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBnc200OF9zZW5kX3JyX2FwcF9pbmZvKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBhcGR1X2lkLAorCQkJICAgdV9pbnQ4X3QgYXBkdV9sZW4sIGNvbnN0IHVfaW50OF90ICphcGR1KQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisKKwltc2ctPmxjaGFuID0gbGNoYW47CisJCisJREVCVUdQKERSUiwgIlRYIEFQUExJQ0FUSU9OIElORk8gaWQ9MHglMDJ4LCBsZW49JXVcbiIsCisJCWFwZHVfaWQsIGFwZHVfbGVuKTsKKwkKKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkgKyAyICsgYXBkdV9sZW4pOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX1JSOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX1JSX0FQUF9JTkZPOworCWdoLT5kYXRhWzBdID0gYXBkdV9pZDsKKwlnaC0+ZGF0YVsxXSA9IGFwZHVfbGVuOworCW1lbWNweShnaC0+ZGF0YSsyLCBhcGR1LCBhcGR1X2xlbik7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIE5VTEwpOworfQorCisvKiBDYWxsIENvbnRyb2wgKi8KKworLyogVGhlIGVudGlyZSBjYWxsIGNvbnRyb2wgY29kZSBpcyB3cml0dGVuIGluIGFjY29yZGFuY2Ugd2l0aCBGaWd1cmUgNy4xMGMKKyAqIGZvciAndmVyeSBlYXJseSBhc3NpZ25tZW50JywgaS5lLiB3ZSBhbGxvY2F0ZSBhIFRDSC9GIGR1cmluZyBJTU1FRElBVEUKKyAqIEFTU0lHTiwgdGhlbiBmaXJzdCB1c2UgdGhhdCBUQ0gvRiBmb3Igc2lnbmFsbGluZyBhbmQgbGF0ZXIgTU9ERSBNT0RJRlkKKyAqIGl0IGZvciB2b2ljZSAqLworCitzdGF0aWMgdm9pZCBuZXdfY2Nfc3RhdGUoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIGludCBzdGF0ZSkKK3sKKwlpZiAoc3RhdGUgPiAzMSB8fCBzdGF0ZSA8IDApCisJCXJldHVybjsKKworCURFQlVHUChEQ0MsICJuZXcgc3RhdGUgJXMgLT4gJXNcbiIsCisJCWdzbTQ4X2NjX3N0YXRlX25hbWUodHJhbnMtPmNjLnN0YXRlKSwKKwkJZ3NtNDhfY2Nfc3RhdGVfbmFtZShzdGF0ZSkpOworCisJdHJhbnMtPmNjLnN0YXRlID0gc3RhdGU7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfc3RhdHVzKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCXVfaW50OF90ICpjYXVzZSwgKmNhbGxfc3RhdGU7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19TVEFUVVM7CisKKwljYXVzZSA9IG1zZ2JfcHV0KG1zZywgMyk7CisJY2F1c2VbMF0gPSAyOworCWNhdXNlWzFdID0gR1NNNDhfQ0FVU0VfQ1NfR1NNIHwgR1NNNDhfQ0FVU0VfTE9DX1VTRVI7CisJY2F1c2VbMl0gPSAweDgwIHwgMzA7CS8qIHJlc3BvbnNlIHRvIHN0YXR1cyBpbnF1aXJ5ICovCisKKwljYWxsX3N0YXRlID0gbXNnYl9wdXQobXNnLCAxKTsKKwljYWxsX3N0YXRlWzBdID0gMHhjMCB8IDB4MDA7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF90eF9zaW1wbGUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sCisJCQkgICB1X2ludDhfdCBwZGlzYywgdV9pbnQ4X3QgbXNnX3R5cGUpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCisJbXNnLT5sY2hhbiA9IGxjaGFuOworCisJZ2gtPnByb3RvX2Rpc2NyID0gcGRpc2M7CisJZ2gtPm1zZ190eXBlID0gbXNnX3R5cGU7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBnc200OF9zdG9wX2NjX3RpbWVyKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKQoreworCWlmIChic2NfdGltZXJfcGVuZGluZygmdHJhbnMtPmNjLnRpbWVyKSkgeworCQlERUJVR1AoRENDLCAic3RvcHBpbmcgcGVuZGluZyB0aW1lciBUJXhcbiIsIHRyYW5zLT5jYy5UY3VycmVudCk7CisJCWJzY19kZWxfdGltZXIoJnRyYW5zLT5jYy50aW1lcik7CisJCXRyYW5zLT5jYy5UY3VycmVudCA9IDA7CisJfQorfQorCitzdGF0aWMgaW50IG1uY2NfcmVjdm1zZyhzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgc3RydWN0IGdzbV90cmFucyAqdHJhbnMsCisJCQlpbnQgbXNnX3R5cGUsIHN0cnVjdCBnc21fbW5jYyAqbW5jYykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCisJaWYgKHRyYW5zKQorCQlpZiAodHJhbnMtPmNvbm4pCisJCQlERUJVR1AoRENDLCAiKGJ0cyAlZCB0cnggJWQgdHMgJWQgdGkgJXggc3ViICVzKSAiCisJCQkJIlNlbmRpbmcgJyVzJyB0byBNTkNDLlxuIiwKKwkJCQl0cmFucy0+Y29ubi0+bGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsCisJCQkJdHJhbnMtPmNvbm4tPmxjaGFuLT50cy0+dHJ4LT5uciwKKwkJCQl0cmFucy0+Y29ubi0+bGNoYW4tPnRzLT5uciwgdHJhbnMtPnRyYW5zYWN0aW9uX2lkLAorCQkJCSh0cmFucy0+c3Vic2NyKT8odHJhbnMtPnN1YnNjci0+ZXh0ZW5zaW9uKToiLSIsCisJCQkJZ2V0X21uY2NfbmFtZShtc2dfdHlwZSkpOworCQllbHNlCisJCQlERUJVR1AoRENDLCAiKGJ0cyAtIHRyeCAtIHRzIC0gdGkgLS0gc3ViICVzKSAiCisJCQkJIlNlbmRpbmcgJyVzJyB0byBNTkNDLlxuIiwKKwkJCQkodHJhbnMtPnN1YnNjcik/KHRyYW5zLT5zdWJzY3ItPmV4dGVuc2lvbik6Ii0iLAorCQkJCWdldF9tbmNjX25hbWUobXNnX3R5cGUpKTsKKwllbHNlCisJCURFQlVHUChEQ0MsICIoYnRzIC0gdHJ4IC0gdHMgLSB0aSAtLSBzdWIgLSkgIgorCQkJIlNlbmRpbmcgJyVzJyB0byBNTkNDLlxuIiwgZ2V0X21uY2NfbmFtZShtc2dfdHlwZSkpOworCisJbW5jYy0+bXNnX3R5cGUgPSBtc2dfdHlwZTsKKwkKKwltc2cgPSBtc2diX2FsbG9jKHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpLCAiTU5DQyIpOworCWlmICghbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1jcHkobXNnLT5kYXRhLCBtbmNjLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJbXNnYl9lbnF1ZXVlKCZuZXQtPnVwcXVldWUsIG1zZyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG1uY2NfcmVsZWFzZV9pbmQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLAorCQkgICAgIHVfaW50MzJfdCBjYWxscmVmLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgcmVsOworCisJbWVtc2V0KCZyZWwsIDAsIHNpemVvZihyZWwpKTsKKwlyZWwuY2FsbHJlZiA9IGNhbGxyZWY7CisJbW5jY19zZXRfY2F1c2UoJnJlbCwgbG9jYXRpb24sIHZhbHVlKTsKKwlyZXR1cm4gbW5jY19yZWN2bXNnKG5ldCwgdHJhbnMsIE1OQ0NfUkVMX0lORCwgJnJlbCk7Cit9CisKKy8qIENhbGwgQ29udHJvbCBTcGVjaWZpYyB0cmFuc2FjdGlvbiByZWxlYXNlLgorICogZ2V0cyBjYWxsZWQgYnkgdHJhbnNfZnJlZSwgRE8gTk9UIENBTEwgWU9VUlNFTEYhICovCit2b2lkIF9nc200OF9jY190cmFuc19mcmVlKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKQoreworCWdzbTQ4X3N0b3BfY2NfdGltZXIodHJhbnMpOworCisJLyogc2VuZCByZWxlYXNlIHRvIEw0LCBpZiBjYWxscmVmIHN0aWxsIGV4aXN0cyAqLworCWlmICh0cmFucy0+Y2FsbHJlZikgeworCQkvKiBSZXNzb3VyY2UgdW5hdmFpbGFibGUgKi8KKwkJbW5jY19yZWxlYXNlX2luZCh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCB0cmFucy0+Y2FsbHJlZiwKKwkJCQkgR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLAorCQkJCSBHU000OF9DQ19DQVVTRV9SRVNPVVJDRV9VTkFWQUlMKTsKKwl9CisJaWYgKHRyYW5zLT5jYy5zdGF0ZSAhPSBHU01fQ1NUQVRFX05VTEwpCisJCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9OVUxMKTsKKwlpZiAodHJhbnMtPmNvbm4pCisJCXRyYXVfbXV4X3VubWFwKCZ0cmFucy0+Y29ubi0+bGNoYW4tPnRzLT5lMV9saW5rLCB0cmFucy0+Y2FsbHJlZik7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfc2V0dXAoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZyk7CisKKy8qIGNhbGwtYmFjayBmcm9tIHBhZ2luZyB0aGUgQi1lbmQgb2YgdGhlIGNvbm5lY3Rpb24gKi8KK3N0YXRpYyBpbnQgc2V0dXBfdHJpZ19wYWdfZXZ0KHVuc2lnbmVkIGludCBob29rbnVtLCB1bnNpZ25lZCBpbnQgZXZlbnQsCisJCQkgICAgICBzdHJ1Y3QgbXNnYiAqbXNnLCB2b2lkICpfbGNoYW4sIHZvaWQgKnBhcmFtKQoreworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gX2xjaGFuOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gcGFyYW07CisJc3RydWN0IGdzbV90cmFucyAqdHJhbnN0LCAqdG1wOworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0OworCisJaWYgKGhvb2tudW0gIT0gR1NNX0hPT0tfUlJfUEFHSU5HKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghc3Vic2NyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwluZXQgPSBzdWJzY3ItPm5ldDsKKwlpZiAoIW5ldCkgeworCQlERUJVR1AoRENDLCAiRXJyb3IgTmV0d29yayBub3Qgc2V0IVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGNoZWNrIGFsbCB0cmFuYWN0aW9ucyAod2l0aG91dCBsY2hhbikgZm9yIHN1YnNjcmliZXIgKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRyYW5zdCwgdG1wLCAmbmV0LT50cmFuc19saXN0LCBlbnRyeSkgeworCQlpZiAodHJhbnN0LT5zdWJzY3IgIT0gc3Vic2NyIHx8IHRyYW5zdC0+Y29ubikKKwkJCWNvbnRpbnVlOworCQlzd2l0Y2ggKGV2ZW50KSB7CisJCWNhc2UgR1NNX1BBR0lOR19TVUNDRUVERUQ6CisJCQlpZiAoIWxjaGFuKSAvLyBwYXJhbm9pZAorCQkJCWJyZWFrOworCQkJREVCVUdQKERDQywgIlBhZ2luZyBzdWJzY3IgJXMgc3VjY2VlZGVkIVxuIiwKKwkJCQlzdWJzY3ItPmV4dGVuc2lvbik7CisJCQkvKiBBc3NpZ24gbGNoYW4gKi8KKwkJCWlmICghdHJhbnN0LT5jb25uKSB7CisJCQkJdHJhbnN0LT5jb25uID0gJmxjaGFuLT5jb25uOworCQkJCXVzZV9zdWJzY3JfY29uKHRyYW5zdC0+Y29ubik7CisJCQl9CisJCQkvKiBzZW5kIFNFVFVQIHJlcXVlc3QgdG8gY2FsbGVkIHBhcnR5ICovCisJCQlnc200OF9jY190eF9zZXR1cCh0cmFuc3QsICZ0cmFuc3QtPmNjLm1zZyk7CisJCQlicmVhazsKKwkJY2FzZSBHU01fUEFHSU5HX0VYUElSRUQ6CisJCQlERUJVR1AoRENDLCAiUGFnaW5nIHN1YnNjciAlcyBleHBpcmVkIVxuIiwKKwkJCQlzdWJzY3ItPmV4dGVuc2lvbik7CisJCQkvKiBUZW1wb3JhcmlseSBvdXQgb2Ygb3JkZXIgKi8KKwkJCW1uY2NfcmVsZWFzZV9pbmQodHJhbnN0LT5zdWJzY3ItPm5ldCwgdHJhbnN0LAorCQkJCQkgdHJhbnN0LT5jYWxscmVmLAorCQkJCQkgR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLAorCQkJCQkgR1NNNDhfQ0NfQ0FVU0VfREVTVF9PT08pOworCQkJdHJhbnN0LT5jYWxscmVmID0gMDsKKwkJCXRyYW5zX2ZyZWUodHJhbnN0KTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRjaF9yZWN2X21uY2Moc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIHVfaW50MzJfdCBjYWxscmVmLCBpbnQgZW5hYmxlKTsKKworLyogc29tZSBvdGhlciBwYXJ0IG9mIHRoZSBjb2RlIHNlbmRzIHVzIGEgc2lnbmFsICovCitzdGF0aWMgaW50IGhhbmRsZV9hYmlzaXBfc2lnbmFsKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBzaWduYWwsCisJCQkJIHZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBzaWduYWxfZGF0YTsKKwlpbnQgcmM7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQ7CisJc3RydWN0IGdzbV90cmFucyAqdHJhbnM7CisKKwlpZiAoc3Vic3lzICE9IFNTX0FCSVNJUCkKKwkJcmV0dXJuIDA7CisKKwkvKiBpbiBjYXNlIHdlIHVzZSBkaXJlY3QgQlRTLXRvLUJUUyBSVFAgKi8KKwlpZiAoaXBhY2NfcnRwX2RpcmVjdCkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU19BQklTSVBfQ1JDWF9BQ0s6CisJCS8qIGNoZWNrIGlmIGFueSB0cmFuc2FjdGlvbnMgb24gdGhpcyBsY2hhbiBzdGlsbCBoYXZlCisJCSAqIGEgdGNoX3JlY3ZfbW5jYyByZXF1ZXN0IHBlbmRpbmcgKi8KKwkJbmV0ID0gbGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yazsKKwkJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJhbnMsICZuZXQtPnRyYW5zX2xpc3QsIGVudHJ5KSB7CisJCQlpZiAodHJhbnMtPmNvbm4gJiYgdHJhbnMtPmNvbm4tPmxjaGFuID09IGxjaGFuICYmIHRyYW5zLT50Y2hfcmVjdikgeworCQkJCURFQlVHUChEQ0MsICJwZW5kaW5nIHRjaF9yZWN2X21uY2MgcmVxdWVzdFxuIik7CisJCQkJdGNoX3JlY3ZfbW5jYyhuZXQsIHRyYW5zLT5jYWxscmVmLCAxKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogbWFwIHR3byBpcGFjY2VzcyBSVFAgc3RyZWFtcyBvbnRvIGVhY2ggb3RoZXIgKi8KK3N0YXRpYyBpbnQgdGNoX21hcChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgc3RydWN0IGdzbV9sY2hhbiAqcmVtb3RlX2xjaGFuKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSBsY2hhbi0+dHMtPnRyeC0+YnRzOworCXN0cnVjdCBnc21fYnRzICpyZW1vdGVfYnRzID0gcmVtb3RlX2xjaGFuLT50cy0+dHJ4LT5idHM7CisJaW50IHJjOworCisJREVCVUdQKERDQywgIlNldHRpbmcgdXAgVENIIG1hcCBiZXR3ZWVuIChidHM9JXUsdHJ4PSV1LHRzPSV1KSBhbmQgKGJ0cz0ldSx0cng9JXUsdHM9JXUpXG4iLAorCQlidHMtPm5yLCBsY2hhbi0+dHMtPnRyeC0+bnIsIGxjaGFuLT50cy0+bnIsCisJCXJlbW90ZV9idHMtPm5yLCByZW1vdGVfbGNoYW4tPnRzLT50cngtPm5yLCByZW1vdGVfbGNoYW4tPnRzLT5ucik7CisKKwlpZiAoYnRzLT50eXBlICE9IHJlbW90ZV9idHMtPnR5cGUpIHsKKwkJREVCVUdQKERDQywgIkNhbm5vdCBzd2l0Y2ggY2FsbHMgYmV0d2VlbiBkaWZmZXJlbnQgQlRTIHR5cGVzIHlldFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8vIHRvZG86IG1hcCBiZXR3ZWVuIGRpZmZlcmVudCBidHMgdHlwZXMKKwlzd2l0Y2ggKGJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX05BTk9CVFM6CisJCWlmICghaXBhY2NfcnRwX2RpcmVjdCkgeworCQkJLyogY29ubmVjdCB0aGUgVENIJ3MgdG8gb3VyIFJUUCBwcm94eSAqLworCQkJcmMgPSByc2xfaXBhY2NfbWRjeF90b19ydHBzb2NrKGxjaGFuKTsKKwkJCWlmIChyYyA8IDApCisJCQkJcmV0dXJuIHJjOworCQkJcmMgPSByc2xfaXBhY2NfbWRjeF90b19ydHBzb2NrKHJlbW90ZV9sY2hhbik7Cisjd2FybmluZyBkbyB3ZSBuZWVkIGEgY2hlY2sgb2YgcmMgaGVyZT8KKworCQkJLyogY29ubmVjdCB0aGVtIHdpdGggZWFjaCBvdGhlciAqLworCQkJcnRwX3NvY2tldF9wcm94eShsY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0LAorCQkJCQkgcmVtb3RlX2xjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQpOworCQl9IGVsc2UgeworCQkJLyogZGlyZWN0bHkgY29ubmVjdCBUQ0ggUlRQIHN0cmVhbXMgdG8gZWFjaCBvdGhlciAqLworCQkJcmMgPSByc2xfaXBhY2NfbWRjeChsY2hhbiwgcmVtb3RlX2xjaGFuLT5hYmlzX2lwLmJvdW5kX2lwLAorCQkJCQkJcmVtb3RlX2xjaGFuLT5hYmlzX2lwLmJvdW5kX3BvcnQsCisJCQkJCQlyZW1vdGVfbGNoYW4tPmFiaXNfaXAucnRwX3BheWxvYWQyKTsKKwkJCWlmIChyYyA8IDApCisJCQkJcmV0dXJuIHJjOworCQkJcmMgPSByc2xfaXBhY2NfbWRjeChyZW1vdGVfbGNoYW4sIGxjaGFuLT5hYmlzX2lwLmJvdW5kX2lwLAorCQkJCQkJbGNoYW4tPmFiaXNfaXAuYm91bmRfcG9ydCwKKwkJCQkJCWxjaGFuLT5hYmlzX2lwLnJ0cF9wYXlsb2FkMik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJdHJhdV9tdXhfbWFwX2xjaGFuKGxjaGFuLCByZW1vdGVfbGNoYW4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1AoRENDLCAiVW5rbm93biBCVFMgdHlwZSAldVxuIiwgYnRzLT50eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIGJyaWRnZSBjaGFubmVscyBvZiB0d28gdHJhbnNhY3Rpb25zICovCitzdGF0aWMgaW50IHRjaF9icmlkZ2Uoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIHVfaW50MzJfdCAqcmVmcykKK3sKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuczEgPSB0cmFuc19maW5kX2J5X2NhbGxyZWYobmV0LCByZWZzWzBdKTsKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuczIgPSB0cmFuc19maW5kX2J5X2NhbGxyZWYobmV0LCByZWZzWzFdKTsKKworCWlmICghdHJhbnMxIHx8ICF0cmFuczIpCisJCXJldHVybiAtRUlPOworCisJaWYgKCF0cmFuczEtPmNvbm4gfHwgIXRyYW5zMi0+Y29ubikKKwkJcmV0dXJuIC1FSU87CisKKwkvKiB0aHJvdWdoLWNvbm5lY3QgY2hhbm5lbCAqLworCXJldHVybiB0Y2hfbWFwKHRyYW5zMS0+Y29ubi0+bGNoYW4sIHRyYW5zMi0+Y29ubi0+bGNoYW4pOworfQorCisvKiBlbmFibGUgcmVjZWl2ZSBvZiBjaGFubmVscyB0byBNTkNDIHVwcXVldWUgKi8KK3N0YXRpYyBpbnQgdGNoX3JlY3ZfbW5jYyhzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgdV9pbnQzMl90IGNhbGxyZWYsIGludCBlbmFibGUpCit7CisJc3RydWN0IGdzbV90cmFucyAqdHJhbnM7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlpbnQgcmM7CisKKwkvKiBGaW5kIGNhbGxyZWYgKi8KKwl0cmFucyA9IHRyYW5zX2ZpbmRfYnlfY2FsbHJlZihuZXQsIGNhbGxyZWYpOworCWlmICghdHJhbnMpCisJCXJldHVybiAtRUlPOworCWlmICghdHJhbnMtPmNvbm4pCisJCXJldHVybiAwOworCWxjaGFuID0gdHJhbnMtPmNvbm4tPmxjaGFuOworCWJ0cyA9IGxjaGFuLT50cy0+dHJ4LT5idHM7CisKKwlzd2l0Y2ggKGJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX05BTk9CVFM6CisJCWlmIChpcGFjY19ydHBfZGlyZWN0KSB7CisJCQlERUJVR1AoRENDLCAiRXJyb3I6IFJUUCBwcm94eSBpcyBkaXNhYmxlZFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkvKiBpbiBjYXNlLCB3ZSBkb24ndCBoYXZlIGEgUlRQIHNvY2tldCB5ZXQsIHdlIG5vdGUgdGhpcworCQkgKiBpbiB0aGUgdHJhbnNhY3Rpb24gYW5kIHRyeSBsYXRlciAqLworCQlpZiAoIWxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQpIHsKKwkJCXRyYW5zLT50Y2hfcmVjdiA9IGVuYWJsZTsKKwkJCURFQlVHUChEQ0MsICJxdWV1ZSB0Y2hfcmVjdl9tbmNjIHJlcXVlc3QgKCVkKVxuIiwgZW5hYmxlKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChlbmFibGUpIHsKKwkJCS8qIGNvbm5lY3QgdGhlIFRDSCdzIHRvIG91ciBSVFAgcHJveHkgKi8KKwkJCXJjID0gcnNsX2lwYWNjX21kY3hfdG9fcnRwc29jayhsY2hhbik7CisJCQlpZiAocmMgPCAwKQorCQkJCXJldHVybiByYzsKKwkJCS8qIGFzc2lnbiBzb2NrZXQgdG8gYXBwbGljYXRpb24gaW50ZXJmYWNlICovCisJCQlydHBfc29ja2V0X3Vwc3RyZWFtKGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQsCisJCQkJbmV0LCBjYWxscmVmKTsKKwkJfSBlbHNlCisJCQlydHBfc29ja2V0X3Vwc3RyZWFtKGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQsCisJCQkJbmV0LCAwKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJaWYgKGVuYWJsZSkKKwkJCXJldHVybiB0cmF1X3JlY3ZfbGNoYW4obGNoYW4sIGNhbGxyZWYpOworCQlyZXR1cm4gdHJhdV9tdXhfdW5tYXAoTlVMTCwgY2FsbHJlZik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUChEQ0MsICJVbmtub3duIEJUUyB0eXBlICV1XG4iLCBidHMtPnR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9zdGF0dXNfZW5xKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCURFQlVHUChEQ0MsICItPiBTVEFUVVMgRU5RXG4iKTsKKwlyZXR1cm4gZ3NtNDhfY2NfdHhfc3RhdHVzKHRyYW5zLCBtc2cpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X3JlbGVhc2Uoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZyk7CitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X2Rpc2Nvbm5lY3Qoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZyk7CisKK3N0YXRpYyB2b2lkIGdzbTQ4X2NjX3RpbWVvdXQodm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zID0gYXJnOworCWludCBkaXNjb25uZWN0ID0gMCwgcmVsZWFzZSA9IDA7CisJaW50IG1vX2NhdXNlID0gR1NNNDhfQ0NfQ0FVU0VfUkVDT1ZFUllfVElNRVI7CisJaW50IG1vX2xvY2F0aW9uID0gR1NNNDhfQ0FVU0VfTE9DX1VTRVI7CisJaW50IGw0X2NhdXNlID0gR1NNNDhfQ0NfQ0FVU0VfTk9STUFMX1VOU1BFQzsKKwlpbnQgbDRfbG9jYXRpb24gPSBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFU7CisJc3RydWN0IGdzbV9tbmNjIG1vX3JlbCwgbDRfcmVsOworCisJbWVtc2V0KCZtb19yZWwsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwltb19yZWwuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCW1lbXNldCgmbDRfcmVsLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJbDRfcmVsLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKworCXN3aXRjaCh0cmFucy0+Y2MuVGN1cnJlbnQpIHsKKwljYXNlIDB4MzAzOgorCQlyZWxlYXNlID0gMTsKKwkJbDRfY2F1c2UgPSBHU000OF9DQ19DQVVTRV9VU0VSX05PVFJFU1BPTkQ7CisJCWJyZWFrOworCWNhc2UgMHgzMTA6CisJCWRpc2Nvbm5lY3QgPSAxOworCQlsNF9jYXVzZSA9IEdTTTQ4X0NDX0NBVVNFX1VTRVJfTk9UUkVTUE9ORDsKKwkJYnJlYWs7CisJY2FzZSAweDMxMzoKKwkJZGlzY29ubmVjdCA9IDE7CisJCS8qIHVua25vd24sIGRpZCBub3QgZmluZCBpdCBpbiB0aGUgc3BlY3MgKi8KKwkJYnJlYWs7CisJY2FzZSAweDMwMToKKwkJZGlzY29ubmVjdCA9IDE7CisJCWw0X2NhdXNlID0gR1NNNDhfQ0NfQ0FVU0VfVVNFUl9OT1RSRVNQT05EOworCQlicmVhazsKKwljYXNlIDB4MzA4OgorCQlpZiAoIXRyYW5zLT5jYy5UMzA4X3NlY29uZCkgeworCQkJLyogcmVzdGFydCBUMzA4IGEgc2Vjb25kIHRpbWUgKi8KKwkJCWdzbTQ4X2NjX3R4X3JlbGVhc2UodHJhbnMsICZ0cmFucy0+Y2MubXNnKTsKKwkJCXRyYW5zLT5jYy5UMzA4X3NlY29uZCA9IDE7CisJCQlicmVhazsgLyogc3RheSBpbiByZWxlYXNlIHN0YXRlICovCisJCX0KKwkJdHJhbnNfZnJlZSh0cmFucyk7CisJCXJldHVybjsKKy8vCQlyZWxlYXNlID0gMTsKKy8vCQlsNF9jYXVzZSA9IDE0OworLy8JCWJyZWFrOworCWNhc2UgMHgzMDY6CisJCXJlbGVhc2UgPSAxOworCQltb19jYXVzZSA9IHRyYW5zLT5jYy5tc2cuY2F1c2UudmFsdWU7CisJCW1vX2xvY2F0aW9uID0gdHJhbnMtPmNjLm1zZy5jYXVzZS5sb2NhdGlvbjsKKwkJYnJlYWs7CisJY2FzZSAweDMyMzoKKwkJZGlzY29ubmVjdCA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJlbGVhc2UgPSAxOworCX0KKworCWlmIChyZWxlYXNlICYmIHRyYW5zLT5jYWxscmVmKSB7CisJCS8qIHByb2Nlc3MgcmVsZWFzZSB0b3dhcmRzIGxheWVyIDQgKi8KKwkJbW5jY19yZWxlYXNlX2luZCh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCB0cmFucy0+Y2FsbHJlZiwKKwkJCQkgbDRfbG9jYXRpb24sIGw0X2NhdXNlKTsKKwkJdHJhbnMtPmNhbGxyZWYgPSAwOworCX0KKworCWlmIChkaXNjb25uZWN0ICYmIHRyYW5zLT5jYWxscmVmKSB7CisJCS8qIHByb2Nlc3MgZGlzY29ubmVjdCB0b3dhcmRzIGxheWVyIDQgKi8KKwkJbW5jY19zZXRfY2F1c2UoJmw0X3JlbCwgbDRfbG9jYXRpb24sIGw0X2NhdXNlKTsKKwkJbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfRElTQ19JTkQsICZsNF9yZWwpOworCX0KKworCS8qIHByb2Nlc3MgZGlzY29ubmVjdCB0b3dhcmRzIG1vYmlsZSBzdGF0aW9uICovCisJaWYgKGRpc2Nvbm5lY3QgfHwgcmVsZWFzZSkgeworCQltbmNjX3NldF9jYXVzZSgmbW9fcmVsLCBtb19sb2NhdGlvbiwgbW9fY2F1c2UpOworCQltb19yZWwuY2F1c2UuZGlhZ1swXSA9ICgodHJhbnMtPmNjLlRjdXJyZW50ICYgMHhmMDApID4+IDgpICsgJzAnOworCQltb19yZWwuY2F1c2UuZGlhZ1sxXSA9ICgodHJhbnMtPmNjLlRjdXJyZW50ICYgMHgwZjApID4+IDQpICsgJzAnOworCQltb19yZWwuY2F1c2UuZGlhZ1syXSA9ICh0cmFucy0+Y2MuVGN1cnJlbnQgJiAweDAwZikgKyAnMCc7CisJCW1vX3JlbC5jYXVzZS5kaWFnX2xlbiA9IDM7CisKKwkJaWYgKGRpc2Nvbm5lY3QpCisJCQlnc200OF9jY190eF9kaXNjb25uZWN0KHRyYW5zLCAmbW9fcmVsKTsKKwkJaWYgKHJlbGVhc2UpCisJCQlnc200OF9jY190eF9yZWxlYXNlKHRyYW5zLCAmbW9fcmVsKTsKKwl9CisKK30KKworc3RhdGljIHZvaWQgZ3NtNDhfc3RhcnRfY2NfdGltZXIoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIGludCBjdXJyZW50LAorCQkJCSBpbnQgc2VjLCBpbnQgbWljcm8pCit7CisJREVCVUdQKERDQywgInN0YXJ0aW5nIHRpbWVyIFQleCB3aXRoICVkIHNlY29uZHNcbiIsIGN1cnJlbnQsIHNlYyk7CisJdHJhbnMtPmNjLnRpbWVyLmNiID0gZ3NtNDhfY2NfdGltZW91dDsKKwl0cmFucy0+Y2MudGltZXIuZGF0YSA9IHRyYW5zOworCWJzY19zY2hlZHVsZV90aW1lcigmdHJhbnMtPmNjLnRpbWVyLCBzZWMsIG1pY3JvKTsKKwl0cmFucy0+Y2MuVGN1cnJlbnQgPSBjdXJyZW50OworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X3NldHVwKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVfaW50OF90IG1zZ190eXBlID0gZ2gtPm1zZ190eXBlICYgMHhiZjsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21uY2Mgc2V0dXA7CisKKwltZW1zZXQoJnNldHVwLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJc2V0dXAuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCXRsdl9wYXJzZSgmdHAsICZnc200OF9hdHRfdGx2ZGVmLCBnaC0+ZGF0YSwgcGF5bG9hZF9sZW4sIDAsIDApOworCS8qIGVtZXJnZW5jeSBzZXR1cCBpcyBpZGVudGlmaWVkIGJ5IG1zZ190eXBlICovCisJaWYgKG1zZ190eXBlID09IEdTTTQ4X01UX0NDX0VNRVJHX1NFVFVQKQorCQlzZXR1cC5lbWVyZ2VuY3kgPSAxOworCisJLyogdXNlIHN1YnNjcmliZXIgYXMgY2FsbGluZyBwYXJ0eSBudW1iZXIgKi8KKwlpZiAodHJhbnMtPnN1YnNjcikgeworCQlzZXR1cC5maWVsZHMgfD0gTU5DQ19GX0NBTExJTkc7CisJCXN0cm5jcHkoc2V0dXAuY2FsbGluZy5udW1iZXIsIHRyYW5zLT5zdWJzY3ItPmV4dGVuc2lvbiwKKwkJCXNpemVvZihzZXR1cC5jYWxsaW5nLm51bWJlciktMSk7CisJCXN0cm5jcHkoc2V0dXAuaW1zaSwgdHJhbnMtPnN1YnNjci0+aW1zaSwKKwkJCXNpemVvZihzZXR1cC5pbXNpKS0xKTsKKwl9CisJLyogYmVhcmVyIGNhcGFiaWxpdHkgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfQkVBUkVSX0NBUCkpIHsKKwkJc2V0dXAuZmllbGRzIHw9IE1OQ0NfRl9CRUFSRVJfQ0FQOworCQlnc200OF9kZWNvZGVfYmVhcmVyX2NhcCgmc2V0dXAuYmVhcmVyX2NhcCwKKwkJCQkgIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfQkVBUkVSX0NBUCktMSk7CisJfQorCS8qIGZhY2lsaXR5ICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0ZBQ0lMSVRZKSkgeworCQlzZXR1cC5maWVsZHMgfD0gTU5DQ19GX0ZBQ0lMSVRZOworCQlnc200OF9kZWNvZGVfZmFjaWxpdHkoJnNldHVwLmZhY2lsaXR5LAorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfRkFDSUxJVFkpLTEpOworCX0KKwkvKiBjYWxsZWQgcGFydHkgYmNkIG51bWJlciAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9DQUxMRURfQkNEKSkgeworCQlzZXR1cC5maWVsZHMgfD0gTU5DQ19GX0NBTExFRDsKKwkJZ3NtNDhfZGVjb2RlX2NhbGxlZCgmc2V0dXAuY2FsbGVkLAorCQkJICAgICAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9DQUxMRURfQkNEKS0xKTsKKwl9CisJLyogdXNlci11c2VyICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1VTRVJfVVNFUikpIHsKKwkJc2V0dXAuZmllbGRzIHw9IE1OQ0NfRl9VU0VSVVNFUjsKKwkJZ3NtNDhfZGVjb2RlX3VzZXJ1c2VyKCZzZXR1cC51c2VydXNlciwKKwkJCQlUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX1VTRVJfVVNFUiktMSk7CisJfQorCS8qIHNzLXZlcnNpb24gKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfU1NfVkVSUykpIHsKKwkJc2V0dXAuZmllbGRzIHw9IE1OQ0NfRl9TU1ZFUlNJT047CisJCWdzbTQ4X2RlY29kZV9zc3ZlcnNpb24oJnNldHVwLnNzdmVyc2lvbiwKKwkJCQkgVExWUF9WQUwoJnRwLCBHU000OF9JRV9TU19WRVJTKS0xKTsKKwl9CisJLyogQ0xJUiBzdXBwcmVzc2lvbiAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9DTElSX1NVUFApKQorCQlzZXR1cC5jbGlyLnN1cCA9IDE7CisJLyogQ0xJUiBpbnZvY2F0aW9uICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0NMSVJfSU5WT0MpKQorCQlzZXR1cC5jbGlyLmludiA9IDE7CisJLyogY2MgY2FwICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0NDX0NBUCkpIHsKKwkJc2V0dXAuZmllbGRzIHw9IE1OQ0NfRl9DQ0NBUDsKKwkJZ3NtNDhfZGVjb2RlX2NjY2FwKCZzZXR1cC5jY2NhcCwKKwkJCSAgICAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9DQ19DQVApLTEpOworCX0KKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9JTklUSUFURUQpOworCisJTE9HUChEQ0MsIExPR0xfSU5GTywgIlN1YnNjcmliZXIgJXMgKCVzKSBzZW5kcyBTRVRVUCB0byAlc1xuIiwKKwkgICAgIHN1YnNjcl9uYW1lKHRyYW5zLT5zdWJzY3IpLCB0cmFucy0+c3Vic2NyLT5leHRlbnNpb24sCisJICAgICBzZXR1cC5jYWxsZWQubnVtYmVyKTsKKworCS8qIGluZGljYXRlIHNldHVwIHRvIE1OQ0MgKi8KKwltbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19TRVRVUF9JTkQsICZzZXR1cCk7CisKKwkvKiBNTkNDIGNvZGUgd2lsbCBtb2RpZnkgdGhlIGNoYW5uZWwgYXN5bmNocm9ub3VzbHksIHdlIHNob3VsZAorCSAqIGlwYWNjZXNzLWJpbmQgb25seSBhZnRlciB0aGUgbW9kaWZpY2F0aW9uIGhhcyBiZWVuIG1hZGUgdG8gdGhlCisJICogbGNoYW4tPnRjaF9tb2RlICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfc2V0dXAoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCXN0cnVjdCBnc21fbW5jYyAqc2V0dXAgPSBhcmc7CisJaW50IHJjLCB0cmFuc19pZDsKKworCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwkvKiB0cmFuc2FjdGlvbiBpZCBtdXN0IG5vdCBiZSBhc3NpZ25lZCAqLworCWlmICh0cmFucy0+dHJhbnNhY3Rpb25faWQgIT0gMHhmZikgeyAvKiB1bmFzc3NpZ25lZCAqLworCQlERUJVR1AoRENDLCAiVFggU2V0dXAgd2l0aCBhc3NpZ25lZCB0cmFuc2FjdGlvbi4gIgorCQkJIlRoaXMgaXMgbm90IGFsbG93ZWQhXG4iKTsKKwkJLyogVGVtcG9yYXJpbHkgb3V0IG9mIG9yZGVyICovCisJCXJjID0gbW5jY19yZWxlYXNlX2luZCh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCB0cmFucy0+Y2FsbHJlZiwKKwkJCQkgICAgICBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJICAgICAgR1NNNDhfQ0NfQ0FVU0VfUkVTT1VSQ0VfVU5BVkFJTCk7CisJCXRyYW5zLT5jYWxscmVmID0gMDsKKwkJdHJhbnNfZnJlZSh0cmFucyk7CisJCXJldHVybiByYzsKKwl9CisJCisJLyogR2V0IGZyZWUgdHJhbnNhY3Rpb25faWQgKi8KKwl0cmFuc19pZCA9IHRyYW5zX2Fzc2lnbl90cmFuc19pZCh0cmFucy0+c3Vic2NyLCBHU000OF9QRElTQ19DQywgMCk7CisJaWYgKHRyYW5zX2lkIDwgMCkgeworCQkvKiBubyBmcmVlIHRyYW5zYWN0aW9uIElEICovCisJCXJjID0gbW5jY19yZWxlYXNlX2luZCh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCB0cmFucy0+Y2FsbHJlZiwKKwkJCQkgICAgICBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJICAgICAgR1NNNDhfQ0NfQ0FVU0VfUkVTT1VSQ0VfVU5BVkFJTCk7CisJCXRyYW5zLT5jYWxscmVmID0gMDsKKwkJdHJhbnNfZnJlZSh0cmFucyk7CisJCXJldHVybiByYzsKKwl9CisJdHJhbnMtPnRyYW5zYWN0aW9uX2lkID0gdHJhbnNfaWQ7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19TRVRVUDsKKworCWdzbTQ4X3N0YXJ0X2NjX3RpbWVyKHRyYW5zLCAweDMwMywgR1NNNDhfVDMwMyk7CisKKwkvKiBiZWFyZXIgY2FwYWJpbGl0eSAqLworCWlmIChzZXR1cC0+ZmllbGRzICYgTU5DQ19GX0JFQVJFUl9DQVApCisJCWdzbTQ4X2VuY29kZV9iZWFyZXJfY2FwKG1zZywgMCwgJnNldHVwLT5iZWFyZXJfY2FwKTsKKwkvKiBmYWNpbGl0eSAqLworCWlmIChzZXR1cC0+ZmllbGRzICYgTU5DQ19GX0ZBQ0lMSVRZKQorCQlnc200OF9lbmNvZGVfZmFjaWxpdHkobXNnLCAwLCAmc2V0dXAtPmZhY2lsaXR5KTsKKwkvKiBwcm9ncmVzcyAqLworCWlmIChzZXR1cC0+ZmllbGRzICYgTU5DQ19GX1BST0dSRVNTKQorCQlnc200OF9lbmNvZGVfcHJvZ3Jlc3MobXNnLCAwLCAmc2V0dXAtPnByb2dyZXNzKTsKKwkvKiBjYWxsaW5nIHBhcnR5IEJDRCBudW1iZXIgKi8KKwlpZiAoc2V0dXAtPmZpZWxkcyAmIE1OQ0NfRl9DQUxMSU5HKQorCQlnc200OF9lbmNvZGVfY2FsbGluZyhtc2csICZzZXR1cC0+Y2FsbGluZyk7CisJLyogY2FsbGVkIHBhcnR5IEJDRCBudW1iZXIgKi8KKwlpZiAoc2V0dXAtPmZpZWxkcyAmIE1OQ0NfRl9DQUxMRUQpCisJCWdzbTQ4X2VuY29kZV9jYWxsZWQobXNnLCAmc2V0dXAtPmNhbGxlZCk7CisJLyogdXNlci11c2VyICovCisJaWYgKHNldHVwLT5maWVsZHMgJiBNTkNDX0ZfVVNFUlVTRVIpCisJCWdzbTQ4X2VuY29kZV91c2VydXNlcihtc2csIDAsICZzZXR1cC0+dXNlcnVzZXIpOworCS8qIHJlZGlyZWN0aW5nIHBhcnR5IEJDRCBudW1iZXIgKi8KKwlpZiAoc2V0dXAtPmZpZWxkcyAmIE1OQ0NfRl9SRURJUkVDVElORykKKwkJZ3NtNDhfZW5jb2RlX3JlZGlyZWN0aW5nKG1zZywgJnNldHVwLT5yZWRpcmVjdGluZyk7CisJLyogc2lnbmFsICovCisJaWYgKHNldHVwLT5maWVsZHMgJiBNTkNDX0ZfU0lHTkFMKQorCQlnc200OF9lbmNvZGVfc2lnbmFsKG1zZywgc2V0dXAtPnNpZ25hbCk7CisJCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0NBTExfUFJFU0VOVCk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9jYWxsX2NvbmYoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuID0gbXNnYl9sM2xlbihtc2cpIC0gc2l6ZW9mKCpnaCk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJc3RydWN0IGdzbV9tbmNjIGNhbGxfY29uZjsKKworCWdzbTQ4X3N0b3BfY2NfdGltZXIodHJhbnMpOworCWdzbTQ4X3N0YXJ0X2NjX3RpbWVyKHRyYW5zLCAweDMxMCwgR1NNNDhfVDMxMCk7CisKKwltZW1zZXQoJmNhbGxfY29uZiwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCWNhbGxfY29uZi5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbiwgMCwgMCk7CisjaWYgMAorCS8qIHJlcGVhdCAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9SRVBFQVRfQ0lSKSkKKwkJY2FsbF9jb25mLnJlcGVhdCA9IDE7CisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1JFUEVBVF9TRVEpKQorCQljYWxsX2NvbmYucmVwZWF0ID0gMjsKKyNlbmRpZgorCS8qIGJlYXJlciBjYXBhYmlsaXR5ICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0JFQVJFUl9DQVApKSB7CisJCWNhbGxfY29uZi5maWVsZHMgfD0gTU5DQ19GX0JFQVJFUl9DQVA7CisJCWdzbTQ4X2RlY29kZV9iZWFyZXJfY2FwKCZjYWxsX2NvbmYuYmVhcmVyX2NhcCwKKwkJCQkgIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfQkVBUkVSX0NBUCktMSk7CisJfQorCS8qIGNhdXNlICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0NBVVNFKSkgeworCQljYWxsX2NvbmYuZmllbGRzIHw9IE1OQ0NfRl9DQVVTRTsKKwkJZ3NtNDhfZGVjb2RlX2NhdXNlKCZjYWxsX2NvbmYuY2F1c2UsCisJCQkgICAgIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfQ0FVU0UpLTEpOworCX0KKwkvKiBjYyBjYXAgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfQ0NfQ0FQKSkgeworCQljYWxsX2NvbmYuZmllbGRzIHw9IE1OQ0NfRl9DQ0NBUDsKKwkJZ3NtNDhfZGVjb2RlX2NjY2FwKCZjYWxsX2NvbmYuY2NjYXAsCisJCQkgICAgIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfQ0NfQ0FQKS0xKTsKKwl9CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfTU9fVEVSTV9DQUxMX0NPTkYpOworCisJcmV0dXJuIG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX0NBTExfQ09ORl9JTkQsCisJCQkgICAgJmNhbGxfY29uZik7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfY2FsbF9wcm9jKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCit7CisJc3RydWN0IGdzbV9tbmNjICpwcm9jZWVkaW5nID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX0NBTExfUFJPQzsKKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9NT19DQUxMX1BST0MpOworCisJLyogYmVhcmVyIGNhcGFiaWxpdHkgKi8KKwlpZiAocHJvY2VlZGluZy0+ZmllbGRzICYgTU5DQ19GX0JFQVJFUl9DQVApCisJCWdzbTQ4X2VuY29kZV9iZWFyZXJfY2FwKG1zZywgMCwgJnByb2NlZWRpbmctPmJlYXJlcl9jYXApOworCS8qIGZhY2lsaXR5ICovCisJaWYgKHByb2NlZWRpbmctPmZpZWxkcyAmIE1OQ0NfRl9GQUNJTElUWSkKKwkJZ3NtNDhfZW5jb2RlX2ZhY2lsaXR5KG1zZywgMCwgJnByb2NlZWRpbmctPmZhY2lsaXR5KTsKKwkvKiBwcm9ncmVzcyAqLworCWlmIChwcm9jZWVkaW5nLT5maWVsZHMgJiBNTkNDX0ZfUFJPR1JFU1MpCisJCWdzbTQ4X2VuY29kZV9wcm9ncmVzcyhtc2csIDAsICZwcm9jZWVkaW5nLT5wcm9ncmVzcyk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9hbGVydGluZyhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21uY2MgYWxlcnRpbmc7CisJCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisJZ3NtNDhfc3RhcnRfY2NfdGltZXIodHJhbnMsIDB4MzAxLCBHU000OF9UMzAxKTsKKworCW1lbXNldCgmYWxlcnRpbmcsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlhbGVydGluZy5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbiwgMCwgMCk7CisJLyogZmFjaWxpdHkgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfRkFDSUxJVFkpKSB7CisJCWFsZXJ0aW5nLmZpZWxkcyB8PSBNTkNDX0ZfRkFDSUxJVFk7CisJCWdzbTQ4X2RlY29kZV9mYWNpbGl0eSgmYWxlcnRpbmcuZmFjaWxpdHksCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9GQUNJTElUWSktMSk7CisJfQorCisJLyogcHJvZ3Jlc3MgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfUFJPR1JfSU5EKSkgeworCQlhbGVydGluZy5maWVsZHMgfD0gTU5DQ19GX1BST0dSRVNTOworCQlnc200OF9kZWNvZGVfcHJvZ3Jlc3MoJmFsZXJ0aW5nLnByb2dyZXNzLAorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfUFJPR1JfSU5EKS0xKTsKKwl9CisJLyogc3MtdmVyc2lvbiAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9TU19WRVJTKSkgeworCQlhbGVydGluZy5maWVsZHMgfD0gTU5DQ19GX1NTVkVSU0lPTjsKKwkJZ3NtNDhfZGVjb2RlX3NzdmVyc2lvbigmYWxlcnRpbmcuc3N2ZXJzaW9uLAorCQkJCSBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpLTEpOworCX0KKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9DQUxMX1JFQ0VJVkVEKTsKKworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19BTEVSVF9JTkQsCisJCQkgICAgJmFsZXJ0aW5nKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9hbGVydGluZyhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqYWxlcnRpbmcgPSBhcmc7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfQ0NfQUxFUlRJTkc7CisKKwkvKiBmYWNpbGl0eSAqLworCWlmIChhbGVydGluZy0+ZmllbGRzICYgTU5DQ19GX0ZBQ0lMSVRZKQorCQlnc200OF9lbmNvZGVfZmFjaWxpdHkobXNnLCAwLCAmYWxlcnRpbmctPmZhY2lsaXR5KTsKKwkvKiBwcm9ncmVzcyAqLworCWlmIChhbGVydGluZy0+ZmllbGRzICYgTU5DQ19GX1BST0dSRVNTKQorCQlnc200OF9lbmNvZGVfcHJvZ3Jlc3MobXNnLCAwLCAmYWxlcnRpbmctPnByb2dyZXNzKTsKKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAoYWxlcnRpbmctPmZpZWxkcyAmIE1OQ0NfRl9VU0VSVVNFUikKKwkJZ3NtNDhfZW5jb2RlX3VzZXJ1c2VyKG1zZywgMCwgJmFsZXJ0aW5nLT51c2VydXNlcik7CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfQ0FMTF9ERUxJVkVSRUQpOworCQorCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X3Byb2dyZXNzKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCit7CisJc3RydWN0IGdzbV9tbmNjICpwcm9ncmVzcyA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19QUk9HUkVTUzsKKworCS8qIHByb2dyZXNzICovCisJZ3NtNDhfZW5jb2RlX3Byb2dyZXNzKG1zZywgMSwgJnByb2dyZXNzLT5wcm9ncmVzcyk7CisJLyogdXNlci11c2VyICovCisJaWYgKHByb2dyZXNzLT5maWVsZHMgJiBNTkNDX0ZfVVNFUlVTRVIpCisJCWdzbTQ4X2VuY29kZV91c2VydXNlcihtc2csIDAsICZwcm9ncmVzcy0+dXNlcnVzZXIpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfY29ubmVjdChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqY29ubmVjdCA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19DT05ORUNUOworCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisJZ3NtNDhfc3RhcnRfY2NfdGltZXIodHJhbnMsIDB4MzEzLCBHU000OF9UMzEzKTsKKworCS8qIGZhY2lsaXR5ICovCisJaWYgKGNvbm5lY3QtPmZpZWxkcyAmIE1OQ0NfRl9GQUNJTElUWSkKKwkJZ3NtNDhfZW5jb2RlX2ZhY2lsaXR5KG1zZywgMCwgJmNvbm5lY3QtPmZhY2lsaXR5KTsKKwkvKiBwcm9ncmVzcyAqLworCWlmIChjb25uZWN0LT5maWVsZHMgJiBNTkNDX0ZfUFJPR1JFU1MpCisJCWdzbTQ4X2VuY29kZV9wcm9ncmVzcyhtc2csIDAsICZjb25uZWN0LT5wcm9ncmVzcyk7CisJLyogY29ubmVjdGVkIG51bWJlciAqLworCWlmIChjb25uZWN0LT5maWVsZHMgJiBNTkNDX0ZfQ09OTkVDVEVEKQorCQlnc200OF9lbmNvZGVfY29ubmVjdGVkKG1zZywgJmNvbm5lY3QtPmNvbm5lY3RlZCk7CisJLyogdXNlci11c2VyICovCisJaWYgKGNvbm5lY3QtPmZpZWxkcyAmIE1OQ0NfRl9VU0VSVVNFUikKKwkJZ3NtNDhfZW5jb2RlX3VzZXJ1c2VyKG1zZywgMCwgJmNvbm5lY3QtPnVzZXJ1c2VyKTsKKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9DT05ORUNUX0lORCk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9jb25uZWN0KHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyBjb25uZWN0OworCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisKKwltZW1zZXQoJmNvbm5lY3QsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwljb25uZWN0LmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwl0bHZfcGFyc2UoJnRwLCAmZ3NtNDhfYXR0X3RsdmRlZiwgZ2gtPmRhdGEsIHBheWxvYWRfbGVuLCAwLCAwKTsKKwkvKiB1c2Ugc3Vic2NyaWJlciBhcyBjb25uZWN0ZWQgcGFydHkgbnVtYmVyICovCisJaWYgKHRyYW5zLT5zdWJzY3IpIHsKKwkJY29ubmVjdC5maWVsZHMgfD0gTU5DQ19GX0NPTk5FQ1RFRDsKKwkJc3RybmNweShjb25uZWN0LmNvbm5lY3RlZC5udW1iZXIsIHRyYW5zLT5zdWJzY3ItPmV4dGVuc2lvbiwKKwkJCXNpemVvZihjb25uZWN0LmNvbm5lY3RlZC5udW1iZXIpLTEpOworCQlzdHJuY3B5KGNvbm5lY3QuaW1zaSwgdHJhbnMtPnN1YnNjci0+aW1zaSwKKwkJCXNpemVvZihjb25uZWN0Lmltc2kpLTEpOworCX0KKwkvKiBmYWNpbGl0eSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9GQUNJTElUWSkpIHsKKwkJY29ubmVjdC5maWVsZHMgfD0gTU5DQ19GX0ZBQ0lMSVRZOworCQlnc200OF9kZWNvZGVfZmFjaWxpdHkoJmNvbm5lY3QuZmFjaWxpdHksCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9GQUNJTElUWSktMSk7CisJfQorCS8qIHVzZXItdXNlciAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9VU0VSX1VTRVIpKSB7CisJCWNvbm5lY3QuZmllbGRzIHw9IE1OQ0NfRl9VU0VSVVNFUjsKKwkJZ3NtNDhfZGVjb2RlX3VzZXJ1c2VyKCZjb25uZWN0LnVzZXJ1c2VyLAorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfVVNFUl9VU0VSKS0xKTsKKwl9CisJLyogc3MtdmVyc2lvbiAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9TU19WRVJTKSkgeworCQljb25uZWN0LmZpZWxkcyB8PSBNTkNDX0ZfU1NWRVJTSU9OOworCQlnc200OF9kZWNvZGVfc3N2ZXJzaW9uKCZjb25uZWN0LnNzdmVyc2lvbiwKKwkJCQkgVExWUF9WQUwoJnRwLCBHU000OF9JRV9TU19WRVJTKS0xKTsKKwl9CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfQ09OTkVDVF9SRVFVRVNUKTsKKworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19TRVRVUF9DTkYsICZjb25uZWN0KTsKK30KKworCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X2Nvbm5lY3RfYWNrKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc21fbW5jYyBjb25uZWN0X2FjazsKKworCWdzbTQ4X3N0b3BfY2NfdGltZXIodHJhbnMpOworCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0FDVElWRSk7CisJCisJbWVtc2V0KCZjb25uZWN0X2FjaywgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCWNvbm5lY3RfYWNrLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfU0VUVVBfQ09NUExfSU5ELAorCQkJICAgICZjb25uZWN0X2Fjayk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfY29ubmVjdF9hY2soc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19DT05ORUNUX0FDSzsKKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9BQ1RJVkUpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfZGlzY29ubmVjdChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21uY2MgZGlzYzsKKworCWdzbTQ4X3N0b3BfY2NfdGltZXIodHJhbnMpOworCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0RJU0NPTk5FQ1RfUkVRKTsKKworCW1lbXNldCgmZGlzYywgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCWRpc2MuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCXRsdl9wYXJzZSgmdHAsICZnc200OF9hdHRfdGx2ZGVmLCBnaC0+ZGF0YSwgcGF5bG9hZF9sZW4sIEdTTTQ4X0lFX0NBVVNFLCAwKTsKKwkvKiBjYXVzZSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9DQVVTRSkpIHsKKwkJZGlzYy5maWVsZHMgfD0gTU5DQ19GX0NBVVNFOworCQlnc200OF9kZWNvZGVfY2F1c2UoJmRpc2MuY2F1c2UsCisJCQkgICAgIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfQ0FVU0UpLTEpOworCX0KKwkvKiBmYWNpbGl0eSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9GQUNJTElUWSkpIHsKKwkJZGlzYy5maWVsZHMgfD0gTU5DQ19GX0ZBQ0lMSVRZOworCQlnc200OF9kZWNvZGVfZmFjaWxpdHkoJmRpc2MuZmFjaWxpdHksCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9GQUNJTElUWSktMSk7CisJfQorCS8qIHVzZXItdXNlciAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9VU0VSX1VTRVIpKSB7CisJCWRpc2MuZmllbGRzIHw9IE1OQ0NfRl9VU0VSVVNFUjsKKwkJZ3NtNDhfZGVjb2RlX3VzZXJ1c2VyKCZkaXNjLnVzZXJ1c2VyLAorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfVVNFUl9VU0VSKS0xKTsKKwl9CisJLyogc3MtdmVyc2lvbiAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9TU19WRVJTKSkgeworCQlkaXNjLmZpZWxkcyB8PSBNTkNDX0ZfU1NWRVJTSU9OOworCQlnc200OF9kZWNvZGVfc3N2ZXJzaW9uKCZkaXNjLnNzdmVyc2lvbiwKKwkJCQkgVExWUF9WQUwoJnRwLCBHU000OF9JRV9TU19WRVJTKS0xKTsKKwl9CisKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfRElTQ19JTkQsICZkaXNjKTsKKworfQorCitzdGF0aWMgc3RydWN0IGdzbV9tbmNjX2NhdXNlIGRlZmF1bHRfY2F1c2UgPSB7CisJLmxvY2F0aW9uCT0gR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLAorCS5jb2RpbmcJCT0gMCwKKwkucmVjCQk9IDAsCisJLnJlY192YWwJPSAwLAorCS52YWx1ZQkJPSBHU000OF9DQ19DQVVTRV9OT1JNQUxfVU5TUEVDLAorCS5kaWFnX2xlbgk9IDAsCisJLmRpYWcJCT0geyAwIH0sCit9OworCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X2Rpc2Nvbm5lY3Qoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKmRpc2MgPSBhcmc7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfQ0NfRElTQ09OTkVDVDsKKworCWdzbTQ4X3N0b3BfY2NfdGltZXIodHJhbnMpOworCWdzbTQ4X3N0YXJ0X2NjX3RpbWVyKHRyYW5zLCAweDMwNiwgR1NNNDhfVDMwNik7CisKKwkvKiBjYXVzZSAqLworCWlmIChkaXNjLT5maWVsZHMgJiBNTkNDX0ZfQ0FVU0UpCisJCWdzbTQ4X2VuY29kZV9jYXVzZShtc2csIDEsICZkaXNjLT5jYXVzZSk7CisJZWxzZQorCQlnc200OF9lbmNvZGVfY2F1c2UobXNnLCAxLCAmZGVmYXVsdF9jYXVzZSk7CisKKwkvKiBmYWNpbGl0eSAqLworCWlmIChkaXNjLT5maWVsZHMgJiBNTkNDX0ZfRkFDSUxJVFkpCisJCWdzbTQ4X2VuY29kZV9mYWNpbGl0eShtc2csIDAsICZkaXNjLT5mYWNpbGl0eSk7CisJLyogcHJvZ3Jlc3MgKi8KKwlpZiAoZGlzYy0+ZmllbGRzICYgTU5DQ19GX1BST0dSRVNTKQorCQlnc200OF9lbmNvZGVfcHJvZ3Jlc3MobXNnLCAwLCAmZGlzYy0+cHJvZ3Jlc3MpOworCS8qIHVzZXItdXNlciAqLworCWlmIChkaXNjLT5maWVsZHMgJiBNTkNDX0ZfVVNFUlVTRVIpCisJCWdzbTQ4X2VuY29kZV91c2VydXNlcihtc2csIDAsICZkaXNjLT51c2VydXNlcik7CisKKwkvKiBzdG9yZSBkaXNjb25uZWN0IGNhdXNlIGZvciBUMzA2IGV4cGlyeSAqLworCW1lbWNweSgmdHJhbnMtPmNjLm1zZywgZGlzYywgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0RJU0NPTk5FQ1RfSU5EKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X3JlbGVhc2Uoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuID0gbXNnYl9sM2xlbihtc2cpIC0gc2l6ZW9mKCpnaCk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJc3RydWN0IGdzbV9tbmNjIHJlbDsKKwlpbnQgcmM7CisKKwlnc200OF9zdG9wX2NjX3RpbWVyKHRyYW5zKTsKKworCW1lbXNldCgmcmVsLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJcmVsLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwl0bHZfcGFyc2UoJnRwLCAmZ3NtNDhfYXR0X3RsdmRlZiwgZ2gtPmRhdGEsIHBheWxvYWRfbGVuLCAwLCAwKTsKKwkvKiBjYXVzZSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9DQVVTRSkpIHsKKwkJcmVsLmZpZWxkcyB8PSBNTkNDX0ZfQ0FVU0U7CisJCWdzbTQ4X2RlY29kZV9jYXVzZSgmcmVsLmNhdXNlLAorCQkJICAgICBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0NBVVNFKS0xKTsKKwl9CisJLyogZmFjaWxpdHkgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfRkFDSUxJVFkpKSB7CisJCXJlbC5maWVsZHMgfD0gTU5DQ19GX0ZBQ0lMSVRZOworCQlnc200OF9kZWNvZGVfZmFjaWxpdHkoJnJlbC5mYWNpbGl0eSwKKwkJCQlUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0ZBQ0lMSVRZKS0xKTsKKwl9CisJLyogdXNlci11c2VyICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1VTRVJfVVNFUikpIHsKKwkJcmVsLmZpZWxkcyB8PSBNTkNDX0ZfVVNFUlVTRVI7CisJCWdzbTQ4X2RlY29kZV91c2VydXNlcigmcmVsLnVzZXJ1c2VyLAorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfVVNFUl9VU0VSKS0xKTsKKwl9CisJLyogc3MtdmVyc2lvbiAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9TU19WRVJTKSkgeworCQlyZWwuZmllbGRzIHw9IE1OQ0NfRl9TU1ZFUlNJT047CisJCWdzbTQ4X2RlY29kZV9zc3ZlcnNpb24oJnJlbC5zc3ZlcnNpb24sCisJCQkJIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfU1NfVkVSUyktMSk7CisJfQorCisJaWYgKHRyYW5zLT5jYy5zdGF0ZSA9PSBHU01fQ1NUQVRFX1JFTEVBU0VfUkVRKSB7CisJCS8qIHJlbGVhc2UgY29sbGlzaW9uIDUuNC41ICovCisJCXJjID0gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfUkVMX0NORiwgJnJlbCk7CisJfSBlbHNlIHsKKwkJcmMgPSBnc200OF90eF9zaW1wbGUobXNnLT5sY2hhbiwKKwkJCQkgICAgIEdTTTQ4X1BESVNDX0NDIHwgKHRyYW5zLT50cmFuc2FjdGlvbl9pZCA8PCA0KSwKKwkJCQkgICAgIEdTTTQ4X01UX0NDX1JFTEVBU0VfQ09NUEwpOworCQlyYyA9IG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX1JFTF9JTkQsICZyZWwpOworCX0KKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9OVUxMKTsKKworCXRyYW5zLT5jYWxscmVmID0gMDsKKwl0cmFuc19mcmVlKHRyYW5zKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9yZWxlYXNlKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCit7CisJc3RydWN0IGdzbV9tbmNjICpyZWwgPSBhcmc7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfQ0NfUkVMRUFTRTsKKworCXRyYW5zLT5jYWxscmVmID0gMDsKKwkKKwlnc200OF9zdG9wX2NjX3RpbWVyKHRyYW5zKTsKKwlnc200OF9zdGFydF9jY190aW1lcih0cmFucywgMHgzMDgsIEdTTTQ4X1QzMDgpOworCisJLyogY2F1c2UgKi8KKwlpZiAocmVsLT5maWVsZHMgJiBNTkNDX0ZfQ0FVU0UpCisJCWdzbTQ4X2VuY29kZV9jYXVzZShtc2csIDAsICZyZWwtPmNhdXNlKTsKKwkvKiBmYWNpbGl0eSAqLworCWlmIChyZWwtPmZpZWxkcyAmIE1OQ0NfRl9GQUNJTElUWSkKKwkJZ3NtNDhfZW5jb2RlX2ZhY2lsaXR5KG1zZywgMCwgJnJlbC0+ZmFjaWxpdHkpOworCS8qIHVzZXItdXNlciAqLworCWlmIChyZWwtPmZpZWxkcyAmIE1OQ0NfRl9VU0VSVVNFUikKKwkJZ3NtNDhfZW5jb2RlX3VzZXJ1c2VyKG1zZywgMCwgJnJlbC0+dXNlcnVzZXIpOworCisJdHJhbnMtPmNjLlQzMDhfc2Vjb25kID0gMDsKKwltZW1jcHkoJnRyYW5zLT5jYy5tc2csIHJlbCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCisJaWYgKHRyYW5zLT5jYy5zdGF0ZSAhPSBHU01fQ1NUQVRFX1JFTEVBU0VfUkVRKQorCQluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfUkVMRUFTRV9SRVEpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfcmVsZWFzZV9jb21wbChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21uY2MgcmVsOworCWludCByYyA9IDA7CisKKwlnc200OF9zdG9wX2NjX3RpbWVyKHRyYW5zKTsKKworCW1lbXNldCgmcmVsLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJcmVsLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwl0bHZfcGFyc2UoJnRwLCAmZ3NtNDhfYXR0X3RsdmRlZiwgZ2gtPmRhdGEsIHBheWxvYWRfbGVuLCAwLCAwKTsKKwkvKiBjYXVzZSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9DQVVTRSkpIHsKKwkJcmVsLmZpZWxkcyB8PSBNTkNDX0ZfQ0FVU0U7CisJCWdzbTQ4X2RlY29kZV9jYXVzZSgmcmVsLmNhdXNlLAorCQkJICAgICBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0NBVVNFKS0xKTsKKwl9CisJLyogZmFjaWxpdHkgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfRkFDSUxJVFkpKSB7CisJCXJlbC5maWVsZHMgfD0gTU5DQ19GX0ZBQ0lMSVRZOworCQlnc200OF9kZWNvZGVfZmFjaWxpdHkoJnJlbC5mYWNpbGl0eSwKKwkJCQlUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0ZBQ0lMSVRZKS0xKTsKKwl9CisJLyogdXNlci11c2VyICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1VTRVJfVVNFUikpIHsKKwkJcmVsLmZpZWxkcyB8PSBNTkNDX0ZfVVNFUlVTRVI7CisJCWdzbTQ4X2RlY29kZV91c2VydXNlcigmcmVsLnVzZXJ1c2VyLAorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfVVNFUl9VU0VSKS0xKTsKKwl9CisJLyogc3MtdmVyc2lvbiAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9TU19WRVJTKSkgeworCQlyZWwuZmllbGRzIHw9IE1OQ0NfRl9TU1ZFUlNJT047CisJCWdzbTQ4X2RlY29kZV9zc3ZlcnNpb24oJnJlbC5zc3ZlcnNpb24sCisJCQkJIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfU1NfVkVSUyktMSk7CisJfQorCisJaWYgKHRyYW5zLT5jYWxscmVmKSB7CisJCXN3aXRjaCAodHJhbnMtPmNjLnN0YXRlKSB7CisJCWNhc2UgR1NNX0NTVEFURV9DQUxMX1BSRVNFTlQ6CisJCQlyYyA9IG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLAorCQkJCQkgIE1OQ0NfUkVKX0lORCwgJnJlbCk7CisJCQlicmVhazsKKwkJY2FzZSBHU01fQ1NUQVRFX1JFTEVBU0VfUkVROgorCQkJcmMgPSBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywKKwkJCQkJICBNTkNDX1JFTF9DTkYsICZyZWwpOworCQkJLyogRklYTUU6IGluIGNhc2Ugb2YgbXVsdGlwbGUgY2FsbHMsIHdlIGNhbid0IHNpbXBseQorCQkJICogaGFuZyB1cCBoZXJlICEgKi8KKwkJCWxjaGFuX2F1dG9fcmVsZWFzZShtc2ctPmxjaGFuKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmMgPSBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywKKwkJCQkJICBNTkNDX1JFTF9JTkQsICZyZWwpOworCQl9CisJfQorCisJdHJhbnMtPmNhbGxyZWYgPSAwOworCXRyYW5zX2ZyZWUodHJhbnMpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X3JlbGVhc2VfY29tcGwoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKnJlbCA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19SRUxFQVNFX0NPTVBMOworCisJdHJhbnMtPmNhbGxyZWYgPSAwOworCQorCWdzbTQ4X3N0b3BfY2NfdGltZXIodHJhbnMpOworCisJLyogY2F1c2UgKi8KKwlpZiAocmVsLT5maWVsZHMgJiBNTkNDX0ZfQ0FVU0UpCisJCWdzbTQ4X2VuY29kZV9jYXVzZShtc2csIDAsICZyZWwtPmNhdXNlKTsKKwkvKiBmYWNpbGl0eSAqLworCWlmIChyZWwtPmZpZWxkcyAmIE1OQ0NfRl9GQUNJTElUWSkKKwkJZ3NtNDhfZW5jb2RlX2ZhY2lsaXR5KG1zZywgMCwgJnJlbC0+ZmFjaWxpdHkpOworCS8qIHVzZXItdXNlciAqLworCWlmIChyZWwtPmZpZWxkcyAmIE1OQ0NfRl9VU0VSVVNFUikKKwkJZ3NtNDhfZW5jb2RlX3VzZXJ1c2VyKG1zZywgMCwgJnJlbC0+dXNlcnVzZXIpOworCisJdHJhbnNfZnJlZSh0cmFucyk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9mYWNpbGl0eShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21uY2MgZmFjOworCisJbWVtc2V0KCZmYWMsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlmYWMuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCXRsdl9wYXJzZSgmdHAsICZnc200OF9hdHRfdGx2ZGVmLCBnaC0+ZGF0YSwgcGF5bG9hZF9sZW4sIEdTTTQ4X0lFX0ZBQ0lMSVRZLCAwKTsKKwkvKiBmYWNpbGl0eSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9GQUNJTElUWSkpIHsKKwkJZmFjLmZpZWxkcyB8PSBNTkNDX0ZfRkFDSUxJVFk7CisJCWdzbTQ4X2RlY29kZV9mYWNpbGl0eSgmZmFjLmZhY2lsaXR5LAorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfRkFDSUxJVFkpLTEpOworCX0KKwkvKiBzcy12ZXJzaW9uICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpKSB7CisJCWZhYy5maWVsZHMgfD0gTU5DQ19GX1NTVkVSU0lPTjsKKwkJZ3NtNDhfZGVjb2RlX3NzdmVyc2lvbigmZmFjLnNzdmVyc2lvbiwKKwkJCQkgVExWUF9WQUwoJnRwLCBHU000OF9JRV9TU19WRVJTKS0xKTsKKwl9CisKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfRkFDSUxJVFlfSU5ELCAmZmFjKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9mYWNpbGl0eShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqZmFjID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX0ZBQ0lMSVRZOworCisJLyogZmFjaWxpdHkgKi8KKwlnc200OF9lbmNvZGVfZmFjaWxpdHkobXNnLCAxLCAmZmFjLT5mYWNpbGl0eSk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9ob2xkKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc21fbW5jYyBob2xkOworCisJbWVtc2V0KCZob2xkLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJaG9sZC5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJcmV0dXJuIG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX0hPTERfSU5ELCAmaG9sZCk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfaG9sZF9hY2soc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19IT0xEX0FDSzsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X2hvbGRfcmVqKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCit7CisJc3RydWN0IGdzbV9tbmNjICpob2xkX3JlaiA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19IT0xEX1JFSjsKKworCS8qIGNhdXNlICovCisJaWYgKGhvbGRfcmVqLT5maWVsZHMgJiBNTkNDX0ZfQ0FVU0UpCisJCWdzbTQ4X2VuY29kZV9jYXVzZShtc2csIDEsICZob2xkX3Jlai0+Y2F1c2UpOworCWVsc2UKKwkJZ3NtNDhfZW5jb2RlX2NhdXNlKG1zZywgMSwgJmRlZmF1bHRfY2F1c2UpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfcmV0cmlldmUoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9tbmNjIHJldHJpZXZlOworCisJbWVtc2V0KCZyZXRyaWV2ZSwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCXJldHJpZXZlLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfUkVUUklFVkVfSU5ELAorCQkJICAgICZyZXRyaWV2ZSk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfcmV0cmlldmVfYWNrKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfQ0NfUkVUUl9BQ0s7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9yZXRyaWV2ZV9yZWooc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKnJldHJpZXZlX3JlaiA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19SRVRSX1JFSjsKKworCS8qIGNhdXNlICovCisJaWYgKHJldHJpZXZlX3Jlai0+ZmllbGRzICYgTU5DQ19GX0NBVVNFKQorCQlnc200OF9lbmNvZGVfY2F1c2UobXNnLCAxLCAmcmV0cmlldmVfcmVqLT5jYXVzZSk7CisJZWxzZQorCQlnc200OF9lbmNvZGVfY2F1c2UobXNnLCAxLCAmZGVmYXVsdF9jYXVzZSk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9zdGFydF9kdG1mKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyBkdG1mOworCisJbWVtc2V0KCZkdG1mLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJZHRtZi5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbiwgMCwgMCk7CisJLyoga2V5cGFkIGZhY2lsaXR5ICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0tQRF9GQUNJTElUWSkpIHsKKwkJZHRtZi5maWVsZHMgfD0gTU5DQ19GX0tFWVBBRDsKKwkJZ3NtNDhfZGVjb2RlX2tleXBhZCgmZHRtZi5rZXlwYWQsCisJCQkgICAgICBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0tQRF9GQUNJTElUWSktMSk7CisJfQorCisJcmV0dXJuIG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX1NUQVJUX0RUTUZfSU5ELCAmZHRtZik7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfc3RhcnRfZHRtZl9hY2soc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKmR0bWYgPSBhcmc7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfQ0NfU1RBUlRfRFRNRl9BQ0s7CisKKwkvKiBrZXlwYWQgKi8KKwlpZiAoZHRtZi0+ZmllbGRzICYgTU5DQ19GX0tFWVBBRCkKKwkJZ3NtNDhfZW5jb2RlX2tleXBhZChtc2csIGR0bWYtPmtleXBhZCk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9zdGFydF9kdG1mX3JlaihzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqZHRtZiA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19TVEFSVF9EVE1GX1JFSjsKKworCS8qIGNhdXNlICovCisJaWYgKGR0bWYtPmZpZWxkcyAmIE1OQ0NfRl9DQVVTRSkKKwkJZ3NtNDhfZW5jb2RlX2NhdXNlKG1zZywgMSwgJmR0bWYtPmNhdXNlKTsKKwllbHNlCisJCWdzbTQ4X2VuY29kZV9jYXVzZShtc2csIDEsICZkZWZhdWx0X2NhdXNlKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X3N0b3BfZHRtZl9hY2soc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19TVE9QX0RUTUZfQUNLOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2Nfcnhfc3RvcF9kdG1mKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc21fbW5jYyBkdG1mOworCisJbWVtc2V0KCZkdG1mLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJZHRtZi5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfU1RPUF9EVE1GX0lORCwgJmR0bWYpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X21vZGlmeShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21uY2MgbW9kaWZ5OworCisJbWVtc2V0KCZtb2RpZnksIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwltb2RpZnkuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCXRsdl9wYXJzZSgmdHAsICZnc200OF9hdHRfdGx2ZGVmLCBnaC0+ZGF0YSwgcGF5bG9hZF9sZW4sIEdTTTQ4X0lFX0JFQVJFUl9DQVAsIDApOworCS8qIGJlYXJlciBjYXBhYmlsaXR5ICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0JFQVJFUl9DQVApKSB7CisJCW1vZGlmeS5maWVsZHMgfD0gTU5DQ19GX0JFQVJFUl9DQVA7CisJCWdzbTQ4X2RlY29kZV9iZWFyZXJfY2FwKCZtb2RpZnkuYmVhcmVyX2NhcCwKKwkJCQkgIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfQkVBUkVSX0NBUCktMSk7CisJfQorCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX01PX09SSUdfTU9ESUZZKTsKKworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19NT0RJRllfSU5ELCAmbW9kaWZ5KTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9tb2RpZnkoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKm1vZGlmeSA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19NT0RJRlk7CisKKwlnc200OF9zdGFydF9jY190aW1lcih0cmFucywgMHgzMjMsIEdTTTQ4X1QzMjMpOworCisJLyogYmVhcmVyIGNhcGFiaWxpdHkgKi8KKwlnc200OF9lbmNvZGVfYmVhcmVyX2NhcChtc2csIDEsICZtb2RpZnktPmJlYXJlcl9jYXApOworCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX01PX1RFUk1fTU9ESUZZKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X21vZGlmeV9jb21wbGV0ZShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21uY2MgbW9kaWZ5OworCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisKKwltZW1zZXQoJm1vZGlmeSwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCW1vZGlmeS5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbiwgR1NNNDhfSUVfQkVBUkVSX0NBUCwgMCk7CisJLyogYmVhcmVyIGNhcGFiaWxpdHkgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfQkVBUkVSX0NBUCkpIHsKKwkJbW9kaWZ5LmZpZWxkcyB8PSBNTkNDX0ZfQkVBUkVSX0NBUDsKKwkJZ3NtNDhfZGVjb2RlX2JlYXJlcl9jYXAoJm1vZGlmeS5iZWFyZXJfY2FwLAorCQkJCSAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9CRUFSRVJfQ0FQKS0xKTsKKwl9CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfQUNUSVZFKTsKKworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19NT0RJRllfQ05GLCAmbW9kaWZ5KTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9tb2RpZnlfY29tcGxldGUoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKm1vZGlmeSA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19NT0RJRllfQ09NUEw7CisKKwkvKiBiZWFyZXIgY2FwYWJpbGl0eSAqLworCWdzbTQ4X2VuY29kZV9iZWFyZXJfY2FwKG1zZywgMSwgJm1vZGlmeS0+YmVhcmVyX2NhcCk7CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfQUNUSVZFKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X21vZGlmeV9yZWplY3Qoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuID0gbXNnYl9sM2xlbihtc2cpIC0gc2l6ZW9mKCpnaCk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJc3RydWN0IGdzbV9tbmNjIG1vZGlmeTsKKworCWdzbTQ4X3N0b3BfY2NfdGltZXIodHJhbnMpOworCisJbWVtc2V0KCZtb2RpZnksIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwltb2RpZnkuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCXRsdl9wYXJzZSgmdHAsICZnc200OF9hdHRfdGx2ZGVmLCBnaC0+ZGF0YSwgcGF5bG9hZF9sZW4sIEdTTTQ4X0lFX0JFQVJFUl9DQVAsIEdTTTQ4X0lFX0NBVVNFKTsKKwkvKiBiZWFyZXIgY2FwYWJpbGl0eSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9CRUFSRVJfQ0FQKSkgeworCQltb2RpZnkuZmllbGRzIHw9IEdTTTQ4X0lFX0JFQVJFUl9DQVA7CisJCWdzbTQ4X2RlY29kZV9iZWFyZXJfY2FwKCZtb2RpZnkuYmVhcmVyX2NhcCwKKwkJCQkgIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfQkVBUkVSX0NBUCktMSk7CisJfQorCS8qIGNhdXNlICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0NBVVNFKSkgeworCQltb2RpZnkuZmllbGRzIHw9IE1OQ0NfRl9DQVVTRTsKKwkJZ3NtNDhfZGVjb2RlX2NhdXNlKCZtb2RpZnkuY2F1c2UsCisJCQkgICAgIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfQ0FVU0UpLTEpOworCX0KKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9BQ1RJVkUpOworCisJcmV0dXJuIG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX01PRElGWV9SRUosICZtb2RpZnkpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X21vZGlmeV9yZWplY3Qoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKm1vZGlmeSA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19NT0RJRllfUkVKRUNUOworCisJLyogYmVhcmVyIGNhcGFiaWxpdHkgKi8KKwlnc200OF9lbmNvZGVfYmVhcmVyX2NhcChtc2csIDEsICZtb2RpZnktPmJlYXJlcl9jYXApOworCS8qIGNhdXNlICovCisJZ3NtNDhfZW5jb2RlX2NhdXNlKG1zZywgMSwgJm1vZGlmeS0+Y2F1c2UpOworCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0FDVElWRSk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9ub3RpZnkoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKm5vdGlmeSA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19OT1RJRlk7CisKKwkvKiBub3RpZnkgKi8KKwlnc200OF9lbmNvZGVfbm90aWZ5KG1zZywgbm90aWZ5LT5ub3RpZnkpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2Nfcnhfbm90aWZ5KHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworLy8Jc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJc3RydWN0IGdzbV9tbmNjIG5vdGlmeTsKKworCW1lbXNldCgmbm90aWZ5LCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJbm90aWZ5LmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKy8vCXRsdl9wYXJzZSgmdHAsICZnc200OF9hdHRfdGx2ZGVmLCBnaC0+ZGF0YSwgcGF5bG9hZF9sZW4pOworCWlmIChwYXlsb2FkX2xlbiA+PSAxKQorCQlnc200OF9kZWNvZGVfbm90aWZ5KCZub3RpZnkubm90aWZ5LCBnaC0+ZGF0YSk7CisKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfTk9USUZZX0lORCwgJm5vdGlmeSk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfdXNlcmluZm8oc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKnVzZXIgPSBhcmc7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfQ0NfVVNFUl9JTkZPOworCisJLyogdXNlci11c2VyICovCisJaWYgKHVzZXItPmZpZWxkcyAmIE1OQ0NfRl9VU0VSVVNFUikKKwkJZ3NtNDhfZW5jb2RlX3VzZXJ1c2VyKG1zZywgMSwgJnVzZXItPnVzZXJ1c2VyKTsKKwkvKiBtb3JlIGRhdGEgKi8KKwlpZiAodXNlci0+bW9yZSkKKwkJZ3NtNDhfZW5jb2RlX21vcmUobXNnKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X3VzZXJpbmZvKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyB1c2VyOworCisJbWVtc2V0KCZ1c2VyLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJdXNlci5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbiwgR1NNNDhfSUVfVVNFUl9VU0VSLCAwKTsKKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfVVNFUl9VU0VSKSkgeworCQl1c2VyLmZpZWxkcyB8PSBNTkNDX0ZfVVNFUlVTRVI7CisJCWdzbTQ4X2RlY29kZV91c2VydXNlcigmdXNlci51c2VydXNlciwKKwkJCQlUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX1VTRVJfVVNFUiktMSk7CisJfQorCS8qIG1vcmUgZGF0YSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9NT1JFX0RBVEEpKQorCQl1c2VyLm1vcmUgPSAxOworCisJcmV0dXJuIG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX1VTRVJJTkZPX0lORCwgJnVzZXIpOworfQorCitzdGF0aWMgaW50IF9nc200OF9sY2hhbl9tb2RpZnkoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKm1vZGUgPSBhcmc7CisKKwlyZXR1cm4gZ3NtNDhfbGNoYW5fbW9kaWZ5KHRyYW5zLT5jb25uLT5sY2hhbiwgbW9kZS0+bGNoYW5fbW9kZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG93bnN0YXRlIHsKKwl1X2ludDMyX3QJc3RhdGVzOworCWludAkJdHlwZTsKKwlpbnQJCSgqcm91dCkgKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpOworfSBkb3duc3RhdGVsaXN0W10gPSB7CisJLyogbW9iaWxlIG9yaWdpbmF0aW5nIGNhbGwgZXN0YWJsaXNobWVudCAqLworCXtTQklUKEdTTV9DU1RBVEVfSU5JVElBVEVEKSwgLyogNS4yLjEuMiAqLworCSBNTkNDX0NBTExfUFJPQ19SRVEsIGdzbTQ4X2NjX3R4X2NhbGxfcHJvY30sCisJe1NCSVQoR1NNX0NTVEFURV9JTklUSUFURUQpIHwgU0JJVChHU01fQ1NUQVRFX01PX0NBTExfUFJPQyksIC8qIDUuMi4xLjIgfCA1LjIuMS41ICovCisJIE1OQ0NfQUxFUlRfUkVRLCBnc200OF9jY190eF9hbGVydGluZ30sCisJe1NCSVQoR1NNX0NTVEFURV9JTklUSUFURUQpIHwgU0JJVChHU01fQ1NUQVRFX01PX0NBTExfUFJPQykgfCBTQklUKEdTTV9DU1RBVEVfQ0FMTF9ERUxJVkVSRUQpLCAvKiA1LjIuMS4yIHwgNS4yLjEuNiB8IDUuMi4xLjYgKi8KKwkgTU5DQ19TRVRVUF9SU1AsIGdzbTQ4X2NjX3R4X2Nvbm5lY3R9LAorCXtTQklUKEdTTV9DU1RBVEVfTU9fQ0FMTF9QUk9DKSwgLyogNS4yLjEuNC4yICovCisJIE1OQ0NfUFJPR1JFU1NfUkVRLCBnc200OF9jY190eF9wcm9ncmVzc30sCisJLyogbW9iaWxlIHRlcm1pbmF0aW5nIGNhbGwgZXN0YWJsaXNobWVudCAqLworCXtTQklUKEdTTV9DU1RBVEVfTlVMTCksIC8qIDUuMi4yLjEgKi8KKwkgTU5DQ19TRVRVUF9SRVEsIGdzbTQ4X2NjX3R4X3NldHVwfSwKKwl7U0JJVChHU01fQ1NUQVRFX0NPTk5FQ1RfUkVRVUVTVCksCisJIE1OQ0NfU0VUVVBfQ09NUExfUkVRLCBnc200OF9jY190eF9jb25uZWN0X2Fja30sCisJIC8qIHNpZ25hbGxpbmcgZHVyaW5nIGNhbGwgKi8KKwl7U0JJVChHU01fQ1NUQVRFX0FDVElWRSksCisJIE1OQ0NfTk9USUZZX1JFUSwgZ3NtNDhfY2NfdHhfbm90aWZ5fSwKKwl7QUxMX1NUQVRFUyAtIFNCSVQoR1NNX0NTVEFURV9OVUxMKSAtIFNCSVQoR1NNX0NTVEFURV9SRUxFQVNFX1JFUSksCisJIE1OQ0NfRkFDSUxJVFlfUkVRLCBnc200OF9jY190eF9mYWNpbGl0eX0sCisJe0FMTF9TVEFURVMsCisJIE1OQ0NfU1RBUlRfRFRNRl9SU1AsIGdzbTQ4X2NjX3R4X3N0YXJ0X2R0bWZfYWNrfSwKKwl7QUxMX1NUQVRFUywKKwkgTU5DQ19TVEFSVF9EVE1GX1JFSiwgZ3NtNDhfY2NfdHhfc3RhcnRfZHRtZl9yZWp9LAorCXtBTExfU1RBVEVTLAorCSBNTkNDX1NUT1BfRFRNRl9SU1AsIGdzbTQ4X2NjX3R4X3N0b3BfZHRtZl9hY2t9LAorCXtTQklUKEdTTV9DU1RBVEVfQUNUSVZFKSwKKwkgTU5DQ19IT0xEX0NORiwgZ3NtNDhfY2NfdHhfaG9sZF9hY2t9LAorCXtTQklUKEdTTV9DU1RBVEVfQUNUSVZFKSwKKwkgTU5DQ19IT0xEX1JFSiwgZ3NtNDhfY2NfdHhfaG9sZF9yZWp9LAorCXtTQklUKEdTTV9DU1RBVEVfQUNUSVZFKSwKKwkgTU5DQ19SRVRSSUVWRV9DTkYsIGdzbTQ4X2NjX3R4X3JldHJpZXZlX2Fja30sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBNTkNDX1JFVFJJRVZFX1JFSiwgZ3NtNDhfY2NfdHhfcmV0cmlldmVfcmVqfSwKKwl7U0JJVChHU01fQ1NUQVRFX0FDVElWRSksCisJIE1OQ0NfTU9ESUZZX1JFUSwgZ3NtNDhfY2NfdHhfbW9kaWZ5fSwKKwl7U0JJVChHU01fQ1NUQVRFX01PX09SSUdfTU9ESUZZKSwKKwkgTU5DQ19NT0RJRllfUlNQLCBnc200OF9jY190eF9tb2RpZnlfY29tcGxldGV9LAorCXtTQklUKEdTTV9DU1RBVEVfTU9fT1JJR19NT0RJRlkpLAorCSBNTkNDX01PRElGWV9SRUosIGdzbTQ4X2NjX3R4X21vZGlmeV9yZWplY3R9LAorCXtTQklUKEdTTV9DU1RBVEVfQUNUSVZFKSwKKwkgTU5DQ19VU0VSSU5GT19SRVEsIGdzbTQ4X2NjX3R4X3VzZXJpbmZvfSwKKwkvKiBjbGVhcmluZyAqLworCXtTQklUKEdTTV9DU1RBVEVfSU5JVElBVEVEKSwKKwkgTU5DQ19SRUpfUkVRLCBnc200OF9jY190eF9yZWxlYXNlX2NvbXBsfSwKKwl7QUxMX1NUQVRFUyAtIFNCSVQoR1NNX0NTVEFURV9OVUxMKSAtIFNCSVQoR1NNX0NTVEFURV9ESVNDT05ORUNUX0lORCkgLSBTQklUKEdTTV9DU1RBVEVfUkVMRUFTRV9SRVEpIC0gU0JJVChHU01fQ1NUQVRFX0RJU0NPTk5FQ1RfUkVRKSwgLyogNS40LjQgKi8KKwkgTU5DQ19ESVNDX1JFUSwgZ3NtNDhfY2NfdHhfZGlzY29ubmVjdH0sCisJe0FMTF9TVEFURVMgLSBTQklUKEdTTV9DU1RBVEVfTlVMTCkgLSBTQklUKEdTTV9DU1RBVEVfUkVMRUFTRV9SRVEpLCAvKiA1LjQuMy4yICovCisJIE1OQ0NfUkVMX1JFUSwgZ3NtNDhfY2NfdHhfcmVsZWFzZX0sCisJLyogc3BlY2lhbCAqLworCXtBTExfU1RBVEVTLAorCSBNTkNDX0xDSEFOX01PRElGWSwgX2dzbTQ4X2xjaGFuX21vZGlmeX0sCit9OworCisjZGVmaW5lIERPV05TTExFTiBcCisJKHNpemVvZihkb3duc3RhdGVsaXN0KSAvIHNpemVvZihzdHJ1Y3QgZG93bnN0YXRlKSkKKworCitpbnQgbW5jY19zZW5kKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBpbnQgbXNnX3R5cGUsIHZvaWQgKmFyZykKK3sKKwlpbnQgaSwgcmMgPSAwOworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zID0gTlVMTCwgKnRyYW5zdDsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IE5VTEw7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IE5VTEw7CisJc3RydWN0IGdzbV9tbmNjICpkYXRhID0gYXJnLCByZWw7CisKKwkvKiBoYW5kbGUgc3BlY2lhbCBtZXNzYWdlcyAqLworCXN3aXRjaChtc2dfdHlwZSkgeworCWNhc2UgTU5DQ19CUklER0U6CisJCXJldHVybiB0Y2hfYnJpZGdlKG5ldCwgYXJnKTsKKwljYXNlIE1OQ0NfRlJBTUVfRFJPUDoKKwkJcmV0dXJuIHRjaF9yZWN2X21uY2MobmV0LCBkYXRhLT5jYWxscmVmLCAwKTsKKwljYXNlIE1OQ0NfRlJBTUVfUkVDVjoKKwkJcmV0dXJuIHRjaF9yZWN2X21uY2MobmV0LCBkYXRhLT5jYWxscmVmLCAxKTsKKwljYXNlIEdTTV9UQ0hGX0ZSQU1FOgorCQkvKiBGaW5kIGNhbGxyZWYgKi8KKwkJdHJhbnMgPSB0cmFuc19maW5kX2J5X2NhbGxyZWYobmV0LCBkYXRhLT5jYWxscmVmKTsKKwkJaWYgKCF0cmFucykKKwkJCXJldHVybiAtRUlPOworCQlpZiAoIXRyYW5zLT5jb25uKQorCQkJcmV0dXJuIDA7CisJCWlmICh0cmFucy0+Y29ubi0+bGNoYW4tPnR5cGUgIT0gR1NNX0xDSEFOX1RDSF9GKQorCQkJcmV0dXJuIDA7CisJCWJ0cyA9IHRyYW5zLT5jb25uLT5sY2hhbi0+dHMtPnRyeC0+YnRzOworCQlzd2l0Y2ggKGJ0cy0+dHlwZSkgeworCQljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOgorCQkJaWYgKCF0cmFucy0+Y29ubi0+bGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCkKKwkJCQlyZXR1cm4gMDsKKwkJCXJldHVybiBydHBfc2VuZF9mcmFtZSh0cmFucy0+Y29ubi0+bGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCwgYXJnKTsKKwkJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJCXJldHVybiB0cmF1X3NlbmRfZnJhbWUodHJhbnMtPmNvbm4tPmxjaGFuLCBhcmcpOworCQlkZWZhdWx0OgorCQkJREVCVUdQKERDQywgIlVua25vd24gQlRTIHR5cGUgJXVcbiIsIGJ0cy0+dHlwZSk7CisJCX0KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWVtc2V0KCZyZWwsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlyZWwuY2FsbHJlZiA9IGRhdGEtPmNhbGxyZWY7CisKKwkvKiBGaW5kIGNhbGxyZWYgKi8KKwl0cmFucyA9IHRyYW5zX2ZpbmRfYnlfY2FsbHJlZihuZXQsIGRhdGEtPmNhbGxyZWYpOworCisJLyogQ2FsbHJlZiB1bmtub3duICovCisJaWYgKCF0cmFucykgeworCQlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCQlpZiAobXNnX3R5cGUgIT0gTU5DQ19TRVRVUF9SRVEpIHsKKwkJCURFQlVHUChEQ0MsICIoYnRzIC0gdHJ4IC0gdHMgLSB0aSAtLSBzdWIgJXMpICIKKwkJCQkiUmVjZWl2ZWQgJyVzJyBmcm9tIE1OQ0Mgd2l0aCAiCisJCQkJInVua25vd24gY2FsbHJlZiAlZFxuIiwgZGF0YS0+Y2FsbGVkLm51bWJlciwKKwkJCQlnZXRfbW5jY19uYW1lKG1zZ190eXBlKSwgZGF0YS0+Y2FsbHJlZik7CisJCQkvKiBJbnZhbGlkIGNhbGwgcmVmZXJlbmNlICovCisJCQlyZXR1cm4gbW5jY19yZWxlYXNlX2luZChuZXQsIE5VTEwsIGRhdGEtPmNhbGxyZWYsCisJCQkJCQlHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJCQlHU000OF9DQ19DQVVTRV9JTlZBTF9UUkFOU19JRCk7CisJCX0KKwkJaWYgKCFkYXRhLT5jYWxsZWQubnVtYmVyWzBdICYmICFkYXRhLT5pbXNpWzBdKSB7CisJCQlERUJVR1AoRENDLCAiKGJ0cyAtIHRyeCAtIHRzIC0gdGkpICIKKwkJCQkiUmVjZWl2ZWQgJyVzJyBmcm9tIE1OQ0Mgd2l0aCAiCisJCQkJIm5vIG51bWJlciBvciBJTVNJXG4iLCBnZXRfbW5jY19uYW1lKG1zZ190eXBlKSk7CisJCQkvKiBJbnZhbGlkIG51bWJlciAqLworCQkJcmV0dXJuIG1uY2NfcmVsZWFzZV9pbmQobmV0LCBOVUxMLCBkYXRhLT5jYWxscmVmLAorCQkJCQkJR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLAorCQkJCQkJR1NNNDhfQ0NfQ0FVU0VfSU5WX05SX0ZPUk1BVCk7CisJCX0KKwkJLyogTmV3IHRyYW5zYWN0aW9uIGR1ZSB0byBzZXR1cCwgZmluZCBzdWJzY3JpYmVyICovCisJCWlmIChkYXRhLT5jYWxsZWQubnVtYmVyWzBdKQorCQkJc3Vic2NyID0gc3Vic2NyX2dldF9ieV9leHRlbnNpb24obmV0LAorCQkJCQkJCWRhdGEtPmNhbGxlZC5udW1iZXIpOworCQllbHNlCisJCQlzdWJzY3IgPSBzdWJzY3JfZ2V0X2J5X2ltc2kobmV0LCBkYXRhLT5pbXNpKTsKKwkJLyogSWYgc3Vic2NyaWJlciBpcyBub3QgZm91bmQgKi8KKwkJaWYgKCFzdWJzY3IpIHsKKwkJCURFQlVHUChEQ0MsICIoYnRzIC0gdHJ4IC0gdHMgLSB0aSAtLSBzdWIgJXMpICIKKwkJCQkiUmVjZWl2ZWQgJyVzJyBmcm9tIE1OQ0Mgd2l0aCAiCisJCQkJInVua25vd24gc3Vic2NyaWJlciAlc1xuIiwgZGF0YS0+Y2FsbGVkLm51bWJlciwKKwkJCQlnZXRfbW5jY19uYW1lKG1zZ190eXBlKSwgZGF0YS0+Y2FsbGVkLm51bWJlcik7CisJCQkvKiBVbmtub3duIHN1YnNjcmliZXIgKi8KKwkJCXJldHVybiBtbmNjX3JlbGVhc2VfaW5kKG5ldCwgTlVMTCwgZGF0YS0+Y2FsbHJlZiwKKwkJCQkJCUdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQkJCUdTTTQ4X0NDX0NBVVNFX1VOQVNTSUdORURfTlIpOworCQl9CisJCS8qIElmIHN1YnNjcmliZXIgaXMgbm90ICJhdHRhY2hlZCIgKi8KKwkJaWYgKCFzdWJzY3ItPmxhYykgeworCQkJREVCVUdQKERDQywgIihidHMgLSB0cnggLSB0cyAtIHRpIC0tIHN1YiAlcykgIgorCQkJCSJSZWNlaXZlZCAnJXMnIGZyb20gTU5DQyB3aXRoICIKKwkJCQkiZGV0YWNoZWQgc3Vic2NyaWJlciAlc1xuIiwgZGF0YS0+Y2FsbGVkLm51bWJlciwKKwkJCQlnZXRfbW5jY19uYW1lKG1zZ190eXBlKSwgZGF0YS0+Y2FsbGVkLm51bWJlcik7CisJCQlzdWJzY3JfcHV0KHN1YnNjcik7CisJCQkvKiBUZW1wb3JhcmlseSBvdXQgb2Ygb3JkZXIgKi8KKwkJCXJldHVybiBtbmNjX3JlbGVhc2VfaW5kKG5ldCwgTlVMTCwgZGF0YS0+Y2FsbHJlZiwKKwkJCQkJCUdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQkJCUdTTTQ4X0NDX0NBVVNFX0RFU1RfT09PKTsKKwkJfQorCQkvKiBDcmVhdGUgdHJhbnNhY3Rpb24gKi8KKwkJdHJhbnMgPSB0cmFuc19hbGxvYyhzdWJzY3IsIEdTTTQ4X1BESVNDX0NDLCAweGZmLCBkYXRhLT5jYWxscmVmKTsKKwkJaWYgKCF0cmFucykgeworCQkJREVCVUdQKERDQywgIk5vIG1lbW9yeSBmb3IgdHJhbnMuXG4iKTsKKwkJCXN1YnNjcl9wdXQoc3Vic2NyKTsKKwkJCS8qIFJlc3NvdXJjZSB1bmF2YWlsYWJsZSAqLworCQkJbW5jY19yZWxlYXNlX2luZChuZXQsIE5VTEwsIGRhdGEtPmNhbGxyZWYsCisJCQkJCSBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJCSBHU000OF9DQ19DQVVTRV9SRVNPVVJDRV9VTkFWQUlMKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCS8qIEZpbmQgbGNoYW4gKi8KKwkJbGNoYW4gPSBsY2hhbl9mb3Jfc3Vic2NyKHN1YnNjcik7CisKKwkJLyogSWYgc3Vic2NyaWJlciBoYXMgbm8gbGNoYW4gKi8KKwkJaWYgKCFsY2hhbikgeworCQkJLyogZmluZCB0cmFuc2FjdGlvbiB3aXRoIHRoaXMgc3Vic2NyaWJlciBhbHJlYWR5IHBhZ2luZyAqLworCQkJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJhbnN0LCAmbmV0LT50cmFuc19saXN0LCBlbnRyeSkgeworCQkJCS8qIFRyYW5zYWN0aW9uIG9mIG91ciBsY2hhbj8gKi8KKwkJCQlpZiAodHJhbnN0ID09IHRyYW5zIHx8CisJCQkJICAgIHRyYW5zdC0+c3Vic2NyICE9IHN1YnNjcikKKwkJCQkJY29udGludWU7CisJCQkJREVCVUdQKERDQywgIihidHMgJWQgdHJ4IC0gdHMgLSB0aSAtLSBzdWIgJXMpICIKKwkJCQkJIlJlY2VpdmVkICclcycgZnJvbSBNTkNDIHdpdGggIgorCQkJCQkidW5hbGxvY2F0ZWQgY2hhbm5lbCwgcGFnaW5nIGFscmVhZHkgIgorCQkJCQkic3RhcnRlZC5cbiIsIGJ0cy0+bnIsCisJCQkJCWRhdGEtPmNhbGxlZC5udW1iZXIsCisJCQkJCWdldF9tbmNjX25hbWUobXNnX3R5cGUpKTsKKwkJCQlzdWJzY3JfcHV0KHN1YnNjcik7CisJCQkJdHJhbnNfZnJlZSh0cmFucyk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQkvKiBzdG9yZSBzZXR1cCBpbmZvcm1hdGlvbnMgdW50aWwgcGFnaW5nIHdhcyBzdWNjZXNzZnVsbCAqLworCQkJbWVtY3B5KCZ0cmFucy0+Y2MubXNnLCBkYXRhLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJCQkvKiBUcmlnZ2VyIHBhZ2luZyAqLworCQkJcGFnaW5nX3JlcXVlc3QobmV0LCBzdWJzY3IsIFJTTF9DSEFOTkVFRF9UQ0hfRiwKKwkJCQkJc2V0dXBfdHJpZ19wYWdfZXZ0LCBzdWJzY3IpOworCQkJc3Vic2NyX3B1dChzdWJzY3IpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJLyogQXNzaWduIGxjaGFuICovCisJCXRyYW5zLT5jb25uID0gJmxjaGFuLT5jb25uOworCQl1c2Vfc3Vic2NyX2Nvbih0cmFucy0+Y29ubik7CisJCXN1YnNjcl9wdXQoc3Vic2NyKTsKKwl9CisKKwlpZiAodHJhbnMtPmNvbm4pCisJCWxjaGFuID0gdHJhbnMtPmNvbm4tPmxjaGFuOworCisJLyogaWYgcGFnaW5nIGRpZCBub3QgcmVzcG9uZCB5ZXQgKi8KKwlpZiAoIWxjaGFuKSB7CisJCURFQlVHUChEQ0MsICIoYnRzIC0gdHJ4IC0gdHMgLSB0aSAtLSBzdWIgJXMpICIKKwkJCSJSZWNlaXZlZCAnJXMnIGZyb20gTU5DQyBpbiBwYWdpbmcgc3RhdGVcbiIsCisJCQkodHJhbnMtPnN1YnNjcik/KHRyYW5zLT5zdWJzY3ItPmV4dGVuc2lvbik6Ii0iLAorCQkJZ2V0X21uY2NfbmFtZShtc2dfdHlwZSkpOworCQltbmNjX3NldF9jYXVzZSgmcmVsLCBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJR1NNNDhfQ0NfQ0FVU0VfTk9STV9DQUxMX0NMRUFSKTsKKwkJaWYgKG1zZ190eXBlID09IE1OQ0NfUkVMX1JFUSkKKwkJCXJjID0gbW5jY19yZWN2bXNnKG5ldCwgdHJhbnMsIE1OQ0NfUkVMX0NORiwgJnJlbCk7CisJCWVsc2UKKwkJCXJjID0gbW5jY19yZWN2bXNnKG5ldCwgdHJhbnMsIE1OQ0NfUkVMX0lORCwgJnJlbCk7CisJCXRyYW5zLT5jYWxscmVmID0gMDsKKwkJdHJhbnNfZnJlZSh0cmFucyk7CisJCXJldHVybiByYzsKKwl9CisKKwlERUJVR1AoRENDLCAiKGJ0cyAlZCB0cnggJWQgdHMgJWQgdGkgJTAyeCBzdWIgJXMpICIKKwkJIlJlY2VpdmVkICclcycgZnJvbSBNTkNDIGluIHN0YXRlICVkICglcylcbiIsCisJCWxjaGFuLT50cy0+dHJ4LT5idHMtPm5yLCBsY2hhbi0+dHMtPnRyeC0+bnIsIGxjaGFuLT50cy0+bnIsCisJCXRyYW5zLT50cmFuc2FjdGlvbl9pZCwKKwkJKHRyYW5zLT5jb25uLT5zdWJzY3IpPyh0cmFucy0+Y29ubi0+c3Vic2NyLT5leHRlbnNpb24pOiItIiwKKwkJZ2V0X21uY2NfbmFtZShtc2dfdHlwZSksIHRyYW5zLT5jYy5zdGF0ZSwKKwkJZ3NtNDhfY2Nfc3RhdGVfbmFtZSh0cmFucy0+Y2Muc3RhdGUpKTsKKworCS8qIEZpbmQgZnVuY3Rpb24gZm9yIGN1cnJlbnQgc3RhdGUgYW5kIG1lc3NhZ2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgRE9XTlNMTEVOOyBpKyspCisJCWlmICgobXNnX3R5cGUgPT0gZG93bnN0YXRlbGlzdFtpXS50eXBlKQorCQkgJiYgKCgxIDw8IHRyYW5zLT5jYy5zdGF0ZSkgJiBkb3duc3RhdGVsaXN0W2ldLnN0YXRlcykpCisJCQlicmVhazsKKwlpZiAoaSA9PSBET1dOU0xMRU4pIHsKKwkJREVCVUdQKERDQywgIk1lc3NhZ2UgdW5oYW5kbGVkIGF0IHRoaXMgc3RhdGUuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmMgPSBkb3duc3RhdGVsaXN0W2ldLnJvdXQodHJhbnMsIGFyZyk7CisKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIHN0cnVjdCBkYXRhc3RhdGUgeworCXVfaW50MzJfdAlzdGF0ZXM7CisJaW50CQl0eXBlOworCWludAkJKCpyb3V0KSAoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpOworfSBkYXRhc3RhdGVsaXN0W10gPSB7CisJLyogbW9iaWxlIG9yaWdpbmF0aW5nIGNhbGwgZXN0YWJsaXNobWVudCAqLworCXtTQklUKEdTTV9DU1RBVEVfTlVMTCksIC8qIDUuMi4xLjIgKi8KKwkgR1NNNDhfTVRfQ0NfU0VUVVAsIGdzbTQ4X2NjX3J4X3NldHVwfSwKKwl7U0JJVChHU01fQ1NUQVRFX05VTEwpLCAvKiA1LjIuMS4yICovCisJIEdTTTQ4X01UX0NDX0VNRVJHX1NFVFVQLCBnc200OF9jY19yeF9zZXR1cH0sCisJe1NCSVQoR1NNX0NTVEFURV9DT05ORUNUX0lORCksIC8qIDUuMi4xLjIgKi8KKwkgR1NNNDhfTVRfQ0NfQ09OTkVDVF9BQ0ssIGdzbTQ4X2NjX3J4X2Nvbm5lY3RfYWNrfSwKKwkvKiBtb2JpbGUgdGVybWluYXRpbmcgY2FsbCBlc3RhYmxpc2htZW50ICovCisJe1NCSVQoR1NNX0NTVEFURV9DQUxMX1BSRVNFTlQpLCAvKiA1LjIuMi4zLjIgKi8KKwkgR1NNNDhfTVRfQ0NfQ0FMTF9DT05GLCBnc200OF9jY19yeF9jYWxsX2NvbmZ9LAorCXtTQklUKEdTTV9DU1RBVEVfQ0FMTF9QUkVTRU5UKSB8IFNCSVQoR1NNX0NTVEFURV9NT19URVJNX0NBTExfQ09ORiksIC8qID8/Pz8gfCA1LjIuMi4zLjIgKi8KKwkgR1NNNDhfTVRfQ0NfQUxFUlRJTkcsIGdzbTQ4X2NjX3J4X2FsZXJ0aW5nfSwKKwl7U0JJVChHU01fQ1NUQVRFX0NBTExfUFJFU0VOVCkgfCBTQklUKEdTTV9DU1RBVEVfTU9fVEVSTV9DQUxMX0NPTkYpIHwgU0JJVChHU01fQ1NUQVRFX0NBTExfUkVDRUlWRUQpLCAvKiAoNS4yLjIuNikgfCA1LjIuMi42IHwgNS4yLjIuNiAqLworCSBHU000OF9NVF9DQ19DT05ORUNULCBnc200OF9jY19yeF9jb25uZWN0fSwKKwkgLyogc2lnbmFsbGluZyBkdXJpbmcgY2FsbCAqLworCXtBTExfU1RBVEVTIC0gU0JJVChHU01fQ1NUQVRFX05VTEwpLAorCSBHU000OF9NVF9DQ19GQUNJTElUWSwgZ3NtNDhfY2NfcnhfZmFjaWxpdHl9LAorCXtTQklUKEdTTV9DU1RBVEVfQUNUSVZFKSwKKwkgR1NNNDhfTVRfQ0NfTk9USUZZLCBnc200OF9jY19yeF9ub3RpZnl9LAorCXtBTExfU1RBVEVTLAorCSBHU000OF9NVF9DQ19TVEFSVF9EVE1GLCBnc200OF9jY19yeF9zdGFydF9kdG1mfSwKKwl7QUxMX1NUQVRFUywKKwkgR1NNNDhfTVRfQ0NfU1RPUF9EVE1GLCBnc200OF9jY19yeF9zdG9wX2R0bWZ9LAorCXtBTExfU1RBVEVTLAorCSBHU000OF9NVF9DQ19TVEFUVVNfRU5RLCBnc200OF9jY19yeF9zdGF0dXNfZW5xfSwKKwl7U0JJVChHU01fQ1NUQVRFX0FDVElWRSksCisJIEdTTTQ4X01UX0NDX0hPTEQsIGdzbTQ4X2NjX3J4X2hvbGR9LAorCXtTQklUKEdTTV9DU1RBVEVfQUNUSVZFKSwKKwkgR1NNNDhfTVRfQ0NfUkVUUiwgZ3NtNDhfY2NfcnhfcmV0cmlldmV9LAorCXtTQklUKEdTTV9DU1RBVEVfQUNUSVZFKSwKKwkgR1NNNDhfTVRfQ0NfTU9ESUZZLCBnc200OF9jY19yeF9tb2RpZnl9LAorCXtTQklUKEdTTV9DU1RBVEVfTU9fVEVSTV9NT0RJRlkpLAorCSBHU000OF9NVF9DQ19NT0RJRllfQ09NUEwsIGdzbTQ4X2NjX3J4X21vZGlmeV9jb21wbGV0ZX0sCisJe1NCSVQoR1NNX0NTVEFURV9NT19URVJNX01PRElGWSksCisJIEdTTTQ4X01UX0NDX01PRElGWV9SRUpFQ1QsIGdzbTQ4X2NjX3J4X21vZGlmeV9yZWplY3R9LAorCXtTQklUKEdTTV9DU1RBVEVfQUNUSVZFKSwKKwkgR1NNNDhfTVRfQ0NfVVNFUl9JTkZPLCBnc200OF9jY19yeF91c2VyaW5mb30sCisJLyogY2xlYXJpbmcgKi8KKwl7QUxMX1NUQVRFUyAtIFNCSVQoR1NNX0NTVEFURV9OVUxMKSAtIFNCSVQoR1NNX0NTVEFURV9SRUxFQVNFX1JFUSksIC8qIDUuNC4zLjIgKi8KKwkgR1NNNDhfTVRfQ0NfRElTQ09OTkVDVCwgZ3NtNDhfY2NfcnhfZGlzY29ubmVjdH0sCisJe0FMTF9TVEFURVMgLSBTQklUKEdTTV9DU1RBVEVfTlVMTCksIC8qIDUuNC40LjEuMi4yICovCisJIEdTTTQ4X01UX0NDX1JFTEVBU0UsIGdzbTQ4X2NjX3J4X3JlbGVhc2V9LAorCXtBTExfU1RBVEVTLCAvKiA1LjQuMy40ICovCisJIEdTTTQ4X01UX0NDX1JFTEVBU0VfQ09NUEwsIGdzbTQ4X2NjX3J4X3JlbGVhc2VfY29tcGx9LAorfTsKKworI2RlZmluZSBEQVRBU0xMRU4gXAorCShzaXplb2YoZGF0YXN0YXRlbGlzdCkgLyBzaXplb2Yoc3RydWN0IGRhdGFzdGF0ZSkpCisKK3N0YXRpYyBpbnQgZ3NtMDQwOF9yY3ZfY2Moc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubjsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1X2ludDhfdCBtc2dfdHlwZSA9IGdoLT5tc2dfdHlwZSAmIDB4YmY7CisJdV9pbnQ4X3QgdHJhbnNhY3Rpb25faWQgPSAoKGdoLT5wcm90b19kaXNjciAmIDB4ZjApIF4gMHg4MCkgPj4gNDsgLyogZmxpcCAqLworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gbXNnLT5sY2hhbjsKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucyA9IE5VTEw7CisJaW50IGksIHJjID0gMDsKKworCWlmIChtc2dfdHlwZSAmIDB4ODApIHsKKwkJREVCVUdQKERDQywgIk1TRyAweCUyeCBub3QgZGVmaW5lZCBmb3IgUEQgZXJyb3JcbiIsIG1zZ190eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY29ubiA9ICZsY2hhbi0+Y29ubjsKKworCS8qIEZpbmQgdHJhbnNhY3Rpb24gKi8KKwl0cmFucyA9IHRyYW5zX2ZpbmRfYnlfaWQoY29ubi0+c3Vic2NyLCBHU000OF9QRElTQ19DQywgdHJhbnNhY3Rpb25faWQpOworCisJREVCVUdQKERDQywgIihidHMgJWQgdHJ4ICVkIHRzICVkIHRpICV4IHN1YiAlcykgIgorCQkiUmVjZWl2ZWQgJyVzJyBmcm9tIE1TIGluIHN0YXRlICVkICglcylcbiIsCisJCWxjaGFuLT50cy0+dHJ4LT5idHMtPm5yLCBsY2hhbi0+dHMtPnRyeC0+bnIsIGxjaGFuLT50cy0+bnIsCisJCXRyYW5zYWN0aW9uX2lkLCAoY29ubi0+c3Vic2NyKT8oY29ubi0+c3Vic2NyLT5leHRlbnNpb24pOiItIiwKKwkJZ3NtNDhfY2NfbXNnX25hbWUobXNnX3R5cGUpLCB0cmFucz8odHJhbnMtPmNjLnN0YXRlKTowLAorCQlnc200OF9jY19zdGF0ZV9uYW1lKHRyYW5zPyh0cmFucy0+Y2Muc3RhdGUpOjApKTsKKworCS8qIENyZWF0ZSB0cmFuc2FjdGlvbiAqLworCWlmICghdHJhbnMpIHsKKwkJREVCVUdQKERDQywgIlVua25vd24gdHJhbnNhY3Rpb24gSUQgJXgsICIKKwkJCSJjcmVhdGluZyBuZXcgdHJhbnMuXG4iLCB0cmFuc2FjdGlvbl9pZCk7CisJCS8qIENyZWF0ZSB0cmFuc2FjdGlvbiAqLworCQl0cmFucyA9IHRyYW5zX2FsbG9jKGNvbm4tPnN1YnNjciwgR1NNNDhfUERJU0NfQ0MsCisJCQkJICAgIHRyYW5zYWN0aW9uX2lkLCBuZXdfY2FsbHJlZisrKTsKKwkJaWYgKCF0cmFucykgeworCQkJREVCVUdQKERDQywgIk5vIG1lbW9yeSBmb3IgdHJhbnMuXG4iKTsKKwkJCXJjID0gZ3NtNDhfdHhfc2ltcGxlKG1zZy0+bGNoYW4sCisJCQkJCSAgICAgR1NNNDhfUERJU0NfQ0MgfCAodHJhbnNhY3Rpb25faWQgPDwgNCksCisJCQkJCSAgICAgR1NNNDhfTVRfQ0NfUkVMRUFTRV9DT01QTCk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQkvKiBBc3NpZ24gdHJhbnNhY3Rpb24gKi8KKwkJdHJhbnMtPmNvbm4gPSAmbGNoYW4tPmNvbm47CisJCXVzZV9zdWJzY3JfY29uKHRyYW5zLT5jb25uKTsKKwl9CisKKwkvKiBmaW5kIGZ1bmN0aW9uIGZvciBjdXJyZW50IHN0YXRlIGFuZCBtZXNzYWdlICovCisJZm9yIChpID0gMDsgaSA8IERBVEFTTExFTjsgaSsrKQorCQlpZiAoKG1zZ190eXBlID09IGRhdGFzdGF0ZWxpc3RbaV0udHlwZSkKKwkJICYmICgoMSA8PCB0cmFucy0+Y2Muc3RhdGUpICYgZGF0YXN0YXRlbGlzdFtpXS5zdGF0ZXMpKQorCQkJYnJlYWs7CisJaWYgKGkgPT0gREFUQVNMTEVOKSB7CisJCURFQlVHUChEQ0MsICJNZXNzYWdlIHVuaGFuZGxlZCBhdCB0aGlzIHN0YXRlLlxuIik7CisJCXJldHVybiAwOworCX0KKworCXJjID0gZGF0YXN0YXRlbGlzdFtpXS5yb3V0KHRyYW5zLCBtc2cpOworCisJcmV0dXJuIHJjOworfQorCisvKiBoZXJlIHdlIHBhc3MgaW4gYSBtc2diIGZyb20gdGhlIFJTTC0+UkxMLiAgV2UgZXhwZWN0IHRoZSBsMyBwb2ludGVyIHRvIGJlIHNldCAqLworaW50IGdzbTA0MDhfcmN2bXNnKHN0cnVjdCBtc2diICptc2csIHVfaW50OF90IGxpbmtfaWQpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdV9pbnQ4X3QgcGRpc2MgPSBnaC0+cHJvdG9fZGlzY3IgJiAweDBmOworCWludCByYyA9IDA7CisKKwlpZiAoc2lsZW50X2NhbGxfcmVyb3V0ZShtc2cpKQorCQlyZXR1cm4gc2lsZW50X2NhbGxfcngobXNnKTsKKwkKKwlzd2l0Y2ggKHBkaXNjKSB7CisJY2FzZSBHU000OF9QRElTQ19DQzoKKwkJcmMgPSBnc20wNDA4X3Jjdl9jYyhtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X1BESVNDX01NOgorCQlyYyA9IGdzbTA0MDhfcmN2X21tKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfUERJU0NfUlI6CisJCXJjID0gZ3NtMDQwOF9yY3ZfcnIobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9QRElTQ19TTVM6CisJCXJjID0gZ3NtMDQxMV9yY3Zfc21zKG1zZywgbGlua19pZCk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfUERJU0NfTU1fR1BSUzoKKwljYXNlIEdTTTQ4X1BESVNDX1NNX0dQUlM6CisJCUxPR1AoRFJMTCwgTE9HTF9OT1RJQ0UsICJVbmltcGxlbWVudGVkICIKKwkJCSJHU00gMDQuMDggZGlzY3JpbWluYXRvciAweCUwMnhcbiIsIHBkaXNjKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9QRElTQ19OQ19TUzoKKwkJcmMgPSBoYW5kbGVfcmN2X3Vzc2QobXNnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEUkxMLCBMT0dMX05PVElDRSwgIlVua25vd24gIgorCQkJIkdTTSAwNC4wOCBkaXNjcmltaW5hdG9yIDB4JTAyeFxuIiwgcGRpc2MpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIGRlcXVldWUgbWVzc2FnZXMgdG8gbGF5ZXIgNCAqLworaW50IGJzY191cHF1ZXVlKHN0cnVjdCBnc21fbmV0d29yayAqbmV0KQoreworCXN0cnVjdCBnc21fbW5jYyAqbW5jYzsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCWludCB3b3JrID0gMDsKKworCWlmIChuZXQpCisJCXdoaWxlICgobXNnID0gbXNnYl9kZXF1ZXVlKCZuZXQtPnVwcXVldWUpKSkgeworCQkJbW5jYyA9IChzdHJ1Y3QgZ3NtX21uY2MgKiltc2ctPmRhdGE7CisJCQlpZiAobmV0LT5tbmNjX3JlY3YpCisJCQkJbmV0LT5tbmNjX3JlY3YobmV0LCBtbmNjLT5tc2dfdHlwZSwgbW5jYyk7CisJCQl3b3JrID0gMTsgLyogd29yayBkb25lICovCisJCQl0YWxsb2NfZnJlZShtc2cpOworCQl9CisKKwlyZXR1cm4gd29yazsKK30KKworLyoKKyAqIFRoaXMgd2lsbCBiZSByYW4gYnkgdGhlIGxpbmtlciB3aGVuIGxvYWRpbmcgdGhlIERTTy4gV2UgdXNlIGl0IHRvCisgKiBkbyBzeXN0ZW0gaW5pdGlhbGl6YXRpb24sIGUuZy4gcmVnaXN0cmF0aW9uIG9mIHNpZ25hbCBoYW5kbGVycy4KKyAqLworc3RhdGljIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkgdm9pZCBvbl9kc29fbG9hZF8wNDA4KHZvaWQpCit7CisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfTENIQU4sIGdzbTA0MDhfaGFuZGxlX2xjaGFuX3NpZ25hbCwgTlVMTCk7CisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfQUJJU0lQLCBoYW5kbGVfYWJpc2lwX3NpZ25hbCwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9nc21fMDRfMDhfdXRpbHMuYyBiL29wZW5ic2Mvc3JjL2dzbV8wNF8wOF91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZTQyZGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9nc21fMDRfMDhfdXRpbHMuYwpAQCAtMCwwICsxLDU4OSBAQAorLyogR1NNIE1vYmlsZSBSYWRpbyBJbnRlcmZhY2UgTGF5ZXIgMyBtZXNzYWdlcyBvbiB0aGUgQS1iaXMgaW50ZXJmYWNlCisgKiAzR1BQIFRTIDA0LjA4IHZlcnNpb24gNy4yMS4wIFJlbGVhc2UgMTk5OCAvIEVUU0kgVFMgMTAwIDk0MCBWNy4yMS4wCisgKiB1dGlsaXR5IGZ1bmN0aW9ucworICovCisKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA4LCAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbTQ4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmFuc2FjdGlvbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcGFnaW5nLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKworLyogc2hvdWxkIGlwLmFjY2VzcyBCVFMgdXNlIGRpcmVjdCBSVFAgc3RyZWFtcyBiZXR3ZWVuIGVhY2ggb3RoZXIgKDEpLAorICogb3Igc2hvdWxkIE9wZW5CU0MgYWx3YXlzIGFjdCBhcyBSVFAgcmVsYXkvcHJveHkgaW4gYmV0d2VlbiAoMCkgPyAqLworaW50IGlwYWNjX3J0cF9kaXJlY3QgPSAxOworCitpbnQgZ3NtNDhfc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZy0+ZGF0YTsKKworCS8qIGlmIHdlIGdldCBwYXNzZWQgYSB0cmFuc2FjdGlvbiByZWZlcmVuY2UsIGRvIHNvbWUgY29tbW9uCisJICogd29yayB0aGF0IHRoZSBjYWxsZXIgbm8gbG9uZ2VyIGhhcyB0byBkbyAqLworCWlmICh0cmFucykgeworCQlnaC0+cHJvdG9fZGlzY3IgPSB0cmFucy0+cHJvdG9jb2wgfCAodHJhbnMtPnRyYW5zYWN0aW9uX2lkIDw8IDQpOworCQltc2ctPmxjaGFuID0gdHJhbnMtPmNvbm4tPmxjaGFuOworCX0KKworCWlmIChtc2ctPmxjaGFuKSB7CisJCW1zZy0+dHJ4ID0gbXNnLT5sY2hhbi0+dHMtPnRyeDsKKworCQlpZiAoKGdoLT5wcm90b19kaXNjciAmIEdTTTQ4X1BESVNDX01BU0spID09IEdTTTQ4X1BESVNDX0NDKQorCQkJREVCVUdQKERDQywgIihidHMgJWQgdHJ4ICVkIHRzICVkIHRpICUwMngpICIKKwkJCQkiU2VuZGluZyAnJXMnIHRvIE1TLlxuIiwgbXNnLT50cngtPmJ0cy0+bnIsCisJCQkJbXNnLT50cngtPm5yLCBtc2ctPmxjaGFuLT50cy0+bnIsCisJCQkJZ2gtPnByb3RvX2Rpc2NyICYgMHhmMCwKKwkJCQlnc200OF9jY19tc2dfbmFtZShnaC0+bXNnX3R5cGUpKTsKKwkJZWxzZQorCQkJREVCVUdQKERDQywgIihidHMgJWQgdHJ4ICVkIHRzICVkIHBkICUwMngpICIKKwkJCQkiU2VuZGluZyAweCUwMnggdG8gTVMuXG4iLCBtc2ctPnRyeC0+YnRzLT5uciwKKwkJCQltc2ctPnRyeC0+bnIsIG1zZy0+bGNoYW4tPnRzLT5uciwKKwkJCQlnaC0+cHJvdG9fZGlzY3IsIGdoLT5tc2dfdHlwZSk7CisJfQorCisJbXNnLT5sM2ggPSBtc2ctPmRhdGE7CisKKwlyZXR1cm4gcnNsX2RhdGFfcmVxdWVzdChtc2csIDApOworfQorCisvKiBTZWN0aW9uIDkuMS44IC8gVGFibGUgOS45ICovCitzdHJ1Y3QgY2hyZXEgeworCXVfaW50OF90IHZhbDsKKwl1X2ludDhfdCBtYXNrOworCWVudW0gY2hyZXFfdHlwZSB0eXBlOworfTsKKworLyogSWYgU1lTVEVNIElORk9STUFUSU9OIFRZUEUgNCBORUNJIGJpdCA9PSAxICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGNocmVxIGNocmVxX3R5cGVfbmVjaTFbXSA9IHsKKwl7IDB4YTAsIDB4ZTAsIENIUkVRX1RfRU1FUkdfQ0FMTCB9LAorCXsgMHhjMCwgMHhlMCwgQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9GIH0sCisJeyAweDY4LCAweGZjLCBDSFJFUV9UX0NBTExfUkVFU1RfVENIX0ggfSwKKwl7IDB4NmMsIDB4ZmMsIENIUkVRX1RfQ0FMTF9SRUVTVF9UQ0hfSF9EQkwgfSwKKwl7IDB4ZTAsIDB4ZTAsIENIUkVRX1RfU0RDQ0ggfSwKKwl7IDB4NDAsIDB4ZjAsIENIUkVRX1RfVk9JQ0VfQ0FMTF9UQ0hfSCB9LAorCXsgMHg1MCwgMHhmMCwgQ0hSRVFfVF9EQVRBX0NBTExfVENIX0ggfSwKKwl7IDB4MDAsIDB4ZjAsIENIUkVRX1RfTE9DQVRJT05fVVBEIH0sCisJeyAweDEwLCAweGYwLCBDSFJFUV9UX1NEQ0NIIH0sCisJeyAweDgwLCAweGUwLCBDSFJFUV9UX1BBR19SX0FOWV9ORUNJMSB9LAorCXsgMHgyMCwgMHhmMCwgQ0hSRVFfVF9QQUdfUl9UQ0hfRiB9LAorCXsgMHgzMCwgMHhmMCwgQ0hSRVFfVF9QQUdfUl9UQ0hfRkggfSwKKwl7IDB4NjcsIDB4ZmYsIENIUkVRX1RfTE1VIH0sCisJeyAweDYwLCAweGY5LCBDSFJFUV9UX1JFU0VSVkVEX1NEQ0NIIH0sCisJeyAweDYxLCAweGZiLCBDSFJFUV9UX1JFU0VSVkVEX1NEQ0NIIH0sCisJeyAweDYzLAkweGZmLCBDSFJFUV9UX1JFU0VSVkVEX1NEQ0NIIH0sCisJeyAweDdmLCAweGZmLCBDSFJFUV9UX1JFU0VSVkVEX0lHTk9SRSB9LAorfTsKKworLyogSWYgU1lTVEVNIElORk9STUFUSU9OIFRZUEUgNCBORUNJIGJpdCA9PSAwICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGNocmVxIGNocmVxX3R5cGVfbmVjaTBbXSA9IHsKKwl7IDB4YTAsIDB4ZTAsIENIUkVRX1RfRU1FUkdfQ0FMTCB9LAorCXsgMHhjMCwgMHhlMCwgQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9IIH0sCisJeyAweGUwLCAweGUwLCBDSFJFUV9UX1RDSF9GIH0sCisJeyAweDUwLCAweGYwLCBDSFJFUV9UX0RBVEFfQ0FMTF9UQ0hfSCB9LAorCXsgMHgwMCwgMHhlMCwgQ0hSRVFfVF9MT0NBVElPTl9VUEQgfSwKKwl7IDB4ODAsIDB4ZTAsIENIUkVRX1RfUEFHX1JfQU5ZX05FQ0kwIH0sCisJeyAweDIwLCAweGYwLCBDSFJFUV9UX1BBR19SX1RDSF9GIH0sCisJeyAweDMwLCAweGYwLCBDSFJFUV9UX1BBR19SX1RDSF9GSCB9LAorCXsgMHg2NywgMHhmZiwgQ0hSRVFfVF9MTVUgfSwKKwl7IDB4NjAsIDB4ZjksIENIUkVRX1RfUkVTRVJWRURfU0RDQ0ggfSwKKwl7IDB4NjEsIDB4ZmIsIENIUkVRX1RfUkVTRVJWRURfU0RDQ0ggfSwKKwl7IDB4NjMsCTB4ZmYsIENIUkVRX1RfUkVTRVJWRURfU0RDQ0ggfSwKKwl7IDB4N2YsIDB4ZmYsIENIUkVRX1RfUkVTRVJWRURfSUdOT1JFIH0sCit9OworCitzdGF0aWMgY29uc3QgZW51bSBnc21fY2hhbl90IGN0eXBlX2J5X2NocmVxW10gPSB7CisJW0NIUkVRX1RfRU1FUkdfQ0FMTF0JCT0gR1NNX0xDSEFOX1RDSF9GLAorCVtDSFJFUV9UX0NBTExfUkVFU1RfVENIX0ZdCT0gR1NNX0xDSEFOX1RDSF9GLAorCVtDSFJFUV9UX0NBTExfUkVFU1RfVENIX0hdCT0gR1NNX0xDSEFOX1RDSF9ILAorCVtDSFJFUV9UX0NBTExfUkVFU1RfVENIX0hfREJMXQk9IEdTTV9MQ0hBTl9UQ0hfSCwKKwlbQ0hSRVFfVF9TRENDSF0JCQk9IEdTTV9MQ0hBTl9TRENDSCwKKwlbQ0hSRVFfVF9UQ0hfRl0JCQk9IEdTTV9MQ0hBTl9UQ0hfRiwKKwlbQ0hSRVFfVF9WT0lDRV9DQUxMX1RDSF9IXQk9IEdTTV9MQ0hBTl9UQ0hfSCwKKwlbQ0hSRVFfVF9EQVRBX0NBTExfVENIX0hdCT0gR1NNX0xDSEFOX1RDSF9ILAorCVtDSFJFUV9UX0xPQ0FUSU9OX1VQRF0JCT0gR1NNX0xDSEFOX1NEQ0NILAorCVtDSFJFUV9UX1BBR19SX0FOWV9ORUNJMV0JPSBHU01fTENIQU5fU0RDQ0gsCisJW0NIUkVRX1RfUEFHX1JfQU5ZX05FQ0kwXQk9IEdTTV9MQ0hBTl9TRENDSCwKKwlbQ0hSRVFfVF9QQUdfUl9UQ0hfRl0JCT0gR1NNX0xDSEFOX1RDSF9GLAorCVtDSFJFUV9UX1BBR19SX1RDSF9GSF0JCT0gR1NNX0xDSEFOX1RDSF9GLAorCVtDSFJFUV9UX0xNVV0JCQk9IEdTTV9MQ0hBTl9TRENDSCwKKwlbQ0hSRVFfVF9SRVNFUlZFRF9TRENDSF0JPSBHU01fTENIQU5fU0RDQ0gsCisJW0NIUkVRX1RfUkVTRVJWRURfSUdOT1JFXQk9IEdTTV9MQ0hBTl9VTktOT1dOLAorfTsKKworc3RhdGljIGNvbnN0IGVudW0gZ3NtX2NocmVxX3JlYXNvbl90IHJlYXNvbl9ieV9jaHJlcVtdID0geworCVtDSFJFUV9UX0VNRVJHX0NBTExdCQk9IEdTTV9DSFJFUV9SRUFTT05fRU1FUkcsCisJW0NIUkVRX1RfQ0FMTF9SRUVTVF9UQ0hfRl0JPSBHU01fQ0hSRVFfUkVBU09OX0NBTEwsCisJW0NIUkVRX1RfQ0FMTF9SRUVTVF9UQ0hfSF0JPSBHU01fQ0hSRVFfUkVBU09OX0NBTEwsCisJW0NIUkVRX1RfQ0FMTF9SRUVTVF9UQ0hfSF9EQkxdCT0gR1NNX0NIUkVRX1JFQVNPTl9DQUxMLAorCVtDSFJFUV9UX1NEQ0NIXQkJCT0gR1NNX0NIUkVRX1JFQVNPTl9PVEhFUiwKKwlbQ0hSRVFfVF9UQ0hfRl0JCQk9IEdTTV9DSFJFUV9SRUFTT05fT1RIRVIsCisJW0NIUkVRX1RfVk9JQ0VfQ0FMTF9UQ0hfSF0JPSBHU01fQ0hSRVFfUkVBU09OX0NBTEwsCisJW0NIUkVRX1RfREFUQV9DQUxMX1RDSF9IXQk9IEdTTV9DSFJFUV9SRUFTT05fT1RIRVIsCisJW0NIUkVRX1RfTE9DQVRJT05fVVBEXQkJPSBHU01fQ0hSRVFfUkVBU09OX0xPQ0FUSU9OX1VQRCwKKwlbQ0hSRVFfVF9QQUdfUl9BTllfTkVDSTFdCT0gR1NNX0NIUkVRX1JFQVNPTl9QQUcsCisJW0NIUkVRX1RfUEFHX1JfQU5ZX05FQ0kwXQk9IEdTTV9DSFJFUV9SRUFTT05fUEFHLAorCVtDSFJFUV9UX1BBR19SX1RDSF9GXQkJPSBHU01fQ0hSRVFfUkVBU09OX1BBRywKKwlbQ0hSRVFfVF9QQUdfUl9UQ0hfRkhdCQk9IEdTTV9DSFJFUV9SRUFTT05fUEFHLAorCVtDSFJFUV9UX0xNVV0JCQk9IEdTTV9DSFJFUV9SRUFTT05fT1RIRVIsCisJW0NIUkVRX1RfUkVTRVJWRURfU0RDQ0hdCT0gR1NNX0NIUkVRX1JFQVNPTl9PVEhFUiwKKwlbQ0hSRVFfVF9SRVNFUlZFRF9JR05PUkVdCT0gR1NNX0NIUkVRX1JFQVNPTl9PVEhFUiwKK307CisKK2VudW0gZ3NtX2NoYW5fdCBnZXRfY3R5cGVfYnlfY2hyZXEoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgcmEsIGludCBuZWNpKQoreworCWludCBpOworCWludCBsZW5ndGg7CisJY29uc3Qgc3RydWN0IGNocmVxICpjaHJlcTsKKworCWlmIChuZWNpKSB7CisJCWNocmVxID0gY2hyZXFfdHlwZV9uZWNpMTsKKwkJbGVuZ3RoID0gQVJSQVlfU0laRShjaHJlcV90eXBlX25lY2kxKTsKKwl9IGVsc2UgeworCQljaHJlcSA9IGNocmVxX3R5cGVfbmVjaTA7CisJCWxlbmd0aCA9IEFSUkFZX1NJWkUoY2hyZXFfdHlwZV9uZWNpMCk7CisJfQorCisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IGNocmVxICpjaHIgPSAmY2hyZXFbaV07CisJCWlmICgocmEgJiBjaHItPm1hc2spID09IGNoci0+dmFsKQorCQkJcmV0dXJuIGN0eXBlX2J5X2NocmVxW2Noci0+dHlwZV07CisJfQorCUxPR1AoRFJSLCBMT0dMX0VSUk9SLCAiVW5rbm93biBDSEFOTkVMIFJFUVVFU1QgUlFEIDB4JTAyeFxuIiwgcmEpOworCXJldHVybiBHU01fTENIQU5fU0RDQ0g7Cit9CisKK2VudW0gZ3NtX2NocmVxX3JlYXNvbl90IGdldF9yZWFzb25fYnlfY2hyZXEoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgcmEsIGludCBuZWNpKQoreworCWludCBpOworCWludCBsZW5ndGg7CisJY29uc3Qgc3RydWN0IGNocmVxICpjaHJlcTsKKworCWlmIChuZWNpKSB7CisJCWNocmVxID0gY2hyZXFfdHlwZV9uZWNpMTsKKwkJbGVuZ3RoID0gQVJSQVlfU0laRShjaHJlcV90eXBlX25lY2kxKTsKKwl9IGVsc2UgeworCQljaHJlcSA9IGNocmVxX3R5cGVfbmVjaTA7CisJCWxlbmd0aCA9IEFSUkFZX1NJWkUoY2hyZXFfdHlwZV9uZWNpMCk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBjaHJlcSAqY2hyID0gJmNocmVxW2ldOworCQlpZiAoKHJhICYgY2hyLT5tYXNrKSA9PSBjaHItPnZhbCkKKwkJCXJldHVybiByZWFzb25fYnlfY2hyZXFbY2hyLT50eXBlXTsKKwl9CisJTE9HUChEUlIsIExPR0xfRVJST1IsICJVbmtub3duIENIQU5ORUwgUkVRVUVTVCBSRUFTT04gMHglMDJ4XG4iLCByYSk7CisJcmV0dXJuIEdTTV9DSFJFUV9SRUFTT05fT1RIRVI7Cit9CisKKy8qIDcuMS43IGFuZCA5LjEuNzogUlIgQ0hBTm5lbCBSRUxlYXNlICovCitpbnQgZ3NtNDhfc2VuZF9ycl9yZWxlYXNlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKwl1X2ludDhfdCAqY2F1c2U7CisKKwltc2ctPmxjaGFuID0gbGNoYW47CisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfUlI7CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfUlJfQ0hBTl9SRUw7CisKKwljYXVzZSA9IG1zZ2JfcHV0KG1zZywgMSk7CisJY2F1c2VbMF0gPSBHU000OF9SUl9DQVVTRV9OT1JNQUw7CisKKwlERUJVR1AoRFJSLCAiU2VuZGluZyBDaGFubmVsIFJlbGVhc2U6IENoYW46IE51bWJlcjogJWQgVHlwZTogJWRcbiIsCisJCWxjaGFuLT5uciwgbGNoYW4tPnR5cGUpOworCisJLyogU2VuZCBhY3R1YWwgcmVsZWFzZSByZXF1ZXN0IHRvIE1TICovCisJZ3NtNDhfc2VuZG1zZyhtc2csIE5VTEwpOworCS8qIEZJWE1FOiBTdGFydCBUaW1lciBUMzEwOSAqLworCisJLyogRGVhY3RpdmF0ZSB0aGUgU0FDQ0ggb24gdGhlIEJUUyBzaWRlICovCisJcmV0dXJuIHJzbF9kZWFjdF9zYWNjaChsY2hhbik7Cit9CisKK2ludCBzZW5kX3NpZW1lbnNfbXJwY2koc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sCisJCSAgICAgICB1X2ludDhfdCAqY2xhc3NtYXJrMl9sdikKK3sKKwlzdHJ1Y3QgcnNsX21ycGNpIG1ycGNpOworCisJaWYgKGNsYXNzbWFyazJfbHZbMF0gPCAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1ycGNpLnBvd2VyX2NsYXNzID0gY2xhc3NtYXJrMl9sdlsxXSAmIDB4NzsKKwltcnBjaS52Z2NzX2NhcGFibGUgPSBjbGFzc21hcmsyX2x2WzJdICYgKDEgPDwgMSk7CisJbXJwY2kudmJzX2NhcGFibGUgPSBjbGFzc21hcmsyX2x2WzJdICYgKDEgPDwyKTsKKwltcnBjaS5nc21fcGhhc2UgPSAoY2xhc3NtYXJrMl9sdlsxXSkgPj4gNSAmIDB4MzsKKworCXJldHVybiByc2xfc2llbWVuc19tcnBjaShsY2hhbiwgJm1ycGNpKTsKK30KKworaW50IGdzbTQ4X2V4dHJhY3RfbWkodWludDhfdCAqY2xhc3NtYXJrMl9sdiwgaW50IGxlbmd0aCwgY2hhciAqbWlfc3RyaW5nLCB1aW50OF90ICptaV90eXBlKQoreworCS8qIENoZWNrIHRoZSBzaXplIGZvciB0aGUgY2xhc3NtYXJrICovCisJaWYgKGxlbmd0aCA8IDEgKyAqY2xhc3NtYXJrMl9sdikKKwkJcmV0dXJuIC0xOworCisJdV9pbnQ4X3QgKm1pX2x2ID0gY2xhc3NtYXJrMl9sdiArICpjbGFzc21hcmsyX2x2ICsgMTsKKwlpZiAobGVuZ3RoIDwgMiArICpjbGFzc21hcmsyX2x2ICsgbWlfbHZbMF0pCisJCXJldHVybiAtMjsKKworCSptaV90eXBlID0gbWlfbHZbMV0gJiBHU01fTUlfVFlQRV9NQVNLOworCXJldHVybiBnc200OF9taV90b19zdHJpbmcobWlfc3RyaW5nLCBHU000OF9NSV9TSVpFLCBtaV9sdisxLCAqbWlfbHYpOworfQorCitpbnQgZ3NtNDhfcGFnaW5nX2V4dHJhY3RfbWkoc3RydWN0IGdzbTQ4X3BhZ19yZXNwICpyZXNwLCBpbnQgbGVuZ3RoLAorCQkJICAgIGNoYXIgKm1pX3N0cmluZywgdV9pbnQ4X3QgKm1pX3R5cGUpCit7CisJc3RhdGljIGNvbnN0IHVpbnQzMl90IGNsYXNzbWFya19vZmZzZXQgPQorCQlvZmZzZXRvZihzdHJ1Y3QgZ3NtNDhfcGFnX3Jlc3AsIGNsYXNzbWFyazIpOworCXVfaW50OF90ICpjbGFzc21hcmsyX2x2ID0gKHVpbnQ4X3QgKikgJnJlc3AtPmNsYXNzbWFyazI7CisJcmV0dXJuIGdzbTQ4X2V4dHJhY3RfbWkoY2xhc3NtYXJrMl9sdiwgbGVuZ3RoIC0gY2xhc3NtYXJrX29mZnNldCwKKwkJCQltaV9zdHJpbmcsIG1pX3R5cGUpOworfQorCitpbnQgZ3NtNDhfaGFuZGxlX3BhZ2luZ19yZXNwKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSBtc2ctPmxjaGFuLT50cy0+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+bmVpZ2hfaWR4ICsgMSk7CisJbXJjLT5ic2ljID0gZGF0YVsxNV0gJiAweDNmOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9nc21fMDRfMTEuYyBiL29wZW5ic2Mvc3JjL2dzbV8wNF8xMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZDgwODkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9nc21fMDRfMTEuYwpAQCAtMCwwICsxLDEyMzkgQEAKKy8qIFBvaW50LXRvLVBvaW50IChQUCkgU2hvcnQgTWVzc2FnZSBTZXJ2aWNlIChTTVMpCisgKiBTdXBwb3J0IG9uIE1vYmlsZSBSYWRpbyBJbnRlcmZhY2UKKyAqIDNHUFAgVFMgMDQuMTEgdmVyc2lvbiA3LjEuMCBSZWxlYXNlIDE5OTggLyBFVFNJIFRTIDEwMCA5NDIgVjcuMS4wICovCisKKy8qIChDKSAyMDA4IGJ5IERhbmllbCBXaWxsbWFubiA8ZGFuaWVsQHRvdGFsdWViZXJ3YWNodW5nLmRlPgorICogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMTEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYW5zYWN0aW9uLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9wYWdpbmcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2JzY19ybGwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2NoYW5fYWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2JzY19hcGkuaD4KKworI2RlZmluZSBHU000MTFfQUxMT0NfU0laRQkxMDI0CisjZGVmaW5lIEdTTTQxMV9BTExPQ19IRUFEUk9PTQkxMjgKKworI2RlZmluZSBVTV9TQVBJX1NNUyAzCS8qIFNlZSBHU00gMDQuMDUvMDQuMDYgKi8KKwordm9pZCAqdGFsbF9nc21zX2N0eDsKK3N0YXRpYyB1X2ludDMyX3QgbmV3X2NhbGxyZWYgPSAweDQwMDAwMDAxOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBjcF9jYXVzZV9zdHJzW10gPSB7CisJeyBHU000MTFfQ1BfQ0FVU0VfTkVUX0ZBSUwsCSJOZXR3b3JrIEZhaWx1cmUiIH0sCisJeyBHU000MTFfQ1BfQ0FVU0VfQ09OR0VTVElPTiwJIkNvbmdlc3Rpb24iIH0sCisJeyBHU000MTFfQ1BfQ0FVU0VfSU5WX1RSQU5TX0lELAkiSW52YWxpZCBUcmFuc2FjdGlvbiBJRCIgfSwKKwl7IEdTTTQxMV9DUF9DQVVTRV9TRU1BTlRfSU5DX01TRywgIlNlbWFudGljYWxseSBJbmNvcnJlY3QgTWVzc2FnZSIgfSwKKwl7IEdTTTQxMV9DUF9DQVVTRV9JTlZfTUFORF9JTkYsCSJJbnZhbGlkIE1hbmRhdG9yeSBJbmZvcm1hdGlvbiIgfSwKKwl7IEdTTTQxMV9DUF9DQVVTRV9NU0dUWVBFX05PVEVYSVNULCAiTWVzc2FnZSBUeXBlIGRvZXNuJ3QgZXhpc3QiIH0sCisJeyBHU000MTFfQ1BfQ0FVU0VfTVNHX0lOQ09NUF9TVEFURSwKKwkJCQkiTWVzc2FnZSBpbmNvbXBhdGlibGUgd2l0aCBwcm90b2NvbCBzdGF0ZSIgfSwKKwl7IEdTTTQxMV9DUF9DQVVTRV9JRV9OT1RFWElTVCwJIklFIGRvZXMgbm90IGV4aXN0IiB9LAorCXsgR1NNNDExX0NQX0NBVVNFX1BST1RPQ09MX0VSUiwJIlByb3RvY29sIEVycm9yIiB9LAorCXsgMCwgMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBycF9jYXVzZV9zdHJzW10gPSB7CisJeyBHU000MTFfUlBfQ0FVU0VfTU9fTlVNX1VOQVNTSUdORUQsICIoTU8pIE51bWJlciBub3QgYXNzaWduZWQiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fT1BfREVUX0JBUlIsICIoTU8pIE9wZXJhdG9yIGRldGVybWluZWQgYmFycmluZyIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19DQUxMX0JBUlJFRCwgIihNTykgQ2FsbCBiYXJyZWQiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fU01TX1JFSkVDVEVELCAiKE1PKSBTTVMgcmVqZWN0ZWQiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fREVTVF9PVVRfT0ZfT1JERVIsICIoTU8pIERlc3RpbmF0aW9uIG91dCBvZiBvcmRlciIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19VTklERU5USUZJRURfU1VCU0NSLCAiKE1PKSBVbmlkZW50aWZpZWQgc3Vic2NyaWJlciIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19GQUNJTElUWV9SRUosICIoTU8pIEZhY2lsaXR5IHJlamVjdCIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19VTktOT1dOX1NVQlNDUiwgIihNTykgVW5rbm93biBzdWJzY3JpYmVyIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01PX05FVF9PVVRfT0ZfT1JERVIsICIoTU8pIE5ldHdvcmsgb3V0IG9mIG9yZGVyIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01PX1RFTVBfRkFJTCwgIihNTykgVGVtcG9yYXJ5IGZhaWx1cmUiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fQ09OR0VTVElPTiwgIihNTykgQ29uZ2VzdGlvbiIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19SRVNfVU5BVkFJTCwgIihNTykgUmVzb3VyY2UgdW5hdmFpbGFibGUiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fUkVRX0ZBQ19OT1RTVUJTQ1IsICIoTU8pIFJlcXVlc3RlZCBmYWNpbGl0eSBub3Qgc3Vic2NyaWJlZCIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19SRVFfRkFDX05PVElNUEwsICIoTU8pIFJlcXVlc3RlZCBmYWNpbGl0eSBub3QgaW1wbGVtZW50ZWQiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fSU5URVJXT1JLSU5HLCAiKE1PKSBJbnRlcndvcmtpbmciIH0sCisJLyogdmFsaWQgb25seSBmb3IgTVQgKi8KKwl7IEdTTTQxMV9SUF9DQVVTRV9NVF9NRU1fRVhDRUVERUQsICIoTVQpIE1lbW9yeSBFeGNlZWRlZCIgfSwKKwkvKiB2YWxpZCBmb3IgYm90aCBkaXJlY3Rpb25zICovCisJeyBHU000MTFfUlBfQ0FVU0VfSU5WX1RSQU5TX1JFRiwgIkludmFsaWQgVHJhbnNhY3Rpb24gUmVmZXJlbmNlIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX1NFTUFOVF9JTkNfTVNHLCAiU2VtYW50aWNhbGx5IEluY29ycmVjdCBNZXNzYWdlIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX0lOVl9NQU5EX0lORiwgIkludmFsaWQgTWFuZGF0b3J5IEluZm9ybWF0aW9uIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01TR1RZUEVfTk9URVhJU1QsICJNZXNzYWdlIFR5cGUgbm9uLWV4aXN0YW50IiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01TR19JTkNPTVBfU1RBVEUsICJNZXNzYWdlIGluY29tcGF0aWJsZSB3aXRoIHByb3RvY29sIHN0YXRlIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX0lFX05PVEVYSVNULCAiSW5mb3JtYXRpb24gRWxlbWVudCBub3QgZXhpc3RpbmciIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfUFJPVE9DT0xfRVJSLCAiUHJvdG9jb2wgRXJyb3IiIH0sCisJeyAwLCBOVUxMIH0KK307CisKK3N0cnVjdCBnc21fc21zICpzbXNfYWxsb2Modm9pZCkKK3sKKwlyZXR1cm4gdGFsbG9jX3plcm8odGFsbF9nc21zX2N0eCwgc3RydWN0IGdzbV9zbXMpOworfQorCit2b2lkIHNtc19mcmVlKHN0cnVjdCBnc21fc21zICpzbXMpCit7CisJLyogZHJvcCByZWZlcmVuY2VzIHRvIHN1YnNjcmliZXIgc3RydWN0dXJlICovCisJaWYgKHNtcy0+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+aW52b2tlX2lkKTsKKworCS8qIFdyYXAgdGhpcyB1cCBhcyBhIFJlamVjdCBjb21wb25lbnQgKi8KKwltc2diX3dyYXBfd2l0aF9UTChtc2csIEdTTTA0ODBfQ1RZUEVfUkVKRUNUKTsKKworCS8qIFdyYXAgdGhlIGNvbXBvbmVudCBpbiBhIEZhY2lsaXR5IG1lc3NhZ2UgKi8KKwltc2diX3dyYXBfd2l0aF9UTChtc2csIEdTTTA0ODBfSUVfRkFDSUxJVFkpOworCisJLyogQW5kIGZpbmFsbHkgcHJlLXBlbmQgdGhlIEwzIGhlYWRlciAqLworCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXNoKG1zZywgc2l6ZW9mKCpnaCkpOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX05DX1NTOworCWdoLT5wcm90b19kaXNjciB8PSByZXEtPnRyYW5zYWN0aW9uX2lkIHwgKDE8PDcpOyAgLyogVEkgZGlyZWN0aW9uID0gMSAqLworCWdoLT5tc2dfdHlwZSA9IEdTTTA0ODBfTVRZUEVfUkVMRUFTRV9DT01QTEVURTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9nc21fZGF0YS5jIGIvb3BlbmJzYy9zcmMvZ3NtX2RhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTBlZGFkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3NtX2RhdGEuYwpAQCAtMCwwICsxLDU0MiBAQAorLyogKEMpIDIwMDgtMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+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+YzAtPm5vbWluYWxfcG93ZXIgPSAyMzsKKwkJYnJlYWs7CisJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJYnJlYWs7CisJY2FzZSBHU01fQlRTX1RZUEVfVU5LTk9XTjoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9nc21fc3Vic2NyaWJlci5jIGIvb3BlbmJzYy9zcmMvZ3NtX3N1YnNjcmliZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTI1MDg3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3NtX3N1YnNjcmliZXIuYwpAQCAtMCwwICsxLDEzMCBAQAorLyogVGhlIGNvbmNlcHQgb2YgYSBzdWJzY3JpYmVyIGZvciB0aGUgTVNDLCByb3VnaGx5IEhMUi9WTFIgZnVuY3Rpb25hbGl0eSAqLworCisvKiAoQykgMjAwOCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+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+cnhfYWN0aW9uKSB7CisJY2FzZSBSVFBfUFJPWFk6CisJCW90aGVyX3JzID0gb2xkX3JzLT5wcm94eS5vdGhlcl9zb2NrOworCQlydHBfc29ja2V0X3Byb3h5KG5ld19ycywgb3RoZXJfcnMpOworCQkvKiBkZWxldGUgcmVmZXJlbmNlIHRvIG90aGVyIGVuZCBzb2NrZXQgdG8gcHJldmVudAorCQkgKiBydHBfc29ja2V0X2ZyZWUoKSBmcm9tIHJlbW92aW5nIHRoZSBpbnZlcnNlIHJlZmVyZW5jZSAqLworCQlvbGRfcnMtPnByb3h5Lm90aGVyX3NvY2sgPSBOVUxMOworCQlicmVhazsKKwljYXNlIFJUUF9SRUNWX1VQU1RSRUFNOgorCQluZXdfcnMtPnJlY2VpdmUgPSBvbGRfcnMtPnJlY2VpdmU7CisJCWJyZWFrOworCWNhc2UgUlRQX05PTkU6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhvX2xvZ2ljX3NpZ19jYih1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkJICAgdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKworCXN3aXRjaCAoc3Vic3lzKSB7CisJY2FzZSBTU19MQ0hBTjoKKwkJbGNoYW4gPSBzaWduYWxfZGF0YTsKKwkJc3dpdGNoIChzaWduYWwpIHsKKwkJY2FzZSBTX0xDSEFOX0FDVElWQVRFX0FDSzoKKwkJCXJldHVybiBob19jaGFuX2FjdGl2X2FjayhsY2hhbik7CisJCWNhc2UgU19MQ0hBTl9BQ1RJVkFURV9OQUNLOgorCQkJcmV0dXJuIGhvX2NoYW5fYWN0aXZfbmFjayhsY2hhbik7CisJCWNhc2UgU19MQ0hBTl9IQU5ET1ZFUl9ERVRFQ1Q6CisJCQlyZXR1cm4gaG9fcnNsX2RldGVjdChsY2hhbik7CisJCWNhc2UgU19MQ0hBTl9IQU5ET1ZFUl9DT01QTDoKKwkJCXJldHVybiBob19nc200OF9ob19jb21wbChsY2hhbik7CisJCWNhc2UgU19MQ0hBTl9IQU5ET1ZFUl9GQUlMOgorCQkJcmV0dXJuIGhvX2dzbTQ4X2hvX2ZhaWwobGNoYW4pOworCQl9CisJCWJyZWFrOworCWNhc2UgU1NfQUJJU0lQOgorCQlsY2hhbiA9IHNpZ25hbF9kYXRhOworCQlzd2l0Y2ggKHNpZ25hbCkgeworCQljYXNlIFNfQUJJU0lQX0NSQ1hfQUNLOgorCQkJcmV0dXJuIGhvX2lwYWNfY3JjeF9hY2sobGNoYW4pOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpIHZvaWQgb25fZHNvX2xvYWRfaG9fbG9naWModm9pZCkKK3sKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19MQ0hBTiwgaG9fbG9naWNfc2lnX2NiLCBOVUxMKTsKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19BQklTSVAsIGhvX2xvZ2ljX3NpZ19jYiwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9pbnB1dC9pcGFjY2Vzcy5jIGIvb3BlbmJzYy9zcmMvaW5wdXQvaXBhY2Nlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTY4ZTgwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvaW5wdXQvaXBhY2Nlc3MuYwpAQCAtMCwwICsxLDc3OSBAQAorLyogT3BlbkJTQyBBYmlzIGlucHV0IGRyaXZlciBmb3IgaXAuYWNjZXNzICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAxMCBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlcgorICogKEMpIDIwMTAgYnkgT24tV2F2ZXMKKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL2ZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc3ViY2hhbl9kZW11eC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZTFfaW5wdXQuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2lwYWNjZXNzLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKworI2RlZmluZSBQUklWX09NTCAxCisjZGVmaW5lIFBSSVZfUlNMIDIKKworLyogZGF0YSBzdHJ1Y3R1cmUgZm9yIG9uZSBFMSBpbnRlcmZhY2Ugd2l0aCBBLWJpcyAqLworc3RydWN0IGlhX2UxX2hhbmRsZSB7CisJc3RydWN0IGJzY19mZCBsaXN0ZW5fZmQ7CisJc3RydWN0IGJzY19mZCByc2xfbGlzdGVuX2ZkOworCXN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0OworfTsKKworc3RhdGljIHN0cnVjdCBpYV9lMV9oYW5kbGUgKmUxaDsKKworCisjZGVmaW5lIFRTMV9BTExPQ19TSVpFCTkwMAorCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgcG9uZ1tdID0geyAwLCAxLCBJUEFDX1BST1RPX0lQQUNDRVNTLCBJUEFDX01TR1RfUE9ORyB9Oworc3RhdGljIGNvbnN0IHVfaW50OF90IGlkX2Fja1tdID0geyAwLCAxLCBJUEFDX1BST1RPX0lQQUNDRVNTLCBJUEFDX01TR1RfSURfQUNLIH07CitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgaWRfcmVxW10gPSB7IDAsIDE3LCBJUEFDX1BST1RPX0lQQUNDRVNTLCBJUEFDX01TR1RfSURfR0VULAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX1VOSVQsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfTUFDQUREUiwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19MT0NBVElPTjEsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfTE9DQVRJT04yLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX0VRVUlQVkVSUywKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19TV1ZFUlNJT04sCisJCQkJCTB4MDEsIElQQUNfSURUQUdfVU5JVE5BTUUsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfU0VSTlIsCisJCQkJfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmlkdGFnX25hbWVzW10gPSB7CisJW0lQQUNfSURUQUdfU0VSTlJdCT0gIlNlcmlhbF9OdW1iZXIiLAorCVtJUEFDX0lEVEFHX1VOSVROQU1FXQk9ICJVbml0X05hbWUiLAorCVtJUEFDX0lEVEFHX0xPQ0FUSU9OMV0JPSAiTG9jYXRpb25fMSIsCisJW0lQQUNfSURUQUdfTE9DQVRJT04yXQk9ICJMb2NhdGlvbl8yIiwKKwlbSVBBQ19JRFRBR19FUVVJUFZFUlNdCT0gIkVxdWlwbWVudF9WZXJzaW9uIiwKKwlbSVBBQ19JRFRBR19TV1ZFUlNJT05dCT0gIlNvZnR3YXJlX1ZlcnNpb24iLAorCVtJUEFDX0lEVEFHX0lQQUREUl0JPSAiSVBfQWRkcmVzcyIsCisJW0lQQUNfSURUQUdfTUFDQUREUl0JPSAiTUFDX0FkZHJlc3MiLAorCVtJUEFDX0lEVEFHX1VOSVRdCT0gIlVuaXRfSUQiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmlwYWNfaWR0YWdfbmFtZShpbnQgdGFnKQoreworCWlmICh0YWcgPj0gQVJSQVlfU0laRShpZHRhZ19uYW1lcykpCisJCXJldHVybiAidW5rbm93biI7CisKKwlyZXR1cm4gaWR0YWdfbmFtZXNbdGFnXTsKK30KKworaW50IGlwYWNjZXNzX2lkdGFnX3BhcnNlKHN0cnVjdCB0bHZfcGFyc2VkICpkZWMsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwl1X2ludDhfdCB0X2xlbjsKKwl1X2ludDhfdCB0X3RhZzsKKwl1X2ludDhfdCAqY3VyID0gYnVmOworCisJd2hpbGUgKGN1ciA8IGJ1ZiArIGxlbikgeworCQl0X2xlbiA9ICpjdXIrKzsKKwkJdF90YWcgPSAqY3VyKys7CisKKwkJREVCVUdQQyhETUksICIlcz0nJXMnICIsIGlwYWNfaWR0YWdfbmFtZSh0X3RhZyksIGN1cik7CisKKwkJZGVjLT5sdlt0X3RhZ10ubGVuID0gdF9sZW47CisJCWRlYy0+bHZbdF90YWddLnZhbCA9IGN1cjsKKworCQljdXIgKz0gdF9sZW47CisJfQorCXJldHVybiAwOworfQorCitzdHJ1Y3QgZ3NtX2J0cyAqZmluZF9idHNfYnlfdW5pdGlkKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LAorCQkJCSAgIHVfaW50MTZfdCBzaXRlX2lkLCB1X2ludDE2X3QgYnRzX2lkKQoreworCXN0cnVjdCBnc21fYnRzICpidHM7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShidHMsICZuZXQtPmJ0c19saXN0LCBsaXN0KSB7CisKKwkJaWYgKCFpc19pcGFjY2Vzc19idHMoYnRzKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChidHMtPmlwX2FjY2Vzcy5zaXRlX2lkID09IHNpdGVfaWQgJiYKKwkJICAgIGJ0cy0+aXBfYWNjZXNzLmJ0c19pZCA9PSBidHNfaWQpCisJCQlyZXR1cm4gYnRzOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHBhcnNlX3VuaXRpZChjb25zdCBjaGFyICpzdHIsIHVfaW50MTZfdCAqc2l0ZV9pZCwgdV9pbnQxNl90ICpidHNfaWQsCisJCQl1X2ludDE2X3QgKnRyeF9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHVsOworCWNoYXIgKmVuZHB0cjsKKwljb25zdCBjaGFyICpucHRyOworCisJbnB0ciA9IHN0cjsKKwl1bCA9IHN0cnRvdWwobnB0ciwgJmVuZHB0ciwgMTApOworCWlmIChlbmRwdHIgPD0gbnB0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHNpdGVfaWQpCisJCSpzaXRlX2lkID0gdWwgJiAweGZmZmY7CisKKwlpZiAoKmVuZHB0cisrICE9ICcvJykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlucHRyID0gZW5kcHRyOworCXVsID0gc3RydG91bChucHRyLCAmZW5kcHRyLCAxMCk7CisJaWYgKGVuZHB0ciA8PSBucHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoYnRzX2lkKQorCQkqYnRzX2lkID0gdWwgJiAweGZmZmY7CisKKwlpZiAoKmVuZHB0cisrICE9ICcvJykKKwkJcmV0dXJuIC1FSU5WQUw7CisJCisJbnB0ciA9IGVuZHB0cjsKKwl1bCA9IHN0cnRvdWwobnB0ciwgJmVuZHB0ciwgMTApOworCWlmIChlbmRwdHIgPD0gbnB0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHRyeF9pZCkKKwkJKnRyeF9pZCA9IHVsICYgMHhmZmZmOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHNlbmQgdGhlIGlkIGFjayAqLworaW50IGlwYWNjZXNzX3NlbmRfaWRfYWNrKGludCBmZCkKK3sKKwlyZXR1cm4gd3JpdGUoZmQsIGlkX2Fjaywgc2l6ZW9mKGlkX2FjaykpOworfQorCitpbnQgaXBhY2Nlc3Nfc2VuZF9pZF9yZXEoaW50IGZkKQoreworCXJldHVybiB3cml0ZShmZCwgaWRfcmVxLCBzaXplb2YoaWRfcmVxKSk7Cit9CisKKy8qIGJhc2UgaGFuZGxpbmcgb2YgdGhlIGlwLmFjY2VzcyBwcm90b2NvbCAqLworaW50IGlwYWNjZXNzX3Jjdm1zZ19iYXNlKHN0cnVjdCBtc2diICptc2csCisJCQkgc3RydWN0IGJzY19mZCAqYmZkKQoreworCXVfaW50OF90IG1zZ190eXBlID0gKihtc2ctPmwyaCk7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKG1zZ190eXBlKSB7CisJY2FzZSBJUEFDX01TR1RfUElORzoKKwkJcmV0ID0gd3JpdGUoYmZkLT5mZCwgcG9uZywgc2l6ZW9mKHBvbmcpKTsKKwkJYnJlYWs7CisJY2FzZSBJUEFDX01TR1RfUE9ORzoKKwkJREVCVUdQKERNSSwgIlBPTkchXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBJUEFDX01TR1RfSURfQUNLOgorCQlERUJVR1AoRE1JLCAiSURfQUNLPyAtPiBBQ0shXG4iKTsKKwkJcmV0ID0gaXBhY2Nlc3Nfc2VuZF9pZF9hY2soYmZkLT5mZCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcGFjY2Vzc19yY3Ztc2coc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUsIHN0cnVjdCBtc2diICptc2csCisJCQkgICBzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IHRsdl9wYXJzZWQgdGx2cDsKKwl1X2ludDhfdCBtc2dfdHlwZSA9ICoobXNnLT5sMmgpOworCXVfaW50MTZfdCBzaXRlX2lkID0gMCwgYnRzX2lkID0gMCwgdHJ4X2lkID0gMDsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCisJLyogaGFuZGxlIGJhc2UgbWVzc2FnZXMgKi8KKwlpcGFjY2Vzc19yY3Ztc2dfYmFzZShtc2csIGJmZCk7CisKKwlzd2l0Y2ggKG1zZ190eXBlKSB7CisJY2FzZSBJUEFDX01TR1RfSURfUkVTUDoKKwkJREVCVUdQKERNSSwgIklEX1JFU1AgIik7CisJCS8qIHBhcnNlIHRhZ3MsIHNlYXJjaCBmb3IgVW5pdCBJRCAqLworCQlpcGFjY2Vzc19pZHRhZ19wYXJzZSgmdGx2cCwgKHVfaW50OF90ICopbXNnLT5sMmggKyAyLAorCQkJCSBtc2diX2wybGVuKG1zZyktMik7CisJCURFQlVHUChETUksICJcbiIpOworCisJCWlmICghVExWUF9QUkVTRU5UKCZ0bHZwLCBJUEFDX0lEVEFHX1VOSVQpKQorCQkJYnJlYWs7CisKKwkJLyogbG9va3VwIEJUUywgY3JlYXRlIHNpZ25fbGluaywgLi4uICovCisJCXBhcnNlX3VuaXRpZCgoY2hhciAqKVRMVlBfVkFMKCZ0bHZwLCBJUEFDX0lEVEFHX1VOSVQpLAorCQkJICAgICAmc2l0ZV9pZCwgJmJ0c19pZCwgJnRyeF9pZCk7CisJCWJ0cyA9IGZpbmRfYnRzX2J5X3VuaXRpZChlMWgtPmdzbW5ldCwgc2l0ZV9pZCwgYnRzX2lkKTsKKwkJaWYgKCFidHMpIHsKKwkJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgIlVuYWJsZSB0byBmaW5kIEJUUyBjb25maWd1cmF0aW9uIGZvciAiCisJCQkgICAgICAgIiAldS8ldS8ldSwgZGlzY29ubmVjdGluZ1xuIiwgc2l0ZV9pZCwgYnRzX2lkLAorCQkJCXRyeF9pZCk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlERUJVR1AoRElOUCwgIklkZW50aWZpZWQgQlRTICV1LyV1LyV1XG4iLCBzaXRlX2lkLCBidHNfaWQsIHRyeF9pZCk7CisJCWlmIChiZmQtPnByaXZfbnIgPT0gUFJJVl9PTUwpIHsKKwkJCS8qIGRyb3AgYW55IG9sZCBvbWwgY29ubmVjdGlvbiAqLworCQkJaXBhY2Nlc3NfZHJvcF9vbWwoYnRzKTsKKwkJCWJ0cy0+b21sX2xpbmsgPSBlMWlucF9zaWduX2xpbmtfY3JlYXRlKCZsaW5lLT50c1tQUklWX09NTCAtIDFdLAorCQkJCQkJICBFMUlOUF9TSUdOX09NTCwgYnRzLT5jMCwKKwkJCQkJCSAgYnRzLT5vbWxfdGVpLCAwKTsKKwkJfSBlbHNlIGlmIChiZmQtPnByaXZfbnIgPT0gUFJJVl9SU0wpIHsKKwkJCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzOworCQkJc3RydWN0IGJzY19mZCAqbmV3YmZkOworCQkJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCB0cnhfaWQpOworCisJCQkvKiBkcm9wIGFueSBvbGQgcnNsIGNvbm5lY3Rpb24gKi8KKwkJCWlwYWNjZXNzX2Ryb3BfcnNsKHRyeCk7CisKKwkJCWlmICghYnRzLT5vbWxfbGluaykgeworCQkJCWJzY191bnJlZ2lzdGVyX2ZkKGJmZCk7CisJCQkJY2xvc2UoYmZkLT5mZCk7CisJCQkJYmZkLT5mZCA9IC0xOworCQkJCXRhbGxvY19mcmVlKGJmZCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCWJmZC0+ZGF0YSA9IGxpbmUgPSBidHMtPm9tbF9saW5rLT50cy0+bGluZTsKKwkJCWUxaV90cyA9ICZsaW5lLT50c1tQUklWX1JTTCArIHRyeF9pZCAtIDFdOworCQkJbmV3YmZkID0gJmUxaV90cy0+ZHJpdmVyLmlwYWNjZXNzLmZkOworCQkJZTFpbnBfdHNfY29uZmlnKGUxaV90cywgbGluZSwgRTFJTlBfVFNfVFlQRV9TSUdOKTsKKworCQkJdHJ4LT5yc2xfbGluayA9IGUxaW5wX3NpZ25fbGlua19jcmVhdGUoZTFpX3RzLAorCQkJCQkJCUUxSU5QX1NJR05fUlNMLCB0cngsCisJCQkJCQkJdHJ4LT5yc2xfdGVpLCAwKTsKKworCQkJLyogZ2V0IHJpZCBvZiBvdXIgb2xkIHRlbXBvcmFyeSBiZmQgKi8KKwkJCW1lbWNweShuZXdiZmQsIGJmZCwgc2l6ZW9mKCpuZXdiZmQpKTsKKwkJCW5ld2JmZC0+cHJpdl9uciA9IFBSSVZfUlNMICsgdHJ4X2lkOworCQkJYnNjX3VucmVnaXN0ZXJfZmQoYmZkKTsKKwkJCWJmZC0+ZmQgPSAtMTsKKwkJCXRhbGxvY19mcmVlKGJmZCk7CisJCQlic2NfcmVnaXN0ZXJfZmQobmV3YmZkKTsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT01MX1VQCQkweDAwMDEKKyNkZWZpbmUgUlNMX1VQCQkweDAwMDIKKworLyoKKyAqIHJlYWQgb25lIGlwYSBtZXNzYWdlIGZyb20gdGhlIHNvY2tldAorICogcmV0dXJuIE5VTEwgaW4gY2FzZSBvZiBlcnJvcgorICovCitzdHJ1Y3QgbXNnYiAqaXBhY2Nlc3NfcmVhZF9tc2coc3RydWN0IGJzY19mZCAqYmZkLCBpbnQgKmVycm9yKQoreworCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jKFRTMV9BTExPQ19TSVpFLCAiQWJpcy9JUCIpOworCXN0cnVjdCBpcGFjY2Vzc19oZWFkICpoaDsKKwlpbnQgbGVuLCByZXQgPSAwOworCisJaWYgKCFtc2cpIHsKKwkJKmVycm9yID0gLUVOT01FTTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogZmlyc3QgcmVhZCBvdXIgMy1ieXRlIGhlYWRlciAqLworCWhoID0gKHN0cnVjdCBpcGFjY2Vzc19oZWFkICopIG1zZy0+ZGF0YTsKKwlyZXQgPSByZWN2KGJmZC0+ZmQsIG1zZy0+ZGF0YSwgc2l6ZW9mKCpoaCksIDApOworCWlmIChyZXQgPT0gMCkgeworCQltc2diX2ZyZWUobXNnKTsKKwkJKmVycm9yID0gcmV0OworCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UgaWYgKHJldCAhPSBzaXplb2YoKmhoKSkgeworCQlpZiAoZXJybm8gIT0gRUFHQUlOKQorCQkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAicmVjdiBlcnJvciAlZCAlc1xuIiwgcmV0LCBzdHJlcnJvcihlcnJubykpOworCQltc2diX2ZyZWUobXNnKTsKKwkJKmVycm9yID0gcmV0OworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltc2diX3B1dChtc2csIHJldCk7CisKKwkvKiB0aGVuIHJlYWQgdGUgbGVuZ3RoIGFzIHNwZWNpZmllZCBpbiBoZWFkZXIgKi8KKwltc2ctPmwyaCA9IG1zZy0+ZGF0YSArIHNpemVvZigqaGgpOworCWxlbiA9IG50b2hzKGhoLT5sZW4pOworCisJaWYgKGxlbiA8IDAgfHwgVFMxX0FMTE9DX1NJWkUgPCBsZW4gKyBzaXplb2YoKmhoKSkgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJDYW4gbm90IHJlYWQgdGhpcyBwYWNrZXQuICVkIGF2YWlsXG4iLCBsZW4pOworCQltc2diX2ZyZWUobXNnKTsKKwkJKmVycm9yID0gLUVJTzsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0ID0gcmVjdihiZmQtPmZkLCBtc2ctPmwyaCwgbGVuLCAwKTsKKwlpZiAocmV0IDwgbGVuKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgInNob3J0IHJlYWQhIEdvdCAlZCBmcm9tICVkXG4iLCByZXQsIGxlbik7CisJCW1zZ2JfZnJlZShtc2cpOworCQkqZXJyb3IgPSAtRUlPOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbXNnYl9wdXQobXNnLCByZXQpOworCisJcmV0dXJuIG1zZzsKK30KKworaW50IGlwYWNjZXNzX2Ryb3Bfb21sKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisJc3RydWN0IGUxaW5wX3RzICp0czsKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKwlzdHJ1Y3QgYnNjX2ZkICpiZmQ7CisKKwlpZiAoIWJ0cyB8fCAhYnRzLT5vbWxfbGluaykKKwkJcmV0dXJuIC0xOworCisJLyogc2VuZCBPTUwgZG93biAqLworCXRzID0gYnRzLT5vbWxfbGluay0+dHM7CisJbGluZSA9IHRzLT5saW5lOworCWUxaW5wX2V2ZW50KHRzLCBFVlRfRTFfVEVJX0ROLCBidHMtPm9tbF9saW5rLT50ZWksIGJ0cy0+b21sX2xpbmstPnNhcGkpOworCisJYmZkID0gJnRzLT5kcml2ZXIuaXBhY2Nlc3MuZmQ7CisJYnNjX3VucmVnaXN0ZXJfZmQoYmZkKTsKKwljbG9zZShiZmQtPmZkKTsKKwliZmQtPmZkID0gLTE7CisKKwkvKiBjbGVhbiB1cCBPTUwgYW5kIFJTTCAqLworCWUxaW5wX3NpZ25fbGlua19kZXN0cm95KGJ0cy0+b21sX2xpbmspOworCWJ0cy0+b21sX2xpbmsgPSBOVUxMOworCWJ0cy0+aXBfYWNjZXNzLmZsYWdzID0gMDsKKworCS8qIGRyb3AgYWxsIFJTTCBjb25uZWN0aW9ucyB0b28gKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KQorCQlpcGFjY2Vzc19kcm9wX3JzbCh0cngpOworCisJLyoga2lsbCB0aGUgRTEgbGluZSBub3cuLi4gYXMgd2UgaGF2ZSBubyBvbmUgbGVmdCB0byB1c2UgaXQgKi8KKwl0YWxsb2NfZnJlZShsaW5lKTsKKworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBpcGFjY2Vzc19kcm9wKHN0cnVjdCBlMWlucF90cyAqdHMsIHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpsaW5rOworCWludCBidHNfbnI7CisKKwlpZiAoIXRzKSB7CisJCS8qCisJCSAqIElmIHdlIGRvbid0IGhhdmUgYSBUUyB0aGlzIG1lYW5zIHRoYXQgdGhpcyBpcyBhIFJTTAorCQkgKiBjb25uZWN0aW9uIGJ1dCB3ZSBhcmUgbm90IHBhc3QgdGhlIGF1dGhlbnRpY2F0aW9uCisJCSAqIGhhbmRsaW5nIHlldC4gU28gd2UgY2FuIHNhZmVseSBkZWxldGUgdGhpcyBiZmQgYW5kCisJCSAqIHdhaXQgZm9yIGEgcmVjb25uZWN0LgorCQkgKi8KKwkJYnNjX3VucmVnaXN0ZXJfZmQoYmZkKTsKKwkJY2xvc2UoYmZkLT5mZCk7CisJCWJmZC0+ZmQgPSAtMTsKKwkJdGFsbG9jX2ZyZWUoYmZkKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGF0dGVtcHQgdG8gZmluZCBhIHNpZ25hbGxpbmcgbGluayAqLworCWlmICh0cy0+dHlwZSA9PSBFMUlOUF9UU19UWVBFX1NJR04pIHsKKwkJbGxpc3RfZm9yX2VhY2hfZW50cnkobGluaywgJnRzLT5zaWduLnNpZ25fbGlua3MsIGxpc3QpIHsKKwkJCWJ0c19uciA9IGxpbmstPnRyeC0+YnRzLT5idHNfbnI7CisJCQkvKiB3ZSBoYXZlIGlzc3VlcyBqdXN0IHJlY29ubmVjdGluZyBSTFMgc28gd2UgZHJvcCBPTUwgKi8KKwkJCWlwYWNjZXNzX2Ryb3Bfb21sKGxpbmstPnRyeC0+YnRzKTsKKwkJCXJldHVybiBidHNfbnI7CisJCX0KKwl9CisKKwkvKiBlcnJvciBjYXNlICovCisJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIGZpbmQgYSBzaWduYWxsaW5nIGxpbmsgZm9yIHRzOiAlcFxuIiwgdHMpOworCWJzY191bnJlZ2lzdGVyX2ZkKGJmZCk7CisJY2xvc2UoYmZkLT5mZCk7CisJYmZkLT5mZCA9IC0xOworCXJldHVybiAtMTsKK30KKworaW50IGlwYWNjZXNzX2Ryb3BfcnNsKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KQoreworCXN0cnVjdCBic2NfZmQgKmJmZDsKKwlzdHJ1Y3QgZTFpbnBfdHMgKnRzOworCisJaWYgKCF0cnggfHwgIXRyeC0+cnNsX2xpbmspCisJCXJldHVybiAtMTsKKworCS8qIHNlbmQgUlNMIGRvd24gKi8KKwl0cyA9IHRyeC0+cnNsX2xpbmstPnRzOworCWUxaW5wX2V2ZW50KHRzLCBFVlRfRTFfVEVJX0ROLCB0cngtPnJzbF9saW5rLT50ZWksIHRyeC0+cnNsX2xpbmstPnNhcGkpOworCisJLyogY2xvc2UgdGhlIHNvY2tldCAqLworCWJmZCA9ICZ0cy0+ZHJpdmVyLmlwYWNjZXNzLmZkOworCWJzY191bnJlZ2lzdGVyX2ZkKGJmZCk7CisJY2xvc2UoYmZkLT5mZCk7CisJYmZkLT5mZCA9IC0xOworCisJLyogZGVzdHJveSAqLworCWUxaW5wX3NpZ25fbGlua19kZXN0cm95KHRyeC0+cnNsX2xpbmspOworCXRyeC0+cnNsX2xpbmsgPSBOVUxMOworCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGhhbmRsZV90czFfcmVhZChzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUgPSBiZmQtPmRhdGE7CisJdW5zaWduZWQgaW50IHRzX25yID0gYmZkLT5wcml2X25yOworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gJmxpbmUtPnRzW3RzX25yLTFdOworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKmxpbms7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlzdHJ1Y3QgaXBhY2Nlc3NfaGVhZCAqaGg7CisJaW50IHJldCA9IDAsIGVycm9yOworCisJbXNnID0gaXBhY2Nlc3NfcmVhZF9tc2coYmZkLCAmZXJyb3IpOworCWlmICghbXNnKSB7CisJCWlmIChlcnJvciA9PSAwKSB7CisJCQlpbnQgcmV0ID0gaXBhY2Nlc3NfZHJvcChlMWlfdHMsIGJmZCk7CisJCQlpZiAocmV0ID49IDApCisJCQkJTE9HUChESU5QLCBMT0dMX05PVElDRSwgIkJUUyAldSBkaXNhcHBlYXJlZCwgZGVhZCBzb2NrZXRcbiIsCisJCQkJCXJldCk7CisJCQllbHNlCisJCQkJTE9HUChESU5QLCBMT0dMX05PVElDRSwgInVua25vd24gQlRTIGRpc2FwcGVhcmVkLCBkZWFkIHNvY2tldFxuIik7CisJCX0KKwkJcmV0dXJuIGVycm9yOworCX0KKworCURFQlVHUChETUksICJSWCAldTogJXNcbiIsIHRzX25yLCBoZXhkdW1wKG1zZ2JfbDIobXNnKSwgbXNnYl9sMmxlbihtc2cpKSk7CisKKwloaCA9IChzdHJ1Y3QgaXBhY2Nlc3NfaGVhZCAqKSBtc2ctPmRhdGE7CisJaWYgKGhoLT5wcm90byA9PSBJUEFDX1BST1RPX0lQQUNDRVNTKSB7CisJCXJldCA9IGlwYWNjZXNzX3Jjdm1zZyhsaW5lLCBtc2csIGJmZCk7CisJCWlmIChyZXQgPCAwKQorCQkJaXBhY2Nlc3NfZHJvcChlMWlfdHMsIGJmZCk7CisJCW1zZ2JfZnJlZShtc2cpOworCQlyZXR1cm4gcmV0OworCX0KKwkvKiBCSUcgRkFUIFdBUk5JTkc6IGJmZCBtaWdodCBubyBsb25nZXIgZXhpc3QgaGVyZSwgc2luY2UgaXBhY2Nlc3NfcmN2bXNnKCkKKwkgKiBtaWdodCBoYXZlIGZyZWUnZCBpdCAhISEgKi8KKworCWxpbmsgPSBlMWlucF9sb29rdXBfc2lnbl9saW5rKGUxaV90cywgaGgtPnByb3RvLCAwKTsKKwlpZiAoIWxpbmspIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAibm8gbWF0Y2hpbmcgc2lnbmFsbGluZyBsaW5rIGZvciAiCisJCQkiaGgtPnByb3RvPTB4JTAyeFxuIiwgaGgtPnByb3RvKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCXJldHVybiAtRUlPOworCX0KKwltc2ctPnRyeCA9IGxpbmstPnRyeDsKKworCXN3aXRjaCAobGluay0+dHlwZSkgeworCWNhc2UgRTFJTlBfU0lHTl9SU0w6CisJCWlmICghKG1zZy0+dHJ4LT5idHMtPmlwX2FjY2Vzcy5mbGFncyAmIChSU0xfVVAgPDwgbXNnLT50cngtPm5yKSkpIHsKKwkJCWUxaW5wX2V2ZW50KGUxaV90cywgRVZUX0UxX1RFSV9VUCwgbGluay0+dGVpLCBsaW5rLT5zYXBpKTsKKwkJCW1zZy0+dHJ4LT5idHMtPmlwX2FjY2Vzcy5mbGFncyB8PSAoUlNMX1VQIDw8IG1zZy0+dHJ4LT5ucik7CisJCX0KKwkJcmV0ID0gYWJpc19yc2xfcmN2bXNnKG1zZyk7CisJCWJyZWFrOworCWNhc2UgRTFJTlBfU0lHTl9PTUw6CisJCWlmICghKG1zZy0+dHJ4LT5idHMtPmlwX2FjY2Vzcy5mbGFncyAmIE9NTF9VUCkpIHsKKwkJCWUxaW5wX2V2ZW50KGUxaV90cywgRVZUX0UxX1RFSV9VUCwgbGluay0+dGVpLCBsaW5rLT5zYXBpKTsKKwkJCW1zZy0+dHJ4LT5idHMtPmlwX2FjY2Vzcy5mbGFncyB8PSBPTUxfVVA7CisJCX0KKwkJcmV0ID0gYWJpc19ubV9yY3Ztc2cobXNnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChESU5QLCBMT0dMX05PVElDRSwgIlVua25vd24gSVAuYWNjZXNzIHByb3RvY29sIHByb3RvPTB4JTAyeFxuIiwgaGgtPnByb3RvKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGlwYWNjZXNzX3ByZXBlbmRfaGVhZGVyKHN0cnVjdCBtc2diICptc2csIGludCBwcm90bykKK3sKKwlzdHJ1Y3QgaXBhY2Nlc3NfaGVhZCAqaGg7CisKKwkvKiBwcmVwZW5kIHRoZSBpcC5hY2Nlc3MgaGVhZGVyICovCisJaGggPSAoc3RydWN0IGlwYWNjZXNzX2hlYWQgKikgbXNnYl9wdXNoKG1zZywgc2l6ZW9mKCpoaCkpOworCWhoLT5sZW4gPSBodG9ucyhtc2ctPmxlbiAtIHNpemVvZigqaGgpKTsKKwloaC0+cHJvdG8gPSBwcm90bzsKK30KKworc3RhdGljIGludCB0c193YW50X3dyaXRlKHN0cnVjdCBlMWlucF90cyAqZTFpX3RzKQoreworCWUxaV90cy0+ZHJpdmVyLmlwYWNjZXNzLmZkLndoZW4gfD0gQlNDX0ZEX1dSSVRFOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVvdXRfdHMxX3dyaXRlKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSAoc3RydWN0IGUxaW5wX3RzICopZGF0YTsKKworCS8qIHRyaWdnZXIgd3JpdGUgb2YgdHMxLCBkdWUgdG8gdHggZGVsYXkgdGltZXIgKi8KKwl0c193YW50X3dyaXRlKGUxaV90cyk7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX3RzMV93cml0ZShzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUgPSBiZmQtPmRhdGE7CisJdW5zaWduZWQgaW50IHRzX25yID0gYmZkLT5wcml2X25yOworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gJmxpbmUtPnRzW3RzX25yLTFdOworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKnNpZ25fbGluazsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXVfaW50OF90IHByb3RvOworCWludCByZXQ7CisKKwliZmQtPndoZW4gJj0gfkJTQ19GRF9XUklURTsKKworCS8qIGdldCB0aGUgbmV4dCBtc2cgZm9yIHRoaXMgdGltZXNsb3QgKi8KKwltc2cgPSBlMWlucF90eF90cyhlMWlfdHMsICZzaWduX2xpbmspOworCWlmICghbXNnKSB7CisJCS8qIG5vIG1lc3NhZ2UgYWZ0ZXIgdHggZGVsYXkgdGltZXIgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoIChzaWduX2xpbmstPnR5cGUpIHsKKwljYXNlIEUxSU5QX1NJR05fT01MOgorCQlwcm90byA9IElQQUNfUFJPVE9fT01MOworCQlicmVhazsKKwljYXNlIEUxSU5QX1NJR05fUlNMOgorCQlwcm90byA9IElQQUNfUFJPVE9fUlNMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQltc2diX2ZyZWUobXNnKTsKKwkJYmZkLT53aGVuIHw9IEJTQ19GRF9XUklURTsgLyogY29tZSBiYWNrIGZvciBtb3JlIG1zZyAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltc2ctPmwyaCA9IG1zZy0+ZGF0YTsKKwlpcGFjY2Vzc19wcmVwZW5kX2hlYWRlcihtc2csIHNpZ25fbGluay0+dGVpKTsKKworCURFQlVHUChETUksICJUWCAldTogJXNcbiIsIHRzX25yLCBoZXhkdW1wKG1zZy0+bDJoLCBtc2diX2wybGVuKG1zZykpKTsKKworCXJldCA9IHNlbmQoYmZkLT5mZCwgbXNnLT5kYXRhLCBtc2ctPmxlbiwgMCk7CisJbXNnYl9mcmVlKG1zZyk7CisKKwkvKiBzZXQgdHggZGVsYXkgdGltZXIgZm9yIG5leHQgZXZlbnQgKi8KKwllMWlfdHMtPnNpZ24udHhfdGltZXIuY2IgPSB0aW1lb3V0X3RzMV93cml0ZTsKKwllMWlfdHMtPnNpZ24udHhfdGltZXIuZGF0YSA9IGUxaV90czsKKworCS8qIFJlZHVjaW5nIHRoaXMgbWlnaHQgYnJlYWsgdGhlIG5hbm9CVFMgOTAwIGluaXQuICovCisJYnNjX3NjaGVkdWxlX3RpbWVyKCZlMWlfdHMtPnNpZ24udHhfdGltZXIsIDAsIDEwMDAwMCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBjYWxsYmFjayBmcm9tIHNlbGVjdC5jIGluIGNhc2Ugb25lIG9mIHRoZSBmZCdzIGNhbiBiZSByZWFkL3dyaXR0ZW4gKi8KK3N0YXRpYyBpbnQgaXBhY2Nlc3NfZmRfY2Ioc3RydWN0IGJzY19mZCAqYmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSA9IGJmZC0+ZGF0YTsKKwl1bnNpZ25lZCBpbnQgdHNfbnIgPSBiZmQtPnByaXZfbnI7CisJdW5zaWduZWQgaW50IGlkeCA9IHRzX25yLTE7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHM7CisJaW50IHJjID0gMDsKKworCS8qIEluIGNhc2Ugb2YgZWFybHkgUlNMIHdlIG1pZ2h0IG5vdCB5ZXQgaGF2ZSBhIGxpbmUgKi8KKworCWlmIChsaW5lKQorIAkJZTFpX3RzID0gJmxpbmUtPnRzW2lkeF07CisKKwlpZiAoIWxpbmUgfHwgZTFpX3RzLT50eXBlID09IEUxSU5QX1RTX1RZUEVfU0lHTikgeworCQlpZiAod2hhdCAmIEJTQ19GRF9SRUFEKQorCQkJcmMgPSBoYW5kbGVfdHMxX3JlYWQoYmZkKTsKKwkJaWYgKHdoYXQgJiBCU0NfRkRfV1JJVEUpCisJCQlyYyA9IGhhbmRsZV90czFfd3JpdGUoYmZkKTsKKwl9IGVsc2UKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAidW5rbm93biBFMSBUUyB0eXBlICV1XG4iLCBlMWlfdHMtPnR5cGUpOworCisJcmV0dXJuIHJjOworfQorCitzdHJ1Y3QgZTFpbnBfZHJpdmVyIGlwYWNjZXNzX2RyaXZlciA9IHsKKwkubmFtZSA9ICJpcC5hY2Nlc3MiLAorCS53YW50X3dyaXRlID0gdHNfd2FudF93cml0ZSwKK307CisKKy8qIGNhbGxiYWNrIG9mIHRoZSBPTUwgbGlzdGVuaW5nIGZpbGVkZXNjcmlwdG9yICovCitzdGF0aWMgaW50IGxpc3Rlbl9mZF9jYihzdHJ1Y3QgYnNjX2ZkICpsaXN0ZW5fYmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwlpbnQgcmV0OworCWludCBpZHggPSAwOworCWludCBpOworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzOworCXN0cnVjdCBic2NfZmQgKmJmZDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2E7CisJc29ja2xlbl90IHNhX2xlbiA9IHNpemVvZihzYSk7CisKKwlpZiAoISh3aGF0ICYgQlNDX0ZEX1JFQUQpKQorCQlyZXR1cm4gMDsKKworCXJldCA9IGFjY2VwdChsaXN0ZW5fYmZkLT5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2EsICZzYV9sZW4pOworCWlmIChyZXQgPCAwKSB7CisJCXBlcnJvcigiYWNjZXB0Iik7CisJCXJldHVybiByZXQ7CisJfQorCUxPR1AoRElOUCwgTE9HTF9OT1RJQ0UsICJhY2NlcHQoKWVkIG5ldyBPTUwgbGluayBmcm9tICVzXG4iLAorCQlpbmV0X250b2Eoc2Euc2luX2FkZHIpKTsKKworCWxpbmUgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBlMWlucF9saW5lKTsKKwlpZiAoIWxpbmUpIHsKKwkJY2xvc2UocmV0KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWxpbmUtPmRyaXZlciA9ICZpcGFjY2Vzc19kcml2ZXI7CisJLy9saW5lLT5kcml2ZXJfZGF0YSA9IGUxaDsKKwkvKiBjcmVhdGUgdmlycnR1YWwgRTEgdGltZXNsb3RzIGZvciBzaWduYWxsaW5nICovCisJZTFpbnBfdHNfY29uZmlnKCZsaW5lLT50c1sxLTFdLCBsaW5lLCBFMUlOUF9UU19UWVBFX1NJR04pOworCisJLyogaW5pdGlhbGl6ZSB0aGUgZmRzICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobGluZS0+dHMpOyArK2kpCisJCWxpbmUtPnRzW2ldLmRyaXZlci5pcGFjY2Vzcy5mZC5mZCA9IC0xOworCisJZTFpX3RzID0gJmxpbmUtPnRzW2lkeF07CisKKwliZmQgPSAmZTFpX3RzLT5kcml2ZXIuaXBhY2Nlc3MuZmQ7CisJYmZkLT5mZCA9IHJldDsKKwliZmQtPmRhdGEgPSBsaW5lOworCWJmZC0+cHJpdl9uciA9IFBSSVZfT01MOworCWJmZC0+Y2IgPSBpcGFjY2Vzc19mZF9jYjsKKwliZmQtPndoZW4gPSBCU0NfRkRfUkVBRDsKKwlyZXQgPSBic2NfcmVnaXN0ZXJfZmQoYmZkKTsKKwlpZiAocmV0IDwgMCkgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJjb3VsZCBub3QgcmVnaXN0ZXIgRkRcbiIpOworCQljbG9zZShiZmQtPmZkKTsKKwkJdGFsbG9jX2ZyZWUobGluZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogUmVxdWVzdCBJRC4gRklYTUU6IHJlcXVlc3QgTE9DQVRJT04sIEhXL1NXIFZFcnNpb24sIFVuaXQgTmFtZSwgU2Vybm8gKi8KKwlyZXQgPSBpcGFjY2Vzc19zZW5kX2lkX3JlcShiZmQtPmZkKTsKKworICAgICAgICByZXR1cm4gcmV0OworCS8vcmV0dXJuIGUxaW5wX2xpbmVfcmVnaXN0ZXIobGluZSk7Cit9CisKK3N0YXRpYyBpbnQgcnNsX2xpc3Rlbl9mZF9jYihzdHJ1Y3QgYnNjX2ZkICpsaXN0ZW5fYmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2E7CisJc29ja2xlbl90IHNhX2xlbiA9IHNpemVvZihzYSk7CisJc3RydWN0IGJzY19mZCAqYmZkOworCWludCByZXQ7CisKKwlpZiAoISh3aGF0ICYgQlNDX0ZEX1JFQUQpKQorCQlyZXR1cm4gMDsKKworCWJmZCA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGJzY19mZCk7CisJaWYgKCFiZmQpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogU29tZSBCVFMgaGFzIGNvbm5lY3RlZCB0byB1cywgYnV0IHdlIGRvbid0IGtub3cgeWV0IHdoaWNoIGxpbmUKKwkgKiAoYXMgY3JlYXRlZCBieSB0aGUgT01MIGxpbmspIHRvIGFzc29jaWF0ZSBpdCB3aXRoLiAgVGh1cywgd2UKKwkgKiBhbGxvY2F0ZSBhIHRlbXBvcmFyeSBiZmQgdW50aWwgd2UgaGF2ZSByZWNlaXZlZCBJRCBmcm9tIEJUUyAqLworCisJYmZkLT5mZCA9IGFjY2VwdChsaXN0ZW5fYmZkLT5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2EsICZzYV9sZW4pOworCWlmIChiZmQtPmZkIDwgMCkgeworCQlwZXJyb3IoImFjY2VwdCIpOworCQlyZXR1cm4gYmZkLT5mZDsKKwl9CisJTE9HUChESU5QLCBMT0dMX05PVElDRSwgImFjY2VwdCgpZWQgbmV3IFJTTCBsaW5rIGZyb20gJXNcbiIsIGluZXRfbnRvYShzYS5zaW5fYWRkcikpOworCWJmZC0+cHJpdl9uciA9IFBSSVZfUlNMOworCWJmZC0+Y2IgPSBpcGFjY2Vzc19mZF9jYjsKKwliZmQtPndoZW4gPSBCU0NfRkRfUkVBRDsKKwlyZXQgPSBic2NfcmVnaXN0ZXJfZmQoYmZkKTsKKwlpZiAocmV0IDwgMCkgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJjb3VsZCBub3QgcmVnaXN0ZXIgRkRcbiIpOworCQljbG9zZShiZmQtPmZkKTsKKwkJdGFsbG9jX2ZyZWUoYmZkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJLyogUmVxdWVzdCBJRC4gRklYTUU6IHJlcXVlc3QgTE9DQVRJT04sIEhXL1NXIFZFcnNpb24sIFVuaXQgTmFtZSwgU2Vybm8gKi8KKwlyZXQgPSB3cml0ZShiZmQtPmZkLCBpZF9yZXEsIHNpemVvZihpZF9yZXEpKTsKKworCXJldHVybiAwOworfQorCisvKiBBY3RpdmVseSBjb25uZWN0IHRvIGEgQlRTLiAgQ3VycmVudGx5IHVzZWQgYnkgaXBhY2Nlc3MtY29uZmlnLmMgKi8KK2ludCBpcGFjY2Vzc19jb25uZWN0KHN0cnVjdCBlMWlucF9saW5lICpsaW5lLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNhKQoreworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gJmxpbmUtPnRzWzBdOworCXN0cnVjdCBic2NfZmQgKmJmZCA9ICZlMWlfdHMtPmRyaXZlci5pcGFjY2Vzcy5mZDsKKwlpbnQgcmV0LCBvbiA9IDE7CisKKwliZmQtPmZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCk7CisJYmZkLT5jYiA9IGlwYWNjZXNzX2ZkX2NiOworCWJmZC0+d2hlbiA9IEJTQ19GRF9SRUFEIHwgQlNDX0ZEX1dSSVRFOworCWJmZC0+ZGF0YSA9IGxpbmU7CisJYmZkLT5wcml2X25yID0gUFJJVl9PTUw7CisKKwlpZiAoYmZkLT5mZCA8IDApIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiY291bGQgbm90IGNyZWF0ZSBUQ1Agc29ja2V0LlxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXNldHNvY2tvcHQoYmZkLT5mZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmb24sIHNpemVvZihvbikpOworCisJcmV0ID0gY29ubmVjdChiZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyICopIHNhLCBzaXplb2YoKnNhKSk7CisJaWYgKHJldCA8IDApIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiY291bGQgbm90IGNvbm5lY3Qgc29ja2V0XG4iKTsKKwkJY2xvc2UoYmZkLT5mZCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gYnNjX3JlZ2lzdGVyX2ZkKGJmZCk7CisJaWYgKHJldCA8IDApIHsKKwkJY2xvc2UoYmZkLT5mZCk7CisJCXJldHVybiByZXQ7CisJfQorCQorCWxpbmUtPmRyaXZlciA9ICZpcGFjY2Vzc19kcml2ZXI7CisKKyAgICAgICAgcmV0dXJuIHJldDsKKwkvL3JldHVybiBlMWlucF9saW5lX3JlZ2lzdGVyKGxpbmUpOworfQorCitpbnQgaXBhY2Nlc3Nfc2V0dXAoc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQpCit7CisJaW50IHJldDsKKworCS8qIHJlZ2lzdGVyIHRoZSBkcml2ZXIgd2l0aCB0aGUgY29yZSAqLworCS8qIEZJWE1FOiBkbyB0aGlzIGluIHRoZSBwbHVnaW4gaW5pdGlhbGl6ZXIgZnVuY3Rpb24gKi8KKwlyZXQgPSBlMWlucF9kcml2ZXJfcmVnaXN0ZXIoJmlwYWNjZXNzX2RyaXZlcik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWUxaCA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGlhX2UxX2hhbmRsZSk7CisJaWYgKCFlMWgpCisJCXJldHVybiAtRU5PTUVNOworCisJZTFoLT5nc21uZXQgPSBnc21uZXQ7CisKKwkvKiBMaXN0ZW4gZm9yIE9NTCBjb25uZWN0aW9ucyAqLworCXJldCA9IG1ha2Vfc29jaygmZTFoLT5saXN0ZW5fZmQsIElQUFJPVE9fVENQLCAwLCBJUEFfVENQX1BPUlRfT01MLAorCQkJbGlzdGVuX2ZkX2NiKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIExpc3RlbiBmb3IgUlNMIGNvbm5lY3Rpb25zICovCisJcmV0ID0gbWFrZV9zb2NrKCZlMWgtPnJzbF9saXN0ZW5fZmQsIElQUFJPVE9fVENQLCAwLAorCQkJSVBBX1RDUF9QT1JUX1JTTCwgcnNsX2xpc3Rlbl9mZF9jYik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvaW5wdXQvbWlzZG4uYyBiL29wZW5ic2Mvc3JjL2lucHV0L21pc2RuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNiMDFmMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2lucHV0L21pc2RuLmMKQEAgLTAsMCArMSw1MzYgQEAKKy8qIE9wZW5CU0MgQWJpcyBpbnB1dCBkcml2ZXIgZm9yIG1JU0ROdXNlciAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy9mY250bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxtSVNETmlmLmg+CisKKy8vI2RlZmluZSBBRl9DT01QQVRJQklMSVRZX0ZVTkMKKy8vI2luY2x1ZGUgPGNvbXBhdF9hZl9pc2RuLmg+CisjaWZuZGVmIEFGX0lTRE4KKyNkZWZpbmUgQUZfSVNETiAzNAorI2RlZmluZSBQRl9JU0ROIEFGX0lTRE4KKyNlbmRpZgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc3ViY2hhbl9kZW11eC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZTFfaW5wdXQuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKworI2RlZmluZSBUUzFfQUxMT0NfU0laRQkzMDAKKworc3RydWN0IHByaW1fbmFtZSB7CisJdW5zaWduZWQgaW50IHByaW07CisJY29uc3QgY2hhciAqbmFtZTsKK307CisKK2NvbnN0IHN0cnVjdCBwcmltX25hbWUgcHJpbV9uYW1lc1tdID0geworCXsgUEhfQ09OVFJPTF9JTkQsICJQSF9DT05UUk9MX0lORCIgfSwKKwl7IFBIX0RBVEFfSU5ELCAiUEhfREFUQV9JTkQiIH0sCisJeyBQSF9EQVRBX0NORiwgIlBIX0RBVEFfQ05GIiB9LAorCXsgUEhfQUNUSVZBVEVfSU5ELCAiUEhfQUNUSVZBVEVfSU5EIiB9LAorCXsgRExfRVNUQUJMSVNIX0lORCwgIkRMX0VTVEFCTElTSF9JTkQiIH0sCisJeyBETF9FU1RBQkxJU0hfQ05GLCAiRExfRVNUQUJMSVNIX0NORiIgfSwKKwl7IERMX1JFTEVBU0VfSU5ELCAiRExfUkVMRUFTRV9JTkQiIH0sCisJeyBETF9SRUxFQVNFX0NORiwgIkRMX1JFTEVBU0VfQ05GIiB9LAorCXsgRExfREFUQV9JTkQsICJETF9EQVRBX0lORCIgfSwKKwl7IERMX1VOSVREQVRBX0lORCwgIkRMX1VOSVREQVRBX0lORCIgfSwKKwl7IERMX0lORk9STUFUSU9OX0lORCwgIkRMX0lORk9STUFUSU9OX0lORCIgfSwKKwl7IE1QSF9BQ1RJVkFURV9JTkQsICJNUEhfQUNUSVZBVEVfSU5EIiB9LAorCXsgTVBIX0RFQUNUSVZBVEVfSU5ELCAiTVBIX0RFQUNUSVZBVEVfSU5EIiB9LAorfTsKKworY29uc3QgY2hhciAqZ2V0X3ByaW1fbmFtZSh1bnNpZ25lZCBpbnQgcHJpbSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHByaW1fbmFtZXMpOyBpKyspIHsKKwkJaWYgKHByaW1fbmFtZXNbaV0ucHJpbSA9PSBwcmltKQorCQkJcmV0dXJuIHByaW1fbmFtZXNbaV0ubmFtZTsKKwl9CisKKwlyZXR1cm4gIlVOS05PV04iOworfQorCitzdGF0aWMgaW50IGhhbmRsZV90czFfcmVhZChzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUgPSBiZmQtPmRhdGE7CisJdW5zaWduZWQgaW50IHRzX25yID0gYmZkLT5wcml2X25yOworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gJmxpbmUtPnRzW3RzX25yLTFdOworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKmxpbms7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2MoVFMxX0FMTE9DX1NJWkUsICJtSVNETiBUUzEiKTsKKwlzdHJ1Y3Qgc29ja2FkZHJfbUlTRE4gbDJhZGRyOworCXN0cnVjdCBtSVNETmhlYWQgKmhoOworCXNvY2tsZW5fdCBhbGVuOworCWludCByZXQ7CisKKwlpZiAoIW1zZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwloaCA9IChzdHJ1Y3QgbUlTRE5oZWFkICopIG1zZy0+ZGF0YTsKKworCWFsZW4gPSBzaXplb2YobDJhZGRyKTsKKwlyZXQgPSByZWN2ZnJvbShiZmQtPmZkLCBtc2ctPmRhdGEsIDMwMCwgMCwKKwkJICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmwyYWRkciwgJmFsZW4pOworCWlmIChyZXQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAicmVjdmZyb20gZXJyb3IgICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChhbGVuICE9IHNpemVvZihsMmFkZHIpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXMgZXJyb3IgbGVuXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1zZ2JfcHV0KG1zZywgcmV0KTsKKworCURFQlVHUChETUksICJhbGVuID0lZCwgZGV2KCVkKSBjaGFubmVsKCVkKSBzYXBpKCVkKSB0ZWkoJWQpXG4iLAorCQlhbGVuLCBsMmFkZHIuZGV2LCBsMmFkZHIuY2hhbm5lbCwgbDJhZGRyLnNhcGksIGwyYWRkci50ZWkpOworCisJREVCVUdQKERNSSwgIjw9IGxlbiA9ICVkLCBwcmltKDB4JXgpIGlkKDB4JXgpOiAlc1xuIiwKKwkJcmV0LCBoaC0+cHJpbSwgaGgtPmlkLCBnZXRfcHJpbV9uYW1lKGhoLT5wcmltKSk7CisKKwlzd2l0Y2ggKGhoLT5wcmltKSB7CisJY2FzZSBETF9JTkZPUk1BVElPTl9JTkQ6CisJCS8qIG1JU0ROIHRlbGxzIHVzIHdoaWNoIGNoYW5uZWwgbnVtYmVyIGlzIGFsbG9jYXRlZCBmb3IgdGhpcworCQkgKiB0dXBsZSBvZiAoU0FQSSwgVEVJKS4gKi8KKwkJREVCVUdQKERNSSwgIkRMX0lORk9STUFUSU9OX0lORDogdXNlIGNoYW5uZWwoJWQpIHNhcGkoJWQpIHRlaSglZCkgZm9yIG5vd1xuIiwKKwkJCWwyYWRkci5jaGFubmVsLCBsMmFkZHIuc2FwaSwgbDJhZGRyLnRlaSk7CisJCWxpbmsgPSBlMWlucF9sb29rdXBfc2lnbl9saW5rKGUxaV90cywgbDJhZGRyLnRlaSwgbDJhZGRyLnNhcGkpOworCQlpZiAoIWxpbmspIHsKKwkJCURFQlVHUEMoRE1JLCAibUlTRE4gbWVzc2FnZSBmb3IgdW5rbm93biBzaWduX2xpbmtcbiIpOworCQkJbXNnYl9mcmVlKG1zZyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkvKiBzYXZlIHRoZSBjaGFubmVsIG51bWJlciBpbiB0aGUgZHJpdmVyIHByaXZhdGUgc3RydWN0ICovCisJCWxpbmstPmRyaXZlci5taXNkbi5jaGFubmVsID0gbDJhZGRyLmNoYW5uZWw7CisJCWJyZWFrOworCWNhc2UgRExfRVNUQUJMSVNIX0lORDoKKwkJREVCVUdQKERNSSwgIkRMX0VTVEFCTElTSF9JTkQ6IGNoYW5uZWwoJWQpIHNhcGkoJWQpIHRlaSglZClcbiIsCisJCWwyYWRkci5jaGFubmVsLCBsMmFkZHIuc2FwaSwgbDJhZGRyLnRlaSk7CisJCXJldCA9IGUxaW5wX2V2ZW50KGUxaV90cywgRVZUX0UxX1RFSV9VUCwgbDJhZGRyLnRlaSwgbDJhZGRyLnNhcGkpOworCQlicmVhazsKKwljYXNlIERMX1JFTEVBU0VfSU5EOgorCQlERUJVR1AoRE1JLCAiRExfUkVMRUFTRV9JTkQ6IGNoYW5uZWwoJWQpIHNhcGkoJWQpIHRlaSglZClcbiIsCisJCWwyYWRkci5jaGFubmVsLCBsMmFkZHIuc2FwaSwgbDJhZGRyLnRlaSk7CisJCXJldCA9IGUxaW5wX2V2ZW50KGUxaV90cywgRVZUX0UxX1RFSV9ETiwgbDJhZGRyLnRlaSwgbDJhZGRyLnNhcGkpOworCQlicmVhazsKKwljYXNlIERMX0RBVEFfSU5EOgorCWNhc2UgRExfVU5JVERBVEFfSU5EOgorCQltc2ctPmwyaCA9IG1zZy0+ZGF0YSArIE1JU0ROX0hFQURFUl9MRU47CisJCURFQlVHUChETUksICJSWDogJXNcbiIsIGhleGR1bXAobXNnYl9sMihtc2cpLCByZXQgLSBNSVNETl9IRUFERVJfTEVOKSk7CisJCXJldCA9IGUxaW5wX3J4X3RzKGUxaV90cywgbXNnLCBsMmFkZHIudGVpLCBsMmFkZHIuc2FwaSk7CisJCWJyZWFrOworCWNhc2UgUEhfQUNUSVZBVEVfSU5EOgorCQlERUJVR1AoRE1JLCAiUEhfQUNUSVZBVEVfSU5EOiBjaGFubmVsKCVkKSBzYXBpKCVkKSB0ZWkoJWQpXG4iLAorCQlsMmFkZHIuY2hhbm5lbCwgbDJhZGRyLnNhcGksIGwyYWRkci50ZWkpOworCQlicmVhazsKKwljYXNlIFBIX0RFQUNUSVZBVEVfSU5EOgorCQlERUJVR1AoRE1JLCAiUEhfREVBQ1RJVkFURV9JTkQ6IGNoYW5uZWwoJWQpIHNhcGkoJWQpIHRlaSglZClcbiIsCisJCWwyYWRkci5jaGFubmVsLCBsMmFkZHIuc2FwaSwgbDJhZGRyLnRlaSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRzX3dhbnRfd3JpdGUoc3RydWN0IGUxaW5wX3RzICplMWlfdHMpCit7CisJLyogV2UgbmV2ZXIgaW5jbHVkZSB0aGUgbUlTRE4gQi1DaGFubmVsIEZEIGludG8gdGhlCisJICogd3JpdGVzZXQsIHNpbmNlIGl0IGRvZXNuJ3Qgc3VwcG9ydCBwb2xsKCkgYmFzZWQKKwkgKiB3cml0ZSBmbG93IGNvbnRyb2wgKi8JCQorCWlmIChlMWlfdHMtPnR5cGUgPT0gRTFJTlBfVFNfVFlQRV9UUkFVKQorCQlyZXR1cm4gMDsKKworCWUxaV90cy0+ZHJpdmVyLm1pc2RuLmZkLndoZW4gfD0gQlNDX0ZEX1dSSVRFOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVvdXRfdHMxX3dyaXRlKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSAoc3RydWN0IGUxaW5wX3RzICopZGF0YTsKKworCS8qIHRyaWdnZXIgd3JpdGUgb2YgdHMxLCBkdWUgdG8gdHggZGVsYXkgdGltZXIgKi8KKwl0c193YW50X3dyaXRlKGUxaV90cyk7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX3RzMV93cml0ZShzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUgPSBiZmQtPmRhdGE7CisJdW5zaWduZWQgaW50IHRzX25yID0gYmZkLT5wcml2X25yOworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gJmxpbmUtPnRzW3RzX25yLTFdOworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKnNpZ25fbGluazsKKwlzdHJ1Y3Qgc29ja2FkZHJfbUlTRE4gc2E7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlzdHJ1Y3QgbUlTRE5oZWFkICpoaDsKKwl1X2ludDhfdCAqbDJfZGF0YTsKKwlpbnQgcmV0OworCisJYmZkLT53aGVuICY9IH5CU0NfRkRfV1JJVEU7CisKKwkvKiBnZXQgdGhlIG5leHQgbXNnIGZvciB0aGlzIHRpbWVzbG90ICovCisJbXNnID0gZTFpbnBfdHhfdHMoZTFpX3RzLCAmc2lnbl9saW5rKTsKKwlpZiAoIW1zZykgeworCQkvKiBubyBtZXNzYWdlIGFmdGVyIHR4IGRlbGF5IHRpbWVyICovCisJCXJldHVybiAwOworCX0KKworCWwyX2RhdGEgPSBtc2ctPmRhdGE7CisKKwkvKiBwcmVwZW5kIHRoZSBtSVNETmhlYWQgKi8KKwloaCA9IChzdHJ1Y3QgbUlTRE5oZWFkICopIG1zZ2JfcHVzaChtc2csIHNpemVvZigqaGgpKTsKKwloaC0+cHJpbSA9IERMX0RBVEFfUkVROworCisJREVCVUdQKERNSSwgIlRYIFRFSSglZCkgU0FQSSglZCk6ICVzXG4iLCBzaWduX2xpbmstPnRlaSwKKwkJc2lnbl9saW5rLT5zYXBpLCBoZXhkdW1wKGwyX2RhdGEsIG1zZy0+bGVuIC0gTUlTRE5fSEVBREVSX0xFTikpOworCisJLyogY29uc3RydWN0IHRoZSBzb2NrYWRkciAqLworCXNhLmZhbWlseSA9IEFGX0lTRE47CisJc2Euc2FwaSA9IHNpZ25fbGluay0+c2FwaTsKKwlzYS5kZXYgPSBzaWduX2xpbmstPnRlaTsKKwlzYS5jaGFubmVsID0gc2lnbl9saW5rLT5kcml2ZXIubWlzZG4uY2hhbm5lbDsKKworCXJldCA9IHNlbmR0byhiZmQtPmZkLCBtc2ctPmRhdGEsIG1zZy0+bGVuLCAwLAorCQkgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2EsIHNpemVvZihzYSkpOworCWlmIChyZXQgPCAwKQorCQlmcHJpbnRmKHN0ZGVyciwgIiVzIHNlbmR0byBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCW1zZ2JfZnJlZShtc2cpOworCisJLyogc2V0IHR4IGRlbGF5IHRpbWVyIGZvciBuZXh0IGV2ZW50ICovCisJZTFpX3RzLT5zaWduLnR4X3RpbWVyLmNiID0gdGltZW91dF90czFfd3JpdGU7CisJZTFpX3RzLT5zaWduLnR4X3RpbWVyLmRhdGEgPSBlMWlfdHM7CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZlMWlfdHMtPnNpZ24udHhfdGltZXIsIDAsIDUwMDAwKTsKKworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgQkNIQU5fVFhfR1JBTgkxNjAKKy8qIHdyaXRlIHRvIGEgQiBjaGFubmVsIFRTICovCitzdGF0aWMgaW50IGhhbmRsZV90c1hfd3JpdGUoc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lID0gYmZkLT5kYXRhOworCXVuc2lnbmVkIGludCB0c19uciA9IGJmZC0+cHJpdl9ucjsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9ICZsaW5lLT50c1t0c19uci0xXTsKKwlzdHJ1Y3QgbUlTRE5oZWFkICpoaDsKKwl1X2ludDhfdCB0eF9idWZbQkNIQU5fVFhfR1JBTiArIHNpemVvZigqaGgpXTsKKwlzdHJ1Y3Qgc3ViY2hfbXV4ICpteCA9ICZlMWlfdHMtPnRyYXUubXV4OworCWludCByZXQ7CisKKwloaCA9IChzdHJ1Y3QgbUlTRE5oZWFkICopIHR4X2J1ZjsKKwloaC0+cHJpbSA9IFBIX0RBVEFfUkVROworCisJc3ViY2hhbl9tdXhfb3V0KG14LCB0eF9idWYrc2l6ZW9mKCpoaCksIEJDSEFOX1RYX0dSQU4pOworCisJREVCVUdQKERNSUIsICJCQ0hBTiBUWDogJXNcbiIsCisJCWhleGR1bXAodHhfYnVmK3NpemVvZigqaGgpLCBCQ0hBTl9UWF9HUkFOKSk7CisKKwlyZXQgPSBzZW5kKGJmZC0+ZmQsIHR4X2J1Ziwgc2l6ZW9mKCpoaCkgKyBCQ0hBTl9UWF9HUkFOLCAwKTsKKwlpZiAocmV0IDwgc2l6ZW9mKCpoaCkgKyBCQ0hBTl9UWF9HUkFOKQorCQlERUJVR1AoRE1JQiwgInNlbmQgcmV0dXJucyAlZCBpbnN0ZWFkIG9mICV6dVxuIiwgcmV0LAorCQkJc2l6ZW9mKCpoaCkgKyBCQ0hBTl9UWF9HUkFOKTsKKworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgVFNYX0FMTE9DX1NJWkUgNDA5NgorLyogRklYTUU6IHJlYWQgZnJvbSBhIEIgY2hhbm5lbCBUUyAqLworc3RhdGljIGludCBoYW5kbGVfdHNYX3JlYWQoc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lID0gYmZkLT5kYXRhOworCXVuc2lnbmVkIGludCB0c19uciA9IGJmZC0+cHJpdl9ucjsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9ICZsaW5lLT50c1t0c19uci0xXTsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvYyhUU1hfQUxMT0NfU0laRSwgIm1JU0ROIFRTeCIpOworCXN0cnVjdCBtSVNETmhlYWQgKmhoOworCWludCByZXQ7CisKKwlpZiAoIW1zZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwloaCA9IChzdHJ1Y3QgbUlTRE5oZWFkICopIG1zZy0+ZGF0YTsKKworCXJldCA9IHJlY3YoYmZkLT5mZCwgbXNnLT5kYXRhLCBUU1hfQUxMT0NfU0laRSwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJyZWN2ZnJvbSBlcnJvciAgJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiByZXQ7CisJfQorCisJbXNnYl9wdXQobXNnLCByZXQpOworCisJaWYgKGhoLT5wcmltICE9IFBIX0NPTlRST0xfSU5EKQorCQlERUJVR1AoRE1JQiwgIjw9IEJDSEFOIGxlbiA9ICVkLCBwcmltKDB4JXgpIGlkKDB4JXgpOiAlc1xuIiwKKwkJCXJldCwgaGgtPnByaW0sIGhoLT5pZCwgZ2V0X3ByaW1fbmFtZShoaC0+cHJpbSkpOworCisJc3dpdGNoIChoaC0+cHJpbSkgeworCWNhc2UgUEhfREFUQV9JTkQ6CisJCW1zZy0+bDJoID0gbXNnLT5kYXRhICsgTUlTRE5fSEVBREVSX0xFTjsKKwkJREVCVUdQKERNSUIsICJCQ0hBTiBSWDogJXNcbiIsCisJCQloZXhkdW1wKG1zZ2JfbDIobXNnKSwgcmV0IC0gTUlTRE5fSEVBREVSX0xFTikpOworCQlyZXQgPSBlMWlucF9yeF90cyhlMWlfdHMsIG1zZywgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgUEhfQUNUSVZBVEVfSU5EOgorCWNhc2UgUEhfREFUQV9DTkY6CisJCS8qIHBoeXNpY2FsIGxheWVyIGluZGljYXRlcyB0aGF0IGRhdGEgaGFzIGJlZW4gc2VudCwKKwkJICogd2UgdGh1cyBjYW4gc2VuZCBzb21lIG1vcmUgZGF0YSAqLworCQlyZXQgPSBoYW5kbGVfdHNYX3dyaXRlKGJmZCk7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCS8qIEZJWE1FOiB3aHkgZG8gd2UgZnJlZSBzaWduYWxsaW5nIG1zZ3MgaW4gdGhlIGNhbGxlciwgYW5kIHRyYXUgbm90PyAqLworCW1zZ2JfZnJlZShtc2cpOworCisJcmV0dXJuIHJldDsKK30KKworLyogY2FsbGJhY2sgZnJvbSBzZWxlY3QuYyBpbiBjYXNlIG9uZSBvZiB0aGUgZmQncyBjYW4gYmUgcmVhZC93cml0dGVuICovCitzdGF0aWMgaW50IG1pc2RuX2ZkX2NiKHN0cnVjdCBic2NfZmQgKmJmZCwgdW5zaWduZWQgaW50IHdoYXQpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUgPSBiZmQtPmRhdGE7CisJdW5zaWduZWQgaW50IHRzX25yID0gYmZkLT5wcml2X25yOworCXVuc2lnbmVkIGludCBpZHggPSB0c19uci0xOworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gJmxpbmUtPnRzW2lkeF07CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoZTFpX3RzLT50eXBlKSB7CisJY2FzZSBFMUlOUF9UU19UWVBFX1NJR046CisJCWlmICh3aGF0ICYgQlNDX0ZEX1JFQUQpCisJCQlyYyA9IGhhbmRsZV90czFfcmVhZChiZmQpOworCQlpZiAod2hhdCAmIEJTQ19GRF9XUklURSkKKwkJCXJjID0gaGFuZGxlX3RzMV93cml0ZShiZmQpOworCQlicmVhazsKKwljYXNlIEUxSU5QX1RTX1RZUEVfVFJBVToKKwkJaWYgKHdoYXQgJiBCU0NfRkRfUkVBRCkKKwkJCXJjID0gaGFuZGxlX3RzWF9yZWFkKGJmZCk7CisJCS8qIFdlIG5ldmVyIGluY2x1ZGUgdGhlIG1JU0ROIEItQ2hhbm5lbCBGRCBpbnRvIHRoZQorCQkgKiB3cml0ZXNldCwgc2luY2UgaXQgZG9lc24ndCBzdXBwb3J0IHBvbGwoKSBiYXNlZAorCQkgKiB3cml0ZSBmbG93IGNvbnRyb2wgKi8JCQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlmcHJpbnRmKHN0ZGVyciwgInVua25vd24gRTEgVFMgdHlwZSAldVxuIiwgZTFpX3RzLT50eXBlKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGFjdGl2YXRlX2JjaGFuKHN0cnVjdCBlMWlucF9saW5lICpsaW5lLCBpbnQgdHMsIGludCBhY3QpCit7CisJc3RydWN0IG1JU0ROaGVhZCBoaDsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBpZHggPSB0cy0xOworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gJmxpbmUtPnRzW2lkeF07CisJc3RydWN0IGJzY19mZCAqYmZkID0gJmUxaV90cy0+ZHJpdmVyLm1pc2RuLmZkOworCisJZnByaW50ZihzdGRvdXQsICJhY3RpdmF0ZSBiY2hhblxuIik7CisJaWYgKGFjdCkKKwkJaGgucHJpbSA9IFBIX0FDVElWQVRFX1JFUTsKKwllbHNlCisJCWhoLnByaW0gPSBQSF9ERUFDVElWQVRFX1JFUTsKKworCWhoLmlkID0gTUlTRE5fSURfQU5ZOworCXJldCA9IHNlbmR0byhiZmQtPmZkLCAmaGgsIHNpemVvZihoaCksIDAsIE5VTEwsIDApOworCWlmIChyZXQgPCAwKSB7CisJCWZwcmludGYoc3Rkb3V0LCAiY291bGQgbm90IHNlbmQgQUNUSVZBVEVfUlEgJXNcbiIsCisJCQlzdHJlcnJvcihlcnJubykpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBlMWlucF9kcml2ZXIgbWlzZG5fZHJpdmVyID0geworCS5uYW1lID0gIm1JU0ROdXNlciIsCisJLndhbnRfd3JpdGUgPSB0c193YW50X3dyaXRlLAorfTsKKworc3RhdGljIGludCBtaV9lMV9zZXR1cChzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSwgaW50IHJlbGVhc2VfbDIpCit7CisJaW50IHRzLCByZXQ7CisKKwkvKiBUUzAgaXMgQ1JDNCwgZG9uJ3QgbmVlZCBhbnkgZmQgZm9yIGl0ICovCisJZm9yICh0cyA9IDE7IHRzIDwgTlVNX0UxX1RTOyB0cysrKSB7CisJCXVuc2lnbmVkIGludCBpZHggPSB0cy0xOworCQlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9ICZsaW5lLT50c1tpZHhdOworCQlzdHJ1Y3QgYnNjX2ZkICpiZmQgPSAmZTFpX3RzLT5kcml2ZXIubWlzZG4uZmQ7CisJCXN0cnVjdCBzb2NrYWRkcl9tSVNETiBhZGRyOworCisJCWJmZC0+ZGF0YSA9IGxpbmU7CisJCWJmZC0+cHJpdl9uciA9IHRzOworCQliZmQtPmNiID0gbWlzZG5fZmRfY2I7CisKKwkJc3dpdGNoIChlMWlfdHMtPnR5cGUpIHsKKwkJY2FzZSBFMUlOUF9UU19UWVBFX05PTkU6CisJCQljb250aW51ZTsKKwkJCWJyZWFrOworCQljYXNlIEUxSU5QX1RTX1RZUEVfU0lHTjoKKwkJCWJmZC0+ZmQgPSBzb2NrZXQoUEZfSVNETiwgU09DS19ER1JBTSwgSVNETl9QX0xBUERfTlQpOworCQkJYmZkLT53aGVuID0gQlNDX0ZEX1JFQUQ7CisJCQlicmVhazsKKwkJY2FzZSBFMUlOUF9UU19UWVBFX1RSQVU6CisJCQliZmQtPmZkID0gc29ja2V0KFBGX0lTRE4sIFNPQ0tfREdSQU0sIElTRE5fUF9CX1JBVyk7CisJCQkvKiBXZSBuZXZlciBpbmNsdWRlIHRoZSBtSVNETiBCLUNoYW5uZWwgRkQgaW50byB0aGUKKwkgCQkqIHdyaXRlc2V0LCBzaW5jZSBpdCBkb2Vzbid0IHN1cHBvcnQgcG9sbCgpIGJhc2VkCisJIAkJKiB3cml0ZSBmbG93IGNvbnRyb2wgKi8JCQorCQkJYmZkLT53aGVuID0gQlNDX0ZEX1JFQUQ7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChiZmQtPmZkIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICIlcyBjb3VsZCBub3Qgb3BlbiBzb2NrZXQgJXNcbiIsCisJCQkJX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gYmZkLT5mZDsKKwkJfQorCisJCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKwkJYWRkci5mYW1pbHkgPSBBRl9JU0ROOworCQlhZGRyLmRldiA9IGxpbmUtPm51bTsKKwkJc3dpdGNoIChlMWlfdHMtPnR5cGUpIHsKKwkJY2FzZSBFMUlOUF9UU19UWVBFX1NJR046CisJCQlhZGRyLmNoYW5uZWwgPSAwOworCQkJLyogU0FQSSBub3Qgc3VwcG9ydGVkIHlldCBpbiBrZXJuZWwgKi8KKwkJCS8vYWRkci5zYXBpID0gZTFpbnBfdHMtPnNpZ24uc2FwaTsKKwkJCWFkZHIuc2FwaSA9IDA7CisJCQlhZGRyLnRlaSA9IEdST1VQX1RFSTsKKwkJCWJyZWFrOworCQljYXNlIEUxSU5QX1RTX1RZUEVfVFJBVToKKwkJCWFkZHIuY2hhbm5lbCA9IHRzOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlERUJVR1AoRE1JLCAidW5zdXBwb3J0ZWQgRTEgVFMgdHlwZTogJXVcbiIsCisJCQkJZTFpX3RzLT50eXBlKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmV0ID0gYmluZChiZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpOworCQlpZiAocmV0IDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgYmluZCBsMiBzb2NrZXQgJXNcbiIsCisJCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJaWYgKGUxaV90cy0+dHlwZSA9PSBFMUlOUF9UU19UWVBFX1NJR04pIHsKKwkJCXJldCA9IGlvY3RsKGJmZC0+ZmQsIElNQ0xFQVJfTDIsICZyZWxlYXNlX2wyKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3Qgc2VuZCBJT0NUTCBJTUNMRUFOX0wyICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQl9CisKKwkJLyogRklYTUU6IG9ubHkgYWN0aXZhdGUgQi1DaGFubmVscyBvbmNlIHdlIHN0YXJ0IHRvCisJCSAqIHVzZSB0aGVtIHRvIGNvbnNlcnZlIENQVSBwb3dlciAqLworCQlpZiAoZTFpX3RzLT50eXBlID09IEUxSU5QX1RTX1RZUEVfVFJBVSkKKwkJCWFjdGl2YXRlX2JjaGFuKGxpbmUsIHRzLCAxKTsKKworCQlyZXQgPSBic2NfcmVnaXN0ZXJfZmQoYmZkKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IHJlZ2lzdGVyIEZEOiAlc1xuIiwKKwkJCQlzdHJlcnJvcihyZXQpKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IG1pX2UxX2xpbmVfdXBkYXRlKHN0cnVjdCBlMWlucF9saW5lICpsaW5lKQoreworCXN0cnVjdCBtSVNETl9kZXZpbmZvIGRldmluZm87CisJaW50IHNrLCByZXQsIGNudDsKKworCWlmICghbGluZS0+ZHJpdmVyKSB7CisJCS8qIHRoaXMgbXVzdCBiZSB0aGUgZmlyc3QgdXBkYXRlICovCisJCWxpbmUtPmRyaXZlciA9ICZtaXNkbl9kcml2ZXI7CisJfSBlbHNlIHsKKwkJLyogdGhpcyBpcyBhIHN1YnNlcXVlbnQgdXBkYXRlICovCisJCS8qIEZJWE1FOiBmaXJzdCBjbG9zZSBhbGwgc29ja2V0cyAqLworCQlmcHJpbnRmKHN0ZGVyciwgImluY3JlbWVudGFsIGxpbmUgdXBkYXRlcyBub3Qgc3VwcG9ydGVkIHlldFxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChsaW5lLT5kcml2ZXIgIT0gJm1pc2RuX2RyaXZlcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBvcGVuIHRoZSBJU0ROIGNhcmQgZGV2aWNlICovCisJc2sgPSBzb2NrZXQoUEZfSVNETiwgU09DS19SQVcsIElTRE5fUF9CQVNFKTsKKwlpZiAoc2sgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXMgY291bGQgbm90IG9wZW4gc29ja2V0ICVzXG4iLAorCQkJX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiBzazsKKwl9CisKKwlyZXQgPSBpb2N0bChzaywgSU1HRVRDT1VOVCwgJmNudCk7CisJaWYgKHJldCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzIGVycm9yIGdldHRpbmcgaW50ZXJmIGNvdW50OiAlc1xuIiwKKwkJCV9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworCQljbG9zZShzayk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkvL0RFQlVHUChETUksIiVkIGRldmljZSVzIGZvdW5kXG4iLCBjbnQsIChjbnQ9PTEpPyIiOiJzIik7CisJcHJpbnRmKCIlZCBkZXZpY2UlcyBmb3VuZFxuIiwgY250LCAoY250PT0xKT8iIjoicyIpOworI2lmIDEKKwlkZXZpbmZvLmlkID0gbGluZS0+bnVtOworCXJldCA9IGlvY3RsKHNrLCBJTUdFVERFVklORk8sICZkZXZpbmZvKTsKKwlpZiAocmV0IDwgMCkgeworCQlmcHJpbnRmKHN0ZG91dCwgImVycm9yIGdldHRpbmcgaW5mbyBmb3IgZGV2aWNlICVkOiAlc1xuIiwKKwkJCWxpbmUtPm51bSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWZwcmludGYoc3Rkb3V0LCAiICAgICAgICBpZDogICAgICAgICAgICAgJWRcbiIsIGRldmluZm8uaWQpOworCWZwcmludGYoc3Rkb3V0LCAiICAgICAgICBEcHJvdG9jb2xzOiAgICAgJTA4eFxuIiwgZGV2aW5mby5EcHJvdG9jb2xzKTsKKwlmcHJpbnRmKHN0ZG91dCwgIiAgICAgICAgQnByb3RvY29sczogICAgICUwOHhcbiIsIGRldmluZm8uQnByb3RvY29scyk7CisJZnByaW50ZihzdGRvdXQsICIgICAgICAgIHByb3RvY29sOiAgICAgICAlZFxuIiwgZGV2aW5mby5wcm90b2NvbCk7CisJZnByaW50ZihzdGRvdXQsICIgICAgICAgIG5yYmNoYW46ICAgICAgICAlZFxuIiwgZGV2aW5mby5ucmJjaGFuKTsKKwlmcHJpbnRmKHN0ZG91dCwgIiAgICAgICAgbmFtZTogICAgICAgICAgICVzXG4iLCBkZXZpbmZvLm5hbWUpOworI2VuZGlmCisKKwlpZiAoIShkZXZpbmZvLkRwcm90b2NvbHMgJiAoMSA8PCBJU0ROX1BfTlRfRTEpKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yOiBjYXJkIGlzIG5vdCBvZiB0eXBlIEUxIChOVC1tb2RlKVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IG1pX2UxX3NldHVwKGxpbmUsIDEpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkgdm9pZCBvbl9kc29fbG9hZF9zbXModm9pZCkKK3sKKwkvKiByZWdpc3RlciB0aGUgZHJpdmVyIHdpdGggdGhlIGNvcmUgKi8KKwllMWlucF9kcml2ZXJfcmVnaXN0ZXIoJm1pc2RuX2RyaXZlcik7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9NYWtlZmlsZS5hbSBiL29wZW5ic2Mvc3JjL2lwYWNjZXNzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMzkzMjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDEzIEBACitJTkNMVURFUyA9ICQoYWxsX2luY2x1ZGVzKSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZSAtSSQodG9wX2J1aWxkZGlyKQorQU1fQ0ZMQUdTPS1XYWxsICQoTElCT1NNT0NPUkVfQ0ZMQUdTKQorQU1fTERGTEFHUyA9ICQoTElCT1NNT0NPUkVfTElCUykKKworc2Jpbl9QUk9HUkFNUyA9IGlwYWNjZXNzLWZpbmQgaXBhY2Nlc3MtY29uZmlnIGlwYWNjZXNzLXByb3h5CisKK2lwYWNjZXNzX2ZpbmRfU09VUkNFUyA9IGlwYWNjZXNzLWZpbmQuYworCitpcGFjY2Vzc19jb25maWdfU09VUkNFUyA9IGlwYWNjZXNzLWNvbmZpZy5jIGlwYWNjZXNzLWZpcm13YXJlLmMKK2lwYWNjZXNzX2NvbmZpZ19MREFERCA9ICQodG9wX2J1aWxkZGlyKS9zcmMvbGliYnNjLmEgJCh0b3BfYnVpbGRkaXIpL3NyYy9saWJtc2MuYSBcCisJCQkkKHRvcF9idWlsZGRpcikvc3JjL2xpYmJzYy5hICQodG9wX2J1aWxkZGlyKS9zcmMvbGlidnR5LmEgLWxkbCAtbGRiaSAkKExJQkNSWVBUKQorCitpcGFjY2Vzc19wcm94eV9TT1VSQ0VTID0gaXBhY2Nlc3MtcHJveHkuYyAuLi9kZWJ1Zy5jCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1jb25maWcuYyBiL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLWNvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2M2U5YmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1jb25maWcuYwpAQCAtMCwwICsxLDc0NSBAQAorLyogaXAuYWNjZXNzIG5hbm9CVFMgY29uZmlndXJhdGlvbiB0b29sICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOSwyMDEwIGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisgKiAoQykgMjAwOSwyMDEwIGJ5IE9uIFdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworCisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGltZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2lwYWNjZXNzLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZTFfaW5wdXQuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKworc3RhdGljIHN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0OworCitzdGF0aWMgaW50IG5ldF9saXN0ZW5fdGVzdG5yOworc3RhdGljIGludCByZXN0YXJ0Oworc3RhdGljIGNoYXIgKnByaW1fb21sX2lwOworc3RhdGljIGNoYXIgKnVuaXRfaWQ7CitzdGF0aWMgdV9pbnQxNl90IG52X2ZsYWdzOworc3RhdGljIHVfaW50MTZfdCBudl9tYXNrOworc3RhdGljIGNoYXIgKnNvZnR3YXJlID0gTlVMTDsKK3N0YXRpYyBpbnQgc3dfbG9hZF9zdGF0ZSA9IDA7CitzdGF0aWMgaW50IG9tbF9zdGF0ZSA9IDA7CitzdGF0aWMgaW50IGR1bXBfZmlsZXMgPSAwOworc3RhdGljIGNoYXIgKmZpcm13YXJlX2FuYWx5c2lzID0gTlVMTDsKK3N0YXRpYyBpbnQgZm91bmRfdHJ4ID0gMDsKKworc3RydWN0IHN3X2xvYWQgeworCXVfaW50OF90IGZpbGVfaWRbMjU1XTsKKwl1X2ludDhfdCBmaWxlX2lkX2xlbjsKKworCXVfaW50OF90IGZpbGVfdmVyc2lvblsyNTVdOworCXVfaW50OF90IGZpbGVfdmVyc2lvbl9sZW47Cit9OworCitzdGF0aWMgdm9pZCAqdGFsbF9jdHhfY29uZmlnID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3Qgc3dfbG9hZCAqc3dfbG9hZDEgPSBOVUxMOworc3RhdGljIHN0cnVjdCBzd19sb2FkICpzd19sb2FkMiA9IE5VTEw7CisKKy8qCitzdGF0aWMgdV9pbnQ4X3QgcHJpbV9vbWxfYXR0cltdID0geyAweDk1LCAweDAwLCA3LCAweDg4LCAxOTIsIDE2OCwgMTAwLCAxMSwgMHgwMCwgMHgwMCB9Oworc3RhdGljIHVfaW50OF90IHVuaXRfaWRfYXR0cltdID0geyAweDkxLCAweDAwLCA5LCAnMicsICczJywgJzQnLCAnMicsICcvJyAsICcwJywgJy8nLCAnMCcsIDB4MDAgfTsKKyovCisKKy8qCisgKiBDYWxsYmFjayBmdW5jdGlvbiBmb3IgTkFDSyBvbiB0aGUgT01MIE5NCisgKgorICogQ3VycmVudGx5IHdlIHNlbmQgdGhlIGNvbmZpZyByZXF1ZXN0cyBidXQgZG9uJ3QgY2hlY2sgdGhlCisgKiByZXN1bHQuIFRoZSBuYW5vQlRTIHdpbGwgc2VuZCB1cyBhIE5BQ0sgd2hlbiB3ZSBkaWQgc29tZXRoaW5nIHRoZQorICogQlRTIGRpZG4ndCBsaWtlLgorICovCitzdGF0aWMgaW50IGlwYWNjX21zZ19uYWNrKHVfaW50OF90IG10KQoreworCWZwcmludGYoc3RkZXJyLCAiRmFpbHVyZSB0byBzZXQgYXR0cmlidXRlLiBUaGlzIHNlZW1zIGZhdGFsXG4iKTsKKwlleGl0KC0xKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfcmVzdGFydF9vcl9leGl0KHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KQoreworCWlmIChyZXN0YXJ0KSB7CisJCWFiaXNfbm1faXBhY2Nlc3NfcmVzdGFydCh0cngpOworCX0gZWxzZSB7CisJCWV4aXQoMCk7CisJfQorfQorCitzdGF0aWMgaW50IGlwYWNjX21zZ19hY2sodV9pbnQ4X3QgbXQsIHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KQoreworCWlmIChzd19sb2FkX3N0YXRlID09IDEpIHsKKwkJZnByaW50ZihzdGRlcnIsICJUaGUgbmV3IHNvZnR3YXJlIGlzIGFjdGl2YWVkLlxuIik7CisJCWNoZWNrX3Jlc3RhcnRfb3JfZXhpdCh0cngpOworCX0gZWxzZSBpZiAob21sX3N0YXRlID09IDEpIHsKKwkJZnByaW50ZihzdGRlcnIsICJTZXQgdGhlIHByaW1hcnkgT01MIElQLlxuIik7CisJCWNoZWNrX3Jlc3RhcnRfb3JfZXhpdCh0cngpOworCX0KKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgaXBhY2NfZmVycl9lbGVtIHsKKwlpbnQxNl90IGZyZXFfZXJyOworCXVfaW50OF90IGZyZXFfcXVhbDsKKwl1X2ludDhfdCBhcmZjbjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBpcGFjY19jdXNhZ2VfZWxlbSB7CisJdV9pbnQxNl90IGFyZmNuOjEwLAorCQkgIHJ4bGV2OjY7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RhdGljIGludCB0ZXN0X3JlcCh2b2lkICpfbXNnKQoreworCXN0cnVjdCBtc2diICptc2cgPSBfbXNnOworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCA9IG1zZ2JfbDMobXNnKTsKKwl1X2ludDE2X3QgdGVzdF9yZXBfbGVuLCBmZXJyX2xpc3RfbGVuOworCXN0cnVjdCBpcGFjY19mZXJyX2VsZW0gKmlmZTsKKwlzdHJ1Y3QgaXBhY19iY2NoX2luZm8gYmluZm87CisJaW50IGksIHJjOworCisJREVCVUdQKEROTSwgIlRFU1QgUkVQT1JUOiAiKTsKKworCWlmIChmb2gtPmRhdGFbMF0gIT0gTk1fQVRUX1RFU1RfTk8gfHwKKwkgICAgZm9oLT5kYXRhWzJdICE9IE5NX0FUVF9URVNUX1JFUE9SVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlERUJVR1BDKEROTSwgInRlc3Rfbm89MHglMDJ4ICIsIGZvaC0+ZGF0YVsxXSk7CisJLyogZGF0YVsyXSA9PSBOTV9BVFRfVEVTVF9SRVBPUlQgKi8KKwkvKiBkYXRhWzMuLjRdOiB0ZXN0X3JlcF9sZW4gKi8KKwl0ZXN0X3JlcF9sZW4gPSBudG9ocygqKHVfaW50MTZfdCAqKSAmZm9oLT5kYXRhWzNdKTsKKwkvKiBkYXRhWzVdOiBpcC5hY2Nlc3MgdGVzdCByZXN1bHQgKi8KKwlERUJVR1BDKEROTSwgInRlc3RfcmVzPSVzXG4iLCBpcGFjY190ZXN0cmVzX25hbWUoZm9oLT5kYXRhWzVdKSk7CisKKwkvKiBkYXRhWzZdOiBpcC5hY2Nlc3MgbmVzdGVkIElFLiAzID09IGZyZXFfZXJyX2xpc3QgKi8KKwlzd2l0Y2ggKGZvaC0+ZGF0YVs2XSkgeworCWNhc2UgTk1fSVBBQ19FSUVfRlJFUV9FUlJfTElTVDoKKwkJLyogZGF0YVs3Li44XTogbGVuZ3RoIG9mIGZlcnJfbGlzdCAqLworCQlmZXJyX2xpc3RfbGVuID0gbnRvaHMoKih1X2ludDE2X3QgKikgJmZvaC0+ZGF0YVs3XSk7CisKKwkJLyogZGF0YVs5Li4uXTogZnJlcXVlbmN5IGVycm9yIGxpc3QgZWxlbWVudHMgKi8KKwkJZm9yIChpID0gMDsgaSA8IGZlcnJfbGlzdF9sZW47IGkrPSBzaXplb2YoKmlmZSkpIHsKKwkJCWlmZSA9IChzdHJ1Y3QgaXBhY2NfZmVycl9lbGVtICopIChmb2gtPmRhdGEgKyA5ICsgaSk7CisJCQlERUJVR1AoRE5NLCAiPT0+IEFSRkNOICU0dSwgRnJlcXVlbmN5IEVycm9yICU2aGRcbiIsCisJCQlpZmUtPmFyZmNuLCBudG9ocyhpZmUtPmZyZXFfZXJyKSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOTV9JUEFDX0VJRV9DSEFOX1VTRV9MSVNUOgorCQkvKiBkYXRhWzcuLjhdOiBsZW5ndGggb2YgZmVycl9saXN0ICovCisJCWZlcnJfbGlzdF9sZW4gPSBudG9ocygqKHVfaW50MTZfdCAqKSAmZm9oLT5kYXRhWzddKTsKKworCQkvKiBkYXRhWzkuLi5dOiBjaGFubmVsIHVzYWdlIGxpc3QgZWxlbWVudHMgKi8KKwkJZm9yIChpID0gMDsgaSA8IGZlcnJfbGlzdF9sZW47IGkrPSAyKSB7CisJCQl1X2ludDE2X3QgKmN1X3B0ciA9ICh1X2ludDE2X3QgKikoZm9oLT5kYXRhICsgOSArIGkpOworCQkJdV9pbnQxNl90IGN1ID0gbnRvaHMoKmN1X3B0cik7CisJCQlERUJVR1AoRE5NLCAiPT0+IEFSRkNOICU0dSwgUnhMZXYgJTJ1XG4iLAorCQkJCWN1ICYgMHgzZmYsIGN1ID4+IDEwKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5NX0lQQUNfRUlFX0JDQ0hfSU5GT19UWVBFOgorCQlicmVhazsKKwljYXNlIE5NX0lQQUNfRUlFX0JDQ0hfSU5GTzoKKwkJcmMgPSBpcGFjX3BhcnNlX2JjY2hfaW5mbygmYmluZm8sIGZvaC0+ZGF0YSs2KTsKKwkJaWYgKHJjIDwgMCkgeworCQkJREVCVUdQKEROTSwgIkJDQ0ggSW5mbyBwYXJzaW5nIGZhaWxlZFxuIik7CisJCQlicmVhazsKKwkJfQorCQlERUJVR1AoRE5NLCAiPT0+IEFSRkNOICV1LCBSeExldiAlMnUsIFJ4UXVhbCAlMnU6ICUzZC0lZCwgTEFDICVkIENJICVkXG4iLAorCQkJYmluZm8uYXJmY24sIGJpbmZvLnJ4X2xldiwgYmluZm8ucnhfcXVhbCwKKwkJCWJpbmZvLmNnaS5tY2MsIGJpbmZvLmNnaS5tbmMsCisJCQliaW5mby5jZ2kubGFjLCBiaW5mby5jZ2kuY2kpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBubV9zaWdfY2IodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJICAgICB2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCXN0cnVjdCBpcGFjY19hY2tfc2lnbmFsX2RhdGEgKmlwYWNjX2RhdGE7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU19OTV9JUEFDQ19OQUNLOgorCQlpcGFjY19kYXRhID0gc2lnbmFsX2RhdGE7CisJCXJldHVybiBpcGFjY19tc2dfbmFjayhpcGFjY19kYXRhLT5tc2dfdHlwZSk7CisJY2FzZSBTX05NX0lQQUNDX0FDSzoKKwkJaXBhY2NfZGF0YSA9IHNpZ25hbF9kYXRhOworCQlyZXR1cm4gaXBhY2NfbXNnX2FjayhpcGFjY19kYXRhLT5tc2dfdHlwZSwgaXBhY2NfZGF0YS0+dHJ4KTsKKwljYXNlIFNfTk1fVEVTVF9SRVA6CisJCXJldHVybiB0ZXN0X3JlcChzaWduYWxfZGF0YSk7CisJY2FzZSBTX05NX0lQQUNDX1JFU1RBUlRfQUNLOgorCQlwcmludGYoIlRoZSBCVFMgaGFzIGFja2VkIHRoZSByZXN0YXJ0LiBFeGl0aW5nLlxuIik7CisJCWV4aXQoMCk7CisJCWJyZWFrOworCWNhc2UgU19OTV9JUEFDQ19SRVNUQVJUX05BQ0s6CisJCXByaW50ZigiVGhlIEJUUyBoYXMgbmFja2VkIHRoZSByZXN0YXJ0LiBFeGl0aW5nLlxuIik7CisJCWV4aXQoMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisvKiBjYWxsYmFjayBmdW5jdGlvbiBwYXNzZWQgdG8gdGhlIEFCSVMgT01MIGNvZGUgKi8KK3N0YXRpYyBpbnQgcGVyY2VudDsKK3N0YXRpYyBpbnQgcGVyY2VudF9vbGQ7CitzdGF0aWMgaW50IHN3bG9hZF9jYmZuKHVuc2lnbmVkIGludCBob29rLCB1bnNpZ25lZCBpbnQgZXZlbnQsIHN0cnVjdCBtc2diICpfbXNnLAorCQkgICAgICAgdm9pZCAqZGF0YSwgdm9pZCAqcGFyYW0pCit7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKworCWlmIChob29rICE9IEdTTV9IT09LX05NX1NXTE9BRCkKKwkJcmV0dXJuIDA7CisKKwl0cnggPSAoc3RydWN0IGdzbV9idHNfdHJ4ICopIGRhdGE7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBOTV9NVF9MT0FEX0lOSVRfQUNLOgorCQlmcHJpbnRmKHN0ZG91dCwgIlNvZnR3YXJlIExvYWQgSW5pdGlhdGUgQUNLXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9MT0FEX0lOSVRfTkFDSzoKKwkJZnByaW50ZihzdGRlcnIsICJFUlJPUjogU29mdHdhcmUgTG9hZCBJbml0aWF0ZSBOQUNLXG4iKTsKKwkJZXhpdCg1KTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9MT0FEX0VORF9BQ0s6CisJCWZwcmludGYoc3RkZXJyLCAiTE9BRCBFTkQgQUNLLi4uIik7CisJCS8qIG5vdyBtYWtlIGl0IHRoZSBkZWZhdWx0ICovCisJCXN3X2xvYWRfc3RhdGUgPSAxOworCisJCW1zZyA9IG1zZ2JfYWxsb2MoMTAyNCwgInN3OiBudmF0dHIiKTsKKwkJbXNnLT5sMmggPSBtc2diX3B1dChtc2csIDMpOworCQltc2ctPmwzaCA9ICZtc2ctPmwyaFszXTsKKworCQkvKiBhY3RpdmF0ZSBzb2Z0d2FyZSAqLworCQlpZiAoc3dfbG9hZDEpIHsKKwkJCW1zZ2Jfdl9wdXQobXNnLCBOTV9BVFRfU1dfREVTQ1IpOworCQkJbXNnYl90bDE2dl9wdXQobXNnLCBOTV9BVFRfRklMRV9JRCwgc3dfbG9hZDEtPmZpbGVfaWRfbGVuLCBzd19sb2FkMS0+ZmlsZV9pZCk7CisJCQltc2diX3RsMTZ2X3B1dChtc2csIE5NX0FUVF9GSUxFX1ZFUlNJT04sIHN3X2xvYWQxLT5maWxlX3ZlcnNpb25fbGVuLAorCQkJCQlzd19sb2FkMS0+ZmlsZV92ZXJzaW9uKTsKKwkJfQorCisJCWlmIChzd19sb2FkMikgeworCQkJbXNnYl92X3B1dChtc2csIE5NX0FUVF9TV19ERVNDUik7CisJCQltc2diX3RsMTZ2X3B1dChtc2csIE5NX0FUVF9GSUxFX0lELCBzd19sb2FkMi0+ZmlsZV9pZF9sZW4sIHN3X2xvYWQyLT5maWxlX2lkKTsKKwkJCW1zZ2JfdGwxNnZfcHV0KG1zZywgTk1fQVRUX0ZJTEVfVkVSU0lPTiwgc3dfbG9hZDItPmZpbGVfdmVyc2lvbl9sZW4sCisJCQkJCXN3X2xvYWQyLT5maWxlX3ZlcnNpb24pOworCQl9CisKKwkJLyogZmlsbCBpbiB0aGUgZGF0YSAqLworCQltc2ctPmwyaFswXSA9IE5NX0FUVF9JUEFDQ19DVVJfU1dfQ0ZHOworCQltc2ctPmwyaFsxXSA9IG1zZ2JfbDNsZW4obXNnKSA+PiA4OworCQltc2ctPmwyaFsyXSA9IG1zZ2JfbDNsZW4obXNnKSAmIDB4ZmY7CisJCXByaW50ZigiRm9vIGwyaDogJXAgbDNoOiAlcC4uLiBsZW5ndGggbDI6ICV1ICBsMzogJXVcbiIsIG1zZy0+bDJoLCBtc2ctPmwzaCwgbXNnYl9sMmxlbihtc2cpLCBtc2diX2wzbGVuKG1zZykpOworCQlhYmlzX25tX2lwYWNjZXNzX3NldF9udmF0dHIodHJ4LCBtc2ctPmwyaCwgbXNnYl9sMmxlbihtc2cpKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfTE9BRF9FTkRfTkFDSzoKKwkJZnByaW50ZihzdGRlcnIsICJFUlJPUjogU29mdHdhcmUgTG9hZCBFbmQgTkFDS1xuIik7CisJCWV4aXQoMyk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfQUNUSVZBVEVfU1dfTkFDSzoKKwkJZnByaW50ZihzdGRlcnIsICJFUlJPUjogQWN0aXZhdGUgU29mdHdhcmUgTkFDS1xuIik7CisJCWV4aXQoNCk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfQUNUSVZBVEVfU1dfQUNLOgorCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfU0VHX0FDSzoKKwkJcGVyY2VudCA9IGFiaXNfbm1fc29mdHdhcmVfbG9hZF9zdGF0dXModHJ4LT5idHMpOworCQlpZiAocGVyY2VudCA+IHBlcmNlbnRfb2xkKQorCQkJcHJpbnRmKCJTb2Z0d2FyZSBEb3dubG9hZCBQcm9ncmVzczogJWQlJVxuIiwgcGVyY2VudCk7CisJCXBlcmNlbnRfb2xkID0gcGVyY2VudDsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9MT0FEX0FCT1JUOgorCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBMb2FkIGFib3J0ZWQgYnkgdGhlIEJUUy5cbiIpOworCQlleGl0KDYpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJvb3RzdHJhcF9vbShzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlpbnQgbGVuOworCXN0YXRpYyB1X2ludDhfdCBidWZbMTAyNF07CisJdV9pbnQ4X3QgKmN1ciA9IGJ1ZjsKKworCXByaW50ZigiT01MIGxpbmsgZXN0YWJsaXNoZWQgdXNpbmcgVFJYICVkXG4iLCB0cngtPm5yKTsKKworCWlmICh1bml0X2lkKSB7CisJCWxlbiA9IHN0cmxlbih1bml0X2lkKTsKKwkJaWYgKGxlbiA+IHNpemVvZihidWYpLTEwKQorCQkJcmV0dXJuOworCQlidWZbMF0gPSBOTV9BVFRfSVBBQ0NfVU5JVF9JRDsKKwkJYnVmWzFdID0gKGxlbisxKSA+PiA4OworCQlidWZbMl0gPSAobGVuKzEpICYgMHhmZjsKKwkJbWVtY3B5KGJ1ZiszLCB1bml0X2lkLCBsZW4pOworCQlidWZbMytsZW5dID0gMDsKKwkJcHJpbnRmKCJzZXR0aW5nIFVuaXQgSUQgdG8gJyVzJ1xuIiwgdW5pdF9pZCk7CisJCWFiaXNfbm1faXBhY2Nlc3Nfc2V0X252YXR0cih0cngsIGJ1ZiwgMytsZW4rMSk7CisJfQorCWlmIChwcmltX29tbF9pcCkgeworCQlzdHJ1Y3QgaW5fYWRkciBpYTsKKworCQlpZiAoIWluZXRfYXRvbihwcmltX29tbF9pcCwgJmlhKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIElQIGFkZHJlc3M6ICVzXG4iLAorCQkJCXByaW1fb21sX2lwKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIDB4ODggKyBJUCArIHBvcnQgKi8KKwkJbGVuID0gMSArIHNpemVvZihpYSkgKyAyOworCisJCSpjdXIrKyA9IE5NX0FUVF9JUEFDQ19QUklNX09NTF9DRkdfTElTVDsKKwkJKmN1cisrID0gKGxlbikgPj4gODsKKwkJKmN1cisrID0gKGxlbikgJiAweGZmOworCQkqY3VyKysgPSAweDg4OworCQltZW1jcHkoY3VyLCAmaWEsIHNpemVvZihpYSkpOworCQljdXIgKz0gc2l6ZW9mKGlhKTsKKwkJKmN1cisrID0gMDsKKwkJKmN1cisrID0gMDsKKwkJcHJpbnRmKCJzZXR0aW5nIHByaW1hcnkgT01MIGxpbmsgSVAgdG8gJyVzJ1xuIiwgaW5ldF9udG9hKGlhKSk7CisJCW9tbF9zdGF0ZSA9IDE7CisJCWFiaXNfbm1faXBhY2Nlc3Nfc2V0X252YXR0cih0cngsIGJ1ZiwgMytsZW4pOworCX0KKwlpZiAobnZfbWFzaykgeworCQlsZW4gPSA0OworCisJCSpjdXIrKyA9IE5NX0FUVF9JUEFDQ19OVl9GTEFHUzsKKwkJKmN1cisrID0gKGxlbikgPj4gODsKKwkJKmN1cisrID0gKGxlbikgJiAweGZmOworCQkqY3VyKysgPSBudl9mbGFncyAmIDB4ZmY7CisJCSpjdXIrKyA9IG52X21hc2sgJiAweGZmOworCQkqY3VyKysgPSBudl9mbGFncyA+PiA4OworCQkqY3VyKysgPSBudl9tYXNrID4+IDg7CisJCXByaW50Zigic2V0dGluZyBOViBGbGFncy9NYXNrIHRvIDB4JTA0eC8weCUwNHhcbiIsCisJCQludl9mbGFncywgbnZfbWFzayk7CisJCWFiaXNfbm1faXBhY2Nlc3Nfc2V0X252YXR0cih0cngsIGJ1ZiwgMytsZW4pOworCX0KKworCWlmIChyZXN0YXJ0ICYmICFwcmltX29tbF9pcCAmJiAhc29mdHdhcmUpIHsKKwkJcHJpbnRmKCJyZXN0YXJ0aW5nIEJUU1xuIik7CisJCWFiaXNfbm1faXBhY2Nlc3NfcmVzdGFydCh0cngpOworCX0KKworfQorCit2b2lkIGlucHV0X2V2ZW50KGludCBldmVudCwgZW51bSBlMWlucF9zaWduX3R5cGUgdHlwZSwgc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJc3dpdGNoIChldmVudCkgeworCWNhc2UgRVZUX0UxX1RFSV9VUDoKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgRTFJTlBfU0lHTl9PTUw6CisJCQlicmVhazsKKwkJY2FzZSBFMUlOUF9TSUdOX1JTTDoKKwkJCS8qIEZJWE1FICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgRVZUX0UxX1RFSV9ETjoKKwkJZnByaW50ZihzdGRlcnIsICJMb3N0IHNvbWUgRTEgVEVJIGxpbmtcbiIpOworCQkvKiBGSVhNRTogZGVhbCB3aXRoIFRFSSBvciBMMSBsaW5rIGxvc3MgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCitpbnQgbm1fc3RhdGVfZXZlbnQoZW51bSBubV9ldnQgZXZ0LCB1X2ludDhfdCBvYmpfY2xhc3MsIHZvaWQgKm9iaiwKKwkJICAgc3RydWN0IGdzbV9ubV9zdGF0ZSAqb2xkX3N0YXRlLCBzdHJ1Y3QgZ3NtX25tX3N0YXRlICpuZXdfc3RhdGUsCisJCSAgIHN0cnVjdCBhYmlzX29tX29ial9pbnN0ICpvYmpfaW5zdCkKK3sKKwlpZiAob2JqX2NsYXNzID09IE5NX09DX0JBU0VCX1RSQU5TQykgeworCQlpZiAoIWZvdW5kX3RyeCAmJiBvYmpfaW5zdC0+dHJ4X25yICE9IDB4ZmYpIHsKKwkJCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gY29udGFpbmVyX29mKG9iaiwgc3RydWN0IGdzbV9idHNfdHJ4LCBiYl90cmFuc2MpOworCQkJYm9vdHN0cmFwX29tKHRyeCk7CisJCQlmb3VuZF90cnggPSAxOworCQl9CisJfSBlbHNlIGlmIChldnQgPT0gRVZUX1NUQVRFQ0hHX09QRVIgJiYKKwkgICAgb2JqX2NsYXNzID09IE5NX09DX1JBRElPX0NBUlJJRVIgJiYKKwkgICAgbmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gMykgeworCQlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IG9iajsKKworCQlpZiAobmV0X2xpc3Rlbl90ZXN0bnIpIHsKKwkJCXVfaW50OF90IHBoeXNfY29uZmlnW10gPSB7IDB4MDIsIDB4MGEsIDB4MDAsIDB4MDEsIDB4MDIgfTsKKwkJCWFiaXNfbm1fcGVyZm9ybV90ZXN0KHRyeC0+YnRzLCAyLCAwLCB0cngtPm5yLCAweGZmLAorCQkJCQkgICAgIG5ldF9saXN0ZW5fdGVzdG5yLCAxLAorCQkJCQkgICAgIHBoeXNfY29uZmlnLCBzaXplb2YocGh5c19jb25maWcpKTsKKwkJfSBlbHNlIGlmIChzb2Z0d2FyZSkgeworCQkJaW50IHJjOworCQkJcHJpbnRmKCJBdHRlbXB0aW5nIHNvZnR3YXJlIHVwbG9hZCB3aXRoICclcydcbiIsIHNvZnR3YXJlKTsKKwkJCXJjID0gYWJpc19ubV9zb2Z0d2FyZV9sb2FkKHRyeC0+YnRzLCB0cngtPm5yLCBzb2Z0d2FyZSwgMTksIDAsIHN3bG9hZF9jYmZuLCB0cngpOworCQkJaWYgKHJjIDwgMCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHN0YXJ0IHNvZnR3YXJlIGxvYWRcbiIpOworCQkJCWV4aXQoLTMpOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHN3X2xvYWQgKmNyZWF0ZV9zd2xvYWQoc3RydWN0IHNkcF9oZWFkZXIgKmhlYWRlcikKK3sKKwlzdHJ1Y3Qgc3dfbG9hZCAqbG9hZDsKKworCWxvYWQgPSB0YWxsb2NfemVybyh0YWxsX2N0eF9jb25maWcsIHN0cnVjdCBzd19sb2FkKTsKKworCXN0cm5jcHkoKGNoYXIgKilsb2FkLT5maWxlX2lkLCBoZWFkZXItPmZpcm13YXJlX2luZm8uc3dfcGFydCwgMjApOworCWxvYWQtPmZpbGVfaWRfbGVuID0gc3RybGVuKGhlYWRlci0+ZmlybXdhcmVfaW5mby5zd19wYXJ0KSArIDE7CisKKwlzdHJuY3B5KChjaGFyICopbG9hZC0+ZmlsZV92ZXJzaW9uLCBoZWFkZXItPmZpcm13YXJlX2luZm8udmVyc2lvbiwgMjApOworCWxvYWQtPmZpbGVfdmVyc2lvbl9sZW4gPSBzdHJsZW4oaGVhZGVyLT5maXJtd2FyZV9pbmZvLnZlcnNpb24pICsgMTsKKworCXJldHVybiBsb2FkOworfQorCitzdGF0aWMgaW50IGZpbmRfc3dfbG9hZF9wYXJhbXMoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJc3RydWN0IHN0YXQgc3RhdDsKKwlzdHJ1Y3Qgc2RwX2hlYWRlciAqaGVhZGVyOworCXN0cnVjdCBsbGlzdF9oZWFkICplbnRyeTsKKwlpbnQgZmQ7CisJdm9pZCAqdGFsbF9maXJtX2N0eCA9IDA7CisKKwllbnRyeSA9IHRhbGxvY196ZXJvKHRhbGxfZmlybV9jdHgsIHN0cnVjdCBsbGlzdF9oZWFkKTsKKwlJTklUX0xMSVNUX0hFQUQoZW50cnkpOworCisJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisJaWYgKCFmZCkgeworCQlwZXJyb3IoIm5hZGEiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIHZlcmlmeSB0aGUgZmlsZSAqLworCWlmIChmc3RhdChmZCwgJnN0YXQpID09IC0xKSB7CisJCXBlcnJvcigiQ2FuIG5vdCBzdGF0IHRoZSBmaWxlIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpcGFjY2Vzc19hbmFseXplX2ZpbGUoZmQsIHN0YXQuc3Rfc2l6ZSwgMCwgZW50cnkpOworCWlmIChjbG9zZShmZCkgIT0gMCkgeworCQlwZXJyb3IoIkNsb3NlIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogdHJ5IHRvIGZpbmQgd2hhdCB3ZSBhcmUgbG9va2luZyBmb3IgKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShoZWFkZXIsIGVudHJ5LCBlbnRyeSkgeworCQlpZiAobnRvaHMoaGVhZGVyLT5maXJtd2FyZV9pbmZvLm1vcmVfbW9yZV9tYWdpYykgPT0gMHgxMDAwKSB7CisJCQlzd19sb2FkMSA9IGNyZWF0ZV9zd2xvYWQoaGVhZGVyKTsKKwkJfSBlbHNlIGlmIChudG9ocyhoZWFkZXItPmZpcm13YXJlX2luZm8ubW9yZV9tb3JlX21hZ2ljKSA9PSAweDIwMDEpIHsKKwkJCXN3X2xvYWQyID0gY3JlYXRlX3N3bG9hZChoZWFkZXIpOworCQl9CisJfQorCisJaWYgKCFzd19sb2FkMSB8fCAhc3dfbG9hZDIpIHsKKwkJZnByaW50ZihzdGRlcnIsICJEaWQgbm90IGZpbmQgZGF0YS5cbiIpOworCQl0YWxsb2NfZnJlZSh0YWxsX2Zpcm1fY3R4KTsKKwkJcmV0dXJuIC0xOworICAgICAgICB9CisKKwl0YWxsb2NfZnJlZSh0YWxsX2Zpcm1fY3R4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHVtcF9lbnRyeShzdHJ1Y3Qgc2RwX2hlYWRlcl9pdGVtICpzdWJfZW50cnksIGludCBwYXJ0LCBpbnQgZmQpCit7CisJaW50IG91dF9mZDsKKwlpbnQgY29waWVkOworCWNoYXIgZmlsZW5hbWVbNDA5Nl07CisJb2ZmX3QgdGFyZ2V0OworCisJaWYgKCFkdW1wX2ZpbGVzKQorCQlyZXR1cm47CisKKwlpZiAoc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkuc29tZXRoaW5nMSA9PSAwKQorCQlyZXR1cm47CisKKwlzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgInBhcnQuJWQiLCBwYXJ0KyspOworCW91dF9mZCA9IG9wZW4oZmlsZW5hbWUsIE9fV1JPTkxZIHwgT19DUkVBVCwgMDY2MCk7CisJaWYgKG91dF9mZCA8IDApIHsKKwkJcGVycm9yKCJDYW4gbm90IGR1bXAgZmlybXdhcmUiKTsKKwkJcmV0dXJuOworCX0KKworCXRhcmdldCA9IHN1Yl9lbnRyeS0+YWJzb2x1dGVfb2Zmc2V0ICsgbnRvaGwoc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkuc3RhcnQpICsgNDsKKwlpZiAobHNlZWsoZmQsIHRhcmdldCwgU0VFS19TRVQpICE9IHRhcmdldCkgeworCQlwZXJyb3IoInNlZWsgZmFpbGVkIik7CisJCWNsb3NlKG91dF9mZCk7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGNvcGllZCA9IDA7IGNvcGllZCA8IG50b2hsKHN1Yl9lbnRyeS0+aGVhZGVyX2VudHJ5Lmxlbmd0aCk7ICsrY29waWVkKSB7CisJCWNoYXIgYzsKKwkJaWYgKHJlYWQoZmQsICZjLCBzaXplb2YoYykpICE9IHNpemVvZihjKSkgeworCQkJcGVycm9yKCJjb3B5IGZhaWxlZCIpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAod3JpdGUob3V0X2ZkLCAmYywgc2l6ZW9mKGMpKSAhPSBzaXplb2YoYykpIHsKKwkJCXBlcnJvcigid3JpdGUgZmFpbGVkIik7CisJCQlicmVhazsKKwkJfQorCX0KKworCWNsb3NlKG91dF9mZCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuYWx5emVfZmlybXdhcmUoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJc3RydWN0IHN0YXQgc3RhdDsKKwlzdHJ1Y3Qgc2RwX2hlYWRlciAqaGVhZGVyOworCXN0cnVjdCBzZHBfaGVhZGVyX2l0ZW0gKnN1Yl9lbnRyeTsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCAqZW50cnk7CisJaW50IGZkOworCXZvaWQgKnRhbGxfZmlybV9jdHggPSAwOworCWludCBwYXJ0ID0gMDsKKworCWVudHJ5ID0gdGFsbG9jX3plcm8odGFsbF9maXJtX2N0eCwgc3RydWN0IGxsaXN0X2hlYWQpOworCUlOSVRfTExJU1RfSEVBRChlbnRyeSk7CisKKwlwcmludGYoIk9wZW5pbmcgcG9zc2libGUgZmlybXdhcmUgJyVzJ1xuIiwgZmlsZW5hbWUpOworCWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworCWlmICghZmQpIHsKKwkJcGVycm9yKCJuYWRhIik7CisJCXJldHVybjsKKwl9CisKKwkvKiB2ZXJpZnkgdGhlIGZpbGUgKi8KKwlpZiAoZnN0YXQoZmQsICZzdGF0KSA9PSAtMSkgeworCQlwZXJyb3IoIkNhbiBub3Qgc3RhdCB0aGUgZmlsZSIpOworCQlyZXR1cm47CisJfQorCisJaXBhY2Nlc3NfYW5hbHl6ZV9maWxlKGZkLCBzdGF0LnN0X3NpemUsIDAsIGVudHJ5KTsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGhlYWRlciwgZW50cnksIGVudHJ5KSB7CisJCXByaW50ZigiUHJpbnRpbmcgaGVhZGVyIGluZm9ybWF0aW9uOlxuIik7CisJCXByaW50ZigibW9yZV9tb3JlX21hZ2ljOiAweCV4XG4iLCBudG9ocyhoZWFkZXItPmZpcm13YXJlX2luZm8ubW9yZV9tb3JlX21hZ2ljKSk7CisJCXByaW50ZigiaGVhZGVyX2xlbmd0aDogJXVcbiIsIG50b2hsKGhlYWRlci0+ZmlybXdhcmVfaW5mby5oZWFkZXJfbGVuZ3RoKSk7CisJCXByaW50ZigiZmlsZV9sZW5ndGg6ICV1XG4iLCBudG9obChoZWFkZXItPmZpcm13YXJlX2luZm8uZmlsZV9sZW5ndGgpKTsKKwkJcHJpbnRmKCJzd19wYXJ0OiAlLjIwc1xuIiwgaGVhZGVyLT5maXJtd2FyZV9pbmZvLnN3X3BhcnQpOworCQlwcmludGYoInRleHQxOiAlLjY0c1xuIiwgaGVhZGVyLT5maXJtd2FyZV9pbmZvLnRleHQxKTsKKwkJcHJpbnRmKCJ0aW1lOiAlLjEyc1xuIiwgaGVhZGVyLT5maXJtd2FyZV9pbmZvLnRpbWUpOworCQlwcmludGYoImRhdGU6ICUuMTRzXG4iLCBoZWFkZXItPmZpcm13YXJlX2luZm8uZGF0ZSk7CisJCXByaW50ZigidGV4dDI6ICUuMTBzXG4iLCBoZWFkZXItPmZpcm13YXJlX2luZm8udGV4dDIpOworCQlwcmludGYoInZlcnNpb246ICUuMjBzXG4iLCBoZWFkZXItPmZpcm13YXJlX2luZm8udmVyc2lvbik7CisJCXByaW50Zigic3ViaXRlbXMuLi5cbiIpOworCisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1Yl9lbnRyeSwgJmhlYWRlci0+aGVhZGVyX2xpc3QsIGVudHJ5KSB7CisJCQlwcmludGYoIlx0c29tZXRoaW5nMTogJXVcbiIsIHN1Yl9lbnRyeS0+aGVhZGVyX2VudHJ5LnNvbWV0aGluZzEpOworCQkJcHJpbnRmKCJcdHRleHQxOiAlLjY0c1xuIiwgc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkudGV4dDEpOworCQkJcHJpbnRmKCJcdHRpbWU6ICUuMTJzXG4iLCBzdWJfZW50cnktPmhlYWRlcl9lbnRyeS50aW1lKTsKKwkJCXByaW50ZigiXHRkYXRlOiAlLjE0c1xuIiwgc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkuZGF0ZSk7CisJCQlwcmludGYoIlx0dGV4dDI6ICUuMTBzXG4iLCBzdWJfZW50cnktPmhlYWRlcl9lbnRyeS50ZXh0Mik7CisJCQlwcmludGYoIlx0dmVyc2lvbjogJS4yMHNcbiIsIHN1Yl9lbnRyeS0+aGVhZGVyX2VudHJ5LnZlcnNpb24pOworCQkJcHJpbnRmKCJcdGxlbmd0aDogJXVcbiIsIG50b2hsKHN1Yl9lbnRyeS0+aGVhZGVyX2VudHJ5Lmxlbmd0aCkpOworCQkJcHJpbnRmKCJcdGFkZHIxOiAweCV4XG4iLCBudG9obChzdWJfZW50cnktPmhlYWRlcl9lbnRyeS5hZGRyMSkpOworCQkJcHJpbnRmKCJcdGFkZHIyOiAweCV4XG4iLCBudG9obChzdWJfZW50cnktPmhlYWRlcl9lbnRyeS5hZGRyMikpOworCQkJcHJpbnRmKCJcdHN0YXJ0OiAweCV4XG4iLCBudG9obChzdWJfZW50cnktPmhlYWRlcl9lbnRyeS5zdGFydCkpOworCQkJcHJpbnRmKCJcdGFicy4gb2Zmc2V0OiAweCVseFxuIiwgc3ViX2VudHJ5LT5hYnNvbHV0ZV9vZmZzZXQpOworCQkJcHJpbnRmKCJcblxuIik7CisKKwkJCWR1bXBfZW50cnkoc3ViX2VudHJ5LCBwYXJ0KyssIGZkKTsKKwkJfQorCQlwcmludGYoIlxuXG4iKTsKKwl9CisKKwlpZiAoY2xvc2UoZmQpICE9IDApIHsKKwkJcGVycm9yKCJDbG9zZSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXRhbGxvY19mcmVlKHRhbGxfZmlybV9jdHgpOworfQorCitzdGF0aWMgdm9pZCBwcmludF91c2FnZSh2b2lkKQoreworCXByaW50ZigiVXNhZ2U6IGlwYWNjZXNzLWNvbmZpZ1xuIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2hlbHAodm9pZCkKK3sKKwlwcmludGYoIiAgLXUgLS11bml0LWlkIFVOSVRfSURcbiIpOworCXByaW50ZigiICAtbyAtLW9tbC1pcCBpcFxuIik7CisJcHJpbnRmKCIgIC1yIC0tcmVzdGFydFxuIik7CisJcHJpbnRmKCIgIC1uIGZsYWdzL21hc2tcdFNldCBOVlJBTSBhdHRyaWJ1dGVzLlxuIik7CisJcHJpbnRmKCIgIC1sIC0tbGlzdGVuIHRlc3RuciBcdFBlcmZvcm0gc3BlY2lmaWVkIHRlc3QgbnVtYmVyXG4iKTsKKwlwcmludGYoIiAgLWggLS1oZWxwIHRoaXMgdGV4dFxuIik7CisJcHJpbnRmKCIgIC1zIC0tc3RyZWFtLWlkIElEXG4iKTsKKwlwcmludGYoIiAgLWQgLS1zb2Z0d2FyZSBmaXJtd2FyZVxuIik7CisJcHJpbnRmKCIgIC1mIC0tZmlybXdhcmUgZmlybXdhcmUgUHJvdmlkZSBmaXJtd2FyZSBpbmZvcm1hdGlvblxuIik7CisJcHJpbnRmKCIgIC13IC0td3JpdGUtZmlybXdhcmUuIFRoaXMgd2lsbCBkdW1wIHRoZSBmaXJtd2FyZSBwYXJ0cyB0byB0aGUgZmlsZXN5c3RlbS4gVXNlIHdpdGggLWYuXG4iKTsKK30KKworZXh0ZXJuIHZvaWQgYnRzX21vZGVsX25hbm9idHNfaW5pdCgpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworCWludCByYywgb3B0aW9uX2luZGV4ID0gMCwgc3RyZWFtX2lkID0gMHhmZjsKKwlzdHJ1Y3QgbG9nX3RhcmdldCAqc3RkZXJyX3RhcmdldDsKKworCWxvZ19pbml0KCZsb2dfaW5mbyk7CisJc3RkZXJyX3RhcmdldCA9IGxvZ190YXJnZXRfY3JlYXRlX3N0ZGVycigpOworCWxvZ19hZGRfdGFyZ2V0KHN0ZGVycl90YXJnZXQpOworCWxvZ19zZXRfYWxsX2ZpbHRlcihzdGRlcnJfdGFyZ2V0LCAxKTsKKwlsb2dfc2V0X2xvZ19sZXZlbChzdGRlcnJfdGFyZ2V0LCAwKTsKKwlsb2dfcGFyc2VfY2F0ZWdvcnlfbWFzayhzdGRlcnJfdGFyZ2V0LCAiRE5NLDAiKTsKKwlidHNfbW9kZWxfbmFub2J0c19pbml0KCk7CisKKwlwcmludGYoImlwYWNjZXNzLWNvbmZpZyAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGVcbiIpOworCXByaW50ZigiVGhpcyBpcyBGUkVFIFNPRlRXQVJFIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWVxuXG4iKTsKKworCXdoaWxlICgxKSB7CisJCWludCBjOworCQl1bnNpZ25lZCBsb25nIHVsOworCQljaGFyICpzbGFzaDsKKwkJc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisJCQl7ICJ1bml0LWlkIiwgMSwgMCwgJ3UnIH0sCisJCQl7ICJvbWwtaXAiLCAxLCAwLCAnbycgfSwKKwkJCXsgInJlc3RhcnQiLCAwLCAwLCAncicgfSwKKwkJCXsgImhlbHAiLCAwLCAwLCAnaCcgfSwKKwkJCXsgImxpc3RlbiIsIDEsIDAsICdsJyB9LAorCQkJeyAic3RyZWFtLWlkIiwgMSwgMCwgJ3MnIH0sCisJCQl7ICJzb2Z0d2FyZSIsIDEsIDAsICdkJyB9LAorCQkJeyAiZmlybXdhcmUiLCAxLCAwLCAnZicgfSwKKwkJCXsgIndyaXRlLWZpcm13YXJlIiwgMCwgMCwgJ3cnIH0sCisJCQl7IDAsIDAsIDAsIDAgfSwKKwkJfTsKKworCQljID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgInU6bzpybjpsOmhzOmQ6Zjp3IiwgbG9uZ19vcHRpb25zLAorCQkJCSZvcHRpb25faW5kZXgpOworCisJCWlmIChjID09IC0xKQorCQkJYnJlYWs7CisKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ3UnOgorCQkJdW5pdF9pZCA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdvJzoKKwkJCXByaW1fb21sX2lwID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ3InOgorCQkJcmVzdGFydCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnbic6CisJCQlzbGFzaCA9IHN0cmNocihvcHRhcmcsICcvJyk7CisJCQlpZiAoIXNsYXNoKQorCQkJCWV4aXQoMik7CisJCQl1bCA9IHN0cnRvdWwob3B0YXJnLCBOVUxMLCAxNik7CisJCQludl9mbGFncyA9IHVsICYgMHhmZmZmOworCQkJdWwgPSBzdHJ0b3VsKHNsYXNoKzEsIE5VTEwsIDE2KTsKKwkJCW52X21hc2sgPSB1bCAmIDB4ZmZmZjsKKwkJCWJyZWFrOworCQljYXNlICdsJzoKKwkJCW5ldF9saXN0ZW5fdGVzdG5yID0gYXRvaShvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJc3RyZWFtX2lkID0gYXRvaShvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkJc29mdHdhcmUgPSBzdHJkdXAob3B0YXJnKTsKKwkJCWlmIChmaW5kX3N3X2xvYWRfcGFyYW1zKG9wdGFyZykgIT0gMCkKKwkJCQlleGl0KDApOworCQkJYnJlYWs7CisJCWNhc2UgJ2YnOgorCQkJZmlybXdhcmVfYW5hbHlzaXMgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAndyc6CisJCQlkdW1wX2ZpbGVzID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdoJzoKKwkJCXByaW50X3VzYWdlKCk7CisJCQlwcmludF9oZWxwKCk7CisJCQlleGl0KDApOworCQl9CisJfTsKKworCWlmIChmaXJtd2FyZV9hbmFseXNpcykKKwkJYW5hbHl6ZV9maXJtd2FyZShmaXJtd2FyZV9hbmFseXNpcyk7CisKKwlpZiAob3B0aW5kID49IGFyZ2MpIHsKKwkJLyogb25seSB3YXJuIGlmIHdlIGhhdmUgbm90IGRvbmUgYW55dGhpbmcgZWxzZSAqLworCQlpZiAoIWZpcm13YXJlX2FuYWx5c2lzKQorCQkJZnByaW50ZihzdGRlcnIsICJ5b3UgaGF2ZSB0byBzcGVjaWZ5IHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBCVFMuIFVzZSAtLWhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb25cbiIpOworCQlleGl0KDIpOworCX0KKworCWdzbW5ldCA9IGdzbV9uZXR3b3JrX2luaXQoMSwgMSwgTlVMTCk7CisJaWYgKCFnc21uZXQpCisJCWV4aXQoMSk7CisKKwlidHMgPSBnc21fYnRzX2FsbG9jKGdzbW5ldCwgR1NNX0JUU19UWVBFX05BTk9CVFMsIEhBUkRDT0RFRF9UU0MsCisJCQkJSEFSRENPREVEX0JTSUMpOworCS8qIGlwLmFjY2VzcyBzdXBwb3J0cyB1cCB0byA0IGNoYWluZWQgVFJYICovCisJZ3NtX2J0c190cnhfYWxsb2MoYnRzKTsKKwlnc21fYnRzX3RyeF9hbGxvYyhidHMpOworCWdzbV9idHNfdHJ4X2FsbG9jKGJ0cyk7CisJYnRzLT5vbWxfdGVpID0gc3RyZWFtX2lkOworCQorCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX05NLCBubV9zaWdfY2IsIE5VTEwpOworCXByaW50ZigiVHJ5aW5nIHRvIGNvbm5lY3QgdG8gaXAuYWNjZXNzIEJUUyAuLi5cbiIpOworCisJbWVtc2V0KCZzaW4sIDAsIHNpemVvZihzaW4pKTsKKwlzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJaW5ldF9hdG9uKGFyZ3Zbb3B0aW5kXSwgJnNpbi5zaW5fYWRkcik7CisJcmMgPSBpYV9jb25maWdfY29ubmVjdChidHMsICZzaW4pOworCWlmIChyYyA8IDApIHsKKwkJcGVycm9yKCJFcnJvciBjb25uZWN0aW5nIHRvIHRoZSBCVFMiKTsKKwkJZXhpdCgxKTsKKwl9CisJCisJd2hpbGUgKDEpIHsKKwkJcmMgPSBic2Nfc2VsZWN0X21haW4oMCk7CisJCWlmIChyYyA8IDApCisJCQlleGl0KDMpOworCX0KKworCWV4aXQoMCk7Cit9CisKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLWZpbmQuYyBiL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLWZpbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzRhMGI3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtZmluZC5jCkBAIC0wLDAgKzEsMjA4IEBACisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKworI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RpbWVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9pcGFjY2Vzcy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKworc3RhdGljIGNvbnN0IGNoYXIgKmlkdGFnX25hbWVzW10gPSB7CisJW0lQQUNfSURUQUdfU0VSTlJdCT0gIlNlcmlhbCBOdW1iZXIiLAorCVtJUEFDX0lEVEFHX1VOSVROQU1FXQk9ICJVbml0IE5hbWUiLAorCVtJUEFDX0lEVEFHX0xPQ0FUSU9OMV0JPSAiTG9jYXRpb24gMSIsCisJW0lQQUNfSURUQUdfTE9DQVRJT04yXQk9ICJMb2NhdGlvbiAyIiwKKwlbSVBBQ19JRFRBR19FUVVJUFZFUlNdCT0gIkVxdWlwbWVudCBWZXJzaW9uIiwKKwlbSVBBQ19JRFRBR19TV1ZFUlNJT05dCT0gIlNvZnR3YXJlIFZlcnNpb24iLAorCVtJUEFDX0lEVEFHX0lQQUREUl0JPSAiSVAgQWRkcmVzcyIsCisJW0lQQUNfSURUQUdfTUFDQUREUl0JPSAiTUFDIEFkZHJlc3MiLAorCVtJUEFDX0lEVEFHX1VOSVRdCT0gIlVuaXQgSUQiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmlwYWNfaWR0YWdfbmFtZShpbnQgdGFnKQoreworCWlmICh0YWcgPj0gQVJSQVlfU0laRShpZHRhZ19uYW1lcykpCisJCXJldHVybiAidW5rbm93biI7CisKKwlyZXR1cm4gaWR0YWdfbmFtZXNbdGFnXTsKK30KKworc3RhdGljIGludCB1ZHBfc29jayhjb25zdCBjaGFyICppZm5hbWUpCit7CisJaW50IGZkLCByYywgYmMgPSAxOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzYTsKKworCWZkID0gc29ja2V0KFBGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gZmQ7CisKKwlpZiAoaWZuYW1lKSB7CisJCXJjID0gc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fQklORFRPREVWSUNFLCBpZm5hbWUsCisJCQkJc3RybGVuKGlmbmFtZSkpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBlcnI7CisJfQorCisJc2Euc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc2Euc2luX3BvcnQgPSBodG9ucygzMDA2KTsKKwlzYS5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOworCisJcmMgPSBiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyICopJnNhLCBzaXplb2Yoc2EpKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGVycjsKKworCXJjID0gc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fQlJPQURDQVNULCAmYmMsIHNpemVvZihiYykpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyOworCisjaWYgMAorCS8qIHdlIGNhbm5vdCBiaW5kLCBzaW5jZSB0aGUgcmVzcG9uc2UgcGFja2V0cyBkb24ndCBjb21lIGZyb20KKwkgKiB0aGUgYnJvYWRjYXN0IGFkZHJlc3MgKi8KKwlzYS5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlzYS5zaW5fcG9ydCA9IGh0b25zKDMwMDYpOworCWluZXRfYXRvbigiMjU1LjI1NS4yNTUuMjU1IiwgJnNhLnNpbl9hZGRyKTsKKworCXJjID0gY29ubmVjdChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzYSwgc2l6ZW9mKHNhKSk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBlcnI7CisjZW5kaWYKKwlyZXR1cm4gZmQ7CisKK2VycjoKKwljbG9zZShmZCk7CisJcmV0dXJuIHJjOworfQorCitjb25zdCB1bnNpZ25lZCBjaGFyIGZpbmRfcGt0W10gPSB7IDB4MDAsIDB4MGIrOCwgSVBBQ19QUk9UT19JUEFDQ0VTUywgMHgwMCwKKwkJCQlJUEFDX01TR1RfSURfR0VULAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX01BQ0FERFIsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfSVBBRERSLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX1VOSVQsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfTE9DQVRJT04xLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX0xPQ0FUSU9OMiwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19FUVVJUFZFUlMsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfU1dWRVJTSU9OLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX1VOSVROQU1FLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX1NFUk5SLAorCQkJCX07CisKKworc3RhdGljIGludCBiY2FzdF9maW5kKGludCBmZCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2E7CisKKwlzYS5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlzYS5zaW5fcG9ydCA9IGh0b25zKDMwMDYpOworCWluZXRfYXRvbigiMjU1LjI1NS4yNTUuMjU1IiwgJnNhLnNpbl9hZGRyKTsKKworCXJldHVybiBzZW5kdG8oZmQsIGZpbmRfcGt0LCBzaXplb2YoZmluZF9wa3QpLCAwLCAoc3RydWN0IHNvY2thZGRyICopICZzYSwgc2l6ZW9mKHNhKSk7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfcmVzcG9uc2UodW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCXVfaW50OF90IHRfbGVuOworCXVfaW50OF90IHRfdGFnOworCXVfaW50OF90ICpjdXIgPSBidWY7CisKKwl3aGlsZSAoY3VyIDwgYnVmICsgbGVuKSB7CisJCXRfbGVuID0gKmN1cisrOworCQl0X3RhZyA9ICpjdXIrKzsKKwkJCisJCXByaW50ZigiJXM9JyVzJyAgIiwgaXBhY19pZHRhZ19uYW1lKHRfdGFnKSwgY3VyKTsKKworCQljdXIgKz0gdF9sZW47CisJfQorCXByaW50ZigiXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX3Jlc3BvbnNlKGludCBmZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsyNTVdOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzYTsKKwlpbnQgbGVuOworCXNvY2tsZW5fdCBzYV9sZW4gPSBzaXplb2Yoc2EpOworCisJbGVuID0gcmVjdmZyb20oZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIDAsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2EsICZzYV9sZW4pOworCWlmIChsZW4gPCAwKQorCQlyZXR1cm4gbGVuOworCisJLyogMiBieXRlcyBsZW5ndGgsIDEgYnl0ZSBwcm90b2NvbCAoMHhmZSkgKi8KKwlpZiAoYnVmWzJdICE9IDB4ZmUpCisJCXJldHVybiAwOworCisJaWYgKGJ1Zls0XSAhPSBJUEFDX01TR1RfSURfUkVTUCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gcGFyc2VfcmVzcG9uc2UoYnVmKzYsIGxlbi02KTsKK30KKworc3RhdGljIGludCBiZmRfY2Ioc3RydWN0IGJzY19mZCAqYmZkLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJaWYgKGZsYWdzICYgQlNDX0ZEX1JFQUQpCisJCXJldHVybiByZWFkX3Jlc3BvbnNlKGJmZC0+ZmQpOworCWlmIChmbGFncyAmIEJTQ19GRF9XUklURSkgeworCQliZmQtPndoZW4gJj0gfkJTQ19GRF9XUklURTsKKwkJcmV0dXJuIGJjYXN0X2ZpbmQoYmZkLT5mZCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisKK3N0YXRpYyB2b2lkIHRpbWVyX2NiKHZvaWQgKl9kYXRhKQoreworCXN0cnVjdCBic2NfZmQgKmJmZCA9IF9kYXRhOworCisJYmZkLT53aGVuIHw9IEJTQ19GRF9XUklURTsKKworCWJzY19zY2hlZHVsZV90aW1lcigmdGltZXIsIDUsIDApOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGJzY19mZCBiZmQ7CisJY2hhciAqaWZuYW1lOworCWludCByYzsKKworCXByaW50ZigiaXBhY2Nlc3MtZmluZCAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGVcbiIpOworCXByaW50ZigiVGhpcyBpcyBGUkVFIFNPRlRXQVJFIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWVxuXG4iKTsKKworCWlmIChhcmdjIDwgMikgeworCQlmcHJpbnRmKHN0ZG91dCwgInlvdSBtaWdodCBuZWVkIHRvIHNwZWNpZnkgdGhlIG91dGdvaW5nXG4iCisJCQkiIG5ldHdvcmsgaW50ZXJmYWNlLCBlLmcuIGBgJXMgZXRoMCcnXG4iLCBhcmd2WzBdKTsKKwl9CisKKwlpZm5hbWUgPSBhcmd2WzFdOworCWJmZC5jYiA9IGJmZF9jYjsKKwliZmQud2hlbiA9IEJTQ19GRF9SRUFEIHwgQlNDX0ZEX1dSSVRFOworCWJmZC5mZCA9IHVkcF9zb2NrKGlmbmFtZSk7CisJaWYgKGJmZC5mZCA8IDApIHsKKwkJcGVycm9yKCJDYW5ub3QgY3JlYXRlIGxvY2FsIHNvY2tldCBmb3IgYnJvYWRjYXN0IHVkcCIpOworCQlleGl0KDEpOworCX0KKworCWJzY19yZWdpc3Rlcl9mZCgmYmZkKTsKKworCXRpbWVyLmNiID0gdGltZXJfY2I7CisJdGltZXIuZGF0YSA9ICZiZmQ7CisKKwlic2Nfc2NoZWR1bGVfdGltZXIoJnRpbWVyLCA1LCAwKTsKKworCXByaW50ZigiVHJ5aW5nIHRvIGZpbmQgaXAuYWNjZXNzIEJUUyBieSBicm9hZGNhc3QgVURQLi4uXG4iKTsKKworCXdoaWxlICgxKSB7CisJCXJjID0gYnNjX3NlbGVjdF9tYWluKDApOworCQlpZiAocmMgPCAwKQorCQkJZXhpdCgzKTsKKwl9CisKKwlleGl0KDApOworfQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1maXJtd2FyZS5jIGIvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtZmlybXdhcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzQwYzFlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtZmlybXdhcmUuYwpAQCAtMCwwICsxLDEzNiBAQAorLyogUm91dGluZXMgZm9yIHBhcnNpbmcgYW4gaXBhY2NlcyBTRFAgZmlybXdhcmUgZmlsZSAqLworCisvKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2lwYWNjZXNzLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjZGVmaW5lIFBBUlRfTEVOR1RIIDEzOAorCitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3Qgc2RwX2hlYWRlcl9lbnRyeSkgPT0gMTM4LCByaWdodF9lbnRyeSk7CitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3Qgc2RwX2Zpcm13YXJlKSA9PSAxNTgsIF9yaWdodF9oZWFkZXJfbGVuZ3RoKTsKKworLyogbW9yZSBtYWdpYywgdGhlIHNlY29uZCAiaW50IiBpbiB0aGUgaGVhZGVyICovCitzdGF0aWMgY2hhciBtb3JlX21hZ2ljW10gPSB7IDB4MTAsIDB4MDIgfTsKKworaW50IGlwYWNjZXNzX2FuYWx5emVfZmlsZShpbnQgZmQsIGNvbnN0IHVuc2lnbmVkIGludCBzdF9zaXplLCBjb25zdCB1bnNpZ25lZCBpbnQgYmFzZV9vZmZzZXQsIHN0cnVjdCBsbGlzdF9oZWFkICpsaXN0KQoreworCXN0cnVjdCBzZHBfZmlybXdhcmUgKmZpcm13YXJlX2hlYWRlciA9IDA7CisJc3RydWN0IHNkcF9oZWFkZXIgKmhlYWRlcjsKKwljaGFyIGJ1Zls0MDk2XTsKKwlpbnQgcmMsIGk7CisJdV9pbnQxNl90IHRhYmxlX3NpemU7CisJdV9pbnQxNl90IHRhYmxlX29mZnNldDsKKwlvZmZfdCB0YWJsZV9zdGFydDsKKworCisJcmMgPSByZWFkKGZkLCBidWYsIHNpemVvZigqZmlybXdhcmVfaGVhZGVyKSk7CisJaWYgKHJjIDwgMCkgeworCQlwZXJyb3IoIkNhbiBub3QgcmVhZCBoZWFkZXIgc3RhcnQuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlmaXJtd2FyZV9oZWFkZXIgPSAoc3RydWN0IHNkcF9maXJtd2FyZSAqKSAmYnVmWzBdOworCWlmIChzdHJuY21wKGZpcm13YXJlX2hlYWRlci0+bWFnaWMsICIgU0RQIiwgNCkgIT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIldyb25nIG1hZ2ljLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAobWVtY21wKGZpcm13YXJlX2hlYWRlci0+bW9yZV9tYWdpYywgbW9yZV9tYWdpYywgMikgIT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIldyb25nIG1vcmUgbWFnaWMuIEdvdDogMHgleCAleCAleCAleFxuIiwKKwkJCWZpcm13YXJlX2hlYWRlci0+bW9yZV9tYWdpY1swXSAmIDB4ZmYsIGZpcm13YXJlX2hlYWRlci0+bW9yZV9tYWdpY1sxXSAmIDB4ZmYsCisJCQlmaXJtd2FyZV9oZWFkZXItPm1vcmVfbWFnaWNbMl0gJiAweGZmLCBmaXJtd2FyZV9oZWFkZXItPm1vcmVfbWFnaWNbM10gJiAweGZmKTsKKwkJcmV0dXJuIC0xOworCX0KKworCisJaWYgKG50b2hsKGZpcm13YXJlX2hlYWRlci0+ZmlsZV9sZW5ndGgpICE9IHN0X3NpemUpIHsKKwkJZnByaW50ZihzdGRlcnIsICJUaGUgZmlsZXNpemUgYW5kIHRoZSBoZWFkZXIgZG8gbm90IG1hdGNoLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBhZGQgdGhlIGZpcm13YXJlICovCisJaGVhZGVyID0gdGFsbG9jX3plcm8obGlzdCwgc3RydWN0IHNkcF9oZWFkZXIpOworCWhlYWRlci0+ZmlybXdhcmVfaW5mbyA9ICpmaXJtd2FyZV9oZWFkZXI7CisJSU5JVF9MTElTVF9IRUFEKCZoZWFkZXItPmhlYWRlcl9saXN0KTsKKwlsbGlzdF9hZGQoJmhlYWRlci0+ZW50cnksIGxpc3QpOworCisJdGFibGVfb2Zmc2V0ID0gbnRvaHMoZmlybXdhcmVfaGVhZGVyLT50YWJsZV9vZmZzZXQpOworCXRhYmxlX3N0YXJ0ID0gbHNlZWsoZmQsIHRhYmxlX29mZnNldCwgU0VFS19DVVIpOworCWlmICh0YWJsZV9zdGFydCA9PSAtMSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBzZWVrIHRvIHRoZSByZWwgcG9zaXRpb246IDB4JXhcbiIsIHRhYmxlX29mZnNldCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAocmVhZChmZCwgJnRhYmxlX3NpemUsIHNpemVvZih0YWJsZV9zaXplKSkgIT0gc2l6ZW9mKHRhYmxlX3NpemUpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVGhlIHRhYmxlIHNpemUgY291bGQgbm90IGJlIHJlYWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXRhYmxlX3NpemUgPSBudG9ocyh0YWJsZV9zaXplKTsKKworCWlmICh0YWJsZV9zaXplICUgUEFSVF9MRU5HVEggIT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlRoZSBwYXJ0IGxlbmd0aCBzZWVtcyB0byBiZSB3cm9uZzogMHgleFxuIiwgdGFibGVfc2l6ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBsb29rIGludG8gZWFjaCBmaXJtd2FyZSBub3cgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdGFibGVfc2l6ZSAvIFBBUlRfTEVOR1RIOyArK2kpIHsKKwkJc3RydWN0IHNkcF9oZWFkZXJfZW50cnkgZW50cnk7CisJCXN0cnVjdCBzZHBfaGVhZGVyX2l0ZW0gKmhlYWRlcl9lbnRyeTsKKwkJdW5zaWduZWQgaW50IG9mZnNldCA9IHRhYmxlX3N0YXJ0ICsgMjsKKwkJb2Zmc2V0ICs9IGkgKiAxMzg7CisKKwkJaWYgKGxzZWVrKGZkLCBvZmZzZXQsIFNFRUtfU0VUKSAhPSBvZmZzZXQpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQ2FuIG5vdCBzZWVrIHRvIHRoZSBvZmZzZXQ6ICV1LlxuIiwgb2Zmc2V0KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXJjID0gcmVhZChmZCwgJmVudHJ5LCBzaXplb2YoZW50cnkpKTsKKwkJaWYgKHJjICE9IHNpemVvZihlbnRyeSkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQ2FuIG5vdCByZWFkIHRoZSBoZWFkZXIgZW50cnkuXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWhlYWRlcl9lbnRyeSA9IHRhbGxvY196ZXJvKGhlYWRlciwgIHN0cnVjdCBzZHBfaGVhZGVyX2l0ZW0pOworCQloZWFkZXJfZW50cnktPmhlYWRlcl9lbnRyeSA9IGVudHJ5OworCQloZWFkZXJfZW50cnktPmFic29sdXRlX29mZnNldCA9IGJhc2Vfb2Zmc2V0OworCQlsbGlzdF9hZGQoJmhlYWRlcl9lbnRyeS0+ZW50cnksICZoZWFkZXItPmhlYWRlcl9saXN0KTsKKworCQkvKiBub3cgd2UgbmVlZCB0byBmaW5kIHRoZSBTRFAgZmlsZS4uLiAqLworCQlvZmZzZXQgPSBudG9obChlbnRyeS5zdGFydCkgKyA0ICsgYmFzZV9vZmZzZXQ7CisJCWlmIChsc2VlayhmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gb2Zmc2V0KSB7CisJCQlwZXJyb3IoImNhbid0IHNlZWsgdG8gc2RwIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCisJCWlwYWNjZXNzX2FuYWx5emVfZmlsZShmZCwgbnRvaGwoZW50cnkubGVuZ3RoKSwgb2Zmc2V0LCBsaXN0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtcHJveHkuYyBiL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLXByb3h5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg2MDgxMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLXByb3h5LmMKQEAgLTAsMCArMSwxMTI4IEBACisvKiBPcGVuQlNDIEFiaXMvSVAgcHJveHkgaXAuYWNjZXNzIG5hbm9CVFMgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL2ZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvaXBhY2Nlc3MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKworc3RhdGljIHN0cnVjdCBsb2dfdGFyZ2V0ICpzdGRlcnJfdGFyZ2V0OworCisvKiBvbmUgaW5zdGFuY2Ugb2YgYW4gaXAuYWNjZXNzIHByb3RvY29sIHByb3h5ICovCitzdHJ1Y3QgaXBhX3Byb3h5IHsKKwkvKiBzb2NrZXQgd2hlcmUgd2UgbGlzdGVuIGZvciBpbmNvbWluZyBPTUwgZnJvbSBCVFMgKi8KKwlzdHJ1Y3QgYnNjX2ZkIG9tbF9saXN0ZW5fZmQ7CisJLyogc29ja2V0IHdoZXJlIHdlIGxpc3RlbiBmb3IgaW5jb21pbmcgUlNMIGZyb20gQlRTICovCisJc3RydWN0IGJzY19mZCByc2xfbGlzdGVuX2ZkOworCS8qIGxpc3Qgb2YgQlRTJ3MgKHN0cnVjdCBpcGFfYnRzX2Nvbm4gKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBidHNfbGlzdDsKKwkvKiB0aGUgQlNDIHJlY29ubmVjdCB0aW1lciAqLworCXN0cnVjdCB0aW1lcl9saXN0IHJlY29ubl90aW1lcjsKK307CisKKy8qIGdsb2JhbCBwb2ludGVyIHRvIHRoZSBwcm94eSBzdHJ1Y3R1cmUgKi8KK3N0YXRpYyBzdHJ1Y3QgaXBhX3Byb3h5ICppcHA7CisKK3N0cnVjdCBpcGFfcHJveHlfY29ubiB7CisJc3RydWN0IGJzY19mZCBmZDsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCB0eF9xdWV1ZTsKKwlzdHJ1Y3QgaXBhX2J0c19jb25uICpidHNfY29ubjsKK307CisKKyNkZWZpbmUgTUFYX1RSWCA0CisKKy8qIHJlcHJlc2VudHMgYSBwYXJ0aWN1bGFyIEJUUyBpbiBvdXIgcHJveHkgKi8KK3N0cnVjdCBpcGFfYnRzX2Nvbm4geworCS8qIGxpc3Qgb2YgQlRTJ3MgKGlwYV9wcm94eS0+YnRzX2xpc3QpICovCisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKwkvKiBiYWNrIHBvaW50ZXIgdG8gdGhlIHByb3h5IHdoaWNoIHdlIGJlbG9uZyB0byAqLworCXN0cnVjdCBpcGFfcHJveHkgKmlwcDsKKwkvKiB0aGUgdW5pdCBJRCBhcyBkZXRlcm1pbmVkIGJ5IENDTSAqLworCXN0cnVjdCB7CisJCXVfaW50MTZfdCBzaXRlX2lkOworCQl1X2ludDE2X3QgYnRzX2lkOworCX0gdW5pdF9pZDsKKworCS8qIGluY29taW5nIGNvbm5lY3Rpb25zIGZyb20gQlRTICovCisJc3RydWN0IGlwYV9wcm94eV9jb25uICpvbWxfY29ubjsKKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKnJzbF9jb25uW01BWF9UUlhdOworCisJLyogb3V0Z29pbmcgY29ubmVjdGlvbnMgdG8gQlNDICovCisJc3RydWN0IGlwYV9wcm94eV9jb25uICpic2Nfb21sX2Nvbm47CisJc3RydWN0IGlwYV9wcm94eV9jb25uICpic2NfcnNsX2Nvbm5bTUFYX1RSWF07CisKKwkvKiBVRFAgc29ja2V0cyBmb3IgQlRTIGFuZCBCU0MgaW5qZWN0aW9uICovCisJc3RydWN0IGJzY19mZCB1ZHBfYnRzX2ZkOworCXN0cnVjdCBic2NfZmQgdWRwX2JzY19mZDsKKworCWNoYXIgKmlkX3RhZ3NbMHhmZl07CisJdV9pbnQ4X3QgKmlkX3Jlc3A7CisJdW5zaWduZWQgaW50IGlkX3Jlc3BfbGVuOworfTsKKworZW51bSBpcHBfZmRfdHlwZSB7CisJT01MX0ZST01fQlRTID0gMSwKKwlSU0xfRlJPTV9CVFMgPSAyLAorCU9NTF9UT19CU0MgPSAzLAorCVJTTF9UT19CU0MgPSA0LAorCVVEUF9UT19CVFMgPSA1LAorCVVEUF9UT19CU0MgPSA2LAorfTsKKworLyogc29tZSBvZiB0aGUgY29kZSBhZ2FpbnN0IHdlIGxpbmsgZnJvbSBPcGVuQlNDIG5lZWRzIHRoaXMgKi8KK3ZvaWQgKnRhbGxfYnNjX2N0eDsKKworc3RhdGljIGNoYXIgKmxpc3Rlbl9pcGFkZHI7CitzdGF0aWMgY2hhciAqYnNjX2lwYWRkcjsKKworI2RlZmluZSBQUk9YWV9BTExPQ19TSVpFCTMwMAorCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgcG9uZ1tdID0geyAwLCAxLCBJUEFDX1BST1RPX0lQQUNDRVNTLCBJUEFDX01TR1RfUE9ORyB9Oworc3RhdGljIGNvbnN0IHVfaW50OF90IGlkX2Fja1tdID0geyAwLCAxLCBJUEFDX1BST1RPX0lQQUNDRVNTLCBJUEFDX01TR1RfSURfQUNLIH07CitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgaWRfcmVxW10gPSB7IDAsIDE3LCBJUEFDX1BST1RPX0lQQUNDRVNTLCBJUEFDX01TR1RfSURfR0VULAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX1VOSVQsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfTUFDQUREUiwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19MT0NBVElPTjEsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfTE9DQVRJT04yLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX0VRVUlQVkVSUywKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19TV1ZFUlNJT04sCisJCQkJCTB4MDEsIElQQUNfSURUQUdfVU5JVE5BTUUsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfU0VSTlIsCisJCQkJfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmlkdGFnX25hbWVzW10gPSB7CisJW0lQQUNfSURUQUdfU0VSTlJdCT0gIlNlcmlhbF9OdW1iZXIiLAorCVtJUEFDX0lEVEFHX1VOSVROQU1FXQk9ICJVbml0X05hbWUiLAorCVtJUEFDX0lEVEFHX0xPQ0FUSU9OMV0JPSAiTG9jYXRpb25fMSIsCisJW0lQQUNfSURUQUdfTE9DQVRJT04yXQk9ICJMb2NhdGlvbl8yIiwKKwlbSVBBQ19JRFRBR19FUVVJUFZFUlNdCT0gIkVxdWlwbWVudF9WZXJzaW9uIiwKKwlbSVBBQ19JRFRBR19TV1ZFUlNJT05dCT0gIlNvZnR3YXJlX1ZlcnNpb24iLAorCVtJUEFDX0lEVEFHX0lQQUREUl0JPSAiSVBfQWRkcmVzcyIsCisJW0lQQUNfSURUQUdfTUFDQUREUl0JPSAiTUFDX0FkZHJlc3MiLAorCVtJUEFDX0lEVEFHX1VOSVRdCT0gIlVuaXRfSUQiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmlwYWNfaWR0YWdfbmFtZShpbnQgdGFnKQoreworCWlmICh0YWcgPj0gQVJSQVlfU0laRShpZHRhZ19uYW1lcykpCisJCXJldHVybiAidW5rbm93biI7CisKKwlyZXR1cm4gaWR0YWdfbmFtZXNbdGFnXTsKK30KKworc3RhdGljIGludCBpcGFjX2lkdGFnX3BhcnNlKHN0cnVjdCB0bHZfcGFyc2VkICpkZWMsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwl1X2ludDhfdCB0X2xlbjsKKwl1X2ludDhfdCB0X3RhZzsKKwl1X2ludDhfdCAqY3VyID0gYnVmOworCisJd2hpbGUgKGN1ciA8IGJ1ZiArIGxlbikgeworCQl0X2xlbiA9ICpjdXIrKzsKKwkJdF90YWcgPSAqY3VyKys7CisKKwkJREVCVUdQQyhETUksICIlcz0nJXMnICIsIGlwYWNfaWR0YWdfbmFtZSh0X3RhZyksIGN1cik7CisKKwkJZGVjLT5sdlt0X3RhZ10ubGVuID0gdF9sZW47CisJCWRlYy0+bHZbdF90YWddLnZhbCA9IGN1cjsKKworCQljdXIgKz0gdF9sZW47CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX3VuaXRpZChjb25zdCBjaGFyICpzdHIsIHVfaW50MTZfdCAqc2l0ZV9pZCwgdV9pbnQxNl90ICpidHNfaWQsCisJCQl1X2ludDE2X3QgKnRyeF9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHVsOworCWNoYXIgKmVuZHB0cjsKKwljb25zdCBjaGFyICpucHRyOworCisJbnB0ciA9IHN0cjsKKwl1bCA9IHN0cnRvdWwobnB0ciwgJmVuZHB0ciwgMTApOworCWlmIChlbmRwdHIgPD0gbnB0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHNpdGVfaWQpCisJCSpzaXRlX2lkID0gdWwgJiAweGZmZmY7CisKKwlpZiAoKmVuZHB0cisrICE9ICcvJykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlucHRyID0gZW5kcHRyOworCXVsID0gc3RydG91bChucHRyLCAmZW5kcHRyLCAxMCk7CisJaWYgKGVuZHB0ciA8PSBucHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoYnRzX2lkKQorCQkqYnRzX2lkID0gdWwgJiAweGZmZmY7CisKKwlpZiAoKmVuZHB0cisrICE9ICcvJykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlucHRyID0gZW5kcHRyOworCXVsID0gc3RydG91bChucHRyLCAmZW5kcHRyLCAxMCk7CisJaWYgKGVuZHB0ciA8PSBucHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodHJ4X2lkKQorCQkqdHJ4X2lkID0gdWwgJiAweGZmZmY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpcGFfYnRzX2Nvbm4gKmZpbmRfYnRzX2J5X3VuaXRpZChzdHJ1Y3QgaXBhX3Byb3h5ICppcHAsCisJCQkJCQl1X2ludDE2X3Qgc2l0ZV9pZCwKKwkJCQkJCXVfaW50MTZfdCBidHNfaWQpCit7CisJc3RydWN0IGlwYV9idHNfY29ubiAqaXBiYzsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGlwYmMsICZpcHAtPmJ0c19saXN0LCBsaXN0KSB7CisJCWlmIChpcGJjLT51bml0X2lkLnNpdGVfaWQgPT0gc2l0ZV9pZCAmJgorCQkgICAgaXBiYy0+dW5pdF9pZC5idHNfaWQgPT0gYnRzX2lkKQorCQkJcmV0dXJuIGlwYmM7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBpcGFfcHJveHlfY29ubiAqYWxsb2NfY29ubih2b2lkKQoreworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqaXBjOworCisJaXBjID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4pOworCWlmICghaXBjKQorCQlyZXR1cm4gTlVMTDsKKworCUlOSVRfTExJU1RfSEVBRCgmaXBjLT50eF9xdWV1ZSk7CisKKwlyZXR1cm4gaXBjOworfQorCitzdGF0aWMgaW50IHN0b3JlX2lkdGFncyhzdHJ1Y3QgaXBhX2J0c19jb25uICppcGJjLCBzdHJ1Y3QgdGx2X3BhcnNlZCAqdGx2cCkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgbGVuOworCisJZm9yIChpID0gMDsgaSA8PSAweGZmOyBpKyspIHsKKwkJaWYgKCFUTFZQX1BSRVNFTlQodGx2cCwgaSkpCisJCQljb250aW51ZTsKKworCQlsZW4gPSBUTFZQX0xFTih0bHZwLCBpKTsKKyNpZiAwCisJCWlmICghaXBiYy0+aWRfdGFnc1tpXSkKKwkJCWlwYmMtPmlkX3RhZ3NbaV0gPSB0YWxsb2Nfc2l6ZSh0YWxsX2JzY19jdHgsIGxlbik7CisJCWVsc2UKKyNlbmRpZgorCQkJaXBiYy0+aWRfdGFnc1tpXSA9IHRhbGxvY19yZWFsbG9jX3NpemUoaXBiYywKKwkJCQkJCQkgIGlwYmMtPmlkX3RhZ3NbaV0sIGxlbik7CisJCWlmICghaXBiYy0+aWRfdGFnc1tpXSkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCW1lbXNldChpcGJjLT5pZF90YWdzW2ldLCAwLCBsZW4pOworCQkvL21lbWNweShpcGJjLT5pZF90YWdzW2ldLCBUTFZQX1ZBTCh0bHZwLCBpKSwgbGVuKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBpcGFfcHJveHlfY29ubiAqY29ubmVjdF9ic2Moc3RydWN0IHNvY2thZGRyX2luICpzYSwgaW50IHByaXZfbnIsIHZvaWQgKmRhdGEpOworCisjZGVmaW5lIGxvZ3BfaXBiY191aWQoc3MsIGx2bCwgaXBiYywgdHJ4X2lkKSBfbG9ncF9pcGJjX3VpZChzcywgbHZsLCBfX0ZJTEVfXywgX19MSU5FX18sIGlwYmMsIHRyeF9pZCkKKworc3RhdGljIHZvaWQgX2xvZ3BfaXBiY191aWQodW5zaWduZWQgaW50IHNzLCB1bnNpZ25lZCBpbnQgbHZsLCBjaGFyICpmaWxlLCBpbnQgbGluZSwKKwkJCSAgIHN0cnVjdCBpcGFfYnRzX2Nvbm4gKmlwYmMsIHVfaW50OF90IHRyeF9pZCkKK3sKKwlpZiAoaXBiYykKKwkJbG9ncDIoc3MsIGx2bCwgZmlsZSwgbGluZSwgMCwgIigldS8ldS8ldSkgIiwgaXBiYy0+dW5pdF9pZC5zaXRlX2lkLAorCQkgICAgIGlwYmMtPnVuaXRfaWQuYnRzX2lkLCB0cnhfaWQpOworCWVsc2UKKwkJbG9ncDIoc3MsIGx2bCwgZmlsZSwgbGluZSwgMCwgInVua25vd24gIik7Cit9CisKKy8qIFVEUCBzb2NrZXQgaGFuZGxpbmcgKi8KKworc3RhdGljIGludCBtYWtlX3NvY2soc3RydWN0IGJzY19mZCAqYmZkLCB1X2ludDE2X3QgcG9ydCwgaW50IHByb3RvLCBpbnQgcHJpdl9uciwKKwkJICAgICBpbnQgKCpjYikoc3RydWN0IGJzY19mZCAqZmQsIHVuc2lnbmVkIGludCB3aGF0KSwKKwkJICAgICB2b2lkICpkYXRhKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworCWludCByZXQsIG9uID0gMTsKKworCWJmZC0+ZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgcHJvdG8pOworCWJmZC0+Y2IgPSBjYjsKKwliZmQtPndoZW4gPSBCU0NfRkRfUkVBRDsKKwliZmQtPmRhdGEgPSBkYXRhOworCWJmZC0+cHJpdl9uciA9IHByaXZfbnI7CisKKwltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisJYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisJYWRkci5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOworCisJc2V0c29ja29wdChiZmQtPmZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZvbiwgc2l6ZW9mKG9uKSk7CisKKwlyZXQgPSBiaW5kKGJmZC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihhZGRyKSk7CisJaWYgKHJldCA8IDApIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiY291bGQgbm90IGJpbmQgc29ja2V0OiAlc1xuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldCA9IGJzY19yZWdpc3Rlcl9mZChiZmQpOworCWlmIChyZXQgPCAwKSB7CisJCXBlcnJvcigicmVnaXN0ZXIgVURQIGZkIik7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV91ZHBfcmVhZChzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IGlwYV9idHNfY29ubiAqaXBiYyA9IGJmZC0+ZGF0YTsKKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKm90aGVyX2Nvbm4gPSBOVUxMOworCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jKFBST1hZX0FMTE9DX1NJWkUsICJBYmlzL0lQIFVEUCIpOworCXN0cnVjdCBpcGFjY2Vzc19oZWFkICpoaDsKKwlpbnQgcmV0OworCisJLyogd2l0aCBVRFAgc29ja2V0cywgd2UgY2Fubm90IHJlYWQgcGFydGlhbCBwYWNrZXRzIGJ1dCBoYXZlIHRvIHJlYWQKKwkgKiBhbGwgb2YgaXQgaW4gb25lIGdvICovCisJaGggPSAoc3RydWN0IGlwYWNjZXNzX2hlYWQgKikgbXNnLT5kYXRhOworCXJldCA9IHJlY3YoYmZkLT5mZCwgbXNnLT5kYXRhLCBtc2ctPmRhdGFfbGVuLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlpZiAoZXJybm8gIT0gRUFHQUlOKQorCQkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAicmVjdiBlcnJvciAgJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCW1zZ2JfZnJlZShtc2cpOworCQlyZXR1cm4gcmV0OworCX0KKwlpZiAocmV0ID09IDApIHsKKwkJREVCVUdQKERJTlAsICJVRFAgcGVlciBkaXNhcHBlYXJlZCwgZGVhZCBzb2NrZXRcbiIpOworCQlic2NfdW5yZWdpc3Rlcl9mZChiZmQpOworCQljbG9zZShiZmQtPmZkKTsKKwkJYmZkLT5mZCA9IC0xOworCQltc2diX2ZyZWUobXNnKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmIChyZXQgPCBzaXplb2YoKmhoKSkgeworCQlERUJVR1AoRElOUCwgImNvdWxkIG5vdCBldmVuIHJlYWQgaGVhZGVyIT8hXG4iKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCXJldHVybiAtRUlPOworCX0KKwltc2diX3B1dChtc2csIHJldCk7CisJbXNnLT5sMmggPSBtc2ctPmRhdGEgKyBzaXplb2YoKmhoKTsKKwlERUJVR1AoRE1JLCAiVURQIFJYOiAlc1xuIiwgaGV4ZHVtcChtc2ctPmRhdGEsIG1zZy0+bGVuKSk7CisKKwlpZiAoaGgtPmxlbiAhPSBtc2ctPmxlbiAtIHNpemVvZigqaGgpKSB7CisJCURFQlVHUChESU5QLCAibGVuZ3RoICgldS8ldSkgZGlzYWdyZWVzIHdpdGggaGVhZGVyKCV1KVxuIiwKKwkJCW1zZy0+bGVuLCBtc2ctPmxlbiAtIDMsIGhoLT5sZW4pOworCQltc2diX2ZyZWUobXNnKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJc3dpdGNoIChiZmQtPnByaXZfbnIgJiAweGZmKSB7CisJY2FzZSBVRFBfVE9fQlRTOgorCQkvKiBpbmplY3Rpb24gdG93YXJkcyBCVFMgKi8KKwkJc3dpdGNoIChoaC0+cHJvdG8pIHsKKwkJY2FzZSBJUEFDX1BST1RPX1JTTDoKKwkJCS8qIEZJWE1FOiB3aGF0IHRvIGRvIGFib3V0IFRSWCA+IDAgKi8KKwkJCW90aGVyX2Nvbm4gPSBpcGJjLT5yc2xfY29ublswXTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJREVCVUdQKERJTlAsICJVbmtub3duIHByb3RvY29sIDB4JTAyeCwgc2VuZGluZyB0byAiCisJCQkJIk9NTCBGRFxuIiwgaGgtPnByb3RvKTsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIElQQUNfUFJPVE9fSVBBQ0NFU1M6CisJCWNhc2UgSVBBQ19QUk9UT19PTUw6CisJCQlvdGhlcl9jb25uID0gaXBiYy0+b21sX2Nvbm47CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIFVEUF9UT19CU0M6CisJCS8qIGluamVjdGlvbiB0b3dhcmRzIEJTQyAqLworCQlzd2l0Y2ggKGhoLT5wcm90bykgeworCQljYXNlIElQQUNfUFJPVE9fUlNMOgorCQkJLyogRklYTUU6IHdoYXQgdG8gZG8gYWJvdXQgVFJYID4gMCAqLworCQkJb3RoZXJfY29ubiA9IGlwYmMtPmJzY19yc2xfY29ublswXTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJREVCVUdQKERJTlAsICJVbmtub3duIHByb3RvY29sIDB4JTAyeCwgc2VuZGluZyB0byAiCisJCQkJIk9NTCBGRFxuIiwgaGgtPnByb3RvKTsKKwkJY2FzZSBJUEFDX1BST1RPX0lQQUNDRVNTOgorCQljYXNlIElQQUNfUFJPVE9fT01MOgorCQkJb3RoZXJfY29ubiA9IGlwYmMtPmJzY19vbWxfY29ubjsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUChESU5QLCAiVW5rbm93biBmaWxlZGVzY3JpcHRvciBwcml2X25yPSUwNHhcbiIsIGJmZC0+cHJpdl9ucik7CisJCWJyZWFrOworCX0KKworCWlmIChvdGhlcl9jb25uKSB7CisJCS8qIGVucXVldWUgdGhlIG1lc3NhZ2UgZm9yIFRYIG9uIHRoZSByZXNwZWN0aXZlIEZEICovCisJCW1zZ2JfZW5xdWV1ZSgmb3RoZXJfY29ubi0+dHhfcXVldWUsIG1zZyk7CisJCW90aGVyX2Nvbm4tPmZkLndoZW4gfD0gQlNDX0ZEX1dSSVRFOworCX0gZWxzZQorCQltc2diX2ZyZWUobXNnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV91ZHBfd3JpdGUoc3RydWN0IGJzY19mZCAqYmZkKQoreworCS8qIG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KKwliZmQtPndoZW4gJj0gfkJTQ19GRF9XUklURTsKKworCXJldHVybiAtRUlPOworfQorCisvKiBjYWxsYmFjayBmcm9tIHNlbGVjdC5jIGluIGNhc2Ugb25lIG9mIHRoZSBmZCdzIGNhbiBiZSByZWFkL3dyaXR0ZW4gKi8KK3N0YXRpYyBpbnQgdWRwX2ZkX2NiKHN0cnVjdCBic2NfZmQgKmJmZCwgdW5zaWduZWQgaW50IHdoYXQpCit7CisJaW50IHJjID0gMDsKKworCWlmICh3aGF0ICYgQlNDX0ZEX1JFQUQpCisJCXJjID0gaGFuZGxlX3VkcF9yZWFkKGJmZCk7CisJaWYgKHdoYXQgJiBCU0NfRkRfV1JJVEUpCisJCXJjID0gaGFuZGxlX3VkcF93cml0ZShiZmQpOworCisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBpbnQgaXBiY19hbGxvY19jb25uZWN0KHN0cnVjdCBpcGFfcHJveHlfY29ubiAqaXBjLCBzdHJ1Y3QgYnNjX2ZkICpiZmQsCisJCQkgICAgICB1X2ludDE2X3Qgc2l0ZV9pZCwgdV9pbnQxNl90IGJ0c19pZCwKKwkJCSAgICAgIHVfaW50MTZfdCB0cnhfaWQsIHN0cnVjdCB0bHZfcGFyc2VkICp0bHZwLAorCQkJICAgICAgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgaXBhX2J0c19jb25uICppcGJjOworCXVfaW50MTZfdCB1ZHBfcG9ydDsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworCisJbWVtc2V0KCZzaW4sIDAsIHNpemVvZihzaW4pKTsKKwlzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJaW5ldF9hdG9uKGJzY19pcGFkZHIsICZzaW4uc2luX2FkZHIpOworCisJREVCVUdQKERJTlAsICIoJXUvJXUvJXUpIE5ldyBCVFMgY29ubmVjdGlvbjogIiwKKwkJc2l0ZV9pZCwgYnRzX2lkLCB0cnhfaWQpOworCisJLyogT01MIG5lZWRzIHRvIGJlIGVzdGFibGlzaGVkIGJlZm9yZSBSU0wgKi8KKwlpZiAoKGJmZC0+cHJpdl9uciAmIDB4ZmYpICE9IE9NTF9GUk9NX0JUUykgeworCQlERUJVR1BDKERJTlAsICJOb3QgYSBPTUwgY29ubmVjdGlvbiA/IT9cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBhbGxvY2F0ZSBuZXcgQlRTIGNvbm5lY3Rpb24gZGF0YSBzdHJ1Y3R1cmUgKi8KKwlpcGJjID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgaXBhX2J0c19jb25uKTsKKwlpZiAoIWlwYmMpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCURFQlVHUEMoRElOUCwgIkNyZWF0ZWQgQlRTIENvbm4gZGF0YSBzdHJ1Y3R1cmVcbiIpOworCWlwYmMtPmlwcCA9IGlwcDsKKwlpcGJjLT51bml0X2lkLnNpdGVfaWQgPSBzaXRlX2lkOworCWlwYmMtPnVuaXRfaWQuYnRzX2lkID0gYnRzX2lkOworCWlwYmMtPm9tbF9jb25uID0gaXBjOworCWlwYy0+YnRzX2Nvbm4gPSBpcGJjOworCisJLyogc3RvcmUgdGhlIGNvbnRlbnQgb2YgdGhlIElEIFRBR1MgZm9yIGxhdGVyIHJlZmVyZW5jZSAqLworCXN0b3JlX2lkdGFncyhpcGJjLCB0bHZwKTsKKwlpcGJjLT5pZF9yZXNwX2xlbiA9IG1zZy0+bGVuOworCWlwYmMtPmlkX3Jlc3AgPSB0YWxsb2Nfc2l6ZSh0YWxsX2JzY19jdHgsIGlwYmMtPmlkX3Jlc3BfbGVuKTsKKwltZW1jcHkoaXBiYy0+aWRfcmVzcCwgbXNnLT5kYXRhLCBpcGJjLT5pZF9yZXNwX2xlbik7CisKKwkvKiBDcmVhdGUgT01MIFRDUCBjb25uZWN0aW9uIHRvd2FyZHMgQlNDICovCisJc2luLnNpbl9wb3J0ID0gaHRvbnMoSVBBX1RDUF9QT1JUX09NTCk7CisJaXBiYy0+YnNjX29tbF9jb25uID0gY29ubmVjdF9ic2MoJnNpbiwgT01MX1RPX0JTQywgaXBiYyk7CisJaWYgKCFpcGJjLT5ic2Nfb21sX2Nvbm4pIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJfYnNjX2Nvbm47CisJfQorCisJREVCVUdQKERJTlAsICIoJXUvJXUvJXUpIE9NTCBDb25uZWN0ZWQgdG8gQlNDXG4iLAorCQlzaXRlX2lkLCBidHNfaWQsIHRyeF9pZCk7CisKKwkvKiBDcmVhdGUgVURQIHNvY2tldCBmb3IgQlRTIHBhY2tldCBpbmplY3Rpb24gKi8KKwl1ZHBfcG9ydCA9IDEwMDAwICsgKHNpdGVfaWQgJSAxMDAwKSoxMDAgKyAoYnRzX2lkICUgMTAwKTsKKwlyZXQgPSBtYWtlX3NvY2soJmlwYmMtPnVkcF9idHNfZmQsIHVkcF9wb3J0LCBJUFBST1RPX1VEUCwKKwkJCVVEUF9UT19CVFMsIHVkcF9mZF9jYiwgaXBiYyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3VkcF9idHM7CisJREVCVUdQKERJTlAsICIoJXUvJXUvJXUpIENyZWF0ZWQgVURQIHNvY2tldCBmb3IgaW5qZWN0aW9uICIKKwkJInRvd2FyZHMgQlRTIGF0IHBvcnQgJXVcbiIsIHNpdGVfaWQsIGJ0c19pZCwgdHJ4X2lkLCB1ZHBfcG9ydCk7CisKKwkvKiBDcmVhdGUgVURQIHNvY2tldCBmb3IgQlNDIHBhY2tldCBpbmplY3Rpb24gKi8KKwl1ZHBfcG9ydCA9IDIwMDAwICsgKHNpdGVfaWQgJSAxMDAwKSoxMDAgKyAoYnRzX2lkICUgMTAwKTsKKwlyZXQgPSBtYWtlX3NvY2soJmlwYmMtPnVkcF9ic2NfZmQsIHVkcF9wb3J0LCBJUFBST1RPX1VEUCwKKwkJCVVEUF9UT19CU0MsIHVkcF9mZF9jYiwgaXBiYyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3VkcF9ic2M7CisJREVCVUdQKERJTlAsICIoJXUvJXUvJXUpIENyZWF0ZWQgVURQIHNvY2tldCBmb3IgaW5qZWN0aW9uICIKKwkJInRvd2FyZHMgQlNDIGF0IHBvcnQgJXVcbiIsIHNpdGVfaWQsIGJ0c19pZCwgdHJ4X2lkLCB1ZHBfcG9ydCk7CisJbGxpc3RfYWRkKCZpcGJjLT5saXN0LCAmaXBwLT5idHNfbGlzdCk7CisKKwlyZXR1cm4gMDsKKworZXJyX3VkcF9ic2M6CisJYnNjX3VucmVnaXN0ZXJfZmQoJmlwYmMtPnVkcF9idHNfZmQpOworZXJyX3VkcF9idHM6CisJYnNjX3VucmVnaXN0ZXJfZmQoJmlwYmMtPmJzY19vbWxfY29ubi0+ZmQpOworCWNsb3NlKGlwYmMtPmJzY19vbWxfY29ubi0+ZmQuZmQpOworCXRhbGxvY19mcmVlKGlwYmMtPmJzY19vbWxfY29ubik7CisJaXBiYy0+YnNjX29tbF9jb25uID0gTlVMTDsKK2Vycl9ic2NfY29ubjoKKwl0YWxsb2NfZnJlZShpcGJjLT5pZF9yZXNwKTsKKwl0YWxsb2NfZnJlZShpcGJjKTsKKyNpZiAwCisJYnNjX3VucmVnaXN0ZXJfZmQoYmZkKTsKKwljbG9zZShiZmQtPmZkKTsKKwl0YWxsb2NfZnJlZShiZmQpOworI2VuZGlmCitlcnJfb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXBhY2Nlc3NfcmN2bXNnKHN0cnVjdCBpcGFfcHJveHlfY29ubiAqaXBjLCBzdHJ1Y3QgbXNnYiAqbXNnLAorCQkJICAgc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCB0bHZfcGFyc2VkIHRsdnA7CisJdV9pbnQ4X3QgbXNnX3R5cGUgPSAqKG1zZy0+bDJoKTsKKwl1X2ludDE2X3Qgc2l0ZV9pZCwgYnRzX2lkLCB0cnhfaWQ7CisJc3RydWN0IGlwYV9idHNfY29ubiAqaXBiYzsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAobXNnX3R5cGUpIHsKKwljYXNlIElQQUNfTVNHVF9QSU5HOgorCQlyZXQgPSB3cml0ZShiZmQtPmZkLCBwb25nLCBzaXplb2YocG9uZykpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCWlmIChyZXQgPCBzaXplb2YocG9uZykpIHsKKwkJCURFQlVHUChESU5QLCAic2hvcnQgd3JpdGVcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJUEFDX01TR1RfUE9ORzoKKwkJREVCVUdQKERNSSwgIlBPTkchXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBJUEFDX01TR1RfSURfUkVTUDoKKwkJREVCVUdQKERNSSwgIklEX1JFU1AgIik7CisJCS8qIHBhcnNlIHRhZ3MsIHNlYXJjaCBmb3IgVW5pdCBJRCAqLworCQlpcGFjX2lkdGFnX3BhcnNlKCZ0bHZwLCAodV9pbnQ4X3QgKiltc2ctPmwyaCArIDIsCisJCQkJIG1zZ2JfbDJsZW4obXNnKS0yKTsKKwkJREVCVUdQKERNSSwgIlxuIik7CisKKwkJaWYgKCFUTFZQX1BSRVNFTlQoJnRsdnAsIElQQUNfSURUQUdfVU5JVCkpIHsKKwkJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgIk5vIFVuaXQgSUQgaW4gSUQgUkVTUE9OU0UgIT8hXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJLyogbG9va3VwIEJUUywgY3JlYXRlIHNpZ25fbGluaywgLi4uICovCisJCXNpdGVfaWQgPSBidHNfaWQgPSB0cnhfaWQgPSAwOworCQlwYXJzZV91bml0aWQoKGNoYXIgKilUTFZQX1ZBTCgmdGx2cCwgSVBBQ19JRFRBR19VTklUKSwKKwkJCSAgICAgJnNpdGVfaWQsICZidHNfaWQsICZ0cnhfaWQpOworCQlpcGJjID0gZmluZF9idHNfYnlfdW5pdGlkKGlwcCwgc2l0ZV9pZCwgYnRzX2lkKTsKKwkJaWYgKCFpcGJjKSB7CisJCQkvKiBXZSBoYXZlIG5vdCBmb3VuZCBhbiBpcGJjIChwZXItYnRzIHByb3h5IGluc3RhbmNlKQorCQkJICogZm9yIHRoaXMgQlRTIHlldC4gIFRoZSBmaXJzdCBjb25uZWN0aW9uIG9mIGEgbmV3IEJUUyBtdXN0CisJCQkgKiBiZSBhIE9NTCBjb25uZWN0aW9uLiAgV2UgYWxsb2NhdGUgdGhlIGFzc29jaWF0ZWQgZGF0YSBzdHJ1Y3R1cmVzLAorCQkJICogYW5kIHRyeSB0byBjb25uZWN0IHRvIHRoZSByZW1vdGUgZW5kICovCisKKwkJCXJldHVybiBpcGJjX2FsbG9jX2Nvbm5lY3QoaXBjLCBiZmQsIHNpdGVfaWQsIGJ0c19pZCwKKwkJCQkJCSAgdHJ4X2lkLCAmdGx2cCwgbXNnKTsKKwkJCS8qIGlmIHRoaXMgZmFpbHMsIHRoZSBjYWxsZXIgd2lsbCBjbGVhbiB1cCBiZmQgKi8KKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisJCQltZW1zZXQoJnNpbiwgMCwgc2l6ZW9mKHNpbikpOworCQkJc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQkJaW5ldF9hdG9uKGJzY19pcGFkZHIsICZzaW4uc2luX2FkZHIpOworCisJCQlERUJVR1AoRElOUCwgIklkZW50aWZpZWQgQlRTICV1LyV1LyV1XG4iLAorCQkJCXNpdGVfaWQsIGJ0c19pZCwgdHJ4X2lkKTsKKworCQkJaWYgKChiZmQtPnByaXZfbnIgJiAweGZmKSAhPSBSU0xfRlJPTV9CVFMpIHsKKwkJCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJTZWNvbmQgT01MIGNvbm5lY3Rpb24gZnJvbSAiCisJCQkJICAgICAic2FtZSBCVFMgPyE/XG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJaWYgKHRyeF9pZCA+IE1BWF9UUlgpIHsKKwkJCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJXZSBkb24ndCBzdXBwb3J0IG1vcmUgIgorCQkJCSAgICAgInRoYW4gJXUgVFJYXG4iLCBNQVhfVFJYKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQkJaXBjLT5idHNfY29ubiA9IGlwYmM7CisJCQkvKiBzdG9yZSBUUlggbnVtYmVyIGluIGhpZ2hlciA4IGJpdCBvZiB0aGUgYmZkIHByaXZhdGUgbnVtYmVyICovCisJCQliZmQtPnByaXZfbnIgfD0gdHJ4X2lkIDw8IDg7CisJCQlpcGJjLT5yc2xfY29ublt0cnhfaWRdID0gaXBjOworCisJCQkvKiBDcmVhdGUgUlNMIFRDUCBjb25uZWN0aW9uIHRvd2FyZHMgQlNDICovCisJCQlzaW4uc2luX3BvcnQgPSBodG9ucyhJUEFfVENQX1BPUlRfUlNMKTsKKwkJCWlwYmMtPmJzY19yc2xfY29ublt0cnhfaWRdID0KKwkJCQljb25uZWN0X2JzYygmc2luLCBSU0xfVE9fQlNDIHwgKHRyeF9pZCA8PCA4KSwgaXBiYyk7CisJCQlpZiAoIWlwYmMtPmJzY19vbWxfY29ubikKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCURFQlVHUChESU5QLCAiKCV1LyV1LyV1KSBDb25uZWN0ZWQgUlNMIHRvIEJTQ1xuIiwKKwkJCQlzaXRlX2lkLCBidHNfaWQsIHRyeF9pZCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJUEFDX01TR1RfSURfR0VUOgorCQlERUJVR1AoRE1JLCAiSURfR0VUXG4iKTsKKwkJaWYgKChiZmQtPnByaXZfbnIgJiAweGZmKSAhPSBPTUxfVE9fQlNDICYmCisJCSAgICAoYmZkLT5wcml2X25yICYgMHhmZikgIT0gUlNMX1RPX0JTQykgeworCQkJREVCVUdQKERJTlAsICJJRGVudGl0eSBSRVF1ZXN0IGZyb20gQlRTID8hP1xuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlpcGJjID0gaXBjLT5idHNfY29ubjsKKwkJaWYgKCFpcGJjKSB7CisJCQlERUJVR1AoRElOUCwgIklEX0dFVCBmcm9tIEJTQyBiZWZvcmUgd2UgaGF2ZSBJRF9SRVNQIGZyb20gQlRTXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCXJldCA9IHdyaXRlKGJmZC0+ZmQsIGlwYmMtPmlkX3Jlc3AsIGlwYmMtPmlkX3Jlc3BfbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBJUEFDX01TR1RfSURfQUNLOgorCQlERUJVR1AoRE1JLCAiSURfQUNLPyAtPiBBQ0shXG4iKTsKKwkJcmV0ID0gd3JpdGUoYmZkLT5mZCwgaWRfYWNrLCBzaXplb2YoaWRfYWNrKSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IG1zZ2IgKmlwYWNjZXNzX3JlYWRfbXNnKHN0cnVjdCBic2NfZmQgKmJmZCwgaW50ICplcnJvcikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvYyhQUk9YWV9BTExPQ19TSVpFLCAiQWJpcy9JUCIpOworCXN0cnVjdCBpcGFjY2Vzc19oZWFkICpoaDsKKwlpbnQgbGVuLCByZXQgPSAwOworCisJaWYgKCFtc2cpIHsKKwkJKmVycm9yID0gLUVOT01FTTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogZmlyc3QgcmVhZCBvdXIgMy1ieXRlIGhlYWRlciAqLworCWhoID0gKHN0cnVjdCBpcGFjY2Vzc19oZWFkICopIG1zZy0+ZGF0YTsKKwlyZXQgPSByZWN2KGJmZC0+ZmQsIG1zZy0+ZGF0YSwgMywgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJaWYgKGVycm5vICE9IEVBR0FJTikKKwkJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgInJlY3YgZXJyb3I6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQltc2diX2ZyZWUobXNnKTsKKwkJKmVycm9yID0gcmV0OworCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UgaWYgKHJldCA9PSAwKSB7CisJCW1zZ2JfZnJlZShtc2cpOworCQkqZXJyb3IgPSByZXQ7CisJCXJldHVybiBOVUxMOworCX0KKworCW1zZ2JfcHV0KG1zZywgcmV0KTsKKworCS8qIHRoZW4gcmVhZCB0ZSBsZW5ndGggYXMgc3BlY2lmaWVkIGluIGhlYWRlciAqLworCW1zZy0+bDJoID0gbXNnLT5kYXRhICsgc2l6ZW9mKCpoaCk7CisJbGVuID0gbnRvaHMoaGgtPmxlbik7CisJcmV0ID0gcmVjdihiZmQtPmZkLCBtc2ctPmwyaCwgbGVuLCAwKTsKKwlpZiAocmV0IDwgbGVuKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgInNob3J0IHJlYWQhXG4iKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCSplcnJvciA9IC1FSU87CisJCXJldHVybiBOVUxMOworCX0KKwltc2diX3B1dChtc2csIHJldCk7CisKKwlyZXR1cm4gbXNnOworfQorCitzdGF0aWMgc3RydWN0IGlwYV9wcm94eV9jb25uICppcGNfYnlfcHJpdl9ucihzdHJ1Y3QgaXBhX2J0c19jb25uICppcGJjLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBwcml2X25yKQoreworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqYnNjX2Nvbm47CisJdW5zaWduZWQgaW50IHRyeF9pZCA9IHByaXZfbnIgPj4gODsKKworCXN3aXRjaCAocHJpdl9uciAmIDB4ZmYpIHsKKwljYXNlIE9NTF9GUk9NX0JUUzogLyogaW5jb21pbmcgT01MIGRhdGEgZnJvbSBCVFMsIGZvcndhcmQgdG8gQlNDIE9NTCAqLworCQlic2NfY29ubiA9IGlwYmMtPmJzY19vbWxfY29ubjsKKwkJYnJlYWs7CisJY2FzZSBSU0xfRlJPTV9CVFM6IC8qIGluY29taW5nIFJTTCBkYXRhIGZyb20gQlRTLCBmb3J3YXJkIHRvIEJTQyBSU0wgKi8KKwkJYnNjX2Nvbm4gPSBpcGJjLT5ic2NfcnNsX2Nvbm5bdHJ4X2lkXTsKKwkJYnJlYWs7CisJY2FzZSBPTUxfVE9fQlNDOiAvKiBpbmNvbWluZyBPTUwgZGF0YSBmcm9tIEJTQywgZm9yd2FyZCB0byBCVFMgT01MICovCisJCWJzY19jb25uID0gaXBiYy0+b21sX2Nvbm47CisJCWJyZWFrOworCWNhc2UgUlNMX1RPX0JTQzogLyogaW5jb21pbmcgUlNMIGRhdGEgZnJvbSBCU0MsIGZvcndhcmQgdG8gQlRTIFJTTCAqLworCQlic2NfY29ubiA9IGlwYmMtPnJzbF9jb25uW3RyeF9pZF07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJzY19jb25uID0gTlVMTDsKKwkJYnJlYWs7CisJfQorCXJldHVybiBic2NfY29ubjsKK30KKworc3RhdGljIHZvaWQgcmVjb25uX3Rtcl9jYih2b2lkICpkYXRhKQoreworCXN0cnVjdCBpcGFfcHJveHkgKmlwcCA9IGRhdGE7CisJc3RydWN0IGlwYV9idHNfY29ubiAqaXBiYzsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworCWludCBpOworCisJREVCVUdQKERJTlAsICJSdW5uaW5nIHJlY29ubmVjdCB0aW1lclxuIik7CisKKwltZW1zZXQoJnNpbiwgMCwgc2l6ZW9mKHNpbikpOworCXNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlpbmV0X2F0b24oYnNjX2lwYWRkciwgJnNpbi5zaW5fYWRkcik7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShpcGJjLCAmaXBwLT5idHNfbGlzdCwgbGlzdCkgeworCQkvKiBpZiBPTUwgdG8gQlNDIGlzIGRlYWQsIHRyeSB0byByZXN0b3JlIGl0ICovCisJCWlmIChpcGJjLT5vbWxfY29ubiAmJiAhaXBiYy0+YnNjX29tbF9jb25uKSB7CisJCQlzaW4uc2luX3BvcnQgPSBodG9ucyhJUEFfVENQX1BPUlRfT01MKTsKKwkJCWxvZ3BfaXBiY191aWQoRElOUCwgTE9HTF9OT1RJQ0UsIGlwYmMsIDApOworCQkJTE9HUEMoRElOUCwgTE9HTF9OT1RJQ0UsICJPTUwgVHJ5aW5nIHRvIHJlY29ubmVjdFxuIik7CisJCQlpcGJjLT5ic2Nfb21sX2Nvbm4gPSBjb25uZWN0X2JzYygmc2luLCBPTUxfVE9fQlNDLCBpcGJjKTsKKwkJCWlmICghaXBiYy0+YnNjX29tbF9jb25uKQorCQkJCWdvdG8gcmVzY2hlZHVsZTsKKwkJCWxvZ3BfaXBiY191aWQoRElOUCwgTE9HTF9OT1RJQ0UsIGlwYmMsIDApOworCQkJTE9HUEMoRElOUCwgTE9HTF9OT1RJQ0UsICJPTUwgUmVjb25uZWN0ZWRcbiIpOworCQl9CisJCS8qIGlmIHdlIChzdGlsbCkgZG9uJ3QgaGF2ZSBhIE9NTCBjb25uZWN0aW9uLCBza2lwIFJTTCAqLworCQlpZiAoIWlwYmMtPm9tbF9jb25uIHx8ICFpcGJjLT5ic2Nfb21sX2Nvbm4pCisJCQljb250aW51ZTsKKworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpcGJjLT5yc2xfY29ubik7IGkrKykgeworCQkJdW5zaWduZWQgaW50IHByaXZfbnI7CisJCQkvKiBkb24ndCBlc3RhYmxpc2ggUlNMIGxpbmtzIHdoaWNoIHdlIGRvbid0IGhhdmUgKi8KKwkJCWlmICghaXBiYy0+cnNsX2Nvbm5baV0pCisJCQkJY29udGludWU7CisJCQlpZiAoaXBiYy0+YnNjX3JzbF9jb25uW2ldKQorCQkJCWNvbnRpbnVlOworCQkJcHJpdl9uciA9IGlwYmMtPnJzbF9jb25uW2ldLT5mZC5wcml2X25yOworCQkJcHJpdl9uciAmPSB+MHhmZjsKKwkJCXByaXZfbnIgfD0gUlNMX1RPX0JTQzsKKwkJCXNpbi5zaW5fcG9ydCA9IGh0b25zKElQQV9UQ1BfUE9SVF9SU0wpOworCQkJbG9ncF9pcGJjX3VpZChESU5QLCBMT0dMX05PVElDRSwgaXBiYywgcHJpdl9uciA+PiA4KTsKKwkJCUxPR1BDKERJTlAsIExPR0xfTk9USUNFLCAiUlNMIFRyeWluZyB0byByZWNvbm5lY3RcbiIpOworCQkJaXBiYy0+YnNjX3JzbF9jb25uW2ldID0gY29ubmVjdF9ic2MoJnNpbiwgcHJpdl9uciwgaXBiYyk7CisJCQlpZiAoIWlwYmMtPmJzY19yc2xfY29ubikKKwkJCQlnb3RvIHJlc2NoZWR1bGU7CisJCQlsb2dwX2lwYmNfdWlkKERJTlAsIExPR0xfTk9USUNFLCBpcGJjLCBwcml2X25yID4+IDgpOworCQkJTE9HUEMoRElOUCwgTE9HTF9OT1RJQ0UsICJSU0wgUmVjb25uZWN0ZWRcbiIpOworCQl9CisJfQorCXJldHVybjsKKworcmVzY2hlZHVsZToKKwlic2Nfc2NoZWR1bGVfdGltZXIoJmlwcC0+cmVjb25uX3RpbWVyLCA1LCAwKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2RlYWRfc29ja2V0KHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmlwYyA9IGJmZC0+ZGF0YTsJCS8qIGxvY2FsIGNvbm4gKi8KKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmJzY19jb25uOwkJLyogcmVtb3RlIGNvbm4gKi8KKwlzdHJ1Y3QgaXBhX2J0c19jb25uICppcGJjID0gaXBjLT5idHNfY29ubjsKKwl1bnNpZ25lZCBpbnQgdHJ4X2lkID0gYmZkLT5wcml2X25yID4+IDg7CisJc3RydWN0IG1zZ2IgKm1zZywgKm1zZzI7CisKKwlic2NfdW5yZWdpc3Rlcl9mZChiZmQpOworCWNsb3NlKGJmZC0+ZmQpOworCWJmZC0+ZmQgPSAtMTsKKworCS8qIEZJWE1FOiBjbGVhciB0eF9xdWV1ZSwgcmVtb3ZlIGFsbCByZWZlcmVuY2VzLCBldGMuICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtc2csIG1zZzIsICZpcGMtPnR4X3F1ZXVlLCBsaXN0KQorCQltc2diX2ZyZWUobXNnKTsKKworCXN3aXRjaCAoYmZkLT5wcml2X25yICYgMHhmZikgeworCWNhc2UgT01MX0ZST01fQlRTOiAvKiBpbmNvbWluZyBPTUwgZGF0YSBmcm9tIEJUUywgZm9yd2FyZCB0byBCU0MgT01MICovCisJCWlwYmMtPm9tbF9jb25uID0gTlVMTDsKKwkJYnNjX2Nvbm4gPSBpcGJjLT5ic2Nfb21sX2Nvbm47CisJCS8qIGNsb3NlIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBCU0MgKi8KKwkJYnNjX3VucmVnaXN0ZXJfZmQoJmJzY19jb25uLT5mZCk7CisJCWNsb3NlKGJzY19jb25uLT5mZC5mZCk7CisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobXNnLCBtc2cyLCAmYnNjX2Nvbm4tPnR4X3F1ZXVlLCBsaXN0KQorCQkJbXNnYl9mcmVlKG1zZyk7CisJCXRhbGxvY19mcmVlKGJzY19jb25uKTsKKwkJaXBiYy0+YnNjX29tbF9jb25uID0gTlVMTDsKKwkJLyogRklYTUU6IGRvIHdlIG5lZWQgdG8gZGVsZXRlIHRoZSBlbnRpcmUgaXBiYyA/ICovCisJCWJyZWFrOworCWNhc2UgUlNMX0ZST01fQlRTOiAvKiBpbmNvbWluZyBSU0wgZGF0YSBmcm9tIEJUUywgZm9yd2FyZCB0byBCU0MgUlNMICovCisJCWlwYmMtPnJzbF9jb25uW3RyeF9pZF0gPSBOVUxMOworCQlic2NfY29ubiA9IGlwYmMtPmJzY19yc2xfY29ublt0cnhfaWRdOworCQkvKiBjbG9zZSB0aGUgY29ubmVjdGlvbiB0byB0aGUgQlNDICovCisJCWJzY191bnJlZ2lzdGVyX2ZkKCZic2NfY29ubi0+ZmQpOworCQljbG9zZShic2NfY29ubi0+ZmQuZmQpOworCQlsbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1zZywgbXNnMiwgJmJzY19jb25uLT50eF9xdWV1ZSwgbGlzdCkKKwkJCW1zZ2JfZnJlZShtc2cpOworCQl0YWxsb2NfZnJlZShic2NfY29ubik7CisJCWlwYmMtPmJzY19yc2xfY29ublt0cnhfaWRdID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSBPTUxfVE9fQlNDOiAvKiBpbmNvbWluZyBPTUwgZGF0YSBmcm9tIEJTQywgZm9yd2FyZCB0byBCVFMgT01MICovCisJCWlwYmMtPmJzY19vbWxfY29ubiA9IE5VTEw7CisJCWJzY19jb25uID0gaXBiYy0+b21sX2Nvbm47CisJCS8qIHN0YXJ0IHJlY29ubmVjdCB0aW1lciAqLworCQlic2Nfc2NoZWR1bGVfdGltZXIoJmlwcC0+cmVjb25uX3RpbWVyLCA1LCAwKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfVE9fQlNDOiAvKiBpbmNvbWluZyBSU0wgZGF0YSBmcm9tIEJTQywgZm9yd2FyZCB0byBCVFMgUlNMICovCisJCWlwYmMtPmJzY19yc2xfY29ublt0cnhfaWRdID0gTlVMTDsKKwkJYnNjX2Nvbm4gPSBpcGJjLT5yc2xfY29ublt0cnhfaWRdOworCQkvKiBzdGFydCByZWNvbm5lY3QgdGltZXIgKi8KKwkJYnNjX3NjaGVkdWxlX3RpbWVyKCZpcHAtPnJlY29ubl90aW1lciwgNSwgMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJzY19jb25uID0gTlVMTDsKKwkJYnJlYWs7CisJfQorCisJdGFsbG9jX2ZyZWUoaXBjKTsKK30KKworc3RhdGljIGludCBoYW5kbGVfdGNwX3JlYWQoc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqaXBjID0gYmZkLT5kYXRhOworCXN0cnVjdCBpcGFfYnRzX2Nvbm4gKmlwYmMgPSBpcGMtPmJ0c19jb25uOworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqYnNjX2Nvbm47CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlzdHJ1Y3QgaXBhY2Nlc3NfaGVhZCAqaGg7CisJaW50IHJldCA9IDA7CisJY2hhciAqYnRzYnNjOworCisJaWYgKChiZmQtPnByaXZfbnIgJiAweGZmKSA8PSAyKQorCQlidHNic2MgPSAiQlRTIjsKKwllbHNlCisJCWJ0c2JzYyA9ICJCU0MiOworCisJbXNnID0gaXBhY2Nlc3NfcmVhZF9tc2coYmZkLCAmcmV0KTsKKwlpZiAoIW1zZykgeworCQlpZiAocmV0ID09IDApIHsKKwkJCWxvZ3BfaXBiY191aWQoRElOUCwgTE9HTF9OT1RJQ0UsIGlwYmMsIGJmZC0+cHJpdl9uciA+PiA4KTsKKwkJCUxPR1BDKERJTlAsIExPR0xfTk9USUNFLCAiJXMgZGlzYXBwZWFyZWQsICIKKwkJCSAgICAgImRlYWQgc29ja2V0XG4iLCBidHNic2MpOworCQkJaGFuZGxlX2RlYWRfc29ja2V0KGJmZCk7CisJCX0KKwkJcmV0dXJuIHJldDsKKwl9CisKKwltc2diX3B1dChtc2csIHJldCk7CisJbG9ncF9pcGJjX3VpZChETUksIExPR0xfREVCVUcsIGlwYmMsIGJmZC0+cHJpdl9uciA+PiA4KTsKKwlERUJVR1BDKERNSSwgIlJYPC0lczogJXNcbiIsIGJ0c2JzYywgaGV4ZHVtcChtc2ctPmRhdGEsIG1zZy0+bGVuKSk7CisKKwloaCA9IChzdHJ1Y3QgaXBhY2Nlc3NfaGVhZCAqKSBtc2ctPmRhdGE7CisJaWYgKGhoLT5wcm90byA9PSBJUEFDX1BST1RPX0lQQUNDRVNTKSB7CisJCXJldCA9IGlwYWNjZXNzX3Jjdm1zZyhpcGMsIG1zZywgYmZkKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWJzY191bnJlZ2lzdGVyX2ZkKGJmZCk7CisJCQljbG9zZShiZmQtPmZkKTsKKwkJCWJmZC0+ZmQgPSAtMTsKKwkJCXRhbGxvY19mcmVlKGJmZCk7CisJCX0KKwkJLyogd2UgZG8gbm90IGZvcndhcmQgdGhlIENDTSBwcm90b2NvbCB0aHJvdWdoIHRoZQorCQkgKiBwcm94eSBidXQgcmF0aGVyIHRlcm1pbmF0ZSBpdCBvdXJzZWx2ZXMgKi8KKwkJbXNnYl9mcmVlKG1zZyk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKCFpcGJjKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwKKwkJICAgICAicmVjZWl2ZWQgJXMgcGFja2V0IGJ1dCBubyBpcGMtPmJ0c19jb25uPyE/XG4iLCBidHNic2MpOworCQltc2diX2ZyZWUobXNnKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJYnNjX2Nvbm4gPSBpcGNfYnlfcHJpdl9ucihpcGJjLCBiZmQtPnByaXZfbnIpOworCWlmIChic2NfY29ubikgeworCQkvKiBlbnF1ZXVlIHBhY2tldCB0b3dhcmRzIEJTQyAqLworCQltc2diX2VucXVldWUoJmJzY19jb25uLT50eF9xdWV1ZSwgbXNnKTsKKwkJLyogbWFyayByZXNwZWN0aXZlIGZpbGVkZXNjcmlwdG9yIGFzICd3ZSB3YW50IHRvIHdyaXRlJyAqLworCQlic2NfY29ubi0+ZmQud2hlbiB8PSBCU0NfRkRfV1JJVEU7CisJfSBlbHNlIHsKKwkJbG9ncF9pcGJjX3VpZChESU5QLCBMT0dMX0lORk8sIGlwYmMsIGJmZC0+cHJpdl9uciA+PiA4KTsKKwkJTE9HUEMoRElOUCwgTE9HTF9JTkZPLCAiRHJvcHBpbmcgcGFja2V0IGZyb20gJXMsICIKKwkJICAgICAic2luY2UgcmVtb3RlIGNvbm5lY3Rpb24gaXMgZGVhZFxuIiwgYnRzYnNjKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyogYSBUQ1Agc29ja2V0IGlzIHJlYWR5IHRvIGJlIHdyaXR0ZW4gdG8gKi8KK3N0YXRpYyBpbnQgaGFuZGxlX3RjcF93cml0ZShzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IGlwYV9wcm94eV9jb25uICppcGMgPSBiZmQtPmRhdGE7CisJc3RydWN0IGlwYV9idHNfY29ubiAqaXBiYyA9IGlwYy0+YnRzX2Nvbm47CisJc3RydWN0IGxsaXN0X2hlYWQgKmxoOworCXN0cnVjdCBtc2diICptc2c7CisJY2hhciAqYnRzYnNjOworCWludCByZXQ7CisKKwlpZiAoKGJmZC0+cHJpdl9uciAmIDB4ZmYpIDw9IDIpCisJCWJ0c2JzYyA9ICJCVFMiOworCWVsc2UKKwkJYnRzYnNjID0gIkJTQyI7CisKKworCS8qIGdldCB0aGUgbmV4dCBtc2cgZm9yIHRoaXMgdGltZXNsb3QgKi8KKwlpZiAobGxpc3RfZW1wdHkoJmlwYy0+dHhfcXVldWUpKSB7CisJCWJmZC0+d2hlbiAmPSB+QlNDX0ZEX1dSSVRFOworCQlyZXR1cm4gMDsKKwl9CisJbGggPSBpcGMtPnR4X3F1ZXVlLm5leHQ7CisJbGxpc3RfZGVsKGxoKTsKKwltc2cgPSBsbGlzdF9lbnRyeShsaCwgc3RydWN0IG1zZ2IsIGxpc3QpOworCisJbG9ncF9pcGJjX3VpZChETUksIExPR0xfREVCVUcsIGlwYmMsIGJmZC0+cHJpdl9uciA+PiA4KTsKKwlERUJVR1BDKERNSSwgIlRYICUwNHg6ICVzXG4iLCBiZmQtPnByaXZfbnIsCisJCWhleGR1bXAobXNnLT5kYXRhLCBtc2ctPmxlbikpOworCisJcmV0ID0gc2VuZChiZmQtPmZkLCBtc2ctPmRhdGEsIG1zZy0+bGVuLCAwKTsKKwltc2diX2ZyZWUobXNnKTsKKworCWlmIChyZXQgPT0gMCkgeworCQlsb2dwX2lwYmNfdWlkKERJTlAsIExPR0xfTk9USUNFLCBpcGJjLCBiZmQtPnByaXZfbnIgPj4gOCk7CisJCUxPR1AoRElOUCwgTE9HTF9OT1RJQ0UsICIlcyBkaXNhcHBlYXJlZCwgZGVhZCBzb2NrZXRcbiIsIGJ0c2JzYyk7CisJCWhhbmRsZV9kZWFkX3NvY2tldChiZmQpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIGNhbGxiYWNrIGZyb20gc2VsZWN0LmMgaW4gY2FzZSBvbmUgb2YgdGhlIGZkJ3MgY2FuIGJlIHJlYWQvd3JpdHRlbiAqLworc3RhdGljIGludCBpcGFjY2Vzc19mZF9jYihzdHJ1Y3QgYnNjX2ZkICpiZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCWludCByYyA9IDA7CisKKwlpZiAod2hhdCAmIEJTQ19GRF9SRUFEKSB7CisJCXJjID0gaGFuZGxlX3RjcF9yZWFkKGJmZCk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJfQorCWlmICh3aGF0ICYgQlNDX0ZEX1dSSVRFKQorCQlyYyA9IGhhbmRsZV90Y3Bfd3JpdGUoYmZkKTsKKworCXJldHVybiByYzsKK30KKworLyogY2FsbGJhY2sgb2YgdGhlIGxpc3RlbmluZyBmaWxlZGVzY3JpcHRvciAqLworc3RhdGljIGludCBsaXN0ZW5fZmRfY2Ioc3RydWN0IGJzY19mZCAqbGlzdGVuX2JmZCwgdW5zaWduZWQgaW50IHdoYXQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmlwYzsKKwlzdHJ1Y3QgYnNjX2ZkICpiZmQ7CisJc3RydWN0IHNvY2thZGRyX2luIHNhOworCXNvY2tsZW5fdCBzYV9sZW4gPSBzaXplb2Yoc2EpOworCisJaWYgKCEod2hhdCAmIEJTQ19GRF9SRUFEKSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBhY2NlcHQobGlzdGVuX2JmZC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNhLCAmc2FfbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQlwZXJyb3IoImFjY2VwdCIpOworCQlyZXR1cm4gcmV0OworCX0KKwlERUJVR1AoRElOUCwgImFjY2VwdCgpZWQgbmV3ICVzIGxpbmsgZnJvbSAlc1xuIiwKKwkJKGxpc3Rlbl9iZmQtPnByaXZfbnIgJiAweGZmKSA9PSBPTUxfRlJPTV9CVFMgPyAiT01MIiA6ICJSU0wiLAorCQlpbmV0X250b2Eoc2Euc2luX2FkZHIpKTsKKworCWlwYyA9IGFsbG9jX2Nvbm4oKTsKKwlpZiAoIWlwYykgeworCQljbG9zZShyZXQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwliZmQgPSAmaXBjLT5mZDsKKwliZmQtPmZkID0gcmV0OworCWJmZC0+ZGF0YSA9IGlwYzsKKwliZmQtPnByaXZfbnIgPSBsaXN0ZW5fYmZkLT5wcml2X25yOworCWJmZC0+Y2IgPSBpcGFjY2Vzc19mZF9jYjsKKwliZmQtPndoZW4gPSBCU0NfRkRfUkVBRDsKKwlyZXQgPSBic2NfcmVnaXN0ZXJfZmQoYmZkKTsKKwlpZiAocmV0IDwgMCkgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJjb3VsZCBub3QgcmVnaXN0ZXIgRkRcbiIpOworCQljbG9zZShiZmQtPmZkKTsKKwkJdGFsbG9jX2ZyZWUoaXBjKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBSZXF1ZXN0IElELiBGSVhNRTogcmVxdWVzdCBMT0NBVElPTiwgSFcvU1cgVkVyc2lvbiwgVW5pdCBOYW1lLCBTZXJubyAqLworCXJldCA9IHdyaXRlKGJmZC0+ZmQsIGlkX3JlcSwgc2l6ZW9mKGlkX3JlcSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFrZV9saXN0ZW5fc29jayhzdHJ1Y3QgYnNjX2ZkICpiZmQsIHVfaW50MTZfdCBwb3J0LCBpbnQgcHJpdl9uciwKKwkJICAgICBpbnQgKCpjYikoc3RydWN0IGJzY19mZCAqZmQsIHVuc2lnbmVkIGludCB3aGF0KSkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKwlpbnQgcmV0LCBvbiA9IDE7CisKKwliZmQtPmZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCk7CisJYmZkLT5jYiA9IGNiOworCWJmZC0+d2hlbiA9IEJTQ19GRF9SRUFEOworCWJmZC0+cHJpdl9uciA9IHByaXZfbnI7CisKKwltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisJYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisJaWYgKCFsaXN0ZW5faXBhZGRyKQorCQlhZGRyLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CisJZWxzZQorCQlpbmV0X2F0b24obGlzdGVuX2lwYWRkciwgJmFkZHIuc2luX2FkZHIpOworCisJc2V0c29ja29wdChiZmQtPmZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZvbiwgc2l6ZW9mKG9uKSk7CisKKwlyZXQgPSBiaW5kKGJmZC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihhZGRyKSk7CisJaWYgKHJldCA8IDApIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiY291bGQgbm90IGJpbmQgbGlzdGVuIHNvY2tldCAlc1xuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldCA9IGxpc3RlbihiZmQtPmZkLCAxKTsKKwlpZiAocmV0IDwgMCkgeworCQlwZXJyb3IoImxpc3RlbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGJzY19yZWdpc3Rlcl9mZChiZmQpOworCWlmIChyZXQgPCAwKSB7CisJCXBlcnJvcigicmVnaXN0ZXJfbGlzdGVuX2ZkIik7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCisvKiBBY3RpdmVseSBjb25uZWN0IHRvIGEgQlNDLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmNvbm5lY3RfYnNjKHN0cnVjdCBzb2NrYWRkcl9pbiAqc2EsIGludCBwcml2X25yLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqaXBjOworCXN0cnVjdCBic2NfZmQgKmJmZDsKKwlpbnQgcmV0LCBvbiA9IDE7CisKKwlpcGMgPSBhbGxvY19jb25uKCk7CisJaWYgKCFpcGMpCisJCXJldHVybiBOVUxMOworCisJaXBjLT5idHNfY29ubiA9IGRhdGE7CisKKwliZmQgPSAmaXBjLT5mZDsKKwliZmQtPmZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCk7CisJYmZkLT5jYiA9IGlwYWNjZXNzX2ZkX2NiOworCWJmZC0+d2hlbiA9IEJTQ19GRF9SRUFEIHwgQlNDX0ZEX1dSSVRFOworCWJmZC0+ZGF0YSA9IGlwYzsKKwliZmQtPnByaXZfbnIgPSBwcml2X25yOworCisJc2V0c29ja29wdChiZmQtPmZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZvbiwgc2l6ZW9mKG9uKSk7CisKKwlyZXQgPSBjb25uZWN0KGJmZC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgc2EsIHNpemVvZigqc2EpKTsKKwlpZiAocmV0IDwgMCkgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJjb3VsZCBub3QgY29ubmVjdCBzb2NrZXRcbiIpOworCQljbG9zZShiZmQtPmZkKTsKKwkJdGFsbG9jX2ZyZWUoaXBjKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogcHJlLWZpbGwgdHhfcXVldWUgd2l0aCBpZGVudGl0eSByZXF1ZXN0ICovCisJcmV0ID0gYnNjX3JlZ2lzdGVyX2ZkKGJmZCk7CisJaWYgKHJldCA8IDApIHsKKwkJY2xvc2UoYmZkLT5mZCk7CisJCXRhbGxvY19mcmVlKGlwYyk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBpcGM7Cit9CisKK3N0YXRpYyBpbnQgaXBhY2Nlc3NfcHJveHlfc2V0dXAodm9pZCkKK3sKKwlpbnQgcmV0OworCisJaXBwID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgaXBhX3Byb3h5KTsKKwlpZiAoIWlwcCkKKwkJcmV0dXJuIC1FTk9NRU07CisJSU5JVF9MTElTVF9IRUFEKCZpcHAtPmJ0c19saXN0KTsKKwlpcHAtPnJlY29ubl90aW1lci5jYiA9IHJlY29ubl90bXJfY2I7CisJaXBwLT5yZWNvbm5fdGltZXIuZGF0YSA9IGlwcDsKKworCS8qIExpc3RlbiBmb3IgT01MIGNvbm5lY3Rpb25zICovCisJcmV0ID0gbWFrZV9saXN0ZW5fc29jaygmaXBwLT5vbWxfbGlzdGVuX2ZkLCBJUEFfVENQX1BPUlRfT01MLAorCQkJCU9NTF9GUk9NX0JUUywgbGlzdGVuX2ZkX2NiKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIExpc3RlbiBmb3IgUlNMIGNvbm5lY3Rpb25zICovCisJcmV0ID0gbWFrZV9saXN0ZW5fc29jaygmaXBwLT5yc2xfbGlzdGVuX2ZkLCBJUEFfVENQX1BPUlRfUlNMLAorCQkJCVJTTF9GUk9NX0JUUywgbGlzdGVuX2ZkX2NiKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHNpZ25hbF9oYW5kbGVyKGludCBzaWduYWwpCit7CisJZnByaW50ZihzdGRvdXQsICJzaWduYWwgJXUgcmVjZWl2ZWRcbiIsIHNpZ25hbCk7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU0lHQUJSVDoKKwkJLyogaW4gY2FzZSBvZiBhYm9ydCwgd2Ugd2FudCB0byBvYnRhaW4gYSB0YWxsb2MgcmVwb3J0CisJCSAqIGFuZCB0aGVuIHJldHVybiB0byB0aGUgY2FsbGVyLCB3aG8gd2lsbCBhYm9ydCB0aGUgcHJvY2VzcyAqLworCWNhc2UgU0lHVVNSMToKKwkJdGFsbG9jX3JlcG9ydF9mdWxsKHRhbGxfYnNjX2N0eCwgc3RkZXJyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IHJjOworCisJbGlzdGVuX2lwYWRkciA9ICIxOTIuMTY4LjEwMC4xMSI7CisJYnNjX2lwYWRkciA9ICIxOTIuMTY4LjEwMC4yMzkiOworCisJdGFsbF9ic2NfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KE5VTEwsIDEsICJpcGFjY2Vzcy1wcm94eSIpOworCisJbG9nX2luaXQoJmxvZ19pbmZvKTsKKwlzdGRlcnJfdGFyZ2V0ID0gbG9nX3RhcmdldF9jcmVhdGVfc3RkZXJyKCk7CisJbG9nX2FkZF90YXJnZXQoc3RkZXJyX3RhcmdldCk7CisJbG9nX3NldF9hbGxfZmlsdGVyKHN0ZGVycl90YXJnZXQsIDEpOworCWxvZ19wYXJzZV9jYXRlZ29yeV9tYXNrKHN0ZGVycl90YXJnZXQsICJESU5QOkRNSSIpOworCisJcmMgPSBpcGFjY2Vzc19wcm94eV9zZXR1cCgpOworCWlmIChyYyA8IDApCisJCWV4aXQoMSk7CisKKwlzaWduYWwoU0lHVVNSMSwgJnNpZ25hbF9oYW5kbGVyKTsKKwlzaWduYWwoU0lHQUJSVCwgJnNpZ25hbF9oYW5kbGVyKTsKKworCXdoaWxlICgxKSB7CisJCWJzY19zZWxlY3RfbWFpbigwKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9pc2Ruc3luYy5jIGIvb3BlbmJzYy9zcmMvaXNkbnN5bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODgxOWFjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvaXNkbnN5bmMuYwpAQCAtMCwwICsxLDE5MiBAQAorLyogaXNkbnN5bmMuYworICoKKyAqIEF1dGhvciAgICAgICBBbmRyZWFzIEV2ZXJzYmVyZyA8am9sbHlAZXZlcnNiZXJnLmV1PgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgIm1JU0ROaWYuaCIKKyNkZWZpbmUgTUlTRE5fT0xEX0FGX0NPTVBBVElCSUxJVFkKKyNkZWZpbmUgQUZfQ09NUEFUSUJJTElUWV9GVU5DCisjaW5jbHVkZSAiY29tcGF0X2FmX2lzZG4uaCIKKworaW50IGNhcmQgPSAwOworaW50IHNvY2sgPSAtMTsKKworaW50IG1JU0ROX29wZW4odm9pZCkKK3sKKwlpbnQJCQlmZCwgcmV0OworCXN0cnVjdCBtSVNETl9kZXZpbmZvCWRldmluZm87CisJc3RydWN0IHNvY2thZGRyX21JU0ROCWwyYWRkcjsKKworCWZkID0gc29ja2V0KFBGX0lTRE4sIFNPQ0tfUkFXLCBJU0ROX1BfQkFTRSk7CisJaWYgKGZkIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBvcGVuIHNvY2tldCAoJXMpXG4iLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gZmQ7CisJfQorCWRldmluZm8uaWQgPSBjYXJkOworCXJldCA9IGlvY3RsKGZkLCBJTUdFVERFVklORk8sICZkZXZpbmZvKTsKKwlpZiAocmV0IDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwiY291bGQgbm90IHNlbmQgSU9DVEwgSU1HRVRDT1VOVCAoJXMpXG4iLCBzdHJlcnJvcihlcnJubykpOworCQljbG9zZShmZCk7CisJCXJldHVybiByZXQ7CisJfQorCWNsb3NlKGZkKTsKKwlpZiAoIShkZXZpbmZvLkRwcm90b2NvbHMgJiAoMSA8PCBJU0ROX1BfVEVfUzApKQorCSAmJiAhKGRldmluZm8uRHByb3RvY29scyAmICgxIDw8IElTRE5fUF9URV9FMSkpKSB7CisJCWZwcmludGYoc3RkZXJyLCJJbnRlcmZhY2UgZG9lcyBub3Qgc3VwcG9ydCBURSBtb2RlICglcylcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJZmQgPSBzb2NrZXQoUEZfSVNETiwgU09DS19ER1JBTSwgSVNETl9QX0xBUERfVEUpOworCWlmIChmZCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsImNvdWxkIG5vdCBvcGVuIElTRE5fUF9MQVBEX1RFIHNvY2tldCAoJXMpXG4iLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gZmQ7CisJfQorCWwyYWRkci5mYW1pbHkgPSBBRl9JU0ROOworCWwyYWRkci5kZXYgPSBjYXJkOworCWwyYWRkci5jaGFubmVsID0gMDsKKwlsMmFkZHIuc2FwaSA9IDA7CisJbDJhZGRyLnRlaSA9IDA7CisJcmV0ID0gYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZsMmFkZHIsIHNpemVvZihsMmFkZHIpKTsKKwlpZiAocmV0IDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwiY291bGQgbm90IGJpbmQgc29ja2V0IGZvciBjYXJkICVkICglcylcbiIsIGNhcmQsIHN0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJc29jayA9IGZkOworCisJcmV0dXJuIHNvY2s7Cit9CisKKwordm9pZCBtSVNETl9oYW5kbGUodm9pZCkKK3sKKwlpbnQgcmV0OworCWZkX3NldCByZmQ7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJc3RydWN0IHNvY2thZGRyX21JU0ROIGFkZHI7CisJc29ja2xlbl90IGFsZW47CisJdW5zaWduZWQgY2hhciBidWZmZXJbMjA0OF07CisJc3RydWN0IG1JU0ROaGVhZCAqaGggPSAoc3RydWN0IG1JU0ROaGVhZCAqKWJ1ZmZlcjsKKwlpbnQgbDEgPSAwLCBsMiA9IDAsIHRlaSA9IDA7CisKKwl3aGlsZSgxKSB7CithZ2FpbjoKKwkJRkRfWkVSTygmcmZkKTsKKwkJRkRfU0VUKHNvY2ssICZyZmQpOworCQl0di50dl9zZWMgPSAyOworCQl0di50dl91c2VjID0gMDsKKwkJcmV0ID0gc2VsZWN0KHNvY2srMSwgJnJmZCwgTlVMTCwgTlVMTCwgJnR2KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJCQljb250aW51ZTsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXMgYWJvcnRlZDogJXNcbiIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChGRF9JU1NFVChzb2NrLCAmcmZkKSkgeworCQkJYWxlbiA9IHNpemVvZihhZGRyKTsKKwkJCXJldCA9IHJlY3Zmcm9tKHNvY2ssIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIDAsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsICZhbGVuKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICIlcyByZWFkIHNvY2tldCBlcnJvciAlc1xuIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOworCQkJfSBlbHNlIGlmIChyZXQgPCBNSVNETl9IRUFERVJfTEVOKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLCAiJXMgcmVhZCBzb2NrZXQgc2hvciBmcmFtZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCX0gZWxzZSB7CisJCQkJc3dpdGNoKGhoLT5wcmltKSB7CisJCQkJCWNhc2UgTVBIX0FDVElWQVRFX0lORDoKKwkJCQkJY2FzZSBQSF9BQ1RJVkFURV9JTkQ6CisJCQkJCQlpZiAoIWwxKSB7CisJCQkJCQkJcHJpbnRmKCJQSF9BQ1RJVkFURVxuIik7CisJCQkJCQkJcHJpbnRmKCIqKiogU3luYyBhdmFpbGFibGUgZnJvbSBpbnRlcmZhY2UgOi0pXG4iKTsKKwkJCQkJCQlsMSA9IDE7CisJCQkJCQl9CisJCQkJCQlnb3RvIGFnYWluOworCQkJCQlicmVhazsKKwkJCQkJY2FzZSBNUEhfREVBQ1RJVkFURV9JTkQ6CisJCQkJCWNhc2UgUEhfREVBQ1RJVkFURV9JTkQ6CisJCQkJCQlpZiAobDEpIHsKKwkJCQkJCQlwcmludGYoIlBIX0RFQUNUSVZBVEVcbiIpOworCQkJCQkJCXByaW50ZigiKioqIExvc3Qgc3luYyBvbiBpbnRlcmZhY2UgICAgICAgIDotKFxuIik7CisJCQkJCQkJbDEgPSAwOworCQkJCQkJfQorCQkJCQkJZ290byBhZ2FpbjsKKwkJCQkJYnJlYWs7CisJCQkJCWNhc2UgRExfRVNUQUJMSVNIX0lORDoKKwkJCQkJY2FzZSBETF9FU1RBQkxJU0hfQ05GOgorCQkJCQkJcHJpbnRmKCJETF9FU1RBQkxJU0hcbiIpOworCQkJCQkJbDIgPSAxOworCQkJCQkJZ290byBhZ2FpbjsKKwkJCQkJYnJlYWs7CisJCQkJCWNhc2UgRExfUkVMRUFTRV9JTkQ6CisJCQkJCWNhc2UgRExfUkVMRUFTRV9DTkY6CisJCQkJCQlwcmludGYoIkRMX1JFTEVBU0VcbiIpOworCQkJCQkJbDIgPSAwOworCQkJCQkJZ290byBhZ2FpbjsKKwkJCQkJYnJlYWs7CisJCQkJCWNhc2UgRExfSU5GT1JNQVRJT05fSU5EOgorCQkJCQkJcHJpbnRmKCJETF9JTkZPUk1BVElPTiAodGVpICVkIHNhcGkgJWQpXG4iLCBhZGRyLnRlaSwgYWRkci5zYXBpKTsKKwkJCQkJCXRlaSA9IDE7CisJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorLy8JCQkJCQlwcmludGYoInByaW0gJXhcbiIsIGhoLT5wcmltKTsKKwkJCQkJCWdvdG8gYWdhaW47CisJCQkJfQorCQkJfQorCQl9CisJCWlmICh0ZWkgJiYgIWwyKSB7CisJCQloaC0+cHJpbSA9IERMX0VTVEFCTElTSF9SRVE7CisJCQlwcmludGYoIi0+IGFjdGl2YXRpbmcgbGF5ZXIgMlxuIik7CisJCQlzZW5kdG8oc29jaywgYnVmZmVyLCBNSVNETl9IRUFERVJfTEVOLCAwLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBhbGVuKTsKKwkJfQorCX0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgcmV0OworCisJaWYgKGFyZ2MgPD0gMSkKKwl7CisJCXByaW50ZigiVXNhZ2U6ICVzIDxjYXJkPlxuXG4iLCBhcmd2WzBdKTsKKwkJcHJpbnRmKCJPcGVucyBnaXZlbiBjYXJkIG51bWJlciBpbiBURS1tb2RlIFBUUCBhbmQgdHJpZXMgdG8ga2VlcCBsYXllciAyIGVzdGFibGlzaGVkLlxuIik7CisJCXByaW50ZigiVGhpcyBrZWVwcyBsYXllciAxIGFjdGl2YXRlZCB0byByZXRyaWV2ZSBhIHN0ZWFkeSBzeW5jIHNpZ25hbCBmcm9tIG5ldHdvcmsuXG4iKTsKKwkJcmV0dXJuKDApOworCX0KKworCWNhcmQgPSBhdG9pKGFyZ3ZbMV0pOworCisJaW5pdF9hZl9pc2RuKCk7CisKKwlpZiAoKHJldCA9IG1JU0ROX29wZW4oKSA8IDApKQorCQlyZXR1cm4ocmV0KTsKKworCW1JU0ROX2hhbmRsZSgpOworCisJY2xvc2Uoc29jayk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL21lYXNfcmVwLmMgYi9vcGVuYnNjL3NyYy9tZWFzX3JlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOWNjMWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9tZWFzX3JlcC5jCkBAIC0wLDAgKzEsMTE0IEBACisvKiBNZWFzdXJlbWVudCBSZXBvcnQgUHJvY2Vzc2luZyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tZWFzX3JlcC5oPgorCitzdGF0aWMgaW50IGdldF9maWVsZChjb25zdCBzdHJ1Y3QgZ3NtX21lYXNfcmVwICpyZXAsCisJCSAgICAgZW51bSBtZWFzX3JlcF9maWVsZCBmaWVsZCkKK3sKKwlzd2l0Y2ggKGZpZWxkKSB7CisJY2FzZSBNRUFTX1JFUF9ETF9SWExFVl9GVUxMOgorCQlyZXR1cm4gcmVwLT5kbC5mdWxsLnJ4X2xldjsKKwljYXNlIE1FQVNfUkVQX0RMX1JYTEVWX1NVQjoKKwkJcmV0dXJuIHJlcC0+ZGwuc3ViLnJ4X2xldjsKKwljYXNlIE1FQVNfUkVQX0RMX1JYUVVBTF9GVUxMOgorCQlyZXR1cm4gcmVwLT5kbC5mdWxsLnJ4X3F1YWw7CisJY2FzZSBNRUFTX1JFUF9ETF9SWFFVQUxfU1VCOgorCQlyZXR1cm4gcmVwLT5kbC5zdWIucnhfcXVhbDsKKwljYXNlIE1FQVNfUkVQX1VMX1JYTEVWX0ZVTEw6CisJCXJldHVybiByZXAtPnVsLmZ1bGwucnhfbGV2OworCWNhc2UgTUVBU19SRVBfVUxfUlhMRVZfU1VCOgorCQlyZXR1cm4gcmVwLT51bC5zdWIucnhfbGV2OworCWNhc2UgTUVBU19SRVBfVUxfUlhRVUFMX0ZVTEw6CisJCXJldHVybiByZXAtPnVsLmZ1bGwucnhfcXVhbDsKKwljYXNlIE1FQVNfUkVQX1VMX1JYUVVBTF9TVUI6CisJCXJldHVybiByZXAtPnVsLnN1Yi5yeF9xdWFsOworCX0KKworCXJldHVybiAwOworfQorCisKK3Vuc2lnbmVkIGludCBjYWxjX2luaXRpYWxfaWR4KHVuc2lnbmVkIGludCBhcnJheV9zaXplLAorCQkJICAgICAgdW5zaWduZWQgaW50IG1lYXNfcmVwX2lkeCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBudW1fdmFsdWVzKQoreworCWludCBvZmZzLCBpZHg7CisKKwkvKiBmcm9tIHdoaWNoIGVsZW1lbnQgZG8gd2UgbmVlZCB0byBzdGFydCBpZiB3ZSdyZSBpbnRlcmVzdGVkCisJICogaW4gYW4gYXZlcmFnZSBvZiAnbnVtJyBlbGVtZW50cyAqLworCW9mZnMgPSBtZWFzX3JlcF9pZHggLSBudW1fdmFsdWVzOworCisJaWYgKG9mZnMgPCAwKQorCQlpZHggPSBhcnJheV9zaXplICsgb2ZmczsKKwllbHNlCisJCWlkeCA9IG9mZnM7CisKKwlyZXR1cm4gaWR4OworfQorCisvKiBvYnRhaW4gYW4gYXZlcmFnZSBvdmVyIHRoZSBsYXN0ICdudW0nIGZpZWxkcyBpbiB0aGUgbWVhcyByZXBzICovCitpbnQgZ2V0X21lYXNfcmVwX2F2Zyhjb25zdCBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwKKwkJICAgICBlbnVtIG1lYXNfcmVwX2ZpZWxkIGZpZWxkLCB1bnNpZ25lZCBpbnQgbnVtKQoreworCXVuc2lnbmVkIGludCBpLCBpZHg7CisJaW50IGF2ZyA9IDA7CisKKwlpZHggPSBjYWxjX2luaXRpYWxfaWR4KEFSUkFZX1NJWkUobGNoYW4tPm1lYXNfcmVwKSwKKwkJCQlsY2hhbi0+bWVhc19yZXBfaWR4LCBudW0pOworCisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCWludCBqID0gKGlkeCtpKSAlIEFSUkFZX1NJWkUobGNoYW4tPm1lYXNfcmVwKTsKKworCQlhdmcgKz0gZ2V0X2ZpZWxkKCZsY2hhbi0+bWVhc19yZXBbal0sIGZpZWxkKTsKKwl9CisKKwlyZXR1cm4gYXZnIC8gbnVtOworfQorCisvKiBDaGVjayBpZiBOIG91dCBvZiBNIGxhc3QgdmFsdWVzIGZvciBGSUVMRCBhcmUgPj0gYmQgKi8KK2ludCBtZWFzX3JlcF9uX291dF9vZl9tX2JlKGNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLAorCQkJZW51bSBtZWFzX3JlcF9maWVsZCBmaWVsZCwKKwkJCXVuc2lnbmVkIGludCBuLCB1bnNpZ25lZCBpbnQgbSwgaW50IGJlKQoreworCXVuc2lnbmVkIGludCBpLCBpZHg7CisJaW50IGNvdW50ID0gMDsKKworCWlkeCA9IGNhbGNfaW5pdGlhbF9pZHgoQVJSQVlfU0laRShsY2hhbi0+bWVhc19yZXApLAorCQkJCWxjaGFuLT5tZWFzX3JlcF9pZHgsIG0pOworCisJZm9yIChpID0gMDsgaSA8IG07IGkrKykgeworCQlpbnQgaiA9IChpZHggKyBpKSAlIEFSUkFZX1NJWkUobGNoYW4tPm1lYXNfcmVwKTsKKwkJaW50IHZhbCA9IGdldF9maWVsZCgmbGNoYW4tPm1lYXNfcmVwW2pdLCBmaWVsZCk7CisKKwkJaWYgKHZhbCA+PSBiZSkKKwkJCWNvdW50Kys7CisKKwkJaWYgKGNvdW50ID49IG4pCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL21nY3AuY2ZnIGIvb3BlbmJzYy9zcmMvbWdjcC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc4ZjU0NgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL21nY3AuY2ZnCkBAIC0wLDAgKzEsMTkgQEAKKyEKKyEgTUdDUCBjb25maWd1cmF0aW9uIGhhbmQgZWRpdGVkCishICAgIQorcGFzc3dvcmQgZm9vCishCitsaW5lIHZ0eQorIG5vIGxvZ2luCishCittZ2NwCishICBsb2NhbCBpcCAyMTMuMTY3LjEzNC4xNAorICBidHMgaXAgMTcyLjE2LjI1Mi40MworICBiaW5kIGlwIDIxMy4xNjcuMTM0LjE0MQorICBiaW5kIHBvcnQgMjQyNworICBiaW5kIGVhcmx5IDEKKyAgcnRwIGJhc2UgNDAwMAorICBzZHAgYXVkaW8gcGF5bG9hZCBudW1iZXIgOTgKKyAgc2RwIGF1ZGlvIHBheWxvYWQgbmFtZSBBTVIvODAwMAorICBudW1iZXIgZW5kcG9pbnRzIDMxCisgIGxvb3AgMQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX21haW4uYyBiL29wZW5ic2Mvc3JjL21nY3AvbWdjcF9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NjZDczNAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL21nY3AvbWdjcF9tYWluLmMKQEAgLTAsMCArMSwyNjkgQEAKKy8qIEEgTWVkaWEgR2F0ZXdheSBDb250cm9sIFByb3RvY29sIE1lZGlhIEdhdGV3YXk6IFJGQyAzNDM1ICovCisvKiBUaGUgbWFpbiBtZXRob2QgdG8gZHJpdmUgaXQgYXMgYSBzdGFuZGFsb25lIHByb2Nlc3MgICAgICAqLworCisvKgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDkgYnkgT24tV2F2ZXMKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWdjcC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWdjcF9pbnRlcm5hbC5oPgorI2luY2x1ZGUgPG9zbW9jb20vdnR5Ly90ZWxuZXRfaW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8b3BlbmJzYy92dHkuaD4KKworI2luY2x1ZGUgPG9zbW9jb20vdnR5L2NvbW1hbmQuaD4KKworI2luY2x1ZGUgIi4uLy4uL2JzY2NvbmZpZy5oIgorCisvKiB0aGlzIGlzIGhlcmUgZm9yIHRoZSB2dHkuLi4gaXQgd2lsbCBuZXZlciBiZSBjYWxsZWQgKi8KK3ZvaWQgc3Vic2NyX3B1dCgpIHsgYWJvcnQoKTsgfQorCisjZGVmaW5lIF9HTlVfU09VUkNFCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKKyN3YXJuaW5nICJNYWtlIHVzZSBvZiB0aGUgcnRwIHByb3h5IGNvZGUiCisKK3N0YXRpYyBzdHJ1Y3QgYnNjX2ZkIGJmZDsKK3N0YXRpYyBzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZzsKK3N0YXRpYyBpbnQgcmVzZXRfZW5kcG9pbnRzID0gMDsKKworY29uc3QgY2hhciAqb3BlbmJzY19jb3B5cmlnaHQgPQorCSJDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBIb2xnZXIgRnJleXRoZXIgYW5kIE9uLVdhdmVzXG4iCisJIkNvbnRyaWJ1dGlvbnMgYnkgRGFuaWVsIFdpbGxtYW5uLCBKYW4gTMO8YmJlLFN0ZWZhbiBTY2htaWR0XG4iCisJIkRpZXRlciBTcGFhciwgQW5kcmVhcyBFdmVyc2JlcmcsIEhhcmFsZCBXZWx0ZVxuXG4iCisJIkxpY2Vuc2UgR1BMdjIrOiBHTlUgR1BMIHZlcnNpb24gMiBvciBsYXRlciA8aHR0cDovL2dudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWw+XG4iCisJIlRoaXMgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGFyZSBmcmVlIHRvIGNoYW5nZSBhbmQgcmVkaXN0cmlidXRlIGl0LlxuIgorCSJUaGVyZSBpcyBOTyBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3LlxuIjsKKworc3RhdGljIGNoYXIgKmNvbmZpZ19maWxlID0gIm1nY3AuY2ZnIjsKKworLyogdXNlZCBieSBtc2diIGFuZCBtZ2NwICovCit2b2lkICp0YWxsX2JzY19jdHggPSBOVUxMOworCitzdGF0aWMgdm9pZCBwcmludF9oZWxwKCkKK3sKKwlwcmludGYoIlNvbWUgdXNlZnVsIGhlbHAuLi5cbiIpOworCXByaW50ZigiIC1oIC0taGVscCBpcyBwcmludGluZyB0aGlzIHRleHQuXG4iKTsKKwlwcmludGYoIiAtYyAtLWNvbmZpZy1maWxlIGZpbGVuYW1lIFRoZSBjb25maWcgZmlsZSB0byB1c2UuXG4iKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX29wdGlvbnMoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworCXdoaWxlICgxKSB7CisJCWludCBvcHRpb25faW5kZXggPSAwLCBjOworCQlzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKKwkJCXsiaGVscCIsIDAsIDAsICdoJ30sCisJCQl7ImNvbmZpZy1maWxlIiwgMSwgMCwgJ2MnfSwKKwkJCXsidmVyc2lvbiIsIDAsIDAsICdWJ30sCisJCQl7MCwgMCwgMCwgMH0sCisJCX07CisKKwkJYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJoYzpWIiwgbG9uZ19vcHRpb25zLCAmb3B0aW9uX2luZGV4KTsKKworCQlpZiAoYyA9PSAtMSkKKwkJCWJyZWFrOworCisJCXN3aXRjaChjKSB7CisJCWNhc2UgJ2gnOgorCQkJcHJpbnRfaGVscCgpOworCQkJZXhpdCgwKTsKKwkJCWJyZWFrOworCQljYXNlICdjJzoKKwkJCWNvbmZpZ19maWxlID0gdGFsbG9jX3N0cmR1cCh0YWxsX2JzY19jdHgsIG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnVic6CisJCQlwcmludF92ZXJzaW9uKDEpOworCQkJZXhpdCgwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogaWdub3JlICovCisJCQlicmVhazsKKwkJfTsKKwl9Cit9CisKKy8qIHNpbXBseSByZW1lbWJlciB0aGlzICovCitzdGF0aWMgaW50IG1nY3BfcnNpcF9jYihzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZykKK3sKKwlyZXNldF9lbmRwb2ludHMgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWdjcF9jaGFuZ2VfY2Ioc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIGludCBlbmRwb2ludCwgaW50IHN0YXRlLCBpbnQgbG9jYWxfcnRwKQoreworCWlmIChzdGF0ZSAhPSBNR0NQX0VORFBfTURDWCkKKwkJcmV0dXJuIDA7CisKKwltZ2NwX3NlbmRfZHVtbXkoJmNmZy0+ZW5kcG9pbnRzW2VuZHBvaW50XSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9jYWxsX2FnZW50KHN0cnVjdCBic2NfZmQgKmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKwlzb2NrbGVuX3Qgc2xlbiA9IHNpemVvZihhZGRyKTsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXN0cnVjdCBtc2diICpyZXNwOworCWludCBpOworCisJbXNnID0gKHN0cnVjdCBtc2diICopIGZkLT5kYXRhOworCisJLyogcmVhZCBvbmUgbGVzcyBzbyB3ZSBjYW4gdXNlIGl0IGFzIGEgXDAgKi8KKwlpbnQgcmMgPSByZWN2ZnJvbShiZmQuZmQsIG1zZy0+ZGF0YSwgbXNnLT5kYXRhX2xlbiAtIDEsIDAsCisJCShzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsICZzbGVuKTsKKwlpZiAocmMgPCAwKSB7CisJCXBlcnJvcigiR2F0ZXdheSBmYWlsZWQgdG8gcmVhZCIpOworCQlyZXR1cm4gLTE7CisJfSBlbHNlIGlmIChzbGVuID4gc2l6ZW9mKGFkZHIpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiR2F0ZXdheSByZWNlaXZlZCBtZXNzYWdlIGZyb20gb3V0ZXJzcGFjZTogJWQgJWRcbiIsCisJCQlzbGVuLCBzaXplb2YoYWRkcikpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogaGFuZGxlIG1lc3NhZ2Ugbm93ICovCisJbXNnLT5sMmggPSBtc2diX3B1dChtc2csIHJjKTsKKwlyZXNwID0gbWdjcF9oYW5kbGVfbWVzc2FnZShjZmcsIG1zZyk7CisJbXNnYl9yZXNldChtc2cpOworCisJaWYgKHJlc3ApIHsKKwkJc2VuZHRvKGJmZC5mZCwgcmVzcC0+bDJoLCBtc2diX2wybGVuKHJlc3ApLCAwLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpOworCQltc2diX2ZyZWUocmVzcCk7CisJfQorCisJaWYgKHJlc2V0X2VuZHBvaW50cykgeworCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIkFza2VkIHRvIHJlc2V0IGVuZHBvaW50cy5cbiIpOworCQlyZXNldF9lbmRwb2ludHMgPSAwOworCisJCS8qIGlzIGNoZWNraW5nIGluX2FkZHIuc19hZGRyID09IElOQUREUl9MT09QQkFDSyBtYWtpbmcgaXQgbW9yZSBzZWN1cmU/ICovCisJCWZvciAoaSA9IDE7IGkgPCBjZmctPm51bWJlcl9lbmRwb2ludHM7ICsraSkKKwkJCW1nY3BfZnJlZV9lbmRwKCZjZmctPmVuZHBvaW50c1tpXSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiBpbnQgYnNjX3Z0eV9nb19wYXJlbnQoc3RydWN0IHZ0eSAqdnR5KTsKKworc3RhdGljIHN0cnVjdCB2dHlfYXBwX2luZm8gdnR5X2luZm8gPSB7CisJLm5hbWUgCQk9ICJPcGVuQlNDIE1HQ1AiLAorCS52ZXJzaW9uCT0gUEFDS0FHRV9WRVJTSU9OLAorCS5nb19wYXJlbnRfY2IJPSBic2NfdnR5X2dvX3BhcmVudCwKK307CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgZHVtbXlfbmV0d29yazsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKwlpbnQgb24gPSAxLCByYzsKKwlzdHJ1Y3QgbG9nX3RhcmdldCAqc3RkZXJyX3RhcmdldDsKKworCXRhbGxfYnNjX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdChOVUxMLCAxLCAibWdjcC1jYWxsYWdlbnQiKTsKKworCWxvZ19pbml0KCZsb2dfaW5mbyk7CisJc3RkZXJyX3RhcmdldCA9IGxvZ190YXJnZXRfY3JlYXRlX3N0ZGVycigpOworCWxvZ19hZGRfdGFyZ2V0KHN0ZGVycl90YXJnZXQpOworCWxvZ19zZXRfYWxsX2ZpbHRlcihzdGRlcnJfdGFyZ2V0LCAxKTsKKworCWNmZyA9IG1nY3BfY29uZmlnX2FsbG9jKCk7CisJaWYgKCFjZmcpCisJCXJldHVybiAtMTsKKworCXZ0eV9pbmZvLmNvcHlyaWdodCA9IG9wZW5ic2NfY29weXJpZ2h0OworCXZ0eV9pbml0KCZ2dHlfaW5mbyk7CisJbG9nZ2luZ192dHlfYWRkX2NtZHMoKTsKKwltZ2NwX3Z0eV9pbml0KCk7CisKKwloYW5kbGVfb3B0aW9ucyhhcmdjLCBhcmd2KTsKKworICAgICAgICByYyA9IG1nY3BfcGFyc2VfY29uZmlnKGNvbmZpZ19maWxlLCBjZmcpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJjID0gdGVsbmV0X2luaXQodGFsbF9ic2NfY3R4LCAmZHVtbXlfbmV0d29yaywgNDI0Myk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJLyogc2V0IHNvbWUgY2FsbGJhY2tzICovCisJY2ZnLT5yZXNldF9jYiA9IG1nY3BfcnNpcF9jYjsKKwljZmctPmNoYW5nZV9jYiA9IG1nY3BfY2hhbmdlX2NiOworCisgICAgICAgIC8qIHdlIG5lZWQgdG8gYmluZCBhIHNvY2tldCAqLworICAgICAgICBpZiAocmMgPT0gMCkgeworCQliZmQud2hlbiA9IEJTQ19GRF9SRUFEOworCQliZmQuY2IgPSByZWFkX2NhbGxfYWdlbnQ7CisJCWJmZC5mZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKwkJaWYgKGJmZC5mZCA8IDApIHsKKwkJCXBlcnJvcigiR2F0ZXdheSBmYWlsZWQgdG8gbGlzdGVuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlzZXRzb2Nrb3B0KGJmZC5mZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmb24sIHNpemVvZihvbikpOworCisJCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKwkJYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJYWRkci5zaW5fcG9ydCA9IGh0b25zKGNmZy0+c291cmNlX3BvcnQpOworCQlpbmV0X2F0b24oY2ZnLT5zb3VyY2VfYWRkciwgJmFkZHIuc2luX2FkZHIpOworCisJCWlmIChiaW5kKGJmZC5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgc2l6ZW9mKGFkZHIpKSA8IDApIHsKKwkJCXBlcnJvcigiR2F0ZXdheSBmYWlsZWQgdG8gYmluZCIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJYmZkLmRhdGEgPSBtc2diX2FsbG9jKDQwOTYsICJtZ2NwLW1zZyIpOworCQlpZiAoIWJmZC5kYXRhKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkdhdGV3YXkgbWVtb3J5IGVycm9yLlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCisJCWlmIChic2NfcmVnaXN0ZXJfZmQoJmJmZCkgIT0gMCkgeworCQkJTE9HUChETUdDUCwgTE9HTF9GQVRBTCwgIkZhaWxlZCB0byByZWdpc3RlciB0aGUgZmRcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJDb25maWd1cmVkIGZvciBNR0NQLlxuIik7CisJfQorCisJLyogaW5pdGlhbGlzYXRpb24gKi8KKwlzcmFuZCh0aW1lKE5VTEwpKTsKKworCS8qIG1haW4gbG9vcCAqLworCXdoaWxlICgxKSB7CisJCWJzY19zZWxlY3RfbWFpbigwKTsKKwl9CisKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX25ldHdvcmsuYyBiL29wZW5ic2Mvc3JjL21nY3AvbWdjcF9uZXR3b3JrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY1MTIzMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL21nY3AvbWdjcF9uZXR3b3JrLmMKQEAgLTAsMCArMSwyODQgQEAKKy8qIEEgTWVkaWEgR2F0ZXdheSBDb250cm9sIFByb3RvY29sIE1lZGlhIEdhdGV3YXk6IFJGQyAzNDM1ICovCisvKiBUaGUgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gKi8KKworLyoKKyAqIChDKSAyMDA5LTIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDktMjAxMCBieSBPbi1XYXZlcworICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlbmRpYW4uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWdjcC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWdjcF9pbnRlcm5hbC5oPgorCisjd2FybmluZyAiTWFrZSB1c2Ugb2YgdGhlIHJ0cCBwcm94eSBjb2RlIgorCisvKiBhY2NvcmRpbmcgdG8gcnRwX3Byb3h5LmMgUkZDIDM1NTAgKi8KK3N0cnVjdCBydHBfaGRyIHsKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisJdV9pbnQ4X3QgIGNzcmNfY291bnQ6NCwKKwkJICBleHRlbnNpb246MSwKKwkJICBwYWRkaW5nOjEsCisJCSAgdmVyc2lvbjoyOworCXVfaW50OF90ICBwYXlsb2FkX3R5cGU6NywKKwkJICBtYXJrZXI6MTsKKyNlbGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwl1X2ludDhfdCAgdmVyc2lvbjoyLAorCQkgIHBhZGRpbmc6MSwKKwkJICBleHRlbnNpb246MSwKKwkJICBjc3JjX2NvdW50OjQ7CisJdV9pbnQ4X3QgIG1hcmtlcjoxLAorCQkgIHBheWxvYWRfdHlwZTo3OworI2VuZGlmCisJdV9pbnQxNl90IHNlcXVlbmNlOworCXVfaW50MzJfdCB0aW1lc3RhbXA7CisJdV9pbnQzMl90IHNzcmM7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKK2VudW0geworCURFU1RfTkVUV09SSyA9IDAsCisJREVTVF9CVFMgPSAxLAorfTsKKworZW51bSB7CisJUFJPVE9fUlRQLAorCVBST1RPX1JUQ1AsCit9OworCisjZGVmaW5lIERVTU1ZX0xPQUQgMHgyMworCisKK3N0YXRpYyBpbnQgdWRwX3NlbmQoaW50IGZkLCBzdHJ1Y3QgaW5fYWRkciAqYWRkciwgaW50IHBvcnQsIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gb3V0OworCW91dC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlvdXQuc2luX3BvcnQgPSBwb3J0OworCW1lbWNweSgmb3V0LnNpbl9hZGRyLCBhZGRyLCBzaXplb2YoKmFkZHIpKTsKKworCXJldHVybiBzZW5kdG8oZmQsIGJ1ZiwgbGVuLCAwLCAoc3RydWN0IHNvY2thZGRyICopJm91dCwgc2l6ZW9mKG91dCkpOworfQorCitpbnQgbWdjcF9zZW5kX2R1bW15KHN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwKQoreworCXN0YXRpYyBjaGFyIGJ1ZltdID0geyBEVU1NWV9MT0FEIH07CisKKwlyZXR1cm4gdWRwX3NlbmQoZW5kcC0+bG9jYWxfcnRwLmZkLCAmZW5kcC0+cmVtb3RlLAorCQkJZW5kcC0+bmV0X3J0cCwgYnVmLCAxKTsKK30KKworc3RhdGljIHZvaWQgcGF0Y2hfcGF5bG9hZChpbnQgcGF5bG9hZCwgY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgcnRwX2hkciAqcnRwX2hkcjsKKworCWlmIChsZW4gPCBzaXplb2YoKnJ0cF9oZHIpKQorCQlyZXR1cm47CisKKwlpZiAocGF5bG9hZCA8IDApCisJCXJldHVybjsKKworCXJ0cF9oZHIgPSAoc3RydWN0IHJ0cF9oZHIgKikgZGF0YTsKKwlydHBfaGRyLT5wYXlsb2FkX3R5cGUgPSBwYXlsb2FkOworfQorCisvKgorICogVGhlcmUgaXMgZGF0YSBjb21pbmcuIFdlIHdpbGwgaGF2ZSB0byBmaWd1cmUgb3V0IGlmIGl0CisgKiBjYW1lIGZyb20gdGhlIEJUUyBvciB0aGUgTWVkaWFHYXRld2F5IG9mIHRoZSBNU0MuIE9uIHRvcAorICogb2YgdGhhdCB3ZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgaXQgd2FzIFJUUCBvciBSVENQLgorICoKKyAqIEN1cnJlbnRseSB3ZSBkbyBub3QgY29tbXVuaWNhdGUgd2l0aCB0aGUgQlNDIHNvIHdlIGhhdmUKKyAqIG5vIGlkZWEgd2hlcmUgdGhlIEJUUyBpcyBsaXN0ZW5pbmcgZm9yIFJUUCBhbmQgbmVlZCB0bworICogZG8gdGhlIGNsYXNzaWMgcm91dGluZyB0cmljay4gV2FpdCBmb3IgdGhlIGZpcnN0IHBhY2tldAorICogZnJvbSB0aGUgQlRTIGFuZCB0aGVuIGdvIGFoZWFkLgorICovCitzdGF0aWMgaW50IHJ0cF9kYXRhX2NiKHN0cnVjdCBic2NfZmQgKmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwljaGFyIGJ1Zls0MDk2XTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKwlzb2NrbGVuX3Qgc2xlbiA9IHNpemVvZihhZGRyKTsKKwlzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcDsKKwlzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZzsKKwlpbnQgcmMsIGRlc3QsIHByb3RvOworCisJZW5kcCA9IChzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqKSBmZC0+ZGF0YTsKKwljZmcgPSBlbmRwLT5jZmc7CisKKwlyYyA9IHJlY3Zmcm9tKGZkLT5mZCwgJmJ1Ziwgc2l6ZW9mKGJ1ZiksIDAsCisJCQkgICAgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgJnNsZW4pOworCWlmIChyYyA8IDApIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byByZWNlaXZlIG1lc3NhZ2Ugb246IDB4JXggZXJybm86ICVkLyVzXG4iLAorCQkJRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGRvIG5vdCBmb3J3YXJkIGF5bnRoaW5nLi4uIG1heWJlIHRoZXJlIGlzIGEgcGFja2V0IGZyb20gdGhlIGJ0cyAqLworCWlmIChlbmRwLT5jaSA9PSBDSV9VTlVTRUQpCisJCXJldHVybiAtMTsKKworCS8qCisJICogRmlndXJlIG91dCB3aGVyZSB0byBmb3J3YXJkIGl0IHRvLiBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IHdlCisJICogaGF2ZSByZWNlaXZlZCB0aGUgQ29ubmVjdGlvbiBNb2RpZnkgYW5kIGtub3cgd2hvIGlzIGEgbGVnaXRpbWF0ZQorCSAqIHBhcnRuZXIuIEFjY29yZGluZyB0byB0aGUgc3BlYyB3ZSBjb3VsZCBhdHRlbXB0IHRvIGZvcndhcmQgZXZlbgorCSAqIGFmdGVyIHRoZSBDcmVhdGUgQ29ubmVjdGlvbiBidXQgd2Ugd2lsbCBub3QgYXMgd2UgYXJlIG5vdCByZWFsbHkKKwkgKiBhYmxlIHRvIHRlbGwgaWYgdGhpcyBpcyBsZWdpdGltYXRlLgorCSAqLworCSN3YXJuaW5nICJTbGlnaHQgc3BlYyB2aW9sYXRpb24uIFdpdGggY29ubmVjdGlvbiBtb2RlIHJlY3Zvbmx5IHdlIHNob3VsZCBhdHRlbXB0IHRvIGZvcndhcmQuIgorCWRlc3QgPSBtZW1jbXAoJmFkZHIuc2luX2FkZHIsICZlbmRwLT5yZW1vdGUsIHNpemVvZihhZGRyLnNpbl9hZGRyKSkgPT0gMCAmJgorCQkgICAgKGVuZHAtPm5ldF9ydHAgPT0gYWRkci5zaW5fcG9ydCB8fCBlbmRwLT5uZXRfcnRjcCA9PSBhZGRyLnNpbl9wb3J0KQorCQkJPyBERVNUX0JUUyA6IERFU1RfTkVUV09SSzsKKwlwcm90byA9IGZkID09ICZlbmRwLT5sb2NhbF9ydHAgPyBQUk9UT19SVFAgOiBQUk9UT19SVENQOworCisJLyogV2UgaGF2ZSBubyBpZGVhIHdobyBjYWxsZWQgdXMsIG1heWJlIGl0IGlzIHRoZSBCVFMuICovCisJaWYgKGRlc3QgPT0gREVTVF9ORVRXT1JLICYmIChlbmRwLT5idHNfcnRwID09IDAgfHwgY2ZnLT5mb3J3YXJkX2lwKSkgeworCQkvKiBpdCB3YXMgdGhlIEJUUy4uLiAqLworCQlpZiAoIWNmZy0+YnRzX2lwCisJCSAgICB8fCBtZW1jbXAoJmFkZHIuc2luX2FkZHIsICZjZmctPmJ0c19pbiwgc2l6ZW9mKGNmZy0+YnRzX2luKSkgPT0gMAorCQkgICAgfHwgbWVtY21wKCZhZGRyLnNpbl9hZGRyLCAmZW5kcC0+YnRzLCBzaXplb2YoZW5kcC0+YnRzKSkgPT0gMCkgeworCQkJaWYgKGZkID09ICZlbmRwLT5sb2NhbF9ydHApIHsKKwkJCQllbmRwLT5idHNfcnRwID0gYWRkci5zaW5fcG9ydDsKKwkJCX0gZWxzZSB7CisJCQkJZW5kcC0+YnRzX3J0Y3AgPSBhZGRyLnNpbl9wb3J0OworCQkJfQorCisJCQllbmRwLT5idHMgPSBhZGRyLnNpbl9hZGRyOworCQkJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJGb3VuZCBCVFMgZm9yIGVuZHBvaW50OiAweCV4IG9uIHBvcnQ6ICVkLyVkIG9mICVzXG4iLAorCQkJCUVORFBPSU5UX05VTUJFUihlbmRwKSwgbnRvaHMoZW5kcC0+YnRzX3J0cCksIG50b2hzKGVuZHAtPmJ0c19ydGNwKSwKKwkJCQlpbmV0X250b2EoYWRkci5zaW5fYWRkcikpOworCisJCX0KKwl9CisKKwkvKiB0aHJvdyBhd2F5IHRoZSBkdW1teSBtZXNzYWdlICovCisJaWYgKHJjID09IDEgJiYgYnVmWzBdID09IERVTU1ZX0xPQUQpIHsKKwkJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJGaWx0ZXJlZCBkdW1teSBvbiAweCV4XG4iLAorCQkJRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogZG8gdGhpcyBiZWZvcmUgdGhlIGxvb3AgaGFuZGxpbmcgKi8KKwlpZiAoZGVzdCA9PSBERVNUX05FVFdPUkspCisJCSsrZW5kcC0+aW5fYnRzOworCWVsc2UKKwkJKytlbmRwLT5pbl9yZW1vdGU7CisKKwkvKiBGb3IgbG9vcCB0b2dnbGUgdGhlIGRlc3RpbmF0aW9uIGFuZCB0aGVuIGRpc3BhdGNoLiAqLworCWlmIChjZmctPmF1ZGlvX2xvb3ApCisJCWRlc3QgPSAhZGVzdDsKKworCWlmIChkZXN0ID09IERFU1RfTkVUV09SSykgeworCQlwYXRjaF9wYXlsb2FkKGVuZHAtPm5ldF9wYXlsb2FkX3R5cGUsIGJ1ZiwgcmMpOworCQlyZXR1cm4gdWRwX3NlbmQoZmQtPmZkLCAmZW5kcC0+cmVtb3RlLAorCQkJICAgICBwcm90byA9PSBQUk9UT19SVFAgPyBlbmRwLT5uZXRfcnRwIDogZW5kcC0+bmV0X3J0Y3AsCisJCQkgICAgIGJ1ZiwgcmMpOworCX0gZWxzZSB7CisJCXBhdGNoX3BheWxvYWQoZW5kcC0+YnRzX3BheWxvYWRfdHlwZSwgYnVmLCByYyk7CisJCXJldHVybiB1ZHBfc2VuZChmZC0+ZmQsICZlbmRwLT5idHMsCisJCQkgICAgIHByb3RvID09IFBST1RPX1JUUCA/IGVuZHAtPmJ0c19ydHAgOiBlbmRwLT5idHNfcnRjcCwKKwkJCSAgICAgYnVmLCByYyk7CisJfQorfQorCitzdGF0aWMgaW50IGNyZWF0ZV9iaW5kKGNvbnN0IGNoYXIgKnNvdXJjZV9hZGRyLCBzdHJ1Y3QgYnNjX2ZkICpmZCwgaW50IHBvcnQpCit7CisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisJaW50IG9uID0gMTsKKworCWZkLT5mZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKwlpZiAoZmQtPmZkIDwgMCkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBVRFAgcG9ydC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJc2V0c29ja29wdChmZC0+ZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJm9uLCBzaXplb2Yob24pKTsKKwltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisJYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisJaW5ldF9hdG9uKHNvdXJjZV9hZGRyLCAmYWRkci5zaW5fYWRkcik7CisKKwlpZiAoYmluZChmZC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihhZGRyKSkgPCAwKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiaW5kX3J0cChzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcCkKK3sKKwlzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZyA9IGVuZHAtPmNmZzsKKworCWlmIChjcmVhdGVfYmluZChjZmctPnNvdXJjZV9hZGRyLCAmZW5kcC0+bG9jYWxfcnRwLCBlbmRwLT5ydHBfcG9ydCkgIT0gMCkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBSVFAgcG9ydDogJXM6JWQgb24gMHgleFxuIiwKKwkJICAgICAgIGNmZy0+c291cmNlX2FkZHIsIGVuZHAtPnJ0cF9wb3J0LCBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQlnb3RvIGNsZWFudXAwOworCX0KKworCWlmIChjcmVhdGVfYmluZChjZmctPnNvdXJjZV9hZGRyLCAmZW5kcC0+bG9jYWxfcnRjcCwgZW5kcC0+cnRwX3BvcnQgKyAxKSAhPSAwKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIFJUQ1AgcG9ydDogJXM6JWQgb24gMHgleFxuIiwKKwkJICAgICAgIGNmZy0+c291cmNlX2FkZHIsIGVuZHAtPnJ0cF9wb3J0ICsgMSwgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJZ290byBjbGVhbnVwMTsKKwl9CisKKwllbmRwLT5sb2NhbF9ydHAuY2IgPSBydHBfZGF0YV9jYjsKKwllbmRwLT5sb2NhbF9ydHAuZGF0YSA9IGVuZHA7CisJZW5kcC0+bG9jYWxfcnRwLndoZW4gPSBCU0NfRkRfUkVBRDsKKwlpZiAoYnNjX3JlZ2lzdGVyX2ZkKCZlbmRwLT5sb2NhbF9ydHApICE9IDApIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byByZWdpc3RlciBSVFAgcG9ydCAlZCBvbiAweCV4XG4iLAorCQkJZW5kcC0+cnRwX3BvcnQsIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCWdvdG8gY2xlYW51cDI7CisJfQorCisJZW5kcC0+bG9jYWxfcnRjcC5jYiA9IHJ0cF9kYXRhX2NiOworCWVuZHAtPmxvY2FsX3J0Y3AuZGF0YSA9IGVuZHA7CisJZW5kcC0+bG9jYWxfcnRjcC53aGVuID0gQlNDX0ZEX1JFQUQ7CisJaWYgKGJzY19yZWdpc3Rlcl9mZCgmZW5kcC0+bG9jYWxfcnRjcCkgIT0gMCkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIHJlZ2lzdGVyIFJUQ1AgcG9ydCAlZCBvbiAweCV4XG4iLAorCQkJZW5kcC0+cnRwX3BvcnQgKyAxLCBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQlnb3RvIGNsZWFudXAzOworCX0KKworCXJldHVybiAwOworCitjbGVhbnVwMzoKKwlic2NfdW5yZWdpc3Rlcl9mZCgmZW5kcC0+bG9jYWxfcnRwKTsKK2NsZWFudXAyOgorCWNsb3NlKGVuZHAtPmxvY2FsX3J0Y3AuZmQpOworCWVuZHAtPmxvY2FsX3J0Y3AuZmQgPSAtMTsKK2NsZWFudXAxOgorCWNsb3NlKGVuZHAtPmxvY2FsX3J0cC5mZCk7CisJZW5kcC0+bG9jYWxfcnRwLmZkID0gLTE7CitjbGVhbnVwMDoKKwlyZXR1cm4gLTE7Cit9CisKK2ludCBtZ2NwX2JpbmRfcnRwX3BvcnQoc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHAsIGludCBydHBfcG9ydCkKK3sKKwllbmRwLT5ydHBfcG9ydCA9IHJ0cF9wb3J0OworCXJldHVybiBiaW5kX3J0cChlbmRwKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL21nY3AvbWdjcF9wcm90b2NvbC5jIGIvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX3Byb3RvY29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgyYmQ2OAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL21nY3AvbWdjcF9wcm90b2NvbC5jCkBAIC0wLDAgKzEsNzY3IEBACisvKiBBIE1lZGlhIEdhdGV3YXkgQ29udHJvbCBQcm90b2NvbCBNZWRpYSBHYXRld2F5OiBSRkMgMzQzNSAqLworLyogVGhlIHByb3RvY29sIGltcGxlbWVudGF0aW9uICovCisKKy8qCisgKiAoQykgMjAwOS0yMDEwIGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIChDKSAyMDA5LTIwMTAgYnkgT24tV2F2ZXMKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWdjcC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWdjcF9pbnRlcm5hbC5oPgorCitlbnVtIG1nY3BfY29ubmVjdGlvbl9tb2RlIHsKKwlNR0NQX0NPTk5fTk9ORSA9IDAsCisJTUdDUF9DT05OX1JFQ1ZfT05MWSA9IDEsCisJTUdDUF9DT05OX1NFTkRfT05MWSA9IDIsCisJTUdDUF9DT05OX1JFQ1ZfU0VORCA9IE1HQ1BfQ09OTl9SRUNWX09OTFkgfCBNR0NQX0NPTk5fU0VORF9PTkxZLAorfTsKKworLyoqCisgKiBNYWNybyBmb3IgdG9rZW5pemluZyBNR0NQIG1lc3NhZ2VzIGFuZCBTRFAgaW4gb25lIGdvLgorICoKKyAqLworI2RlZmluZSBNU0dfVE9LRU5JWkVfU1RBUlQgXAorCWxpbmVfc3RhcnQgPSAwOwkJCQkJCVwKKwlmb3IgKGkgPSAwOyBpIDwgbXNnYl9sM2xlbihtc2cpOyArK2kpIHsJCQlcCisJCS8qIHdlIGhhdmUgYSBsaW5lIGVuZCAqLwkJCVwKKwkJaWYgKG1zZy0+bDNoW2ldID09ICdcbicpIHsJCQlcCisJCQkvKiBza2lwIHRoZSBmaXJzdCBsaW5lICovCQlcCisJCQlpZiAobGluZV9zdGFydCA9PSAwKSB7CQkJXAorCQkJCWxpbmVfc3RhcnQgPSBpICsgMTsJCVwKKwkJCQljb250aW51ZTsJCQlcCisJCQl9CQkJCQlcCisJCQkJCQkJCVwKKwkJCS8qIGNoZWNrIGlmIHdlIGhhdmUgYSBwcm9wZXIgcGFyYW0gKi8JXAorCQkJaWYgKGkgLSBsaW5lX3N0YXJ0ID09IDEgJiYgbXNnLT5sM2hbbGluZV9zdGFydF0gPT0gJ1xyJykgeyBcCisJCQl9IGVsc2UgaWYgKGkgLSBsaW5lX3N0YXJ0ID4gMgkJXAorCQkJICAgICYmIGlzbG93ZXIobXNnLT5sM2hbbGluZV9zdGFydF0pCVwKKwkJCSAgICAmJiBtc2ctPmwzaFtsaW5lX3N0YXJ0ICsgMV0gPT0gJz0nKSB7IFwKKwkJCX0gZWxzZSBpZiAoaSAtIGxpbmVfc3RhcnQgPCAzCQlcCisJCQkgICAgfHwgbXNnLT5sM2hbbGluZV9zdGFydCArIDFdICE9ICc6JwlcCisJCQkgICAgfHwgbXNnLT5sM2hbbGluZV9zdGFydCArIDJdICE9ICcgJykJXAorCQkJCWdvdG8gZXJyb3I7CQkJXAorCQkJCQkJCQlcCisJCQltc2ctPmwzaFtpXSA9ICdcMCc7CQkJXAorCQkJaWYgKG1zZy0+bDNoW2ktMV0gPT0gJ1xyJykJCVwKKwkJCQltc2ctPmwzaFtpLTFdID0gJ1wwJzsKKworI2RlZmluZSBNU0dfVE9LRU5JWkVfRU5EIFwKKwkJCWxpbmVfc3RhcnQgPSBpICsgMTsgXAorCQl9CQkJICAgIFwKKwl9CisKKworc3RydWN0IG1nY3BfcmVxdWVzdCB7CisJY2hhciAqbmFtZTsKKwlzdHJ1Y3QgbXNnYiAqKCpoYW5kbGVfcmVxdWVzdCkgKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKKwljaGFyICpkZWJ1Z19uYW1lOworfTsKKworI2RlZmluZSBNR0NQX1JFUVVFU1QoTkFNRSwgUkVRLCBERUJVR19OQU1FKSBcCisJeyAubmFtZSA9IE5BTUUsIC5oYW5kbGVfcmVxdWVzdCA9IFJFUSwgLmRlYnVnX25hbWUgPSBERUJVR19OQU1FIH0sCisKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqaGFuZGxlX2F1ZGl0X2VuZHBvaW50KHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqaGFuZGxlX2NyZWF0ZV9jb24oc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2cpOworc3RhdGljIHN0cnVjdCBtc2diICpoYW5kbGVfZGVsZXRlX2NvbihzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZyk7CitzdGF0aWMgc3RydWN0IG1zZ2IgKmhhbmRsZV9tb2RpZnlfY29uKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqaGFuZGxlX3JzaXAoc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2cpOworCitzdGF0aWMgaW50IGdlbmVyYXRlX2NhbGxfaWQoc3RydWN0IG1nY3BfY29uZmlnICpjZmcpCit7CisJaW50IGk7CisKKwkvKiB1c2UgdGhlIGNhbGwgaWQgKi8KKwkrK2NmZy0+bGFzdF9jYWxsX2lkOworCisJLyogaGFuZGxlIHdyYXAgYXJvdW5kICovCisJaWYgKGNmZy0+bGFzdF9jYWxsX2lkID09IENJX1VOVVNFRCkKKwkJKytjZmctPmxhc3RfY2FsbF9pZDsKKworCS8qIGNhbGxzdGFjayBjYW4gb25seSBiZSBvZiBzaXplIG51bWJlcl9vZl9lbmRwb2ludHMgKi8KKwkvKiB2ZXJpZnkgdGhhdCB0aGUgY2FsbCBpZCBpcyBmcmVlLCBlLmcuIGluIGNhc2Ugb2Ygb3ZlcnJ1biAqLworCWZvciAoaSA9IDE7IGkgPCBjZmctPm51bWJlcl9lbmRwb2ludHM7ICsraSkKKwkJaWYgKGNmZy0+ZW5kcG9pbnRzW2ldLmNpID09IGNmZy0+bGFzdF9jYWxsX2lkKQorCQkJcmV0dXJuIGdlbmVyYXRlX2NhbGxfaWQoY2ZnKTsKKworCXJldHVybiBjZmctPmxhc3RfY2FsbF9pZDsKK30KKworLyoKKyAqIGFycmF5IG9mIGZ1bmN0aW9uIHBvaW50ZXJzIGZvciBoYW5kbGluZyB2YXJpb3VzCisgKiBtZXNzYWdlcy4gSW4gdGhlIGZ1dHVyZSB0aGlzIG1pZ2h0IGJlIGJpbmFyeSBzb3J0ZWQKKyAqIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IG1nY3BfcmVxdWVzdCBtZ2NwX3JlcXVlc3RzIFtdID0geworCU1HQ1BfUkVRVUVTVCgiQVVFUCIsIGhhbmRsZV9hdWRpdF9lbmRwb2ludCwgIkF1ZGl0RW5kcG9pbnQiKQorCU1HQ1BfUkVRVUVTVCgiQ1JDWCIsIGhhbmRsZV9jcmVhdGVfY29uLCAiQ3JlYXRlQ29ubmVjdGlvbiIpCisJTUdDUF9SRVFVRVNUKCJETENYIiwgaGFuZGxlX2RlbGV0ZV9jb24sICJEZWxldGVDb25uZWN0aW9uIikKKwlNR0NQX1JFUVVFU1QoIk1EQ1giLCBoYW5kbGVfbW9kaWZ5X2NvbiwgIk1vZGlmaXlDb25uZWN0aW9uIikKKworCS8qIFNQRUMgZXh0ZW5zaW9uICovCisJTUdDUF9SRVFVRVNUKCJSU0lQIiwgaGFuZGxlX3JzaXAsICJSZVNldEluUHJvZ3Jlc3MiKQorfTsKKworc3RhdGljIHN0cnVjdCBtc2diICptZ2NwX21zZ2JfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCW1zZyA9IG1zZ2JfYWxsb2NfaGVhZHJvb20oNDA5NiwgMTI4LCAiTUdDUCBtc2ciKTsKKwlpZiAoIW1zZykKKwkgICAgTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBtc2diIGZvciBNR0NQIGRhdGEuXG4iKTsKKworCXJldHVybiBtc2c7Cit9CisKK3N0cnVjdCBtc2diICptZ2NwX2NyZWF0ZV9yZXNwb25zZV93aXRoX2RhdGEoaW50IGNvZGUsIGNvbnN0IGNoYXIgKm1zZywgY29uc3QgY2hhciAqdHJhbnMsCisJCQkJICAgIGNvbnN0IGNoYXIgKmRhdGEpCit7CisJaW50IGxlbjsKKwlzdHJ1Y3QgbXNnYiAqcmVzOworCisJcmVzID0gbWdjcF9tc2diX2FsbG9jKCk7CisJaWYgKCFyZXMpCisJCXJldHVybiBOVUxMOworCisJaWYgKGRhdGEpIHsKKwkJbGVuID0gc25wcmludGYoKGNoYXIgKikgcmVzLT5kYXRhLCAyMDQ4LCAiJWQgJXNcbiVzIiwgY29kZSwgdHJhbnMsIGRhdGEpOworCX0gZWxzZSB7CisJCWxlbiA9IHNucHJpbnRmKChjaGFyICopIHJlcy0+ZGF0YSwgMjA0OCwgIiVkICVzXG4iLCBjb2RlLCB0cmFucyk7CisJfQorCisJcmVzLT5sMmggPSBtc2diX3B1dChyZXMsIGxlbik7CisJTE9HUChETUdDUCwgTE9HTF9ERUJVRywgIlNlbmRpbmcgcmVzcG9uc2U6IGNvZGU6ICVkIGZvciAnJXMnXG4iLCBjb2RlLCByZXMtPmwyaCk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHN0cnVjdCBtc2diICpjcmVhdGVfcmVzcG9uc2UoaW50IGNvZGUsIGNvbnN0IGNoYXIgKm1zZywgY29uc3QgY2hhciAqdHJhbnMpCit7CisJcmV0dXJuIG1nY3BfY3JlYXRlX3Jlc3BvbnNlX3dpdGhfZGF0YShjb2RlLCBtc2csIHRyYW5zLCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBtc2diICpjcmVhdGVfcmVzcG9uc2Vfd2l0aF9zZHAoc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHAsCisJCQkJCSAgICAgY29uc3QgY2hhciAqbXNnLCBjb25zdCBjaGFyICp0cmFuc19pZCkKK3sKKwljb25zdCBjaGFyICphZGRyID0gZW5kcC0+Y2ZnLT5sb2NhbF9pcDsKKwljaGFyIHNkcF9yZWNvcmRbNDA5Nl07CisKKwlpZiAoIWFkZHIpCisJCWFkZHIgPSBlbmRwLT5jZmctPnNvdXJjZV9hZGRyOworCisJc25wcmludGYoc2RwX3JlY29yZCwgc2l6ZW9mKHNkcF9yZWNvcmQpIC0gMSwKKwkJCSJJOiAlZFxuXG4iCisJCQkidj0wXHJcbiIKKwkJCSJjPUlOIElQNCAlc1xyXG4iCisJCQkibT1hdWRpbyAlZCBSVFAvQVZQICVkXHJcbiIKKwkJCSJhPXJ0cG1hcDolZCAlc1xyXG4iLAorCQkJZW5kcC0+Y2ksIGFkZHIsIGVuZHAtPnJ0cF9wb3J0LAorCQkJZW5kcC0+YnRzX3BheWxvYWRfdHlwZSwgZW5kcC0+YnRzX3BheWxvYWRfdHlwZSwKKwkJICAgICAgICBlbmRwLT5jZmctPmF1ZGlvX25hbWUpOworCXJldHVybiBtZ2NwX2NyZWF0ZV9yZXNwb25zZV93aXRoX2RhdGEoMjAwLCBtc2csIHRyYW5zX2lkLCBzZHBfcmVjb3JkKTsKK30KKworLyoKKyAqIGhhbmRsZSBpbmNvbWluZyBtZXNzYWdlczoKKyAqICAgLSB0aGlzIGNhbiBiZSBhIGNvbW1hbmQgKGZvdXIgbGV0dGVycywgc3BhY2UsIHRyYW5zYWN0aW9uIGlkKQorICogICAtIG9yIGEgcmVzcG9uc2UgKHRocmVlIG51bWJlcnMsIHNwYWNlLCB0cmFuc2FjdGlvbiBpZCkKKyAqLworc3RydWN0IG1zZ2IgKm1nY3BfaGFuZGxlX21lc3NhZ2Uoc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2cpCit7CisgICAgICAgIGludCBjb2RlOworCXN0cnVjdCBtc2diICpyZXNwID0gTlVMTDsKKworCWlmIChtc2diX2wybGVuKG1zZykgPCA0KSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJtZ3MgdG9vIHNob3J0OiAlZFxuIiwgbXNnLT5sZW4pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKyAgICAgICAgLyogYXR0ZW1wdCB0byB0cmVhdCBpdCBhcyBhIHJlc3BvbnNlICovCisgICAgICAgIGlmIChzc2NhbmYoKGNvbnN0IGNoYXIgKikmbXNnLT5sMmhbMF0sICIlM2QgJSpzIiwgJmNvZGUpID09IDEpIHsKKwkJTE9HUChETUdDUCwgTE9HTF9ERUJVRywgIlJlc3BvbnNlOiBDb2RlOiAlZFxuIiwgY29kZSk7CisJfSBlbHNlIHsKKwkJaW50IGksIGhhbmRsZWQgPSAwOworCQltc2ctPmwzaCA9ICZtc2ctPmwyaFs0XTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWdjcF9yZXF1ZXN0cyk7ICsraSkKKwkJCWlmIChzdHJuY21wKG1nY3BfcmVxdWVzdHNbaV0ubmFtZSwgKGNvbnN0IGNoYXIgKikgJm1zZy0+bDJoWzBdLCA0KSA9PSAwKSB7CisJCQkJaGFuZGxlZCA9IDE7CisJCQkJcmVzcCA9IG1nY3BfcmVxdWVzdHNbaV0uaGFuZGxlX3JlcXVlc3QoY2ZnLCBtc2cpOworCQkJCWJyZWFrOworCQkJfQorCQlpZiAoIWhhbmRsZWQpIHsKKwkJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiTVNHIHdpdGggdHlwZTogJyUuNHMnIG5vdCBoYW5kbGVkXG4iLCAmbXNnLT5sMmhbMF0pOworCQl9CisJfQorCisJcmV0dXJuIHJlc3A7Cit9CisKKy8qIHN0cmluZyB0b2tlbml6ZXIgZm9yIHRoZSBwb29yICovCitzdGF0aWMgaW50IGZpbmRfbXNnX3BvaW50ZXJzKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBtZ2NwX21zZ19wdHIgKnB0cnMsIGludCBwdHJzX2xlbmd0aCkKK3sKKwlpbnQgaSwgZm91bmQgPSAwOworCisJaW50IHdoaXRlc3BhY2UgPSAxOworCWZvciAoaSA9IDA7IGkgPCBtc2diX2wzbGVuKG1zZykgJiYgcHRyc19sZW5ndGggPiAwOyArK2kpIHsKKwkJLyogaWYgd2UgaGF2ZSBhIHNwYWNlIHdlIGZvdW5kIGFuIGVuZCAqLworCQlpZiAobXNnLT5sM2hbaV0JPT0gJyAnIHx8IG1zZy0+bDNoW2ldID09ICdccicgfHwgbXNnLT5sM2hbaV0gPT0gJ1xuJykgeworCQkJaWYgKCF3aGl0ZXNwYWNlKSB7CisJCQkJKytmb3VuZDsKKwkJCQl3aGl0ZXNwYWNlID0gMTsKKwkJCQlwdHJzLT5sZW5ndGggPSBpIC0gcHRycy0+c3RhcnQgLSAxOworCQkJCSsrcHRyczsKKwkJCQktLXB0cnNfbGVuZ3RoOworCQkJfSBlbHNlIHsKKwkJCSAgICAvKiBza2lwIGFueSBudW1iZXIgb2Ygd2hpdGVzcGFjZSAqLworCQkJfQorCisJCQkvKiBsaW5lIGVuZC4uLiBzdG9wICovCisJCQlpZiAobXNnLT5sM2hbaV0gPT0gJ1xyJyB8fCBtc2ctPmwzaFtpXSA9PSAnXG4nKQorCQkJCWJyZWFrOworCQl9IGVsc2UgaWYgKG1zZy0+bDNoW2ldID09ICdccicgfHwgbXNnLT5sM2hbaV0gPT0gJ1xuJykgeworCQkJLyogbGluZSBlbmQsIGJlIGRvbmUgKi8KKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKHdoaXRlc3BhY2UpIHsKKwkJCXdoaXRlc3BhY2UgPSAwOworCQkJcHRycy0+c3RhcnQgPSBpOworCQl9CisJfQorCisJaWYgKHB0cnNfbGVuZ3RoID09IDApCisJCXJldHVybiAtMTsKKwlyZXR1cm4gZm91bmQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZmluZF9lbmRwb2ludChzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgY29uc3QgY2hhciAqbWdjcCkKK3sKKwljaGFyICplbmRwdHIgPSBOVUxMOworCXVuc2lnbmVkIGludCBndyA9IElOVF9NQVg7CisKKwlndyA9IHN0cnRvdWwobWdjcCwgJmVuZHB0ciwgMTYpOworCWlmIChndyA9PSAwIHx8IGd3ID49IGNmZy0+bnVtYmVyX2VuZHBvaW50cyB8fCBzdHJjbXAoZW5kcHRyLCAiQG1ndyIpICE9IDApIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIk5vdCBhYmxlIHRvIGZpbmQgZW5kcG9pbnQ6ICclcydcbiIsIG1nY3ApOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gJmNmZy0+ZW5kcG9pbnRzW2d3XTsKK30KKworaW50IG1nY3BfYW5hbHl6ZV9oZWFkZXIoc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2csCisJCQlzdHJ1Y3QgbWdjcF9tc2dfcHRyICpwdHIsIGludCBzaXplLAorCQkJY29uc3QgY2hhciAqKnRyYW5zYWN0aW9uX2lkLCBzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqKmVuZHApCit7CisJaW50IGZvdW5kOworCisJKnRyYW5zYWN0aW9uX2lkID0gIjAwMDAwMCI7CisKKwlpZiAoc2l6ZSA8IDMpIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIk5vdCBlbm91Z2ggc3BhY2UgaW4gcHRyXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWZvdW5kID0gZmluZF9tc2dfcG9pbnRlcnMobXNnLCBwdHIsIHNpemUpOworCisJaWYgKGZvdW5kIDw9IDMpIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkdhdGV3YXk6IE5vdCBlbm91Z2ggcGFyYW1zLiBGb3VuZDogJWRcbiIsIGZvdW5kKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogcmVwbGFjZSB0aGUgc3BhY2Ugd2l0aCBcMC4gdGhlIG1haW4gbWV0aG9kIGd1cmFudGVzcyB0aGF0CisJICogd2Ugc3RpbGwgaGF2ZSArIDEgZm9yIG51bGwgdGVybWluYXRpb24KKwkgKi8KKwltc2ctPmwzaFtwdHJbM10uc3RhcnQgKyBwdHJbM10ubGVuZ3RoICsgMV0gPSAnXDAnOworCW1zZy0+bDNoW3B0clsyXS5zdGFydCArIHB0clsyXS5sZW5ndGggKyAxXSA9ICdcMCc7CisJbXNnLT5sM2hbcHRyWzFdLnN0YXJ0ICsgcHRyWzFdLmxlbmd0aCArIDFdID0gJ1wwJzsKKwltc2ctPmwzaFtwdHJbMF0uc3RhcnQgKyBwdHJbMF0ubGVuZ3RoICsgMV0gPSAnXDAnOworCisJaWYgKHN0cm5jbXAoIjEuMCIsIChjb25zdCBjaGFyICopJm1zZy0+bDNoW3B0clszXS5zdGFydF0sIDMpICE9IDAKKwkgICAgfHwgc3RybmNtcCgiTUdDUCIsIChjb25zdCBjaGFyICopJm1zZy0+bDNoW3B0clsyXS5zdGFydF0sIDQpICE9IDApIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIldyb25nIE1HQ1AgdmVyc2lvbi4gTm90IGhhbmRsaW5nOiAnJXMnICclcydcbiIsCisJCQkoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtwdHJbM10uc3RhcnRdLAorCQkJKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbcHRyWzJdLnN0YXJ0XSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkqdHJhbnNhY3Rpb25faWQgPSAoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtwdHJbMF0uc3RhcnRdOworCWlmIChlbmRwKSB7CisJCSplbmRwID0gZmluZF9lbmRwb2ludChjZmcsIChjb25zdCBjaGFyICopJm1zZy0+bDNoW3B0clsxXS5zdGFydF0pOworCQlyZXR1cm4gKmVuZHAgPT0gTlVMTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmVyaWZ5X2NhbGxfaWQoY29uc3Qgc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHAsCisJCQkgIGNvbnN0IGNoYXIgKmNhbGxpZCkKK3sKKwlpZiAoc3RyY21wKGVuZHAtPmNhbGxpZCwgY2FsbGlkKSAhPSAwKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJDYWxsSURzIGRvZXMgbm90IG1hdGNoIG9uIDB4JXguICclcycgIT0gJyVzJ1xuIiwKKwkJCUVORFBPSU5UX05VTUJFUihlbmRwKSwgZW5kcC0+Y2FsbGlkLCBjYWxsaWQpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmVyaWZ5X2NpKGNvbnN0IHN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwLAorCQkgICAgIGNvbnN0IGNoYXIgKmNpKQoreworCWlmIChhdG9pKGNpKSAhPSBlbmRwLT5jaSkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiQ29ubmVjdGlvbklkZW50aWZpZXJzIGRvIG5vdCBtYXRjaCBvbiAweCV4LiAlZCAhPSAlc1xuIiwKKwkJCUVORFBPSU5UX05VTUJFUihlbmRwKSwgZW5kcC0+Y2ksIGNpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG1zZ2IgKmhhbmRsZV9hdWRpdF9lbmRwb2ludChzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgbWdjcF9tc2dfcHRyIGRhdGFfcHRyc1s2XTsKKwlpbnQgZm91bmQsIHJlc3BvbnNlOworCWNvbnN0IGNoYXIgKnRyYW5zX2lkOworCXN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwOworCisJZm91bmQgPSBtZ2NwX2FuYWx5emVfaGVhZGVyKGNmZywgbXNnLCBkYXRhX3B0cnMsIEFSUkFZX1NJWkUoZGF0YV9wdHJzKSwgJnRyYW5zX2lkLCAmZW5kcCk7CisJaWYgKGZvdW5kICE9IDApCisJICAgIHJlc3BvbnNlID0gNTAwOworCWVsc2UKKwkgICAgcmVzcG9uc2UgPSAyMDA7CisKKwlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKHJlc3BvbnNlLCAiQVVFUCIsIHRyYW5zX2lkKTsKK30KKworc3RhdGljIGludCBwYXJzZV9jb25uX21vZGUoY29uc3QgY2hhciogbXNnLCBpbnQgKmNvbm5fbW9kZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpZiAoc3RyY21wKG1zZywgInJlY3Zvbmx5IikgPT0gMCkKKwkJKmNvbm5fbW9kZSA9IE1HQ1BfQ09OTl9SRUNWX09OTFk7CisJZWxzZSBpZiAoc3RyY21wKG1zZywgInNlbmRyZWN2IikgPT0gMCkKKwkJKmNvbm5fbW9kZSA9IE1HQ1BfQ09OTl9SRUNWX1NFTkQ7CisJZWxzZSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJVbmtub3duIGNvbm5lY3Rpb24gbW9kZTogJyVzJ1xuIiwgbXNnKTsKKwkJcmV0ID0gLTE7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBtc2diICpoYW5kbGVfY3JlYXRlX2NvbihzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgbWdjcF9tc2dfcHRyIGRhdGFfcHRyc1s2XTsKKwlpbnQgZm91bmQsIGksIGxpbmVfc3RhcnQ7CisJY29uc3QgY2hhciAqdHJhbnNfaWQ7CisJc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHA7CisJaW50IGVycm9yX2NvZGUgPSA1MDA7CisJaW50IHBvcnQ7CisKKwlmb3VuZCA9IG1nY3BfYW5hbHl6ZV9oZWFkZXIoY2ZnLCBtc2csIGRhdGFfcHRycywgQVJSQVlfU0laRShkYXRhX3B0cnMpLCAmdHJhbnNfaWQsICZlbmRwKTsKKwlpZiAoZm91bmQgIT0gMCkKKwkJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZSg1MDAsICJDUkNYIiwgdHJhbnNfaWQpOworCisJaWYgKGVuZHAtPmNpICE9IENJX1VOVVNFRCkgeworCQlpZiAoY2ZnLT5mb3JjZV9yZWFsbG9jKSB7CisJCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIkVuZHBvaW50IDB4JXggYWxyZWFkeSBhbGxvY2F0ZWQuIEZvcmNpbmcgcmVhbGxvYy5cbiIsCisJCQkgICAgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJCW1nY3BfZnJlZV9lbmRwKGVuZHApOworCQl9IGVsc2UgeworCQkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkVuZHBvaW50IGlzIGFscmVhZHkgdXNlZC4gMHgleFxuIiwKKwkJCSAgICAgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoNTAwLCAiQ1JDWCIsIHRyYW5zX2lkKTsKKwkJfQorCX0KKworCS8qIHBhcnNlIENhbGxJRCBDOiBhbmQgTG9jYWxQYXJhbWV0ZXJzIEw6ICovCisJTVNHX1RPS0VOSVpFX1NUQVJUCisJc3dpdGNoIChtc2ctPmwzaFtsaW5lX3N0YXJ0XSkgeworCWNhc2UgJ0wnOgorCQllbmRwLT5sb2NhbF9vcHRpb25zID0gdGFsbG9jX3N0cmR1cChjZmctPmVuZHBvaW50cywKKwkJCShjb25zdCBjaGFyICopJm1zZy0+bDNoW2xpbmVfc3RhcnQgKyAzXSk7CisJCWJyZWFrOworCWNhc2UgJ0MnOgorCQllbmRwLT5jYWxsaWQgPSB0YWxsb2Nfc3RyZHVwKGNmZy0+ZW5kcG9pbnRzLAorCQkJKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbbGluZV9zdGFydCArIDNdKTsKKwkJYnJlYWs7CisJY2FzZSAnTSc6CisJCWlmIChwYXJzZV9jb25uX21vZGUoKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbbGluZV9zdGFydCArIDNdLAorCQkJICAgICZlbmRwLT5jb25uX21vZGUpICE9IDApIHsKKwkJICAgIGVycm9yX2NvZGUgPSA1MTc7CisJCSAgICBnb3RvIGVycm9yMjsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIlVuaGFuZGxlZCBvcHRpb246ICclYycvJWQgb24gMHgleFxuIiwKKwkJCW1zZy0+bDNoW2xpbmVfc3RhcnRdLCBtc2ctPmwzaFtsaW5lX3N0YXJ0XSwKKwkJCUVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCWJyZWFrOworCX0KKwlNU0dfVE9LRU5JWkVfRU5ECisKKwkvKiBpbml0aWFsaXplICovCisJZW5kcC0+bmV0X3J0cCA9IGVuZHAtPm5ldF9ydGNwID0gZW5kcC0+YnRzX3J0cCA9IGVuZHAtPmJ0c19ydGNwID0gMDsKKworCS8qIHNldCB0byB6ZXJvIHVudGlsIHdlIGdldCB0aGUgaW5mbyAqLworCW1lbXNldCgmZW5kcC0+cmVtb3RlLCAwLCBzaXplb2YoZW5kcC0+cmVtb3RlKSk7CisKKwkvKiBiaW5kIHRvIHRoZSBwb3J0IG5vdyAqLworCXBvcnQgPSBydHBfY2FsY3VsYXRlX3BvcnQoRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBjZmctPnJ0cF9iYXNlX3BvcnQpOworCWlmIChjZmctPmVhcmx5X2JpbmQpCisJCWVuZHAtPnJ0cF9wb3J0ID0gcG9ydDsKKwllbHNlIGlmIChtZ2NwX2JpbmRfcnRwX3BvcnQoZW5kcCwgcG9ydCkgIT0gMCkKKwkJZ290byBlcnJvcjI7CisKKwkvKiBhc3NpZ24gYSBsb2NhbCBjYWxsIGlkZW50aWZpZXIgb3IgZmFpbCAqLworCWVuZHAtPmNpID0gZ2VuZXJhdGVfY2FsbF9pZChjZmcpOworCWlmIChlbmRwLT5jaSA9PSBDSV9VTlVTRUQpCisJCWdvdG8gZXJyb3IyOworCisJZW5kcC0+YnRzX3BheWxvYWRfdHlwZSA9IGNmZy0+YXVkaW9fcGF5bG9hZDsKKworCS8qIHBvbGljeSBDQiAqLworCWlmIChjZmctPnBvbGljeV9jYikgeworCQlzd2l0Y2ggKGNmZy0+cG9saWN5X2NiKGNmZywgRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBNR0NQX0VORFBfQ1JDWCwgdHJhbnNfaWQpKSB7CisJCWNhc2UgTUdDUF9QT0xJQ1lfUkVKRUNUOgorCQkJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJDUkNYIHJlamVjdGVkIGJ5IHBvbGljeSBvbiAweCV4XG4iLAorCQkJICAgICBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQkJbWdjcF9mcmVlX2VuZHAoZW5kcCk7CisJCQlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKDUwMCwgIkNSQ1giLCB0cmFuc19pZCk7CisJCQlicmVhazsKKwkJY2FzZSBNR0NQX1BPTElDWV9ERUZFUjoKKwkJCS8qIHN0b3AgcHJvY2Vzc2luZyAqLworCQkJcmV0dXJuIE5VTEw7CisJCQlicmVhazsKKwkJY2FzZSBNR0NQX1BPTElDWV9DT05UOgorCQkJLyoganVzdCBjb250aW51ZSAqLworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIkNyZWF0aW5nIGVuZHBvaW50IG9uOiAweCV4IENJOiAldSBwb3J0OiAldVxuIiwKKwkJRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBlbmRwLT5jaSwgZW5kcC0+cnRwX3BvcnQpOworCWlmIChjZmctPmNoYW5nZV9jYikKKwkJY2ZnLT5jaGFuZ2VfY2IoY2ZnLCBFTkRQT0lOVF9OVU1CRVIoZW5kcCksIE1HQ1BfRU5EUF9DUkNYLCBlbmRwLT5ydHBfcG9ydCk7CisKKwlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlX3dpdGhfc2RwKGVuZHAsICJDUkNYIiwgdHJhbnNfaWQpOworZXJyb3I6CisJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIk1hbGZvcm1lZCBsaW5lOiAlcyBvbiAweCV4IHdpdGg6IGxpbmVfc3RhcnQ6ICVkICVkXG4iLAorCQkgICAgaGV4ZHVtcChtc2ctPmwzaCwgbXNnYl9sM2xlbihtc2cpKSwKKwkJICAgIEVORFBPSU5UX05VTUJFUihlbmRwKSwgbGluZV9zdGFydCwgaSk7CisJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZShlcnJvcl9jb2RlLCAiQ1JDWCIsIHRyYW5zX2lkKTsKKworZXJyb3IyOgorCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiUmVzb3VyY2UgZXJyb3Igb24gMHgleFxuIiwgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKGVycm9yX2NvZGUsICJDUkNYIiwgdHJhbnNfaWQpOworfQorCitzdGF0aWMgc3RydWN0IG1zZ2IgKmhhbmRsZV9tb2RpZnlfY29uKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBtZ2NwX21zZ19wdHIgZGF0YV9wdHJzWzZdOworCWludCBmb3VuZCwgaSwgbGluZV9zdGFydDsKKwljb25zdCBjaGFyICp0cmFuc19pZDsKKwlzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcDsKKwlpbnQgZXJyb3JfY29kZSA9IDUwMDsKKwlpbnQgc2lsZW50ID0gMDsKKworCWZvdW5kID0gbWdjcF9hbmFseXplX2hlYWRlcihjZmcsIG1zZywgZGF0YV9wdHJzLCBBUlJBWV9TSVpFKGRhdGFfcHRycyksICZ0cmFuc19pZCwgJmVuZHApOworCWlmIChmb3VuZCAhPSAwKQorCQlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKGVycm9yX2NvZGUsICJNRENYIiwgdHJhbnNfaWQpOworCisJaWYgKGVuZHAtPmNpID09IENJX1VOVVNFRCkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiRW5kcG9pbnQgaXMgbm90IGhvbGRpbmcgYSBjb25uZWN0aW9uLiAweCV4XG4iLCBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKGVycm9yX2NvZGUsICJNRENYIiwgdHJhbnNfaWQpOworCX0KKworCU1TR19UT0tFTklaRV9TVEFSVAorCXN3aXRjaCAobXNnLT5sM2hbbGluZV9zdGFydF0pIHsKKwljYXNlICdDJzogeworCQlpZiAodmVyaWZ5X2NhbGxfaWQoZW5kcCwgKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbbGluZV9zdGFydCArIDNdKSAhPSAwKQorCQkJZ290byBlcnJvcjM7CisJCWJyZWFrOworCX0KKwljYXNlICdJJzogeworCQlpZiAodmVyaWZ5X2NpKGVuZHAsIChjb25zdCBjaGFyICopJm1zZy0+bDNoW2xpbmVfc3RhcnQgKyAzXSkgIT0gMCkKKwkJCWdvdG8gZXJyb3IzOworCQlicmVhazsKKwl9CisJY2FzZSAnTCc6CisJCS8qIHNraXAgKi8KKwkJYnJlYWs7CisJY2FzZSAnTSc6CisJCWlmIChwYXJzZV9jb25uX21vZGUoKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbbGluZV9zdGFydCArIDNdLAorCQkJICAgICZlbmRwLT5jb25uX21vZGUpICE9IDApIHsKKwkJICAgIGVycm9yX2NvZGUgPSA1MTc7CisJCSAgICBnb3RvIGVycm9yMzsKKwkJfQorCQlicmVhazsKKwljYXNlICdaJzoKKwkJc2lsZW50ID0gc3RyY21wKCJub2Fuc3dlciIsIChjb25zdCBjaGFyICopJm1zZy0+bDNoW2xpbmVfc3RhcnQgKyAzXSkgPT0gMDsKKwkJYnJlYWs7CisJY2FzZSAnXDAnOgorCQkvKiBTRFAgZmlsZSBiZWdpbnMgKi8KKwkJYnJlYWs7CisJY2FzZSAnYSc6CisJY2FzZSAnbyc6CisJY2FzZSAncyc6CisJY2FzZSAndCc6CisJY2FzZSAndic6CisJCS8qIHNraXAgdGhlc2UgU0RQIGF0dHJpYnV0ZXMgKi8KKwkJYnJlYWs7CisJY2FzZSAnbSc6IHsKKwkJaW50IHBvcnQ7CisJCWludCBwYXlsb2FkOworCQljb25zdCBjaGFyICpwYXJhbSA9IChjb25zdCBjaGFyICopJm1zZy0+bDNoW2xpbmVfc3RhcnRdOworCisJCWlmIChzc2NhbmYocGFyYW0sICJtPWF1ZGlvICVkIFJUUC9BVlAgJWQiLCAmcG9ydCwgJnBheWxvYWQpID09IDIpIHsKKwkJCWVuZHAtPm5ldF9ydHAgPSBodG9ucyhwb3J0KTsKKwkJCWVuZHAtPm5ldF9ydGNwID0gaHRvbnMocG9ydCArIDEpOworCQkJZW5kcC0+bmV0X3BheWxvYWRfdHlwZSA9IHBheWxvYWQ7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgJ2MnOiB7CisJCWNoYXIgaXB2NFsxNl07CisJCWNvbnN0IGNoYXIgKnBhcmFtID0gKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbbGluZV9zdGFydF07CisKKwkJaWYgKHNzY2FuZihwYXJhbSwgImM9SU4gSVA0ICUxNXMiLCBpcHY0KSA9PSAxKSB7CisJCQlpbmV0X2F0b24oaXB2NCwgJmVuZHAtPnJlbW90ZSk7CisJCX0KKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiVW5oYW5kbGVkIG9wdGlvbjogJyVjJy8lZCBvbiAweCV4XG4iLAorCQkJbXNnLT5sM2hbbGluZV9zdGFydF0sIG1zZy0+bDNoW2xpbmVfc3RhcnRdLAorCQkJRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJYnJlYWs7CisJfQorCU1TR19UT0tFTklaRV9FTkQKKworCS8qIHBvbGljeSBDQiAqLworCWlmIChjZmctPnBvbGljeV9jYikgeworCQlzd2l0Y2ggKGNmZy0+cG9saWN5X2NiKGNmZywgRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBNR0NQX0VORFBfTURDWCwgdHJhbnNfaWQpKSB7CisJCWNhc2UgTUdDUF9QT0xJQ1lfUkVKRUNUOgorCQkJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJNRENYIHJlamVjdGVkIGJ5IHBvbGljeSBvbiAweCV4XG4iLAorCQkJICAgICBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQkJaWYgKHNpbGVudCkKKwkJCQlnb3RvIG91dF9zaWxlbnQ7CisJCQlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKDUwMCwgIk1EQ1giLCB0cmFuc19pZCk7CisJCQlicmVhazsKKwkJY2FzZSBNR0NQX1BPTElDWV9ERUZFUjoKKwkJCS8qIHN0b3AgcHJvY2Vzc2luZyAqLworCQkJcmV0dXJuIE5VTEw7CisJCQlicmVhazsKKwkJY2FzZSBNR0NQX1BPTElDWV9DT05UOgorCQkJLyoganVzdCBjb250aW51ZSAqLworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBtb2RpZnkgKi8KKwlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIk1vZGlmaWVkIGVuZHBvaW50IG9uOiAweCV4IFNlcnZlcjogJXM6JXVcbiIsCisJCUVORFBPSU5UX05VTUJFUihlbmRwKSwgaW5ldF9udG9hKGVuZHAtPnJlbW90ZSksIG50b2hzKGVuZHAtPm5ldF9ydHApKTsKKwlpZiAoY2ZnLT5jaGFuZ2VfY2IpCisJCWNmZy0+Y2hhbmdlX2NiKGNmZywgRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBNR0NQX0VORFBfTURDWCwgZW5kcC0+cnRwX3BvcnQpOworCWlmIChzaWxlbnQpCisJCWdvdG8gb3V0X3NpbGVudDsKKworCXJldHVybiBjcmVhdGVfcmVzcG9uc2Vfd2l0aF9zZHAoZW5kcCwgIk1EQ1giLCB0cmFuc19pZCk7CisKK2Vycm9yOgorCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJNYWxmb3JtZWQgbGluZTogJXMgb24gMHgleCB3aXRoOiBsaW5lX3N0YXJ0OiAlZCAlZCAlZFxuIiwKKwkJICAgIGhleGR1bXAobXNnLT5sM2gsIG1zZ2JfbDNsZW4obXNnKSksCisJCSAgICBFTkRQT0lOVF9OVU1CRVIoZW5kcCksIGxpbmVfc3RhcnQsIGksIG1zZy0+bDNoW2xpbmVfc3RhcnRdKTsKKwlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKGVycm9yX2NvZGUsICJNRENYIiwgdHJhbnNfaWQpOworCitlcnJvcjM6CisJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZShlcnJvcl9jb2RlLCAiTURDWCIsIHRyYW5zX2lkKTsKKworCitvdXRfc2lsZW50OgorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IG1zZ2IgKmhhbmRsZV9kZWxldGVfY29uKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBtZ2NwX21zZ19wdHIgZGF0YV9wdHJzWzZdOworCWludCBmb3VuZCwgaSwgbGluZV9zdGFydDsKKwljb25zdCBjaGFyICp0cmFuc19pZDsKKwlzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcDsKKwlpbnQgZXJyb3JfY29kZSA9IDUwMDsKKwlpbnQgc2lsZW50ID0gMDsKKworCWZvdW5kID0gbWdjcF9hbmFseXplX2hlYWRlcihjZmcsIG1zZywgZGF0YV9wdHJzLCBBUlJBWV9TSVpFKGRhdGFfcHRycyksICZ0cmFuc19pZCwgJmVuZHApOworCWlmIChmb3VuZCAhPSAwKQorCQlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKGVycm9yX2NvZGUsICJETENYIiwgdHJhbnNfaWQpOworCisJaWYgKGVuZHAtPmNpID09IENJX1VOVVNFRCkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiRW5kcG9pbnQgaXMgbm90IHVzZWQuIDB4JXhcbiIsIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoZXJyb3JfY29kZSwgIkRMQ1giLCB0cmFuc19pZCk7CisJfQorCisJTVNHX1RPS0VOSVpFX1NUQVJUCisJc3dpdGNoIChtc2ctPmwzaFtsaW5lX3N0YXJ0XSkgeworCWNhc2UgJ0MnOiB7CisJCWlmICh2ZXJpZnlfY2FsbF9pZChlbmRwLCAoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtsaW5lX3N0YXJ0ICsgM10pICE9IDApCisJCQlnb3RvIGVycm9yMzsKKwkJYnJlYWs7CisJfQorCWNhc2UgJ0knOiB7CisJCWlmICh2ZXJpZnlfY2koZW5kcCwgKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbbGluZV9zdGFydCArIDNdKSAhPSAwKQorCQkJZ290byBlcnJvcjM7CisJCWJyZWFrOworCWNhc2UgJ1onOgorCQlzaWxlbnQgPSBzdHJjbXAoIm5vYW5zd2VyIiwgKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbbGluZV9zdGFydCArIDNdKSA9PSAwOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJVbmhhbmRsZWQgb3B0aW9uOiAnJWMnLyVkIG9uIDB4JXhcbiIsCisJCQltc2ctPmwzaFtsaW5lX3N0YXJ0XSwgbXNnLT5sM2hbbGluZV9zdGFydF0sCisJCQlFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQlicmVhazsKKwl9CisJTVNHX1RPS0VOSVpFX0VORAorCisJLyogcG9saWN5IENCICovCisJaWYgKGNmZy0+cG9saWN5X2NiKSB7CisJCXN3aXRjaCAoY2ZnLT5wb2xpY3lfY2IoY2ZnLCBFTkRQT0lOVF9OVU1CRVIoZW5kcCksIE1HQ1BfRU5EUF9ETENYLCB0cmFuc19pZCkpIHsKKwkJY2FzZSBNR0NQX1BPTElDWV9SRUpFQ1Q6CisJCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIkRMQ1ggcmVqZWN0ZWQgYnkgcG9saWN5IG9uIDB4JXhcbiIsCisJCQkgICAgIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCQlpZiAoc2lsZW50KQorCQkJCWdvdG8gb3V0X3NpbGVudDsKKwkJCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoNTAwLCAiRExDWCIsIHRyYW5zX2lkKTsKKwkJCWJyZWFrOworCQljYXNlIE1HQ1BfUE9MSUNZX0RFRkVSOgorCQkJLyogc3RvcCBwcm9jZXNzaW5nICovCisJCQlyZXR1cm4gTlVMTDsKKwkJCWJyZWFrOworCQljYXNlIE1HQ1BfUE9MSUNZX0NPTlQ6CisJCQkvKiBqdXN0IGNvbnRpbnVlICovCisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIGZyZWUgdGhlIGNvbm5lY3Rpb24gKi8KKwlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIkRlbGV0ZWQgZW5kcG9pbnQgb246IDB4JXggU2VydmVyOiAlczoldVxuIiwKKwkJRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBpbmV0X250b2EoZW5kcC0+cmVtb3RlKSwgbnRvaHMoZW5kcC0+bmV0X3J0cCkpOworCW1nY3BfZnJlZV9lbmRwKGVuZHApOworCWlmIChjZmctPmNoYW5nZV9jYikKKwkJY2ZnLT5jaGFuZ2VfY2IoY2ZnLCBFTkRQT0lOVF9OVU1CRVIoZW5kcCksIE1HQ1BfRU5EUF9ETENYLCBlbmRwLT5ydHBfcG9ydCk7CisKKwlpZiAoc2lsZW50KQorCQlnb3RvIG91dF9zaWxlbnQ7CisJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZSgyNTAsICJETENYIiwgdHJhbnNfaWQpOworCitlcnJvcjoKKwlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiTWFsZm9ybWVkIGxpbmU6ICVzIG9uIDB4JXggd2l0aDogbGluZV9zdGFydDogJWQgJWRcbiIsCisJCSAgICBoZXhkdW1wKG1zZy0+bDNoLCBtc2diX2wzbGVuKG1zZykpLAorCQkgICAgRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBsaW5lX3N0YXJ0LCBpKTsKKwlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKGVycm9yX2NvZGUsICJETENYIiwgdHJhbnNfaWQpOworCitlcnJvcjM6CisJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZShlcnJvcl9jb2RlLCAiRExDWCIsIHRyYW5zX2lkKTsKKworb3V0X3NpbGVudDoKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBtc2diICpoYW5kbGVfcnNpcChzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlpZiAoY2ZnLT5yZXNldF9jYikKKwkJY2ZnLT5yZXNldF9jYihjZmcpOworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgbWdjcF9jb25maWcgKm1nY3BfY29uZmlnX2FsbG9jKHZvaWQpCit7CisJc3RydWN0IG1nY3BfY29uZmlnICpjZmc7CisKKwljZmcgPSB0YWxsb2NfemVybyhOVUxMLCBzdHJ1Y3QgbWdjcF9jb25maWcpOworCWlmICghY2ZnKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRkFUQUwsICJGYWlsZWQgdG8gYWxsb2NhdGUgY29uZmlnLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWNmZy0+c291cmNlX3BvcnQgPSAyNDI3OworCWNmZy0+c291cmNlX2FkZHIgPSB0YWxsb2Nfc3RyZHVwKGNmZywgIjAuMC4wLjAiKTsKKwljZmctPmF1ZGlvX25hbWUgPSB0YWxsb2Nfc3RyZHVwKGNmZywgIkdTTS1FRlIvODAwMCIpOworCWNmZy0+YXVkaW9fcGF5bG9hZCA9IDk3OworCWNmZy0+cnRwX2Jhc2VfcG9ydCA9IFJUUF9QT1JUX0RFRkFVTFQ7CisKKwlyZXR1cm4gY2ZnOworfQorCitpbnQgbWdjcF9lbmRwb2ludHNfYWxsb2NhdGUoc3RydWN0IG1nY3BfY29uZmlnICpjZmcpCit7CisJaW50IGk7CisKKwkvKiBJbml0aWFsaXplIGFsbCBlbmRwb2ludHMgKi8KKwljZmctPmVuZHBvaW50cyA9IF90YWxsb2NfemVyb19hcnJheShjZmcsCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbWdjcF9lbmRwb2ludCksCisJCQkJICAgICAgIGNmZy0+bnVtYmVyX2VuZHBvaW50cywgImVuZHBvaW50cyIpOworCWlmICghY2ZnLT5lbmRwb2ludHMpCisJCXJldHVybiAtMTsKKworCWZvciAoaSA9IDA7IGkgPCBjZmctPm51bWJlcl9lbmRwb2ludHM7ICsraSkgeworCQljZmctPmVuZHBvaW50c1tpXS5sb2NhbF9ydHAuZmQgPSAtMTsKKwkJY2ZnLT5lbmRwb2ludHNbaV0ubG9jYWxfcnRjcC5mZCA9IC0xOworCQljZmctPmVuZHBvaW50c1tpXS5jaSA9IENJX1VOVVNFRDsKKwkJY2ZnLT5lbmRwb2ludHNbaV0uY2ZnID0gY2ZnOworCQljZmctPmVuZHBvaW50c1tpXS5uZXRfcGF5bG9hZF90eXBlID0gLTE7CisJCWNmZy0+ZW5kcG9pbnRzW2ldLmJ0c19wYXlsb2FkX3R5cGUgPSAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBtZ2NwX2ZyZWVfZW5kcChzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcCkKK3sKKwlMT0dQKERNR0NQLCBMT0dMX0RFQlVHLCAiRGVsZXRpbmcgZW5kcG9pbnQgb246IDB4JXhcbiIsIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJZW5kcC0+Y2k9IENJX1VOVVNFRDsKKworCWlmIChlbmRwLT5jYWxsaWQpIHsKKwkJdGFsbG9jX2ZyZWUoZW5kcC0+Y2FsbGlkKTsKKwkJZW5kcC0+Y2FsbGlkID0gTlVMTDsKKwl9CisKKwlpZiAoZW5kcC0+bG9jYWxfb3B0aW9ucykgeworCQl0YWxsb2NfZnJlZShlbmRwLT5sb2NhbF9vcHRpb25zKTsKKwkJZW5kcC0+bG9jYWxfb3B0aW9ucyA9IE5VTEw7CisJfQorCisJaWYgKCFlbmRwLT5jZmctPmVhcmx5X2JpbmQpIHsKKwkJYnNjX3VucmVnaXN0ZXJfZmQoJmVuZHAtPmxvY2FsX3J0cCk7CisJCWJzY191bnJlZ2lzdGVyX2ZkKCZlbmRwLT5sb2NhbF9ydGNwKTsKKwl9CisKKwllbmRwLT5uZXRfcnRwID0gZW5kcC0+bmV0X3J0Y3AgPSBlbmRwLT5idHNfcnRwID0gZW5kcC0+YnRzX3J0Y3AgPSAwOworCWVuZHAtPm5ldF9wYXlsb2FkX3R5cGUgPSBlbmRwLT5idHNfcGF5bG9hZF90eXBlID0gLTE7CisJZW5kcC0+aW5fYnRzID0gZW5kcC0+aW5fcmVtb3RlID0gMDsKKwltZW1zZXQoJmVuZHAtPnJlbW90ZSwgMCwgc2l6ZW9mKGVuZHAtPnJlbW90ZSkpOworCW1lbXNldCgmZW5kcC0+YnRzLCAwLCBzaXplb2YoZW5kcC0+YnRzKSk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfdnR5LmMgYi9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfdnR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE1OWFiZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL21nY3AvbWdjcF92dHkuYwpAQCAtMCwwICsxLDMzNyBAQAorLyogQSBNZWRpYSBHYXRld2F5IENvbnRyb2wgUHJvdG9jb2wgTWVkaWEgR2F0ZXdheTogUkZDIDM0MzUgKi8KKy8qIFRoZSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiAqLworCisvKgorICogKEMpIDIwMDktMjAxMCBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOS0yMDEwIGJ5IE9uLVdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tZ2NwLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tZ2NwX2ludGVybmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy92dHkuaD4KKworI2luY2x1ZGUgPG9zbW9jb20vdnR5L2NvbW1hbmQuaD4KKyNpbmNsdWRlIDxvc21vY29tL3Z0eS92dHkuaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCitzdGF0aWMgc3RydWN0IG1nY3BfY29uZmlnICpnX2NmZyA9IE5VTEw7CisKKy8qCisgKiB2dHkgY29kZSBmb3IgbWdjcCBiZWxvdworICovCitzdHJ1Y3QgY21kX25vZGUgbWdjcF9ub2RlID0geworCU1HQ1BfTk9ERSwKKwkiJXMobWdjcCkjIiwKKwkxLAorfTsKKworc3RhdGljIGludCBjb25maWdfd3JpdGVfbWdjcChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdnR5X291dCh2dHksICJtZ2NwJXMiLCBWVFlfTkVXTElORSk7CisJaWYgKGdfY2ZnLT5sb2NhbF9pcCkKKwkJdnR5X291dCh2dHksICIgIGxvY2FsIGlwICVzJXMiLCBnX2NmZy0+bG9jYWxfaXAsIFZUWV9ORVdMSU5FKTsKKwlpZiAoZ19jZmctPmJ0c19pcCAmJiBzdHJsZW4oZ19jZmctPmJ0c19pcCkgIT0gMCkKKwkJdnR5X291dCh2dHksICIgIGJ0cyBpcCAlcyVzIiwgZ19jZmctPmJ0c19pcCwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBiaW5kIGlwICVzJXMiLCBnX2NmZy0+c291cmNlX2FkZHIsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgYmluZCBwb3J0ICV1JXMiLCBnX2NmZy0+c291cmNlX3BvcnQsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgYmluZCBlYXJseSAldSVzIiwgISFnX2NmZy0+ZWFybHlfYmluZCwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBydHAgYmFzZSAldSVzIiwgZ19jZmctPnJ0cF9iYXNlX3BvcnQsIFZUWV9ORVdMSU5FKTsKKwlpZiAoZ19jZmctPmF1ZGlvX3BheWxvYWQgIT0gLTEpCisJCXZ0eV9vdXQodnR5LCAiICBzZHAgYXVkaW8gcGF5bG9hZCBudW1iZXIgJWQlcyIsIGdfY2ZnLT5hdWRpb19wYXlsb2FkLCBWVFlfTkVXTElORSk7CisJaWYgKGdfY2ZnLT5hdWRpb19uYW1lKQorCQl2dHlfb3V0KHZ0eSwgIiAgc2RwIGF1ZGlvIHBheWxvYWQgbmFtZSAlcyVzIiwgZ19jZmctPmF1ZGlvX25hbWUsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgbG9vcCAldSVzIiwgISFnX2NmZy0+YXVkaW9fbG9vcCwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBudW1iZXIgZW5kcG9pbnRzICV1JXMiLCBnX2NmZy0+bnVtYmVyX2VuZHBvaW50cyAtIDEsIFZUWV9ORVdMSU5FKTsKKwlpZiAoZ19jZmctPmZvcndhcmRfaXApCisJCXZ0eV9vdXQodnR5LCAiICBmb3J3YXJkIGF1ZGlvIGlwICVzJXMiLCBnX2NmZy0+Zm9yd2FyZF9pcCwgVlRZX05FV0xJTkUpOworCWlmIChnX2NmZy0+Zm9yd2FyZF9wb3J0ICE9IDApCisJCXZ0eV9vdXQodnR5LCAiICBmb3J3YXJkIGF1ZGlvIHBvcnQgJWQlcyIsIGdfY2ZnLT5mb3J3YXJkX3BvcnQsIFZUWV9ORVdMSU5FKTsKKwlpZiAoZ19jZmctPmNhbGxfYWdlbnRfYWRkcikKKwkJdnR5X291dCh2dHksICIgIGNhbGwgYWdlbnQgaXAgJXMlcyIsIGdfY2ZnLT5jYWxsX2FnZW50X2FkZHIsIFZUWV9ORVdMSU5FKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oc2hvd19tY2dwLCBzaG93X21nY3BfY21kLCAic2hvdyBtZ2NwIiwKKyAgICAgIFNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IHRoZSBNR0NQIE1lZGlhIEdhdGV3YXkiKQoreworCWludCBpOworCisJdnR5X291dCh2dHksICJNR0NQIGlzIHVwIGFuZCBydW5uaW5nIHdpdGggJXUgZW5kcG9pbnRzOiVzIiwgZ19jZmctPm51bWJlcl9lbmRwb2ludHMgLSAxLCBWVFlfTkVXTElORSk7CisJZm9yIChpID0gMTsgaSA8IGdfY2ZnLT5udW1iZXJfZW5kcG9pbnRzOyArK2kpIHsKKwkJc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHAgPSAmZ19jZmctPmVuZHBvaW50c1tpXTsKKwkJdnR5X291dCh2dHksICIgRW5kcG9pbnQgMHglLjJ4OiBDSTogJWQgbmV0OiAldS8ldSBidHM6ICV1LyV1IG9uICVzIHRyYWZmaWMgcmVjZWl2ZWQgYnRzOiAldSAgcmVtb3RlOiAldSVzIiwKKwkJCWksIGVuZHAtPmNpLAorCQkJbnRvaHMoZW5kcC0+bmV0X3J0cCksIG50b2hzKGVuZHAtPm5ldF9ydGNwKSwKKwkJCW50b2hzKGVuZHAtPmJ0c19ydHApLCBudG9ocyhlbmRwLT5idHNfcnRjcCksCisJCQlpbmV0X250b2EoZW5kcC0+YnRzKSwgZW5kcC0+aW5fYnRzLCBlbmRwLT5pbl9yZW1vdGUsCisJCQlWVFlfTkVXTElORSk7CisJfQorCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcCwKKyAgICAgIGNmZ19tZ2NwX2NtZCwKKyAgICAgICJtZ2NwIiwKKyAgICAgICJDb25maWd1cmUgdGhlIE1HQ1AiKQoreworCXZ0eS0+bm9kZSA9IE1HQ1BfTk9ERTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwX2xvY2FsX2lwLAorICAgICAgY2ZnX21nY3BfbG9jYWxfaXBfY21kLAorICAgICAgImxvY2FsIGlwIEEuQi5DLkQiLAorICAgICAgIlNldCB0aGUgSVAgdG8gYmUgdXNlZCBpbiBTRFAgcmVjb3JkcyIpCit7CisJaWYgKGdfY2ZnLT5sb2NhbF9pcCkKKwkJdGFsbG9jX2ZyZWUoZ19jZmctPmxvY2FsX2lwKTsKKwlnX2NmZy0+bG9jYWxfaXAgPSB0YWxsb2Nfc3RyZHVwKGdfY2ZnLCBhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwX2J0c19pcCwKKyAgICAgIGNmZ19tZ2NwX2J0c19pcF9jbWQsCisgICAgICAiYnRzIGlwIEEuQi5DLkQiLAorICAgICAgIlNldCB0aGUgSVAgb2YgdGhlIEJUUyBmb3IgUlRQIGZvcndhcmRpbmciKQoreworCWlmIChnX2NmZy0+YnRzX2lwKQorCQl0YWxsb2NfZnJlZShnX2NmZy0+YnRzX2lwKTsKKwlnX2NmZy0+YnRzX2lwID0gdGFsbG9jX3N0cmR1cChnX2NmZywgYXJndlswXSk7CisJaW5ldF9hdG9uKGdfY2ZnLT5idHNfaXAsICZnX2NmZy0+YnRzX2luKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwX2JpbmRfaXAsCisgICAgICBjZmdfbWdjcF9iaW5kX2lwX2NtZCwKKyAgICAgICJiaW5kIGlwIEEuQi5DLkQiLAorICAgICAgIkJpbmQgdGhlIE1HQ1AgdG8gdGhpcyBsb2NhbCBhZGRyIikKK3sKKwlpZiAoZ19jZmctPnNvdXJjZV9hZGRyKQorCQl0YWxsb2NfZnJlZShnX2NmZy0+c291cmNlX2FkZHIpOworCWdfY2ZnLT5zb3VyY2VfYWRkciA9IHRhbGxvY19zdHJkdXAoZ19jZmcsIGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3BfYmluZF9wb3J0LAorICAgICAgY2ZnX21nY3BfYmluZF9wb3J0X2NtZCwKKyAgICAgICJiaW5kIHBvcnQgPDAtNjU1MzQ+IiwKKyAgICAgICJCaW5kIHRoZSBNR0NQIHRvIHRoaXMgcG9ydCIpCit7CisJdW5zaWduZWQgaW50IHBvcnQgPSBhdG9pKGFyZ3ZbMF0pOworCWdfY2ZnLT5zb3VyY2VfcG9ydCA9IHBvcnQ7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcF9iaW5kX2Vhcmx5LAorICAgICAgY2ZnX21nY3BfYmluZF9lYXJseV9jbWQsCisgICAgICAiYmluZCBlYXJseSAoMHwxKSIsCisgICAgICAiQmluZCBhbGwgUlRQIHBvcnRzIGVhcmx5IikKK3sKKwl1bnNpZ25lZCBpbnQgYmluZCA9IGF0b2koYXJndlswXSk7CisJZ19jZmctPmVhcmx5X2JpbmQgPSBiaW5kID09IDE7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcF9ydHBfYmFzZV9wb3J0LAorICAgICAgY2ZnX21nY3BfcnRwX2Jhc2VfcG9ydF9jbWQsCisgICAgICAicnRwIGJhc2UgPDAtNjU1MzQ+IiwKKyAgICAgICJCYXNlIHBvcnQgdG8gdXNlIikKK3sKKwl1bnNpZ25lZCBpbnQgcG9ydCA9IGF0b2koYXJndlswXSk7CisJZ19jZmctPnJ0cF9iYXNlX3BvcnQgPSBwb3J0OworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3Bfc2RwX3BheWxvYWRfbnVtYmVyLAorICAgICAgY2ZnX21nY3Bfc2RwX3BheWxvYWRfbnVtYmVyX2NtZCwKKyAgICAgICJzZHAgYXVkaW8gcGF5bG9hZCBudW1iZXIgPDEtMjU1PiIsCisgICAgICAiU2V0IHRoZSBhdWRpbyBjb2RlYyB0byB1c2UiKQoreworCXVuc2lnbmVkIGludCBwYXlsb2FkID0gYXRvaShhcmd2WzBdKTsKKwlnX2NmZy0+YXVkaW9fcGF5bG9hZCA9IHBheWxvYWQ7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcF9zZHBfcGF5bG9hZF9uYW1lLAorICAgICAgY2ZnX21nY3Bfc2RwX3BheWxvYWRfbmFtZV9jbWQsCisgICAgICAic2RwIGF1ZGlvIHBheWxvYWQgbmFtZSBOQU1FIiwKKyAgICAgICJTZXQgdGhlIGF1ZGlvIG5hbWUgdG8gdXNlIikKK3sKKwlpZiAoZ19jZmctPmF1ZGlvX25hbWUpCisJCXRhbGxvY19mcmVlKGdfY2ZnLT5hdWRpb19uYW1lKTsKKwlnX2NmZy0+YXVkaW9fbmFtZSA9IHRhbGxvY19zdHJkdXAoZ19jZmcsIGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3BfbG9vcCwKKyAgICAgIGNmZ19tZ2NwX2xvb3BfY21kLAorICAgICAgImxvb3AgKDB8MSkiLAorICAgICAgIkxvb3AgdGhlIGF1ZGlvIikKK3sKKwlnX2NmZy0+YXVkaW9fbG9vcCA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcF9udW1iZXJfZW5kcCwKKyAgICAgIGNmZ19tZ2NwX251bWJlcl9lbmRwX2NtZCwKKyAgICAgICJudW1iZXIgZW5kcG9pbnRzIDwwLTY1NTM0PiIsCisgICAgICAiVGhlIG51bWJlciBvZiBlbmRwb2ludHMgdG8gYWxsb2NhdGUuIFRoaXMgaXMgbm90IGR5bmFtaWMuIikKK3sKKwkvKiArIDEgYXMgd2Ugc3RhcnQgY291bnRpbmcgYXQgb25lICovCisJZ19jZmctPm51bWJlcl9lbmRwb2ludHMgPSBhdG9pKGFyZ3ZbMF0pICsgMTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwX2ZvcndhcmRfaXAsCisgICAgICBjZmdfbWdjcF9mb3J3YXJkX2lwX2NtZCwKKyAgICAgICJmb3J3YXJkIGF1ZGlvIGlwIEEuQi5DLkQiLAorICAgICAgIkZvcndhcmQgcGFja2V0cyBmcm9tIGFuZCB0byB0aGUgSVAuIFRoaXMgZGlzYWJsZXMgbW9zdCBvZiB0aGUgTUdDUCBmZWF0dXJlLiIpCit7CisJaWYgKGdfY2ZnLT5mb3J3YXJkX2lwKQorCQl0YWxsb2NfZnJlZShnX2NmZy0+Zm9yd2FyZF9pcCk7CisJZ19jZmctPmZvcndhcmRfaXAgPSB0YWxsb2Nfc3RyZHVwKGdfY2ZnLCBhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwX2ZvcndhcmRfcG9ydCwKKyAgICAgIGNmZ19tZ2NwX2ZvcndhcmRfcG9ydF9jbWQsCisgICAgICAiZm9yd2FyZCBhdWRpbyBwb3J0IDwxLTE1MDAwPiIsCisgICAgICAiRm9yd2FyZCBwYWNrZXRzIGZyb20gYW5kIHRvIHRoZSBwb3J0LiBUaGlzIGRpc2FibGVzIG1vc3Qgb2YgdGhlIE1HQ1AgZmVhdHVyZS4iKQoreworCWdfY2ZnLT5mb3J3YXJkX3BvcnQgPSBhdG9pKGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3BfYWdlbnRfYWRkciwKKyAgICAgIGNmZ19tZ2NwX2FnZW50X2FkZHJfY21kLAorICAgICAgImNhbGwgYWdlbnQgaXAgSVAiLAorICAgICAgIlNldCB0aGUgYWRkcmVzcyBvZiB0aGUgY2FsbCBhZ2VudC4iKQoreworCWlmIChnX2NmZy0+Y2FsbF9hZ2VudF9hZGRyKQorCQl0YWxsb2NfZnJlZShnX2NmZy0+Y2FsbF9hZ2VudF9hZGRyKTsKKwlnX2NmZy0+Y2FsbF9hZ2VudF9hZGRyID0gdGFsbG9jX3N0cmR1cChnX2NmZywgYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitpbnQgbWdjcF92dHlfaW5pdCh2b2lkKQoreworCWluc3RhbGxfZWxlbWVudF92ZSgmc2hvd19tZ2NwX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZjZmdfbWdjcF9jbWQpOworCWluc3RhbGxfbm9kZSgmbWdjcF9ub2RlLCBjb25maWdfd3JpdGVfbWdjcCk7CisJaW5zdGFsbF9kZWZhdWx0KE1HQ1BfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJm91cm5vZGVfZXhpdF9jbWQpOworCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZvdXJub2RlX2VuZF9jbWQpOworCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZjZmdfbWdjcF9sb2NhbF9pcF9jbWQpOworCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZjZmdfbWdjcF9idHNfaXBfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3BfYmluZF9pcF9jbWQpOworCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZjZmdfbWdjcF9iaW5kX3BvcnRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3BfYmluZF9lYXJseV9jbWQpOworCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZjZmdfbWdjcF9ydHBfYmFzZV9wb3J0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX3NkcF9wYXlsb2FkX251bWJlcl9jbWQpOworCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZjZmdfbWdjcF9zZHBfcGF5bG9hZF9uYW1lX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX2xvb3BfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3BfbnVtYmVyX2VuZHBfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3BfZm9yd2FyZF9pcF9jbWQpOworCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZjZmdfbWdjcF9mb3J3YXJkX3BvcnRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3BfYWdlbnRfYWRkcl9jbWQpOworCXJldHVybiAwOworfQorCitpbnQgbWdjcF9wYXJzZV9jb25maWcoY29uc3QgY2hhciAqY29uZmlnX2ZpbGUsIHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnKQoreworCWludCBpLCByYzsKKworCWdfY2ZnID0gY2ZnOworCXJjID0gdnR5X3JlYWRfY29uZmlnX2ZpbGUoY29uZmlnX2ZpbGUsIE5VTEwpOworCWlmIChyYyA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gcGFyc2UgdGhlIGNvbmZpZyBmaWxlOiAnJXMnXG4iLCBjb25maWdfZmlsZSk7CisJCXJldHVybiByYzsKKwl9CisKKworCWlmICghZ19jZmctPmJ0c19pcCkKKwkJZnByaW50ZihzdGRlcnIsICJObyBCVFMgaXAgYWRkcmVzcyBzcGVjaWZpZWQuIFRoaXMgd2lsbCBhbGxvdyBldmVyeW9uZSB0byBjb25uZWN0LlxuIik7CisKKwlpZiAoIWdfY2ZnLT5zb3VyY2VfYWRkcikgeworCQlmcHJpbnRmKHN0ZGVyciwgIllvdSBuZWVkIHRvIHNwZWNpZnkgYSBiaW5kIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChtZ2NwX2VuZHBvaW50c19hbGxvY2F0ZShnX2NmZykgIT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBhbGxvY2F0ZSBlbmRwb2ludHM6ICVkLiBRdWl0dGluZy5cbiIsIGdfY2ZnLT5udW1iZXJfZW5kcG9pbnRzKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogVGhpcyBhcHBsaWNhdGlvbiBzdXBwb3J0cyB0d28gbW9kZXMuCisJICogICAgMS4pIGEgdHJ1ZSBNR0NQIGdhdGV3YXkgd2l0aCBzdXBwb3J0IGZvciBBVUVQLCBDUkNYLCBNRENYLCBETENYCisJICogICAgMi4pIHBsYWluIGZvcndhcmRpbmcgb2YgUlRQIHBhY2tldHMgb24gdGhlIGVuZHBvaW50cy4KKwkgKiBib3RoIG1vZGVzIGFyZSBtdXR1YWwgZXhjbHVzaXZlCisJICovCisJaWYgKGdfY2ZnLT5mb3J3YXJkX2lwKSB7CisJCWludCBwb3J0ID0gZ19jZmctPnJ0cF9iYXNlX3BvcnQ7CisJCWlmIChnX2NmZy0+Zm9yd2FyZF9wb3J0ICE9IDApCisJCQlwb3J0ID0gZ19jZmctPmZvcndhcmRfcG9ydDsKKworCQlpZiAoIWdfY2ZnLT5lYXJseV9iaW5kKSB7CisJCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIkZvcndhcmRpbmcgcmVxdWlyZXMgZWFybHkgYmluZC5cbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJLyoKKwkJICogU3RvcmUgdGhlIGZvcndhcmQgSVAgYW5kIGFzc2lnbiBhIGNpLiBGb3IgZWFybHkgYmluZAorCQkgKiB0aGUgc29ja2V0cyB3aWxsIGJlIGNyZWF0ZWQgYWZ0ZXIgdGhpcy4KKwkJICovCisJCWZvciAoaSA9IDE7IGkgPCBnX2NmZy0+bnVtYmVyX2VuZHBvaW50czsgKytpKSB7CisJCQlzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcCA9ICZnX2NmZy0+ZW5kcG9pbnRzW2ldOworCQkJaW5ldF9hdG9uKGdfY2ZnLT5mb3J3YXJkX2lwLCAmZW5kcC0+cmVtb3RlKTsKKwkJCWVuZHAtPmNpID0gQ0lfVU5VU0VEICsgMjM7CisJCQllbmRwLT5uZXRfcnRwID0gaHRvbnMocnRwX2NhbGN1bGF0ZV9wb3J0KEVORFBPSU5UX05VTUJFUihlbmRwKSwgcG9ydCkpOworCQkJZW5kcC0+bmV0X3J0Y3AgPSBodG9ucyhydHBfY2FsY3VsYXRlX3BvcnQoRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBwb3J0KSArIDEpOworCQl9CisKKwkJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJDb25maWd1cmVkIGZvciBBdWRpbyBGb3J3YXJkaW5nLlxuIik7CisJfQorCisJLyogZWFybHkgYmluZCAqLworCWlmIChnX2NmZy0+ZWFybHlfYmluZCkgeworCQlmb3IgKGkgPSAxOyBpIDwgZ19jZmctPm51bWJlcl9lbmRwb2ludHM7ICsraSkgeworCQkJc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHAgPSAmZ19jZmctPmVuZHBvaW50c1tpXTsKKwkJCWludCBydHBfcG9ydDsKKworCQkJcnRwX3BvcnQgPSBydHBfY2FsY3VsYXRlX3BvcnQoRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBnX2NmZy0+cnRwX2Jhc2VfcG9ydCk7CisJCQlpZiAobWdjcF9iaW5kX3J0cF9wb3J0KGVuZHAsIHJ0cF9wb3J0KSAhPSAwKSB7CisJCQkJTE9HUChETUdDUCwgTE9HTF9GQVRBTCwgIkZhaWxlZCB0byBiaW5kOiAlZFxuIiwgcnRwX3BvcnQpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAhIWdfY2ZnLT5mb3J3YXJkX2lwOworfQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9tbmNjLmMgYi9vcGVuYnNjL3NyYy9tbmNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZkNTM2NAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL21uY2MuYwpAQCAtMCwwICsxLDQ2OCBAQAorLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDkgYnkgQW5kcmVhcyBFdmVyc2JlcmcgPEFuZHJlYXMuRXZlcnNiZXJnQHZlcnNhdGVsLmRlPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbW5jYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYW5zYWN0aW9uLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ydHBfcHJveHkuaD4KKwordm9pZCAqdGFsbF9jYWxsX2N0eDsKKworc3RhdGljIHN0cnVjdCBtbmNjX25hbWVzIHsKKwljaGFyICpuYW1lOworCWludCB2YWx1ZTsKK30gbW5jY19uYW1lc1tdID0geworCXsiTU5DQ19TRVRVUF9SRVEiLAkweDAxMDF9LAorCXsiTU5DQ19TRVRVUF9JTkQiLAkweDAxMDJ9LAorCXsiTU5DQ19TRVRVUF9SU1AiLAkweDAxMDN9LAorCXsiTU5DQ19TRVRVUF9DTkYiLAkweDAxMDR9LAorCXsiTU5DQ19TRVRVUF9DT01QTF9SRVEiLDB4MDEwNX0sCisJeyJNTkNDX1NFVFVQX0NPTVBMX0lORCIsMHgwMTA2fSwKKwl7Ik1OQ0NfQ0FMTF9DT05GX0lORCIsCTB4MDEwN30sCisJeyJNTkNDX0NBTExfUFJPQ19SRVEiLAkweDAxMDh9LAorCXsiTU5DQ19QUk9HUkVTU19SRVEiLAkweDAxMDl9LAorCXsiTU5DQ19BTEVSVF9SRVEiLAkweDAxMGF9LAorCXsiTU5DQ19BTEVSVF9JTkQiLAkweDAxMGJ9LAorCXsiTU5DQ19OT1RJRllfUkVRIiwJMHgwMTBjfSwKKwl7Ik1OQ0NfTk9USUZZX0lORCIsCTB4MDEwZH0sCisJeyJNTkNDX0RJU0NfUkVRIiwJMHgwMTBlfSwKKwl7Ik1OQ0NfRElTQ19JTkQiLAkweDAxMGZ9LAorCXsiTU5DQ19SRUxfUkVRIiwJMHgwMTEwfSwKKwl7Ik1OQ0NfUkVMX0lORCIsCTB4MDExMX0sCisJeyJNTkNDX1JFTF9DTkYiLAkweDAxMTJ9LAorCXsiTU5DQ19GQUNJTElUWV9SRVEiLAkweDAxMTN9LAorCXsiTU5DQ19GQUNJTElUWV9JTkQiLAkweDAxMTR9LAorCXsiTU5DQ19TVEFSVF9EVE1GX0lORCIsCTB4MDExNX0sCisJeyJNTkNDX1NUQVJUX0RUTUZfUlNQIiwJMHgwMTE2fSwKKwl7Ik1OQ0NfU1RBUlRfRFRNRl9SRUoiLAkweDAxMTd9LAorCXsiTU5DQ19TVE9QX0RUTUZfSU5EIiwJMHgwMTE4fSwKKwl7Ik1OQ0NfU1RPUF9EVE1GX1JTUCIsCTB4MDExOX0sCisJeyJNTkNDX01PRElGWV9SRVEiLAkweDAxMWF9LAorCXsiTU5DQ19NT0RJRllfSU5EIiwJMHgwMTFifSwKKwl7Ik1OQ0NfTU9ESUZZX1JTUCIsCTB4MDExY30sCisJeyJNTkNDX01PRElGWV9DTkYiLAkweDAxMWR9LAorCXsiTU5DQ19NT0RJRllfUkVKIiwJMHgwMTFlfSwKKwl7Ik1OQ0NfSE9MRF9JTkQiLAkweDAxMWZ9LAorCXsiTU5DQ19IT0xEX0NORiIsCTB4MDEyMH0sCisJeyJNTkNDX0hPTERfUkVKIiwJMHgwMTIxfSwKKwl7Ik1OQ0NfUkVUUklFVkVfSU5EIiwJMHgwMTIyfSwKKwl7Ik1OQ0NfUkVUUklFVkVfQ05GIiwJMHgwMTIzfSwKKwl7Ik1OQ0NfUkVUUklFVkVfUkVKIiwJMHgwMTI0fSwKKwl7Ik1OQ0NfVVNFUklORk9fUkVRIiwJMHgwMTI1fSwKKwl7Ik1OQ0NfVVNFUklORk9fSU5EIiwJMHgwMTI2fSwKKwl7Ik1OQ0NfUkVKX1JFUSIsCTB4MDEyN30sCisJeyJNTkNDX1JFSl9JTkQiLAkweDAxMjh9LAorCisJeyJNTkNDX0JSSURHRSIsCQkweDAyMDB9LAorCXsiTU5DQ19GUkFNRV9SRUNWIiwJMHgwMjAxfSwKKwl7Ik1OQ0NfRlJBTUVfRFJPUCIsCTB4MDIwMn0sCisJeyJNTkNDX0xDSEFOX01PRElGWSIsCTB4MDIwM30sCisKKwl7IkdTTV9UQ0hfRlJBTUUiLAkweDAzMDB9LAorCisJe05VTEwsIDB9IH07CisKK3N0YXRpYyBMTElTVF9IRUFEKGNhbGxfbGlzdCk7CisKK3N0YXRpYyB1X2ludDMyX3QgbmV3X2NhbGxyZWYgPSAweDAwMDAwMDAxOworCitjaGFyICpnZXRfbW5jY19uYW1lKGludCB2YWx1ZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IG1uY2NfbmFtZXNbaV0ubmFtZTsgaSsrKSB7CisJCWlmIChtbmNjX25hbWVzW2ldLnZhbHVlID09IHZhbHVlKQorCQkJcmV0dXJuIG1uY2NfbmFtZXNbaV0ubmFtZTsKKwl9CisKKwlyZXR1cm4gIk1OQ0NfVW5rbm93biI7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfY2FsbChzdHJ1Y3QgZ3NtX2NhbGwgKmNhbGwpCit7CisJbGxpc3RfZGVsKCZjYWxsLT5lbnRyeSk7CisJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIENhbGwgcmVtb3ZlZC5cbiIsIGNhbGwtPmNhbGxyZWYpOworCXRhbGxvY19mcmVlKGNhbGwpOworfQorCisKK3N0cnVjdCBnc21fY2FsbCAqZ2V0X2NhbGxfcmVmKHVfaW50MzJfdCBjYWxscmVmKQoreworCXN0cnVjdCBnc21fY2FsbCAqY2FsbHQ7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjYWxsdCwgJmNhbGxfbGlzdCwgZW50cnkpIHsKKwkJaWYgKGNhbGx0LT5jYWxscmVmID09IGNhbGxyZWYpCisJCQlyZXR1cm4gY2FsbHQ7CisJfQorCXJldHVybiBOVUxMOworfQorCit2b2lkIG1uY2Nfc2V0X2NhdXNlKHN0cnVjdCBnc21fbW5jYyAqZGF0YSwgaW50IGxvYywgaW50IHZhbCkKK3sKKwlkYXRhLT5maWVsZHMgfD0gTU5DQ19GX0NBVVNFOworCWRhdGEtPmNhdXNlLmxvY2F0aW9uID0gbG9jOworCWRhdGEtPmNhdXNlLnZhbHVlID0gdmFsOworfQorCisvKiBvbiBpbmNvbWluZyBjYWxsLCBsb29rIHVwIGRhdGFiYXNlIGFuZCBzZW5kIHNldHVwIHRvIHJlbW90ZSBzdWJzY3IuICovCitzdGF0aWMgaW50IG1uY2Nfc2V0dXBfaW5kKHN0cnVjdCBnc21fY2FsbCAqY2FsbCwgaW50IG1zZ190eXBlLAorCQkJICBzdHJ1Y3QgZ3NtX21uY2MgKnNldHVwKQoreworCXN0cnVjdCBnc21fbW5jYyBtbmNjOworCXN0cnVjdCBnc21fY2FsbCAqcmVtb3RlOworCisJbWVtc2V0KCZtbmNjLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJbW5jYy5jYWxscmVmID0gY2FsbC0+Y2FsbHJlZjsKKworCS8qIGFscmVhZHkgaGF2ZSByZW1vdGUgY2FsbCAqLworCWlmIChjYWxsLT5yZW1vdGVfcmVmKQorCQlyZXR1cm4gMDsKKwkKKwkvKiB0cmFuc2ZlciBtb2RlIDEgd291bGQgYmUgcGFja2V0IG1vZGUsIHdoaWNoIHdhcyBuZXZlciBzcGVjaWZpZWQgKi8KKwlpZiAoc2V0dXAtPmJlYXJlcl9jYXAubW9kZSAhPSAwKSB7CisJCUxPR1AoRE1OQ0MsIExPR0xfTk9USUNFLCAiKGNhbGwgJXgpIFdlIGRvbid0IHN1cHBvcnQgIgorCQkJInBhY2tldCBtb2RlXG4iLCBjYWxsLT5jYWxscmVmKTsKKwkJbW5jY19zZXRfY2F1c2UoJm1uY2MsIEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQlHU000OF9DQ19DQVVTRV9CRUFSRVJfQ0FfVU5BVkFJTCk7CisJCWdvdG8gb3V0X3JlamVjdDsKKwl9CisKKwkvKiB3ZSBjdXJyZW50bHkgb25seSBkbyBzcGVlY2ggKi8KKwlpZiAoc2V0dXAtPmJlYXJlcl9jYXAudHJhbnNmZXIgIT0gR1NNX01OQ0NfQkNBUF9TUEVFQ0gpIHsKKwkJTE9HUChETU5DQywgTE9HTF9OT1RJQ0UsICIoY2FsbCAleCkgV2Ugb25seSBzdXBwb3J0ICIKKwkJCSJ2b2ljZSBjYWxsc1xuIiwgY2FsbC0+Y2FsbHJlZik7CisJCW1uY2Nfc2V0X2NhdXNlKCZtbmNjLCBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJR1NNNDhfQ0NfQ0FVU0VfQkVBUkVSX0NBX1VOQVZBSUwpOworCQlnb3RvIG91dF9yZWplY3Q7CisJfQorCisJLyogY3JlYXRlIHJlbW90ZSBjYWxsICovCisJaWYgKCEocmVtb3RlID0gdGFsbG9jKHRhbGxfY2FsbF9jdHgsIHN0cnVjdCBnc21fY2FsbCkpKSB7CisJCW1uY2Nfc2V0X2NhdXNlKCZtbmNjLCBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJR1NNNDhfQ0NfQ0FVU0VfUkVTT1VSQ0VfVU5BVkFJTCk7CisJCWdvdG8gb3V0X3JlamVjdDsKKwl9CisJbGxpc3RfYWRkX3RhaWwoJnJlbW90ZS0+ZW50cnksICZjYWxsX2xpc3QpOworCXJlbW90ZS0+bmV0ID0gY2FsbC0+bmV0OworCXJlbW90ZS0+Y2FsbHJlZiA9IG5ld19jYWxscmVmKys7CisJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIENyZWF0aW5nIG5ldyByZW1vdGUgaW5zdGFuY2UgJXguXG4iLAorCQljYWxsLT5jYWxscmVmLCByZW1vdGUtPmNhbGxyZWYpOworCisJLyogbGluayByZW1vdGUgY2FsbCAqLworCWNhbGwtPnJlbW90ZV9yZWYgPSByZW1vdGUtPmNhbGxyZWY7CisJcmVtb3RlLT5yZW1vdGVfcmVmID0gY2FsbC0+Y2FsbHJlZjsKKworCS8qIG1vZGlmeSBtb2RlICovCisJbWVtc2V0KCZtbmNjLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJbW5jYy5jYWxscmVmID0gY2FsbC0+Y2FsbHJlZjsKKwltbmNjLmxjaGFuX21vZGUgPSBHU000OF9DTU9ERV9TUEVFQ0hfRUZSOworCURFQlVHUChETU5DQywgIihjYWxsICV4KSBNb2RpZnkgY2hhbm5lbCBtb2RlLlxuIiwgY2FsbC0+Y2FsbHJlZik7CisJbW5jY19zZW5kKGNhbGwtPm5ldCwgTU5DQ19MQ0hBTl9NT0RJRlksICZtbmNjKTsKKworCS8qIHNlbmQgY2FsbCBwcm9jZWVkaW5nICovCisJbWVtc2V0KCZtbmNjLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJbW5jYy5jYWxscmVmID0gY2FsbC0+Y2FsbHJlZjsKKwlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgQWNjZXB0aW5nIGNhbGwuXG4iLCBjYWxsLT5jYWxscmVmKTsKKwltbmNjX3NlbmQoY2FsbC0+bmV0LCBNTkNDX0NBTExfUFJPQ19SRVEsICZtbmNjKTsKKworCS8qIHNlbmQgc2V0dXAgdG8gcmVtb3RlICovCisvLwlzZXR1cC0+ZmllbGRzIHw9IE1OQ0NfRl9TSUdOQUw7CisvLwlzZXR1cC0+c2lnbmFsID0gR1NNNDhfU0lHTkFMX0RJQUxUT05FOworCXNldHVwLT5jYWxscmVmID0gcmVtb3RlLT5jYWxscmVmOworCURFQlVHUChETU5DQywgIihjYWxsICV4KSBGb3J3YXJkaW5nIFNFVFVQIHRvIHJlbW90ZS5cbiIsIGNhbGwtPmNhbGxyZWYpOworCXJldHVybiBtbmNjX3NlbmQocmVtb3RlLT5uZXQsIE1OQ0NfU0VUVVBfUkVRLCBzZXR1cCk7CisKK291dF9yZWplY3Q6CisJbW5jY19zZW5kKGNhbGwtPm5ldCwgTU5DQ19SRUpfUkVRLCAmbW5jYyk7CisJZnJlZV9jYWxsKGNhbGwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1uY2NfYWxlcnRfaW5kKHN0cnVjdCBnc21fY2FsbCAqY2FsbCwgaW50IG1zZ190eXBlLAorCQkJICBzdHJ1Y3QgZ3NtX21uY2MgKmFsZXJ0KQoreworCXN0cnVjdCBnc21fY2FsbCAqcmVtb3RlOworCisJLyogc2VuZCBhbGVydGluZyB0byByZW1vdGUgKi8KKwlpZiAoIShyZW1vdGUgPSBnZXRfY2FsbF9yZWYoY2FsbC0+cmVtb3RlX3JlZikpKQorCQlyZXR1cm4gMDsKKwlhbGVydC0+Y2FsbHJlZiA9IHJlbW90ZS0+Y2FsbHJlZjsKKwlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgRm9yd2FyZGluZyBBTEVSVCB0byByZW1vdGUuXG4iLCBjYWxsLT5jYWxscmVmKTsKKwlyZXR1cm4gbW5jY19zZW5kKHJlbW90ZS0+bmV0LCBNTkNDX0FMRVJUX1JFUSwgYWxlcnQpOworfQorCitzdGF0aWMgaW50IG1uY2Nfbm90aWZ5X2luZChzdHJ1Y3QgZ3NtX2NhbGwgKmNhbGwsIGludCBtc2dfdHlwZSwKKwkJCSAgIHN0cnVjdCBnc21fbW5jYyAqbm90aWZ5KQoreworCXN0cnVjdCBnc21fY2FsbCAqcmVtb3RlOworCisJLyogc2VuZCBub3RpZnkgdG8gcmVtb3RlICovCisJaWYgKCEocmVtb3RlID0gZ2V0X2NhbGxfcmVmKGNhbGwtPnJlbW90ZV9yZWYpKSkKKwkJcmV0dXJuIDA7CisJbm90aWZ5LT5jYWxscmVmID0gcmVtb3RlLT5jYWxscmVmOworCURFQlVHUChETU5DQywgIihjYWxsICV4KSBGb3J3YXJkaW5nIE5PVElGIHRvIHJlbW90ZS5cbiIsIGNhbGwtPmNhbGxyZWYpOworCXJldHVybiBtbmNjX3NlbmQocmVtb3RlLT5uZXQsIE1OQ0NfTk9USUZZX1JFUSwgbm90aWZ5KTsKK30KKworc3RhdGljIGludCBtbmNjX3NldHVwX2NuZihzdHJ1Y3QgZ3NtX2NhbGwgKmNhbGwsIGludCBtc2dfdHlwZSwKKwkJCSAgc3RydWN0IGdzbV9tbmNjICpjb25uZWN0KQoreworCXN0cnVjdCBnc21fbW5jYyBjb25uZWN0X2FjaywgZnJhbWVfcmVjdjsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGNhbGwtPm5ldDsKKwlzdHJ1Y3QgZ3NtX2NhbGwgKnJlbW90ZTsKKwl1X2ludDMyX3QgcmVmc1syXTsKKworCS8qIGFja25vd2xlZGdlIGNvbm5lY3QgKi8KKwltZW1zZXQoJmNvbm5lY3RfYWNrLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJY29ubmVjdF9hY2suY2FsbHJlZiA9IGNhbGwtPmNhbGxyZWY7CisJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIEFja25vd2xlZGdlIFNFVFVQLlxuIiwgY2FsbC0+Y2FsbHJlZik7CisJbW5jY19zZW5kKGNhbGwtPm5ldCwgTU5DQ19TRVRVUF9DT01QTF9SRVEsICZjb25uZWN0X2Fjayk7CisKKwkvKiBzZW5kIGNvbm5lY3QgbWVzc2FnZSB0byByZW1vdGUgKi8KKwlpZiAoIShyZW1vdGUgPSBnZXRfY2FsbF9yZWYoY2FsbC0+cmVtb3RlX3JlZikpKQorCQlyZXR1cm4gMDsKKwljb25uZWN0LT5jYWxscmVmID0gcmVtb3RlLT5jYWxscmVmOworCURFQlVHUChETU5DQywgIihjYWxsICV4KSBTZW5kaW5nIENPTk5FQ1QgdG8gcmVtb3RlLlxuIiwgY2FsbC0+Y2FsbHJlZik7CisJbW5jY19zZW5kKHJlbW90ZS0+bmV0LCBNTkNDX1NFVFVQX1JTUCwgY29ubmVjdCk7CisKKwkvKiBicmlkZ2UgdGNoICovCisJcmVmc1swXSA9IGNhbGwtPmNhbGxyZWY7CisJcmVmc1sxXSA9IGNhbGwtPnJlbW90ZV9yZWY7CisJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIEJyaWRnaW5nIHdpdGggcmVtb3RlLlxuIiwgY2FsbC0+Y2FsbHJlZik7CisKKwkvKiBpbiBkaXJlY3QgbW9kZSwgd2UgYWx3YXlzIGhhdmUgdG8gYnJpZGdlIHRoZSBjaGFubmVscyAqLworCWlmIChpcGFjY19ydHBfZGlyZWN0KQorCQlyZXR1cm4gbW5jY19zZW5kKGNhbGwtPm5ldCwgTU5DQ19CUklER0UsIHJlZnMpOworCisJLyogcHJveHkgbW9kZSAqLworCWlmICghbmV0LT5oYW5kb3Zlci5hY3RpdmUpIHsKKwkJLyogaW4gdGhlIG5vLWhhbmRvdmVyIGNhc2UsIHdlIGNhbiBicmlkZ2UsIGkuZS4gdXNlCisJCSAqIHRoZSBvbGQgUlRQIHByb3h5IGNvZGUgKi8KKwkJcmV0dXJuIG1uY2Nfc2VuZChjYWxsLT5uZXQsIE1OQ0NfQlJJREdFLCByZWZzKTsKKwl9IGVsc2UgeworCQkvKiBpbiBjYXNlIG9mIGhhbmRvdmVyLCB3ZSBuZWVkIHRvIHJlLXdyaXRlIHRoZSBSVFAKKwkJICogU1NSQywgc2VxdWVuY2UgYW5kIHRpbWVzdGFtcCB2YWx1ZXMgYW5kIHRodXMKKwkJICogbmVlZCB0byBlbmFibGUgUlRQIHJlY2VpdmUgZm9yIGJvdGggZGlyZWN0aW9ucyAqLworCQltZW1zZXQoJmZyYW1lX3JlY3YsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwkJZnJhbWVfcmVjdi5jYWxscmVmID0gY2FsbC0+Y2FsbHJlZjsKKwkJbW5jY19zZW5kKGNhbGwtPm5ldCwgTU5DQ19GUkFNRV9SRUNWLCAmZnJhbWVfcmVjdik7CisJCWZyYW1lX3JlY3YuY2FsbHJlZiA9IGNhbGwtPnJlbW90ZV9yZWY7CisJCXJldHVybiBtbmNjX3NlbmQoY2FsbC0+bmV0LCBNTkNDX0ZSQU1FX1JFQ1YsICZmcmFtZV9yZWN2KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbW5jY19kaXNjX2luZChzdHJ1Y3QgZ3NtX2NhbGwgKmNhbGwsIGludCBtc2dfdHlwZSwKKwkJCSBzdHJ1Y3QgZ3NtX21uY2MgKmRpc2MpCit7CisJc3RydWN0IGdzbV9jYWxsICpyZW1vdGU7CisKKwkvKiBzZW5kIHJlbGVhc2UgKi8KKwlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgUmVsZWFzaW5nIGNhbGwgd2l0aCBjYXVzZSAlZFxuIiwKKwkJY2FsbC0+Y2FsbHJlZiwgZGlzYy0+Y2F1c2UudmFsdWUpOworCW1uY2Nfc2VuZChjYWxsLT5uZXQsIE1OQ0NfUkVMX1JFUSwgZGlzYyk7CisKKwkvKiBzZW5kIGRpc2MgdG8gcmVtb3RlICovCisJaWYgKCEocmVtb3RlID0gZ2V0X2NhbGxfcmVmKGNhbGwtPnJlbW90ZV9yZWYpKSkgeworCQlyZXR1cm4gMDsKKwl9CisJZGlzYy0+Y2FsbHJlZiA9IHJlbW90ZS0+Y2FsbHJlZjsKKwlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgRGlzY29ubmVjdGluZyByZW1vdGUgd2l0aCBjYXVzZSAlZFxuIiwKKwkJcmVtb3RlLT5jYWxscmVmLCBkaXNjLT5jYXVzZS52YWx1ZSk7CisJcmV0dXJuIG1uY2Nfc2VuZChyZW1vdGUtPm5ldCwgTU5DQ19ESVNDX1JFUSwgZGlzYyk7Cit9CisKK3N0YXRpYyBpbnQgbW5jY19yZWxfaW5kKHN0cnVjdCBnc21fY2FsbCAqY2FsbCwgaW50IG1zZ190eXBlLCBzdHJ1Y3QgZ3NtX21uY2MgKnJlbCkKK3sKKwlzdHJ1Y3QgZ3NtX2NhbGwgKnJlbW90ZTsKKworCS8qIHNlbmQgcmVsZWFzZSB0byByZW1vdGUgKi8KKwlpZiAoIShyZW1vdGUgPSBnZXRfY2FsbF9yZWYoY2FsbC0+cmVtb3RlX3JlZikpKSB7CisJCWZyZWVfY2FsbChjYWxsKTsKKwkJcmV0dXJuIDA7CisJfQorCXJlbC0+Y2FsbHJlZiA9IHJlbW90ZS0+Y2FsbHJlZjsKKwlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgUmVsZWFzaW5nIHJlbW90ZSB3aXRoIGNhdXNlICVkXG4iLAorCQljYWxsLT5jYWxscmVmLCByZWwtPmNhdXNlLnZhbHVlKTsKKwltbmNjX3NlbmQocmVtb3RlLT5uZXQsIE1OQ0NfUkVMX1JFUSwgcmVsKTsKKworCWZyZWVfY2FsbChjYWxsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1uY2NfcmVsX2NuZihzdHJ1Y3QgZ3NtX2NhbGwgKmNhbGwsIGludCBtc2dfdHlwZSwgc3RydWN0IGdzbV9tbmNjICpyZWwpCit7CisJZnJlZV9jYWxsKGNhbGwpOworCXJldHVybiAwOworfQorCisvKiByZWNlaXZpbmcgYSBUQ0gvRiBmcmFtZSBmcm9tIHRoZSBCU0MgY29kZSAqLworc3RhdGljIGludCBtbmNjX3Jjdl90Y2hmKHN0cnVjdCBnc21fY2FsbCAqY2FsbCwgaW50IG1zZ190eXBlLAorCQkJIHN0cnVjdCBnc21fZGF0YV9mcmFtZSAqZGZyKQoreworCXN0cnVjdCBnc21fdHJhbnMgKnJlbW90ZV90cmFuczsKKworCXJlbW90ZV90cmFucyA9IHRyYW5zX2ZpbmRfYnlfY2FsbHJlZihjYWxsLT5uZXQsIGNhbGwtPnJlbW90ZV9yZWYpOworCisJLyogdGhpcyBzaG91bGRuJ3QgcmVhbGx5IGhhcHBlbiAqLworCWlmICghcmVtb3RlX3RyYW5zIHx8ICFyZW1vdGVfdHJhbnMtPmNvbm4pIHsKKwkJTE9HUChETU5DQywgTE9HTF9FUlJPUiwgIk5vIHRyYW5zYWN0aW9uIG9yIHRyYW5zYWN0aW9uIHdpdGhvdXQgbGNoYW4/IT9cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBSVFAgc29ja2V0IG9mIHJlbW90ZSBlbmQgaGFzIG1lYW53aGlsZSBkaWVkICovCisJaWYgKCFyZW1vdGVfdHJhbnMtPmNvbm4tPmxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIHJ0cF9zZW5kX2ZyYW1lKHJlbW90ZV90cmFucy0+Y29ubi0+bGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCwgZGZyKTsKK30KKworCitpbnQgbW5jY19yZWN2KHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBpbnQgbXNnX3R5cGUsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKmRhdGEgPSBhcmc7CisJaW50IGNhbGxyZWY7CisJc3RydWN0IGdzbV9jYWxsICpjYWxsID0gTlVMTCwgKmNhbGx0OworCWludCByYyA9IDA7CisKKwkvKiBTcGVjaWFsIG1lc3NhZ2VzICovCisJc3dpdGNoKG1zZ190eXBlKSB7CisJfQorCQorCS8qIGZpbmQgY2FsbHJlZiAqLworCWNhbGxyZWYgPSBkYXRhLT5jYWxscmVmOworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGNhbGx0LCAmY2FsbF9saXN0LCBlbnRyeSkgeworCQlpZiAoY2FsbHQtPmNhbGxyZWYgPT0gY2FsbHJlZikgeworCQkJY2FsbCA9IGNhbGx0OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBjcmVhdGUgY2FsbHJlZiwgaWYgc2V0dXAgaXMgcmVjZWl2ZWQgKi8KKwlpZiAoIWNhbGwpIHsKKwkJaWYgKG1zZ190eXBlICE9IE1OQ0NfU0VUVVBfSU5EKQorCQkJcmV0dXJuIDA7IC8qIGRyb3AgKi8KKwkJLyogY3JlYXRlIGNhbGwgKi8KKwkJaWYgKCEoY2FsbCA9IHRhbGxvY196ZXJvKHRhbGxfY2FsbF9jdHgsIHN0cnVjdCBnc21fY2FsbCkpKSB7CisJCQlzdHJ1Y3QgZ3NtX21uY2MgcmVsOworCQkJCisJCQltZW1zZXQoJnJlbCwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCQkJcmVsLmNhbGxyZWYgPSBjYWxscmVmOworCQkJbW5jY19zZXRfY2F1c2UoJnJlbCwgR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLAorCQkJCSAgICAgICBHU000OF9DQ19DQVVTRV9SRVNPVVJDRV9VTkFWQUlMKTsKKwkJCW1uY2Nfc2VuZChuZXQsIE1OQ0NfUkVMX1JFUSwgJnJlbCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlsbGlzdF9hZGRfdGFpbCgmY2FsbC0+ZW50cnksICZjYWxsX2xpc3QpOworCQljYWxsLT5uZXQgPSBuZXQ7CisJCWNhbGwtPmNhbGxyZWYgPSBjYWxscmVmOworCQlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgQ2FsbCBjcmVhdGVkLlxuIiwgY2FsbC0+Y2FsbHJlZik7CisJfQorCisJc3dpdGNoIChtc2dfdHlwZSkgeworCWNhc2UgR1NNX1RDSEZfRlJBTUU6CisJY2FzZSBHU01fVENIRl9GUkFNRV9FRlI6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUChETU5DQywgIihjYWxsICV4KSBSZWNlaXZlZCBtZXNzYWdlICVzXG4iLCBjYWxsLT5jYWxscmVmLAorCQkJZ2V0X21uY2NfbmFtZShtc2dfdHlwZSkpOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2gobXNnX3R5cGUpIHsKKwljYXNlIE1OQ0NfU0VUVVBfSU5EOgorCQlyYyA9IG1uY2Nfc2V0dXBfaW5kKGNhbGwsIG1zZ190eXBlLCBhcmcpOworCQlicmVhazsKKwljYXNlIE1OQ0NfU0VUVVBfQ05GOgorCQlyYyA9IG1uY2Nfc2V0dXBfY25mKGNhbGwsIG1zZ190eXBlLCBhcmcpOworCQlicmVhazsKKwljYXNlIE1OQ0NfU0VUVVBfQ09NUExfSU5EOgorCQlicmVhazsKKwljYXNlIE1OQ0NfQ0FMTF9DT05GX0lORDoKKwkJLyogd2Ugbm93IG5lZWQgdG8gTU9ESUZZIHRoZSBjaGFubmVsICovCisJCWRhdGEtPmxjaGFuX21vZGUgPSBHU000OF9DTU9ERV9TUEVFQ0hfRUZSOworCQltbmNjX3NlbmQoY2FsbC0+bmV0LCBNTkNDX0xDSEFOX01PRElGWSwgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgTU5DQ19BTEVSVF9JTkQ6CisJCXJjID0gbW5jY19hbGVydF9pbmQoY2FsbCwgbXNnX3R5cGUsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgTU5DQ19OT1RJRllfSU5EOgorCQlyYyA9IG1uY2Nfbm90aWZ5X2luZChjYWxsLCBtc2dfdHlwZSwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBNTkNDX0RJU0NfSU5EOgorCQlyYyA9IG1uY2NfZGlzY19pbmQoY2FsbCwgbXNnX3R5cGUsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgTU5DQ19SRUxfSU5EOgorCWNhc2UgTU5DQ19SRUpfSU5EOgorCQlyYyA9IG1uY2NfcmVsX2luZChjYWxsLCBtc2dfdHlwZSwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBNTkNDX1JFTF9DTkY6CisJCXJjID0gbW5jY19yZWxfY25mKGNhbGwsIG1zZ190eXBlLCBhcmcpOworCQlicmVhazsKKwljYXNlIE1OQ0NfRkFDSUxJVFlfSU5EOgorCQlicmVhazsKKwljYXNlIE1OQ0NfU1RBUlRfRFRNRl9JTkQ6CisJCWJyZWFrOworCWNhc2UgTU5DQ19TVE9QX0RUTUZfSU5EOgorCQlicmVhazsKKwljYXNlIE1OQ0NfTU9ESUZZX0lORDoKKwkJbW5jY19zZXRfY2F1c2UoZGF0YSwgR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLAorCQkJCUdTTTQ4X0NDX0NBVVNFX1NFUlZfT1BUX1VOSU1QTCk7CisJCURFQlVHUChETU5DQywgIihjYWxsICV4KSBSZWplY3RpbmcgTU9ESUZZIHdpdGggY2F1c2UgJWRcbiIsCisJCQljYWxsLT5jYWxscmVmLCBkYXRhLT5jYXVzZS52YWx1ZSk7CisJCXJjID0gbW5jY19zZW5kKG5ldCwgTU5DQ19NT0RJRllfUkVKLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBNTkNDX01PRElGWV9DTkY6CisJCWJyZWFrOworCWNhc2UgTU5DQ19IT0xEX0lORDoKKwkJbW5jY19zZXRfY2F1c2UoZGF0YSwgR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLAorCQkJCUdTTTQ4X0NDX0NBVVNFX1NFUlZfT1BUX1VOSU1QTCk7CisJCURFQlVHUChETU5DQywgIihjYWxsICV4KSBSZWplY3RpbmcgSE9MRCB3aXRoIGNhdXNlICVkXG4iLAorCQkJY2FsbC0+Y2FsbHJlZiwgZGF0YS0+Y2F1c2UudmFsdWUpOworCQlyYyA9IG1uY2Nfc2VuZChuZXQsIE1OQ0NfSE9MRF9SRUosIGRhdGEpOworCQlicmVhazsKKwljYXNlIE1OQ0NfUkVUUklFVkVfSU5EOgorCQltbmNjX3NldF9jYXVzZShkYXRhLCBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJR1NNNDhfQ0NfQ0FVU0VfU0VSVl9PUFRfVU5JTVBMKTsKKwkJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIFJlamVjdGluZyBSRVRSSUVWRSB3aXRoIGNhdXNlICVkXG4iLAorCQkJY2FsbC0+Y2FsbHJlZiwgZGF0YS0+Y2F1c2UudmFsdWUpOworCQlyYyA9IG1uY2Nfc2VuZChuZXQsIE1OQ0NfUkVUUklFVkVfUkVKLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fVENIRl9GUkFNRToKKwljYXNlIEdTTV9UQ0hGX0ZSQU1FX0VGUjoKKwkJcmMgPSBtbmNjX3Jjdl90Y2hmKGNhbGwsIG1zZ190eXBlLCBhcmcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERNTkNDLCBMT0dMX05PVElDRSwgIihjYWxsICV4KSBNZXNzYWdlIHVuaGFuZGxlZFxuIiwgY2FsbHJlZik7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLjEtMSBiL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLjEtMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjU4MDRmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcuMS0xCkBAIC0wLDAgKzEsNTQgQEAKKyEKKyEgT3BlbkJTQyBjb25maWd1cmF0aW9uIHNhdmVkIGZyb20gdnR5CishICAgIQorcGFzc3dvcmQgZm9vCishCitsaW5lIHZ0eQorIG5vIGxvZ2luCishCituZXR3b3JrCisgbmV0d29yayBjb3VudHJ5IGNvZGUgMQorIG1vYmlsZSBuZXR3b3JrIGNvZGUgMQorIHNob3J0IG5hbWUgT3BlbkJTQworIGxvbmcgbmFtZSBPcGVuQlNDCisgdGltZXIgdDMxMDEgMTAKKyB0aW1lciB0MzExMyA2MAorIGJ0cyAwCisgIHR5cGUgYnMxMQorICBiYW5kIEdTTTkwMAorICBjZWxsX2lkZW50aXR5IDEKKyAgbG9jYXRpb25fYXJlYV9jb2RlIDEKKyAgdHJhaW5pbmdfc2VxdWVuY2VfY29kZSA3CisgIGJhc2Vfc3RhdGlvbl9pZF9jb2RlIDYzCisgIG9tbCBlMSBsaW5lIDAgdGltZXNsb3QgMSBzdWItc2xvdCBmdWxsCisgIG9tbCBlMSB0ZWkgMjUKKyAgdHJ4IDAKKyAgIGFyZmNuIDEyMQorICAgbWF4X3Bvd2VyX3JlZCAwCisgICByc2wgZTEgbGluZSAwIHRpbWVzbG90IDEgc3ViLXNsb3QgZnVsbAorICAgcnNsIGUxIHRlaSAxCisgICAgdGltZXNsb3QgMAorICAgICBwaHlzX2NoYW5fY29uZmlnIENDQ0grU0RDQ0g0CisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAxIHN1Yi1zbG90IGZ1bGwKKyAgICB0aW1lc2xvdCAxCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDIgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDIKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMiBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgMworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAyIHN1Yi1zbG90IDMKKyAgICB0aW1lc2xvdCA0CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMAorICAgIHRpbWVzbG90IDUKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgNgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCA3CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMworCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy4xLTIgYi9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy4xLTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRkNTBjNwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLjEtMgpAQCAtMCwwICsxLDgyIEBACishCishIE9wZW5CU0MgY29uZmlndXJhdGlvbiBzYXZlZCBmcm9tIHZ0eQorISAgICEKK3Bhc3N3b3JkIGZvbworIQorbGluZSB2dHkKKyBubyBsb2dpbgorIQorbmV0d29yaworIG5ldHdvcmsgY291bnRyeSBjb2RlIDEKKyBtb2JpbGUgbmV0d29yayBjb2RlIDEKKyBzaG9ydCBuYW1lIE9wZW5CU0MKKyBsb25nIG5hbWUgT3BlbkJTQworIHRpbWVyIHQzMTAxIDEwCisgdGltZXIgdDMxMTMgNjAKKyBidHMgMAorICB0eXBlIGJzMTEKKyAgYmFuZCBHU005MDAKKyAgY2VsbF9pZGVudGl0eSAxCisgIGxvY2F0aW9uX2FyZWFfY29kZSAxCisgIHRyYWluaW5nX3NlcXVlbmNlX2NvZGUgNworICBiYXNlX3N0YXRpb25faWRfY29kZSA2MworICBvbWwgZTEgbGluZSAwIHRpbWVzbG90IDEgc3ViLXNsb3QgZnVsbAorICBvbWwgZTEgdGVpIDI1CisgIHRyeCAwCisgICBhcmZjbiAxMjEKKyAgIG1heF9wb3dlcl9yZWQgMAorICAgcnNsIGUxIGxpbmUgMCB0aW1lc2xvdCAxIHN1Yi1zbG90IGZ1bGwKKyAgIHJzbCBlMSB0ZWkgMQorICAgIHRpbWVzbG90IDAKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBDQ0NIK1NEQ0NINAorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMSBzdWItc2xvdCBmdWxsCisgICAgdGltZXNsb3QgMQorICAgICBwaHlzX2NoYW5fY29uZmlnIFNEQ0NIOAorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMiBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgMgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAyIHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCAzCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDIgc3ViLXNsb3QgMworICAgIHRpbWVzbG90IDQKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgNQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCA2CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDcKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAzCisgIHRyeCAxCisgICBhcmZjbiAxMjMKKyAgIG1heF9wb3dlcl9yZWQgMAorICAgcnNsIGUxIGxpbmUgMCB0aW1lc2xvdCAxIHN1Yi1zbG90IGZ1bGwKKyAgIHJzbCBlMSB0ZWkgMgorICAgIHRpbWVzbG90IDAKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNCBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgMQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA0IHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCAyCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDQgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDMKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNCBzdWItc2xvdCAzCisgICAgdGltZXNsb3QgNAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA1IHN1Yi1zbG90IDAKKyAgICB0aW1lc2xvdCA1CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDUgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDYKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNSBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgNworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA1IHN1Yi1zbG90IDMKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLjItMiBiL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLjItMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWU4MDAzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcuMi0yCkBAIC0wLDAgKzEsMTQ4IEBACishCishIE9wZW5CU0MgY29uZmlndXJhdGlvbiBzYXZlZCBmcm9tIHZ0eQorISAgICEKK3Bhc3N3b3JkIGZvbworIQorbGluZSB2dHkKKyBubyBsb2dpbgorIQorbmV0d29yaworIG5ldHdvcmsgY291bnRyeSBjb2RlIDEKKyBtb2JpbGUgbmV0d29yayBjb2RlIDEKKyBzaG9ydCBuYW1lIE9wZW5CU0MKKyBsb25nIG5hbWUgT3BlbkJTQworIHRpbWVyIHQzMTAxIDEwCisgdGltZXIgdDMxMTMgNjAKKyBidHMgMAorICB0eXBlIGJzMTEKKyAgYmFuZCBHU005MDAKKyAgY2VsbF9pZGVudGl0eSAxCisgIGxvY2F0aW9uX2FyZWFfY29kZSAxCisgIHRyYWluaW5nX3NlcXVlbmNlX2NvZGUgNworICBiYXNlX3N0YXRpb25faWRfY29kZSA2MworICBvbWwgZTEgbGluZSAwIHRpbWVzbG90IDEgc3ViLXNsb3QgZnVsbAorICBvbWwgZTEgdGVpIDI1CisgIHRyeCAwCisgICBhcmZjbiAxMjEKKyAgIG1heF9wb3dlcl9yZWQgMAorICAgcnNsIGUxIGxpbmUgMCB0aW1lc2xvdCAxIHN1Yi1zbG90IGZ1bGwKKyAgIHJzbCBlMSB0ZWkgMQorICAgIHRpbWVzbG90IDAKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBDQ0NIK1NEQ0NINAorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMSBzdWItc2xvdCBmdWxsCisgICAgdGltZXNsb3QgMQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAyIHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCAyCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDIgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDMKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMiBzdWItc2xvdCAzCisgICAgdGltZXNsb3QgNAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDAKKyAgICB0aW1lc2xvdCA1CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDYKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgNworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDMKKyAgdHJ4IDEKKyAgIGFyZmNuIDEyMworICAgbWF4X3Bvd2VyX3JlZCAwCisgICByc2wgZTEgbGluZSAwIHRpbWVzbG90IDEgc3ViLXNsb3QgZnVsbAorICAgcnNsIGUxIHRlaSAyCisgICAgdGltZXNsb3QgMAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA0IHN1Yi1zbG90IDAKKyAgICB0aW1lc2xvdCAxCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDQgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDIKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNCBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgMworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA0IHN1Yi1zbG90IDMKKyAgICB0aW1lc2xvdCA0CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDUgc3ViLXNsb3QgMAorICAgIHRpbWVzbG90IDUKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNSBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgNgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA1IHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCA3CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDUgc3ViLXNsb3QgMworIGJ0cyAxCisgIHR5cGUgYnMxMQorICBiYW5kIEdTTTkwMAorICBsb2NhdGlvbl9hcmVhX2NvZGUgMgorICB0cmFpbmluZ19zZXF1ZW5jZV9jb2RlIDcKKyAgYmFzZV9zdGF0aW9uX2lkX2NvZGUgNjMKKyAgb21sIGUxIGxpbmUgMSB0aW1lc2xvdCA2IHN1Yi1zbG90IGZ1bGwKKyAgb21sIGUxIHRlaSAyNQorICB0cnggMAorICAgYXJmY24gMTIyCisgICBtYXhfcG93ZXJfcmVkIDAKKyAgIHJzbCBlMSBsaW5lIDEgdGltZXNsb3QgNiBzdWItc2xvdCBmdWxsCisgICByc2wgZTEgdGVpIDEKKyAgICB0aW1lc2xvdCAwCisgICAgIHBoeXNfY2hhbl9jb25maWcgQ0NDSCtTRENDSDQKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDcgc3ViLXNsb3QgMAorICAgIHRpbWVzbG90IDEKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBTRENDSDgKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDcgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDIKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgNyBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgMworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA3IHN1Yi1zbG90IDMKKyAgICB0aW1lc2xvdCA0CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDggc3ViLXNsb3QgMAorICAgIHRpbWVzbG90IDUKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgOCBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgNgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA4IHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCA3CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDggc3ViLXNsb3QgMworICB0cnggMQorICAgYXJmY24gMTI0CisgICBtYXhfcG93ZXJfcmVkIDAKKyAgIHJzbCBlMSBsaW5lIDEgdGltZXNsb3QgNiBzdWItc2xvdCBmdWxsCisgICByc2wgZTEgdGVpIDIKKyAgICB0aW1lc2xvdCAwCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDkgc3ViLXNsb3QgMAorICAgIHRpbWVzbG90IDEKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgOSBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgMgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA5IHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCAzCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDkgc3ViLXNsb3QgMworICAgIHRpbWVzbG90IDQKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgMTAgc3ViLXNsb3QgMAorICAgIHRpbWVzbG90IDUKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgMTAgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDYKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgMTAgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDcKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgMTAgc3ViLXNsb3QgMwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcubmFub2J0cyBiL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLm5hbm9idHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEwYmE3NAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLm5hbm9idHMKQEAgLTAsMCArMSw3NSBAQAorIQorISBPcGVuQlNDIGNvbmZpZ3VyYXRpb24gc2F2ZWQgZnJvbSB2dHkKKyEgICAhCitwYXNzd29yZCBmb28KKyEKK2xpbmUgdnR5Cisgbm8gbG9naW4KKyEKK25ldHdvcmsKKyBuZXR3b3JrIGNvdW50cnkgY29kZSAxCisgbW9iaWxlIG5ldHdvcmsgY29kZSAxCisgc2hvcnQgbmFtZSBPcGVuQlNDCisgbG9uZyBuYW1lIE9wZW5CU0MKKyBhdXRoIHBvbGljeSBjbG9zZWQKKyBsb2NhdGlvbiB1cGRhdGluZyByZWplY3QgY2F1c2UgMTMKKyBlbmNyeXB0aW9uIGE1IDAKKyBuZWNpIDAKKyBycmxwIG1vZGUgbm9uZQorIG1tIGluZm8gMQorIGhhbmRvdmVyIDAKKyBoYW5kb3ZlciB3aW5kb3cgcnhsZXYgYXZlcmFnaW5nIDEwCisgaGFuZG92ZXIgd2luZG93IHJ4cXVhbCBhdmVyYWdpbmcgMQorIGhhbmRvdmVyIHdpbmRvdyByeGxldiBuZWlnaGJvciBhdmVyYWdpbmcgMTAKKyBoYW5kb3ZlciBwb3dlciBidWRnZXQgaW50ZXJ2YWwgNgorIGhhbmRvdmVyIHBvd2VyIGJ1ZGdldCBoeXN0ZXJlc2lzIDMKKyBoYW5kb3ZlciBtYXhpbXVtIGRpc3RhbmNlIDk5OTkKKyB0aW1lciB0MzEwMSAxMAorIHRpbWVyIHQzMTAzIDAKKyB0aW1lciB0MzEwNSAwCisgdGltZXIgdDMxMDcgMAorIHRpbWVyIHQzMTA5IDAKKyB0aW1lciB0MzExMSAwCisgdGltZXIgdDMxMTMgNjAKKyB0aW1lciB0MzExNSAwCisgdGltZXIgdDMxMTcgMAorIHRpbWVyIHQzMTE5IDAKKyB0aW1lciB0MzE0MSAwCisgYnRzIDAKKyAgdHlwZSBuYW5vYnRzCisgIGJhbmQgRENTMTgwMAorICBjZWxsX2lkZW50aXR5IDAKKyAgbG9jYXRpb25fYXJlYV9jb2RlIDEKKyAgdHJhaW5pbmdfc2VxdWVuY2VfY29kZSA3CisgIGJhc2Vfc3RhdGlvbl9pZF9jb2RlIDYzCisgIG1zIG1heCBwb3dlciAxNQorICBjZWxsIHJlc2VsZWN0aW9uIGh5c3RlcmVzaXMgNAorICByeGxldiBhY2Nlc3MgbWluIDAKKyAgY2hhbm5lbCBhbGxvY2F0b3IgYXNjZW5kaW5nCisgIHJhY2ggdHggaW50ZWdlciA5CisgIHJhY2ggbWF4IHRyYW5zbWlzc2lvbiA3CisgIGlwLmFjY2VzcyB1bml0X2lkIDE4MDEgMAorICBvbWwgaXAuYWNjZXNzIHN0cmVhbV9pZCAyNTUKKyAgZ3BycyBtb2RlIG5vbmUKKyAgdHJ4IDAKKyAgIHJmX2xvY2tlZCAwCisgICBhcmZjbiA1MTQKKyAgIG5vbWluYWwgcG93ZXIgMjMKKyAgIG1heF9wb3dlcl9yZWQgMjAKKyAgIHJzbCBlMSB0ZWkgMAorICAgIHRpbWVzbG90IDAKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBDQ0NIK1NEQ0NINAorICAgIHRpbWVzbG90IDEKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBTRENDSDgKKyAgICB0aW1lc2xvdCAyCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICB0aW1lc2xvdCAzCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICB0aW1lc2xvdCA0CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICB0aW1lc2xvdCA1CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICB0aW1lc2xvdCA2CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICB0aW1lc2xvdCA3CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLm5hbm9idHMubXVsdGl0cnggYi9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy5uYW5vYnRzLm11bHRpdHJ4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMjdmZjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy5uYW5vYnRzLm11bHRpdHJ4CkBAIC0wLDAgKzEsOTcgQEAKKyEKKyEgT3BlbkJTQyBjb25maWd1cmF0aW9uIHNhdmVkIGZyb20gdnR5CishICAgIQorcGFzc3dvcmQgZm9vCishCitsaW5lIHZ0eQorIG5vIGxvZ2luCishCituZXR3b3JrCisgbmV0d29yayBjb3VudHJ5IGNvZGUgMQorIG1vYmlsZSBuZXR3b3JrIGNvZGUgMQorIHNob3J0IG5hbWUgT3BlbkJTQworIGxvbmcgbmFtZSBPcGVuQlNDCisgYXV0aCBwb2xpY3kgY2xvc2VkCisgbG9jYXRpb24gdXBkYXRpbmcgcmVqZWN0IGNhdXNlIDEzCisgZW5jcnlwdGlvbiBhNSAwCisgbmVjaSAwCisgcnJscCBtb2RlIG5vbmUKKyBtbSBpbmZvIDAKKyBoYW5kb3ZlciAwCisgaGFuZG92ZXIgd2luZG93IHJ4bGV2IGF2ZXJhZ2luZyAxMAorIGhhbmRvdmVyIHdpbmRvdyByeHF1YWwgYXZlcmFnaW5nIDEKKyBoYW5kb3ZlciB3aW5kb3cgcnhsZXYgbmVpZ2hib3IgYXZlcmFnaW5nIDEwCisgaGFuZG92ZXIgcG93ZXIgYnVkZ2V0IGludGVydmFsIDYKKyBoYW5kb3ZlciBwb3dlciBidWRnZXQgaHlzdGVyZXNpcyAzCisgaGFuZG92ZXIgbWF4aW11bSBkaXN0YW5jZSA5OTk5CisgdGltZXIgdDMxMDEgMTAKKyB0aW1lciB0MzEwMyAwCisgdGltZXIgdDMxMDUgMAorIHRpbWVyIHQzMTA3IDAKKyB0aW1lciB0MzEwOSAwCisgdGltZXIgdDMxMTEgMAorIHRpbWVyIHQzMTEzIDYwCisgdGltZXIgdDMxMTUgMAorIHRpbWVyIHQzMTE3IDAKKyB0aW1lciB0MzExOSAwCisgdGltZXIgdDMxNDEgMAorIGJ0cyAwCisgIHR5cGUgbmFub2J0cworICBiYW5kIERDUzE4MDAKKyAgY2VsbF9pZGVudGl0eSAwCisgIGxvY2F0aW9uX2FyZWFfY29kZSAxCisgIHRyYWluaW5nX3NlcXVlbmNlX2NvZGUgNworICBiYXNlX3N0YXRpb25faWRfY29kZSA2MworICBtcyBtYXggcG93ZXIgMTUKKyAgY2VsbCByZXNlbGVjdGlvbiBoeXN0ZXJlc2lzIDQKKyAgcnhsZXYgYWNjZXNzIG1pbiAwCisgIGNoYW5uZWwgYWxsb2NhdG9yIGFzY2VuZGluZworICByYWNoIHR4IGludGVnZXIgOQorICByYWNoIG1heCB0cmFuc21pc3Npb24gNworICBpcC5hY2Nlc3MgdW5pdF9pZCAxODAwIDAKKyAgb21sIGlwLmFjY2VzcyBzdHJlYW1faWQgMjU1CisgIGdwcnMgbW9kZSBub25lCisgIHRyeCAwCisgICByZl9sb2NrZWQgMAorICAgYXJmY24gODcxCisgICBub21pbmFsIHBvd2VyIDIzCisgICBtYXhfcG93ZXJfcmVkIDAKKyAgIHJzbCBlMSB0ZWkgMAorICAgIHRpbWVzbG90IDAKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBDQ0NIK1NEQ0NINAorICAgIHRpbWVzbG90IDEKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBTRENDSDgKKyAgICB0aW1lc2xvdCAyCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICB0aW1lc2xvdCAzCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICB0aW1lc2xvdCA0CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICB0aW1lc2xvdCA1CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICB0aW1lc2xvdCA2CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICB0aW1lc2xvdCA3CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgdHJ4IDEKKyAgIHJmX2xvY2tlZCAwCisgICBhcmZjbiA4NzMKKyAgIG5vbWluYWwgcG93ZXIgMjMKKyAgIG1heF9wb3dlcl9yZWQgMAorICAgcnNsIGUxIHRlaSAwCisgICAgdGltZXNsb3QgMAorICAgICBwaHlzX2NoYW5fY29uZmlnIFNEQ0NIOAorICAgIHRpbWVzbG90IDEKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDIKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDMKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDQKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDUKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDYKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDcKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvcGFnaW5nLmMgYi9vcGVuYnNjL3NyYy9wYWdpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmVkOTAzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvcGFnaW5nLmMKQEAgLTAsMCArMSwzMjkgQEAKKy8qIFBhZ2luZyBoZWxwZXIgYW5kIG1hbmFnZXIuLi4uICovCisvKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworLyoKKyAqIFJlbGV2YW50IHNwZWNzOgorICogICAgIDEyLjIxOgorICogICAgICAgLSA5LjQuMTIgZm9yIENDQ0ggTG9jYWwgVGhyZXNob2xkCisgKgorICogICAgIDA1LjU4OgorICogICAgICAgLSA4LjUuMiBDQ0NIIExvYWQgaW5kaWNhdGlvbgorICogICAgICAgLSA5LjMuMTUgUGFnaW5nIExvYWQKKyAqCisgKiBBcHByb2FjaDoKKyAqICAgICAgIC0gU2VuZCBwYWdpbmcgY29tbWFuZCB0byBzdWJzY3JpYmVyCisgKiAgICAgICAtIE9uIENoYW5uZWwgUmVxdWVzdCB3ZSB3aWxsIHJlbWVtYmVyIHRoZSByZWFzb24KKyAqICAgICAgIC0gQWZ0ZXIgdGhlIEFDSyB3ZSB3aWxsIHJlcXVlc3QgdGhlIGlkZW50aXR5CisgKgkgLSBUaGVuIHdlIHdpbGwgc2VuZCBhc3NpZ24gdGhlIGdzbV9zdWJzY3JpYmVyIGFuZAorICoJIC0gYW5kIGNhbGwgYSBjYWxsYmFjaworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9wYWdpbmcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvY2hhbl9hbGxvYy5oPgorCit2b2lkICp0YWxsX3BhZ2luZ19jdHg7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2FsY3VsYXRlX2dyb3VwKHN0cnVjdCBnc21fYnRzICpidHMsIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWludCBjY2NoX2NvbmY7CisJaW50IGJzX2NjX2NoYW5zOworCWludCBibG9ja3M7CisJdW5zaWduZWQgaW50IGdyb3VwOworCQorCWNjY2hfY29uZiA9IGJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5jY2NoX2NvbmY7CisJYnNfY2NfY2hhbnMgPSByc2xfY2NjaF9jb25mX3RvX2JzX2NjX2NoYW5zKGNjY2hfY29uZik7CisJLyogY29kZSB3b3JkICsgMiwgYXMgMiBjaGFubmVscyBlcXVhbHMgMHgwICovCisJYmxvY2tzID0gcnNsX251bWJlcl9vZl9wYWdpbmdfc3ViY2hhbm5lbHMoYnRzKTsKKwlncm91cCA9IGdldF9wYWdpbmdfZ3JvdXAoc3RyX3RvX2ltc2koc3Vic2NyLT5pbXNpKSwKKwkJCQkJYnNfY2NfY2hhbnMsIGJsb2Nrcyk7CisJcmV0dXJuIGdyb3VwOworfQorCisvKgorICogS2lsbCBvbmUgcGFnaW5nIHJlcXVlc3QgdXBkYXRlIHRoZSBpbnRlcm5hbCBsaXN0Li4uCisgKi8KK3N0YXRpYyB2b2lkIHBhZ2luZ19yZW1vdmVfcmVxdWVzdChzdHJ1Y3QgZ3NtX2J0c19wYWdpbmdfc3RhdGUgKnBhZ2luZ19idHMsCisJCQkJc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqdG9fYmVfZGVsZXRlZCkKK3sKKwlic2NfZGVsX3RpbWVyKCZ0b19iZV9kZWxldGVkLT5UMzExMyk7CisJbGxpc3RfZGVsKCZ0b19iZV9kZWxldGVkLT5lbnRyeSk7CisJc3Vic2NyX3B1dCh0b19iZV9kZWxldGVkLT5zdWJzY3IpOworCXRhbGxvY19mcmVlKHRvX2JlX2RlbGV0ZWQpOworfQorCitzdGF0aWMgdm9pZCBwYWdlX21zKHN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKnJlcXVlc3QpCit7CisJdV9pbnQ4X3QgbWlbMTI4XTsKKwl1bnNpZ25lZCBpbnQgbWlfbGVuOworCXVuc2lnbmVkIGludCBwYWdlX2dyb3VwOworCisJTE9HUChEUEFHLCBMT0dMX0lORk8sICJHb2luZyB0byBzZW5kIHBhZ2luZyBjb21tYW5kczogaW1zaTogJyVzJyB0bXNpOiAnMHgleCdcbiIsCisJCXJlcXVlc3QtPnN1YnNjci0+aW1zaSwgcmVxdWVzdC0+c3Vic2NyLT50bXNpKTsKKworCWlmIChyZXF1ZXN0LT5zdWJzY3ItPnRtc2kgPT0gR1NNX1JFU0VSVkVEX1RNU0kpCisJCW1pX2xlbiA9IGdzbTQ4X2dlbmVyYXRlX21pZF9mcm9tX2ltc2kobWksIHJlcXVlc3QtPnN1YnNjci0+aW1zaSk7CisJZWxzZQorCQltaV9sZW4gPSBnc200OF9nZW5lcmF0ZV9taWRfZnJvbV90bXNpKG1pLCByZXF1ZXN0LT5zdWJzY3ItPnRtc2kpOworCisJcGFnZV9ncm91cCA9IGNhbGN1bGF0ZV9ncm91cChyZXF1ZXN0LT5idHMsIHJlcXVlc3QtPnN1YnNjcik7CisJcnNsX3BhZ2luZ19jbWQocmVxdWVzdC0+YnRzLCBwYWdlX2dyb3VwLCBtaV9sZW4sIG1pLAorCQkJcmVxdWVzdC0+Y2hhbl90eXBlKTsKK30KKworLyoKKyAqIFRoaXMgaXMga2lja2VkIGJ5IHRoZSBwZXJpb2RpYyBQQUdJTkcgTE9BRCBJbmRpY2F0b3IKKyAqIGNvbWluZyBmcm9tIGFiaXNfcnNsLmMKKyAqCisgKiBXZSBhdHRlbXB0IHRvIGl0ZXJhdGUgb25jZSBvdmVyIHRoZSBsaXN0IG9mIGl0ZW1zIGJ1dAorICogb25seSB1cHRvIGF2YWlsYWJsZV9zbG90cy4KKyAqLworc3RhdGljIHZvaWQgcGFnaW5nX2hhbmRsZV9wZW5kaW5nX3JlcXVlc3RzKHN0cnVjdCBnc21fYnRzX3BhZ2luZ19zdGF0ZSAqcGFnaW5nX2J0cykKK3sKKwlzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICppbml0aWFsX3JlcXVlc3QgPSBOVUxMOworCXN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKmN1cnJlbnRfcmVxdWVzdCA9IE5VTEw7CisKKwkvKgorCSAqIERldGVybWluZSBpZiB0aGUgcGVuZGluZ19yZXF1ZXN0cyBsaXN0IGlzIGVtcHR5IGFuZAorCSAqIHJldHVybiB0aGVuLgorCSAqLworCWlmIChsbGlzdF9lbXB0eSgmcGFnaW5nX2J0cy0+cGVuZGluZ19yZXF1ZXN0cykpIHsKKwkJLyogc2luY2UgdGhlIGxpc3QgaXMgZW1wdHksIG5vIG5lZWQgdG8gcmVzY2hlZHVsZSB0aGUgdGltZXIgKi8KKwkJcmV0dXJuOworCX0KKworCS8qCisJICogSW4gY2FzZSB0aGUgQlRTIGRvZXMgbm90IHByb3ZpZGUgdXMgd2l0aCBsb2FkIGluZGljYXRpb24ganVzdCBmaWxsCisJICogdXAgb3VyIHNsb3RzIGZvciB0aGlzIHJvdW5kLiBXZSBzaG91bGQgYmUgYWJsZSB0byBwYWdlIDIwIHN1YnNjcmliZXJzCisJICogZXZlcnkgdHdvIHNlY29uZHMuIFNvIHdlIHdpbGwganVzdCBnaXZlIHRoZSBCVFMgc29tZSBleHRyYSBjcmVkaXQuCisJICogV2Ugd2lsbCBoYXZlIHRvIHNlZSBob3cgb2Z0ZW4gd2UgcnVuIG91dCBvZiB0aGlzIGNyZWRpdCwgc28gd2UgbWlnaHQKKwkgKiBuZWVkIGEgbG93IHdhdGVybWFyayBhbmQgdGhlbiBhZGQgY3JlZGl0IG9yIGdpdmUgMjAgZXZlcnkgcnVuIHdoZW4KKwkgKiB0aGUgYnRzIHNldHMgYW4gb3B0aW9uIGZvciB0aGF0LgorCSAqLworCWlmIChwYWdpbmdfYnRzLT5hdmFpbGFibGVfc2xvdHMgPT0gMCkgeworCQlMT0dQKERQQUcsIExPR0xfTk9USUNFLCAiTm8gc2xvdHMgYXZhaWxhYmxlIG9uIGJ0cyBuciAlZFxuIiwKKwkJICAgICBwYWdpbmdfYnRzLT5idHMtPm5yKTsKKwkJcGFnaW5nX2J0cy0+YXZhaWxhYmxlX3Nsb3RzID0gMjA7CisJfQorCisJaW5pdGlhbF9yZXF1ZXN0ID0gbGxpc3RfZW50cnkocGFnaW5nX2J0cy0+cGVuZGluZ19yZXF1ZXN0cy5uZXh0LAorCQkJCSAgICAgIHN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QsIGVudHJ5KTsKKwljdXJyZW50X3JlcXVlc3QgPSBpbml0aWFsX3JlcXVlc3Q7CisKKwlkbyB7CisJCS8qIGhhbmRsZSB0aGUgcGFnaW5nIHJlcXVlc3Qgbm93ICovCisJCXBhZ2VfbXMoY3VycmVudF9yZXF1ZXN0KTsKKwkJcGFnaW5nX2J0cy0+YXZhaWxhYmxlX3Nsb3RzLS07CisKKwkJLyogdGFrZSB0aGUgY3VycmVudCBhbmQgYWRkIGl0IHRvIHRoZSBiYWNrICovCisJCWxsaXN0X2RlbCgmY3VycmVudF9yZXF1ZXN0LT5lbnRyeSk7CisJCWxsaXN0X2FkZF90YWlsKCZjdXJyZW50X3JlcXVlc3QtPmVudHJ5LCAmcGFnaW5nX2J0cy0+cGVuZGluZ19yZXF1ZXN0cyk7CisKKwkJLyogdGFrZSB0aGUgbmV4dCByZXF1ZXN0ICovCisJCWN1cnJlbnRfcmVxdWVzdCA9IGxsaXN0X2VudHJ5KHBhZ2luZ19idHMtPnBlbmRpbmdfcmVxdWVzdHMubmV4dCwKKwkJCQkJICAgICAgc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCwgZW50cnkpOworCX0gd2hpbGUgKHBhZ2luZ19idHMtPmF2YWlsYWJsZV9zbG90cyA+IDAKKwkJICAgICYmICBpbml0aWFsX3JlcXVlc3QgIT0gY3VycmVudF9yZXF1ZXN0KTsKKworCWJzY19zY2hlZHVsZV90aW1lcigmcGFnaW5nX2J0cy0+d29ya190aW1lciwgMiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHBhZ2luZ193b3JrZXIodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX2J0c19wYWdpbmdfc3RhdGUgKnBhZ2luZ19idHMgPSBkYXRhOworCisJcGFnaW5nX2hhbmRsZV9wZW5kaW5nX3JlcXVlc3RzKHBhZ2luZ19idHMpOworfQorCit2b2lkIHBhZ2luZ19pbml0KHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJYnRzLT5wYWdpbmcuYnRzID0gYnRzOworCUlOSVRfTExJU1RfSEVBRCgmYnRzLT5wYWdpbmcucGVuZGluZ19yZXF1ZXN0cyk7CisJYnRzLT5wYWdpbmcud29ya190aW1lci5jYiA9IHBhZ2luZ193b3JrZXI7CisJYnRzLT5wYWdpbmcud29ya190aW1lci5kYXRhID0gJmJ0cy0+cGFnaW5nOworCisJLyogTGFyZ2UgbnVtYmVyLCB1bnRpbCB3ZSBnZXQgYSBwcm9wZXIgbWVzc2FnZSAqLworCWJ0cy0+cGFnaW5nLmF2YWlsYWJsZV9zbG90cyA9IDIwOworfQorCitzdGF0aWMgaW50IHBhZ2luZ19wZW5kaW5nX3JlcXVlc3Qoc3RydWN0IGdzbV9idHNfcGFnaW5nX3N0YXRlICpidHMsCisJCQkJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpIHsKKwlzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICpyZXE7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShyZXEsICZidHMtPnBlbmRpbmdfcmVxdWVzdHMsIGVudHJ5KSB7CisJCWlmIChzdWJzY3IgPT0gcmVxLT5zdWJzY3IpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsJCit9CisKK3N0YXRpYyB2b2lkIHBhZ2luZ19UMzExM19leHBpcmVkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqcmVxID0gKHN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKilkYXRhOworCXN0cnVjdCBwYWdpbmdfc2lnbmFsX2RhdGEgc2lnX2RhdGE7CisJdm9pZCAqY2Jmbl9wYXJhbTsKKwlnc21fY2JmbiAqY2JmbjsKKworCUxPR1AoRFBBRywgTE9HTF9JTkZPLCAiVDMxMTMgZXhwaXJlZCBmb3IgcmVxdWVzdCAlcCAoJXMpXG4iLAorCQlyZXEsIHJlcS0+c3Vic2NyLT5pbXNpKTsKKwkKKwlzaWdfZGF0YS5zdWJzY3IgPSByZXEtPnN1YnNjcjsKKwlzaWdfZGF0YS5idHMJPSByZXEtPmJ0czsKKwlzaWdfZGF0YS5sY2hhbgk9IE5VTEw7CisKKwkvKiBtdXN0IGJlIGRlc3Ryb3llZCBiZWZvcmUgY2FsbGluZyBjYmZuLCB0byBwcmV2ZW50IGRvdWJsZSBmcmVlICovCisJY291bnRlcl9pbmMocmVxLT5idHMtPm5ldHdvcmstPnN0YXRzLnBhZ2luZy5leHBpcmVkKTsKKwljYmZuX3BhcmFtID0gcmVxLT5jYmZuX3BhcmFtOworCWNiZm4gPSByZXEtPmNiZm47CisJcGFnaW5nX3JlbW92ZV9yZXF1ZXN0KCZyZXEtPmJ0cy0+cGFnaW5nLCByZXEpOworCisKKwlkaXNwYXRjaF9zaWduYWwoU1NfUEFHSU5HLCBTX1BBR0lOR19FWFBJUkVELCAmc2lnX2RhdGEpOworCWlmIChjYmZuKQorCQljYmZuKEdTTV9IT09LX1JSX1BBR0lORywgR1NNX1BBR0lOR19FWFBJUkVELCBOVUxMLCBOVUxMLAorCQkJICBjYmZuX3BhcmFtKTsKK30KKworc3RhdGljIGludCBfcGFnaW5nX3JlcXVlc3Qoc3RydWN0IGdzbV9idHMgKmJ0cywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkgICAgaW50IHR5cGUsIGdzbV9jYmZuICpjYmZuLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBnc21fYnRzX3BhZ2luZ19zdGF0ZSAqYnRzX2VudHJ5ID0gJmJ0cy0+cGFnaW5nOworCXN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKnJlcTsKKworCWlmIChwYWdpbmdfcGVuZGluZ19yZXF1ZXN0KGJ0c19lbnRyeSwgc3Vic2NyKSkgeworCQlMT0dQKERQQUcsIExPR0xfSU5GTywgIlBhZ2luZyByZXF1ZXN0IGFscmVhZHkgcGVuZGluZyBmb3IgJXNcbiIsIHN1YnNjci0+aW1zaSk7CisJCXJldHVybiAtRUVYSVNUOworCX0KKworCUxPR1AoRFBBRywgTE9HTF9ERUJVRywgIlN0YXJ0IHBhZ2luZyBvZiBzdWJzY3JpYmVyICVsbHUgb24gYnRzICVkLlxuIiwKKwkJc3Vic2NyLT5pZCwgYnRzLT5ucik7CisJcmVxID0gdGFsbG9jX3plcm8odGFsbF9wYWdpbmdfY3R4LCBzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0KTsKKwlyZXEtPnN1YnNjciA9IHN1YnNjcl9nZXQoc3Vic2NyKTsKKwlyZXEtPmJ0cyA9IGJ0czsKKwlyZXEtPmNoYW5fdHlwZSA9IHR5cGU7CisJcmVxLT5jYmZuID0gY2JmbjsKKwlyZXEtPmNiZm5fcGFyYW0gPSBkYXRhOworCXJlcS0+VDMxMTMuY2IgPSBwYWdpbmdfVDMxMTNfZXhwaXJlZDsKKwlyZXEtPlQzMTEzLmRhdGEgPSByZXE7CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZyZXEtPlQzMTEzLCBidHMtPm5ldHdvcmstPlQzMTEzLCAwKTsKKwlsbGlzdF9hZGRfdGFpbCgmcmVxLT5lbnRyeSwgJmJ0c19lbnRyeS0+cGVuZGluZ19yZXF1ZXN0cyk7CisKKwlpZiAoIWJzY190aW1lcl9wZW5kaW5nKCZidHNfZW50cnktPndvcmtfdGltZXIpKQorCQlic2Nfc2NoZWR1bGVfdGltZXIoJmJ0c19lbnRyeS0+d29ya190aW1lciwgMiwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHBhZ2luZ19yZXF1ZXN0KHN0cnVjdCBnc21fbmV0d29yayAqbmV0d29yaywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCSAgIGludCB0eXBlLCBnc21fY2JmbiAqY2Jmbiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gTlVMTDsKKwlpbnQgbnVtX3BhZ2VzID0gMDsKKworCWNvdW50ZXJfaW5jKG5ldHdvcmstPnN0YXRzLnBhZ2luZy5hdHRlbXB0ZWQpOworCisJLyogc3RhcnQgcGFnaW5nIHN1YnNjcmliZXIgb24gYWxsIEJUUyB3aXRoaW4gTG9jYXRpb24gQXJlYSAqLworCWRvIHsKKwkJaW50IHJjOworCisJCWJ0cyA9IGdzbV9idHNfYnlfbGFjKG5ldHdvcmssIHN1YnNjci0+bGFjLCBidHMpOworCQlpZiAoIWJ0cykKKwkJCWJyZWFrOworCisJCS8qIHNraXAgYWxsIGN1cnJlbnRseSBpbmFjdGl2ZSBUUlggKi8KKwkJaWYgKCF0cnhfaXNfdXNhYmxlKGJ0cy0+YzApKQorCQkJY29udGludWU7CisKKwkJbnVtX3BhZ2VzKys7CisKKwkJLyogVHJpZ2dlciBwYWdpbmcsIHBhc3MgYW55IGVycm9yIHRvIGNhbGxlciAqLworCQlyYyA9IF9wYWdpbmdfcmVxdWVzdChidHMsIHN1YnNjciwgdHlwZSwgY2JmbiwgZGF0YSk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJfSB3aGlsZSAoMSk7CisKKwlpZiAobnVtX3BhZ2VzID09IDApCisJCWNvdW50ZXJfaW5jKG5ldHdvcmstPnN0YXRzLnBhZ2luZy5kZXRhY2hlZCk7CisKKwlyZXR1cm4gbnVtX3BhZ2VzOworfQorCisKKy8qIHdlIGNvbnNjaW91c2x5IGlnbm9yZSB0aGUgdHlwZSBvZiB0aGUgcmVxdWVzdCBoZXJlICovCitzdGF0aWMgdm9pZCBfcGFnaW5nX3JlcXVlc3Rfc3RvcChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKwkJCQkgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IGdzbV9idHNfcGFnaW5nX3N0YXRlICpidHNfZW50cnkgPSAmYnRzLT5wYWdpbmc7CisJc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqcmVxLCAqcmVxMjsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVxLCByZXEyLCAmYnRzX2VudHJ5LT5wZW5kaW5nX3JlcXVlc3RzLAorCQkJCSBlbnRyeSkgeworCQlpZiAocmVxLT5zdWJzY3IgPT0gc3Vic2NyKSB7CisJCQlpZiAobGNoYW4gJiYgcmVxLT5jYmZuKSB7CisJCQkJTE9HUChEUEFHLCBMT0dMX0RFQlVHLCAiU3RvcCBwYWdpbmcgb24gYnRzICVkLCBjYWxsaW5nIGNiZm4uXG4iLCBidHMtPm5yKTsKKwkJCQlyZXEtPmNiZm4oR1NNX0hPT0tfUlJfUEFHSU5HLCBHU01fUEFHSU5HX1NVQ0NFRURFRCwKKwkJCQkJICBOVUxMLCBsY2hhbiwgcmVxLT5jYmZuX3BhcmFtKTsKKwkJCX0gZWxzZQorCQkJCUxPR1AoRFBBRywgTE9HTF9ERUJVRywgIlN0b3AgcGFnaW5nIG9uIGJ0cyAlZCBzaWxlbnRseS5cbiIsIGJ0cy0+bnIpOworCQkJcGFnaW5nX3JlbW92ZV9yZXF1ZXN0KCZidHMtPnBhZ2luZywgcmVxKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKiBTdG9wIHBhZ2luZyBvbiBhbGwgb3RoZXIgYnRzJyAqLwordm9pZCBwYWdpbmdfcmVxdWVzdF9zdG9wKHN0cnVjdCBnc21fYnRzICpfYnRzLCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKwkJCSBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gTlVMTDsKKworCWlmIChfYnRzKQorCQlfcGFnaW5nX3JlcXVlc3Rfc3RvcChfYnRzLCBzdWJzY3IsIGxjaGFuKTsKKworCWRvIHsKKwkJLyoKKwkJICogRklYTUU6IERvbid0IHVzZSB0aGUgbGFjIG9mIHRoZSBzdWJzY3JpYmVyLi4uCisJCSAqIGFzIGl0IG1pZ2h0IGhhdmUgbWFnaWNhbGx5IGNoYW5nZWQgdGhlIGxhYy4uIHVzZSB0aGUKKwkJICogbG9jYXRpb24gYXJlYSBvZiB0aGUgX2J0cyBhcyByZWNvbmZpZ3VyYXRpb24gb2YgdGhlCisJCSAqIG5ldHdvcmsgaXMgcHJvYmFibHkgaGFwcGVuaW5nIGxlc3Mgb2Z0ZW4uCisJCSAqLworCQlidHMgPSBnc21fYnRzX2J5X2xhYyhzdWJzY3ItPm5ldCwgc3Vic2NyLT5sYWMsIGJ0cyk7CisJCWlmICghYnRzKQorCQkJYnJlYWs7CisKKwkJLyogU3RvcCBwYWdpbmcgKi8KKwkJaWYgKGJ0cyAhPSBfYnRzKQorCQkJX3BhZ2luZ19yZXF1ZXN0X3N0b3AoYnRzLCBzdWJzY3IsIE5VTEwpOworCX0gd2hpbGUgKDEpOworfQorCit2b2lkIHBhZ2luZ191cGRhdGVfYnVmZmVyX3NwYWNlKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50MTZfdCBmcmVlX3Nsb3RzKQoreworCWJ0cy0+cGFnaW5nLmF2YWlsYWJsZV9zbG90cyA9IGZyZWVfc2xvdHM7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9yZXN0X29jdGV0cy5jIGIvb3BlbmJzYy9zcmMvcmVzdF9vY3RldHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzlkMmM4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvcmVzdF9vY3RldHMuYwpAQCAtMCwwICsxLDQyNSBAQAorLyogR1NNIE1vYmlsZSBSYWRpbyBJbnRlcmZhY2UgTGF5ZXIgMyBtZXNzYWdlcyBvbiB0aGUgQS1iaXMgaW50ZXJmYWNlLAorICogcmVzdCBvY3RldCBoYW5kbGluZyBhY2NvcmRpbmcgdG8KKyAqIDNHUFAgVFMgMDQuMDggdmVyc2lvbiA3LjIxLjAgUmVsZWFzZSAxOTk4IC8gRVRTSSBUUyAxMDAgOTQwIFY3LjIxLjAgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvYml0dmVjLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9yZXN0X29jdGV0cy5oPgorCisvKiBnZW5lcmF0ZSBTSTEgcmVzdCBvY3RldHMgKi8KK2ludCByZXN0X29jdGV0c19zaTEodV9pbnQ4X3QgKmRhdGEsIHVfaW50OF90ICpuY2hfcG9zKQoreworCXN0cnVjdCBiaXR2ZWMgYnY7CisKKwltZW1zZXQoJmJ2LCAwLCBzaXplb2YoYnYpKTsKKwlidi5kYXRhID0gZGF0YTsKKwlidi5kYXRhX2xlbiA9IDE7CisKKwlpZiAobmNoX3BvcykgeworCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEgpOworCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCAqbmNoX3BvcywgNSk7CisJfSBlbHNlCisJCWJpdHZlY19zZXRfYml0KCZidiwgTCk7CisKKwliaXR2ZWNfc3BhcmVfcGFkZGluZygmYnYsIDcpOworCXJldHVybiBidi5kYXRhX2xlbjsKK30KKworLyogQXBwZW5kIHNlbGVjdGlvbiBwYXJhbWV0ZXJzIHRvIGJpdHZlYyAqLworc3RhdGljIHZvaWQgYXBwZW5kX3NlbGVjdGlvbl9wYXJhbXMoc3RydWN0IGJpdHZlYyAqYnYsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBnc200OF9zaV9zZWxlY3Rpb25fcGFyYW1zICpzcCkKK3sKKwlpZiAoc3AtPnByZXNlbnQpIHsKKwkJYml0dmVjX3NldF9iaXQoYnYsIEgpOworCQliaXR2ZWNfc2V0X2JpdChidiwgc3AtPmNicSk7CisJCWJpdHZlY19zZXRfdWludChidiwgc3AtPmNlbGxfcmVzZWxfb2ZmLCA2KTsKKwkJYml0dmVjX3NldF91aW50KGJ2LCBzcC0+dGVtcF9vZmZzLCAzKTsKKwkJYml0dmVjX3NldF91aW50KGJ2LCBzcC0+cGVuYWx0eV90aW1lLCA1KTsKKwl9IGVsc2UKKwkJYml0dmVjX3NldF9iaXQoYnYsIEwpOworfQorCisvKiBBcHBlbmQgcG93ZXIgb2Zmc2V0IHRvIGJpdHZlYyAqLworc3RhdGljIHZvaWQgYXBwZW5kX3Bvd2VyX29mZnNldChzdHJ1Y3QgYml0dmVjICpidiwKKwkJCQljb25zdCBzdHJ1Y3QgZ3NtNDhfc2lfcG93ZXJfb2Zmc2V0ICpwbykKK3sKKwlpZiAocG8tPnByZXNlbnQpIHsKKwkJYml0dmVjX3NldF9iaXQoYnYsIEgpOworCQliaXR2ZWNfc2V0X3VpbnQoYnYsIHBvLT5wb3dlcl9vZmZzZXQsIDIpOworCX0gZWxzZQorCQliaXR2ZWNfc2V0X2JpdChidiwgTCk7Cit9CisKKy8qIEFwcGVuZCBHUFJTIGluZGljYXRvciB0byBiaXR2ZWMgKi8KK3N0YXRpYyB2b2lkIGFwcGVuZF9ncHJzX2luZChzdHJ1Y3QgYml0dmVjICpidiwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgZ3NtNDhfc2kzX2dwcnNfaW5kICpnaSkKK3sKKwlpZiAoZ2ktPnByZXNlbnQpIHsKKwkJYml0dmVjX3NldF9iaXQoYnYsIEgpOworCQliaXR2ZWNfc2V0X3VpbnQoYnYsIGdpLT5yYV9jb2xvdXIsIDMpOworCQkvKiAwID09IFNJMTMgaW4gQkNDSCBOb3JtLCAxID09IFNJMTMgc2VudCBvbiBCQ0NIIEV4dCAqLworCQliaXR2ZWNfc2V0X2JpdChidiwgZ2ktPnNpMTNfcG9zaXRpb24pOworCX0gZWxzZQorCQliaXR2ZWNfc2V0X2JpdChidiwgTCk7Cit9CisKKworLyogR2VuZXJhdGUgU0kzIFJlc3QgT2N0ZXN0cyAoQ2hhcHRlciAxMC41LjIuMzQgLyBUYWJsZSAxMC40LjcyKSAqLworaW50IHJlc3Rfb2N0ZXRzX3NpMyh1X2ludDhfdCAqZGF0YSwgY29uc3Qgc3RydWN0IGdzbTQ4X3NpX3JvX2luZm8gKnNpMykKK3sKKwlzdHJ1Y3QgYml0dmVjIGJ2OworCisJbWVtc2V0KCZidiwgMCwgc2l6ZW9mKGJ2KSk7CisJYnYuZGF0YSA9IGRhdGE7CisJYnYuZGF0YV9sZW4gPSA0OworCisJLyogT3B0aW9uYWwgU2VsZWN0aW9uIFBhcmFtZXRlcnMgKi8KKwlhcHBlbmRfc2VsZWN0aW9uX3BhcmFtcygmYnYsICZzaTMtPnNlbGVjdGlvbl9wYXJhbXMpOworCisJLyogT3B0aW9uYWwgUG93ZXIgT2Zmc2V0ICovCisJYXBwZW5kX3Bvd2VyX29mZnNldCgmYnYsICZzaTMtPnBvd2VyX29mZnNldCk7CisKKwkvKiBEbyB3ZSBoYXZlIGEgU0kydGVyIG9uIHRoZSBCQ0NIPyAqLworCWlmIChzaTMtPnNpMnRlcl9pbmRpY2F0b3IpCisJCWJpdHZlY19zZXRfYml0KCZidiwgSCk7CisJZWxzZQorCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEwpOworCisJLyogRWFybHkgQ2xhc3NtYXJrIFNlbmRpbmcgQ29udHJvbCAqLworCWlmIChzaTMtPmVhcmx5X2NtX2N0cmwpCisJCWJpdHZlY19zZXRfYml0KCZidiwgSCk7CisJZWxzZQorCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEwpOworCisJLyogRG8gd2UgaGF2ZSBhIFNJIFR5cGUgOSBvbiB0aGUgQkNDSD8gKi8KKwlpZiAoc2kzLT5zY2hlZHVsaW5nLnByZXNlbnQpIHsKKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBIKTsKKwkJYml0dmVjX3NldF91aW50KCZidiwgc2kzLT5zY2hlZHVsaW5nLndoZXJlLCAzKTsKKwl9IGVsc2UKKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBMKTsKKworCS8qIEdQUlMgSW5kaWNhdG9yICovCisJYXBwZW5kX2dwcnNfaW5kKCZidiwgJnNpMy0+Z3Byc19pbmQpOworCisJYml0dmVjX3NwYXJlX3BhZGRpbmcoJmJ2LCAoYnYuZGF0YV9sZW4qOCktMSk7CisJcmV0dXJuIGJ2LmRhdGFfbGVuOworfQorCitzdGF0aWMgaW50IGFwcGVuZF9sc2FfcGFyYW1zKHN0cnVjdCBiaXR2ZWMgKmJ2LAorCQkJICAgICBjb25zdCBzdHJ1Y3QgZ3NtNDhfbHNhX3BhcmFtcyAqbHNhX3BhcmFtcykKK3sKKwkvKiBGSVhNRSAqLworCXJldHVybiAtMTsKK30KKworLyogR2VuZXJhdGUgU0k0IFJlc3QgT2N0ZXRzIChDaGFwdGVyIDEwLjUuMi4zNSkgKi8KK2ludCByZXN0X29jdGV0c19zaTQodV9pbnQ4X3QgKmRhdGEsIGNvbnN0IHN0cnVjdCBnc200OF9zaV9yb19pbmZvICpzaTQpCit7CisJc3RydWN0IGJpdHZlYyBidjsKKworCW1lbXNldCgmYnYsIDAsIHNpemVvZihidikpOworCWJ2LmRhdGEgPSBkYXRhOworCWJ2LmRhdGFfbGVuID0gMTA7IC8qIEZJWE1FOiB1cCB0byA/ICovCisKKwkvKiBTSTQgUmVzdCBPY3RldHMgTyAqLworCWFwcGVuZF9zZWxlY3Rpb25fcGFyYW1zKCZidiwgJnNpNC0+c2VsZWN0aW9uX3BhcmFtcyk7CisJYXBwZW5kX3Bvd2VyX29mZnNldCgmYnYsICZzaTQtPnBvd2VyX29mZnNldCk7CisJYXBwZW5kX2dwcnNfaW5kKCZidiwgJnNpNC0+Z3Byc19pbmQpOworCisJaWYgKDAgLyogRklYTUUgKi8pIHsKKwkJLyogSCBhbmQgU0k0IFJlc3QgT2N0ZXRzIFMgKi8KKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBIKTsKKworCQkvKiBMU0EgUGFyYW1ldGVycyAqLworCQlpZiAoc2k0LT5sc2FfcGFyYW1zLnByZXNlbnQpIHsKKwkJCWJpdHZlY19zZXRfYml0KCZidiwgSCk7CisJCQlhcHBlbmRfbHNhX3BhcmFtcygmYnYsICZzaTQtPmxzYV9wYXJhbXMpOworCQl9IGVsc2UKKwkJCWJpdHZlY19zZXRfYml0KCZidiwgTCk7CisKKwkJLyogQ2VsbCBJZGVudGl0eSAqLworCQlpZiAoMSkgeworCQkJYml0dmVjX3NldF9iaXQoJmJ2LCBIKTsKKwkJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpNC0+Y2VsbF9pZCwgMTYpOworCQl9IGVsc2UKKwkJCWJpdHZlY19zZXRfYml0KCZidiwgTCk7CisKKwkJLyogTFNBIElEIEluZm9ybWF0aW9uICovCisJCWlmICgwKSB7CisJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEgpOworCQkJLyogRklYTUUgKi8KKwkJfSBlbHNlCisJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEwpOworCX0gZWxzZSB7CisJCS8qIEwgYW5kIGJyZWFrIGluZGljYXRvciAqLworCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEwpOworCQliaXR2ZWNfc2V0X2JpdCgmYnYsIHNpNC0+YnJlYWtfaW5kID8gSCA6IEwpOworCX0KKworCXJldHVybiBidi5kYXRhX2xlbjsKK30KKworLyogR1BSUyBNb2JpbGUgQWxsb2NhdGlvbiBhcyBwZXIgVFMgMDQuNjAgQ2hhcHRlciAxMi4xMGE6CisgICA8IEdQUlMgTW9iaWxlIEFsbG9jYXRpb24gSUUgPiA6Oj0KKyAgICAgPCBIU04gOiBiaXQgKDYpID4KKyAgICAgeyAwIHwgMSA8IFJGTCBudW1iZXIgbGlzdCA6IDwgUkZMIG51bWJlciBsaXN0IHN0cnVjdCA+ID4gfQorICAgICB7IDAgPCBNQV9MRU5HVEggOiBiaXQgKDYpID4KKyAgICAgICAgIDwgTUFfQklUTUFQOiBiaXQgKHZhbChNQV9MRU5HVEgpICsgMSkgPgorICAgICB8IDEgeyAwIHwgMSA8QVJGQ04gaW5kZXggbGlzdCA6IDwgQVJGQ04gaW5kZXggbGlzdCBzdHJ1Y3QgPiA+IH0gfSA7CisKKyAgICAgPCBSRkwgbnVtYmVyIGxpc3Qgc3RydWN0ID4gOjogPQorICAgICAgIDwgUkZMX05VTUJFUiA6IGJpdCAoNCkgPgorICAgICAgIHsgMCB8IDEgPCBSRkwgbnVtYmVyIGxpc3Qgc3RydWN0ID4gfSA7CisgICAgIDwgQVJGQ04gaW5kZXggbGlzdCBzdHJ1Y3QgPiA6Oj0KKyAgICAgICA8IEFSRkNOX0lOREVYIDogYml0KDYpID4KKyAgICAgICB7IDAgfCAxIDwgQVJGQ04gaW5kZXggbGlzdCBzdHJ1Y3QgPiB9IDsKKyAqLworc3RhdGljIGludCBhcHBlbmRfZ3Byc19tb2JpbGVfYWxsb2Moc3RydWN0IGJpdHZlYyAqYnYpCit7CisJLyogSG9wcGluZyBTZXF1ZW5jZSBOdW1iZXIgKi8KKwliaXR2ZWNfc2V0X3VpbnQoYnYsIDAsIDYpOworCisJaWYgKDApIHsKKwkJLyogV2Ugd2FudCB0byB1c2UgYSBSRkwgbnVtYmVyIGxpc3QgKi8KKwkJYml0dmVjX3NldF9iaXQoYnYsIDEpOworCQkvKiBGSVhNRTogUkZMIG51bWJlciBsaXN0ICovCisJfSBlbHNlCisJCWJpdHZlY19zZXRfYml0KGJ2LCAwKTsKKworCWlmICgwKSB7CisJCS8qIFdlIHdhbnQgdG8gdXNlIGEgTUFfQklUTUFQICovCisJCWJpdHZlY19zZXRfYml0KGJ2LCAwKTsKKwkJLyogRklYTUU6IE1BX0xFTkdUSCwgTUFfQklUTUFQLCAuLi4gKi8KKwl9IGVsc2UgeworCQliaXR2ZWNfc2V0X2JpdChidiwgMSk7CisJCWlmICgwKSB7CisJCQkvKiBXZSB3YW50IHRvIHByb3ZpZGUgYW4gQVJGQ04gaW5kZXggbGlzdCAqLworCQkJYml0dmVjX3NldF9iaXQoYnYsIDEpOworCQkJLyogRklYTUUgKi8KKwkJfSBlbHNlCisJCQliaXR2ZWNfc2V0X2JpdChidiwgMCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuY29kZV90MzE5Mih1bnNpZ25lZCBpbnQgdDMxOTIpCit7CisJaWYgKHQzMTkyID09IDApCisJCXJldHVybiAzOworCWVsc2UgaWYgKHQzMTkyIDw9IDgwKQorCQlyZXR1cm4gNDsKKwllbHNlIGlmICh0MzE5MiA8PSAxMjApCisJCXJldHVybiA1OworCWVsc2UgaWYgKHQzMTkyIDw9IDE2MCkKKwkJcmV0dXJuIDY7CisJZWxzZSBpZiAodDMxOTIgPD0gMjAwKQorCQlyZXR1cm4gNzsKKwllbHNlIGlmICh0MzE5MiA8PSA1MDApCisJCXJldHVybiAwOworCWVsc2UgaWYgKHQzMTkyIDw9IDEwMDApCisJCXJldHVybiAxOworCWVsc2UgaWYgKHQzMTkyIDw9IDE1MDApCisJCXJldHVybiAyOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX2RyeF90aW1lcih1bnNpZ25lZCBpbnQgZHJ4KQoreworCWlmIChkcnggPT0gMCkKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAoZHJ4ID09IDEpCisJCXJldHVybiAxOworCWVsc2UgaWYgKGRyeCA9PSAyKQorCQlyZXR1cm4gMjsKKwllbHNlIGlmIChkcnggPD0gNCkKKwkJcmV0dXJuIDM7CisJZWxzZSBpZiAoZHJ4IDw9IDgpCisJCXJldHVybiA0OworCWVsc2UgaWYgKGRyeCA8PSAxNikKKwkJcmV0dXJuIDU7CisJZWxzZSBpZiAoZHJ4IDw9IDMyKQorCQlyZXR1cm4gNjsKKwllbHNlIGlmIChkcnggPD0gNjQpCisJCXJldHVybiA3OworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qIEdQUlMgQ2VsbCBPcHRpb25zIGFzIHBlciBUUyAwNC42MCBDaGFwdGVyIDEyLjI0CisJPCBHUFJTIENlbGwgT3B0aW9ucyBJRSA+IDo6PQorCQk8IE5NTyA6IGJpdCgyKSA+CisJCTwgVDMxNjggOiBiaXQoMykgPgorCQk8IFQzMTkyIDogYml0KDMpID4KKwkJPCBEUlhfVElNRVJfTUFYOiBiaXQoMykgPgorCQk8IEFDQ0VTU19CVVJTVF9UWVBFOiBiaXQgPgorCQk8IENPTlRST0xfQUNLX1RZUEUgOiBiaXQgPgorCQk8IEJTX0NWX01BWDogYml0KDQpID4KKwkJeyAwIHwgMSA8IFBBTl9ERUMgOiBiaXQoMykgPgorCQkJPCBQQU5fSU5DIDogYml0KDMpID4KKwkJCTwgUEFOX01BWCA6IGJpdCgzKSA+CisJCXsgMCB8IDEgPCBFeHRlbnNpb24gTGVuZ3RoIDogYml0KDYpID4KKwkJCTwgYml0ICh2YWwoRXh0ZW5zaW9uIExlbmd0aCkgKyAxCisJCQkmIHsgPCBFeHRlbnNpb24gSW5mb3JtYXRpb24gPiAhIHsgYml0ICoqID0gPG5vIHN0cmluZz4gfSB9IDsKKwk8IEV4dGVuc2lvbiBJbmZvcm1hdGlvbiA+IDo6PQorCQl7IDAgfCAxIDwgRUdQUlNfUEFDS0VUX0NIQU5ORUxfUkVRVUVTVCA6IGJpdCA+CisJCQk8IEJFUF9QRVJJT0QgOiBiaXQoNCkgPiB9CisJCTwgUEZDX0ZFQVRVUkVfTU9ERSA6IGJpdCA+CisJCTwgRFRNX1NVUFBPUlQgOiBiaXQgPgorCQk8QlNTX1BBR0lOR19DT09SRElOQVRJT046IGJpdCA+CisJCTxzcGFyZSBiaXQgPiAqKiA7CisgKi8KK3N0YXRpYyBpbnQgYXBwZW5kX2dwcnNfY2VsbF9vcHQoc3RydWN0IGJpdHZlYyAqYnYsCisJCQkJY29uc3Qgc3RydWN0IGdwcnNfY2VsbF9vcHRpb25zICpnY28pCit7CisJaW50IHQzMTkyLCBkcnhfdGltZXJfbWF4OworCisJdDMxOTIgPSBlbmNvZGVfdDMxOTIoZ2NvLT50MzE5Mik7CisJaWYgKHQzMTkyIDwgMCkKKwkJcmV0dXJuIHQzMTkyOworCisJZHJ4X3RpbWVyX21heCA9IGVuY29kZV9kcnhfdGltZXIoZ2NvLT5kcnhfdGltZXJfbWF4KTsKKwlpZiAoZHJ4X3RpbWVyX21heCA8IDApCisJCXJldHVybiBkcnhfdGltZXJfbWF4OworCisJYml0dmVjX3NldF91aW50KGJ2LCBnY28tPm5tbywgMik7CisJYml0dmVjX3NldF91aW50KGJ2LCBnY28tPnQzMTY4IC8gNTAwLCAzKTsKKwliaXR2ZWNfc2V0X3VpbnQoYnYsIHQzMTkyLCAzKTsKKwliaXR2ZWNfc2V0X3VpbnQoYnYsIGRyeF90aW1lcl9tYXgsIDMpOworCS8qIEFDQ0VTU19CVVJTVF9UWVBFOiBIYXJkLWNvZGUgOGJpdCAqLworCWJpdHZlY19zZXRfYml0KGJ2LCAwKTsKKwkvKiBDT05UUk9MX0FDS19UWVBFOiBIYXJkLWNvZGUgdG8gUkxDL01BQyBjb250cm9sIGJsb2NrICovCisJYml0dmVjX3NldF9iaXQoYnYsIDEpOworCWJpdHZlY19zZXRfdWludChidiwgZ2NvLT5ic19jdl9tYXgsIDQpOworCisJLyogaGFyZC1jb2RlIG5vIFBBTl97REVDLElOQyxNQVh9ICovCisJYml0dmVjX3NldF9iaXQoYnYsIDApOworCisJaWYgKCFnY28tPmV4dF9pbmZvX3ByZXNlbnQpIHsKKwkJLyogbm8gZXh0ZW5zaW9uIGluZm9ybWF0aW9uICovCisJCWJpdHZlY19zZXRfYml0KGJ2LCAwKTsKKwl9IGVsc2UgeworCQkvKiBleHRlbnNpb24gaW5mb3JtYXRpb24gKi8KKwkJYml0dmVjX3NldF9iaXQoYnYsIDEpOworCQlpZiAoIWdjby0+ZXh0X2luZm8uZWdwcnNfc3VwcG9ydGVkKSB7CisJCQkvKiA2Yml0IGxlbmd0aCBvZiBleHRlbnNpb24gKi8KKwkJCWJpdHZlY19zZXRfdWludChidiwgKDEgKyAzKS0xLCA2KTsKKwkJCS8qIEVHUFJTIHN1cHBvcnRlZCBpbiB0aGUgY2VsbCAqLworCQkJYml0dmVjX3NldF9iaXQoYnYsIDApOworCQl9IGVsc2UgeworCQkJLyogNmJpdCBsZW5ndGggb2YgZXh0ZW5zaW9uICovCisJCQliaXR2ZWNfc2V0X3VpbnQoYnYsICgxICsgNSArIDMpLTEsIDYpOworCQkJLyogRUdQUlMgc3VwcG9ydGVkIGluIHRoZSBjZWxsICovCisJCQliaXR2ZWNfc2V0X2JpdChidiwgMSk7CisJCQkvKiAxYml0IEVHUFJTIFBBQ0tFVCBDSEFOTkVMIFJFUVVFU1QgKi8KKwkJCWJpdHZlY19zZXRfYml0KGJ2LCBnY28tPmV4dF9pbmZvLnVzZV9lZ3Byc19wX2NoX3JlcSk7CisJCQkvKiA0Yml0IEJFUCBQRVJJT0QgKi8KKwkJCWJpdHZlY19zZXRfdWludChidiwgZ2NvLT5leHRfaW5mby5iZXBfcGVyaW9kLCA0KTsKKwkJfQorCQliaXR2ZWNfc2V0X2JpdChidiwgZ2NvLT5leHRfaW5mby5wZmNfc3VwcG9ydGVkKTsKKwkJYml0dmVjX3NldF9iaXQoYnYsIGdjby0+ZXh0X2luZm8uZHRtX3N1cHBvcnRlZCk7CisJCWJpdHZlY19zZXRfYml0KGJ2LCBnY28tPmV4dF9pbmZvLmJzc19wYWdpbmdfY29vcmRpbmF0aW9uKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXBwZW5kX2dwcnNfcHdyX2N0cmxfcGFycyhzdHJ1Y3QgYml0dmVjICpidiwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgZ3Byc19wb3dlcl9jdHJsX3BhcnMgKnBjcCkKK3sKKwliaXR2ZWNfc2V0X3VpbnQoYnYsIHBjcC0+YWxwaGEsIDQpOworCWJpdHZlY19zZXRfdWludChidiwgcGNwLT50X2F2Z193LCA1KTsKKwliaXR2ZWNfc2V0X3VpbnQoYnYsIHBjcC0+dF9hdmdfdCwgNSk7CisJYml0dmVjX3NldF91aW50KGJ2LCBwY3AtPnBjX21lYXNfY2hhbiwgMSk7CisJYml0dmVjX3NldF91aW50KGJ2LCBwY3AtPm5fYXZnX2ksIDQpOworfQorCisvKiBHZW5lcmF0ZSBTSTEzIFJlc3QgT2N0ZXN0cyAoMDQuMDggQ2hhcHRlciAxMC41LjIuMzdiKSAqLworaW50IHJlc3Rfb2N0ZXRzX3NpMTModV9pbnQ4X3QgKmRhdGEsIGNvbnN0IHN0cnVjdCBnc200OF9zaTEzX2luZm8gKnNpMTMpCit7CisJc3RydWN0IGJpdHZlYyBidjsKKworCW1lbXNldCgmYnYsIDAsIHNpemVvZihidikpOworCWJ2LmRhdGEgPSBkYXRhOworCWJ2LmRhdGFfbGVuID0gMjA7CisKKwlpZiAoMCkgeworCQkvKiBObyByZXN0IG9jdGV0cyAqLworCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEwpOworCX0gZWxzZSB7CisJCWJpdHZlY19zZXRfYml0KCZidiwgSCk7CisJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMTMtPmJjY2hfY2hhbmdlX21hcmssIDMpOworCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTEzLT5zaV9jaGFuZ2VfZmllbGQsIDQpOworCQlpZiAoMSkgeworCQkJYml0dmVjX3NldF9iaXQoJmJ2LCAwKTsKKwkJfSBlbHNlIHsKKwkJCWJpdHZlY19zZXRfYml0KCZidiwgMSk7CisJCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTEzLT5iY2NoX2NoYW5nZV9tYXJrLCAyKTsKKwkJCWFwcGVuZF9ncHJzX21vYmlsZV9hbGxvYygmYnYpOworCQl9CisJCWlmICghc2kxMy0+cGJjY2hfcHJlc2VudCkgeworCQkJLyogUEJDQ0ggbm90IHByZXNlbnQgaW4gY2VsbCAqLworCQkJYml0dmVjX3NldF9iaXQoJmJ2LCAwKTsKKwkJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMTMtPm5vX3BiY2NoLnJhYywgOCk7CisJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIHNpMTMtPm5vX3BiY2NoLnNwZ2NfY2NjaF9zdXApOworCQkJYml0dmVjX3NldF91aW50KCZidiwgc2kxMy0+bm9fcGJjY2gucHJpb19hY2NfdGhyLCAzKTsKKwkJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMTMtPm5vX3BiY2NoLm5ldF9jdHJsX29yZCwgMik7CisJCQlhcHBlbmRfZ3Byc19jZWxsX29wdCgmYnYsICZzaTEzLT5jZWxsX29wdHMpOworCQkJYXBwZW5kX2dwcnNfcHdyX2N0cmxfcGFycygmYnYsICZzaTEzLT5wd3JfY3RybF9wYXJzKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFBCQ0NIIHByZXNlbnQgaW4gY2VsbCAqLworCQkJYml0dmVjX3NldF9iaXQoJmJ2LCAxKTsKKwkJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMTMtPnBiY2NoLnBzaTFfcmVwX3BlciwgNCk7CisJCQkvKiBQQkNDSCBEZXNjcmlwaXRvbiAqLworCQkJYml0dmVjX3NldF91aW50KCZidiwgc2kxMy0+cGJjY2gucGIsIDQpOworCQkJYml0dmVjX3NldF91aW50KCZidiwgc2kxMy0+cGJjY2gudHNjLCAzKTsKKwkJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMTMtPnBiY2NoLnRuLCAzKTsKKwkJCXN3aXRjaCAoc2kxMy0+cGJjY2guY2Fycmllcl90eXBlKSB7CisJCQljYXNlIFBCQ0NIX0JDQ0g6CisJCQkJYml0dmVjX3NldF9iaXQoJmJ2LCAwKTsKKwkJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIDApOworCQkJCWJyZWFrOworCQkJY2FzZSBQQkNDSF9BUkZDTjoKKwkJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIDApOworCQkJCWJpdHZlY19zZXRfYml0KCZidiwgMSk7CisJCQkJYml0dmVjX3NldF91aW50KCZidiwgc2kxMy0+cGJjY2guYXJmY24sIDEwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUEJDQ0hfTUFJTzoKKwkJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIDEpOworCQkJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMTMtPnBiY2NoLm1haW8sIDYpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8qIDNHUFAgVFMgNDQuMDE4IFJlbGVhc2UgNiAvIDEwLjUuMi4zN2IgKi8KKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBIKTsJLyogYWRkZWQgUmVsZWFzZSA5OSAqLworCQkvKiBjbGFpbSBvdXIgU0dTTiBpcyBjb21wYXRpYmxlIHdpdGggUmVsZWFzZSA5OSwgYXMgRURHRSBhbmQgRUdQUlMKKwkJICogd2FzIG9ubHkgYWRkZWQgaW4gdGhpcyBSZWxlYXNlICovCisJCWJpdHZlY19zZXRfYml0KCZidiwgMSk7CisJfQorCWJpdHZlY19zcGFyZV9wYWRkaW5nKCZidiwgKGJ2LmRhdGFfbGVuKjgpLTEpOworCXJldHVybiBidi5kYXRhX2xlbjsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3JybHAuYyBiL29wZW5ic2Mvc3JjL3JybHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTA0NDUxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvcnJscC5jCkBAIC0wLDAgKzEsMTA2IEBACisvKiBSYWRpbyBSZXNvdXJjZSBMQ1MgKExvY2F0aW9uKSBQcm90b2NvbCwgR01TIFRTIDA0LjMxICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2NoYW5fYWxsb2MuaD4KKworLyogUlJMUCBtc1Bvc2l0aW9uUmVxLCBuc0Jhc2VkLAorICoJQWNjdXJhY3k9NjAsIE1ldGhvZD1ncHMsIFJlc3BvbnNlVGltZT0yLCBvbmVTZXQgKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBtc19iYXNlZF9wb3NfcmVxW10gPSB7IDB4NDAsIDB4MDEsIDB4NzgsIDB4YTggfTsKKworLyogUlJMUCBtc1Bvc2l0aW9uUmVxLCBtc0Jhc2VkUHJlZiwKKwlBY2N1cmFjeT02MCwgTWV0aG9kPWdwc09yRU9URCwgUmVzcG9uc2VUaW1lPTUsIG11bHRpcGxlU2V0cyAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IG1zX3ByZWZfcG9zX3JlcVtdICA9IHsgMHg0MCwgMHgwMiwgMHg3OSwgMHg1MCB9OworCisvKiBSUkxQIG1zUG9zaXRpb25SZXEsIG1zQXNzaXN0ZWRQcmVmLAorCUFjY3VyYWN5PTYwLCBNZXRob2Q9Z3BzT3JFT1RELCBSZXNwb25zZVRpbWU9NSwgbXVsdGlwbGVTZXRzICovCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYXNzX3ByZWZfcG9zX3JlcVtdID0geyAweDQwLCAweDAzLCAweDc5LCAweDUwIH07CisKK3N0YXRpYyBpbnQgc2VuZF9ycmxwX3JlcShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGxjaGFuLT50cy0+dHJ4LT5idHMtPm5ldHdvcms7CisJY29uc3QgdV9pbnQ4X3QgKnJlcTsKKworCXN3aXRjaCAobmV0LT5ycmxwLm1vZGUpIHsKKwljYXNlIFJSTFBfTU9ERV9NU19CQVNFRDoKKwkJcmVxID0gbXNfYmFzZWRfcG9zX3JlcTsKKwkJYnJlYWs7CisJY2FzZSBSUkxQX01PREVfTVNfUFJFRjoKKwkJcmVxID0gbXNfcHJlZl9wb3NfcmVxOworCQlicmVhazsKKwljYXNlIFJSTFBfTU9ERV9BU1NfUFJFRjoKKwkJcmVxID0gYXNzX3ByZWZfcG9zX3JlcTsKKwkJYnJlYWs7CisJY2FzZSBSUkxQX01PREVfTk9ORToKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gZ3NtNDhfc2VuZF9ycl9hcHBfaW5mbyhsY2hhbiwgMHgwMCwKKwkJCQkgICAgICBzaXplb2YobXNfYmFzZWRfcG9zX3JlcSksIHJlcSk7Cit9CisKK3N0YXRpYyBpbnQgc3Vic2NyX3NpZ19jYih1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkJIHZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU19TVUJTQ1JfQVRUQUNIRUQ6CisJCS8qIEEgc3Vic2NyaWJlciBoYXMgYXR0YWNoZWQuICovCisJCXN1YnNjciA9IHNpZ25hbF9kYXRhOworCQlsY2hhbiA9IGxjaGFuX2Zvcl9zdWJzY3Ioc3Vic2NyKTsKKwkJaWYgKCFsY2hhbikKKwkJCWJyZWFrOworCQlzZW5kX3JybHBfcmVxKGxjaGFuKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhZ2luZ19zaWdfY2IodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJCSB2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCXN0cnVjdCBwYWdpbmdfc2lnbmFsX2RhdGEgKnBzaWdfZGF0YSA9IHNpZ25hbF9kYXRhOworCisJc3dpdGNoIChzaWduYWwpIHsKKwljYXNlIFNfUEFHSU5HX1NVQ0NFRURFRDoKKwkJLyogQSBzdWJzY3JpYmVyIGhhcyBhdHRhY2hlZC4gKi8KKwkJc2VuZF9ycmxwX3JlcShwc2lnX2RhdGEtPmxjaGFuKTsKKwkJYnJlYWs7CisJY2FzZSBTX1BBR0lOR19FWFBJUkVEOgorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgb25fZHNvX2xvYWRfcnJscCh2b2lkKQoreworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX1NVQlNDUiwgc3Vic2NyX3NpZ19jYiwgTlVMTCk7CisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfUEFHSU5HLCBwYWdpbmdfc2lnX2NiLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3JzMjMyLmMgYi9vcGVuYnNjL3NyYy9yczIzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYWRmNTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9yczIzMi5jCkBAIC0wLDAgKzEsMjQ5IEBACisvKiBPcGVuQlNDIEJTLTExIFQtTGluayBpbnRlcmZhY2UgdXNpbmcgUE9TSVggc2VyaWFsIHBvcnQgKi8KKworLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9yczIzMi5oPgorCisvKiBhZGFwdGlvbiBsYXllciBmcm9tIEdTTSAwOC41OSArIDEyLjIxIHRvIFJTMjMyICovCisKK3N0cnVjdCBzZXJpYWxfaGFuZGxlIHsKKwlzdHJ1Y3QgYnNjX2ZkIGZkOworCXN0cnVjdCBsbGlzdF9oZWFkIHR4X3F1ZXVlOworCisJc3RydWN0IG1zZ2IgKnJ4X21zZzsKKwl1bnNpZ25lZCBpbnQgcnhtc2dfYnl0ZXNfbWlzc2luZzsKKworCXVuc2lnbmVkIGludCBkZWxheV9tczsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworfTsKKworLyogRklYTUU6IHRoaXMgbmVlZHMgdG8gZ28gKi8KK3N0YXRpYyBzdHJ1Y3Qgc2VyaWFsX2hhbmRsZSBfc2VyX2hhbmRsZSwgKnNlcl9oYW5kbGUgPSAmX3Nlcl9oYW5kbGU7CisKKyNkZWZpbmUgTEFQRF9IRFJfTEVOCTEwCisKK3N0YXRpYyBpbnQgaGFuZGxlX3Nlcl93cml0ZShzdHJ1Y3QgYnNjX2ZkICpiZmQpOworCisvKiBjYWxsYmFjayBmcm9tIGFiaXNfbm0gKi8KK2ludCBfYWJpc19ubV9zZW5kbXNnKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IHNlcmlhbF9oYW5kbGUgKnNoID0gc2VyX2hhbmRsZTsKKwl1X2ludDhfdCAqbGFwZDsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJbXNnLT5sMmggPSBtc2ctPmRhdGE7CisKKwkvKiBwcmVwZW5kIExBUEQgaGVhZGVyICovCisJbGFwZCA9IG1zZ2JfcHVzaChtc2csIExBUERfSERSX0xFTik7CisKKwlsZW4gPSBtc2ctPmxlbiAtIDI7CisKKwlsYXBkWzBdID0gKGxlbiA+PiA4KSAmIDB4ZmY7CisJbGFwZFsxXSA9IGxlbiAmIDB4ZmY7IC8qIGxlbmd0aCBvZiBieXRlcyBzdGFydGlnbiBhdCBsYXBkWzJdICovCisJbGFwZFsyXSA9IDB4MDA7CisJbGFwZFszXSA9IDB4MDc7CisJbGFwZFs0XSA9IDB4MDE7CisJbGFwZFs1XSA9IDB4M2U7CisJbGFwZFs2XSA9IDB4MDA7CisJbGFwZFs3XSA9IDB4MDA7CisJbGFwZFs4XSA9IG1zZy0+bGVuIC0gMTA7IC8qIGxlbmd0aCBvZiBieXRlcyBzdGFydGluZyBhdCBsYXBkWzEwXSAqLworCWxhcGRbOV0gPSBsYXBkWzhdIF4gMHgzODsKKworCW1zZ2JfZW5xdWV1ZSgmc2gtPnR4X3F1ZXVlLCBtc2cpOworCXNoLT5mZC53aGVuIHw9IEJTQ19GRF9XUklURTsKKworCS8qIHdlIHRyeSB0byBpbW1lZGlhdGVseSBzZW5kICovCisJaGFuZGxlX3Nlcl93cml0ZSgmc2gtPmZkKTsKKworCXJldHVybiAwOworfQorCisvKiBzZWxlY3QuYyBjYWxsYmFjayBpbiBjYXNlIHdlIGNhbiB3cml0ZSB0byB0aGUgUlMyMzIgKi8KK3N0YXRpYyBpbnQgaGFuZGxlX3Nlcl93cml0ZShzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IHNlcmlhbF9oYW5kbGUgKnNoID0gYmZkLT5kYXRhOworCXN0cnVjdCBtc2diICptc2c7CisJaW50IHdyaXR0ZW47CisKKwltc2cgPSBtc2diX2RlcXVldWUoJnNoLT50eF9xdWV1ZSk7CisJaWYgKCFtc2cpIHsKKwkJYmZkLT53aGVuICY9IH5CU0NfRkRfV1JJVEU7CisJCXJldHVybiAwOworCX0KKworCURFQlVHUChETUksICJSUzIzMiBUWDogJXNcbiIsIGhleGR1bXAobXNnLT5kYXRhLCBtc2ctPmxlbikpOworCisJLyogc2VuZCBvdmVyIHNlcmlhbCBsaW5lICovCisJd3JpdHRlbiA9IHdyaXRlKGJmZC0+ZmQsIG1zZy0+ZGF0YSwgbXNnLT5sZW4pOworCWlmICh3cml0dGVuIDwgbXNnLT5sZW4pIHsKKwkJcGVycm9yKCJzaG9ydCB3cml0ZToiKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCXJldHVybiAtMTsKKwl9CisKKwltc2diX2ZyZWUobXNnKTsKKwl1c2xlZXAoc2gtPmRlbGF5X21zKjEwMDApOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgU0VSSUFMX0FMTE9DX1NJWkUJMzAwCisKKy8qIHNlbGVjdC5jIGNhbGxiYWNrIGluIGNhc2Ugd2UgY2FuIHJlYWQgZnJvbSB0aGUgUlMyMzIgKi8KK3N0YXRpYyBpbnQgaGFuZGxlX3Nlcl9yZWFkKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3Qgc2VyaWFsX2hhbmRsZSAqc2ggPSBiZmQtPmRhdGE7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlpbnQgcmMgPSAwOworCisJaWYgKCFzaC0+cnhfbXNnKSB7CisJCXNoLT5yeF9tc2cgPSBtc2diX2FsbG9jKFNFUklBTF9BTExPQ19TSVpFLCAiUlMyMzIgUngiKTsKKwkJc2gtPnJ4X21zZy0+bDJoID0gTlVMTDsKKwkJc2gtPnJ4X21zZy0+dHJ4ID0gc2gtPmJ0cy0+YzA7CisJfQorCW1zZyA9IHNoLT5yeF9tc2c7CisKKwkvKiBmaXJzdCByZWFkIHR3byBieWVzIHRvIG9idGFpbiBsZW5ndGggKi8KKwlpZiAobXNnLT5sZW4gPCAyKSB7CisJCXJjID0gcmVhZChzaC0+ZmQuZmQsIG1zZy0+dGFpbCwgMiAtIG1zZy0+bGVuKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcGVycm9yKCJFUlJPUiByZWFkaW5nIGZyb20gc2VyaWFsIHBvcnQiKTsKKwkJCW1zZ2JfZnJlZShtc2cpOworCQkJcmV0dXJuIHJjOworCQl9CisJCW1zZ2JfcHV0KG1zZywgcmMpOworCisJCWlmIChtc2ctPmxlbiA+PSAyKSB7CisJCQkvKiBwYXJzZSBMQVBEIHBheWxvYWQgbGVuZ3RoICovCisJCQlpZiAobXNnLT5kYXRhWzBdICE9IDApCisJCQkJZnByaW50ZihzdGRlcnIsICJTdXNwaWNpb3VzIGhlYWRlciBieXRlIDA6IDB4JTAyeFxuIiwKKwkJCQkJbXNnLT5kYXRhWzBdKTsKKworCQkJc2gtPnJ4bXNnX2J5dGVzX21pc3NpbmcgPSBtc2ctPmRhdGFbMF0gPDwgODsKKwkJCXNoLT5yeG1zZ19ieXRlc19taXNzaW5nICs9IG1zZy0+ZGF0YVsxXTsKKworCQkJaWYgKHNoLT5yeG1zZ19ieXRlc19taXNzaW5nIDwgTEFQRF9IRFJfTEVOIC0yKQorCQkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBsZW5ndGggaW4gaGRyOiAldVxuIiwKKwkJCQkJc2gtPnJ4bXNnX2J5dGVzX21pc3NpbmcpOworCQl9CisJfSBlbHNlIHsKKwkJLyogdHJ5IHRvIHJlYWQgYXMgbWFueSBvZiB0aGUgbWlzc2luZyBieXRlcyBhcyBhcmUgYXZhaWxhYmxlICovCisJCXJjID0gcmVhZChzaC0+ZmQuZmQsIG1zZy0+dGFpbCwgc2gtPnJ4bXNnX2J5dGVzX21pc3NpbmcpOworCQlpZiAocmMgPCAwKSB7CisJCQlwZXJyb3IoIkVSUk9SIHJlYWRpbmcgZnJvbSBzZXJpYWwgcG9ydCIpOworCQkJbXNnYl9mcmVlKG1zZyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwkJbXNnYl9wdXQobXNnLCByYyk7CisJCXNoLT5yeG1zZ19ieXRlc19taXNzaW5nIC09IHJjOworCisJCWlmIChzaC0+cnhtc2dfYnl0ZXNfbWlzc2luZyA9PSAwKSB7CisJCQkvKiB3ZSBoYXZlIG9uZSBjb21wbGV0ZSBtZXNzYWdlIG5vdyAqLworCQkJc2gtPnJ4X21zZyA9IE5VTEw7CisKKwkJCWlmIChtc2ctPmxlbiA+IExBUERfSERSX0xFTikKKwkJCQltc2ctPmwyaCA9IG1zZy0+ZGF0YSArIExBUERfSERSX0xFTjsKKworCQkJREVCVUdQKERNSSwgIlJTMjMyIFJYOiAlc1xuIiwgaGV4ZHVtcChtc2ctPmRhdGEsIG1zZy0+bGVuKSk7CisJCQlyYyA9IGhhbmRsZV9zZXJpYWxfbXNnKG1zZyk7CisJCX0KKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIHNlbGVjdC5jIGNhbGxiYWNrICovCitzdGF0aWMgaW50IHNlcmlhbF9mZF9jYihzdHJ1Y3QgYnNjX2ZkICpiZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCWludCByYyA9IDA7CisKKwlpZiAod2hhdCAmIEJTQ19GRF9SRUFEKQorCQlyYyA9IGhhbmRsZV9zZXJfcmVhZChiZmQpOworCisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJaWYgKHdoYXQgJiBCU0NfRkRfV1JJVEUpCisJCXJjID0gaGFuZGxlX3Nlcl93cml0ZShiZmQpOworCisJcmV0dXJuIHJjOworfQorCitpbnQgcnMyMzJfc2V0dXAoY29uc3QgY2hhciAqc2VyaWFsX3BvcnQsIHVuc2lnbmVkIGludCBkZWxheV9tcywKKwkJc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlpbnQgcmMsIHNlcmlhbF9mZDsKKwlzdHJ1Y3QgdGVybWlvcyB0aW87CisKKwlzZXJpYWxfZmQgPSBvcGVuKHNlcmlhbF9wb3J0LCBPX1JEV1IpOworCWlmIChzZXJpYWxfZmQgPCAwKSB7CisJCXBlcnJvcigiY2Fubm90IG9wZW4gc2VyaWFsIHBvcnQ6Iik7CisJCXJldHVybiBzZXJpYWxfZmQ7CisJfQorCisJLyogc2V0IGJhdWRyYXRlICovCisJcmMgPSB0Y2dldGF0dHIoc2VyaWFsX2ZkLCAmdGlvKTsKKwlpZiAocmMgPCAwKSB7CisJCXBlcnJvcigidGNnZXRhdHRyKCkiKTsKKwkJcmV0dXJuIHJjOworCX0KKwljZnNldGlzcGVlZCgmdGlvLCBCMTkyMDApOworCWNmc2V0b3NwZWVkKCZ0aW8sIEIxOTIwMCk7CisJdGlvLmNfY2ZsYWcgfD0gIChDUkVBRCB8IENMT0NBTCB8IENTOCk7CisJdGlvLmNfY2ZsYWcgJj0gfihQQVJFTkIgfCBDU1RPUEIgfCBDU0laRSB8IENSVFNDVFMpOworCXRpby5jX2xmbGFnICY9IH4oSUNBTk9OIHwgRUNITyB8IEVDSE9FIHwgSVNJRyk7CisJdGlvLmNfaWZsYWcgfD0gIChJTlBDSyB8IElTVFJJUCk7CisJdGlvLmNfaWZsYWcgJj0gfihJU1RSSVAgfCBJWE9OIHwgSVhPRkYgfCBJR05CUksgfCBJTkxDUiB8IElDUk5MIHwgSUdOQ1IpOworCXRpby5jX29mbGFnICY9IH4oT1BPU1QpOworCXJjID0gdGNzZXRhdHRyKHNlcmlhbF9mZCwgVENTQURSQUlOLCAmdGlvKTsKKwlpZiAocmMgPCAwKSB7CisJCXBlcnJvcigidGNzZXRhdHRyKCkiKTsKKwkJcmV0dXJuIHJjOworCX0KKworCUlOSVRfTExJU1RfSEVBRCgmc2VyX2hhbmRsZS0+dHhfcXVldWUpOworCXNlcl9oYW5kbGUtPmZkLmZkID0gc2VyaWFsX2ZkOworCXNlcl9oYW5kbGUtPmZkLndoZW4gPSBCU0NfRkRfUkVBRDsKKwlzZXJfaGFuZGxlLT5mZC5jYiA9IHNlcmlhbF9mZF9jYjsKKwlzZXJfaGFuZGxlLT5mZC5kYXRhID0gc2VyX2hhbmRsZTsKKwlzZXJfaGFuZGxlLT5kZWxheV9tcyA9IGRlbGF5X21zOworCXNlcl9oYW5kbGUtPmJ0cyA9IGJ0czsKKwlyYyA9IGJzY19yZWdpc3Rlcl9mZCgmc2VyX2hhbmRsZS0+ZmQpOworCWlmIChyYyA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgcmVnaXN0ZXIgRkQ6ICVzXG4iLAorCQkJc3RyZXJyb3IocmMpKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvcnRwX3Byb3h5LmMgYi9vcGVuYnNjL3NyYy9ydHBfcHJveHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjQxNzNkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvcnRwX3Byb3h5LmMKQEAgLTAsMCArMSw3MjEgQEAKKy8qIFJUUCBwcm94eSBoYW5kbGluZyBmb3IgaXAuYWNjZXNzIG5hbm9CVFMgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8ZW5kaWFuLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+ICAgIC8qIGdldHRpbWVvZmRheSgpICovCisjaW5jbHVkZSA8dW5pc3RkLmg+ICAgICAgLyogZ2V0Li4oKSAqLworI2luY2x1ZGUgPHRpbWUuaD4gICAgICAgIC8qIGNsb2NrKCkgKi8KKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPiAvKiB1bmFtZSgpICovCisKKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3J0cF9wcm94eS5oPgorCitzdGF0aWMgTExJU1RfSEVBRChydHBfc29ja2V0cyk7CisKKy8qIHNob3VsZCB3ZSBtYW5nbGUgdGhlIENOQU1FIGluc2lkZSBTREVTIG9mIFJUQ1AgcGFja2V0cz8gV2UgZGlzYWJsZQorICogdGhpcyBieSBkZWZhdWx0LCBhcyBpdCBzZWVtcyB0byBiZSBub3QgbmVlZGVkICovCitzdGF0aWMgaW50IG1hbmdsZV9ydGNwX2NuYW1lID0gMDsKKworZW51bSBydHBfYmZkX3ByaXYgeworCVJUUF9QUklWX05PTkUsCisJUlRQX1BSSVZfUlRQLAorCVJUUF9QUklWX1JUQ1AKK307CisKKyNkZWZpbmUgUlRQX0FMTE9DX1NJWkUJMTUwMAorCisvKiBhY2NvcmRpbmcgdG8gUkZDIDE4ODkgKi8KK3N0cnVjdCBydGNwX2hkciB7CisJdV9pbnQ4X3QgYnl0ZTA7CisJdV9pbnQ4X3QgdHlwZTsKKwl1X2ludDE2X3QgbGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBSVENQX1RZUEVfU0RFUwkyMDIKKwkKKyNkZWZpbmUgUlRDUF9JRV9DTkFNRQkxCisKKy8qIGFjY29yZGluZyB0byBSRkMgMzU1MCAqLworc3RydWN0IHJ0cF9oZHIgeworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKwl1X2ludDhfdCAgY3NyY19jb3VudDo0LAorCQkgIGV4dGVuc2lvbjoxLAorCQkgIHBhZGRpbmc6MSwKKwkJICB2ZXJzaW9uOjI7CisJdV9pbnQ4X3QgIHBheWxvYWRfdHlwZTo3LAorCQkgIG1hcmtlcjoxOworI2VsaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCXVfaW50OF90ICB2ZXJzaW9uOjIsCisJCSAgcGFkZGluZzoxLAorCQkgIGV4dGVuc2lvbjoxLAorCQkgIGNzcmNfY291bnQ6NDsKKwl1X2ludDhfdCAgbWFya2VyOjEsCisJCSAgcGF5bG9hZF90eXBlOjc7CisjZW5kaWYKKwl1X2ludDE2X3Qgc2VxdWVuY2U7CisJdV9pbnQzMl90IHRpbWVzdGFtcDsKKwl1X2ludDMyX3Qgc3NyYzsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBydHBfeF9oZHIgeworCXVfaW50MTZfdCBieV9wcm9maWxlOworCXVfaW50MTZfdCBsZW5ndGg7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIFJUUF9WRVJTSU9OCTIKKworLyogZGVjb2RlIGFuIHJ0cCBmcmFtZSBhbmQgY3JlYXRlIGEgbmV3IGJ1ZmZlciB3aXRoIHBheWxvYWQgKi8KK3N0YXRpYyBpbnQgcnRwX2RlY29kZShzdHJ1Y3QgbXNnYiAqbXNnLCB1X2ludDMyX3QgY2FsbHJlZiwgc3RydWN0IG1zZ2IgKipkYXRhKQoreworCXN0cnVjdCBtc2diICpuZXdfbXNnOworCXN0cnVjdCBnc21fZGF0YV9mcmFtZSAqZnJhbWU7CisJc3RydWN0IHJ0cF9oZHIgKnJ0cGggPSAoc3RydWN0IHJ0cF9oZHIgKiltc2ctPmRhdGE7CisJc3RydWN0IHJ0cF94X2hkciAqcnRweGg7CisJdV9pbnQ4X3QgKnBheWxvYWQ7CisJaW50IHBheWxvYWRfbGVuOworCWludCBtc2dfdHlwZTsKKwlpbnQgeF9sZW47CisKKwlpZiAobXNnLT5sZW4gPCAxMikgeworCQlERUJVR1BDKERNVVgsICJyZWNlaXZlZCBSVFAgZnJhbWUgdG9vIHNob3J0IChsZW4gPSAlZClcbiIsCisJCQltc2ctPmxlbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAocnRwaC0+dmVyc2lvbiAhPSBSVFBfVkVSU0lPTikgeworCQlERUJVR1BDKERNVVgsICJyZWNlaXZlZCBSVFAgdmVyc2lvbiAlZCBub3Qgc3VwcG9ydGVkLlxuIiwKKwkJCXJ0cGgtPnZlcnNpb24pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcGF5bG9hZCA9IG1zZy0+ZGF0YSArIHNpemVvZihzdHJ1Y3QgcnRwX2hkcikgKyAocnRwaC0+Y3NyY19jb3VudCA8PCAyKTsKKwlwYXlsb2FkX2xlbiA9IG1zZy0+bGVuIC0gc2l6ZW9mKHN0cnVjdCBydHBfaGRyKSAtIChydHBoLT5jc3JjX2NvdW50IDw8IDIpOworCWlmIChwYXlsb2FkX2xlbiA8IDApIHsKKwkJREVCVUdQQyhETVVYLCAicmVjZWl2ZWQgUlRQIGZyYW1lIHRvbyBzaG9ydCAobGVuID0gJWQsICIKKwkJCSJjc3JjIGNvdW50ID0gJWQpXG4iLCBtc2ctPmxlbiwgcnRwaC0+Y3NyY19jb3VudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAocnRwaC0+ZXh0ZW5zaW9uKSB7CisJCWlmIChwYXlsb2FkX2xlbiA8IHNpemVvZihzdHJ1Y3QgcnRwX3hfaGRyKSkgeworCQkJREVCVUdQQyhETVVYLCAicmVjZWl2ZWQgUlRQIGZyYW1lIHRvbyBzaG9ydCBmb3IgIgorCQkJCSJleHRlbnNpb24gaGVhZGVyXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJ0cHhoID0gKHN0cnVjdCBydHBfeF9oZHIgKilwYXlsb2FkOworCQl4X2xlbiA9IG50b2hzKHJ0cHhoLT5sZW5ndGgpICogNCArIHNpemVvZihzdHJ1Y3QgcnRwX3hfaGRyKTsKKwkJcGF5bG9hZCArPSB4X2xlbjsKKwkJcGF5bG9hZF9sZW4gLT0geF9sZW47CisJCWlmIChwYXlsb2FkX2xlbiA8IDApIHsKKwkJCURFQlVHUEMoRE1VWCwgInJlY2VpdmVkIFJUUCBmcmFtZSB0b28gc2hvcnQsICIKKwkJCQkiZXh0ZW5zaW9uIGhlYWRlciBleGNlZWRzIGZyYW1lIGxlbmd0aFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwlpZiAocnRwaC0+cGFkZGluZykgeworCQlpZiAocGF5bG9hZF9sZW4gPCAwKSB7CisJCQlERUJVR1BDKERNVVgsICJyZWNlaXZlZCBSVFAgZnJhbWUgdG9vIHNob3J0IGZvciAiCisJCQkJInBhZGRpbmcgbGVuZ3RoXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXBheWxvYWRfbGVuIC09IHBheWxvYWRbcGF5bG9hZF9sZW4gLSAxXTsKKwkJaWYgKHBheWxvYWRfbGVuIDwgMCkgeworCQkJREVCVUdQQyhETVVYLCAicmVjZWl2ZWQgUlRQIGZyYW1lIHdpdGggcGFkZGluZyAiCisJCQkJImdyZWF0ZXIgdGhhbiBwYXlsb2FkXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJc3dpdGNoIChydHBoLT5wYXlsb2FkX3R5cGUpIHsKKwljYXNlIFJUUF9QVF9HU01fRlVMTDoKKwkJbXNnX3R5cGUgPSBHU01fVENIRl9GUkFNRTsKKwkJaWYgKHBheWxvYWRfbGVuICE9IDMzKSB7CisJCQlERUJVR1BDKERNVVgsICJyZWNlaXZlZCBSVFAgZnVsbCByYXRlIGZyYW1lIHdpdGggIgorCQkJCSJwYXlsb2FkIGxlbmd0aCAhPSAzMiAobGVuID0gJWQpXG4iLAorCQkJCXBheWxvYWRfbGVuKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWNhc2UgUlRQX1BUX0dTTV9FRlI6CisJCW1zZ190eXBlID0gR1NNX1RDSEZfRlJBTUVfRUZSOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1BDKERNVVgsICJyZWNlaXZlZCBSVFAgZnJhbWUgd2l0aCB1bmtub3duIHBheWxvYWQgIgorCQkJInR5cGUgJWRcbiIsIHJ0cGgtPnBheWxvYWRfdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW5ld19tc2cgPSBtc2diX2FsbG9jKHNpemVvZihzdHJ1Y3QgZ3NtX2RhdGFfZnJhbWUpICsgcGF5bG9hZF9sZW4sCisJCQkJIkdTTS1EQVRBIik7CisJaWYgKCFuZXdfbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKwlmcmFtZSA9IChzdHJ1Y3QgZ3NtX2RhdGFfZnJhbWUgKikobmV3X21zZy0+ZGF0YSk7CisJZnJhbWUtPm1zZ190eXBlID0gbXNnX3R5cGU7CisJZnJhbWUtPmNhbGxyZWYgPSBjYWxscmVmOworCW1lbWNweShmcmFtZS0+ZGF0YSwgcGF5bG9hZCwgcGF5bG9hZF9sZW4pOworCW1zZ2JfcHV0KG5ld19tc2csIHNpemVvZihzdHJ1Y3QgZ3NtX2RhdGFfZnJhbWUpICsgcGF5bG9hZF9sZW4pOworCisJKmRhdGEgPSBuZXdfbXNnOworCXJldHVybiAwOworfQorCisvKiAidG8gLSBmcm9tIiAqLworc3RhdGljIHZvaWQgdHZfZGlmZmVyZW5jZShzdHJ1Y3QgdGltZXZhbCAqZGlmZiwgY29uc3Qgc3RydWN0IHRpbWV2YWwgKmZyb20sCisJCQkgIGNvbnN0IHN0cnVjdCB0aW1ldmFsICpfX3RvKQoreworCXN0cnVjdCB0aW1ldmFsIF90byA9ICpfX3RvLCAqdG8gPSAmX3RvOworCisJaWYgKHRvLT50dl91c2VjIDwgZnJvbS0+dHZfdXNlYykgeworCQl0by0+dHZfc2VjIC09IDE7CisJCXRvLT50dl91c2VjICs9IDEwMDAwMDA7CisJfQorCisJZGlmZi0+dHZfdXNlYyA9IHRvLT50dl91c2VjIC0gZnJvbS0+dHZfdXNlYzsKKwlkaWZmLT50dl9zZWMgPSB0by0+dHZfc2VjIC0gZnJvbS0+dHZfc2VjOworfQorCisvKiBlbmNvZGUgYW5kIHNlbmQgYSBydHAgZnJhbWUgKi8KK2ludCBydHBfc2VuZF9mcmFtZShzdHJ1Y3QgcnRwX3NvY2tldCAqcnMsIHN0cnVjdCBnc21fZGF0YV9mcmFtZSAqZnJhbWUpCit7CisJc3RydWN0IHJ0cF9zdWJfc29ja2V0ICpyc3MgPSAmcnMtPnJ0cDsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXN0cnVjdCBydHBfaGRyICpydHBoOworCWludCBwYXlsb2FkX3R5cGU7CisJaW50IHBheWxvYWRfbGVuOworCWludCBkdXJhdGlvbjsgLyogaW4gc2FtcGxlcyAqLworCisJaWYgKHJzLT50eF9hY3Rpb24gIT0gUlRQX1NFTkRfRE9XTlNUUkVBTSkgeworCQkvKiBpbml0aWFsaXplIHNlcXVlbmNlcyAqLworCQlycy0+dHhfYWN0aW9uID0gUlRQX1NFTkRfRE9XTlNUUkVBTTsKKwkJcnMtPnRyYW5zbWl0LnNzcmMgPSByYW5kKCk7CisJCXJzLT50cmFuc21pdC5zZXF1ZW5jZSA9IHJhbmRvbSgpOworCQlycy0+dHJhbnNtaXQudGltZXN0YW1wID0gcmFuZG9tKCk7CisJfQorCisJc3dpdGNoIChmcmFtZS0+bXNnX3R5cGUpIHsKKwljYXNlIEdTTV9UQ0hGX0ZSQU1FOgorCQlwYXlsb2FkX3R5cGUgPSBSVFBfUFRfR1NNX0ZVTEw7CisJCXBheWxvYWRfbGVuID0gMzM7CisJCWR1cmF0aW9uID0gMTYwOworCQlicmVhazsKKwljYXNlIEdTTV9UQ0hGX0ZSQU1FX0VGUjoKKwkJcGF5bG9hZF90eXBlID0gUlRQX1BUX0dTTV9FRlI7CisJCXBheWxvYWRfbGVuID0gMzE7CisJCWR1cmF0aW9uID0gMTYwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1BDKERNVVgsICJ1bnN1cHBvcnRlZCBtZXNzYWdlIHR5cGUgJWRcbiIsCisJCQlmcmFtZS0+bXNnX3R5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl7CisJCXN0cnVjdCB0aW1ldmFsIHR2LCB0dl9kaWZmOworCQlsb25nIGludCB1c2VjX2RpZmYsIGZyYW1lX2RpZmY7CisKKwkJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisJCXR2X2RpZmZlcmVuY2UoJnR2X2RpZmYsICZycy0+dHJhbnNtaXQubGFzdF90diwgJnR2KTsKKwkJcnMtPnRyYW5zbWl0Lmxhc3RfdHYgPSB0djsKKworCQl1c2VjX2RpZmYgPSB0dl9kaWZmLnR2X3NlYyAqIDEwMDAwMDAgKyB0dl9kaWZmLnR2X3VzZWM7CisJCWZyYW1lX2RpZmYgPSAodXNlY19kaWZmIC8gMjAwMDApOworCisJCWlmIChhYnMoZnJhbWVfZGlmZikgPiAxKSB7CisJCQlsb25nIGludCBmcmFtZV9kaWZmX2V4Y2VzcyA9IGZyYW1lX2RpZmYgLSAxOworCisJCQlMT0dQKERNVVgsIExPR0xfTk9USUNFLAorCQkJCSJDb3JyZWN0aW5nIGZyYW1lIGRpZmZlcmVuY2Ugb2YgJWxkIGZyYW1lc1xuIiwgZnJhbWVfZGlmZl9leGNlc3MpOworCQkJcnMtPnRyYW5zbWl0LnNlcXVlbmNlICs9IGZyYW1lX2RpZmZfZXhjZXNzOworCQkJcnMtPnRyYW5zbWl0LnRpbWVzdGFtcCArPSBmcmFtZV9kaWZmX2V4Y2VzcyAqIGR1cmF0aW9uOworCQl9CisJfQorCisJbXNnID0gbXNnYl9hbGxvYyhzaXplb2Yoc3RydWN0IHJ0cF9oZHIpICsgcGF5bG9hZF9sZW4sICJSVFAtR1NNLUZVTEwiKTsKKwlpZiAoIW1zZykKKwkJcmV0dXJuIC1FTk9NRU07CisJcnRwaCA9IChzdHJ1Y3QgcnRwX2hkciAqKW1zZy0+ZGF0YTsKKwlydHBoLT52ZXJzaW9uID0gUlRQX1ZFUlNJT047CisJcnRwaC0+cGFkZGluZyA9IDA7CisJcnRwaC0+ZXh0ZW5zaW9uID0gMDsKKwlydHBoLT5jc3JjX2NvdW50ID0gMDsKKwlydHBoLT5tYXJrZXIgPSAwOworCXJ0cGgtPnBheWxvYWRfdHlwZSA9IHBheWxvYWRfdHlwZTsKKwlydHBoLT5zZXF1ZW5jZSA9IGh0b25zKHJzLT50cmFuc21pdC5zZXF1ZW5jZSsrKTsKKwlydHBoLT50aW1lc3RhbXAgPSBodG9ubChycy0+dHJhbnNtaXQudGltZXN0YW1wKTsKKwlycy0+dHJhbnNtaXQudGltZXN0YW1wICs9IGR1cmF0aW9uOworCXJ0cGgtPnNzcmMgPSBodG9ubChycy0+dHJhbnNtaXQuc3NyYyk7CisJbWVtY3B5KG1zZy0+ZGF0YSArIHNpemVvZihzdHJ1Y3QgcnRwX2hkciksIGZyYW1lLT5kYXRhLCBwYXlsb2FkX2xlbik7CisJbXNnYl9wdXQobXNnLCBzaXplb2Yoc3RydWN0IHJ0cF9oZHIpICsgcGF5bG9hZF9sZW4pOworCW1zZ2JfZW5xdWV1ZSgmcnNzLT50eF9xdWV1ZSwgbXNnKTsKKwlyc3MtPmJmZC53aGVuIHw9IEJTQ19GRF9XUklURTsKKworCXJldHVybiAwOworfQorCisvKiBpdGVyYXRlIG92ZXIgYWxsIGNodW5rcyBpbiBvbmUgUlRDUCBtZXNzYWdlLCBsb29rIGZvciBDTkFNRSBJRXMgYW5kCisgKiByZXBsYWNlIGFsbCBvZiB0aG9zZSB3aXRoICduZXdfY25hbWUnICovCitzdGF0aWMgaW50IHJ0Y3Bfc2Rlc19jbmFtZV9tYW5nbGUoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IHJ0Y3BfaGRyICpyaCwKKwkJCQkgIHVfaW50MTZfdCAqcnRjcF9sZW4sIGNvbnN0IGNoYXIgKm5ld19jbmFtZSkKK3sKKwl1X2ludDhfdCAqcnRjcF9lbmQ7CisJdV9pbnQ4X3QgKmN1ciA9ICh1X2ludDhfdCAqKSByaDsKKwl1X2ludDhfdCB0YWcsIGxlbiA9IDA7CisKKwlydGNwX2VuZCA9IGN1ciArICpydGNwX2xlbjsKKwkvKiBtb3ZlIGN1ciB0byBlbmQgb2YgUlRQIGhlYWRlciAqLworCWN1ciArPSBzaXplb2YoKnJoKTsKKworCS8qIGl0ZXJhdGUgb3ZlciBDaHVua3MgKi8KKwl3aGlsZSAoY3VyKzQgPCBydGNwX2VuZCkgeworCQkvKiBza2lwIGZvdXIgYnl0ZXMgU1NSQy9DU1JDICovCisJCWN1ciArPSA0OworCQorCQkvKiBpdGVyYXRlIG92ZXIgSUUncyBpbnNpZGUgdGhlIGNodW5rICovCisJCXdoaWxlIChjdXIrMSA8IHJ0Y3BfZW5kKSB7CisJCQl0YWcgPSAqY3VyKys7CisJCQlpZiAodGFnID09IDApIHsKKwkJCQkvKiBlbmQgb2YgY2h1bmssIHNraXAgYWRkaXRpb25hbCB6ZXJvICovCisJCQkJd2hpbGUgKCpjdXIrKyA9PSAwKSB7IH0KKwkJCQlicmVhazsKKwkJCX0KKwkJCWxlbiA9ICpjdXIrKzsKKwkKKwkJCWlmICh0YWcgPT0gUlRDUF9JRV9DTkFNRSkgeworCQkJCS8qIHdlJ3ZlIGZvdW5kIHRoZSBDTkFNRSwgbGV0cyBtYW5nbGUgaXQgKi8KKwkJCQlpZiAobGVuIDwgc3RybGVuKG5ld19jbmFtZSkpIHsKKwkJCQkJLyogd2UgbmVlZCB0byBtYWtlIG1vcmUgc3BhY2UgKi8KKwkJCQkJaW50IGluY3JlYXNlID0gc3RybGVuKG5ld19jbmFtZSkgLSBsZW47CisKKwkJCQkJbXNnYl9wdXNoKG1zZywgaW5jcmVhc2UpOworCQkJCQltZW1tb3ZlKGN1citsZW4raW5jcmVhc2UsIGN1citsZW4sCisJCQkJCQlydGNwX2VuZCAtIChjdXIrbGVuKSk7CisJCQkJCS8qIEZJWE1FOiB3ZSBoYXZlIHRvIHJlc3BlY3QgUlRDUAorCQkJCQkgKiBwYWRkaW5nL2FsaWdubWVudCBydWxlcyEgKi8KKwkJCQkJbGVuICs9IGluY3JlYXNlOworCQkJCQkqKGN1ci0xKSArPSBpbmNyZWFzZTsKKwkJCQkJcnRjcF9lbmQgKz0gaW5jcmVhc2U7CisJCQkJCSpydGNwX2xlbiArPSBpbmNyZWFzZTsKKwkJCQl9CisJCQkJLyogY29weSBuZXcgQ05BTUUgaW50byBtZXNzYWdlICovCisJCQkJbWVtY3B5KGN1ciwgbmV3X2NuYW1lLCBzdHJsZW4obmV3X2NuYW1lKSk7CisJCQkJLyogRklYTUU6IHplcm8gdGhlIHBhZGRpbmcgaW4gY2FzZSBuZXcgQ05BTUUKKwkJCQkgKiBpcyBzbWFsbGVyIHRoYW4gb2xkIG9uZSAhISEgKi8KKwkJCX0KKwkJCWN1ciArPSBsZW47CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydGNwX21hbmdsZShzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgcnRwX3NvY2tldCAqcnMpCit7CisJc3RydWN0IHJ0cF9zdWJfc29ja2V0ICpyc3MgPSAmcnMtPnJ0Y3A7CisJc3RydWN0IHJ0Y3BfaGRyICpydHBoOworCXVfaW50MTZfdCBvbGRfbGVuOworCWludCByYzsKKworCWlmICghbWFuZ2xlX3J0Y3BfY25hbWUpCisJCXJldHVybiAwOworCisJcHJpbnRmKCJSVENQXG4iKTsKKwkvKiBpdGVyYXRlIG92ZXIgbGlzdCBvZiBSVENQIG1lc3NhZ2VzICovCisJcnRwaCA9IChzdHJ1Y3QgcnRjcF9oZHIgKiltc2ctPmRhdGE7CisJd2hpbGUgKCh2b2lkICopcnRwaCArIHNpemVvZigqcnRwaCkgPD0gKHZvaWQgKiltc2ctPmRhdGEgKyBtc2ctPmxlbikgeworCQlvbGRfbGVuID0gKG50b2hzKHJ0cGgtPmxlbmd0aCkgKyAxKSAqIDQ7CisJCWlmICgodm9pZCAqKXJ0cGggKyBvbGRfbGVuID4gKHZvaWQgKiltc2ctPmRhdGEgKyBtc2ctPmxlbikgeworCQkJREVCVUdQQyhETVVYLCAicmVjZWl2ZWQgUlRDUCBwYWNrZXQgdG9vIHNob3J0IGZvciAiCisJCQkJImxlbmd0aCBlbGVtZW50XG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChydHBoLT50eXBlID09IFJUQ1BfVFlQRV9TREVTKSB7CisJCQljaGFyIG5ld19jbmFtZVsyNTVdOworCQkJc3RybmNweShuZXdfY25hbWUsIGluZXRfbnRvYShyc3MtPnNpbl9sb2NhbC5zaW5fYWRkciksCisJCQkJc2l6ZW9mKG5ld19jbmFtZSkpOworCQkJbmV3X2NuYW1lW3NpemVvZihuZXdfY25hbWUpLTFdID0gJ1wwJzsKKwkJCXJjID0gcnRjcF9zZGVzX2NuYW1lX21hbmdsZShtc2csIHJ0cGgsICZvbGRfbGVuLAorCQkJCQkJICAgIG5ld19jbmFtZSk7CisJCQlpZiAocmMgPCAwKQorCQkJCXJldHVybiByYzsKKwkJfQorCQlydHBoID0gKHZvaWQgKilydHBoICsgb2xkX2xlbjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogcmVhZCBmcm9tIGluY29taW5nIFJUUC9SVENQIHNvY2tldCAqLworc3RhdGljIGludCBydHBfc29ja2V0X3JlYWQoc3RydWN0IHJ0cF9zb2NrZXQgKnJzLCBzdHJ1Y3QgcnRwX3N1Yl9zb2NrZXQgKnJzcykKK3sKKwlpbnQgcmM7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2MoUlRQX0FMTE9DX1NJWkUsICJSVFAvUlRDUCIpOworCXN0cnVjdCBtc2diICpuZXdfbXNnOworCXN0cnVjdCBydHBfc3ViX3NvY2tldCAqb3RoZXJfcnNzOworCisJaWYgKCFtc2cpCisJCXJldHVybiAtRU5PTUVNOworCisJcmMgPSByZWFkKHJzcy0+YmZkLmZkLCBtc2ctPmRhdGEsIFJUUF9BTExPQ19TSVpFKTsKKwlpZiAocmMgPD0gMCkgeworCQlyc3MtPmJmZC53aGVuICY9IH5CU0NfRkRfUkVBRDsKKwkJcmV0dXJuIHJjOworCX0KKworCW1zZ2JfcHV0KG1zZywgcmMpOworCisJc3dpdGNoIChycy0+cnhfYWN0aW9uKSB7CisJY2FzZSBSVFBfUFJPWFk6CisJCWlmICghcnMtPnByb3h5Lm90aGVyX3NvY2spIHsKKwkJCXJjID0gLUVJTzsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKwkJaWYgKHJzcy0+YmZkLnByaXZfbnIgPT0gUlRQX1BSSVZfUlRQKQorCQkJb3RoZXJfcnNzID0gJnJzLT5wcm94eS5vdGhlcl9zb2NrLT5ydHA7CisJCWVsc2UgaWYgKHJzcy0+YmZkLnByaXZfbnIgPT0gUlRQX1BSSVZfUlRDUCkgeworCQkJb3RoZXJfcnNzID0gJnJzLT5wcm94eS5vdGhlcl9zb2NrLT5ydGNwOworCQkJLyogbW9kaWZ5IFJUQ1AgU0RFUyBDTkFNRSAqLworCQkJcmMgPSBydGNwX21hbmdsZShtc2csIHJzKTsKKwkJCWlmIChyYyA8IDApCisJCQkJZ290byBvdXRfZnJlZTsKKwkJfSBlbHNlIHsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKwkJbXNnYl9lbnF1ZXVlKCZvdGhlcl9yc3MtPnR4X3F1ZXVlLCBtc2cpOworCQlvdGhlcl9yc3MtPmJmZC53aGVuIHw9IEJTQ19GRF9XUklURTsKKwkJYnJlYWs7CisKKwljYXNlIFJUUF9SRUNWX1VQU1RSRUFNOgorCQlpZiAoIXJzLT5yZWNlaXZlLmNhbGxyZWYgfHwgIXJzLT5yZWNlaXZlLm5ldCkgeworCQkJcmMgPSAtRUlPOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCQlpZiAocnNzLT5iZmQucHJpdl9uciA9PSBSVFBfUFJJVl9SVENQKSB7CisJCQlpZiAoIW1hbmdsZV9ydGNwX2NuYW1lKSB7CisJCQkJbXNnYl9mcmVlKG1zZyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBtb2RpZnkgUlRDUCBTREVTIENOQU1FICovCisJCQlyYyA9IHJ0Y3BfbWFuZ2xlKG1zZywgcnMpOworCQkJaWYgKHJjIDwgMCkKKwkJCQlnb3RvIG91dF9mcmVlOworCQkJbXNnYl9lbnF1ZXVlKCZyc3MtPnR4X3F1ZXVlLCBtc2cpOworCQkJcnNzLT5iZmQud2hlbiB8PSBCU0NfRkRfV1JJVEU7CisJCQlicmVhazsKKwkJfQorCQlpZiAocnNzLT5iZmQucHJpdl9uciAhPSBSVFBfUFJJVl9SVFApIHsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKwkJcmMgPSBydHBfZGVjb2RlKG1zZywgcnMtPnJlY2VpdmUuY2FsbHJlZiwgJm5ld19tc2cpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBvdXRfZnJlZTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCW1zZ2JfZW5xdWV1ZSgmcnMtPnJlY2VpdmUubmV0LT51cHF1ZXVlLCBuZXdfbXNnKTsKKwkJYnJlYWs7CisKKwljYXNlIFJUUF9OT05FOiAvKiBpZiBzb2NrZXQgZXhpc3RzLCBidXQgZGlzYWJsZWQgYnkgYXBwICovCisJCW1zZ2JfZnJlZShtc2cpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWU6CisJbXNnYl9mcmVlKG1zZyk7CisJcmV0dXJuIHJjOworfQorCisvKiB3cml0ZSBmcm9tIHR4X3F1ZXVlIHRvIFJUUC9SVENQIHNvY2tldCAqLworc3RhdGljIGludCBydHBfc29ja2V0X3dyaXRlKHN0cnVjdCBydHBfc29ja2V0ICpycywgc3RydWN0IHJ0cF9zdWJfc29ja2V0ICpyc3MpCit7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlpbnQgd3JpdHRlbjsKKworCW1zZyA9IG1zZ2JfZGVxdWV1ZSgmcnNzLT50eF9xdWV1ZSk7CisJaWYgKCFtc2cpIHsKKwkJcnNzLT5iZmQud2hlbiAmPSB+QlNDX0ZEX1dSSVRFOworCQlyZXR1cm4gMDsKKwl9CisKKwl3cml0dGVuID0gd3JpdGUocnNzLT5iZmQuZmQsIG1zZy0+ZGF0YSwgbXNnLT5sZW4pOworCWlmICh3cml0dGVuIDwgbXNnLT5sZW4pIHsKKwkJTE9HUChETUlCLCBMT0dMX0VSUk9SLCAic2hvcnQgd3JpdGUiKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCXJldHVybiAtRUlPOworCX0KKworCW1zZ2JfZnJlZShtc2cpOworCisJcmV0dXJuIDA7Cit9CisKKworLyogY2FsbGJhY2sgZm9yIHRoZSBzZWxlY3QuYzpiZmRfKiBsYXllciAqLworc3RhdGljIGludCBydHBfYmZkX2NiKHN0cnVjdCBic2NfZmQgKmJmZCwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCBydHBfc29ja2V0ICpycyA9IGJmZC0+ZGF0YTsKKwlzdHJ1Y3QgcnRwX3N1Yl9zb2NrZXQgKnJzczsKKworCXN3aXRjaCAoYmZkLT5wcml2X25yKSB7CisJY2FzZSBSVFBfUFJJVl9SVFA6CisJCXJzcyA9ICZycy0+cnRwOworCQlicmVhazsKKwljYXNlIFJUUF9QUklWX1JUQ1A6CisJCXJzcyA9ICZycy0+cnRjcDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGZsYWdzICYgQlNDX0ZEX1JFQUQpCisJCXJ0cF9zb2NrZXRfcmVhZChycywgcnNzKTsKKworCWlmIChmbGFncyAmIEJTQ19GRF9XUklURSkKKwkJcnRwX3NvY2tldF93cml0ZShycywgcnNzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpbml0X3JzcyhzdHJ1Y3QgcnRwX3N1Yl9zb2NrZXQgKnJzcywKKwkJICAgICBzdHJ1Y3QgcnRwX3NvY2tldCAqcnMsIGludCBmZCwgaW50IHByaXZfbnIpCit7CisJLyogaW5pdGlhbGl6ZSBiZmQgKi8KKwlyc3MtPmJmZC5mZCA9IGZkOworCXJzcy0+YmZkLmRhdGEgPSByczsKKwlyc3MtPmJmZC5wcml2X25yID0gcHJpdl9ucjsKKwlyc3MtPmJmZC5jYiA9IHJ0cF9iZmRfY2I7Cit9CisKK3N0cnVjdCBydHBfc29ja2V0ICpydHBfc29ja2V0X2NyZWF0ZSh2b2lkKQoreworCWludCByYzsKKwlzdHJ1Y3QgcnRwX3NvY2tldCAqcnM7CisKKwlERUJVR1AoRE1VWCwgInJ0cF9zb2NrZXRfY3JlYXRlKCk6ICIpOworCisJcnMgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBydHBfc29ja2V0KTsKKwlpZiAoIXJzKQorCQlyZXR1cm4gTlVMTDsKKworCUlOSVRfTExJU1RfSEVBRCgmcnMtPnJ0cC50eF9xdWV1ZSk7CisJSU5JVF9MTElTVF9IRUFEKCZycy0+cnRjcC50eF9xdWV1ZSk7CisKKwlyYyA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBvdXRfZnJlZTsKKworCWluaXRfcnNzKCZycy0+cnRwLCBycywgcmMsIFJUUF9QUklWX1JUUCk7CisJcmMgPSBic2NfcmVnaXN0ZXJfZmQoJnJzLT5ydHAuYmZkKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIG91dF9ydHBfc29ja2V0OworCisJcmMgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19VRFApOworCWlmIChyYyA8IDApCisJCWdvdG8gb3V0X3J0cF9iZmQ7CisKKwlpbml0X3JzcygmcnMtPnJ0Y3AsIHJzLCByYywgUlRQX1BSSVZfUlRDUCk7CisJcmMgPSBic2NfcmVnaXN0ZXJfZmQoJnJzLT5ydGNwLmJmZCk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBvdXRfcnRjcF9zb2NrZXQ7CisKKwlERUJVR1BDKERNVVgsICJzdWNjZXNzXG4iKTsKKworCXJjID0gcnRwX3NvY2tldF9iaW5kKHJzLCBJTkFERFJfQU5ZKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIG91dF9ydGNwX2JmZDsKKworCXJldHVybiByczsKKworb3V0X3J0Y3BfYmZkOgorCWJzY191bnJlZ2lzdGVyX2ZkKCZycy0+cnRjcC5iZmQpOworb3V0X3J0Y3Bfc29ja2V0OgorCWNsb3NlKHJzLT5ydGNwLmJmZC5mZCk7CitvdXRfcnRwX2JmZDoKKwlic2NfdW5yZWdpc3Rlcl9mZCgmcnMtPnJ0cC5iZmQpOworb3V0X3J0cF9zb2NrZXQ6CisJY2xvc2UocnMtPnJ0cC5iZmQuZmQpOworb3V0X2ZyZWU6CisJdGFsbG9jX2ZyZWUocnMpOworCURFQlVHUEMoRE1VWCwgImZhaWxlZFxuIik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgcnRwX3N1Yl9zb2NrZXRfYmluZChzdHJ1Y3QgcnRwX3N1Yl9zb2NrZXQgKnJzcywgdV9pbnQzMl90IGlwLAorCQkJCXVfaW50MTZfdCBwb3J0KQoreworCWludCByYzsKKwlzb2NrbGVuX3QgYWxlbiA9IHNpemVvZihyc3MtPnNpbl9sb2NhbCk7CisKKwlyc3MtPnNpbl9sb2NhbC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlyc3MtPnNpbl9sb2NhbC5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChpcCk7CisJcnNzLT5zaW5fbG9jYWwuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKwlyc3MtPmJmZC53aGVuIHw9IEJTQ19GRF9SRUFEOworCisJcmMgPSBiaW5kKHJzcy0+YmZkLmZkLCAoc3RydWN0IHNvY2thZGRyICopJnJzcy0+c2luX2xvY2FsLAorCQkgIHNpemVvZihyc3MtPnNpbl9sb2NhbCkpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCS8qIHJldHJpZXZlIHRoZSBhZGRyZXNzIHdlIGFjdHVhbGx5IGJvdW5kIHRvLCBpbiBjYXNlIHdlCisJICogcGFzc2VkIElOQUREUl9BTlkgYXMgSVAgYWRkcmVzcyAqLworCXJldHVybiBnZXRzb2NrbmFtZShyc3MtPmJmZC5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZyc3MtPnNpbl9sb2NhbCwKKwkJCSAgICZhbGVuKTsKK30KKworI2RlZmluZSBSVFBfUE9SVF9CQVNFCTMwMDAwCitzdGF0aWMgdW5zaWduZWQgaW50IG5leHRfdWRwX3BvcnQgPSBSVFBfUE9SVF9CQVNFOworCisvKiBiaW5kIGEgUlRQIHNvY2tldCB0byBhIGxvY2FsIGFkZHJlc3MgKi8KK2ludCBydHBfc29ja2V0X2JpbmQoc3RydWN0IHJ0cF9zb2NrZXQgKnJzLCB1X2ludDMyX3QgaXApCit7CisJaW50IHJjID0gLUVJTzsKKwlzdHJ1Y3QgaW5fYWRkciBpYTsKKworCWlhLnNfYWRkciA9IGh0b25sKGlwKTsKKwlERUJVR1AoRE1VWCwgInJ0cF9zb2NrZXRfYmluZChycz0lcCwgSVA9JXMpOiAiLCBycywKKwkJaW5ldF9udG9hKGlhKSk7CisKKwkvKiB0cnkgdG8gYmluZCB0byBhIGNvbnNlY3V0aXZlIHBhaXIgb2YgcG9ydHMgKi8KKwlmb3IgKG5leHRfdWRwX3BvcnQgPSBuZXh0X3VkcF9wb3J0ICUgMHhmZmZmOworCSAgICAgbmV4dF91ZHBfcG9ydCA8IDB4ZmZmZjsgbmV4dF91ZHBfcG9ydCArPSAyKSB7CisJCXJjID0gcnRwX3N1Yl9zb2NrZXRfYmluZCgmcnMtPnJ0cCwgaXAsIG5leHRfdWRwX3BvcnQpOworCQlpZiAocmMgIT0gMCkKKwkJCWNvbnRpbnVlOworCisJCXJjID0gcnRwX3N1Yl9zb2NrZXRfYmluZCgmcnMtPnJ0Y3AsIGlwLCBuZXh0X3VkcF9wb3J0KzEpOworCQlpZiAocmMgPT0gMCkKKwkJCWJyZWFrOworCX0KKwlpZiAocmMgPCAwKSB7CisJCURFQlVHUEMoRE1VWCwgImZhaWxlZFxuIik7CisJCXJldHVybiByYzsKKwl9CisKKwlpYS5zX2FkZHIgPSBycy0+cnRwLnNpbl9sb2NhbC5zaW5fYWRkci5zX2FkZHI7CisJREVCVUdQQyhETVVYLCAiQk9VTkRfSVA9JXMsIEJPVU5EX1BPUlQ9JXVcbiIsCisJCWluZXRfbnRvYShpYSksIG50b2hzKHJzLT5ydHAuc2luX2xvY2FsLnNpbl9wb3J0KSk7CisJcmV0dXJuIG50b2hzKHJzLT5ydHAuc2luX2xvY2FsLnNpbl9wb3J0KTsKK30KKworc3RhdGljIGludCBydHBfc3ViX3NvY2tldF9jb25uZWN0KHN0cnVjdCBydHBfc3ViX3NvY2tldCAqcnNzLAorCQkJCSAgdV9pbnQzMl90IGlwLCB1X2ludDE2X3QgcG9ydCkKK3sKKwlpbnQgcmM7CisJc29ja2xlbl90IGFsZW4gPSBzaXplb2YocnNzLT5zaW5fbG9jYWwpOworCisJcnNzLT5zaW5fcmVtb3RlLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXJzcy0+c2luX3JlbW90ZS5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChpcCk7CisJcnNzLT5zaW5fcmVtb3RlLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisKKwlyYyA9IGNvbm5lY3QocnNzLT5iZmQuZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnJzcy0+c2luX3JlbW90ZSwKKwkJICAgICBzaXplb2YocnNzLT5zaW5fcmVtb3RlKSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIGdldHNvY2tuYW1lKHJzcy0+YmZkLmZkLCAoc3RydWN0IHNvY2thZGRyICopJnJzcy0+c2luX2xvY2FsLAorCQkJICAgJmFsZW4pOworfQorCisvKiAnY29ubmVjdCcgYSBSVFAgc29ja2V0IHRvIGEgcmVtb3RlIHBlZXIgKi8KK2ludCBydHBfc29ja2V0X2Nvbm5lY3Qoc3RydWN0IHJ0cF9zb2NrZXQgKnJzLCB1X2ludDMyX3QgaXAsIHVfaW50MTZfdCBwb3J0KQoreworCWludCByYzsKKwlzdHJ1Y3QgaW5fYWRkciBpYTsKKworCWlhLnNfYWRkciA9IGh0b25sKGlwKTsKKwlERUJVR1AoRE1VWCwgInJ0cF9zb2NrZXRfY29ubmVjdChycz0lcCwgaXA9JXMsIHBvcnQ9JXUpXG4iLAorCQlycywgaW5ldF9udG9hKGlhKSwgcG9ydCk7CisKKwlyYyA9IHJ0cF9zdWJfc29ja2V0X2Nvbm5lY3QoJnJzLT5ydHAsIGlwLCBwb3J0KTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gcnRwX3N1Yl9zb2NrZXRfY29ubmVjdCgmcnMtPnJ0Y3AsIGlwLCBwb3J0KzEpOworfQorCisvKiBiaW5kIHR3byBSVFAvUlRDUCBzb2NrZXRzIHRvZ2V0aGVyICovCitpbnQgcnRwX3NvY2tldF9wcm94eShzdHJ1Y3QgcnRwX3NvY2tldCAqdGhpcywgc3RydWN0IHJ0cF9zb2NrZXQgKm90aGVyKQoreworCURFQlVHUChETVVYLCAicnRwX3NvY2tldF9wcm94eSh0aGlzPSVwLCBvdGhlcj0lcClcbiIsCisJCXRoaXMsIG90aGVyKTsKKworCXRoaXMtPnJ4X2FjdGlvbiA9IFJUUF9QUk9YWTsKKwl0aGlzLT5wcm94eS5vdGhlcl9zb2NrID0gb3RoZXI7CisKKwlvdGhlci0+cnhfYWN0aW9uID0gUlRQX1BST1hZOworCW90aGVyLT5wcm94eS5vdGhlcl9zb2NrID0gdGhpczsKKworCXJldHVybiAwOworfQorCisvKiBiaW5kIFJUUC9SVENQIHNvY2tldCB0byBhcHBsaWNhdGlvbiAqLworaW50IHJ0cF9zb2NrZXRfdXBzdHJlYW0oc3RydWN0IHJ0cF9zb2NrZXQgKnRoaXMsIHN0cnVjdCBnc21fbmV0d29yayAqbmV0LAorCQkJdV9pbnQzMl90IGNhbGxyZWYpCit7CisJREVCVUdQKERNVVgsICJydHBfc29ja2V0X3Byb3h5KHRoaXM9JXAsIGNhbGxyZWY9JXUpXG4iLAorCQl0aGlzLCBjYWxscmVmKTsKKworCWlmIChjYWxscmVmKSB7CisJCXRoaXMtPnJ4X2FjdGlvbiA9IFJUUF9SRUNWX1VQU1RSRUFNOworCQl0aGlzLT5yZWNlaXZlLm5ldCA9IG5ldDsKKwkJdGhpcy0+cmVjZWl2ZS5jYWxscmVmID0gY2FsbHJlZjsKKwl9IGVsc2UKKwkJdGhpcy0+cnhfYWN0aW9uID0gUlRQX05PTkU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV90eF9xdWV1ZShzdHJ1Y3QgcnRwX3N1Yl9zb2NrZXQgKnJzcykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCQorCXdoaWxlICgobXNnID0gbXNnYl9kZXF1ZXVlKCZyc3MtPnR4X3F1ZXVlKSkpCisJCW1zZ2JfZnJlZShtc2cpOworfQorCitpbnQgcnRwX3NvY2tldF9mcmVlKHN0cnVjdCBydHBfc29ja2V0ICpycykKK3sKKwlERUJVR1AoRE1VWCwgInJ0cF9zb2NrZXRfZnJlZShycz0lcClcbiIsIHJzKTsKKworCS8qIG1ha2Ugc3VyZSB3ZSBkb24ndCBsZWF2ZSByZWZlcmVuY2VzIGRhbmdsaW5nIHRvIHVzICovCisJaWYgKHJzLT5yeF9hY3Rpb24gPT0gUlRQX1BST1hZICYmCisJICAgIHJzLT5wcm94eS5vdGhlcl9zb2NrKQorCQlycy0+cHJveHkub3RoZXJfc29jay0+cHJveHkub3RoZXJfc29jayA9IE5VTEw7CisKKwlic2NfdW5yZWdpc3Rlcl9mZCgmcnMtPnJ0cC5iZmQpOworCWNsb3NlKHJzLT5ydHAuYmZkLmZkKTsKKwlmcmVlX3R4X3F1ZXVlKCZycy0+cnRwKTsKKworCWJzY191bnJlZ2lzdGVyX2ZkKCZycy0+cnRjcC5iZmQpOworCWNsb3NlKHJzLT5ydGNwLmJmZC5mZCk7CisJZnJlZV90eF9xdWV1ZSgmcnMtPnJ0Y3ApOworCisJdGFsbG9jX2ZyZWUocnMpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9zY2NwL3NjY3AuYyBiL29wZW5ic2Mvc3JjL3NjY3Avc2NjcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMTg2MTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9zY2NwL3NjY3AuYwpAQCAtMCwwICsxLDEzNTcgQEAKKy8qCisgKiBTQ0NQIG1hbmFnZW1lbnQgY29kZQorICoKKyAqIChDKSAyMDA5LCAyMDEwIGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIChDKSAyMDA5LCAyMDEwIGJ5IE9uLVdhdmVzCisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKKyNpbmNsdWRlIDxzY2NwL3NjY3AuaD4KKworCitzdGF0aWMgdm9pZCAqdGFsbF9zY2NwX2N0eDsKK3N0YXRpYyBMTElTVF9IRUFEKHNjY3BfY29ubmVjdGlvbnMpOworCisjZGVmaW5lIFNDQ1BfTVNHX1NJWkUgNDA5NgorI2RlZmluZSBTQ0NQX01TR19IRUFEUk9PTSAxMjgKKworLyogZ2xvYmFsIGRhdGEgKi8KK2NvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwIHNjY3Bfc3NuX2Jzc2FwID0geworCS5zY2NwX2ZhbWlseQk9IDAsCisJLnNjY3Bfc3NuCT0gU0NDUF9TU05fQlNTQVAsCit9OworCitzdHJ1Y3Qgc2NjcF9zeXN0ZW0geworCS8qIGxheWVyMyAtPiBsYXllcjIgKi8KKwl2b2lkICgqd3JpdGVfZGF0YSkoc3RydWN0IG1zZ2IgKmRhdGEsIHZvaWQgKmNvbnRleHQpOworCXZvaWQgKndyaXRlX2NvbnRleHQ7Cit9OworCisKK3N0YXRpYyBzdHJ1Y3Qgc2NjcF9zeXN0ZW0gc2NjcF9zeXN0ZW0gPSB7CisJLndyaXRlX2RhdGEgPSBOVUxMLAorfTsKKworc3RydWN0IHNjY3BfZGF0YV9jYWxsYmFjayB7CisJLyogY29ubmVjdGlvbiBiYXNlZCAqLworCWludCAoKmFjY2VwdF9jYikoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqLCB2b2lkICopOworCXZvaWQgKmFjY2VwdF9jb250ZXh0OworCisJLyogY29ubmVjdGlvbiBsZXNzICovCisJaW50ICgqcmVhZF9jYikoc3RydWN0IG1zZ2IgKiwgdW5zaWduZWQgaW50LCB2b2lkICopOworCXZvaWQgKnJlYWRfY29udGV4dDsKKworCXVfaW50OF90IHNzbjsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBjYWxsYmFjazsKK307CisKK3N0YXRpYyBMTElTVF9IRUFEKHNjY3BfY2FsbGJhY2tzKTsKKworc3RhdGljIHN0cnVjdCBzY2NwX2RhdGFfY2FsbGJhY2sgKl9maW5kX3Nzbih1X2ludDhfdCBzc24pCit7CisJc3RydWN0IHNjY3BfZGF0YV9jYWxsYmFjayAqY2I7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjYiwgJnNjY3BfY2FsbGJhY2tzLCBjYWxsYmFjaykgeworCQlpZiAoY2ItPnNzbiA9PSBzc24pCisJCQlyZXR1cm4gY2I7CisJfQorCisJLyogbmVlZCB0byBhZGQgb25lICovCisJY2IgPSB0YWxsb2NfemVybyh0YWxsX3NjY3BfY3R4LCBzdHJ1Y3Qgc2NjcF9kYXRhX2NhbGxiYWNrKTsKKwlpZiAoIWNiKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gYWxsb2NhdGUgc2NjcCBjYWxsYmFjay5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwljYi0+c3NuID0gc3NuOworCWxsaXN0X2FkZF90YWlsKCZjYi0+Y2FsbGJhY2ssICZzY2NwX2NhbGxiYWNrcyk7CisJcmV0dXJuIGNiOworfQorCisKK3N0YXRpYyB2b2lkIF9zZW5kX21zZyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXNjY3Bfc3lzdGVtLndyaXRlX2RhdGEobXNnLCBzY2NwX3N5c3RlbS53cml0ZV9jb250ZXh0KTsKK30KKworLyoKKyAqIHBhcnNpbmcgcm91dGluZXMKKyAqLworc3RhdGljIGludCBjb3B5X2FkZHJlc3Moc3RydWN0IHNjY3BfYWRkcmVzcyAqYWRkciwgdV9pbnQ4X3Qgb2Zmc2V0LCBzdHJ1Y3QgbXNnYiAqbXNnYikKK3sKKwlzdHJ1Y3Qgc2NjcF9jYWxsZWRfcGFydHlfYWRkcmVzcyAqcGFydHk7CisKKwlpbnQgcm9vbSA9IG1zZ2JfbDJsZW4obXNnYikgLSBvZmZzZXQ7CisJdV9pbnQ4X3QgcmVhZCA9IDA7CisJdV9pbnQ4X3QgbGVuZ3RoOworCisJaWYgKHJvb20gPD0gMCkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiTm90IGVub3VnaCByb29tIGZvciBhbiBhZGRyZXNzOiAldVxuIiwgcm9vbSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlsZW5ndGggPSBtc2diLT5sMmhbb2Zmc2V0XTsKKwlpZiAocm9vbSA8PSBsZW5ndGgpIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIk5vdCBlbm91Z2ggcm9vbSBmb3Igb3B0aW9uYWwgZGF0YSAldSAldVxuIiwgcm9vbSwgbGVuZ3RoKTsKKwkJcmV0dXJuIC0xOworCX0KKworCisJcGFydHkgPSAoc3RydWN0IHNjY3BfY2FsbGVkX3BhcnR5X2FkZHJlc3MgKikobXNnYi0+bDJoICsgb2Zmc2V0ICsgMSk7CisJaWYgKHBhcnR5LT5wb2ludF9jb2RlX2luZGljYXRvcikgeworCQlpZiAobGVuZ3RoIDw9IHJlYWQgKyAyKSB7CisJCSAgICBMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiUE9JIGRvZXMgbm90IGZpdCAldVxuIiwgbGVuZ3RoKTsKKwkJICAgIHJldHVybiAtMTsKKwkJfQorCisKKwkJbWVtY3B5KCZhZGRyLT5wb2ksICZwYXJ0eS0+ZGF0YVtyZWFkXSwgMik7CisJCXJlYWQgKz0gMjsKKwl9CisKKwlpZiAocGFydHktPnNzbl9pbmRpY2F0b3IpIHsKKwkJaWYgKGxlbmd0aCA8PSByZWFkICsgMSkgeworCQkgICAgTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIlNTTiBkb2VzIG5vdCBmaXQgJXVcbiIsIGxlbmd0aCk7CisJCSAgICByZXR1cm4gLTE7CisJCX0KKworCQlhZGRyLT5zc24gPSBwYXJ0eS0+ZGF0YVtyZWFkXTsKKwkJcmVhZCArPSAxOworCX0KKworCWlmIChwYXJ0eS0+Z2xvYmFsX3RpdGxlX2luZGljYXRvcikgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiR1RJIG5vdCBzdXBwb3J0ZWQgJXVcbiIsICoodV9pbnQ4X3QgKilwYXJ0eSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlhZGRyLT5hZGRyZXNzID0gKnBhcnR5OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoZWNrX2FkZHJlc3Moc3RydWN0IHNjY3BfYWRkcmVzcyAqYWRkcikKK3sKKwkvKiBpZ25vcmUgcG9pbnRfY29kZV9pbmRpY2F0b3IuLi4gaXQgc2hvdWxkIGJlIHplcm8uLi4gYnV0ICovCisJaWYgKGFkZHItPmFkZHJlc3Muc3NuX2luZGljYXRvciAhPSAxCisJICAgIHx8IGFkZHItPmFkZHJlc3MuZ2xvYmFsX3RpdGxlX2luZGljYXRvciA9PSAxCisJICAgIHx8IGFkZHItPmFkZHJlc3Mucm91dGluZ19pbmRpY2F0b3IgIT0gMSkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLAorCQkJIkludmFsaWQgY2FsbGVkIGFkZHJlc3MgYWNjb3JkaW5nIHRvIDA4LjA2OiAweCV4IDB4JXhcbiIsCisJCQkqKHVfaW50OF90ICopJmFkZHItPmFkZHJlc3MsIGFkZHItPnNzbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfc2NjcF9wYXJzZV9vcHRpb25hbF9kYXRhKGNvbnN0IGludCBvZmZzZXQsCisJCQkJICAgICBzdHJ1Y3QgbXNnYiAqbXNnYiwgc3RydWN0IHNjY3Bfb3B0aW9uYWxfZGF0YSAqZGF0YSkKK3sKKwl1X2ludDE2X3Qgcm9vbSA9IG1zZ2JfbDJsZW4obXNnYikgLSBvZmZzZXQ7CisJdV9pbnQxNl90IHJlYWQgPSAwOworCisJd2hpbGUgKHJvb20gPiByZWFkKSB7CisJCXVfaW50OF90IHR5cGUgPSBtc2diLT5sMmhbb2Zmc2V0ICsgcmVhZF07CisJCWlmICh0eXBlID09IFNDQ1BfUE5DX0VORF9PRl9PUFRJT05BTCkKKwkJCXJldHVybiAwOworCisJCWlmIChyZWFkICsgMSA+PSByb29tKSB7CisJCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAibm8gcGxhY2UgZm9yIGxlbmd0aFxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXVfaW50OF90IGxlbmd0aCA9IG1zZ2ItPmwyaFtvZmZzZXQgKyByZWFkICsgMV07CisJCXJlYWQgKz0gMiArIGxlbmd0aDsKKworCisJCWlmIChyb29tIDw9IHJlYWQpIHsKKwkJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsCisJCQkgICAgICAgIm5vIHNwYWNlIGZvciB0aGUgZGF0YTogdHlwZTogJWQgcmVhZDogJWQgcm9vbTogJWQgbDI6ICVkXG4iLAorCQkJICAgICAgIHR5cGUsIHJlYWQsIHJvb20sIG1zZ2JfbDJsZW4obXNnYikpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAodHlwZSA9PSBTQ0NQX1BOQ19EQVRBKSB7CisJCQlkYXRhLT5kYXRhX2xlbiA9IGxlbmd0aDsKKwkJCWRhdGEtPmRhdGFfc3RhcnQgPSBvZmZzZXQgKyByZWFkIC0gbGVuZ3RoOworCQl9CisKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK2ludCBfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlcXVlc3Qoc3RydWN0IG1zZ2IgKm1zZ2IsIHN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCAqcmVzdWx0KQoreworCXN0YXRpYyBjb25zdCB1X2ludDMyX3QgaGVhZGVyX3NpemUgPQorCQkJc2l6ZW9mKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVxdWVzdCk7CisJc3RhdGljIGNvbnN0IHVfaW50MzJfdCBvcHRpb25hbF9vZmZzZXQgPQorCQkJb2Zmc2V0b2Yoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZXF1ZXN0LCBvcHRpb25hbF9zdGFydCk7CisJc3RhdGljIGNvbnN0IHVfaW50MzJfdCBjYWxsZWRfb2Zmc2V0ID0KKwkJCW9mZnNldG9mKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVxdWVzdCwgdmFyaWFibGVfY2FsbGVkKTsKKworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVxdWVzdCAqcmVxID0gKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVxdWVzdCAqKW1zZ2ItPmwyaDsKKwlzdHJ1Y3Qgc2NjcF9vcHRpb25hbF9kYXRhIG9wdGlvbmFsX2RhdGE7CisKKwkvKiBoZWFkZXIgY2hlY2sgKi8KKwlpZiAobXNnYl9sMmxlbihtc2diKSA8IGhlYWRlcl9zaXplKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJtc2diIDwgaGVhZGVyX3NpemUgJXUgJXVcbiIsCisJCSAgICAgICAgbXNnYl9sMmxlbihtc2diKSwgaGVhZGVyX3NpemUpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogY29weSBvdXQgdGhlIGNhbGxpbmcgYW5kIGNhbGxlZCBhZGRyZXNzLiBBZGQgdGhlIG9mZnNldCAqLworCWlmIChjb3B5X2FkZHJlc3MoJnJlc3VsdC0+Y2FsbGVkLCBjYWxsZWRfb2Zmc2V0ICsgcmVxLT52YXJpYWJsZV9jYWxsZWQsIG1zZ2IpICE9IDApCisJCXJldHVybiAtMTsKKworCWlmIChjaGVja19hZGRyZXNzKCZyZXN1bHQtPmNhbGxlZCkgIT0gMCkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiSW52YWxpZCBjYWxsZWQgYWRkcmVzcyBhY2NvcmRpbmcgdG8gMDguMDY6IDB4JXggMHgleFxuIiwKKwkJCSoodV9pbnQ4X3QgKikmcmVzdWx0LT5jYWxsZWQuYWRkcmVzcywgcmVzdWx0LT5jYWxsZWQuc3NuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJlc3VsdC0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSA9ICZyZXEtPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7CisKKwkvKgorCSAqIHBhcnNlIG9wdGlvbmFsIGRhdGEuCisJICovCisJbWVtc2V0KCZvcHRpb25hbF9kYXRhLCAwLCBzaXplb2Yob3B0aW9uYWxfZGF0YSkpOworCWlmIChfc2NjcF9wYXJzZV9vcHRpb25hbF9kYXRhKG9wdGlvbmFsX29mZnNldCArIHJlcS0+b3B0aW9uYWxfc3RhcnQsIG1zZ2IsICZvcHRpb25hbF9kYXRhKSAhPSAwKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJwYXJzaW5nIG9mIG9wdGlvbmFsIGRhdGEgZmFpbGVkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAob3B0aW9uYWxfZGF0YS5kYXRhX2xlbiAhPSAwKSB7CisJCW1zZ2ItPmwzaCA9ICZtc2diLT5sMmhbb3B0aW9uYWxfZGF0YS5kYXRhX3N0YXJ0XTsKKwkJcmVzdWx0LT5kYXRhX2xlbiA9IG9wdGlvbmFsX2RhdGEuZGF0YV9sZW47CisJfSBlbHNlIHsKKwkJcmVzdWx0LT5kYXRhX2xlbiA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlbGVhc2VkKHN0cnVjdCBtc2diICptc2diLCBzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgKnJlc3VsdCkKK3sKKwlzdGF0aWMgaW50IGhlYWRlcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZWQpOworCXN0YXRpYyBpbnQgb3B0aW9uYWxfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlZCwgb3B0aW9uYWxfc3RhcnQpOworCisJc3RydWN0IHNjY3Bfb3B0aW9uYWxfZGF0YSBvcHRpb25hbF9kYXRhOworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZWQgKnJscyA9IChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlbGVhc2VkICopIG1zZ2ItPmwyaDsKKworCS8qIHdlIGRvbid0IGhhdmUgZW5vdWdoIHNpemUgZm9yIHRoZSBzdHJ1Y3QgKi8KKwlpZiAobXNnYl9sMmxlbihtc2diKSA8IGhlYWRlcl9zaXplKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJtc2diID4gaGVhZGVyX3NpemUgJXUgJXVcbiIsCisJCSAgICAgICAgbXNnYl9sMmxlbihtc2diKSwgaGVhZGVyX3NpemUpOworCQlyZXR1cm4gLTE7CisJfQorCisJbWVtc2V0KCZvcHRpb25hbF9kYXRhLCAwLCBzaXplb2Yob3B0aW9uYWxfZGF0YSkpOworCWlmIChfc2NjcF9wYXJzZV9vcHRpb25hbF9kYXRhKG9wdGlvbmFsX29mZnNldCArIHJscy0+b3B0aW9uYWxfc3RhcnQsIG1zZ2IsICZvcHRpb25hbF9kYXRhKSAhPSAwKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJwYXJzaW5nIG9mIG9wdGlvbmFsIGRhdGEgZmFpbGVkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXN1bHQtPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UgPSAmcmxzLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCXJlc3VsdC0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlID0gJnJscy0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCisJaWYgKG9wdGlvbmFsX2RhdGEuZGF0YV9sZW4gIT0gMCkgeworCQltc2diLT5sM2ggPSAmbXNnYi0+bDJoW29wdGlvbmFsX2RhdGEuZGF0YV9zdGFydF07CisJCXJlc3VsdC0+ZGF0YV9sZW4gPSBvcHRpb25hbF9kYXRhLmRhdGFfbGVuOworCX0gZWxzZSB7CisJCXJlc3VsdC0+ZGF0YV9sZW4gPSAwOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9yZWZ1c2VkKHN0cnVjdCBtc2diICptc2diLCBzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgKnJlc3VsdCkKK3sKKwlzdGF0aWMgY29uc3QgdV9pbnQzMl90IGhlYWRlcl9zaXplID0KKwkJCXNpemVvZihzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlZnVzZWQpOworCXN0YXRpYyBpbnQgb3B0aW9uYWxfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWZ1c2VkLCBvcHRpb25hbF9zdGFydCk7CisKKwlzdHJ1Y3Qgc2NjcF9vcHRpb25hbF9kYXRhIG9wdGlvbmFsX2RhdGE7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWZ1c2VkICpyZWY7CisKKwkvKiBoZWFkZXIgY2hlY2sgKi8KKwlpZiAobXNnYl9sMmxlbihtc2diKSA8IGhlYWRlcl9zaXplKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJtc2diIDwgaGVhZGVyX3NpemUgJXUgJXVcbiIsCisJCSAgICAgICAgbXNnYl9sMmxlbihtc2diKSwgaGVhZGVyX3NpemUpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmVmID0gKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVmdXNlZCAqKSBtc2diLT5sMmg7CisKKwlyZXN1bHQtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSA9ICZyZWYtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKworCW1lbXNldCgmb3B0aW9uYWxfZGF0YSwgMCwgc2l6ZW9mKG9wdGlvbmFsX2RhdGEpKTsKKwlpZiAoX3NjY3BfcGFyc2Vfb3B0aW9uYWxfZGF0YShvcHRpb25hbF9vZmZzZXQgKyByZWYtPm9wdGlvbmFsX3N0YXJ0LCBtc2diLCAmb3B0aW9uYWxfZGF0YSkgIT0gMCkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAicGFyc2luZyBvZiBvcHRpb25hbCBkYXRhIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogb3B0aW9uYWwgZGF0YSAqLworCWlmIChvcHRpb25hbF9kYXRhLmRhdGFfbGVuICE9IDApIHsKKwkJbXNnYi0+bDNoID0gJm1zZ2ItPmwyaFtvcHRpb25hbF9kYXRhLmRhdGFfc3RhcnRdOworCQlyZXN1bHQtPmRhdGFfbGVuID0gb3B0aW9uYWxfZGF0YS5kYXRhX2xlbjsKKwl9IGVsc2UgeworCQlyZXN1bHQtPmRhdGFfbGVuID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fY29uZmlybShzdHJ1Y3QgbXNnYiAqbXNnYiwgc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0ICpyZXN1bHQpCit7CisJc3RhdGljIHVfaW50MzJfdCBoZWFkZXJfc2l6ZSA9CisJCSAgICBzaXplb2Yoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9jb25maXJtKTsKKwlzdGF0aWMgY29uc3QgdV9pbnQzMl90IG9wdGlvbmFsX29mZnNldCA9CisJCQlvZmZzZXRvZihzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX2NvbmZpcm0sIG9wdGlvbmFsX3N0YXJ0KTsKKworCXN0cnVjdCBzY2NwX29wdGlvbmFsX2RhdGEgb3B0aW9uYWxfZGF0YTsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX2NvbmZpcm0gKmNvbjsKKworCS8qIGhlYWRlciBjaGVjayAqLworCWlmIChtc2diX2wybGVuKG1zZ2IpIDwgaGVhZGVyX3NpemUpIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIm1zZ2IgPCBoZWFkZXJfc2l6ZSAldSAldVxuIiwKKwkJICAgICAgICBtc2diX2wybGVuKG1zZ2IpLCBoZWFkZXJfc2l6ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwljb24gPSAoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9jb25maXJtICopIG1zZ2ItPmwyaDsKKwlyZXN1bHQtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSA9ICZjb24tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKwlyZXN1bHQtPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UgPSAmY29uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCisJbWVtc2V0KCZvcHRpb25hbF9kYXRhLCAwLCBzaXplb2Yob3B0aW9uYWxfZGF0YSkpOworCWlmIChfc2NjcF9wYXJzZV9vcHRpb25hbF9kYXRhKG9wdGlvbmFsX29mZnNldCArIGNvbi0+b3B0aW9uYWxfc3RhcnQsIG1zZ2IsICZvcHRpb25hbF9kYXRhKSAhPSAwKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJwYXJzaW5nIG9mIG9wdGlvbmFsIGRhdGEgZmFpbGVkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAob3B0aW9uYWxfZGF0YS5kYXRhX2xlbiAhPSAwKSB7CisJCW1zZ2ItPmwzaCA9ICZtc2diLT5sMmhbb3B0aW9uYWxfZGF0YS5kYXRhX3N0YXJ0XTsKKwkJcmVzdWx0LT5kYXRhX2xlbiA9IG9wdGlvbmFsX2RhdGEuZGF0YV9sZW47CisJfSBlbHNlIHsKKwkJcmVzdWx0LT5kYXRhX2xlbiA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUoc3RydWN0IG1zZ2IgKm1zZ2IsIHN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCAqcmVzdWx0KQoreworCXN0YXRpYyBpbnQgaGVhZGVyX3NpemUgPSBzaXplb2Yoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlX2NvbXBsZXRlKTsKKworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZSAqY21wbDsKKworCS8qIGhlYWRlciBjaGVjayAqLworCWlmIChtc2diX2wybGVuKG1zZ2IpIDwgaGVhZGVyX3NpemUpIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIm1zZ2IgPCBoZWFkZXJfc2l6ZSAldSAldVxuIiwKKwkJICAgICAgICBtc2diX2wybGVuKG1zZ2IpLCBoZWFkZXJfc2l6ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwljbXBsID0gKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZSAqKSBtc2diLT5sMmg7CisJcmVzdWx0LT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlID0gJmNtcGwtPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7CisJcmVzdWx0LT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UgPSAmY21wbC0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBfc2NjcF9wYXJzZV9jb25uZWN0aW9uX2R0MShzdHJ1Y3QgbXNnYiAqbXNnYiwgc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0ICpyZXN1bHQpCit7CisJc3RhdGljIGludCBoZWFkZXJfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2NjcF9kYXRhX2Zvcm0xKTsKKwlzdGF0aWMgaW50IHZhcmlhYmxlX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzY2NwX2RhdGFfZm9ybTEsIHZhcmlhYmxlX3N0YXJ0KTsKKworCXN0cnVjdCBzY2NwX2RhdGFfZm9ybTEgKmR0MSA9IChzdHJ1Y3Qgc2NjcF9kYXRhX2Zvcm0xICopbXNnYi0+bDJoOworCisJLyogd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggc2l6ZSBmb3IgdGhlIHN0cnVjdCAqLworCWlmIChtc2diX2wybGVuKG1zZ2IpIDwgaGVhZGVyX3NpemUpIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIm1zZ2IgPiBoZWFkZXJfc2l6ZSAldSAldVxuIiwKKwkJICAgICAgICBtc2diX2wybGVuKG1zZ2IpLCBoZWFkZXJfc2l6ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoZHQxLT5zZWdtZW50aW5nICE9IDApIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIlRoaXMgcGFja2V0IGhhcyBzZWdtZW50aW5nLCBub3Qgc3VwcG9ydGVkOiAlZFxuIiwgZHQxLT5zZWdtZW50aW5nKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJlc3VsdC0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlID0gJmR0MS0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCisJLyogc29tZSBtb3JlICBzaXplIGNoZWNrcyBpbiBoZXJlICovCisJaWYgKG1zZ2JfbDJsZW4obXNnYikgPCB2YXJpYWJsZV9vZmZzZXQgKyBkdDEtPnZhcmlhYmxlX3N0YXJ0ICsgMSkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiTm90IGVub3VnaCBzcGFjZSBmb3IgdmFyaWFibGUgc3RhcnQ6ICV1ICV1XG4iLAorCQkJbXNnYl9sMmxlbihtc2diKSwgZHQxLT52YXJpYWJsZV9zdGFydCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXN1bHQtPmRhdGFfbGVuID0gbXNnYi0+bDJoW3ZhcmlhYmxlX29mZnNldCArIGR0MS0+dmFyaWFibGVfc3RhcnRdOworCW1zZ2ItPmwzaCA9ICZtc2diLT5sMmhbZHQxLT52YXJpYWJsZV9zdGFydCArIHZhcmlhYmxlX29mZnNldCArIDFdOworCisJaWYgKG1zZ2JfbDNsZW4obXNnYikgPCByZXN1bHQtPmRhdGFfbGVuKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJOb3QgZW5vdWdoIHJvb20gZm9yIHRoZSBwYXlsb2FkOiAldSAldVxuIiwKKwkJCW1zZ2JfbDNsZW4obXNnYiksIHJlc3VsdC0+ZGF0YV9sZW4pOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBfc2NjcF9wYXJzZV91ZHQoc3RydWN0IG1zZ2IgKm1zZ2IsIHN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCAqcmVzdWx0KQoreworCXN0YXRpYyBjb25zdCB1X2ludDMyX3QgaGVhZGVyX3NpemUgPSBzaXplb2Yoc3RydWN0IHNjY3BfZGF0YV91bml0ZGF0YSk7CisJc3RhdGljIGNvbnN0IHVfaW50MzJfdCBjYWxsZWRfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHNjY3BfZGF0YV91bml0ZGF0YSwgdmFyaWFibGVfY2FsbGVkKTsKKwlzdGF0aWMgY29uc3QgdV9pbnQzMl90IGNhbGxpbmdfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHNjY3BfZGF0YV91bml0ZGF0YSwgdmFyaWFibGVfY2FsbGluZyk7CisJc3RhdGljIGNvbnN0IHVfaW50MzJfdCBkYXRhX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzY2NwX2RhdGFfdW5pdGRhdGEsIHZhcmlhYmxlX2RhdGEpOworCisJc3RydWN0IHNjY3BfZGF0YV91bml0ZGF0YSAqdWR0ID0gKHN0cnVjdCBzY2NwX2RhdGFfdW5pdGRhdGEgKiltc2diLT5sMmg7CisKKwlpZiAobXNnYl9sMmxlbihtc2diKSA8IGhlYWRlcl9zaXplKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJtc2diIDwgaGVhZGVyX3NpemUgJXUgJXVcbiIsCisJCSAgICAgICAgbXNnYl9sMmxlbihtc2diKSwgaGVhZGVyX3NpemUpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogY29weSBvdXQgdGhlIGNhbGxpbmcgYW5kIGNhbGxlZCBhZGRyZXNzLiBBZGQgdGhlIG9mZiAqLworCWlmIChjb3B5X2FkZHJlc3MoJnJlc3VsdC0+Y2FsbGVkLCBjYWxsZWRfb2Zmc2V0ICsgdWR0LT52YXJpYWJsZV9jYWxsZWQsIG1zZ2IpICE9IDApCisJCXJldHVybiAtMTsKKworCWlmIChjaGVja19hZGRyZXNzKCZyZXN1bHQtPmNhbGxlZCkgIT0gMCkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiSW52YWxpZCBjYWxsZWQgYWRkcmVzcyBhY2NvcmRpbmcgdG8gMDguMDY6IDB4JXggMHgleFxuIiwKKwkJCSoodV9pbnQ4X3QgKikmcmVzdWx0LT5jYWxsZWQuYWRkcmVzcywgcmVzdWx0LT5jYWxsZWQuc3NuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChjb3B5X2FkZHJlc3MoJnJlc3VsdC0+Y2FsbGluZywgY2FsbGluZ19vZmZzZXQgKyB1ZHQtPnZhcmlhYmxlX2NhbGxpbmcsIG1zZ2IpICE9IDApCisJCXJldHVybiAtMTsKKworCWlmIChjaGVja19hZGRyZXNzKCZyZXN1bHQtPmNhbGxpbmcpICE9IDApIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIkludmFsaWQgY2FsbGVkIGFkZHJlc3MgYWNjb3JkaW5nIHRvIDA4LjA2OiAweCV4IDB4JXhcbiIsCisJCQkqKHVfaW50OF90ICopJnJlc3VsdC0+Y2FsbGVkLmFkZHJlc3MsIHJlc3VsdC0+Y2FsbGVkLnNzbik7CisJfQorCisJLyogd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggc2l6ZSBmb3IgdGhlIGRhdGEgKi8KKwlpZiAobXNnYl9sMmxlbihtc2diKSA8IGRhdGFfb2Zmc2V0ICsgdWR0LT52YXJpYWJsZV9kYXRhICsgMSkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAibXNnYiA8IGhlYWRlciArIG9mZnNldCAldSAldSAldVxuIiwKKwkJCW1zZ2JfbDJsZW4obXNnYiksIGhlYWRlcl9zaXplLCB1ZHQtPnZhcmlhYmxlX2RhdGEpOworCQlyZXR1cm4gLTE7CisJfQorCisKKwltc2diLT5sM2ggPSAmdWR0LT5kYXRhW3VkdC0+dmFyaWFibGVfZGF0YV07CisJcmVzdWx0LT5kYXRhX2xlbiA9IG1zZ2JfbDNsZW4obXNnYik7CisKKwlpZiAobXNnYl9sM2xlbihtc2diKSAhPSAgbXNnYi0+bDNoWy0xXSkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAibXNnYiBpcyB0cnVuY2F0ZWQgaXM6ICV1IHNob3VsZDogJXVcbiIsCisJCQltc2diX2wzbGVuKG1zZ2IpLCBtc2diLT5sM2hbLTFdKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9zY2NwX3BhcnNlX2l0KHN0cnVjdCBtc2diICptc2diLCBzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgKnJlc3VsdCkKK3sKKwlzdGF0aWMgY29uc3QgdV9pbnQzMl90IGhlYWRlcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBzY2NwX2RhdGFfaXQpOworCisJc3RydWN0IHNjY3BfZGF0YV9pdCAqaXQ7CisKKwlpZiAobXNnYl9sMmxlbihtc2diKSA8IGhlYWRlcl9zaXplKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJtc2diIDwgaGVhZGVyX3NpemUgJXUgJXVcbiIsCisJCSAgICAgICAgbXNnYl9sMmxlbihtc2diKSwgaGVhZGVyX3NpemUpOworCQlyZXR1cm4gLTE7CisJfQorCisJaXQgPSAoc3RydWN0IHNjY3BfZGF0YV9pdCAqKSBtc2diLT5sMmg7CisJcmVzdWx0LT5kYXRhX2xlbiA9IDA7CisJcmVzdWx0LT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlID0gJml0LT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCXJlc3VsdC0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlID0gJml0LT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3NjY3BfcGFyc2VfZXJyKHN0cnVjdCBtc2diICptc2diLCBzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgKnJlc3VsdCkKK3sKKwlzdGF0aWMgY29uc3QgdV9pbnQzMl90IGhlYWRlcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBzY2NwX3Byb3RvX2Vycik7CisKKwlzdHJ1Y3Qgc2NjcF9wcm90b19lcnIgKmVycjsKKworCWlmIChtc2diX2wybGVuKG1zZ2IpIDwgaGVhZGVyX3NpemUpIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIm1zZ2IgPCBoZWFkZXJfc2l6ZSAldSAldVxuIiwKKwkJICAgICBtc2diX2wybGVuKG1zZ2IpLCBoZWFkZXJfc2l6ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwllcnIgPSAoc3RydWN0IHNjY3BfcHJvdG9fZXJyICopIG1zZ2ItPmwyaDsKKwlyZXN1bHQtPmRhdGFfbGVuID0gMDsKKwlyZXN1bHQtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSA9ICZlcnItPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNlbmQgVURULiBDdXJyZW50bHkgd2UgaGF2ZSBhIGZpeGVkIGFkZHJlc3MuLi4KKyAqLworc3RhdGljIGludCBfc2NjcF9zZW5kX2RhdGEoaW50IGNsYXNzLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCAqaW4sCisJCQkgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCAqb3V0LCBzdHJ1Y3QgbXNnYiAqcGF5bG9hZCkKK3sKKwlzdHJ1Y3Qgc2NjcF9kYXRhX3VuaXRkYXRhICp1ZHQ7CisJdV9pbnQ4X3QgKmRhdGE7CisKKwlpZiAobXNnYl9sM2xlbihwYXlsb2FkKSA+IDI1NikgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiVGhlIHBheWxvYWQgaXMgdG9vIGJpZyBmb3Igb25lIHVkdFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvY19oZWFkcm9vbShTQ0NQX01TR19TSVpFLAorCQkJCQkgICAgICAgU0NDUF9NU0dfSEVBRFJPT00sICJzY2NwOiB1ZHQiKTsKKwltc2ctPmwyaCA9ICZtc2ctPmRhdGFbMF07CisJdWR0ID0gKHN0cnVjdCBzY2NwX2RhdGFfdW5pdGRhdGEgKiltc2diX3B1dChtc2csIHNpemVvZigqdWR0KSk7CisKKwl1ZHQtPnR5cGUgPSBTQ0NQX01TR19UWVBFX1VEVDsKKwl1ZHQtPnByb3RvX2NsYXNzID0gY2xhc3M7CisJdWR0LT52YXJpYWJsZV9jYWxsZWQgPSAzOworCXVkdC0+dmFyaWFibGVfY2FsbGluZyA9IDU7CisJdWR0LT52YXJpYWJsZV9kYXRhID0gNzsKKworCS8qIGZvciB2YXJpYWJsZSBkYXRhIHdlIHN0YXJ0IHdpdGggYSBzaXplIGFuZCB0aGUgZGF0YSAqLworCWRhdGEgPSBtc2diX3B1dChtc2csIDEgKyAyKTsKKwlkYXRhWzBdID0gMjsKKwlkYXRhWzFdID0gMHg0MjsKKwlkYXRhWzJdID0gb3V0LT5zY2NwX3NzbjsKKworCWRhdGEgPSBtc2diX3B1dChtc2csIDEgKyAyKTsKKwlkYXRhWzBdID0gMjsKKwlkYXRhWzFdID0gMHg0MjsKKwlkYXRhWzJdID0gaW4tPnNjY3Bfc3NuOworCisJLyogY29weSB0aGUgcGF5bG9hZCAqLworCWRhdGEgPSBtc2diX3B1dChtc2csIDEgKyBtc2diX2wzbGVuKHBheWxvYWQpKTsKKwlkYXRhWzBdID0gbXNnYl9sM2xlbihwYXlsb2FkKTsKKwltZW1jcHkoJmRhdGFbMV0sIHBheWxvYWQtPmwzaCwgbXNnYl9sM2xlbihwYXlsb2FkKSk7CisKKwlfc2VuZF9tc2cobXNnKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfc2NjcF9oYW5kbGVfcmVhZChzdHJ1Y3QgbXNnYiAqbXNnYikKK3sKKwlzdHJ1Y3Qgc2NjcF9kYXRhX2NhbGxiYWNrICpjYjsKKwlzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgcmVzdWx0OworCisJaWYgKF9zY2NwX3BhcnNlX3VkdChtc2diLCAmcmVzdWx0KSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwljYiA9IF9maW5kX3NzbihyZXN1bHQuY2FsbGVkLnNzbik7CisJaWYgKCFjYiB8fCAhY2ItPnJlYWRfY2IpIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIk5vIHJvdXRpbmcgZm9yIFVEVCBmb3IgY2FsbGVkIFNTTjogJXVcbiIsIHJlc3VsdC5jYWxsZWQuc3NuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIHNhbml0eSBjaGVjayAqLworCXJldHVybiBjYi0+cmVhZF9jYihtc2diLCBtc2diX2wzbGVuKG1zZ2IpLCBjYi0+cmVhZF9jb250ZXh0KTsKK30KKworLyoKKyAqIGhhbmRsZSBjb25uZWN0aW9uIG9yaWVudGF0ZWQgbWV0aG9kcworICovCitzdGF0aWMgaW50IHNvdXJjZV9sb2NhbF9yZWZlcmVuY2VfaXNfZnJlZShzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlICpyZWZlcmVuY2UpCit7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3Rpb24sICZzY2NwX2Nvbm5lY3Rpb25zLCBsaXN0KSB7CisJCWlmIChtZW1jbXAocmVmZXJlbmNlLCAmY29ubmVjdGlvbi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwgc2l6ZW9mKCpyZWZlcmVuY2UpKSA9PSAwKQorCQkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZV9pc19mcmVlKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgKnJlZmVyZW5jZSkKK3sKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdGlvbiwgJnNjY3BfY29ubmVjdGlvbnMsIGxpc3QpIHsKKwkJaWYgKG1lbWNtcChyZWZlcmVuY2UsICZjb25uZWN0aW9uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsIHNpemVvZigqcmVmZXJlbmNlKSkgPT0gMCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhc3NpZ25fc291cmNlX2xvY2FsX3JlZmVyZW5jZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCXN0YXRpYyB1X2ludDMyX3QgbGFzdF9yZWYgPSAweDMwMDAwOworCWludCB3cmFwcGVkID0gMDsKKworCWRvIHsKKwkJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSByZWZlcmVuY2U7CisJCXJlZmVyZW5jZS5vY3RldDEgPSAobGFzdF9yZWYgPj4gIDApICYgMHhmZjsKKwkJcmVmZXJlbmNlLm9jdGV0MiA9IChsYXN0X3JlZiA+PiAgOCkgJiAweGZmOworCQlyZWZlcmVuY2Uub2N0ZXQzID0gKGxhc3RfcmVmID4+IDE2KSAmIDB4ZmY7CisKKwkJKytsYXN0X3JlZjsKKwkJLyogZG8gbm90IHVzZSB0aGUgcmV2ZXJzZWQgd29yZCBhbmQgd3JhcCBhcm91bmQgKi8KKwkJaWYgKChsYXN0X3JlZiAmIDB4MDBGRkZGRkYpID09IDB4MDBGRkZGRkYpIHsKKwkJCUxPR1AoRFNDQ1AsIExPR0xfREVCVUcsICJXcmFwcGVkIHNlYXJjaGluZyBmb3IgYSBmcmVlIGNvZGVcbiIpOworCQkJbGFzdF9yZWYgPSAwOworCQkJKyt3cmFwcGVkOworCQl9CisKKwkJaWYgKHNvdXJjZV9sb2NhbF9yZWZlcmVuY2VfaXNfZnJlZSgmcmVmZXJlbmNlKSA9PSAwKSB7CisJCQljb25uZWN0aW9uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlID0gcmVmZXJlbmNlOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IHdoaWxlICh3cmFwcGVkICE9IDIpOworCisJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIkZpbmRpbmcgYSBmcmVlIHJlZmVyZW5jZSBmYWlsZWRcbiIpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgX3NjY3Bfc2V0X2Nvbm5lY3Rpb25fc3RhdGUoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgaW50IG5ld19zdGF0ZSkKK3sKKwlpbnQgb2xkX3N0YXRlID0gY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZTsKKworCWNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGUgPSBuZXdfc3RhdGU7CisJaWYgKGNvbm5lY3Rpb24tPnN0YXRlX2NiKQorCQljb25uZWN0aW9uLT5zdGF0ZV9jYihjb25uZWN0aW9uLCBvbGRfc3RhdGUpOworfQorCitzdGF0aWMgaW50IF9zY2NwX3NlbmRfcmVmdXNlKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgKnNyY19yZWYsIGludCBjYXVzZSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnYjsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlZnVzZWQgKnJlZjsKKwl1X2ludDhfdCAqZGF0YTsKKworCW1zZ2IgPSBtc2diX2FsbG9jX2hlYWRyb29tKFNDQ1BfTVNHX1NJWkUsCisJCQkJICAgU0NDUF9NU0dfSEVBRFJPT00sICJzY2NwIHJlZiIpOworCW1zZ2ItPmwyaCA9ICZtc2diLT5kYXRhWzBdOworCisJcmVmID0gKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVmdXNlZCAqKSBtc2diX3B1dChtc2diLCBzaXplb2YoKnJlZikpOworCXJlZi0+dHlwZSA9IFNDQ1BfTVNHX1RZUEVfQ1JFRjsKKwltZW1jcHkoJnJlZi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLCBzcmNfcmVmLAorCSAgICAgICBzaXplb2Yoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSkpOworCXJlZi0+Y2F1c2UgPSBjYXVzZTsKKwlyZWYtPm9wdGlvbmFsX3N0YXJ0ID0gMTsKKworCWRhdGEgPSBtc2diX3B1dChtc2diLCAxKTsKKwlkYXRhWzBdID0gU0NDUF9QTkNfRU5EX09GX09QVElPTkFMOworCisJX3NlbmRfbXNnKG1zZ2IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9zY2NwX3NlbmRfY29ubmVjdGlvbl9jb25maXJtKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJc3RydWN0IG1zZ2IgKnJlc3BvbnNlOworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fY29uZmlybSAqY29uZmlybTsKKwl1X2ludDhfdCAqb3B0aW9uYWxfZGF0YTsKKworCWlmIChhc3NpZ25fc291cmNlX2xvY2FsX3JlZmVyZW5jZShjb25uZWN0aW9uKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwlyZXNwb25zZSA9IG1zZ2JfYWxsb2NfaGVhZHJvb20oU0NDUF9NU0dfU0laRSwKKwkJCQkgICAgICAgU0NDUF9NU0dfSEVBRFJPT00sICJzY2NwIGNvbmZpcm0iKTsKKwlyZXNwb25zZS0+bDJoID0gJnJlc3BvbnNlLT5kYXRhWzBdOworCisJY29uZmlybSA9IChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX2NvbmZpcm0gKikgbXNnYl9wdXQocmVzcG9uc2UsIHNpemVvZigqY29uZmlybSkpOworCisJY29uZmlybS0+dHlwZSA9IFNDQ1BfTVNHX1RZUEVfQ0M7CisJbWVtY3B5KCZjb25maXJtLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJICAgICAgICZjb25uZWN0aW9uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJICAgICAgIHNpemVvZihjb25uZWN0aW9uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UpKTsKKwltZW1jcHkoJmNvbmZpcm0tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJICAgICAgICZjb25uZWN0aW9uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLAorCSAgICAgICBzaXplb2YoY29ubmVjdGlvbi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSkpOworCWNvbmZpcm0tPnByb3RvX2NsYXNzID0gMjsKKwljb25maXJtLT5vcHRpb25hbF9zdGFydCA9IDE7CisKKwlvcHRpb25hbF9kYXRhID0gKHVfaW50OF90ICopIG1zZ2JfcHV0KHJlc3BvbnNlLCAxKTsKKwlvcHRpb25hbF9kYXRhWzBdID0gU0NDUF9QTkNfRU5EX09GX09QVElPTkFMOworCisJX3NlbmRfbXNnKHJlc3BvbnNlKTsKKwlfc2NjcF9zZXRfY29ubmVjdGlvbl9zdGF0ZShjb25uZWN0aW9uLCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfRVNUQUJMSVNIRUQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9zY2NwX3NlbmRfY29ubmVjdGlvbl9yZXF1ZXN0KHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCSBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCAqY2FsbGVkLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBtc2diICpyZXF1ZXN0OworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVxdWVzdCAqcmVxOworCXVfaW50OF90ICpkYXRhOworCXVfaW50OF90IGV4dHJhX3NpemUgPSAzICsgMTsKKworCisJaWYgKG1zZyAmJiAobXNnYl9sM2xlbihtc2cpIDwgMyB8fCBtc2diX2wzbGVuKG1zZykgPiAxMzApKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJJbnZhbGlkIGFtb3VudCBvZiBkYXRhLi4uICVkXG4iLCBtc2diX2wzbGVuKG1zZykpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogdHJ5IHRvIGZpbmQgYSBpZCAqLworCWlmIChhc3NpZ25fc291cmNlX2xvY2FsX3JlZmVyZW5jZShjb25uZWN0aW9uKSAhPSAwKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJBc3NpZ25pbmcgYSBsb2NhbCByZWZlcmVuY2UgZmFpbGVkLlxuIik7CisJCV9zY2NwX3NldF9jb25uZWN0aW9uX3N0YXRlKGNvbm5lY3Rpb24sIFNDQ1BfQ09OTkVDVElPTl9TVEFURV9TRVRVUF9FUlJPUik7CisJCXJldHVybiAtMTsKKwl9CisKKworCWlmIChtc2cpCisJCWV4dHJhX3NpemUgKz0gMiArIG1zZ2JfbDNsZW4obXNnKTsKKwlyZXF1ZXN0ID0gbXNnYl9hbGxvY19oZWFkcm9vbShTQ0NQX01TR19TSVpFLAorCQkJCSAgICAgIFNDQ1BfTVNHX0hFQURST09NLCAic2NjcCBjb25uZWN0aW9uIHJlcXVlc3QiKTsKKwlyZXF1ZXN0LT5sMmggPSAmcmVxdWVzdC0+ZGF0YVswXTsKKwlyZXEgPSAoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZXF1ZXN0ICopIG1zZ2JfcHV0KHJlcXVlc3QsIHNpemVvZigqcmVxKSk7CisKKwlyZXEtPnR5cGUgPSBTQ0NQX01TR19UWVBFX0NSOworCW1lbWNweSgmcmVxLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLCAmY29ubmVjdGlvbi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkgICAgICAgc2l6ZW9mKGNvbm5lY3Rpb24tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UpKTsKKwlyZXEtPnByb3RvX2NsYXNzID0gMjsKKwlyZXEtPnZhcmlhYmxlX2NhbGxlZCA9IDI7CisJcmVxLT5vcHRpb25hbF9zdGFydCA9IDQ7CisKKwkvKiB3cml0ZSB0aGUgY2FsbGVkIHBhcnR5IGFkZHJlc3MgKi8KKwlkYXRhID0gbXNnYl9wdXQocmVxdWVzdCwgMSArIDIpOworCWRhdGFbMF0gPSAyOworCWRhdGFbMV0gPSAweDQyOworCWRhdGFbMl0gPSBjYWxsZWQtPnNjY3Bfc3NuOworCisJLyogd3JpdGUgdGhlIHBheWxvYWQgKi8KKwlpZiAobXNnKSB7CisJICAgIGRhdGEgPSBtc2diX3B1dChyZXF1ZXN0LCAyICsgbXNnYl9sM2xlbihtc2cpKTsKKwkgICAgZGF0YVswXSA9IFNDQ1BfUE5DX0RBVEE7CisJICAgIGRhdGFbMV0gPSBtc2diX2wzbGVuKG1zZyk7CisJICAgIG1lbWNweSgmZGF0YVsyXSwgbXNnLT5sM2gsIG1zZ2JfbDNsZW4obXNnKSk7CisJfQorCisJZGF0YSA9IG1zZ2JfcHV0KHJlcXVlc3QsIDEpOworCWRhdGFbMF0gPSBTQ0NQX1BOQ19FTkRfT0ZfT1BUSU9OQUw7CisKKwlsbGlzdF9hZGRfdGFpbCgmY29ubmVjdGlvbi0+bGlzdCwgJnNjY3BfY29ubmVjdGlvbnMpOworCV9zY2NwX3NldF9jb25uZWN0aW9uX3N0YXRlKGNvbm5lY3Rpb24sIFNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRVFVRVNUKTsKKworCV9zZW5kX21zZyhyZXF1ZXN0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfc2NjcF9zZW5kX2Nvbm5lY3Rpb25fZGF0YShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uLCBzdHJ1Y3QgbXNnYiAqX2RhdGEpCit7CisJc3RydWN0IG1zZ2IgKm1zZ2I7CisJc3RydWN0IHNjY3BfZGF0YV9mb3JtMSAqZHQxOworCXVfaW50OF90ICpkYXRhOworCWludCBleHRyYV9zaXplOworCisJaWYgKG1zZ2JfbDNsZW4oX2RhdGEpIDwgMiB8fCBtc2diX2wzbGVuKF9kYXRhKSA+IDI1NikgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiZGF0YSBzaXplIHRvbyBiaWcsIHNlZ21lbnRpbmcgdW5pbXBsZW1lbnRlZC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZXh0cmFfc2l6ZSA9IDEgKyBtc2diX2wzbGVuKF9kYXRhKTsKKwltc2diID0gbXNnYl9hbGxvY19oZWFkcm9vbShTQ0NQX01TR19TSVpFLAorCQkJCSAgIFNDQ1BfTVNHX0hFQURST09NLCAic2NjcCBkdDEiKTsKKwltc2diLT5sMmggPSAmbXNnYi0+ZGF0YVswXTsKKworCWR0MSA9IChzdHJ1Y3Qgc2NjcF9kYXRhX2Zvcm0xICopIG1zZ2JfcHV0KG1zZ2IsIHNpemVvZigqZHQxKSk7CisJZHQxLT50eXBlID0gU0NDUF9NU0dfVFlQRV9EVDE7CisJbWVtY3B5KCZkdDEtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwgJmNvbm4tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UpKTsKKwlkdDEtPnNlZ21lbnRpbmcgPSAwOworCisJLyogY29weSB0aGUgZGF0YSAqLworCWR0MS0+dmFyaWFibGVfc3RhcnQgPSAxOworCWRhdGEgPSBtc2diX3B1dChtc2diLCBleHRyYV9zaXplKTsKKwlkYXRhWzBdID0gZXh0cmFfc2l6ZSAtIDE7CisJbWVtY3B5KCZkYXRhWzFdLCBfZGF0YS0+bDNoLCBleHRyYV9zaXplIC0gMSk7CisKKwlfc2VuZF9tc2cobXNnYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3NjY3Bfc2VuZF9jb25uZWN0aW9uX2l0KHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJc3RydWN0IG1zZ2IgKm1zZ2I7CisJc3RydWN0IHNjY3BfZGF0YV9pdCAqaXQ7CisKKwltc2diID0gbXNnYl9hbGxvY19oZWFkcm9vbShTQ0NQX01TR19TSVpFLAorCQkJCSAgIFNDQ1BfTVNHX0hFQURST09NLCAic2NjcCBpdCIpOworCW1zZ2ItPmwyaCA9ICZtc2diLT5kYXRhWzBdOworCWl0ID0gKHN0cnVjdCBzY2NwX2RhdGFfaXQgKikgbXNnYl9wdXQobXNnYiwgc2l6ZW9mKCppdCkpOworCWl0LT50eXBlID0gU0NDUF9NU0dfVFlQRV9JVDsKKwltZW1jcHkoJml0LT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsICZjb25uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJCXNpemVvZihzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlKSk7CisJbWVtY3B5KCZpdC0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwgJmNvbm4tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJCXNpemVvZihzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlKSk7CisKKwlpdC0+cHJvdG9fY2xhc3MgPSAweDI7CisJaXQtPnNlcXVlbmNpbmdbMF0gPSBpdC0+c2VxdWVuY2luZ1sxXSA9IDA7CisJaXQtPmNyZWRpdCA9IDA7CisKKwlfc2VuZF9tc2cobXNnYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3NjY3Bfc2VuZF9jb25uZWN0aW9uX3JlbGVhc2VkKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4sIGludCBjYXVzZSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZWQgKnJlbDsKKwl1X2ludDhfdCAqZGF0YTsKKworCW1zZyA9IG1zZ2JfYWxsb2NfaGVhZHJvb20oU0NDUF9NU0dfU0laRSwgU0NDUF9NU0dfSEVBRFJPT00sCisJCQkJICAic2NjcDogY29ubmVjdGlvbiByZWxlYXNlZCIpOworCW1zZy0+bDJoID0gJm1zZy0+ZGF0YVswXTsKKwlyZWwgPSAoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlZCAqKSBtc2diX3B1dChtc2csIHNpemVvZigqcmVsKSk7CisJcmVsLT50eXBlID0gU0NDUF9NU0dfVFlQRV9STFNEOworCXJlbC0+cmVsZWFzZV9jYXVzZSA9IGNhdXNlOworCisJLyogY29weSB0aGUgc291cmNlIHJlZmVyZW5jZXMgKi8KKwltZW1jcHkoJnJlbC0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLCAmY29ubi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCSAgICAgICBzaXplb2Yoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSkpOworCW1lbWNweSgmcmVsLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLCAmY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UpKTsKKworCWRhdGEgPSBtc2diX3B1dChtc2csIDEpOworCWRhdGFbMF0gPSBTQ0NQX1BOQ19FTkRfT0ZfT1BUSU9OQUw7CisKKwlfc2NjcF9zZXRfY29ubmVjdGlvbl9zdGF0ZShjb25uLCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVMRUFTRSk7CisJX3NlbmRfbXNnKG1zZyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBPcGVuIGEgY29ubmVjdGlvbi4gVGhlIGZvbGxvd2luZyBpcyBnb2luZyB0byBoYXBwZW46CisgKgorICoJLSBWZXJpZnkgdGhlIHBhY2tldCwgZS5nLiB0aGF0IHdlIGhhdmUgbm8gb3RoZXIgY29ubmVjdGlvbgorICoJICB0aGF0IGlkLgorICogICAgICAtIEFzayB0aGUgdXNlciBpZiBoZSB3YW50cyB0byBhY2NlcHQgdGhlIGNvbm5lY3Rpb24KKyAqICAgICAgLSBUcnkgdG8gb3BlbiB0aGUgY29ubmVjdGlvbiBieSBhc3NpZ25pbmcgYSBzb3VyY2UgbG9jYWwgcmVmZXJlbmNlCisgKiAgICAgICAgYW5kIHNlbmRpbmcgdGhlIHBhY2tldAorICovCitzdGF0aWMgaW50IF9zY2NwX2hhbmRsZV9jb25uZWN0aW9uX3JlcXVlc3Qoc3RydWN0IG1zZ2IgKm1zZ2IpCit7CisJc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0IHJlc3VsdDsKKworCXN0cnVjdCBzY2NwX2RhdGFfY2FsbGJhY2sgKmNiOworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisKKwlpZiAoX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9yZXF1ZXN0KG1zZ2IsICZyZXN1bHQpICE9IDApCisJCXJldHVybiAtMTsKKworCWNiID0gX2ZpbmRfc3NuKHJlc3VsdC5jYWxsZWQuc3NuKTsKKwlpZiAoIWNiIHx8ICFjYi0+YWNjZXB0X2NiKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJObyByb3V0aW5nIGZvciBDUiBmb3IgY2FsbGVkIFNTTjogJXVcbiIsIHJlc3VsdC5jYWxsZWQuc3NuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGNoZWNrIGlmIHRoZSBzeXN0ZW0gd2FudHMgdGhpcyBjb25uZWN0aW9uICovCisJY29ubmVjdGlvbiA9IHRhbGxvY196ZXJvKHRhbGxfc2NjcF9jdHgsIHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24pOworCWlmICghY29ubmVjdGlvbikgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiQWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiBzYW5pdHkgY2hlY2tzOgorCSAqCS0gSXMgdGhlIHNvdXJjZV9sb2NhbF9yZWZlcmVuY2UgaW4gYW55IG90aGVyIGNvbm5lY3Rpb24/CisJICogdGhlbiB3aWxsIGNhbGwgYWNjZXB0LCBhc3NpZ24gYSAiZGVzdGluYXRpb24iIGxvY2FsIHJlZmVyZW5jZQorCSAqIGFuZCBzZW5kIGEgY29ubmVjdGlvbiBjb25maXJtLCBvdGhlcndpc2Ugd2Ugd2lsbCBzZW5kIGEgcmVmdXNlZWQKKwkgKiBvbmUuLi4uCisJICovCisJaWYgKGRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZV9pc19mcmVlKHJlc3VsdC5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlKSAhPSAwKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJOZWVkIHRvIHJlamVjdCBjb25uZWN0aW9uIHdpdGggZXhpc3RpbmcgcmVmZXJlbmNlXG4iKTsKKwkJX3NjY3Bfc2VuZF9yZWZ1c2UocmVzdWx0LnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsIFNDQ1BfUkVGVVNBTF9TQ0NQX0ZBSUxVUkUpOworCQl0YWxsb2NfZnJlZShjb25uZWN0aW9uKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNvbm5lY3Rpb24tPmluY29taW5nID0gMTsKKwljb25uZWN0aW9uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UgPSAqcmVzdWx0LnNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7CisKKwlpZiAoY2ItPmFjY2VwdF9jYihjb25uZWN0aW9uLCBjYi0+YWNjZXB0X2NvbnRleHQpICE9IDApIHsKKwkJX3NjY3Bfc2VuZF9yZWZ1c2UocmVzdWx0LnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsIFNDQ1BfUkVGVVNBTF9FTkRfVVNFUl9PUklHSU5BVEVEKTsKKwkJX3NjY3Bfc2V0X2Nvbm5lY3Rpb25fc3RhdGUoY29ubmVjdGlvbiwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFRlVTRUQpOworCQl0YWxsb2NfZnJlZShjb25uZWN0aW9uKTsKKwkJcmV0dXJuIDA7CisJfQorCisKKwlsbGlzdF9hZGRfdGFpbCgmY29ubmVjdGlvbi0+bGlzdCwgJnNjY3BfY29ubmVjdGlvbnMpOworCisJaWYgKF9zY2NwX3NlbmRfY29ubmVjdGlvbl9jb25maXJtKGNvbm5lY3Rpb24pICE9IDApIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIlNlbmRpbmcgY29uZmlybSBmYWlsZWQuLi4gbm8gYXZhaWxhYmxlIHNvdXJjZSByZWZlcmVuY2U/XG4iKTsKKworCQlfc2NjcF9zZW5kX3JlZnVzZShyZXN1bHQuc291cmNlX2xvY2FsX3JlZmVyZW5jZSwgU0NDUF9SRUZVU0FMX1NDQ1BfRkFJTFVSRSk7CisJCV9zY2NwX3NldF9jb25uZWN0aW9uX3N0YXRlKGNvbm5lY3Rpb24sIFNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUZVU0VEKTsKKwkJbGxpc3RfZGVsKCZjb25uZWN0aW9uLT5saXN0KTsKKwkJdGFsbG9jX2ZyZWUoY29ubmVjdGlvbik7CisKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogSWYgd2UgaGF2ZSBkYXRhIGxldCB1cyBmb3J3YXJkIHRoaW5ncy4KKwkgKi8KKwlpZiAocmVzdWx0LmRhdGFfbGVuICE9IDAgJiYgY29ubmVjdGlvbi0+ZGF0YV9jYikgeworCQljb25uZWN0aW9uLT5kYXRhX2NiKGNvbm5lY3Rpb24sIG1zZ2IsIHJlc3VsdC5kYXRhX2xlbik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIEhhbmRsZSB0aGUgcmVsZWFzZSBjb25maXJtZWQgKi8KK3N0YXRpYyBpbnQgX3NjY3BfaGFuZGxlX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZShzdHJ1Y3QgbXNnYiAqbXNnYikKK3sKKwlzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgcmVzdWx0OworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm47CisKKwlpZiAoX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9yZWxlYXNlX2NvbXBsZXRlKG1zZ2IsICZyZXN1bHQpICE9IDApCisJCXJldHVybiAtMTsKKworCS8qIGZpbmQgdGhlIGNvbm5lY3Rpb24gKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uLCAmc2NjcF9jb25uZWN0aW9ucywgbGlzdCkgeworCQlpZiAoY29ubi0+ZGF0YV9jYgorCQkgICAgJiYgbWVtY21wKCZjb25uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgcmVzdWx0LmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHNpemVvZihjb25uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlKSkgPT0gMAorCQkgICAgJiYgbWVtY21wKCZjb25uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICByZXN1bHQuc291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHNpemVvZihjb25uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UpKSA9PSAwKSB7CisJCSAgICBnb3RvIGZvdW5kOworCQl9CisJfQorCisKKwlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiUmVsZWFzZSBjb21wbGV0ZSBvZiB1bmtub3duIGNvbm5lY3Rpb25cbiIpOworCXJldHVybiAtMTsKKworZm91bmQ6CisJbGxpc3RfZGVsKCZjb25uLT5saXN0KTsKKwlfc2NjcF9zZXRfY29ubmVjdGlvbl9zdGF0ZShjb25uLCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVMRUFTRV9DT01QTEVURSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIEhhbmRsZSB0aGUgRGF0YSBGb3JtIDEgbWVzc2FnZSAqLworc3RhdGljIGludCBfc2NjcF9oYW5kbGVfY29ubmVjdGlvbl9kdDEoc3RydWN0IG1zZ2IgKm1zZ2IpCit7CisJc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0IHJlc3VsdDsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uOworCisJaWYgKF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fZHQxKG1zZ2IsICZyZXN1bHQpICE9IDApCisJCXJldHVybiAtMTsKKworCS8qIGxvb2t1cCBpZiB3ZSBoYXZlIGEgY29ubmVjdGlvbiB3aXRoIHRoZSBnaXZlbiByZWZlcmVuY2UgKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uLCAmc2NjcF9jb25uZWN0aW9ucywgbGlzdCkgeworCQlpZiAoY29ubi0+ZGF0YV9jYgorCQkgICAgJiYgbWVtY21wKCZjb25uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgcmVzdWx0LmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHNpemVvZihjb25uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlKSkgPT0gMCkgeworCQkJZ290byBmb3VuZDsKKwkJfQorCX0KKworCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJObyBjb25uZWN0aW9uIGZvdW5kIGZvciBkdDEgZGF0YVxuIik7CisJcmV0dXJuIC0xOworCitmb3VuZDoKKwljb25uLT5kYXRhX2NiKGNvbm4sIG1zZ2IsIHJlc3VsdC5kYXRhX2xlbik7CisJcmV0dXJuIDA7Cit9CisKKy8qIGNvbmZpcm0gYSBjb25uZWN0aW9uIHJlbGVhc2UgKi8KK3N0YXRpYyBpbnQgX3NjY3Bfc2VuZF9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnYjsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUgKnJsYzsKKworCW1zZ2IgPSBtc2diX2FsbG9jX2hlYWRyb29tKFNDQ1BfTVNHX1NJWkUsCisJCQkJICAgU0NDUF9NU0dfSEVBRFJPT00sICJzY2NwIHJsYyIpOworCW1zZ2ItPmwyaCA9ICZtc2diLT5kYXRhWzBdOworCisJcmxjID0gKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZSAqKSBtc2diX3B1dChtc2diLCBzaXplb2YoKnJsYykpOworCXJsYy0+dHlwZSA9IFNDQ1BfTVNHX1RZUEVfUkxDOworCW1lbWNweSgmcmxjLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJICAgICAgICZjb25uZWN0aW9uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsIHNpemVvZihzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlKSk7CisJbWVtY3B5KCZybGMtPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJICAgICAgICZjb25uZWN0aW9uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLCBzaXplb2Yoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSkpOworCisJX3NlbmRfbXNnKG1zZ2IpOworCisJLyoKKwkgKiBSZW1vdmUgZnJvbSB0aGUgbGlzdCBvZiBhY3RpdmUgY29ubmVjdGlvbnMgYW5kIHNldCB0aGUgc3RhdGUuIFVzZXIgY29kZQorCSAqIHNob3VsZCBub3cgZnJlZSB0aGUgZW50cnkuCisJICovCisJbGxpc3RfZGVsKCZjb25uZWN0aW9uLT5saXN0KTsKKwlfc2NjcF9zZXRfY29ubmVjdGlvbl9zdGF0ZShjb25uZWN0aW9uLCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVMRUFTRV9DT01QTEVURSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIGNvbm5lY3Rpb24gcmVsZWFzZWQsIHNlbmQgYSByZWxlYXNlZCBjb25maXJtICovCitzdGF0aWMgaW50IF9zY2NwX2hhbmRsZV9jb25uZWN0aW9uX3JlbGVhc2VkKHN0cnVjdCBtc2diICptc2diKQoreworCXN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCByZXN1bHQ7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubjsKKworCWlmIChfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlbGVhc2VkKG1zZ2IsICZyZXN1bHQpID09IC0xKQorCQlyZXR1cm4gLTE7CisKKwkvKiBsb29rdXAgaWYgd2UgaGF2ZSBhIGNvbm5lY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gcmVmZXJlbmNlICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY29ubiwgJnNjY3BfY29ubmVjdGlvbnMsIGxpc3QpIHsKKwkJaWYgKGNvbm4tPmRhdGFfY2IKKwkJICAgICYmIG1lbWNtcCgmY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHJlc3VsdC5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICBzaXplb2YoY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSkpID09IDAKKwkJICAgICYmIG1lbWNtcCgmY29ubi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgcmVzdWx0LnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICBzaXplb2YoY29ubi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlKSkgPT0gMCkgeworCQkgICAgZ290byBmb3VuZDsKKwkJfQorCX0KKworCisJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIlVua25vd24gY29ubmVjdGlvbiB3YXMgcmVsZWFzZWQuXG4iKTsKKwlyZXR1cm4gLTE7CisKKwkvKiB3ZSBoYXZlIGZvdW5kIGEgY29ubmVjdGlvbiAqLworZm91bmQ6CisJLyogb3B0aW9uYWwgZGF0YSAqLworCWlmIChyZXN1bHQuZGF0YV9sZW4gIT0gMCAmJiBjb25uLT5kYXRhX2NiKSB7CisJCWNvbm4tPmRhdGFfY2IoY29ubiwgbXNnYiwgcmVzdWx0LmRhdGFfbGVuKTsKKwl9CisKKwkvKiBnZW5lcmF0ZSBhIHJlc3BvbnNlICovCisJaWYgKF9zY2NwX3NlbmRfY29ubmVjdGlvbl9yZWxlYXNlX2NvbXBsZXRlKGNvbm4pICE9IDApIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIlNlbmRpbmcgcmVsZWFzZSBjb25maXJtZWQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9zY2NwX2hhbmRsZV9jb25uZWN0aW9uX3JlZnVzZWQoc3RydWN0IG1zZ2IgKm1zZ2IpCit7CisJc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0IHJlc3VsdDsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uOworCisJaWYgKF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fcmVmdXNlZChtc2diLCAmcmVzdWx0KSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwkvKiBsb29rdXAgaWYgd2UgaGF2ZSBhIGNvbm5lY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gcmVmZXJlbmNlICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY29ubiwgJnNjY3BfY29ubmVjdGlvbnMsIGxpc3QpIHsKKwkJaWYgKGNvbm4tPmluY29taW5nID09IDAgJiYgY29ubi0+ZGF0YV9jYgorCQkgICAgJiYgbWVtY21wKCZjb25uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgcmVzdWx0LmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHNpemVvZihjb25uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlKSkgPT0gMCkgeworCQkgICAgZ290byBmb3VuZDsKKwkJfQorCX0KKworCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJSZWZ1c2VkIGJ1dCBubyBjb25uZWN0aW9uIGZvdW5kXG4iKTsKKwlyZXR1cm4gLTE7CisKK2ZvdW5kOgorCS8qIG9wdGlvbmFsIGRhdGEgKi8KKwlpZiAocmVzdWx0LmRhdGFfbGVuICE9IDAgJiYgY29ubi0+ZGF0YV9jYikgeworCQljb25uLT5kYXRhX2NiKGNvbm4sIG1zZ2IsIHJlc3VsdC5kYXRhX2xlbik7CisJfQorCisKKwlsbGlzdF9kZWwoJmNvbm4tPmxpc3QpOworCV9zY2NwX3NldF9jb25uZWN0aW9uX3N0YXRlKGNvbm4sIFNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUZVU0VEKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfc2NjcF9oYW5kbGVfY29ubmVjdGlvbl9jb25maXJtKHN0cnVjdCBtc2diICptc2diKQoreworCXN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCByZXN1bHQ7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubjsKKworCWlmIChfc2NjcF9wYXJzZV9jb25uZWN0aW9uX2NvbmZpcm0obXNnYiwgJnJlc3VsdCkgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJLyogbG9va3VwIGlmIHdlIGhhdmUgYSBjb25uZWN0aW9uIHdpdGggdGhlIGdpdmVuIHJlZmVyZW5jZSAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm4sICZzY2NwX2Nvbm5lY3Rpb25zLCBsaXN0KSB7CisJCWlmIChjb25uLT5pbmNvbWluZyA9PSAwICYmIGNvbm4tPmRhdGFfY2IKKwkJICAgICYmIG1lbWNtcCgmY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHJlc3VsdC5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICBzaXplb2YoY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSkpID09IDApIHsKKwkJICAgIGdvdG8gZm91bmQ7CisJCX0KKwl9CisKKwlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiQ29uZmlybWVkIGJ1dCBubyBjb25uZWN0aW9uIGZvdW5kXG4iKTsKKwlyZXR1cm4gLTE7CisKK2ZvdW5kOgorCS8qIGNvcHkgdGhlIGFkZHJlc3NlcyBvZiB0aGUgY29ubmVjdGlvbiAqLworCWNvbm4tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSA9ICpyZXN1bHQuc291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKwlfc2NjcF9zZXRfY29ubmVjdGlvbl9zdGF0ZShjb25uLCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfRVNUQUJMSVNIRUQpOworCisJLyogb3B0aW9uYWwgZGF0YSAqLworCWlmIChyZXN1bHQuZGF0YV9sZW4gIT0gMCAmJiBjb25uLT5kYXRhX2NiKSB7CisJCWNvbm4tPmRhdGFfY2IoY29ubiwgbXNnYiwgcmVzdWx0LmRhdGFfbGVuKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgc2NjcF9zeXN0ZW1faW5pdCh2b2lkICgqb3V0Z29pbmcpKHN0cnVjdCBtc2diICpkYXRhLCB2b2lkICpjdHgpLCB2b2lkICpjdHgpCit7CisJc2NjcF9zeXN0ZW0ud3JpdGVfZGF0YSA9IG91dGdvaW5nOworCXNjY3Bfc3lzdGVtLndyaXRlX2NvbnRleHQgPSBjdHg7CisKKwlyZXR1cm4gMDsKK30KKworLyogb2ggbXkgZ29kIGEgcmVhbCBTQ0NQIHBhY2tldC4gbmVlZCB0byBkaXNwYXRjaCBpdCBub3cgKi8KK2ludCBzY2NwX3N5c3RlbV9pbmNvbWluZyhzdHJ1Y3QgbXNnYiAqbXNnYikKK3sKKwlpZiAobXNnYl9sMmxlbihtc2diKSA8IDEgKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJUb28gc2hvcnQgcGFja2V0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWludCB0eXBlID0gbXNnYi0+bDJoWzBdOworCisJc3dpdGNoKHR5cGUpIHsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfQ1I6CisJCXJldHVybiBfc2NjcF9oYW5kbGVfY29ubmVjdGlvbl9yZXF1ZXN0KG1zZ2IpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfUkxTRDoKKwkJcmV0dXJuIF9zY2NwX2hhbmRsZV9jb25uZWN0aW9uX3JlbGVhc2VkKG1zZ2IpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfQ1JFRjoKKwkJcmV0dXJuIF9zY2NwX2hhbmRsZV9jb25uZWN0aW9uX3JlZnVzZWQobXNnYik7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9DQzoKKwkJcmV0dXJuIF9zY2NwX2hhbmRsZV9jb25uZWN0aW9uX2NvbmZpcm0obXNnYik7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9STEM6CisJCXJldHVybiBfc2NjcF9oYW5kbGVfY29ubmVjdGlvbl9yZWxlYXNlX2NvbXBsZXRlKG1zZ2IpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfRFQxOgorCQlyZXR1cm4gX3NjY3BfaGFuZGxlX2Nvbm5lY3Rpb25fZHQxKG1zZ2IpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfVURUOgorCQlyZXR1cm4gX3NjY3BfaGFuZGxlX3JlYWQobXNnYik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJ1bmltcGxlbWVudGVkIG1zZyB0eXBlOiAlZFxuIiwgdHlwZSk7CisJfTsKKworCXJldHVybiAtMTsKK30KKworLyogY3JlYXRlIGEgcGFja2V0IGZyb20gdGhlIGRhdGEgKi8KK2ludCBzY2NwX2Nvbm5lY3Rpb25fd3JpdGUoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IG1zZ2IgKmRhdGEpCit7CisJaWYgKGNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGUgPCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfQ09ORklSTQorCSAgICB8fCBjb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlID4gU0NDUF9DT05ORUNUSU9OX1NUQVRFX0VTVEFCTElTSEVEKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJzY2NwX2Nvbm5lY3Rpb25fd3JpdGU6IFdyb25nIGNvbm5lY3Rpb24gc3RhdGU6ICVwICVkXG4iLAorCQkgICAgICAgY29ubmVjdGlvbiwgY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gX3NjY3Bfc2VuZF9jb25uZWN0aW9uX2RhdGEoY29ubmVjdGlvbiwgZGF0YSk7Cit9CisKKy8qCisgKiBTZW5kIGEgSW5hY3Rpdml0eSBUZXN0IG1lc3NhZ2UuIFRoZSBvd25lciBvZiB0aGUgY29ubmVjdGlvbgorICogc2hvdWxkIHN0YXJ0IGEgdGltZXIgYW5kIGNhbGwgdGhpcyBtZXRob2QgcmVndWxhcmlseS4gQ2FsbGluZworICogdGhpcyBldmVyeSA2MCBzZWNvbmRzIHNob3VsZCBiZSBnb29kIGVub3VnaC4KKyAqLworaW50IHNjY3BfY29ubmVjdGlvbl9zZW5kX2l0KHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJaWYgKGNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGUgPCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfQ09ORklSTQorCSAgICB8fCBjb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlID4gU0NDUF9DT05ORUNUSU9OX1NUQVRFX0VTVEFCTElTSEVEKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJzY2NwX2Nvbm5lY3Rpb25fd3JpdGU6IFdyb25nIGNvbm5lY3Rpb24gc3RhdGU6ICVwICVkXG4iLAorCQkgICAgICAgY29ubmVjdGlvbiwgY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gX3NjY3Bfc2VuZF9jb25uZWN0aW9uX2l0KGNvbm5lY3Rpb24pOworfQorCisvKiBzZW5kIGEgY29ubmVjdGlvbiByZWxlYXNlIGFuZCB3YWl0IGZvciB0aGUgY29ubmVjdGlvbiByZWxlYXNlZCAqLworaW50IHNjY3BfY29ubmVjdGlvbl9jbG9zZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBpbnQgY2F1c2UpCit7CisJaWYgKGNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGUgPCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfQ09ORklSTQorCSAgICB8fCBjb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlID4gU0NDUF9DT05ORUNUSU9OX1NUQVRFX0VTVEFCTElTSEVEKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJDYW4gbm90IGNsb3NlIHRoZSBjb25uZWN0aW9uLiBJdCB3YXMgbmV2ZXIgb3BlbmVkOiAlcCAlZFxuIiwKKwkJCWNvbm5lY3Rpb24sIGNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGUpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIF9zY2NwX3NlbmRfY29ubmVjdGlvbl9yZWxlYXNlZChjb25uZWN0aW9uLCBjYXVzZSk7Cit9CisKK2ludCBzY2NwX2Nvbm5lY3Rpb25fZnJlZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCWlmIChjb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlID4gU0NDUF9DT05ORUNUSU9OX1NUQVRFX05PTkUKKwkgICAgJiYgY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSA8IFNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFX0NPTVBMRVRFKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJUaGUgY29ubmVjdGlvbiBuZWVkcyB0byBiZSByZWxlYXNlZCBiZWZvcmUgaXQgaXMgZnJlZWQiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXRhbGxvY19mcmVlKGNvbm5lY3Rpb24pOworCXJldHVybiAwOworfQorCitpbnQgc2NjcF9jb25uZWN0aW9uX2ZvcmNlX2ZyZWUoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29uKQoreworCWlmIChjb24tPmNvbm5lY3Rpb25fc3RhdGUgPiBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfTk9ORSAmJgorCSAgICBjb24tPmNvbm5lY3Rpb25fc3RhdGUgPCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVMRUFTRV9DT01QTEVURSkKKwkJbGxpc3RfZGVsKCZjb24tPmxpc3QpOworCisJY29uLT5jb25uZWN0aW9uX3N0YXRlID0gU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFRlVTRUQ7CisJc2NjcF9jb25uZWN0aW9uX2ZyZWUoY29uKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKnNjY3BfY29ubmVjdGlvbl9zb2NrZXQodm9pZCkKK3sKKwlyZXR1cm4gdGFsbG9jX3plcm8odGFsbF9zY2NwX2N0eCwgc3RydWN0IHNjY3BfY29ubmVjdGlvbik7Cit9CisKK2ludCBzY2NwX2Nvbm5lY3Rpb25fY29ubmVjdChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uLAorCQkJICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICpsb2NhbCwKKwkJCSAgICBzdHJ1Y3QgbXNnYiAqZGF0YSkKK3sKKwlyZXR1cm4gX3NjY3Bfc2VuZF9jb25uZWN0aW9uX3JlcXVlc3QoY29ubiwgbG9jYWwsIGRhdGEpOworfQorCitpbnQgc2NjcF9jb25uZWN0aW9uX3NldF9pbmNvbWluZyhjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCAqc29jaywKKwkJCQkgaW50ICgqYWNjZXB0X2NiKShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICosIHZvaWQgKiksIHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IHNjY3BfZGF0YV9jYWxsYmFjayAqY2I7CisKKwlpZiAoIXNvY2spCisJCXJldHVybiAtMjsKKworCWNiID0gX2ZpbmRfc3NuKHNvY2stPnNjY3Bfc3NuKTsKKwlpZiAoIWNiKQorCQlyZXR1cm4gLTE7CisKKwljYi0+YWNjZXB0X2NiID0gYWNjZXB0X2NiOworCWNiLT5hY2NlcHRfY29udGV4dCA9IGNvbnRleHQ7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzY2NwX3dyaXRlKHN0cnVjdCBtc2diICpkYXRhLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCAqaW4sCisJICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICpvdXQsIGludCBjbGFzcykKK3sKKwlyZXR1cm4gX3NjY3Bfc2VuZF9kYXRhKGNsYXNzLCBpbiwgb3V0LCBkYXRhKTsKK30KKworaW50IHNjY3Bfc2V0X3JlYWQoY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKnNvY2ssCisJCSAgaW50ICgqcmVhZF9jYikoc3RydWN0IG1zZ2IgKiwgdW5zaWduZWQgaW50LCB2b2lkICopLCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBzY2NwX2RhdGFfY2FsbGJhY2sgKmNiOworCisJaWYgKCFzb2NrKQorCQlyZXR1cm4gLTI7CisKKwljYiAgPSBfZmluZF9zc24oc29jay0+c2NjcF9zc24pOworCWlmICghY2IpCisJCXJldHVybiAtMTsKKworCWNiLT5yZWFkX2NiID0gcmVhZF9jYjsKKwljYi0+cmVhZF9jb250ZXh0ID0gY29udGV4dDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSkgPD0gc2l6ZW9mKHVfaW50MzJfdCksIGVub3VnaF9zcGFjZSk7CisKK3VfaW50MzJfdCBzY2NwX3NyY19yZWZfdG9faW50KHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgKnJlZikKK3sKKwl1X2ludDMyX3Qgc3JjX3JlZiA9IDA7CisJbWVtY3B5KCZzcmNfcmVmLCByZWYsIHNpemVvZigqcmVmKSk7CisJcmV0dXJuIHNyY19yZWY7Cit9CisKK3N0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2Ugc2NjcF9zcmNfcmVmX2Zyb21faW50KHVfaW50MzJfdCBpbnRfcmVmKQoreworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgcmVmOworCW1lbWNweSgmcmVmLCAmaW50X3JlZiwgc2l6ZW9mKHJlZikpOworCXJldHVybiByZWY7Cit9CisKK2ludCBzY2NwX2RldGVybWluZV9tc2dfdHlwZShzdHJ1Y3QgbXNnYiAqbXNnKQoreworCWlmIChtc2diX2wybGVuKG1zZykgPCAxKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gbXNnLT5sMmhbMF07Cit9CisKK2ludCBzY2NwX3BhcnNlX2hlYWRlcihzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgKnJlc3VsdCkKK3sKKwlpbnQgdHlwZTsKKworCWlmIChtc2diX2wybGVuKG1zZykgPCAxKQorCQlyZXR1cm4gLTE7CisKKwl0eXBlID0gbXNnLT5sMmhbMF07CisJc3dpdGNoKHR5cGUpIHsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfQ1I6CisJCXJldHVybiBfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlcXVlc3QobXNnLCByZXN1bHQpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfUkxTRDoKKwkJcmV0dXJuIF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fcmVsZWFzZWQobXNnLCByZXN1bHQpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfQ1JFRjoKKwkJcmV0dXJuIF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fcmVmdXNlZChtc2csIHJlc3VsdCk7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9DQzoKKwkJcmV0dXJuIF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fY29uZmlybShtc2csIHJlc3VsdCk7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9STEM6CisJCXJldHVybiBfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUobXNnLCByZXN1bHQpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfRFQxOgorCQlyZXR1cm4gX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9kdDEobXNnLCByZXN1bHQpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfVURUOgorCQlyZXR1cm4gX3NjY3BfcGFyc2VfdWR0KG1zZywgcmVzdWx0KTsKKwkJYnJlYWs7CisJY2FzZSBTQ0NQX01TR19UWVBFX0lUOgorCQlyZXR1cm4gX3NjY3BfcGFyc2VfaXQobXNnLCByZXN1bHQpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfRVJSOgorCQlyZXR1cm4gX3NjY3BfcGFyc2VfZXJyKG1zZywgcmVzdWx0KTsKKwkJYnJlYWs7CisJfTsKKworCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJVbmltcGxlbWVudGVkIE1TRyBUeXBlOiAweCV4XG4iLCB0eXBlKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpIHZvaWQgb25fZHNvX2xvYWQodm9pZCkKK3sKKwl0YWxsX3NjY3BfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KE5VTEwsIDEsICJzY2NwIik7Cit9CisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChkZXN0cnVjdG9yKSkgdm9pZCBvbl9kc29fdW5sb2FkKHZvaWQpCit7CisJdGFsbG9jX3JlcG9ydF9mdWxsKHRhbGxfc2NjcF9jdHgsIHN0ZGVycik7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9zaWxlbnRfY2FsbC5jIGIvb3BlbmJzYy9zcmMvc2lsZW50X2NhbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmQ1MzQxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvc2lsZW50X2NhbGwuYwpAQCAtMCwwICsxLDE0NiBAQAorLyogR1NNIHNpbGVudCBjYWxsIGZlYXR1cmUgKi8KKworLyoKKyAqIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcGFnaW5nLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisKKy8qIHBhZ2luZyBvZiB0aGUgcmVxdWVzdGVkIHN1YnNjcmliZXIgaGFzIGNvbXBsZXRlZCAqLworc3RhdGljIGludCBwYWdpbmdfY2Jfc2lsZW50KHVuc2lnbmVkIGludCBob29rbnVtLCB1bnNpZ25lZCBpbnQgZXZlbnQsCisJCQkgICAgc3RydWN0IG1zZ2IgKm1zZywgdm9pZCAqX2xjaGFuLCB2b2lkICpfZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubjsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IF9sY2hhbjsKKwlzdHJ1Y3Qgc2NhbGxfc2lnbmFsX2RhdGEgc2lnZGF0YTsKKwlpbnQgcmM7CisKKwlpZiAoaG9va251bSAhPSBHU01fSE9PS19SUl9QQUdJTkcpCisJCXJldHVybiAtRUlOVkFMOworCisJREVCVUdQKERTTVMsICJwYWdpbmdfY2Jfc2lsZW50OiAiKTsKKworCWNvbm4gPSAmbGNoYW4tPmNvbm47CisKKwlzaWdkYXRhLmxjaGFuID0gbGNoYW47CisJc2lnZGF0YS5kYXRhID0gX2RhdGE7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBHU01fUEFHSU5HX1NVQ0NFRURFRDoKKwkJREVCVUdQQyhEU01TLCAic3VjY2VzcywgdXNpbmcgVGltZXNsb3QgJXUgb24gQVJGQ04gJXVcbiIsCisJCQlsY2hhbi0+dHMtPm5yLCBsY2hhbi0+dHMtPnRyeC0+YXJmY24pOworCQljb25uLT5zaWxlbnRfY2FsbCA9IDE7CisJCS8qIGluY3JlbWVudCBsY2hhbiByZWZlcmVuY2UgY291bnQgKi8KKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX1NDQUxMLCBTX1NDQUxMX1NVQ0NFU1MsICZzaWdkYXRhKTsKKwkJdXNlX3N1YnNjcl9jb24oY29ubik7CisJCWJyZWFrOworCWNhc2UgR1NNX1BBR0lOR19FWFBJUkVEOgorCQlERUJVR1AoRFNNUywgImV4cGlyZWRcbiIpOworCQlkaXNwYXRjaF9zaWduYWwoU1NfU0NBTEwsIFNfU0NBTExfRVhQSVJFRCwgJnNpZ2RhdGEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyYyA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworLyogcmVjZWl2ZSBhIGxheWVyIDMgbWVzc2FnZSBmcm9tIGEgc2lsZW50IGNhbGwgKi8KK2ludCBzaWxlbnRfY2FsbF9yeChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCS8qIEZJWE1FOiBkbyBzb21ldGhpbmcgbGlrZSBzZW5kaW5nIGl0IHRocm91Z2ggYSBVRFAgcG9ydCAqLworCXJldHVybiAwOworfQorCitzdHJ1Y3QgbXNnX21hdGNoIHsKKwl1X2ludDhfdCBwZGlzYzsKKwl1X2ludDhfdCBtc2dfdHlwZTsKK307CisKKy8qIGxpc3Qgb2YgbWVzc2FnZXMgdGhhdCBhcmUgaGFuZGxlZCBpbnNpZGUgT3BlbkJTQywgZXZlbiBpbiBhIHNpbGVudCBjYWxsICovCitzdGF0aWMgY29uc3Qgc3RydWN0IG1zZ19tYXRjaCBzaWxlbnRfY2FsbF9hY2NlcHRbXSA9IHsKKwl7IEdTTTQ4X1BESVNDX01NLCBHU000OF9NVF9NTV9MT0NfVVBEX1JFUVVFU1QgfSwKKwl7IEdTTTQ4X1BESVNDX01NLCBHU000OF9NVF9NTV9DTV9TRVJWX1JFUSB9LAorfTsKKworLyogZGVjaWRlIGlmIHdlIG5lZWQgdG8gcmVyb3V0ZSBhIG1lc3NhZ2UgYXMgcGFydCBvZiBhIHNpbGVudCBjYWxsICovCitpbnQgc2lsZW50X2NhbGxfcmVyb3V0ZShzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVfaW50OF90IHBkaXNjID0gZ2gtPnByb3RvX2Rpc2NyICYgMHgwZjsKKwlpbnQgaTsKKworCS8qIGlmIHdlJ3JlIG5vdCBwYXJ0IG9mIGEgc2lsZW50IGNhbGwsIG5ldmVyIHJlcm91dGUgKi8KKwlpZiAoIW1zZy0+bGNoYW4tPmNvbm4uc2lsZW50X2NhbGwpCisJCXJldHVybiAwOworCisJLyogY2hlY2sgaWYgd2UgYXJlIGEgc3BlY2lhbCBtZXNzYWdlIHRoYXQgaXMgaGFuZGxlZCBpbiBvcGVuYnNjICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2lsZW50X2NhbGxfYWNjZXB0KTsgaSsrKSB7CisJCWlmIChzaWxlbnRfY2FsbF9hY2NlcHRbaV0ucGRpc2MgPT0gcGRpc2MgJiYKKwkJICAgIHNpbGVudF9jYWxsX2FjY2VwdFtpXS5tc2dfdHlwZSA9PSBnaC0+bXNnX3R5cGUpCisJCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBvdGhlcndpc2UsIHJlcm91dGUgKi8KKwlyZXR1cm4gMTsKK30KKworCisvKiBpbml0aWF0ZSBhIHNpbGVudCBjYWxsIHdpdGggYSBnaXZlbiBzdWJzY3JpYmVyICovCitpbnQgZ3NtX3NpbGVudF9jYWxsX3N0YXJ0KHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLCB2b2lkICpkYXRhLCBpbnQgdHlwZSkKK3sKKwlpbnQgcmM7CisKKwlyYyA9IHBhZ2luZ19yZXF1ZXN0KHN1YnNjci0+bmV0LCBzdWJzY3IsIHR5cGUsCisJCQkgICAgcGFnaW5nX2NiX3NpbGVudCwgZGF0YSk7CisJcmV0dXJuIHJjOworfQorCisvKiBlbmQgYSBzaWxlbnQgY2FsbCB3aXRoIGEgZ2l2ZW4gc3Vic2NyaWJlciAqLworaW50IGdzbV9zaWxlbnRfY2FsbF9zdG9wKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCXN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uOworCisJbGNoYW4gPSBsY2hhbl9mb3Jfc3Vic2NyKHN1YnNjcik7CisJaWYgKCFsY2hhbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBkaWQgd2UgYWN0dWFsbHkgZXN0YWJsaXNoIGEgc2lsZW50IGNhbGwgZm9yIHRoaXMgZ3V5PyAqLworCWNvbm4gPSAmbGNoYW4tPmNvbm47CisJaWYgKCFjb25uLT5zaWxlbnRfY2FsbCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwdXRfc3Vic2NyX2Nvbihjb25uKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvc29ja2V0LmMgYi9vcGVuYnNjL3NyYy9zb2NrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjBjNDNlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvc29ja2V0LmMKQEAgLTAsMCArMSwxMDggQEAKKy8qIE9wZW5CU0Mgc29rY2V0IGNvZGUsIHRha2VuIGZyb20gQWJpcyBpbnB1dCBkcml2ZXIgZm9yIGlwLmFjY2VzcyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKKyAqIChDKSAyMDEwIGJ5IE9uLVdhdmVzCisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy9mY250bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCitpbnQgbWFrZV9zb2NrKHN0cnVjdCBic2NfZmQgKmJmZCwgaW50IHByb3RvLCB1X2ludDMyX3QgaXAsIHVfaW50MTZfdCBwb3J0LAorCSAgICAgIGludCAoKmNiKShzdHJ1Y3QgYnNjX2ZkICpmZCwgdW5zaWduZWQgaW50IHdoYXQpKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworCWludCByZXQsIG9uID0gMTsKKwlpbnQgdHlwZSA9IFNPQ0tfU1RSRUFNOworCisJc3dpdGNoIChwcm90bykgeworCWNhc2UgSVBQUk9UT19UQ1A6CisJCXR5cGUgPSBTT0NLX1NUUkVBTTsKKwkJYnJlYWs7CisJY2FzZSBJUFBST1RPX1VEUDoKKwkJdHlwZSA9IFNPQ0tfREdSQU07CisJCWJyZWFrOworCWNhc2UgSVBQUk9UT19HUkU6CisJCXR5cGUgPSBTT0NLX1JBVzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYmZkLT5mZCA9IHNvY2tldChBRl9JTkVULCB0eXBlLCBwcm90byk7CisJYmZkLT5jYiA9IGNiOworCWJmZC0+d2hlbiA9IEJTQ19GRF9SRUFEOworCS8vYmZkLT5kYXRhID0gbGluZTsKKworCWlmIChiZmQtPmZkIDwgMCkgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJjb3VsZCBub3QgY3JlYXRlIHNvY2tldC5cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisJYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisJaWYgKGlwKQorCQlhZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKGlwKTsKKwllbHNlCisJCWFkZHIuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKworCXNldHNvY2tvcHQoYmZkLT5mZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmb24sIHNpemVvZihvbikpOworCisJcmV0ID0gYmluZChiZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpOworCWlmIChyZXQgPCAwKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgImNvdWxkIG5vdCBiaW5kIHNvY2tldCAlc1xuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKGJmZC0+ZmQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAocHJvdG8gPT0gSVBQUk9UT19UQ1ApIHsKKwkJcmV0ID0gbGlzdGVuKGJmZC0+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+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorCitleHRlcm4gdm9pZCAqdGFsbF9tc2diX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX2ZsZV9jdHg7CitleHRlcm4gdm9pZCAqdGFsbF9sb2NvcF9jdHg7CitleHRlcm4gdm9pZCAqdGFsbF9nc21zX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX3N1YnNjcl9jdHg7CitleHRlcm4gdm9pZCAqdGFsbF9zdWJfcmVxX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX2NhbGxfY3R4OworZXh0ZXJuIHZvaWQgKnRhbGxfcGFnaW5nX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX3NpZ2hfY3R4OworZXh0ZXJuIHZvaWQgKnRhbGxfdHFlX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX3RyYW5zX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX21hcF9jdHg7CitleHRlcm4gdm9pZCAqdGFsbF91cHFfY3R4OworZXh0ZXJuIHZvaWQgKnRhbGxfY3RyX2N0eDsKKwordm9pZCB0YWxsb2NfY3R4X2luaXQodm9pZCkKK3sKKwl0YWxsX21zZ2JfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgIm1zZ2IiKTsKKwl0YWxsX2ZsZV9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLAorCQkJCQkgICJiczExX2ZpbGVfbGlzdF9lbnRyeSIpOworCXRhbGxfbG9jb3BfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgImxvY191cGRhdGluZ19vcGVyIik7CisJdGFsbF9nc21zX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJzbXMiKTsKKwl0YWxsX3N1YnNjcl9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAic3Vic2NyaWJlciIpOworCXRhbGxfc3ViX3JlcV9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAic3Vic2NyX3JlcXVlc3QiKTsKKwl0YWxsX2NhbGxfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgImdzbV9jYWxsIik7CisJdGFsbF9wYWdpbmdfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgInBhZ2luZ19yZXF1ZXN0Iik7CisJdGFsbF9zaWdoX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJzaWduYWxfaGFuZGxlciIpOworCXRhbGxfdHFlX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJzdWJjaF90eHFfZW50cnkiKTsKKwl0YWxsX3RyYW5zX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJ0cmFuc2FjdGlvbiIpOworCXRhbGxfbWFwX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJ0cmF1X21hcF9lbnRyeSIpOworCXRhbGxfdXBxX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJ0cmF1X3VwcV9lbnRyeSIpOworCXRhbGxfY3RyX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJjb3VudGVyIik7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy90b2tlbl9hdXRoLmMgYi9vcGVuYnNjL3NyYy90b2tlbl9hdXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZlZmVhNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3Rva2VuX2F1dGguYwpAQCAtMCwwICsxLDE1NiBAQAorLyogU01TIGJhc2VkIHRva2VuIGF1dGhlbnRpY2F0aW9uIGZvciBhZC1ob2MgR1NNIG5ldHdvcmtzICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzExLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kYi5oPgorCisjZGVmaW5lIFRPS0VOX1NNU19URVhUICJIQVIgMjAwOSBHU00uICBSZWdpc3RlciBhdCBodHRwOi8vaGFyMjAwOS5nbnVtb25rcy5vcmcvICIgXAorCQkJIllvdXIgSU1TSSBpcyAlcywgYXV0aCB0b2tlbiBpcyAlMDhYLCBwaG9uZSBubyBpcyAlcy4iCisKK2V4dGVybiBzdHJ1Y3QgZ3NtX3NtcyAqc21zX2Zyb21fdGV4dChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnJlY2VpdmVyLAorCQkJCSAgICAgY29uc3QgY2hhciAqdGV4dCk7CisKK3N0YXRpYyBjaGFyICpidWlsZF9zbXNfc3RyaW5nKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLCB1X2ludDMyX3QgdG9rZW4pCit7CisJY2hhciAqc21zX3N0cjsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJbGVuID0gc3RybGVuKHN1YnNjci0+aW1zaSkgKyA4ICsgc3RybGVuKFRPS0VOX1NNU19URVhUKTsKKwlzbXNfc3RyID0gdGFsbG9jX3NpemUodGFsbF9ic2NfY3R4LCBsZW4pOworCWlmICghc21zX3N0cikKKwkJcmV0dXJuIE5VTEw7CisKKwlzbnByaW50ZihzbXNfc3RyLCBsZW4sIFRPS0VOX1NNU19URVhULCBzdWJzY3ItPmltc2ksIHRva2VuLAorCQkgc3Vic2NyLT5leHRlbnNpb24pOworCXNtc19zdHJbbGVuLTFdID0gJ1wwJzsKKworCXJldHVybiBzbXNfc3RyOworfQorCitzdGF0aWMgaW50IHRva2VuX3N1YnNjcl9jYih1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkJdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IHNpZ25hbF9kYXRhOworCXN0cnVjdCBnc21fc21zICpzbXM7CisJaW50IHJjID0gMDsKKworCWlmIChzaWduYWwgIT0gU19TVUJTQ1JfQVRUQUNIRUQpCisJCXJldHVybiAwOworCisJaWYgKHN1YnNjci0+bmV0LT5hdXRoX3BvbGljeSAhPSBHU01fQVVUSF9QT0xJQ1lfVE9LRU4pCisJCXJldHVybiAwOworCisJaWYgKHN1YnNjci0+ZmxhZ3MgJiBHU01fU1VCU0NSSUJFUl9GSVJTVF9DT05UQUNUKSB7CisJCXVfaW50MzJfdCB0b2tlbjsKKwkJY2hhciAqc21zX3N0cjsKKworCQkvKiB3ZSd2ZSBzZWVuIHRoaXMgc3Vic2NyaWJlciBmb3IgdGhlIGZpcnN0IHRpbWUuICovCisJCXJjID0gZGJfc3Vic2NyaWJlcl9hbGxvY190b2tlbihzdWJzY3IsICZ0b2tlbik7CisJCWlmIChyYyAhPSAwKSB7CisJCQlyYyA9IC1FSU87CisJCQlnb3RvIHVuYXV0aDsKKwkJfQorCisJCXNtc19zdHIgPSBidWlsZF9zbXNfc3RyaW5nKHN1YnNjciwgdG9rZW4pOworCQlpZiAoIXNtc19zdHIpIHsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gdW5hdXRoOworCQl9CisKKwkJc21zID0gc21zX2Zyb21fdGV4dChzdWJzY3IsIHNtc19zdHIpOworCQl0YWxsb2NfZnJlZShzbXNfc3RyKTsKKwkJaWYgKCFzbXMpIHsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gdW5hdXRoOworCQl9CisKKwkJcmMgPSBnc200MTFfc2VuZF9zbXNfc3Vic2NyKHN1YnNjciwgc21zKTsKKworCQkvKiBGSVhNRTogZWxzZSwgZGVsZXRlIHRoZSBzdWJzY2lyYmVyIGZyb20gZGF0YWJhc2UgKi8KK3VuYXV0aDoKKworCQkvKiBtYWtlIHN1cmUgd2UgZG9uJ3QgYWxsb3cgaGltIGluIGFnYWluIHVubGVzcyBoZSBjbGlja3MgdGhlIHdlYiBVSSAqLworCQlzdWJzY3ItPmF1dGhvcml6ZWQgPSAwOworCQlkYl9zeW5jX3N1YnNjcmliZXIoc3Vic2NyKTsKKwkJaWYgKHJjKSB7CisJCQlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IGxjaGFuX2Zvcl9zdWJzY3Ioc3Vic2NyKTsKKwkJCWlmIChsY2hhbikgeworCQkJCXVfaW50OF90IGF1dGhfcmFuZFsxNl07CisJCQkJLyoga2ljayB0aGUgc3Vic2NyaWJlciBvZmYgdGhlIG5ldHdvcmsgKi8KKwkJCQlnc200OF90eF9tbV9hdXRoX3JlcShsY2hhbiwgYXV0aF9yYW5kLCAwKTsKKwkJCQlnc200OF90eF9tbV9hdXRoX3JlaihsY2hhbik7CisJCQkJLyogRklYTUU6IGNsb3NlIHRoZSBjaGFubmVsIGVhcmx5ID8qLworCQkJCS8vZ3NtNDhfc2VuZF9ycl9SZWxlYXNlKGxjaGFuKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB0b2tlbl9zbXNfY2IodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJCXZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpCit7CisJc3RydWN0IGdzbV9zbXMgKnNtcyA9IHNpZ25hbF9kYXRhOworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCXVfaW50OF90IGF1dGhfcmFuZFsxNl07CisKKworCWlmIChzaWduYWwgIT0gU19TTVNfREVMSVZFUkVEKQorCQlyZXR1cm4gMDsKKworCisJLyogdGhlc2UgYXJlIG5vdCB0aGUgZHJvaWRzIHdlJ3ZlIGJlZW4gbG9va2luZyBmb3IgKi8KKwlpZiAoIXNtcy0+cmVjZWl2ZXIgfHwKKwkgICAgIShzbXMtPnJlY2VpdmVyLT5mbGFncyAmIEdTTV9TVUJTQ1JJQkVSX0ZJUlNUX0NPTlRBQ1QpKQorCQlyZXR1cm4gMDsKKworCisJaWYgKHNtcy0+cmVjZWl2ZXItPm5ldC0+YXV0aF9wb2xpY3kgIT0gR1NNX0FVVEhfUE9MSUNZX1RPS0VOKQorCQlyZXR1cm4gMDsKKworCisJbGNoYW4gPSBsY2hhbl9mb3Jfc3Vic2NyKHNtcy0+cmVjZWl2ZXIpOworCWlmIChsY2hhbikgeworCQkvKiBraWNrIHRoZSBzdWJzY3JpYmVyIG9mZiB0aGUgbmV0d29yayAqLworCQlnc200OF90eF9tbV9hdXRoX3JlcShsY2hhbiwgYXV0aF9yYW5kLCAwKTsKKwkJZ3NtNDhfdHhfbW1fYXV0aF9yZWoobGNoYW4pOworCQkvKiBGSVhNRTogY2xvc2UgdGhlIGNoYW5uZWwgZWFybHkgPyovCisJCS8vZ3NtNDhfc2VuZF9ycl9SZWxlYXNlKGxjaGFuKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLy9zdGF0aWMgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSB2b2lkIG9uX2Rzb19sb2FkX3Rva2VuKHZvaWQpCit2b2lkIG9uX2Rzb19sb2FkX3Rva2VuKHZvaWQpCit7CisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfU1VCU0NSLCB0b2tlbl9zdWJzY3JfY2IsIE5VTEwpOworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX1NNUywgdG9rZW5fc21zX2NiLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3RyYW5zYWN0aW9uLmMgYi9vcGVuYnNjL3NyYy90cmFuc2FjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMGQ1MDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy90cmFuc2FjdGlvbi5jCkBAIC0wLDAgKzEsMTcyIEBACisvKiBHU00gMDQuMDcgVHJhbnNhY3Rpb24gaGFuZGxpbmcgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8b3BlbmJzYy90cmFuc2FjdGlvbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21uY2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tbmNjLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9wYWdpbmcuaD4KKwordm9pZCAqdGFsbF90cmFuc19jdHg7CisKK3ZvaWQgX2dzbTQ4X2NjX3RyYW5zX2ZyZWUoc3RydWN0IGdzbV90cmFucyAqdHJhbnMpOworCitzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuc19maW5kX2J5X2lkKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJCSAgIHVfaW50OF90IHByb3RvLCB1X2ludDhfdCB0cmFuc19pZCkKK3sKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuczsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IHN1YnNjci0+bmV0OworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJhbnMsICZuZXQtPnRyYW5zX2xpc3QsIGVudHJ5KSB7CisJCWlmICh0cmFucy0+c3Vic2NyID09IHN1YnNjciAmJgorCQkgICAgdHJhbnMtPnByb3RvY29sID09IHByb3RvICYmCisJCSAgICB0cmFucy0+dHJhbnNhY3Rpb25faWQgPT0gdHJhbnNfaWQpCisJCQlyZXR1cm4gdHJhbnM7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuc19maW5kX2J5X2NhbGxyZWYoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCXVfaW50MzJfdCBjYWxscmVmKQoreworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJhbnMsICZuZXQtPnRyYW5zX2xpc3QsIGVudHJ5KSB7CisJCWlmICh0cmFucy0+Y2FsbHJlZiA9PSBjYWxscmVmKQorCQkJcmV0dXJuIHRyYW5zOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGdzbV90cmFucyAqdHJhbnNfYWxsb2Moc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkgICAgICB1X2ludDhfdCBwcm90b2NvbCwgdV9pbnQ4X3QgdHJhbnNfaWQsCisJCQkgICAgICB1X2ludDMyX3QgY2FsbHJlZikKK3sKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuczsKKworCURFQlVHUChEQ0MsICJzdWJzY3I9JXAsIHN1YnNjci0+bmV0PSVwXG4iLCBzdWJzY3IsIHN1YnNjci0+bmV0KTsKKworCXRyYW5zID0gdGFsbG9jX3plcm8odGFsbF90cmFuc19jdHgsIHN0cnVjdCBnc21fdHJhbnMpOworCWlmICghdHJhbnMpCisJCXJldHVybiBOVUxMOworCisJdHJhbnMtPnN1YnNjciA9IHN1YnNjcjsKKwlzdWJzY3JfZ2V0KHRyYW5zLT5zdWJzY3IpOworCisJdHJhbnMtPnByb3RvY29sID0gcHJvdG9jb2w7CisJdHJhbnMtPnRyYW5zYWN0aW9uX2lkID0gdHJhbnNfaWQ7CisJdHJhbnMtPmNhbGxyZWYgPSBjYWxscmVmOworCisJbGxpc3RfYWRkX3RhaWwoJnRyYW5zLT5lbnRyeSwgJnN1YnNjci0+bmV0LT50cmFuc19saXN0KTsKKworCXJldHVybiB0cmFuczsKK30KKwordm9pZCB0cmFuc19mcmVlKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKQoreworCXN3aXRjaCAodHJhbnMtPnByb3RvY29sKSB7CisJY2FzZSBHU000OF9QRElTQ19DQzoKKwkJX2dzbTQ4X2NjX3RyYW5zX2ZyZWUodHJhbnMpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X1BESVNDX1NNUzoKKwkJX2dzbTQxMV9zbXNfdHJhbnNfZnJlZSh0cmFucyk7CisJCWJyZWFrOworCX0KKworCWlmICh0cmFucy0+Y29ubikKKwkJcHV0X3N1YnNjcl9jb24odHJhbnMtPmNvbm4pOworCisJaWYgKCF0cmFucy0+Y29ubiAmJiB0cmFucy0+c3Vic2NyICYmIHRyYW5zLT5zdWJzY3ItPm5ldCkgeworCQkvKiBTdG9wIHBhZ2luZyBvbiBhbGwgYnRzJyAqLworCQlwYWdpbmdfcmVxdWVzdF9zdG9wKE5VTEwsIHRyYW5zLT5zdWJzY3IsIE5VTEwpOworCX0KKworCWlmICh0cmFucy0+c3Vic2NyKQorCQlzdWJzY3JfcHV0KHRyYW5zLT5zdWJzY3IpOworCisJbGxpc3RfZGVsKCZ0cmFucy0+ZW50cnkpOworCisJdGFsbG9jX2ZyZWUodHJhbnMpOworfQorCisvKiBhbGxvY2F0ZSBhbiB1bnVzZWQgdHJhbnNhY3Rpb24gSUQgZm9yIHRoZSBnaXZlbiBzdWJzY3JpYmVyCisgKiBpbiB0aGUgZ2l2ZW4gcHJvdG9jb2wgdXNpbmcgdGhlIHRpX2ZsYWcgc3BlY2lmaWVkICovCitpbnQgdHJhbnNfYXNzaWduX3RyYW5zX2lkKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJICB1X2ludDhfdCBwcm90b2NvbCwgdV9pbnQ4X3QgdGlfZmxhZykKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IHN1YnNjci0+bmV0OworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zOworCXVuc2lnbmVkIGludCB1c2VkX3RpZF9iaXRtYXNrID0gMDsKKwlpbnQgaSwgaiwgaDsKKworCWlmICh0aV9mbGFnKQorCQl0aV9mbGFnID0gMHg4OworCisJLyogZ2VuZXJhdGUgYml0bWFzayBvZiBhbHJlYWR5LXVzZWQgVElEcyBmb3IgdGhpcyAoc3Vic2NyLHByb3RvKSAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyYW5zLCAmbmV0LT50cmFuc19saXN0LCBlbnRyeSkgeworCQlpZiAodHJhbnMtPnN1YnNjciAhPSBzdWJzY3IgfHwKKwkJICAgIHRyYW5zLT5wcm90b2NvbCAhPSBwcm90b2NvbCB8fAorCQkgICAgdHJhbnMtPnRyYW5zYWN0aW9uX2lkID09IDB4ZmYpCisJCQljb250aW51ZTsKKwkJdXNlZF90aWRfYml0bWFzayB8PSAoMSA8PCB0cmFucy0+dHJhbnNhY3Rpb25faWQpOworCX0KKworCS8qIGZpbmQgYSBuZXcgb25lLCB0cnlpbmcgdG8gZ28gaW4gYSAnY2lyY3VsYXInIHBhdHRlcm4gKi8KKwlmb3IgKGggPSA2OyBoID4gMDsgaC0tKQorCQlpZiAodXNlZF90aWRfYml0bWFzayAmICgxIDw8IChoIHwgdGlfZmxhZykpKQorCQkJYnJlYWs7CisJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCQlqID0gKChoICsgaSkgJSA3KSB8IHRpX2ZsYWc7CisJCWlmICgodXNlZF90aWRfYml0bWFzayAmICgxIDw8IGopKSA9PSAwKQorCQkJcmV0dXJuIGo7CisJfQorCisJcmV0dXJuIC0xOworfQorCisvKiB1cGRhdGUgYWxsIHRyYW5zYWN0aW9ucyB0byB1c2UgYSBkaWZmZXJlbnQgTENIQU4sIGUuZy4KKyAqIGFmdGVyIGhhbmRvdmVyIGhhcyBzdWNjZWVkZWQgKi8KK2ludCB0cmFuc19sY2hhbl9jaGFuZ2Uoc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm5fb2xkLAorCQkgICAgICAgc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm5fbmV3KQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gY29ubl9vbGQtPmxjaGFuLT50cy0+dHJ4LT5idHMtPm5ldHdvcms7CisJc3RydWN0IGdzbV90cmFucyAqdHJhbnM7CisJaW50IG51bSA9IDA7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cmFucywgJm5ldC0+dHJhbnNfbGlzdCwgZW50cnkpIHsKKwkJaWYgKHRyYW5zLT5jb25uID09IGNvbm5fb2xkKSB7CisKKwkJCS8qIGRyb3Agb2xkIGNoYW5uZWwgdXNlIGNvdW50ICovCisJCQlwdXRfc3Vic2NyX2Nvbihjb25uX29sZCk7CisJCQkvKiBhc3NpZ24gbmV3IGNoYW5uZWwgKi8KKwkJCXRyYW5zLT5jb25uID0gY29ubl9uZXc7CisJCQkvKiBidW1wIG5ldyBjaGFubmVsIHVzZSBjb3VudCAqLworCQkJdXNlX3N1YnNjcl9jb24oY29ubl9uZXcpOworCQkJbnVtKys7CisJCX0KKwl9CisKKwlyZXR1cm4gbnVtOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvdHJhdV9mcmFtZS5jIGIvb3BlbmJzYy9zcmMvdHJhdV9mcmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYzYxYTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy90cmF1X2ZyYW1lLmMKQEAgLTAsMCArMSwyNjEgQEAKKy8qIFRSQVUgZnJhbWUgaGFuZGxpbmcgYWNjb3JkaW5nIHRvIEdTTSBUUyAwOC42MCAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL3RyYXVfZnJhbWUuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3N1YmNoYW5fZGVtdXguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisKK3N0YXRpYyB1X2ludDMyX3QgZ2V0X2JpdHMoY29uc3QgdV9pbnQ4X3QgKmJpdGJ1ZiwgaW50IG9mZnNldCwgaW50IG51bSkKK3sKKwlpbnQgaTsKKwl1X2ludDMyX3QgcmV0ID0gMDsKKworCWZvciAoaSA9IG9mZnNldDsgaSA8IG9mZnNldCArIG51bTsgaSsrKSB7CisJCXJldCA9IHJldCA8PCAxOworCQlpZiAoYml0YnVmW2ldKQorCQkJcmV0IHw9IDE7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIERlY29kZSBhY2NvcmRpbmcgdG8gMy4xLjEgKi8KK3N0YXRpYyB2b2lkIGRlY29kZV9mcihzdHJ1Y3QgZGVjb2RlZF90cmF1X2ZyYW1lICpmciwgY29uc3QgdV9pbnQ4X3QgKnRyYXVfYml0cykKK3sKKwlpbnQgaTsKKwlpbnQgZF9pZHggPSAwOworCisJLyogQzEgLi4gQzE1ICovCisJbWVtY3B5KGZyLT5jX2JpdHMrMCwgdHJhdV9iaXRzKzE3LCAxNSk7CisJLyogQzE2IC4uIEMyMSAqLworCW1lbWNweShmci0+Y19iaXRzKzE1LCB0cmF1X2JpdHMrMzEwLCA2KTsKKwkvKiBUMSAuLiBUNCAqLworCW1lbWNweShmci0+dF9iaXRzKzAsIHRyYXVfYml0cyszMTYsIDQpOworCS8qIEQxIC4uIEQyNTUgKi8KKwlmb3IgKGkgPSAzMjsgaSA8IDMwNDsgaSs9IDE2KSB7CisJCW1lbWNweShmci0+ZF9iaXRzICsgZF9pZHgsIHRyYXVfYml0cytpKzEsIDE1KTsKKwkJZF9pZHggKz0gMTU7CisJfQorCS8qIEQyNTYgLi4gRDI2MCAqLworCW1lbWNweShmci0+ZF9iaXRzICsgZF9pZHgsIHRyYXVfYml0cyArIDMwNSwgNSk7Cit9CisKKy8qIERlY29kZSBhY2NvcmRpbmcgdG8gMy4xLjIgKi8KK3N0YXRpYyB2b2lkIGRlY29kZV9hbXIoc3RydWN0IGRlY29kZWRfdHJhdV9mcmFtZSAqZnIsIGNvbnN0IHVfaW50OF90ICp0cmF1X2JpdHMpCit7CisJaW50IGk7CisJaW50IGRfaWR4ID0gMDsKKworCS8qIEMxIC4uIEMxNSAqLworCW1lbWNweShmci0+Y19iaXRzKzAsIHRyYXVfYml0cysxNywgMTUpOworCS8qIEMxNiAuLiBDMjUgKi8KKwltZW1jcHkoZnItPmNfYml0cysxNSwgdHJhdV9iaXRzKzMzLCAxMCk7CisJLyogVDEgLi4gVDQgKi8KKwltZW1jcHkoZnItPnRfYml0cyswLCB0cmF1X2JpdHMrMzE2LCA0KTsKKwkvKiBEMSAuLiBENSAqLworCW1lbWNweShmci0+ZF9iaXRzLCB0cmF1X2JpdHMrNDMsIDUpOworCS8qIEQ2IC4uIEQyNDUgKi8KKwlmb3IgKGkgPSA0ODsgaSA8IDMwNDsgaSArPSAxNikgeworCQltZW1jcHkoZnItPmRfYml0cyArIGRfaWR4LCB0cmF1X2JpdHMraSsxLCAxNSk7CisJCWRfaWR4ICs9IDE1OworCX0KKwkvKiBEMjQ2IC4uIEQyNTYgKi8KKwltZW1jcHkoZnItPmRfYml0cyArIGRfaWR4LCB0cmF1X2JpdHMgKyAzMDUsIDExKTsKK30KKworaW50IGRlY29kZV90cmF1X2ZyYW1lKHN0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgKmZyLCBjb25zdCB1X2ludDhfdCAqdHJhdV9iaXRzKQoreworCXVfaW50OF90IGNiaXRzNSA9IGdldF9iaXRzKHRyYXVfYml0cywgMTcsIDUpOworCisJc3dpdGNoIChjYml0czUpIHsKKwljYXNlIFRSQVVfRlRfRlJfVVA6CisJY2FzZSBUUkFVX0ZUX0ZSX0RPV046CisJY2FzZSBUUkFVX0ZUX0lETEVfVVA6CisJY2FzZSBUUkFVX0ZUX0lETEVfRE9XTjoKKwljYXNlIFRSQVVfRlRfRUZSOgorCQlkZWNvZGVfZnIoZnIsIHRyYXVfYml0cyk7CisJCWJyZWFrOworCWNhc2UgVFJBVV9GVF9BTVI6CisJCWRlY29kZV9hbXIoZnIsIHRyYXVfYml0cyk7CisJCWJyZWFrOworCWNhc2UgVFJBVV9GVF9PTV9VUDoKKwljYXNlIFRSQVVfRlRfT01fRE9XTjoKKwljYXNlIFRSQVVfRlRfREFUQV9VUDoKKwljYXNlIFRSQVVfRlRfREFUQV9ET1dOOgorCWNhc2UgVFJBVV9GVF9EMTQ1X1NZTkM6CisJY2FzZSBUUkFVX0ZUX0VEQVRBOgorCQlMT0dQKERNVVgsIExPR0xfTk9USUNFLCAiY2FuJ3QgZGVjb2RlIHVuaW1wbGVtZW50ZWQgVFJBVSAiCisJCQkiRnJhbWUgVHlwZSAweCUwMnhcbiIsIGNiaXRzNSk7CisJCXJldHVybiAtMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETVVYLCBMT0dMX05PVElDRSwgImNhbid0IGRlY29kZSB1bmtub3duIFRSQVUgIgorCQkJIkZyYW1lIFR5cGUgMHglMDJ4XG4iLCBjYml0czUpOworCQlyZXR1cm4gLTE7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitjb25zdCB1X2ludDhfdCBmdF9mcl9kb3duX2JpdHNbXSA9IHsgMSwgMSwgMSwgMCwgMCB9OworY29uc3QgdV9pbnQ4X3QgZnRfaWRsZV9kb3duX2JpdHNbXSA9IHsgMCwgMSwgMSwgMSwgMCB9OworCisvKiBtb2RpZnkgYW4gdXBsaW5rIFRSQVUgZnJhbWUgc28gd2UgY2FuIHNlbmQgaXQgZG93bmxpbmsgKi8KK2ludCB0cmF1X2ZyYW1lX3VwMmRvd24oc3RydWN0IGRlY29kZWRfdHJhdV9mcmFtZSAqZnIpCit7CisJdV9pbnQ4X3QgY2JpdHM1ID0gZ2V0X2JpdHMoZnItPmNfYml0cywgMCwgNSk7CisKKwlzd2l0Y2ggKGNiaXRzNSkgeworCWNhc2UgVFJBVV9GVF9GUl9VUDoKKwkJbWVtY3B5KGZyLT5jX2JpdHMsIGZ0X2ZyX2Rvd25fYml0cywgNSk7CisJCS8qIGNsZWFyIHRpbWUgYWxpZ25tZW50ICovCisJCW1lbXNldChmci0+Y19iaXRzKzUsIDAsIDYpOworCQkvKiBGSVhNRTogU1AgLyBCRkkgaW4gY2FzZSBvZiBEVHggKi8KKwkJLyogQzEyIC4uIEMyMSBhcmUgc3BhcmUgYW5kIGNvZGVkIGFzICcxJyAqLworCQltZW1zZXQoZnItPmNfYml0cysxMSwgMHgwMSwgMTApOworCQlicmVhazsKKwljYXNlIFRSQVVfRlRfRUZSOgorCQkvKiBjbGVhciB0aW1lIGFsaWdubWVudCAqLworCQltZW1zZXQoZnItPmNfYml0cys1LCAwLCA2KTsKKwkJLyogRklYTUU6IHNldCBVRkUgYXBwcm9wcmlhdGVseSAqLworCQkvKiBGSVhNRTogU1AgLyBCRkkgaW4gY2FzZSBvZiBEVHggKi8KKwkJYnJlYWs7CisJY2FzZSBUUkFVX0ZUX0lETEVfVVA6CisJCW1lbWNweShmci0+Y19iaXRzLCBmdF9pZGxlX2Rvd25fYml0cywgNSk7CisJCS8qIGNsZWFyIHRpbWUgYWxpZ25tZW50ICovCisJCW1lbXNldChmci0+Y19iaXRzKzUsIDAsIDYpOworCQkvKiBGSVhNRTogU1AgLyBCRkkgaW4gY2FzZSBvZiBEVHggKi8KKwkJLyogQzEyIC4uIEMyMSBhcmUgc3BhcmUgYW5kIGNvZGVkIGFzICcxJyAqLworCQltZW1zZXQoZnItPmNfYml0cysxMSwgMHgwMSwgMTApOworCQlicmVhazsKKwljYXNlIFRSQVVfRlRfRlJfRE9XTjoKKwljYXNlIFRSQVVfRlRfSURMRV9ET1dOOgorCWNhc2UgVFJBVV9GVF9PTV9ET1dOOgorCWNhc2UgVFJBVV9GVF9EQVRBX0RPV046CisJCS8qIHdlIGNhbm5vdCBjb252ZXJ0IGEgZG93bmxpbmsgdG8gYSBkb3dubGluayBmcmFtZSAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBUUkFVX0ZUX0FNUjoKKwljYXNlIFRSQVVfRlRfT01fVVA6CisJY2FzZSBUUkFVX0ZUX0RBVEFfVVA6CisJY2FzZSBUUkFVX0ZUX0QxNDVfU1lOQzoKKwljYXNlIFRSQVVfRlRfRURBVEE6CisJCUxPR1AoRE1VWCwgTE9HTF9OT1RJQ0UsICJ1bmltcGxlbWVudGVkIFRSQVUgRnJhbWUgVHlwZSAiCisJCQkiMHglMDJ4XG4iLCBjYml0czUpOworCQlyZXR1cm4gLTE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE1VWCwgTE9HTF9OT1RJQ0UsICJ1bmtub3duIFRSQVUgRnJhbWUgVHlwZSAiCisJCQkiMHglMDJ4XG4iLCBjYml0czUpOworCQlyZXR1cm4gLTE7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworCit9CisKK3N0YXRpYyB2b2lkIGVuY29kZV9mcih1X2ludDhfdCAqdHJhdV9iaXRzLCBjb25zdCBzdHJ1Y3QgZGVjb2RlZF90cmF1X2ZyYW1lICpmcikKK3sKKwlpbnQgaTsKKwlpbnQgZF9pZHggPSAwOworCisJdHJhdV9iaXRzWzE2XSA9IDE7CisJLyogQzEgLi4gQzE1ICovCisJbWVtY3B5KHRyYXVfYml0cysxNywgZnItPmNfYml0cyswLCAxNSk7CisJLyogRDEgLi4gRDI1NSAqLworCWZvciAoaSA9IDMyOyBpIDwgMzA0OyBpKz0gMTYpIHsKKwkJdHJhdV9iaXRzW2ldID0gMTsKKwkJbWVtY3B5KHRyYXVfYml0cytpKzEsIGZyLT5kX2JpdHMgKyBkX2lkeCwgMTUpOworCQlkX2lkeCArPSAxNTsKKwl9CisJLyogRDI1NiAuLiBEMjYwICovCisJdHJhdV9iaXRzWzMwNF0gPSAxOworCW1lbWNweSh0cmF1X2JpdHMgKyAzMDUsIGZyLT5kX2JpdHMgKyBkX2lkeCwgNSk7CisJLyogQzE2IC4uIEMyMSAqLworCW1lbWNweSh0cmF1X2JpdHMrMzEwLCBmci0+Y19iaXRzKzE1LCA2KTsKKworCS8qIEZJWE1FOiBoYW5kbGUgdGltaW5nIGFkanVzdG1lbnQgKi8KKworCS8qIFQxIC4uIFQ0ICovCisJbWVtY3B5KHRyYXVfYml0cyszMTYsIGZyLT50X2JpdHMrMCwgNCk7Cit9CisKKworaW50IGVuY29kZV90cmF1X2ZyYW1lKHVfaW50OF90ICp0cmF1X2JpdHMsIGNvbnN0IHN0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgKmZyKQoreworCXVfaW50OF90IGNiaXRzNSA9IGdldF9iaXRzKGZyLT5jX2JpdHMsIDAsIDUpOworCQorCS8qIDE2IGJpdHMgb2Ygc3luYyBoZWFkZXIgKi8KKwltZW1zZXQodHJhdV9iaXRzLCAwLCAxNik7CisKKwlzd2l0Y2ggKGNiaXRzNSkgeworCWNhc2UgVFJBVV9GVF9GUl9VUDoKKwljYXNlIFRSQVVfRlRfRlJfRE9XTjoKKwljYXNlIFRSQVVfRlRfSURMRV9VUDoKKwljYXNlIFRSQVVfRlRfSURMRV9ET1dOOgorCWNhc2UgVFJBVV9GVF9FRlI6CisJCWVuY29kZV9mcih0cmF1X2JpdHMsIGZyKTsKKwkJYnJlYWs7CisJY2FzZSBUUkFVX0ZUX0FNUjoKKwljYXNlIFRSQVVfRlRfT01fVVA6CisJY2FzZSBUUkFVX0ZUX09NX0RPV046CisJY2FzZSBUUkFVX0ZUX0RBVEFfVVA6CisJY2FzZSBUUkFVX0ZUX0RBVEFfRE9XTjoKKwljYXNlIFRSQVVfRlRfRDE0NV9TWU5DOgorCWNhc2UgVFJBVV9GVF9FREFUQToKKwkJTE9HUChETVVYLCBMT0dMX05PVElDRSwgInVuaW1wbGVtZW50ZWQgVFJBVSBGcmFtZSBUeXBlICIKKwkJCSIweCUwMnhcbiIsIGNiaXRzNSk7CisJCXJldHVybiAtMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETVVYLCBMT0dMX05PVElDRSwgInVua25vd24gVFJBVSBGcmFtZSBUeXBlICIKKwkJCSIweCUwMnhcbiIsIGNiaXRzNSk7CisJCXJldHVybiAtMTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVjb2RlZF90cmF1X2ZyYW1lIGZyX2lkbGVfZnJhbWUgPSB7CisJLmNfYml0cyA9IHsgMCwgMSwgMSwgMSwgMCB9LAkvKiBJRExFIERPV05MSU5LIDMuNS41ICovCisJLnRfYml0cyA9IHsgMSwgMSwgMSwgMSB9LAorfTsKK3N0YXRpYyB1X2ludDhfdCBlbmNvZGVkX2lkbGVfZnJhbWVbVFJBVV9GUkFNRV9CSVRTXTsKK3N0YXRpYyBpbnQgZGJpdHNfaW5pdHRlZDsKKwordV9pbnQ4X3QgKnRyYXVfaWRsZV9mcmFtZSh2b2lkKQoreworCS8qIG9ubHkgaW5pdGlhbGl6ZSBkdXJpbmcgdGhlIGZpcnN0IGNhbGwgKi8KKwlpZiAoIWRiaXRzX2luaXR0ZWQpIHsKKwkJLyogc2V0IGFsbCBELWJpdHMgdG8gMSAqLworCQltZW1zZXQoJmZyX2lkbGVfZnJhbWUuZF9iaXRzLCAweDAxLCAyNjApOworCQllbmNvZGVfZnIoZW5jb2RlZF9pZGxlX2ZyYW1lLCAmZnJfaWRsZV9mcmFtZSk7CisJfQorCXJldHVybiBlbmNvZGVkX2lkbGVfZnJhbWU7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy90cmF1X211eC5jIGIvb3BlbmJzYy9zcmMvdHJhdV9tdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmZhNWMwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdHJhdV9tdXguYwpAQCAtMCwwICsxLDMxMyBAQAorLyogU2ltcGxlIFRSQVUgZnJhbWUgcmVmbGVjdG9yIHRvIHJvdXRlIHZvaWNlIGNhbGxzICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmF1X2ZyYW1lLmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmF1X211eC5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc3ViY2hhbl9kZW11eC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZTFfaW5wdXQuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKK3VfaW50OF90IGdzbV9mcl9tYXBbXSA9IHsKKwk2LCA2LCA1LCA1LCA0LCA0LCAzLCAzLAorCTcsIDIsIDIsIDYsIDMsIDMsIDMsIDMsCisJMywgMywgMywgMywgMywgMywgMywgMywKKwkzLCA3LCAyLCAyLCA2LCAzLCAzLCAzLAorCTMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisJMywgMywgNywgMiwgMiwgNiwgMywgMywKKwkzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAorCTMsIDMsIDMsIDcsIDIsIDIsIDYsIDMsCisJMywgMywgMywgMywgMywgMywgMywgMywKKwkzLCAzLCAzLCAzCit9OworCitzdHJ1Y3QgbWFwX2VudHJ5IHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCBzcmMsIGRzdDsKK307CisKK3N0cnVjdCB1cHF1ZXVlX2VudHJ5IHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0OworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCBzcmM7CisJdV9pbnQzMl90IGNhbGxyZWY7Cit9OworCitzdGF0aWMgTExJU1RfSEVBRChzc19tYXApOworc3RhdGljIExMSVNUX0hFQUQoc3NfdXBxdWV1ZSk7CisKK3ZvaWQgKnRhbGxfbWFwX2N0eCwgKnRhbGxfdXBxX2N0eDsKKworLyogbWFwIG9uZSBwYXJ0aWN1bGFyIHN1YnNsb3QgdG8gYW5vdGhlciBzdWJzbG90ICovCitpbnQgdHJhdV9tdXhfbWFwKGNvbnN0IHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqc3JjLAorCQkgY29uc3Qgc3RydWN0IGdzbV9lMV9zdWJzbG90ICpkc3QpCit7CisJc3RydWN0IG1hcF9lbnRyeSAqbWU7CisKKwltZSA9IHRhbGxvYyh0YWxsX21hcF9jdHgsIHN0cnVjdCBtYXBfZW50cnkpOworCWlmICghbWUpIHsKKwkJTE9HUChETUlCLCBMT0dMX0ZBVEFMLCAiT3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCURFQlVHUChEQ0MsICJTZXR0aW5nIHVwIFRSQVUgbXV4IG1hcCBiZXR3ZWVuIChlMT0ldSx0cz0ldSxzcz0ldSkgIgorCQkiYW5kIChlMT0ldSx0cz0ldSxzcz0ldSlcbiIsCisJCXNyYy0+ZTFfbnIsIHNyYy0+ZTFfdHMsIHNyYy0+ZTFfdHNfc3MsCisJCWRzdC0+ZTFfbnIsIGRzdC0+ZTFfdHMsIGRzdC0+ZTFfdHNfc3MpOworCisJLyogbWFrZSBzdXJlIHRvIGdldCByaWQgb2YgYW55IHN0YWxlIG9sZCBtYXBwaW5ncyAqLworCXRyYXVfbXV4X3VubWFwKHNyYywgMCk7CisJdHJhdV9tdXhfdW5tYXAoZHN0LCAwKTsKKworCW1lbWNweSgmbWUtPnNyYywgc3JjLCBzaXplb2YobWUtPnNyYykpOworCW1lbWNweSgmbWUtPmRzdCwgZHN0LCBzaXplb2YobWUtPmRzdCkpOworCWxsaXN0X2FkZCgmbWUtPmxpc3QsICZzc19tYXApOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB0cmF1X211eF9tYXBfbGNoYW4oY29uc3Qgc3RydWN0IGdzbV9sY2hhbiAqc3JjLAkKKwkJCWNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKmRzdCkKK3sKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKnNyY19zcywgKmRzdF9zczsKKworCXNyY19zcyA9ICZzcmMtPnRzLT5lMV9saW5rOworCWRzdF9zcyA9ICZkc3QtPnRzLT5lMV9saW5rOworCisJcmV0dXJuIHRyYXVfbXV4X21hcChzcmNfc3MsIGRzdF9zcyk7Cit9CisKKworLyogdW5tYXAgb25lIHBhcnRpY3VsYXIgc3Vic2xvdCBmcm9tIGFub3RoZXIgc3Vic2xvdCAqLworaW50IHRyYXVfbXV4X3VubWFwKGNvbnN0IHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqc3MsIHVfaW50MzJfdCBjYWxscmVmKQoreworCXN0cnVjdCBtYXBfZW50cnkgKm1lLCAqbWUyOworCXN0cnVjdCB1cHF1ZXVlX2VudHJ5ICp1ZSwgKnVlMjsKKworCWlmIChzcykKKwkJbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtZSwgbWUyLCAmc3NfbWFwLCBsaXN0KSB7CisJCQlpZiAoIW1lbWNtcCgmbWUtPnNyYywgc3MsIHNpemVvZigqc3MpKSB8fAorCQkJICAgICFtZW1jbXAoJm1lLT5kc3QsIHNzLCBzaXplb2YoKnNzKSkpIHsKKwkJCQlsbGlzdF9kZWwoJm1lLT5saXN0KTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCWxsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodWUsIHVlMiwgJnNzX3VwcXVldWUsIGxpc3QpIHsKKwkJaWYgKHVlLT5jYWxscmVmID09IGNhbGxyZWYpIHsKKwkJCWxsaXN0X2RlbCgmdWUtPmxpc3QpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKHNzICYmICFtZW1jbXAoJnVlLT5zcmMsIHNzLCBzaXplb2YoKnNzKSkpIHsKKwkJCWxsaXN0X2RlbCgmdWUtPmxpc3QpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC1FTk9FTlQ7Cit9CisKKy8qIGxvb2stdXAgYW4gZW50eSBpbiB0aGUgVFJBVSBtdXggbWFwICovCitzdGF0aWMgc3RydWN0IGdzbV9lMV9zdWJzbG90ICoKK2xvb2t1cF90cmF1X211eF9tYXAoY29uc3Qgc3RydWN0IGdzbV9lMV9zdWJzbG90ICpzcmMpCit7CisJc3RydWN0IG1hcF9lbnRyeSAqbWU7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShtZSwgJnNzX21hcCwgbGlzdCkgeworCQlpZiAoIW1lbWNtcCgmbWUtPnNyYywgc3JjLCBzaXplb2YoKnNyYykpKQorCQkJcmV0dXJuICZtZS0+ZHN0OworCQlpZiAoIW1lbWNtcCgmbWUtPmRzdCwgc3JjLCBzaXplb2YoKnNyYykpKQorCQkJcmV0dXJuICZtZS0+c3JjOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogbG9vay11cCBhbiBlbnR5IGluIHRoZSBUUkFVIHVwcXVldWUgKi8KK3N0cnVjdCB1cHF1ZXVlX2VudHJ5ICoKK2xvb2t1cF90cmF1X3VwcXVldWUoY29uc3Qgc3RydWN0IGdzbV9lMV9zdWJzbG90ICpzcmMpCit7CisJc3RydWN0IHVwcXVldWVfZW50cnkgKnVlOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodWUsICZzc191cHF1ZXVlLCBsaXN0KSB7CisJCWlmICghbWVtY21wKCZ1ZS0+c3JjLCBzcmMsIHNpemVvZigqc3JjKSkpCisJCQlyZXR1cm4gdWU7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgY19iaXRzX2NoZWNrW10gPSB7IDAsIDAsIDAsIDEsIDAgfTsKKworLyogd2UgZ2V0IGNhbGxlZCBieSBzdWJjaGFuX2RlbXV4ICovCitpbnQgdHJhdV9tdXhfaW5wdXQoc3RydWN0IGdzbV9lMV9zdWJzbG90ICpzcmNfZTFfc3MsCisJCSAgIGNvbnN0IHVfaW50OF90ICp0cmF1X2JpdHMsIGludCBudW1fYml0cykKK3sKKwlzdHJ1Y3QgZGVjb2RlZF90cmF1X2ZyYW1lIHRmOworCXVfaW50OF90IHRyYXVfYml0c19vdXRbVFJBVV9GUkFNRV9CSVRTXTsKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKmRzdF9lMV9zcyA9IGxvb2t1cF90cmF1X211eF9tYXAoc3JjX2UxX3NzKTsKKwlzdHJ1Y3Qgc3ViY2hfbXV4ICpteDsKKwlzdHJ1Y3QgdXBxdWV1ZV9lbnRyeSAqdWU7CisJaW50IHJjOworCisJLyogZGVjb2RlIFRSQVUsIGNoYW5nZSBpdCB0byBkb3dubGluaywgcmUtZW5jb2RlICovCisJcmMgPSBkZWNvZGVfdHJhdV9mcmFtZSgmdGYsIHRyYXVfYml0cyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZiAoIWRzdF9lMV9zcykgeworCQlzdHJ1Y3QgbXNnYiAqbXNnOworCQlzdHJ1Y3QgZ3NtX2RhdGFfZnJhbWUgKmZyYW1lOworCQl1bnNpZ25lZCBjaGFyICpkYXRhOworCQlpbnQgaSwgaiwgaywgbCwgbzsKKwkJLyogZnJhbWUgc2hhbGwgYmUgc2VudCB0byB1cHF1ZXVlICovCisJCWlmICghKHVlID0gbG9va3VwX3RyYXVfdXBxdWV1ZShzcmNfZTFfc3MpKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIXVlLT5jYWxscmVmKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChtZW1jbXAodGYuY19iaXRzLCBjX2JpdHNfY2hlY2ssIHNpemVvZihjX2JpdHNfY2hlY2spKSkKKwkJCURFQlVHUEMoRE1VWCwgImlsbGVnYWwgdHJhdSAoQzEtQzUpICVzXG4iLAorCQkJCWhleGR1bXAodGYuY19iaXRzLCBzaXplb2YoY19iaXRzX2NoZWNrKSkpOworCQltc2cgPSBtc2diX2FsbG9jKHNpemVvZihzdHJ1Y3QgZ3NtX2RhdGFfZnJhbWUpICsgMzMsCisJCQkJICJHU00tREFUQSIpOworCQlpZiAoIW1zZykKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWZyYW1lID0gKHN0cnVjdCBnc21fZGF0YV9mcmFtZSAqKW1zZy0+ZGF0YTsKKwkJbWVtc2V0KGZyYW1lLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9kYXRhX2ZyYW1lKSk7CisJCWRhdGEgPSBmcmFtZS0+ZGF0YTsKKwkJZGF0YVswXSA9IDB4ZCA8PCA0OworCQkvKiByZWFzc2VtYmxlIGQtYml0cyAqLworCQlpID0gMDsgLyogY291bnRzIGJpdHMgKi8KKwkJaiA9IDQ7IC8qIGNvdW50cyBvdXRwdXQgYml0cyAqLworCQlrID0gZ3NtX2ZyX21hcFswXS0xOyAvKiBjdXJyZW50IG51bWJlciBiaXQgaW4gZWxlbWVudCAqLworCQlsID0gMDsgLyogY291bnRzIGVsZW1lbnQgYml0cyAqLworCQlvID0gMDsgLyogb2Zmc2V0IGlucHV0IGJpdHMgKi8KKwkJd2hpbGUgKGkgPCAyNjApIHsKKwkJCWRhdGFbai84XSB8PSAodGYuZF9iaXRzW2srb10gPDwgKDctKGolOCkpKTsKKwkJCWlmICgtLWsgPCAwKSB7CisJCQkJbyArPSBnc21fZnJfbWFwW2xdOworCQkJCWsgPSBnc21fZnJfbWFwWysrbF0tMTsKKwkJCX0KKwkJCWkrKzsKKwkJCWorKzsKKwkJfQorCQlmcmFtZS0+bXNnX3R5cGUgPSBHU01fVENIRl9GUkFNRTsKKwkJZnJhbWUtPmNhbGxyZWYgPSB1ZS0+Y2FsbHJlZjsKKwkJbXNnYl9lbnF1ZXVlKCZ1ZS0+bmV0LT51cHF1ZXVlLCBtc2cpOworCisJCXJldHVybiAwOworCX0KKworCW14ID0gZTFpbnBfZ2V0X211eChkc3RfZTFfc3MtPmUxX25yLCBkc3RfZTFfc3MtPmUxX3RzKTsKKwlpZiAoIW14KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRyYXVfZnJhbWVfdXAyZG93bigmdGYpOworCWVuY29kZV90cmF1X2ZyYW1lKHRyYXVfYml0c19vdXQsICZ0Zik7CisKKwkvKiBhbmQgc2VuZCBpdCB0byB0aGUgbXV4ZXIgKi8KKwlyZXR1cm4gc3ViY2hhbl9tdXhfZW5xdWV1ZShteCwgZHN0X2UxX3NzLT5lMV90c19zcywgdHJhdV9iaXRzX291dCwKKwkJCQkgICBUUkFVX0ZSQU1FX0JJVFMpOworfQorCisvKiBhZGQgcmVjZWl2ZXIgaW5zdGFuY2UgZm9yIGxjaGFuIGFuZCBjYWxscmVmICovCitpbnQgdHJhdV9yZWN2X2xjaGFuKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDMyX3QgY2FsbHJlZikKK3sKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKnNyY19zczsKKwlzdHJ1Y3QgdXBxdWV1ZV9lbnRyeSAqdWU7CisKKwl1ZSA9IHRhbGxvYyh0YWxsX3VwcV9jdHgsIHN0cnVjdCB1cHF1ZXVlX2VudHJ5KTsKKwlpZiAoIXVlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNyY19zcyA9ICZsY2hhbi0+dHMtPmUxX2xpbms7CisKKwlERUJVR1AoRENDLCAiU2V0dGluZyB1cCBUUkFVIHJlY2VpdmVyIChlMT0ldSx0cz0ldSxzcz0ldSkgIgorCQkiYW5kIChjYWxscmVmIDB4JXgpXG4iLAorCQlzcmNfc3MtPmUxX25yLCBzcmNfc3MtPmUxX3RzLCBzcmNfc3MtPmUxX3RzX3NzLAorCQljYWxscmVmKTsKKworCS8qIG1ha2Ugc3VyZSB0byBnZXQgcmlkIG9mIGFueSBzdGFsZSBvbGQgbWFwcGluZ3MgKi8KKwl0cmF1X211eF91bm1hcChzcmNfc3MsIGNhbGxyZWYpOworCisJbWVtY3B5KCZ1ZS0+c3JjLCBzcmNfc3MsIHNpemVvZih1ZS0+c3JjKSk7CisJdWUtPm5ldCA9IGxjaGFuLT50cy0+dHJ4LT5idHMtPm5ldHdvcms7CisJdWUtPmNhbGxyZWYgPSBjYWxscmVmOworCWxsaXN0X2FkZCgmdWUtPmxpc3QsICZzc191cHF1ZXVlKTsKKworCXJldHVybiAwOworfQorCitpbnQgdHJhdV9zZW5kX2ZyYW1lKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBzdHJ1Y3QgZ3NtX2RhdGFfZnJhbWUgKmZyYW1lKQoreworCXVfaW50OF90IHRyYXVfYml0c19vdXRbVFJBVV9GUkFNRV9CSVRTXTsKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKmRzdF9lMV9zcyA9ICZsY2hhbi0+dHMtPmUxX2xpbms7CisJc3RydWN0IHN1YmNoX211eCAqbXg7CisJaW50IGksIGosIGssIGwsIG87CisJdW5zaWduZWQgY2hhciAqZGF0YSA9IGZyYW1lLT5kYXRhOworCXN0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgdGY7CisKKwlteCA9IGUxaW5wX2dldF9tdXgoZHN0X2UxX3NzLT5lMV9uciwgZHN0X2UxX3NzLT5lMV90cyk7CisJaWYgKCFteCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKGZyYW1lLT5tc2dfdHlwZSkgeworCWNhc2UgR1NNX1RDSEZfRlJBTUU6CisJCS8qIHNldCBjLWJpdHMgYW5kIHQtYml0cyAqLworCQl0Zi5jX2JpdHNbMF0gPSAxOworCQl0Zi5jX2JpdHNbMV0gPSAxOworCQl0Zi5jX2JpdHNbMl0gPSAxOworCQl0Zi5jX2JpdHNbM10gPSAwOworCQl0Zi5jX2JpdHNbNF0gPSAwOworCQltZW1zZXQoJnRmLmNfYml0c1s1XSwgMCwgNik7CisJCW1lbXNldCgmdGYuY19iaXRzWzExXSwgMSwgMTApOworCQltZW1zZXQoJnRmLnRfYml0c1swXSwgMSwgNCk7CisJCS8qIHJlYXNzZW1ibGUgZC1iaXRzICovCisJCWkgPSAwOyAvKiBjb3VudHMgYml0cyAqLworCQlqID0gNDsgLyogY291bnRzIGlucHV0IGJpdHMgKi8KKwkJayA9IGdzbV9mcl9tYXBbMF0tMTsgLyogY3VycmVudCBudW1iZXIgYml0IGluIGVsZW1lbnQgKi8KKwkJbCA9IDA7IC8qIGNvdW50cyBlbGVtZW50IGJpdHMgKi8KKwkJbyA9IDA7IC8qIG9mZnNldCBvdXRwdXQgYml0cyAqLworCQl3aGlsZSAoaSA8IDI2MCkgeworCQkJdGYuZF9iaXRzW2srb10gPSAoZGF0YVtqLzhdID4+ICg3LShqJTgpKSkgJiAxOworCQkJaWYgKC0tayA8IDApIHsKKwkJCQlvICs9IGdzbV9mcl9tYXBbbF07CisJCQkJayA9IGdzbV9mcl9tYXBbKytsXS0xOworCQkJfQorCQkJaSsrOworCQkJaisrOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUEMoRE1VWCwgInVuc3VwcG9ydGVkIG1lc3NhZ2UgdHlwZSAlZFxuIiwKKwkJCWZyYW1lLT5tc2dfdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWVuY29kZV90cmF1X2ZyYW1lKHRyYXVfYml0c19vdXQsICZ0Zik7CisKKwkvKiBhbmQgc2VuZCBpdCB0byB0aGUgbXV4ZXIgKi8KKwlyZXR1cm4gc3ViY2hhbl9tdXhfZW5xdWV1ZShteCwgZHN0X2UxX3NzLT5lMV90c19zcywgdHJhdV9iaXRzX291dCwKKwkJCQkgICBUUkFVX0ZSQU1FX0JJVFMpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvdXNzZC5jIGIvb3BlbmJzYy9zcmMvdXNzZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NzY5MTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy91c3NkLmMKQEAgLTAsMCArMSw3MSBAQAorLyogTmV0d29yay1zcGVjaWZpYyBoYW5kbGluZyBvZiBtb2JpbGUtb3JpZ2luYXRlZCBVU1NEcy4gKi8KKworLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDgsIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDkgYnkgTWlrZSBIYWJlbiA8bWljaGFlbC5oYWJlbkBidGludGVybmV0LmNvbT4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworLyogVGhpcyBtb2R1bGUgZGVmaW5lcyB0aGUgbmV0d29yay1zcGVjaWZpYyBoYW5kbGluZyBvZiBtb2JpbGUtb3JpZ2luYXRlZAorICAgVVNTRCBtZXNzYWdlcy4gKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzgwLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKworLyogRGVjbGFyYXRpb25zIG9mIFVTU0Qgc3RyaW5ncyB0byBiZSByZWNvZ25pc2VkICovCitjb25zdCBjaGFyIFVTU0RfVEVYVF9PV05fTlVNQkVSW10gPSAiKiMxMDAjIjsKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2YgbmV0d29yay1zcGVjaWZpYyBoYW5kbGVyIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBzZW5kX293bl9udW1iZXIoY29uc3Qgc3RydWN0IG1zZ2IgKm1zZywgY29uc3Qgc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKTsKKworCisvKiBFbnRyeXBvaW50IC0gaGFuZGxlciBmdW5jdGlvbiBjb21tb24gdG8gYWxsIG1vYmlsZS1vcmlnaW5hdGVkIFVTU0RzICovCitpbnQgaGFuZGxlX3Jjdl91c3NkKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IHVzc2RfcmVxdWVzdCByZXE7CisKKwlnc20wNDgwX2RlY29kZV91c3NkX3JlcXVlc3QobXNnLCAmcmVxKTsKKwlpZiAocmVxLnRleHRbMF0gPT0gMHhGRikgIC8qIFJlbGVhc2UtQ29tcGxldGUgKi8KKwkJcmV0dXJuIDA7CisKKwlpZiAoc3Ryc3RyKFVTU0RfVEVYVF9PV05fTlVNQkVSLCByZXEudGV4dCkgIT0gTlVMTCkgeworCQlERUJVR1AoRE1NLCAiVVNTRDogT3duIG51bWJlciByZXF1ZXN0ZWRcbiIpOworCQlyZXR1cm4gc2VuZF9vd25fbnVtYmVyKG1zZywgJnJlcSk7CisJfSBlbHNlIHsKKwkJREVCVUdQKERNTSwgIlVuaGFuZGxlZCBVU1NEICVzXG4iLCByZXEudGV4dCk7CisJCXJldHVybiBnc20wNDgwX3NlbmRfdXNzZF9yZWplY3QobXNnLCAmcmVxKTsKKwl9Cit9CisKKy8qIEEgbmV0d29yay1zcGVjaWZpYyBoYW5kbGVyIGZ1bmN0aW9uICovCitzdGF0aWMgaW50IHNlbmRfb3duX251bWJlcihjb25zdCBzdHJ1Y3QgbXNnYiAqbXNnLCBjb25zdCBzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpCit7CisJY2hhciAqb3duX251bWJlciA9IG1zZy0+bGNoYW4tPmNvbm4uc3Vic2NyLT5leHRlbnNpb247CisJY2hhciByZXNwb25zZV9zdHJpbmdbR1NNX0VYVEVOU0lPTl9MRU5HVEggKyAyMF07CisKKwkvKiBOZWVkIHRyYWlsaW5nIENSIGFzIEVPVCBjaGFyYWN0ZXIgKi8KKwlzbnByaW50ZihyZXNwb25zZV9zdHJpbmcsIHNpemVvZihyZXNwb25zZV9zdHJpbmcpLCAiWW91ciBleHRlbnNpb24gaXMgJXNcciIsIG93bl9udW1iZXIpOworCXJldHVybiBnc20wNDgwX3NlbmRfdXNzZF9yZXNwb25zZShtc2csIHJlc3BvbnNlX3N0cmluZywgcmVxKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3Z0eV9pbnRlcmZhY2VfbGF5ZXIzLmMgYi9vcGVuYnNjL3NyYy92dHlfaW50ZXJmYWNlX2xheWVyMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyM2MxYzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy92dHlfaW50ZXJmYWNlX2xheWVyMy5jCkBAIC0wLDAgKzEsNTkzIEBACisvKiBPcGVuQlNDIGludGVyZmFjZSB0byBxdWFnZ2EgVlRZICovCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvc21vY29tL3Z0eS9jb21tYW5kLmg+CisjaW5jbHVkZSA8b3Ntb2NvbS92dHkvYnVmZmVyLmg+CisjaW5jbHVkZSA8b3Ntb2NvbS92dHkvdnR5Lmg+CisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWxlbnRfY2FsbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzExLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9lMV9pbnB1dC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3Z0eS5oPgorCitleHRlcm4gc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXRfZnJvbV92dHkoc3RydWN0IHZ0eSAqdik7CisKK3N0cnVjdCBjbWRfbm9kZSBzdWJzY3Jfbm9kZSA9IHsKKwlTVUJTQ1JfTk9ERSwKKwkiJXMoc3Vic2NyaWJlcikjIiwKKwkxLAorfTsKKworLyogRG93biB2dHkgbm9kZSBsZXZlbC4gKi8KK0RFRlVOKHN1YnNjcl9ub2RlX2V4aXQsCisgICAgICBzdWJzY3Jfbm9kZV9leGl0X2NtZCwgImV4aXQiLCAiRXhpdCBjdXJyZW50IG1vZGUgYW5kIGRvd24gdG8gcHJldmlvdXMgbW9kZVxuIikKK3sKKwlzd2l0Y2ggKHZ0eS0+bm9kZSkgeworCWNhc2UgU1VCU0NSX05PREU6CisJCXZ0eS0+bm9kZSA9IFZJRVdfTk9ERTsKKwkJc3Vic2NyX3B1dCh2dHktPmluZGV4KTsKKwkJdnR5LT5pbmRleCA9IE5VTEw7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgZHVtbXlfY29uZmlnX3dyaXRlKHN0cnVjdCB2dHkgKnYpCit7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgaW50IGhleHBhcnNlKGNvbnN0IGNoYXIgKnN0ciwgdV9pbnQ4X3QgKmIsIGludCBtYXhfbGVuKQorCit7CisJaW50IGksIGwsIHY7CisKKwlsID0gc3RybGVuKHN0cik7CisJaWYgKChsJjEpIHx8ICgobD4+MSkgPiBtYXhfbGVuKSkKKwkJcmV0dXJuIC0xOworCisJbWVtc2V0KGIsIDB4MDAsIG1heF9sZW4pOworCisJZm9yIChpPTA7IGk8bDsgaSsrKSB7CisJCWNoYXIgYyA9IHN0cltpXTsKKwkJaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorCQkJdiA9IGMgLSAnMCc7CisJCWVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQorCQkJdiA9IDEwICsgKGMgLSAnYScpOworCQllbHNlIGlmIChjID49ICdBJyAmJiBjIDw9ICdGJykKKwkJCXYgPSAxMCArIChjIC0gJ2EnKTsKKwkJZWxzZQorCQkJcmV0dXJuIC0xOworCQliW2k+PjFdIHw9IHYgPDwgKGkmMSA/IDAgOiA0KTsKKwl9CisKKwlyZXR1cm4gaT4+MTsKK30KKworLyogcGVyLXN1YnNjcmliZXIgY29uZmlndXJhdGlvbiAqLworREVGVU4oY2ZnX3N1YnNjciwKKyAgICAgIGNmZ19zdWJzY3JfY21kLAorICAgICAgInN1YnNjcmliZXIgSU1TSSIsCisgICAgICAiU2VsZWN0IGEgU3Vic2NyaWJlciB0byBjb25maWd1cmVcbiIpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQgPSBnc21uZXRfZnJvbV92dHkodnR5KTsKKwljb25zdCBjaGFyICppbXNpID0gYXJndlswXTsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCXN1YnNjciA9IHN1YnNjcl9nZXRfYnlfaW1zaShnc21uZXQsIGltc2kpOworCWlmICghc3Vic2NyKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgTm8gc3Vic2NyaWJlciBmb3IgSU1TSSAlcyVzIiwKKwkJCWltc2ksIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCS8qIHZ0eV9nb19wYXJlbnQgc2hvdWxkIHB1dCB0aGlzIHN1YnNjcmliZXIgKi8KKwl2dHktPmluZGV4ID0gc3Vic2NyOworCXZ0eS0+bm9kZSA9IFNVQlNDUl9OT0RFOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBzdWJzY3JfZHVtcF9mdWxsX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWludCByYzsKKwlzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyBhaW5mbzsKKwlzdHJ1Y3QgZ3NtX2F1dGhfdHVwbGUgYXR1cGxlOworCisJdnR5X291dCh2dHksICIgICAgSUQ6ICVsbHUsIEF1dGhvcml6ZWQ6ICVkJXMiLCBzdWJzY3ItPmlkLAorCQlzdWJzY3ItPmF1dGhvcml6ZWQsIFZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT5uYW1lKQorCQl2dHlfb3V0KHZ0eSwgIiAgICBOYW1lOiAnJXMnJXMiLCBzdWJzY3ItPm5hbWUsIFZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT5leHRlbnNpb24pCisJCXZ0eV9vdXQodnR5LCAiICAgIEV4dGVuc2lvbjogJXMlcyIsIHN1YnNjci0+ZXh0ZW5zaW9uLAorCQkJVlRZX05FV0xJTkUpOworCWlmIChzdWJzY3ItPmltc2kpCisJCXZ0eV9vdXQodnR5LCAiICAgIElNU0k6ICVzJXMiLCBzdWJzY3ItPmltc2ksIFZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT50bXNpICE9IEdTTV9SRVNFUlZFRF9UTVNJKQorCQl2dHlfb3V0KHZ0eSwgIiAgICBUTVNJOiAlMDhYJXMiLCBzdWJzY3ItPnRtc2ksCisJCQlWVFlfTkVXTElORSk7CisKKwlyYyA9IGdldF9hdXRoaW5mb19ieV9zdWJzY3IoJmFpbmZvLCBzdWJzY3IpOworCWlmICghcmMpIHsKKwkJdnR5X291dCh2dHksICIgICAgQTNBOCBhbGdvcml0aG0gaWQ6ICVkJXMiLAorCQkJYWluZm8uYXV0aF9hbGdvLCBWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAiICAgIEEzQTggS2k6ICVzJXMiLAorCQkJaGV4ZHVtcChhaW5mby5hM2E4X2tpLCBhaW5mby5hM2E4X2tpX2xlbiksCisJCQlWVFlfTkVXTElORSk7CisJfQorCisJcmMgPSBnZXRfYXV0aHR1cGxlX2J5X3N1YnNjcigmYXR1cGxlLCBzdWJzY3IpOworCWlmICghcmMpIHsKKwkJdnR5X291dCh2dHksICIgICAgQTNBOCBsYXN0IHR1cGxlICh1c2VkICVkIHRpbWVzKTolcyIsCisJCQlhdHVwbGUudXNlX2NvdW50LCBWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAiICAgICBzZXEgIyA6ICVkJXMiLAorCQkJYXR1cGxlLmtleV9zZXEsIFZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICIgICAgIFJBTkQgIDogJXMlcyIsCisJCQloZXhkdW1wKGF0dXBsZS5yYW5kLCBzaXplb2YoYXR1cGxlLnJhbmQpKSwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICIgICAgIFNSRVMgIDogJXMlcyIsCisJCQloZXhkdW1wKGF0dXBsZS5zcmVzLCBzaXplb2YoYXR1cGxlLnNyZXMpKSwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICIgICAgIEtjICAgIDogJXMlcyIsCisJCQloZXhkdW1wKGF0dXBsZS5rYywgc2l6ZW9mKGF0dXBsZS5rYykpLAorCQkJVlRZX05FV0xJTkUpOworCX0KKworCXZ0eV9vdXQodnR5LCAiICAgIFVzZSBjb3VudDogJXUlcyIsIHN1YnNjci0+dXNlX2NvdW50LCBWVFlfTkVXTElORSk7Cit9CisKKworLyogU3Vic2NyaWJlciAqLworREVGVU4oc2hvd19zdWJzY3IsCisgICAgICBzaG93X3N1YnNjcl9jbWQsCisgICAgICAic2hvdyBzdWJzY3JpYmVyIFtJTVNJXSIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBzdWJzY3JpYmVyXG4iKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0ID0gZ3NtbmV0X2Zyb21fdnR5KHZ0eSk7CisJY29uc3QgY2hhciAqaW1zaTsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCWlmIChhcmdjID49IDEpIHsKKwkJaW1zaSA9IGFyZ3ZbMF07CisJCXN1YnNjciA9IHN1YnNjcl9nZXRfYnlfaW1zaShnc21uZXQsIGltc2kpOworCQlpZiAoIXN1YnNjcikgeworCQkJdnR5X291dCh2dHksICIlJSB1bmtub3duIHN1YnNjcmliZXIlcyIsCisJCQkJVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCXN1YnNjcl9kdW1wX2Z1bGxfdnR5KHZ0eSwgc3Vic2NyKTsKKwkJc3Vic2NyX3B1dChzdWJzY3IpOworCisJCXJldHVybiBDTURfU1VDQ0VTUzsKKwl9CisKKwkvKiBGSVhNRTogaXRlcmF0ZSBvdmVyIGFsbCBzdWJzY3JpYmVycyA/ICovCisJcmV0dXJuIENNRF9XQVJOSU5HOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihzaG93X3N1YnNjcl9jYWNoZSwKKyAgICAgIHNob3dfc3Vic2NyX2NhY2hlX2NtZCwKKyAgICAgICJzaG93IHN1YnNjcmliZXIgY2FjaGUiLAorCVNIT1dfU1RSICJEaXNwbGF5IGNvbnRlbnRzIG9mIHN1YnNjcmliZXIgY2FjaGVcbiIpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShzdWJzY3IsICZhY3RpdmVfc3Vic2NyaWJlcnMsIGVudHJ5KSB7CisJCXZ0eV9vdXQodnR5LCAiICBTdWJzY3JpYmVyOiVzIiwgVlRZX05FV0xJTkUpOworCQlzdWJzY3JfZHVtcF9mdWxsX3Z0eSh2dHksIHN1YnNjcik7CisJfQorCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihzbXNfc2VuZF9wZW5kLAorICAgICAgc21zX3NlbmRfcGVuZF9jbWQsCisgICAgICAic21zIHNlbmQgcGVuZGluZyIsCisgICAgICAiU2VuZCBhbGwgcGVuZGluZyBTTVMiKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0ID0gZ3NtbmV0X2Zyb21fdnR5KHZ0eSk7CisJc3RydWN0IGdzbV9zbXMgKnNtczsKKwlpbnQgaWQgPSAwOworCisJd2hpbGUgKDEpIHsKKwkJc21zID0gZGJfc21zX2dldF91bnNlbnRfYnlfc3Vic2NyKGdzbW5ldCwgaWQpOworCQlpZiAoIXNtcykKKwkJCWJyZWFrOworCisJCWdzbTQxMV9zZW5kX3Ntc19zdWJzY3Ioc21zLT5yZWNlaXZlciwgc21zKTsKKworCQlpZCA9IHNtcy0+cmVjZWl2ZXItPmlkICsgMTsKKwl9CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0cnVjdCBnc21fc21zICpzbXNfZnJvbV90ZXh0KHN0cnVjdCBnc21fc3Vic2NyaWJlciAqcmVjZWl2ZXIsIGNvbnN0IGNoYXIgKnRleHQpCit7CisJc3RydWN0IGdzbV9zbXMgKnNtcyA9IHNtc19hbGxvYygpOworCisJaWYgKCFzbXMpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFyZWNlaXZlci0+bGFjKSB7CisJCS8qIHN1YnNjcmliZXIgY3VycmVudGx5IG5vdCBhdHRhY2hlZCwgc3RvcmUgaW4gZGF0YWJhc2U/ICovCisJCXJldHVybiBOVUxMOworCX0KKworCXNtcy0+cmVjZWl2ZXIgPSBzdWJzY3JfZ2V0KHJlY2VpdmVyKTsKKwlzdHJuY3B5KHNtcy0+dGV4dCwgdGV4dCwgc2l6ZW9mKHNtcy0+dGV4dCktMSk7CisKKwkvKiBGSVhNRTogZG9uJ3QgdXNlIElEIDEgc3RhdGljICovCisJc21zLT5zZW5kZXIgPSBzdWJzY3JfZ2V0X2J5X2lkKHJlY2VpdmVyLT5uZXQsIDEpOworCXNtcy0+cmVwbHlfcGF0aF9yZXEgPSAwOworCXNtcy0+c3RhdHVzX3JlcF9yZXEgPSAwOworCXNtcy0+dWRfaGRyX2luZCA9IDA7CisJc21zLT5wcm90b2NvbF9pZCA9IDA7IC8qIGltcGxpY2l0ICovCisJc21zLT5kYXRhX2NvZGluZ19zY2hlbWUgPSAwOyAvKiBkZWZhdWx0IDdiaXQgKi8KKwlzdHJuY3B5KHNtcy0+ZGVzdF9hZGRyLCByZWNlaXZlci0+ZXh0ZW5zaW9uLCBzaXplb2Yoc21zLT5kZXN0X2FkZHIpLTEpOworCS8qIEdlbmVyYXRlIHVzZXJfZGF0YSAqLworCXNtcy0+dXNlcl9kYXRhX2xlbiA9IGdzbV83Yml0X2VuY29kZShzbXMtPnVzZXJfZGF0YSwgc21zLT50ZXh0KTsKKworCXJldHVybiBzbXM7Cit9CisKK3N0YXRpYyBpbnQgX3NlbmRfc21zX3N0cihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnJlY2VpdmVyLCBjaGFyICpzdHIsCisJCQkgdV9pbnQ4X3QgdHBfcGlkKQoreworCXN0cnVjdCBnc21fc21zICpzbXM7CisKKwlzbXMgPSBzbXNfZnJvbV90ZXh0KHJlY2VpdmVyLCBzdHIpOworCXNtcy0+cHJvdG9jb2xfaWQgPSB0cF9waWQ7CisJZ3NtNDExX3NlbmRfc21zX3N1YnNjcihyZWNlaXZlciwgc21zKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqZ2V0X3N1YnNjcl9ieV9hcmd2KHN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0LAorCQkJCQkJIGNvbnN0IGNoYXIgKnR5cGUsCisJCQkJCQkgY29uc3QgY2hhciAqaWQpCit7CisJaWYgKCFzdHJjbXAodHlwZSwgImV4dGVuc2lvbiIpKQorCQlyZXR1cm4gc3Vic2NyX2dldF9ieV9leHRlbnNpb24oZ3NtbmV0LCBpZCk7CisJZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCAiaW1zaSIpKQorCQlyZXR1cm4gc3Vic2NyX2dldF9ieV9pbXNpKGdzbW5ldCwgaWQpOworCWVsc2UgaWYgKCFzdHJjbXAodHlwZSwgInRtc2kiKSkKKwkJcmV0dXJuIHN1YnNjcl9nZXRfYnlfdG1zaShnc21uZXQsIGF0b2koaWQpKTsKKwllbHNlIGlmICghc3RyY21wKHR5cGUsICJpZCIpKQorCQlyZXR1cm4gc3Vic2NyX2dldF9ieV9pZChnc21uZXQsIGF0b2koaWQpKTsKKworCXJldHVybiBOVUxMOworfQorI2RlZmluZSBTVUJTQ1JfVFlQRVMgIihleHRlbnNpb258aW1zaXx0bXNpfGlkKSIKKyNkZWZpbmUgU1VCU0NSX0hFTFAgIk9wZXJhdGlvbnMgb24gYSBTdWJzY3JpYmVyXG4iCQkJXAorCSJJZGVudGlmeSBzdWJzY3JpYmVyIGJ5IGhpcyBleHRlbnNpb24gKHBob25lIG51bWJlcilcbiIJCVwKKwkiSWRlbnRpZnkgc3Vic2NyaWJlciBieSBoaXMgSU1TSVxuIgkJCQlcCisJIklkZW50aWZ5IHN1YnNjcmliZXIgYnkgaGlzIFRNU0lcbiIJCQkJXAorCSJJZGVudGlmeSBzdWJzY3JpYmVyIGJ5IGhpcyBkYXRhYmFzZSBJRFxuIgkJCVwKKwkiSWRlbnRpZmllciBmb3IgdGhlIHN1YnNjcmliZXJcbiIKKworREVGVU4oc3Vic2NyaWJlcl9zZW5kX3NtcywKKyAgICAgIHN1YnNjcmliZXJfc2VuZF9zbXNfY21kLAorICAgICAgInN1YnNjcmliZXIgIiBTVUJTQ1JfVFlQRVMgIiBFWFRFTiBzbXMgc2VuZCAuTElORSIsCisJU1VCU0NSX0hFTFAgIlNNUyBPcGVyYXRpb25zXG4iICJTZW5kIFNNU1xuIiAiQWN0dWFsIFNNUyBUZXh0IikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCA9IGdzbW5ldF9mcm9tX3Z0eSh2dHkpOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gZ2V0X3N1YnNjcl9ieV9hcmd2KGdzbW5ldCwgYXJndlswXSwgYXJndlsxXSk7CisJY2hhciAqc3RyOworCWludCByYzsKKworCWlmICghc3Vic2NyKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgTm8gc3Vic2NyaWJlciBmb3VuZCBmb3IgJXMgJXMlcyIsCisJCQlhcmd2WzBdLCBhcmd2WzFdLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisJc3RyID0gYXJndl9jb25jYXQoYXJndiwgYXJnYywgMik7CisJcmMgPSBfc2VuZF9zbXNfc3RyKHN1YnNjciwgc3RyLCAwKTsKKwl0YWxsb2NfZnJlZShzdHIpOworCisJc3Vic2NyX3B1dChzdWJzY3IpOworCisJcmV0dXJuIHJjOworfQorCitERUZVTihzdWJzY3JpYmVyX3NpbGVudF9zbXMsCisgICAgICBzdWJzY3JpYmVyX3NpbGVudF9zbXNfY21kLAorICAgICAgInN1YnNjcmliZXIgIiBTVUJTQ1JfVFlQRVMgIiBFWFRFTiBzaWxlbnQtc21zIHNlbmQgLkxJTkUiLAorCVNVQlNDUl9IRUxQCisJIlNpbGVudCBTTVMgT3BlcmF0aW9uXG4iICJTZW5kIFNpbGVudCBTTVNcbiIgIkFjdHVhbCBTTVMgdGV4dFxuIikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCA9IGdzbW5ldF9mcm9tX3Z0eSh2dHkpOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gZ2V0X3N1YnNjcl9ieV9hcmd2KGdzbW5ldCwgYXJndlswXSwgYXJndlsxXSk7CisJY2hhciAqc3RyOworCWludCByYzsKKworCWlmICghc3Vic2NyKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgTm8gc3Vic2NyaWJlciBmb3VuZCBmb3IgJXMgJXMlcyIsCisJCQlhcmd2WzBdLCBhcmd2WzFdLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlzdHIgPSBhcmd2X2NvbmNhdChhcmd2LCBhcmdjLCAyKTsKKwlyYyA9IF9zZW5kX3Ntc19zdHIoc3Vic2NyLCBzdHIsIDApOworCXRhbGxvY19mcmVlKHN0cik7CisKKwlzdWJzY3JfcHV0KHN1YnNjcik7CisKKwlyZXR1cm4gcmM7Cit9CisKKyNkZWZpbmUgQ0hBTl9UWVBFUyAiKGFueXx0Y2gvZnx0Y2gvYW55fHNkY2NoKSIKKyNkZWZpbmUgQ0hBTl9UWVBFX0hFTFAgCQkJXAorCQkiQW55IGNoYW5uZWxcbiIJCVwKKwkJIlRDSC9GIGNoYW5uZWxcbiIJXAorCQkiQW55IFRDSCBjaGFubmVsXG4iCVwKKwkJIlNEQ0NIIGNoYW5uZWxcbiIKKworREVGVU4oc3Vic2NyaWJlcl9zaWxlbnRfY2FsbF9zdGFydCwKKyAgICAgIHN1YnNjcmliZXJfc2lsZW50X2NhbGxfc3RhcnRfY21kLAorICAgICAgInN1YnNjcmliZXIgIiBTVUJTQ1JfVFlQRVMgIiBFWFRFTiBzaWxlbnQtY2FsbCBzdGFydCAoYW55fHRjaC9mfHRjaC9hbnl8c2RjY2gpIiwKKwlTVUJTQ1JfSEVMUCAiU2lsZW50IGNhbGwgb3BlcmF0aW9uXG4iICJTdGFydCBzaWxlbnQgY2FsbFxuIgorCUNIQU5fVFlQRV9IRUxQKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0ID0gZ3NtbmV0X2Zyb21fdnR5KHZ0eSk7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSBnZXRfc3Vic2NyX2J5X2FyZ3YoZ3NtbmV0LCBhcmd2WzBdLCBhcmd2WzFdKTsKKwlpbnQgcmMsIHR5cGU7CisKKwlpZiAoIXN1YnNjcikgeworCQl2dHlfb3V0KHZ0eSwgIiUlIE5vIHN1YnNjcmliZXIgZm91bmQgZm9yICVzICVzJXMiLAorCQkJYXJndlswXSwgYXJndlsxXSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKCFzdHJjbXAoYXJndlsyXSwgInRjaC9mIikpCisJCXR5cGUgPSBSU0xfQ0hBTk5FRURfVENIX0Y7CisJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAidGNoL2FueSIpKQorCQl0eXBlID0gUlNMX0NIQU5ORUVEX1RDSF9Gb3JIOworCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInNkY2NoIikpCisJCXR5cGUgPSBSU0xfQ0hBTk5FRURfU0RDQ0g7CisJZWxzZQorCQl0eXBlID0gUlNMX0NIQU5ORUVEX0FOWTsJLyogRGVmYXVsdHMgdG8gQU5ZICovCisKKwlyYyA9IGdzbV9zaWxlbnRfY2FsbF9zdGFydChzdWJzY3IsIHZ0eSwgdHlwZSk7CisJaWYgKHJjIDw9IDApIHsKKwkJdnR5X291dCh2dHksICIlJSBTdWJzY3JpYmVyIG5vdCBhdHRhY2hlZCVzIiwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJc3Vic2NyX3B1dChzdWJzY3IpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJc3Vic2NyX3B1dChzdWJzY3IpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihzdWJzY3JpYmVyX3NpbGVudF9jYWxsX3N0b3AsCisgICAgICBzdWJzY3JpYmVyX3NpbGVudF9jYWxsX3N0b3BfY21kLAorICAgICAgInN1YnNjcmliZXIgIiBTVUJTQ1JfVFlQRVMgIiBFWFRFTiBzaWxlbnQtY2FsbCBzdG9wIiwKKwlTVUJTQ1JfSEVMUCAiU2lsZW50IGNhbGwgb3BlcmF0aW9uXG4iICJTdG9wIHNpbGVudCBjYWxsXG4iCisJQ0hBTl9UWVBFX0hFTFApCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQgPSBnc21uZXRfZnJvbV92dHkodnR5KTsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IGdldF9zdWJzY3JfYnlfYXJndihnc21uZXQsIGFyZ3ZbMF0sIGFyZ3ZbMV0pOworCWludCByYzsKKworCWlmICghc3Vic2NyKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgTm8gc3Vic2NyaWJlciBmb3VuZCBmb3IgJXMgJXMlcyIsCisJCQlhcmd2WzBdLCBhcmd2WzFdLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlyYyA9IGdzbV9zaWxlbnRfY2FsbF9zdG9wKHN1YnNjcik7CisJaWYgKHJjIDwgMCkgeworCQlzdWJzY3JfcHV0KHN1YnNjcik7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlzdWJzY3JfcHV0KHN1YnNjcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19zdWJzY3JfbmFtZSwKKyAgICAgIGNmZ19zdWJzY3JfbmFtZV9jbWQsCisgICAgICAibmFtZSBOQU1FIiwKKyAgICAgICJTZXQgdGhlIG5hbWUgb2YgdGhlIHN1YnNjcmliZXIiKQoreworCWNvbnN0IGNoYXIgKm5hbWUgPSBhcmd2WzBdOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gdnR5LT5pbmRleDsKKworCXN0cm5jcHkoc3Vic2NyLT5uYW1lLCBuYW1lLCBzaXplb2Yoc3Vic2NyLT5uYW1lKSk7CisKKwlkYl9zeW5jX3N1YnNjcmliZXIoc3Vic2NyKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX3N1YnNjcl9leHRlbnNpb24sCisgICAgICBjZmdfc3Vic2NyX2V4dGVuc2lvbl9jbWQsCisgICAgICAiZXh0ZW5zaW9uIEVYVEVOU0lPTiIsCisgICAgICAiU2V0IHRoZSBleHRlbnNpb24gb2YgdGhlIHN1YnNjcmliZXIiKQoreworCWNvbnN0IGNoYXIgKm5hbWUgPSBhcmd2WzBdOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gdnR5LT5pbmRleDsKKworCXN0cm5jcHkoc3Vic2NyLT5leHRlbnNpb24sIG5hbWUsIHNpemVvZihzdWJzY3ItPmV4dGVuc2lvbikpOworCisJZGJfc3luY19zdWJzY3JpYmVyKHN1YnNjcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19zdWJzY3JfYXV0aG9yaXplZCwKKyAgICAgIGNmZ19zdWJzY3JfYXV0aG9yaXplZF9jbWQsCisgICAgICAiYXV0aCAoMHwxKSIsCisgICAgICAiU2V0IHRoZSBhdXRob3JpemF0aW9uIHN0YXR1cyBvZiB0aGUgc3Vic2NyaWJlclxuIgorCSJOb3QgYXV0aG9yaXplZFxuIiAiQXV0aG9yaXplZFxuIikKK3sKKwlpbnQgYXV0aCA9IGF0b2koYXJndlswXSk7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSB2dHktPmluZGV4OworCisJaWYgKGF1dGgpCisJCXN1YnNjci0+YXV0aG9yaXplZCA9IDE7CisJZWxzZQorCQlzdWJzY3ItPmF1dGhvcml6ZWQgPSAwOworCisJZGJfc3luY19zdWJzY3JpYmVyKHN1YnNjcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKyNkZWZpbmUgQTNBOF9BTEdfVFlQRVMgIihub25lfGNvbXAxMjh2MSkiCisjZGVmaW5lIEEzQThfQUxHX0hFTFAgCQkJXAorCSJVc2UgTm8gQTNBOCBhbGdvcml0aG1cbiIJXAorCSJVc2UgQ09NUDEyOHYxIGFsZ29yaXRobVxuIgorCitERUZVTihjZmdfc3Vic2NyX2EzYTgsCisgICAgICBjZmdfc3Vic2NyX2EzYThfY21kLAorICAgICAgImEzYTggIiBBM0E4X0FMR19UWVBFUyAiIFtLSV0iLAorICAgICAgIlNldCBhM2E4IHBhcmFtZXRlcnMgZm9yIHRoZSBzdWJzY3JpYmVyXG4iIEEzQThfQUxHX0hFTFAKKyAgICAgICJFbmNyeXB0aW9uIEtleSBLaVxuIikKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IHZ0eS0+aW5kZXg7CisJY29uc3QgY2hhciAqYWxnX3N0ciA9IGFyZ3ZbMF07CisJY29uc3QgY2hhciAqa2lfc3RyID0gYXJndlsxXTsKKwlzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyBhaW5mbzsKKwlpbnQgcmM7CisKKwlpZiAoIXN0cmNhc2VjbXAoYWxnX3N0ciwgIm5vbmUiKSkgeworCQkvKiBKdXN0IGVyYXNlICovCisJCXJjID0gc2V0X2F1dGhpbmZvX2Zvcl9zdWJzY3IoTlVMTCwgc3Vic2NyKTsKKwl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKGFsZ19zdHIsICJjb21wMTI4djEiKSkgeworCQkvKiBQYXJzZSBoZXggc3RyaW5nIEtpICovCisJCXJjID0gaGV4cGFyc2Uoa2lfc3RyLCBhaW5mby5hM2E4X2tpLCBzaXplb2YoYWluZm8uYTNhOF9raSkpOworCQlpZiAocmMgIT0gMTYpCisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisKKwkJLyogU2V0IHRoZSBpbmZvcyAqLworCQlhaW5mby5hdXRoX2FsZ28gPSBBVVRIX0FMR09fQ09NUDEyOHYxOworCQlhaW5mby5hM2E4X2tpX2xlbiA9IHJjOworCQlyYyA9IHNldF9hdXRoaW5mb19mb3Jfc3Vic2NyKCZhaW5mbywgc3Vic2NyKTsKKwl9IGVsc2UgeworCQkvKiBVbmtub3duIG1ldGhvZCAqLworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJcmV0dXJuIHJjID8gQ01EX1dBUk5JTkcgOiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBzY2FsbF9jYmZuKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBzaWduYWwsCisJCQl2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCXN0cnVjdCBzY2FsbF9zaWduYWxfZGF0YSAqc2lnZGF0YSA9IHNpZ25hbF9kYXRhOworCXN0cnVjdCB2dHkgKnZ0eSA9IHNpZ2RhdGEtPmRhdGE7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU19TQ0FMTF9TVUNDRVNTOgorCQl2dHlfb3V0KHZ0eSwgIiUlIHNpbGVudCBjYWxsIG9uIEFSRkNOICV1IHRpbWVzbG90ICV1JXMiLAorCQkJc2lnZGF0YS0+bGNoYW4tPnRzLT50cngtPmFyZmNuLCBzaWdkYXRhLT5sY2hhbi0+dHMtPm5yLAorCQkJVlRZX05FV0xJTkUpOworCQlicmVhazsKKwljYXNlIFNfU0NBTExfRVhQSVJFRDoKKwkJdnR5X291dCh2dHksICIlJSBzaWxlbnQgY2FsbCBleHBpcmVkIHBhZ2luZyVzIiwgVlRZX05FV0xJTkUpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK0RFRlVOKHNob3dfc3RhdHMsCisgICAgICBzaG93X3N0YXRzX2NtZCwKKyAgICAgICJzaG93IHN0YXRpc3RpY3MiLAorCVNIT1dfU1RSICJEaXNwbGF5IG5ldHdvcmsgc3RhdGlzdGljc1xuIikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGdzbW5ldF9mcm9tX3Z0eSh2dHkpOworCisJb3BlbmJzY192dHlfcHJpbnRfc3RhdGlzdGljcyh2dHksIG5ldCk7CisJdnR5X291dCh2dHksICJMb2NhdGlvbiBVcGRhdGUgICAgICAgICA6ICVsdSBhdHRhY2gsICVsdSBub3JtYWwsICVsdSBwZXJpb2RpYyVzIiwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5sb2NfdXBkX3R5cGUuYXR0YWNoKSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5sb2NfdXBkX3R5cGUubm9ybWFsKSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5sb2NfdXBkX3R5cGUucGVyaW9kaWMpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJJTVNJIERldGFjaCBJbmRpY2F0aW9ucyA6ICVsdSVzIiwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5sb2NfdXBkX3R5cGUuZGV0YWNoKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiTG9jYXRpb24gVXBkYXRlIFJlc3BvbnNlOiAlbHUgYWNjZXB0LCAlbHUgcmVqZWN0JXMiLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmxvY191cGRfcmVzcC5hY2NlcHQpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmxvY191cGRfcmVzcC5yZWplY3QpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJIYW5kb3ZlciAgICAgICAgICAgICAgICA6ICVsdSBhdHRlbXB0ZWQsICVsdSBub19jaGFubmVsLCAlbHUgdGltZW91dCwgIgorCQkiJWx1IGNvbXBsZXRlZCwgJWx1IGZhaWxlZCVzIiwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5oYW5kb3Zlci5hdHRlbXB0ZWQpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmhhbmRvdmVyLm5vX2NoYW5uZWwpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmhhbmRvdmVyLnRpbWVvdXQpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmhhbmRvdmVyLmNvbXBsZXRlZCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuaGFuZG92ZXIuZmFpbGVkKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiU01TIE1PICAgICAgICAgICAgICAgICAgOiAlbHUgc3VibWl0dGVkLCAlbHUgbm8gcmVjZWl2ZXIlcyIsCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuc21zLnN1Ym1pdHRlZCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuc21zLm5vX3JlY2VpdmVyKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiU01TIE1UICAgICAgICAgICAgICAgICAgOiAlbHUgZGVsaXZlcmVkLCAlbHUgbm8gbWVtb3J5LCAlbHUgb3RoZXIgZXJyb3IlcyIsCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuc21zLmRlbGl2ZXJlZCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuc21zLnJwX2Vycl9tZW0pLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnNtcy5ycF9lcnJfb3RoZXIpLCBWVFlfTkVXTElORSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisKK2ludCBic2NfdnR5X2luaXRfZXh0cmEodm9pZCkKK3sKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19TQ0FMTCwgc2NhbGxfY2JmbiwgTlVMTCk7CisKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnNob3dfc3Vic2NyX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50X3ZlKCZzaG93X3N1YnNjcl9jYWNoZV9jbWQpOworCisJaW5zdGFsbF9lbGVtZW50X3ZlKCZzbXNfc2VuZF9wZW5kX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnN1YnNjcmliZXJfc2VuZF9zbXNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnN1YnNjcmliZXJfc2lsZW50X3Ntc19jbWQpOworCWluc3RhbGxfZWxlbWVudF92ZSgmc3Vic2NyaWJlcl9zaWxlbnRfY2FsbF9zdGFydF9jbWQpOworCWluc3RhbGxfZWxlbWVudF92ZSgmc3Vic2NyaWJlcl9zaWxlbnRfY2FsbF9zdG9wX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50X3ZlKCZzaG93X3N0YXRzX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZjZmdfc3Vic2NyX2NtZCk7CisJaW5zdGFsbF9ub2RlKCZzdWJzY3Jfbm9kZSwgZHVtbXlfY29uZmlnX3dyaXRlKTsKKworCWluc3RhbGxfZGVmYXVsdChTVUJTQ1JfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KFNVQlNDUl9OT0RFLCAmc3Vic2NyX25vZGVfZXhpdF9jbWQpOworCWluc3RhbGxfZWxlbWVudChTVUJTQ1JfTk9ERSwgJmNmZ19zdWJzY3JfbmFtZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChTVUJTQ1JfTk9ERSwgJmNmZ19zdWJzY3JfZXh0ZW5zaW9uX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFNVQlNDUl9OT0RFLCAmY2ZnX3N1YnNjcl9hdXRob3JpemVkX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFNVQlNDUl9OT0RFLCAmY2ZnX3N1YnNjcl9hM2E4X2NtZCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL3Rlc3RzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMWI5MzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rlc3RzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEgQEAKK1NVQkRJUlMgPSBkZWJ1ZyBnc20wNDA4IGRiIGNoYW5uZWwgc2NjcApkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9jaGFubmVsL01ha2VmaWxlLmFtIGIvb3BlbmJzYy90ZXN0cy9jaGFubmVsL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3Mjk2NTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rlc3RzL2NoYW5uZWwvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxNSBAQAorSU5DTFVERVMgPSAkKGFsbF9pbmNsdWRlcykgLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUKK0FNX0NGTEFHUz0tV2FsbCAtZ2dkYjMgJChMSUJPU01PQ09SRV9DRkxBR1MpCisKK25vaW5zdF9QUk9HUkFNUyA9IGNoYW5uZWxfdGVzdAorCitjaGFubmVsX3Rlc3RfU09VUkNFUyA9IGNoYW5uZWxfdGVzdC5jIFwKKwkkKHRvcF9zcmNkaXIpL3NyYy9kYi5jIFwKKwkkKHRvcF9zcmNkaXIpL3NyYy9nc21fc3Vic2NyaWJlcl9iYXNlLmMgXAorCSQodG9wX3NyY2Rpcikvc3JjL2dzbV9zdWJzY3JpYmVyLmMgXAorCSQodG9wX3NyY2Rpcikvc3JjL2RlYnVnLmMgXAorCSQodG9wX3NyY2Rpcikvc3JjL2dzbV9kYXRhLmMgXAorCSQodG9wX3NyY2Rpcikvc3JjL2J0c19pcGFjY2Vzc19uYW5vYnRzLmMgXAorCSQodG9wX3NyY2Rpcikvc3JjL2J0c19zaWVtZW5zX2JzMTEuYworY2hhbm5lbF90ZXN0X0xEQUREID0gLWxkbCAtbGRiaSAkKExJQk9TTU9DT1JFX0xJQlMpCisKZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvY2hhbm5lbC9jaGFubmVsX3Rlc3QuYyBiL29wZW5ic2MvdGVzdHMvY2hhbm5lbC9jaGFubmVsX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTkwMDFjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90ZXN0cy9jaGFubmVsL2NoYW5uZWxfdGVzdC5jCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisKKy8qIG91ciBoYW5kbGVyICovCitzdGF0aWMgaW50IHN1YnNjcl9jYih1bnNpZ25lZCBpbnQgaG9vaywgdW5zaWduZWQgaW50IGV2ZW50LCBzdHJ1Y3QgbXNnYiAqbXNnLCB2b2lkICpkYXRhLCB2b2lkICpwYXJhbSkKK3sKKwlhc3NlcnQoaG9vayA9PSAxMDEpOworCWFzc2VydChldmVudCA9PSAyMDApOworCWFzc2VydChtc2cgPT0gKHZvaWQqKTB4MTMyM0wpOworCWFzc2VydChkYXRhID09ICh2b2lkKikweDQyNDJMKTsKKwlhc3NlcnQocGFyYW0gPT0gKHZvaWQqKTB4MjM0MkwpOworCXByaW50ZigiUmVhY2hlZCwgZGlkbid0IGNyYXNoLCB0ZXN0IHBhc3NlZFxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qIG1vY2sgb2JqZWN0IGZvciB0ZXN0aW5nLCBkaXJlY3RseSBpbnZva2UgdGhlIGNiLi4uIG1heWJlIGxhdGVyIHRocm91Z2ggdGhlIHRpbWVyICovCit2b2lkIHBhZ2luZ19yZXF1ZXN0KHN0cnVjdCBnc21fYnRzICpidHMsIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyaWJlciwgaW50IHR5cGUsIGdzbV9jYmZuICpjYmZuLCB2b2lkICpkYXRhKQoreworCWNiZm4oMTAxLCAyMDAsICh2b2lkKikweDEzMjNMLCAodm9pZCopMHg0MjQyTCwgZGF0YSk7Cit9CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0d29yazsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCisJcHJpbnRmKCJUZXN0aW5nIHRoZSBnc21fc3Vic2NyaWJlciBjaGFuIGxvZ2ljXG4iKTsKKworCS8qIENyZWF0ZSBhIGR1bW15IG5ldHdvcmsgKi8KKwluZXR3b3JrID0gZ3NtX25ldHdvcmtfaW5pdCgxLCAxLCBOVUxMKTsKKwlpZiAoIW5ldHdvcmspCisJCWV4aXQoMSk7CisJYnRzID0gZ3NtX2J0c19hbGxvYyhuZXR3b3JrLCBHU01fQlRTX1RZUEVfQlMxMSwgMCwgMCk7CisJYnRzLT5sb2NhdGlvbl9hcmVhX2NvZGUgPSAyMzsKKworCS8qIENyZWF0ZSBhIGR1bW15IHN1YnNjcmliZXIgKi8KKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IHN1YnNjcl9hbGxvYygpOworCXN1YnNjci0+bGFjID0gMjM7CisJc3Vic2NyLT5uZXQgPSBuZXR3b3JrOworCisJLyogQXNrIGZvciBhIGNoYW5uZWwuLi4gKi8KKwlzdWJzY3JfZ2V0X2NoYW5uZWwoc3Vic2NyLCBSU0xfQ0hBTk5FRURfVENIX0YsIHN1YnNjcl9jYiwgKHZvaWQqKTB4MjM0MkwpOworCisJd2hpbGUgKDEpIHsKKwkJYnNjX3NlbGVjdF9tYWluKDApOworCX0KK30KKwordm9pZCBubV9zdGF0ZV9ldmVudCgpIHt9Cit2b2lkIGlucHV0X2V2ZW50KCkge30KK3ZvaWQgc21zX2FsbG9jKCkge30KKworc3RydWN0IHRsdl9kZWZpbml0aW9uIG5tX2F0dF90bHZkZWY7CisKZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvZGIvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL3Rlc3RzL2RiL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYjkxODAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rlc3RzL2RiL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsOCBAQAorSU5DTFVERVMgPSAkKGFsbF9pbmNsdWRlcykgLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUKK0FNX0NGTEFHUz0tV2FsbCAtZ2dkYjMgJChMSUJPU01PQ09SRV9DRkxBR1MpCisKK25vaW5zdF9QUk9HUkFNUyA9IGRiX3Rlc3QKKworZGJfdGVzdF9TT1VSQ0VTID0gZGJfdGVzdC5jCitkYl90ZXN0X0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL3NyYy9saWJic2MuYSAkKHRvcF9idWlsZGRpcikvc3JjL2xpYm1zYy5hICQodG9wX2J1aWxkZGlyKS9zcmMvbGliYnNjLmEgJChMSUJPU01PQ09SRV9MSUJTKSAtbGRsIC1sZGJpCisKZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvZGIvZGJfdGVzdC5jIGIvb3BlbmJzYy90ZXN0cy9kYi9kYl90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE2OGFjYgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvZGIvZGJfdGVzdC5jCkBAIC0wLDAgKzEsMTA2IEBACisvKiAoQykgMjAwOCBieSBKYW4gTHVlYmJlIDxqbHVlYmJlQGRlYmlhbi5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5ic2MvZGIuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNkZWZpbmUgQ09NUEFSRShvcmlnaW5hbCwgY29weSkgXAorCWlmIChvcmlnaW5hbC0+aWQgIT0gY29weS0+aWQpIFwKKwkJZnByaW50ZihzdGRlcnIsICJJZHMgZG8gbm90IG1hdGNoIGluICVzOiVkICVsbHUgJWxsdVxuIiwgXAorCQkJX19GVU5DVElPTl9fLCBfX0xJTkVfXywgb3JpZ2luYWwtPmlkLCBjb3B5LT5pZCk7IFwKKwlpZiAob3JpZ2luYWwtPmxhYyAhPSBjb3B5LT5sYWMpIFwKKwkJZnByaW50ZihzdGRlcnIsICJMQUMgZG8gbm90IG1hdGNoIGluICVzOiVkICVkICVkXG4iLCBcCisJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBvcmlnaW5hbC0+bGFjLCBjb3B5LT5sYWMpOyBcCisJaWYgKG9yaWdpbmFsLT5hdXRob3JpemVkICE9IGNvcHktPmF1dGhvcml6ZWQpIFwKKwkJZnByaW50ZihzdGRlcnIsICJBdXRob3JpemUgZG8gbm90IG1hdGNoIGluICVzOiVkICVkICVkXG4iLCBcCisJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBvcmlnaW5hbC0+YXV0aG9yaXplZCwgXAorCQkJY29weS0+YXV0aG9yaXplZCk7IFwKKwlpZiAoc3RyY21wKG9yaWdpbmFsLT5pbXNpLCBjb3B5LT5pbXNpKSAhPSAwKSBcCisJCWZwcmludGYoc3RkZXJyLCAiSU1TSXMgZG8gbm90IG1hdGNoIGluICVzOiVkICclcycgJyVzJ1xuIiwgXAorCQkJX19GVU5DVElPTl9fLCBfX0xJTkVfXywgb3JpZ2luYWwtPmltc2ksIGNvcHktPmltc2kpOyBcCisJaWYgKG9yaWdpbmFsLT50bXNpICE9IGNvcHktPnRtc2kpIFwKKwkJZnByaW50ZihzdGRlcnIsICJUTVNJcyBkbyBub3QgbWF0Y2ggaW4gJXM6JWQgJyV1JyAnJXUnXG4iLCBcCisJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBvcmlnaW5hbC0+dG1zaSwgY29weS0+dG1zaSk7IFwKKwlpZiAoc3RyY21wKG9yaWdpbmFsLT5uYW1lLCBjb3B5LT5uYW1lKSAhPSAwKSBcCisJCWZwcmludGYoc3RkZXJyLCAibmFtZXMgZG8gbm90IG1hdGNoIGluICVzOiVkICclcycgJyVzJ1xuIiwgXAorCQkJX19GVU5DVElPTl9fLCBfX0xJTkVfXywgb3JpZ2luYWwtPm5hbWUsIGNvcHktPm5hbWUpOyBcCisJaWYgKHN0cmNtcChvcmlnaW5hbC0+ZXh0ZW5zaW9uLCBjb3B5LT5leHRlbnNpb24pICE9IDApIFwKKwkJZnByaW50ZihzdGRlcnIsICJuYW1lcyBkbyBub3QgbWF0Y2ggaW4gJXM6JWQgJyVzJyAnJXMnXG4iLCBcCisJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBvcmlnaW5hbC0+ZXh0ZW5zaW9uLCBjb3B5LT5leHRlbnNpb24pOyBcCisKK2ludCBtYWluKCkgeworCisJaWYgKGRiX2luaXQoImhsci5zcWxpdGUzIikpIHsKKwkJcHJpbnRmKCJEQjogRmFpbGVkIHRvIGluaXQgZGF0YWJhc2UuIFBsZWFzZSBjaGVjayB0aGUgb3B0aW9uIHNldHRpbmdzLlxuIik7CisJCXJldHVybiAxOworCX0JIAorCXByaW50ZigiREI6IERhdGFiYXNlIGluaXRpYWxpemVkLlxuIik7CisKKwlpZiAoZGJfcHJlcGFyZSgpKSB7CisJCXByaW50ZigiREI6IEZhaWxlZCB0byBwcmVwYXJlIGRhdGFiYXNlLlxuIik7CisJCXJldHVybiAxOworCX0KKwlwcmludGYoIkRCOiBEYXRhYmFzZSBwcmVwYXJlZC5cbiIpOworCisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICphbGljZSA9IE5VTEw7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICphbGljZV9kYjsKKworCWNoYXIgKmFsaWNlX2ltc2kgPSAiMzI0MzI0NTQzMjM0NSI7CisJYWxpY2UgPSBkYl9jcmVhdGVfc3Vic2NyaWJlcihOVUxMLCBhbGljZV9pbXNpKTsKKwlkYl9zeW5jX3N1YnNjcmliZXIoYWxpY2UpOworCWFsaWNlX2RiID0gZGJfZ2V0X3N1YnNjcmliZXIoTlVMTCwgR1NNX1NVQlNDUklCRVJfSU1TSSwgYWxpY2UtPmltc2kpOworCUNPTVBBUkUoYWxpY2UsIGFsaWNlX2RiKTsKKwlzdWJzY3JfcHV0KGFsaWNlX2RiKTsKKwlzdWJzY3JfcHV0KGFsaWNlKTsKKworCWFsaWNlX2ltc2kgPSAiMzY5MzI0NTQyMzQ0NSI7CisJYWxpY2UgPSBkYl9jcmVhdGVfc3Vic2NyaWJlcihOVUxMLCBhbGljZV9pbXNpKTsKKwlkYl9zdWJzY3JpYmVyX2Fzc29jX2ltZWkoYWxpY2UsICIxMjM0NTY3ODkwIik7CisJZGJfc3Vic2NyaWJlcl9hbGxvY190bXNpKGFsaWNlKTsKKwlhbGljZS0+bGFjPTQyOworCWRiX3N5bmNfc3Vic2NyaWJlcihhbGljZSk7CisJYWxpY2VfZGIgPSBkYl9nZXRfc3Vic2NyaWJlcihOVUxMLCBHU01fU1VCU0NSSUJFUl9JTVNJLCBhbGljZV9pbXNpKTsKKwlDT01QQVJFKGFsaWNlLCBhbGljZV9kYik7CisJc3Vic2NyX3B1dChhbGljZSk7CisJc3Vic2NyX3B1dChhbGljZV9kYik7CisKKwlhbGljZV9pbXNpID0gIjk5OTMyNDU0MjM0NDUiOworCWFsaWNlID0gZGJfY3JlYXRlX3N1YnNjcmliZXIoTlVMTCwgYWxpY2VfaW1zaSk7CisJZGJfc3Vic2NyaWJlcl9hbGxvY190bXNpKGFsaWNlKTsKKwlhbGljZS0+bGFjPTQyOworCWRiX3N5bmNfc3Vic2NyaWJlcihhbGljZSk7CisJZGJfc3Vic2NyaWJlcl9hc3NvY19pbWVpKGFsaWNlLCAiMTIzNDU2Nzg5MCIpOworCWRiX3N1YnNjcmliZXJfYXNzb2NfaW1laShhbGljZSwgIjY1NDM1NjA5MjAiKTsKKwlhbGljZV9kYiA9IGRiX2dldF9zdWJzY3JpYmVyKE5VTEwsIEdTTV9TVUJTQ1JJQkVSX0lNU0ksIGFsaWNlX2ltc2kpOworCUNPTVBBUkUoYWxpY2UsIGFsaWNlX2RiKTsKKwlzdWJzY3JfcHV0KGFsaWNlKTsKKwlzdWJzY3JfcHV0KGFsaWNlX2RiKTsKKworCWRiX2ZpbmkoKTsKKworCXJldHVybiAwOworfQorCisvKiBzdHVicyAqLwordm9pZCBpbnB1dF9ldmVudCh2b2lkKSB7fQordm9pZCBubV9zdGF0ZV9ldmVudCh2b2lkKSB7fQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9kZWJ1Zy9NYWtlZmlsZS5hbSBiL29wZW5ic2MvdGVzdHMvZGVidWcvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQyM2ZkMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvZGVidWcvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw2IEBACitJTkNMVURFUyA9ICQoYWxsX2luY2x1ZGVzKSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZQorQU1fQ0ZMQUdTPS1XYWxsICQoTElCT1NNT0NPUkVfQ0ZMQUdTKQorbm9pbnN0X1BST0dSQU1TID0gZGVidWdfdGVzdAorCitkZWJ1Z190ZXN0X1NPVVJDRVMgPSBkZWJ1Z190ZXN0LmMgJCh0b3Bfc3JjZGlyKS9zcmMvZGVidWcuYyAKK2RlYnVnX3Rlc3RfTERBREQgPSAkKExJQk9TTU9DT1JFX0xJQlMpCmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL2RlYnVnL2RlYnVnX3Rlc3QuYyBiL29wZW5ic2MvdGVzdHMvZGVidWcvZGVidWdfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZTQ4MzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rlc3RzL2RlYnVnL2RlYnVnX3Rlc3QuYwpAQCAtMCwwICsxLDQzIEBACisvKiBzaW1wbGUgdGVzdCBmb3IgdGhlIGRlYnVnIGludGVyZmFjZSAqLworLyoKKyAqIChDKSAyMDA4LCAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKwlzdHJ1Y3QgbG9nX3RhcmdldCAqc3RkZXJyX3RhcmdldDsKKworCWxvZ19pbml0KCZsb2dfaW5mbyk7CisJc3RkZXJyX3RhcmdldCA9IGxvZ190YXJnZXRfY3JlYXRlX3N0ZGVycigpOworCWxvZ19hZGRfdGFyZ2V0KHN0ZGVycl90YXJnZXQpOworCWxvZ19zZXRfYWxsX2ZpbHRlcihzdGRlcnJfdGFyZ2V0LCAxKTsKKworCWxvZ19wYXJzZV9jYXRlZ29yeV9tYXNrKHN0ZGVycl90YXJnZXQsICJEUkxMIik7CisJREVCVUdQKERDQywgIllvdSBzaG91bGQgbm90IHNlZSB0aGlzXG4iKTsKKworCWxvZ19wYXJzZV9jYXRlZ29yeV9tYXNrKHN0ZGVycl90YXJnZXQsICJEUkxMOkRDQyIpOworCURFQlVHUChEUkxMLCAiWW91IHNob3VsZCBzZWUgdGhpc1xuIik7CisJREVCVUdQKERDQywgIllvdSBzaG91bGQgc2VlIHRoaXNcbiIpOworCURFQlVHUChETU0sICJZb3Ugc2hvdWxkIG5vdCBzZWUgdGhpc1xuIik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvZ3NtMDQwOC9NYWtlZmlsZS5hbSBiL29wZW5ic2MvdGVzdHMvZ3NtMDQwOC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOThjNjczCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90ZXN0cy9nc20wNDA4L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNiBAQAorSU5DTFVERVMgPSAkKGFsbF9pbmNsdWRlcykgLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUKK0FNX0NGTEFHUz0tV2FsbCAkKExJQk9TTU9DT1JFX0NGTEFHUykKK25vaW5zdF9QUk9HUkFNUyA9IGdzbTA0MDhfdGVzdAorCitnc20wNDA4X3Rlc3RfU09VUkNFUyA9IGdzbTA0MDhfdGVzdC5jCitnc20wNDA4X3Rlc3RfTERBREQgPSAkKHRvcF9idWlsZGRpcikvc3JjL2xpYmJzYy5hICQodG9wX2J1aWxkZGlyKS9zcmMvbGlibXNjLmEgJCh0b3BfYnVpbGRkaXIpL3NyYy9saWJic2MuYSAkKExJQk9TTU9DT1JFX0xJQlMpIC1sZGJpCmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL2dzbTA0MDgvZ3NtMDQwOF90ZXN0LmMgYi9vcGVuYnNjL3Rlc3RzL2dzbTA0MDgvZ3NtMDQwOF90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg3ZDRlZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvZ3NtMDQwOC9nc20wNDA4X3Rlc3QuYwpAQCAtMCwwICsxLDExMiBAQAorLyogc2ltcGxlIHRlc3QgZm9yIHRoZSBnc20wNDA4IGZvcm1hdHRpbmcgZnVuY3Rpb25zICovCisvKgorICogKEMpIDIwMDggYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisKKyNkZWZpbmUgQ09NUEFSRShyZXN1bHQsIG9wLCB2YWx1ZSkgXAorICAgIGlmICghKChyZXN1bHQpIG9wICh2YWx1ZSkpKSB7XAorCWZwcmludGYoc3RkZXJyLCAiQ29tcGFyZSBmYWlsZWQuIFdhcyAleCBzaG91bGQgYmUgJXggaW4gJXM6JWRcbiIscmVzdWx0LCB2YWx1ZSwgX19GSUxFX18sIF9fTElORV9fKTsgXAorCWV4aXQoLTEpOyBcCisgICAgfQorCisjZGVmaW5lIENPTVBBUkVfU1RSKHJlc3VsdCwgdmFsdWUpIFwKKwlpZiAoc3RyY21wKHJlc3VsdCwgdmFsdWUpICE9IDApIHsgXAorCQlmcHJpbnRmKHN0ZGVyciwgIkNvbXBhcmUgZmFpbGVkLiBXYXMgJXMgc2hvdWxkIGJlICVzIGluICVzOiVkXG4iLHJlc3VsdCwgdmFsdWUsIF9fRklMRV9fLCBfX0xJTkVfXyk7IFwKKwkJZXhpdCgtMSk7IFwKKwl9CisKKy8qCisgKiBUZXN0IExvY2F0aW9uIEFyZWEgSWRlbnRpZmllciBmb3JtYXR0aW5nLiBUYWJsZSAxMC41LjMgb2YgMDQuMDgKKyAqLworc3RhdGljIHZvaWQgdGVzdF9sb2NhdGlvbl9hcmVhX2lkZW50aWZpZXIodm9pZCkKK3sKKyAgICBzdHJ1Y3QgZ3NtNDhfbG9jX2FyZWFfaWQgbGFpNDg7CisKKyAgICBwcmludGYoIlRlc3RpbmcgdGVzdCBsb2NhdGlvbiBhcmVhIGlkZW50aWZpZXJcbiIpOworCisgICAgLyoKKyAgICAgKiBUZXN0IHRoZSBkZWZhdWx0L3Rlc3Qgc2V0dXAuIENvbWluZyBmcm9tCisgICAgICogYnNjX2hhY2suYyBkdW1wcworICAgICAqLworICAgIGdzbTQ4X2dlbmVyYXRlX2xhaSgmbGFpNDgsIDEsIDEsIDEpOworICAgIENPTVBBUkUobGFpNDguZGlnaXRzWzBdLCA9PSwgMHgwMCk7CisgICAgQ09NUEFSRShsYWk0OC5kaWdpdHNbMV0sID09LCAweEYxKTsKKyAgICBDT01QQVJFKGxhaTQ4LmRpZ2l0c1syXSwgPT0sIDB4MTApOworICAgIENPTVBBUkUobGFpNDgubGFjLCA9PSwgaHRvbnMoMHgwMDAxKSk7CisKKyAgICBnc200OF9nZW5lcmF0ZV9sYWkoJmxhaTQ4LCA2MDIsIDEsIDE1KTsKKyAgICBDT01QQVJFKGxhaTQ4LmRpZ2l0c1swXSwgPT0sIDB4MDYpOworICAgIENPTVBBUkUobGFpNDguZGlnaXRzWzFdLCA9PSwgMHhGMik7CisgICAgQ09NUEFSRShsYWk0OC5kaWdpdHNbMl0sID09LCAweDEwKTsKKyAgICBDT01QQVJFKGxhaTQ4LmxhYywgPT0sIGh0b25zKDB4MDAwZikpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X21pX2Z1bmN0aW9uYWxpdHkodm9pZCkKK3sKKwljb25zdCBjaGFyICppbXNpX29kZCAgPSAiOTg3NjU0MzIxMDk4NzYzIjsKKwljb25zdCBjaGFyICppbXNpX2V2ZW4gPSAiOTg3NjU0MzIxMDk4NzY1NCI7CisJY29uc3QgdV9pbnQzMl90IHRtc2kgPSAweGZhYmVhY2QwOworCXVfaW50OF90IG1pWzEyOF07CisJdW5zaWduZWQgaW50IG1pX2xlbjsKKwljaGFyIG1pX3BhcnNlZFtHU000OF9NSV9TSVpFXTsKKworCXByaW50ZigiVGVzdGluZyBwYXJzaW5nIGFuZCBnZW5lcmF0aW5nIFRNU0kvSU1TSVxuIik7CisKKwkvKiB0bXNpIGNvZGUgKi8KKwltaV9sZW4gPSBnc200OF9nZW5lcmF0ZV9taWRfZnJvbV90bXNpKG1pLCB0bXNpKTsKKwlnc200OF9taV90b19zdHJpbmcobWlfcGFyc2VkLCBzaXplb2YobWlfcGFyc2VkKSwgbWkgKyAyLCBtaV9sZW4gLSAyKTsKKwlDT01QQVJFKCh1X2ludDMyX3Qpc3RydG91bChtaV9wYXJzZWQsIE5VTEwsIDEwKSwgPT0sIHRtc2kpOworCisJLyogaW1zaSBjb2RlICovCisJbWlfbGVuID0gZ3NtNDhfZ2VuZXJhdGVfbWlkX2Zyb21faW1zaShtaSwgaW1zaV9vZGQpOworCWdzbTQ4X21pX3RvX3N0cmluZyhtaV9wYXJzZWQsIHNpemVvZihtaV9wYXJzZWQpLCBtaSArIDIsIG1pX2xlbiAtMik7CisJcHJpbnRmKCJoZXg6ICVzXG4iLCBoZXhkdW1wKG1pLCBtaV9sZW4pKTsKKwlDT01QQVJFX1NUUihtaV9wYXJzZWQsIGltc2lfb2RkKTsKKworCW1pX2xlbiA9IGdzbTQ4X2dlbmVyYXRlX21pZF9mcm9tX2ltc2kobWksIGltc2lfZXZlbik7CisJZ3NtNDhfbWlfdG9fc3RyaW5nKG1pX3BhcnNlZCwgc2l6ZW9mKG1pX3BhcnNlZCksIG1pICsgMiwgbWlfbGVuIC0yKTsKKwlwcmludGYoImhleDogJXNcbiIsIGhleGR1bXAobWksIG1pX2xlbikpOworCUNPTVBBUkVfU1RSKG1pX3BhcnNlZCwgaW1zaV9ldmVuKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworCXRlc3RfbG9jYXRpb25fYXJlYV9pZGVudGlmaWVyKCk7CisJdGVzdF9taV9mdW5jdGlvbmFsaXR5KCk7CisKKwlleGl0KDApOworfQorCisKKworLyoKKyAqIFN0dWJzIHRvIGNvbXBpbGUgYW5kIGxpbmsKKyAqLwordm9pZCBpbnB1dF9ldmVudCh2b2lkKSB7fQordm9pZCBubV9zdGF0ZV9ldmVudCh2b2lkKSB7fQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9zY2NwL01ha2VmaWxlLmFtIGIvb3BlbmJzYy90ZXN0cy9zY2NwL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNTY5M2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rlc3RzL3NjY3AvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw4IEBACitJTkNMVURFUyA9ICQoYWxsX2luY2x1ZGVzKSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZQorQU1fQ0ZMQUdTPS1XYWxsIC1nZ2RiMyAkKExJQk9TTU9DT1JFX0NGTEFHUykKKworbm9pbnN0X1BST0dSQU1TID0gc2NjcF90ZXN0CisKK3NjY3BfdGVzdF9TT1VSQ0VTID0gc2NjcF90ZXN0LmMKK3NjY3BfdGVzdF9MREFERCA9ICQodG9wX2J1aWxkZGlyKS9zcmMvbGlic2NjcC5hICQodG9wX2J1aWxkZGlyKS9zcmMvbGliYnNjLmEgJChMSUJPU01PQ09SRV9MSUJTKQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL3NjY3Avc2NjcF90ZXN0LmMgYi9vcGVuYnNjL3Rlc3RzL3NjY3Avc2NjcF90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFlYjQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvc2NjcC9zY2NwX3Rlc3QuYwpAQCAtMCwwICsxLDg1MSBAQAorLyoKKyAqIFNDQ1AgdGVzdGluZyBjb2RlCisgKgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDkgYnkgT24tV2F2ZXMKKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorCisjaW5jbHVkZSA8c2NjcC9zY2NwLmg+CisKKyNkZWZpbmUgTUlOKHgsIHkpICgoeCkgPCAoeSkgPyAoeCkgOiAoeSkpCisKKy8qIEJTQyAtPiBNU0MgKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBic3NtYXBfcmVzZXRbXSA9IHsKKwkweDA5LCAweDAwLCAweDAzLCAweDA1LCAweDA3LCAweDAyLCAweDQyLCAweGZlLAorCTB4MDIsIDB4NDIsIDB4ZmUsIDB4MDYsIDB4MDAsIDB4MDQsIDB4MzAsIDB4MDQsCisJMHgwMSwgMHgyMCwKK307CisKKy8qIE1TQyAtPiBCU0MgcmVzZXQgYWNrICovCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYnNzbWFwX3Jlc2V0X2Fja1tdID0geworCTB4MDksIDB4MDAsIDB4MDMsIDB4MDcsIDB4MGIsIDB4MDQsIDB4NDMsIDB4MDEsCisJMHgwMCwgMHhmZSwgMHgwNCwgMHg0MywgMHg1YywgMHgwMCwgMHhmZSwgMHgwMywKKwkweDAwLCAweDAxLCAweDMxLAorfTsKKworLyogTVNDIC0+IEJTQyBwYWdpbmcsIGNvbm5lY3Rpb24gbGVzcyAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGJzc21hcF9wYWdpbmdbXSA9IHsKKwkweDA5LCAweDAwLCAweDAzLCAweDA3LCAweDBiLCAweDA0LCAweDQzLCAweDAxLAorCTB4MDAsIDB4ZmUsIDB4MDQsIDB4NDMsIDB4NWMsIDB4MDAsIDB4ZmUsIDB4MTAsCisJMHgwMCwgMHgwZSwgMHg1MiwgMHgwOCwgMHgwOCwgMHgyOSwgMHg0NywgMHgxMCwKKwkweDAyLCAweDAxLCAweDMxLCAweDk3LCAweDYxLCAweDFhLCAweDAxLCAweDA2LAorfTsKKworLyogTVNDIC0+IEJTQyBwYWdpbmcsIFVEVCB3aXRob3V0IFBDICAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGJzc21hcF91ZHRbXSA9IHsKKwkweDA5LCAweDAwLCAweDAzLCAweDA1LCAweDA3LCAweDAyLCAweDQyLCAweGZlLAorCTB4MDIsIDB4NDIsIDB4ZmUsIDB4MTAsIDB4MDAsIDB4MGUsIDB4NTIsIDB4MDgsCisJMHgwOCwgMHgyOSwgMHg0NywgMHgxMCwgMHgwMiwgMHgwMSwgMHgzMSwgMHg5NywKKwkweDYxLCAweDFhLCAweDAxLCAweDA2LAorfTsKKworLyogQlNDIC0+IE1TQyBjb25uZWN0aW9uIG9wZW4gKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBic3NtYXBfY3JbXSA9IHsKKwkweDAxLCAweDAxLCAweDAyLCAweDAzLCAweDAyLCAweDAyLCAweDA0LCAweDAyLAorCTB4NDIsIDB4ZmUsIDB4MGYsIDB4MWYsIDB4MDAsIDB4MWQsIDB4NTcsIDB4MDUsCisJMHgwOCwgMHgwMCwgMHg3MiwgMHhmNCwgMHg4MCwgMHgyMCwgMHgxMiwgMHhjMywKKwkweDUwLCAweDE3LCAweDEwLCAweDA1LCAweDI0LCAweDExLCAweDAzLCAweDMzLAorCTB4MTksIDB4YTIsIDB4MDgsIDB4MjksIDB4NDcsIDB4MTAsIDB4MDIsIDB4MDEsCisJMHgzMSwgMHg5NywgMHg2MSwgMHgwMAorfTsKKworLyogTVNDIC0+IEJTQyBjb25uZWN0aW9uIGNvbmZpcm0gKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBic3NtYXBfY2NbXSA9IHsKKwkweDAyLCAweDAxLCAweDAyLCAweDAzLCAweDAwLCAweDAwLCAweDAzLCAweDAyLCAweDAxLCAweDAwLAorfTsKKworLyogTVNDIC0+IEJTQyBEVEFQCisgKgorICogd2UgZmFrZSBhIGJpdCBhbmQgbWFrZSBpdCBCU0MgLT4gTVNDLi4uIHNvIHRoZQorICogcGF5bG9hZCBkb2VzIG5vdCBtYWtlIGFueSBzZW5zZS4uCisgKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBic3NtYXBfZHRhcFtdID0geworCTB4MDYsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDEsIDB4MGYsIDB4MDEsIDB4MDAsIDB4MGMsCisJMHgwMywgMHgwNSwgMHg1YywgMHgwOCwgMHgxMSwgMHg4MSwgMHgzMywgMHg2NiwgMHgwMiwgMHgxMywKKwkweDQ1LCAweGY0LAorfTsKKworLyogTVNDIC0+IEJTQyBjbGVhciBjb21tYW5kICovCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYnNzbWFwX2NsZWFyW10gPSB7CisJMHgwNiwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMSwgMHgwNiwgMHgwMCwgMHgwNCwgMHgyMCwKKwkweDA0LCAweDAxLCAweDA5LAorfTsKKworLyogTVNDIC0+IEJTQyByZWxlYXNlZCAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGJzc21hcF9yZWxlYXNlZFtdID0geworCTB4MDQsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDAsIDB4MDEsIDB4MGYsCisJMHgwMiwgMHgyMywgMHg0MiwgMHgwMCwKK307CisKKy8qIEJTQyAtPiBNU0MgcmVsZWFzZWQgKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBic3NtYXBfcmVsZWFzZV9jb21wbGV0ZVtdID0geworCTB4MDUsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDMKK307CisKK3N0cnVjdCB0ZXN0X2RhdGEgeworCWludCBsZW5ndGg7CisJY29uc3QgdV9pbnQ4X3QgKmRhdGE7CisJaW50IHBheWxvYWRfc3RhcnQ7CisJaW50IHBheWxvYWRfbGVuZ3RoOworCXVfaW50OF90IGZpcnN0X2J5dGU7CisKKyAgICAgICAgLyogaW4gY2FzZSBpdCBzaG91bGQgdHJpZ2dlciBhIHNjY3AgcmVzcG9uc2UgKi8KKwlpbnQgd3JpdGU7CisJY29uc3QgdV9pbnQ4X3QgICpyZXNwb25zZTsKKwlpbnQgcmVzcG9uc2VfbGVuZ3RoOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0ZXN0X2RhdGEgdGVzdF9kYXRhW10gPSB7CisJeworCQkubGVuZ3RoCQk9IEFSUkFZX1NJWkUoYnNzbWFwX3Jlc2V0KSwKKwkJLmRhdGEJCT0gJmJzc21hcF9yZXNldFswXSwKKwkJLnBheWxvYWRfc3RhcnQJPSAxMiwKKwkJLnBheWxvYWRfbGVuZ3RoID0gQVJSQVlfU0laRShic3NtYXBfcmVzZXQpIC0gMTIsCisJCS5maXJzdF9ieXRlCT0gMHgwLAorCX0sCisJeworCQkubGVuZ3RoCQk9IEFSUkFZX1NJWkUoYnNzbWFwX3Jlc2V0X2FjayksCisJCS5kYXRhCQk9ICZic3NtYXBfcmVzZXRfYWNrWzBdLAorCQkucGF5bG9hZF9zdGFydAk9IDE2LAorCQkucGF5bG9hZF9sZW5ndGggPSBBUlJBWV9TSVpFKGJzc21hcF9yZXNldF9hY2spIC0gMTYsCisJCS5maXJzdF9ieXRlCT0gMHgwLAorCX0sCisJeworCQkubGVuZ3RoCQk9IEFSUkFZX1NJWkUoYnNzbWFwX3BhZ2luZyksCisJCS5kYXRhCQk9ICZic3NtYXBfcGFnaW5nWzBdLAorCQkucGF5bG9hZF9zdGFydAk9IDE2LAorCQkucGF5bG9hZF9sZW5ndGggPSBBUlJBWV9TSVpFKGJzc21hcF9wYWdpbmcpIC0gMTYsCisJCS5maXJzdF9ieXRlCT0gMHgwLAorCX0sCisJeworCQkubGVuZ3RoCQk9IEFSUkFZX1NJWkUoYnNzbWFwX2NyKSwKKwkJLmRhdGEJCT0gJmJzc21hcF9jclswXSwKKwkJLnBheWxvYWRfc3RhcnQJPSAxMiwKKwkJLyogMHgwMCBpcyBlbmQgb2Ygb3B0aW9uYWwgZGF0YSwgc3VidHJhY3QgdGhpcyBieXRlICovCisJCS5wYXlsb2FkX2xlbmd0aCA9IDMxLAorCQkuZmlyc3RfYnl0ZQk9IDB4MCwKKworCQkvKiB0aGUgY29ubmVjdGlvbiByZXF1ZXN0IHNob3VsZCB0cmlnZ2VyIGEgY29ubmVjdGlvbiBjb25maXJtICovCisJCS53cml0ZQkJPSAxLAorCQkucmVzcG9uc2UJPSAmYnNzbWFwX2NjWzBdLAorCQkucmVzcG9uc2VfbGVuZ3RoPSBBUlJBWV9TSVpFKGJzc21hcF9jYyksCisJfSwKKwl7CisJCS5sZW5ndGgJCT0gQVJSQVlfU0laRShic3NtYXBfZHRhcCksCisJCS5kYXRhCQk9ICZic3NtYXBfZHRhcFswXSwKKwkJLnBheWxvYWRfc3RhcnQJPSA3LAorCQkucGF5bG9hZF9sZW5ndGggPSAxNSwKKwkJLmZpcnN0X2J5dGUJPSAweDAxLAorCX0sCisJeworCQkubGVuZ3RoCQk9IEFSUkFZX1NJWkUoYnNzbWFwX2NsZWFyKSwKKwkJLmRhdGEJCT0gJmJzc21hcF9jbGVhclswXSwKKwkJLnBheWxvYWRfc3RhcnQJPSA3LAorCQkucGF5bG9hZF9sZW5ndGggPSA2LAorCQkuZmlyc3RfYnl0ZQk9IDB4MDAsCisJfSwKKwl7CisJCS5sZW5ndGgJCT0gQVJSQVlfU0laRShic3NtYXBfcmVsZWFzZWQpLAorCQkuZGF0YQkJPSAmYnNzbWFwX3JlbGVhc2VkWzBdLAorCQkucGF5bG9hZF9sZW5ndGggPSAyLAorCQkucGF5bG9hZF9zdGFydCAgPSAxMSwKKwkJLmZpcnN0X2J5dGUJPSAweDIzLAorCisJCS53cml0ZQkJPSAxLAorCQkucmVzcG9uc2UJPSAmYnNzbWFwX3JlbGVhc2VfY29tcGxldGVbMF0sCisJCS5yZXNwb25zZV9sZW5ndGg9IEFSUkFZX1NJWkUoYnNzbWFwX3JlbGVhc2VfY29tcGxldGUpLAorCX0sCit9OworCisvKiB3ZSB3aWxsIHNlbmQgVURUcyBhbmQgdmVyaWZ5IHRoZXkgbG9vayBsaWtlIHRoaXMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGVzdF9kYXRhIHNlbmRfZGF0YVtdID0geworCXsKKwkJLmxlbmd0aAkJPSBBUlJBWV9TSVpFKGJzc21hcF91ZHQpLAorCQkuZGF0YQkJPSAmYnNzbWFwX3VkdFswXSwKKwkJLnBheWxvYWRfc3RhcnQJPSAxMiwKKwkJLnBheWxvYWRfbGVuZ3RoID0gQVJSQVlfU0laRShic3NtYXBfdWR0KSAtIDEyLAorCQkuZmlyc3RfYnl0ZQk9IDB4MCwKKwl9LAorCXsKKwkJLmxlbmd0aAkJPSBBUlJBWV9TSVpFKGJzc21hcF9yZXNldCksCisJCS5kYXRhCQk9ICZic3NtYXBfcmVzZXRbMF0sCisJCS5wYXlsb2FkX3N0YXJ0CT0gMTIsCisJCS5wYXlsb2FkX2xlbmd0aCA9IEFSUkFZX1NJWkUoYnNzbWFwX3Jlc2V0KSAtIDEyLAorCQkuZmlyc3RfYnl0ZQk9IDB4MCwKKwl9LAorfTsKKworc3RydWN0IGNvbm5lY3Rpb25fdGVzdCB7CisJLyogc2hvdWxkIHRoZSBjb25uZWN0aW9uIGJlIHJlZnVzZWQ/ICovCisJaW50IHJlZnVzZTsKKworCWludCB3aXRoX2RhdGE7CisKKwkvKiBvbiB3aGljaCBzaWRlIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uPyAqLworCWludCBjbG9zZV9zaWRlOworCWludCBjbG9zZV9jYXVzZTsKK307CisKKy8qIHNjY3AgY29ubmVjdGlvbiBoYW5kbGluZyB3ZSB3YW50IHRvIHRlc3QgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29ubmVjdGlvbl90ZXN0IGNvbm5lY3Rpb25fdGVzdHNbXSA9IHsKKwl7CisJCS5yZWZ1c2UJPSAxLAorCX0sCisJeworCQkucmVmdXNlCT0gMSwKKwkJLndpdGhfZGF0YSA9IDEsCisJfSwKKwl7CisJCS5yZWZ1c2UgPSAwLAorCQkuY2xvc2Vfc2lkZSA9IDAsCisJCS5jbG9zZV9jYXVzZSA9IDUsCisJfSwKKwl7CisJCS5yZWZ1c2UgPSAwLAorCQkuY2xvc2Vfc2lkZSA9IDAsCisJCS5jbG9zZV9jYXVzZSA9IDUsCisJCS53aXRoX2RhdGEgPSAxLAorCX0sCisJeworCQkucmVmdXNlID0gMCwKKwkJLmNsb3NlX3NpZGUgPSAxLAorCQkuY2xvc2VfY2F1c2UgPSA1LAorCX0sCisJeworCQkucmVmdXNlID0gMCwKKwkJLmNsb3NlX3NpZGUgPSAxLAorCQkuY2xvc2VfY2F1c2UgPSA1LAorCQkud2l0aF9kYXRhID0gMSwKKwl9LAorfTsKKworc3RydWN0IHNjY3BfcGFyc2VfaGVhZGVyX3Jlc3VsdCB7CisJLyogcmVzdWx0cyAqLworCWludCBtc2dfdHlwZTsKKwlpbnQgd2FudGVkX2xlbjsKKwlpbnQgc3JjX3NzbjsKKwlpbnQgZHN0X3NzbjsKKworCWludCBoYXNfc3JjX3JlZiwgaGFzX2RzdF9yZWY7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSBzcmNfcmVmOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgZHN0X3JlZjsKKworCS8qIHRoZSBpbnB1dCAqLworCWNvbnN0IHVfaW50OF90ICppbnB1dDsKKwlpbnQgaW5wdXRfbGVuOworfTsKKworc3RhdGljIGNvbnN0IHVfaW50OF90IGl0X3Rlc3RbXSA9IHsKKzB4MTAsIDB4MDEsIDB4MDcsIAorMHg5NCwgMHgwMSwgMHgwNCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCB9OworCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgcHJvdG9fZXJyW10gPSB7CisweDBmLCAweDBjLCAweDA0LCAweDAwLCAweDAwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzY2NwX3BhcnNlX2hlYWRlcl9yZXN1bHQgcGFyc2VfcmVzdWx0W10gPSB7CisJeworCQkubXNnX3R5cGUJPSBTQ0NQX01TR19UWVBFX0lULAorCQkud2FudGVkX2xlbgk9IDAsCisJCS5zcmNfc3NuCT0gLTEsCisJCS5kc3Rfc3NuCT0gLTEsCisJCS5oYXNfc3JjX3JlZgk9IDEsCisJCS5oYXNfZHN0X3JlZgk9IDEsCisKKwkJLnNyY19yZWYJPSB7CisJCQkub2N0ZXQxID0gMHgwMSwKKwkJCS5vY3RldDIgPSAweDA0LAorCQkJLm9jdGV0MyA9IDB4MDAKKwkJfSwKKwkJLmRzdF9yZWYJPSB7CisJCQkub2N0ZXQxID0gMHgwMSwKKwkJCS5vY3RldDIgPSAweDA3LAorCQkJLm9jdGV0MyA9IDB4OTQsCisJCX0sCisKKwkJLmlucHV0CQk9IGl0X3Rlc3QsCisJCS5pbnB1dF9sZW4JPSBzaXplb2YoaXRfdGVzdCksCisJfSwKKwl7CisJCS5tc2dfdHlwZQk9IFNDQ1BfTVNHX1RZUEVfRVJSLAorCQkud2FudGVkX2xlbgk9IDAsCisJCS5zcmNfc3NuCT0gLTEsCisJCS5kc3Rfc3NuCT0gLTEsCisJCS5oYXNfc3JjX3JlZgk9IDAsCisJCS5oYXNfZHN0X3JlZgk9IDEsCisJCS5kc3RfcmVmCT0geworCQkJLm9jdGV0MSA9IDB4MGMsCisJCQkub2N0ZXQyID0gMHgwNCwKKwkJCS5vY3RldDMgPSAweDAwLAorCQl9LAorCQkuaW5wdXQJCT0gcHJvdG9fZXJyLAorCQkuaW5wdXRfbGVuCT0gc2l6ZW9mKHByb3RvX2VyciksCisJfSwKK307CisKKworLyogdGVzdGluZyBwcm9jZWR1cmU6CisgKgktIHdlIHdpbGwgdXNlIHNjY3Bfd3JpdGUgYW5kIHNlZSB3aGF0IHdpbGwgYmUgc2V0IGluIHRoZQorICoJICBvdXRnb2luZyBjYWxsYmFjaworICoJLSB3ZSB3aWxsIGNhbGwgc2NjcF9zeXN0ZW1faW5jb21pbmcgYW5kIHNlZSB3aGljaCBjYWxscworICoJICBhcmUgbWFkZS4gQW5kIHRoZW4gY29tcGFyZSBpdCB0byB0aGUgb25lcyB3ZSBleHBlY3QuIFdlCisgKgkgIHdhbnQgdGhlIHBheWxvYWQgdG8gYXJyaXZlLCBvciBjYWxsYmFja3MgdG8gYmUgY2FsbGVkLgorICoJLSB3ZSB3aWxsIHVzZSBzY2NwX2Nvbm5lY3Rpb25fc29ja2V0IGFuZCBzY2NwX2Nvbm5lY3Rpb25fd3JpdGUKKyAqCSAgYW5kIHZlcmlmeSBzdGF0ZSBoYW5kbGluZyBvZiBjb25uZWN0aW9ucworICovCisKK3N0YXRpYyBpbnQgY3VycmVudF90ZXN0OworCisvKgorICogdGVzdCBzdGF0ZS4uLgorICovCitzdGF0aWMgaW50IGNhbGxlZCAgPSAwOworc3RhdGljIGludCBtYXRjaGVkID0gMDsKK3N0YXRpYyBpbnQgd3JpdGVfY2FsbGVkID0gMDsKKworI2RlZmluZSBGQUlMKHgsIGFyZ3MuLi4pIHByaW50ZigiRkFJTFVSRSBpbiAlczolZDogIiB4LCBfX0ZJTEVfXywgX19MSU5FX18sICMjIGFyZ3MpCisKKy8qCisgKiB3cml0aW5nIHRoZXNlIHBhY2tldHMgYW5kIGV4cGVjdGluZyBhIHJlc3VsdAorICovCitpbnQgc2NjcF9yZWFkX2NiKHN0cnVjdCBtc2diICpkYXRhLCB1bnNpZ25lZCBsZW4sIHZvaWQgKmNvbnRleHQpCit7CisJdV9pbnQxNl90IHBheWxvYWRfbGVuZ3RoID0gdGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0ucGF5bG9hZF9sZW5ndGg7CisJY29uc3QgdV9pbnQ4X3QgKmdvdCwgKndhbnRlZDsKKwlpbnQgaTsKKworCWNhbGxlZCA9IDE7CisKKwlpZiAobXNnYl9sM2xlbihkYXRhKSA8IGxlbikgeworCQkvKiB0aGlzIHNob3VsZCBuZXZlciBiZSByZWFjaGVkICovCisJCUZBSUwoIlNvbWV0aGluZyBob3JyaWJsZSBoYXBwZW5lZC4uIGludmFsaWQgcGFja2V0Li5cbiIpOworCQlleGl0KC0xKTsKKwl9CisKKwlpZiAobGVuID09IDAgfHwgbGVuICE9IHBheWxvYWRfbGVuZ3RoKSB7CisJCUZBSUwoImxlbmd0aCBtaXNtYXRjaDogZ290OiAlZCB3YW50ZWQ6ICVkXG4iLCBtc2diX2wzbGVuKGRhdGEpLCBwYXlsb2FkX2xlbmd0aCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoZGF0YS0+bDNoWzBdICE9ICB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5maXJzdF9ieXRlKSB7CisJCUZBSUwoIlRoZSBmaXJzdCBieXRlcyBvZiBsMyBkbyBub3QgbWF0Y2g6IDB4JXggMHgleFxuIiwKKwkJCWRhdGEtPmwzaFswXSwgdGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0uZmlyc3RfYnl0ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlnb3QgPSAmZGF0YS0+bDNoWzBdOworCXdhbnRlZCA9IHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLmRhdGEgKyB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5wYXlsb2FkX3N0YXJ0OworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisJCWlmIChnb3RbaV0gIT0gd2FudGVkW2ldKSB7CisJCQlGQUlMKCJGYWlsZWQgdG8gY29tcGFyZSBieXRlLiBHb3Q6IDB4JXggV2FudGVkOiAweCV4IGF0ICVkXG4iLAorCQkJICAgICBnb3RbaV0sIHdhbnRlZFtpXSwgaSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwltYXRjaGVkID0gMTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzY2NwX3dyaXRlX2NiKHN0cnVjdCBtc2diICpkYXRhLCB2b2lkICpjdHgpCit7CisJaW50IGkgPSAwOworCWNvbnN0IHVfaW50OF90ICpnb3QsICp3YW50ZWQ7CisKKwlpZiAodGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0ucmVzcG9uc2UgPT0gTlVMTCkgeworCQlGQUlMKCJEaWRuJ3QgZXhwZWN0IHdyaXRlIGNhbGxiYWNrXG4iKTsKKwkJZ290byBleGl0OworCX0gZWxzZSBpZiAodGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0ucmVzcG9uc2VfbGVuZ3RoICE9IG1zZ2JfbDJsZW4oZGF0YSkpIHsKKwkJRkFJTCgiU2l6ZSBkb2VzIG5vdCBtYXRjaC4gR290OiAlZCBXYW50ZWQ6ICVkXG4iLAorCQkgICAgIG1zZ2JfbDJsZW4oZGF0YSksIHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLnJlc3BvbnNlX2xlbmd0aCk7CisJfQorCisJZ290ID0gJmRhdGEtPmwyaFswXTsKKwl3YW50ZWQgPSB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5yZXNwb25zZTsKKworCWZvciAoaSA9IDA7IGkgPCBtc2diX2wybGVuKGRhdGEpOyArK2kpIHsKKwkJaWYgKGdvdFtpXSAhPSB3YW50ZWRbaV0pIHsKKwkJCUZBSUwoIkZhaWxlZCB0byBjb21wYXJlIGJ5dGUuIEdvdDogMHgleCBXYW50ZWQ6IDB4JXggYXQgJWRcbiIsCisJCQkgICAgIGdvdFtpXSwgd2FudGVkW2ldLCBpKTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCX0KKworCXdyaXRlX2NhbGxlZCA9IDE7CisKK2V4aXQ6CisJbXNnYl9mcmVlKGRhdGEpOworfQorCit2b2lkIHNjY3BfY19yZWFkKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBtc2diICptc2diLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXNjY3BfcmVhZF9jYihtc2diLCBsZW4sIGNvbm5lY3Rpb24tPmRhdGFfY3R4KTsKK30KKwordm9pZCBzY2NwX2Nfc3RhdGUoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgaW50IG9sZF9zdGF0ZSkKK3sKKwlpZiAoY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSA+PSBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVMRUFTRV9DT01QTEVURSkKKwkJc2NjcF9jb25uZWN0aW9uX2ZyZWUoY29ubmVjdGlvbik7Cit9CisKK2ludCBzY2NwX2FjY2VwdF9jYihzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCB2b2lkICp1c2VyX2RhdGEpCit7CisJY2FsbGVkID0gMTsKKwl1bnNpZ25lZCBpbnQgcmVmID0gMDsKKwlyZWYgfD0gY29ubmVjdGlvbi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLm9jdGV0MSA8PCAyNDsKKwlyZWYgfD0gY29ubmVjdGlvbi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLm9jdGV0MiA8PCAxNjsKKwlyZWYgfD0gY29ubmVjdGlvbi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLm9jdGV0MyA8PCAgODsKKwlyZWYgPSBudG9obChyZWYpOworCisJY29ubmVjdGlvbi0+ZGF0YV9jYiA9IHNjY3BfY19yZWFkOworCWNvbm5lY3Rpb24tPnN0YXRlX2NiID0gc2NjcF9jX3N0YXRlOworCisJLyogYWNjZXB0IHRoaXMgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2NjcF91ZHRfd3JpdGVfY2Ioc3RydWN0IG1zZ2IgKmRhdGEsIHZvaWQgKmNvbnRleHQpCit7CisJY29uc3QgdV9pbnQ4X3QgKmdvdCwgKndhbnRlZDsKKwlpbnQgaTsKKworCXdyaXRlX2NhbGxlZCA9IDE7CisKKwlpZiAoc2VuZF9kYXRhW2N1cnJlbnRfdGVzdF0ubGVuZ3RoICE9IG1zZ2JfbDJsZW4oZGF0YSkpIHsKKwkJRkFJTCgiU2l6ZSBkb2VzIG5vdCBtYXRjaC4gR290OiAlZCBXYW50ZWQ6ICVkXG4iLAorCQkgICAgIG1zZ2JfbDJsZW4oZGF0YSksIHNlbmRfZGF0YVtjdXJyZW50X3Rlc3RdLmxlbmd0aCk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlnb3QgPSAmZGF0YS0+bDJoWzBdOworCXdhbnRlZCA9IHNlbmRfZGF0YVtjdXJyZW50X3Rlc3RdLmRhdGE7CisKKwlmb3IgKGkgPSAwOyBpIDwgbXNnYl9sMmxlbihkYXRhKTsgKytpKSB7CisJCWlmIChnb3RbaV0gIT0gd2FudGVkW2ldKSB7CisJCQlGQUlMKCJGYWlsZWQgdG8gY29tcGFyZSBieXRlLiBHb3Q6IDB4JXggV2FudGVkOiAweCV4IGF0ICVkXG4iLAorCQkJICAgICBnb3RbaV0sIHdhbnRlZFtpXSwgaSk7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwl9CisKKwltYXRjaGVkID0gMTsKKworZXhpdDoKKwltc2diX2ZyZWUoZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfc2NjcF9zeXN0ZW0odm9pZCkKK3sKKwlzY2NwX3N5c3RlbV9pbml0KHNjY3Bfd3JpdGVfY2IsIE5VTEwpOworCXNjY3Bfc2V0X3JlYWQoJnNjY3Bfc3NuX2Jzc2FwLCBzY2NwX3JlYWRfY2IsIE5VTEwpOworCXNjY3BfY29ubmVjdGlvbl9zZXRfaW5jb21pbmcoJnNjY3Bfc3NuX2Jzc2FwLCBzY2NwX2FjY2VwdF9jYiwgTlVMTCk7CisKKwlmb3IgKGN1cnJlbnRfdGVzdCA9IDA7IGN1cnJlbnRfdGVzdCA8IEFSUkFZX1NJWkUodGVzdF9kYXRhKTsgKytjdXJyZW50X3Rlc3QpIHsKKwkJdW5zaWduZWQgaW50IGxlbmd0aCA9IHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLmxlbmd0aDsKKwkJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2NfaGVhZHJvb20obGVuZ3RoICsgMiwgMiwgX19mdW5jX18pOworCQltc2ctPmwyaCA9IG1zZ2JfcHV0KG1zZywgbGVuZ3RoKTsKKwkJbWVtY3B5KG1zZy0+bDJoLCB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5kYXRhLCBsZW5ndGgpOworCisJCWNhbGxlZCA9IG1hdGNoZWQgPSB3cml0ZV9jYWxsZWQgPSAwOworCQlwcmludGYoIlRlc3RpbmcgcGFja2V0OiAlZFxuIiwgY3VycmVudF90ZXN0KTsKKwkJc2NjcF9zeXN0ZW1faW5jb21pbmcobXNnKTsKKworCQlpZiAoIWNhbGxlZCB8fCAhbWF0Y2hlZCB8fCAodGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0ud3JpdGUgIT0gd3JpdGVfY2FsbGVkKSkKKwkJCUZBSUwoImN1cnJlbnQgdGVzdDogJWQgY2FsbGVkOiAlZCBtYXRjaGVkOiAlZCB3cml0ZTogJWRcbiIsCisJCQkgICAgIGN1cnJlbnRfdGVzdCwgY2FsbGVkLCBtYXRjaGVkLCB3cml0ZV9jYWxsZWQpOworCisJCW1zZ2JfZnJlZShtc2cpOworCX0KK30KKworLyogdGVzdCBzZW5kaW5nIG9mIHVkdCAqLworc3RhdGljIHZvaWQgdGVzdF9zY2NwX3NlbmRfdWR0KHZvaWQpCit7CisJc2NjcF9zeXN0ZW1faW5pdChzY2NwX3VkdF93cml0ZV9jYiwgTlVMTCk7CisJc2NjcF9zZXRfcmVhZChOVUxMLCBOVUxMLCBOVUxMKTsKKwlzY2NwX2Nvbm5lY3Rpb25fc2V0X2luY29taW5nKE5VTEwsIE5VTEwsIE5VTEwpOworCisJZm9yIChjdXJyZW50X3Rlc3QgPSAwOyBjdXJyZW50X3Rlc3QgPCBBUlJBWV9TSVpFKHNlbmRfZGF0YSk7ICsrY3VycmVudF90ZXN0KSB7CisJCWNvbnN0IHN0cnVjdCB0ZXN0X2RhdGEgKnRlc3QgPSAmc2VuZF9kYXRhW2N1cnJlbnRfdGVzdF07CisKKwkJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2ModGVzdC0+cGF5bG9hZF9sZW5ndGgsIF9fZnVuY19fKTsKKwkJbXNnLT5sM2ggPSBtc2diX3B1dChtc2csIHRlc3QtPnBheWxvYWRfbGVuZ3RoKTsKKwkJbWVtY3B5KG1zZy0+bDNoLCB0ZXN0LT5kYXRhICsgdGVzdC0+cGF5bG9hZF9zdGFydCwgdGVzdC0+cGF5bG9hZF9sZW5ndGgpOworCisJCW1hdGNoZWQgPSB3cml0ZV9jYWxsZWQgPSAwOworCQlwcmludGYoIlRlc3RpbmcgcGFja2V0OiAlZFxuIiwgY3VycmVudF90ZXN0KTsKKwkJc2NjcF93cml0ZShtc2csICZzY2NwX3Nzbl9ic3NhcCwgJnNjY3Bfc3NuX2Jzc2FwLCAwKTsKKworCQlpZiAoIW1hdGNoZWQgfHwgIXdyaXRlX2NhbGxlZCkKKwkJCUZBSUwoImN1cnJlbnQgdGVzdDogJWQgbWF0Y2hlZDogJWQgd3JpdGU6ICVkXG4iLAorCQkJICAgICBjdXJyZW50X3Rlc3QsIG1hdGNoZWQsIHdyaXRlX2NhbGxlZCk7CisKKwkJbXNnYl9mcmVlKG1zZyk7CisJfQorfQorCisvKiBzZW5kIHVkdCBmcm9tIG9uZSBlbmQgdG8gYW5vdGhlciAqLworc3RhdGljIHVuc2lnbmVkIGludCB0ZXN0X3ZhbHVlID0gMHgyNDQyOworc3RhdGljIGludCBzY2NwX3VkdF9yZWFkKHN0cnVjdCBtc2diICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuLCB2b2lkICpjb250ZXh0KQoreworCXVuc2lnbmVkIGludCAqdmFsOworCisJaWYgKGxlbiAhPSA0KSB7CisJCUZBSUwoIldyb25nIHNpemU6ICVkXG4iLCBtc2diX2wzbGVuKGRhdGEpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXZhbCA9ICh1bnNpZ25lZCBpbnQqKWRhdGEtPmwzaDsKKwltYXRjaGVkID0gdGVzdF92YWx1ZSA9PSAqdmFsOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNjY3Bfd3JpdGVfbG9vcChzdHJ1Y3QgbXNnYiAqZGF0YSwgdm9pZCAqY29udGV4dCkKK3sKKwkvKiBzZW5kIGl0IGJhY2sgdG8gdXMgKi8KKwlzY2NwX3N5c3RlbV9pbmNvbWluZyhkYXRhKTsKKwltc2diX2ZyZWUoZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfc2NjcF91ZHRfY29tbXVuaWNhdGlvbih2b2lkKQoreworCXN0cnVjdCBtc2diICpkYXRhOworCXVuc2lnbmVkIGludCAqdmFsOworCisJc2NjcF9zeXN0ZW1faW5pdChzY2NwX3dyaXRlX2xvb3AsIE5VTEwpOworCXNjY3Bfc2V0X3JlYWQoJnNjY3Bfc3NuX2Jzc2FwLCBzY2NwX3VkdF9yZWFkLCBOVUxMKTsKKwlzY2NwX2Nvbm5lY3Rpb25fc2V0X2luY29taW5nKE5VTEwsIE5VTEwsIE5VTEwpOworCisKKwlkYXRhID0gbXNnYl9hbGxvYyg0LCAidGVzdCBkYXRhIik7CisJZGF0YS0+bDNoID0gJmRhdGEtPmRhdGFbMF07CisJdmFsID0gKHVuc2lnbmVkIGludCAqKW1zZ2JfcHV0KGRhdGEsIDQpOworCSp2YWwgPSB0ZXN0X3ZhbHVlOworCisJbWF0Y2hlZCA9IDA7CisJc2NjcF93cml0ZShkYXRhLCAmc2NjcF9zc25fYnNzYXAsICZzY2NwX3Nzbl9ic3NhcCwgMCk7CisKKwlpZiAoIW1hdGNoZWQpCisJICAgIEZBSUwoIlRhbGtpbmcgd2l0aCB1cyBkaWRuJ3Qgd29ya1xuIik7CisKKwltc2diX2ZyZWUoZGF0YSk7Cit9CisKKworLyogY29ubmVjdGlvbiB0ZXN0aW5nLi4uIG9wZW4sIHNlbmQsIGNsb3NlICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbm5lY3Rpb25fdGVzdCAqY3VycmVudF9jb25fdGVzdDsKK3N0YXRpYyBzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpvdXRnb2luZ19jb247CitzdGF0aWMgc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqaW5jb21pbmdfY29uOworc3RhdGljIGludCBvdXRnb2luZ19kYXRhLCBpbmNvbWluZ19kYXRhLCBpbmNvbWluZ19zdGF0ZSwgb3V0Z29pbmdfc3RhdGU7CisKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqdGVzdF9kYXRhMSwgKnRlc3RfZGF0YTIsICp0ZXN0X2RhdGEzOworCitzdGF0aWMgdm9pZCBzY2NwX2Nvbm5faW5fc3RhdGUoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubiwgaW50IG9sZF9zdGF0ZSkKK3sKKwlwcmludGYoIlx0aW5jb21lOiAlZCAtPiAlZFxuIiwgb2xkX3N0YXRlLCBjb25uLT5jb25uZWN0aW9uX3N0YXRlKTsKKwlpZiAoY29ubi0+Y29ubmVjdGlvbl9zdGF0ZSA+PSBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVMRUFTRV9DT01QTEVURSkgeworCQlpZiAoY29ubiA9PSBpbmNvbWluZ19jb24pIHsKKwkJCXNjY3BfY29ubmVjdGlvbl9mcmVlKGNvbm4pOworCQkJaW5jb21pbmdfY29uID0gTlVMTDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgc2NjcF9jb25uX2luX2RhdGEoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubiwgc3RydWN0IG1zZ2IgKm1zZywgdW5zaWduZWQgaW50IGxlbikKK3sKKwkvKiBjb21wYXJlIHRoZSBkYXRhICovCisJKytpbmNvbWluZ19kYXRhOworCXByaW50ZigiXHRpbmNvbWluZyBkYXRhOiAlZFxuIiwgbGVuKTsKKworCS8qIGNvbXBhcmUgdGhlIGRhdGEgKi8KKwlpZiAobGVuICE9IDQpIHsKKwkJRkFJTCgiTGVuZ3RoIG9mIHBhY2tldCBpcyB3cm9uZzogJXUgJXVcbiIsIG1zZ2JfbDNsZW4obXNnKSwgbGVuKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpbmNvbWluZ19kYXRhID09IDEpIHsKKwkJaWYgKG1lbWNtcChtc2ctPmwzaCwgdGVzdF9kYXRhMS0+bDNoLCBsZW4pICE9IDApIHsKKwkJCUZBSUwoIkNvbXBhcmluZyB0aGUgZGF0YSBmYWlsZWQ6ICVkXG4iLCBpbmNvbWluZ19kYXRhKTsKKwkJCWluY29taW5nX3N0YXRlID0gMDsKKwkJCXByaW50ZigiR290OiAgICAlc1xuIiwgaGV4ZHVtcChtc2ctPmwzaCwgbGVuKSk7CisJCQlwcmludGYoIldhbnRlZDogJXNcbiIsIGhleGR1bXAodGVzdF9kYXRhMS0+bDNoLCBsZW4pKTsKKworCQl9CisJfSBlbHNlIGlmIChpbmNvbWluZ19kYXRhID09IDIpIHsKKwkJaWYgKG1lbWNtcChtc2ctPmwzaCwgdGVzdF9kYXRhMi0+bDNoLCBsZW4pICE9IDApIHsKKwkJCUZBSUwoIkNvbXBhcmluZyB0aGUgZGF0YSBmYWlsZWQ6ICVkXG4iLCBpbmNvbWluZ19kYXRhKTsKKwkJCWluY29taW5nX3N0YXRlID0gMDsKKwkJCXByaW50ZigiR290OiAgICAlc1xuIiwgaGV4ZHVtcChtc2ctPmwzaCwgbGVuKSk7CisJCQlwcmludGYoIldhbnRlZDogJXNcbiIsIGhleGR1bXAodGVzdF9kYXRhMi0+bDNoLCBsZW4pKTsKKwkJfQorCX0KKworCS8qIHNlbmRpbmcgb3V0IGRhdGEgKi8KKwlpZiAoaW5jb21pbmdfZGF0YSA9PSAyKSB7CisJCXByaW50ZigiXHRSZXR1cm5pbmcgZGF0YTNcbiIpOworCQlzY2NwX2Nvbm5lY3Rpb25fd3JpdGUoY29ubiwgdGVzdF9kYXRhMyk7CisJfQorfQorCitzdGF0aWMgaW50IHNjY3BfY29ubl9hY2NlcHQoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubiwgdm9pZCAqY3R4KQoreworCXByaW50ZigiXHRhY2NlcHQ6ICVwXG4iLCBjb25uKTsKKwljb25uLT5zdGF0ZV9jYiA9IHNjY3BfY29ubl9pbl9zdGF0ZTsKKwljb25uLT5kYXRhX2NiID0gc2NjcF9jb25uX2luX2RhdGE7CisKKwlpZiAoY3VycmVudF9jb25fdGVzdC0+cmVmdXNlKQorCQlyZXR1cm4gLTE7CisKKwlpbmNvbWluZ19jb24gPSBjb25uOworCXJldHVybiAwOworfQorCisvKiBjYWxsYmFja3MgZm9yIHRoZSBvdXRnb2luZyBzaWRlICovCitzdGF0aWMgdm9pZCBzY2NwX2Nvbm5fb3V0X3N0YXRlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4sIGludCBvbGRfc3RhdGUpCit7CisJcHJpbnRmKCJcdG91dGdvaW5nOiAlcCAlZCAtPiAlZFxuIiwgY29ubiwgb2xkX3N0YXRlLCBjb25uLT5jb25uZWN0aW9uX3N0YXRlKTsKKworCWlmIChjb25uLT5jb25uZWN0aW9uX3N0YXRlID49IFNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFX0NPTVBMRVRFKSB7CisJCWlmIChjb25uID09IG91dGdvaW5nX2NvbikgeworCQkJc2NjcF9jb25uZWN0aW9uX2ZyZWUoY29ubik7CisJCQlvdXRnb2luZ19jb24gPSBOVUxMOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBzY2NwX2Nvbm5fb3V0X2RhdGEoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubiwgc3RydWN0IG1zZ2IgKm1zZywgdW5zaWduZWQgaW50IGxlbikKK3sKKwkrK291dGdvaW5nX2RhdGE7CisJcHJpbnRmKCJcdG91dGdvaW5nIGRhdGE6ICVwICVkXG4iLCBjb25uLCBsZW4pOworCisJaWYgKGxlbiAhPSA0KQorCQlGQUlMKCJMZW5ndGggb2YgcGFja2V0IGlzIHdyb25nOiAldSAldVxuIiwgbXNnYl9sM2xlbihtc2cpLCBsZW4pOworCisJaWYgKG91dGdvaW5nX2RhdGEgPT0gMSkgeworCQlpZiAobWVtY21wKG1zZy0+bDNoLCB0ZXN0X2RhdGEzLT5sM2gsIGxlbikgIT0gMCkgeworCQkJRkFJTCgiQ29tcGFyaW5nIHRoZSBkYXRhIGZhaWxlZFxuIik7CisJCQlvdXRnb2luZ19zdGF0ZSA9IDA7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRvX3Rlc3Rfc2NjcF9jb25uZWN0aW9uKGNvbnN0IHN0cnVjdCBjb25uZWN0aW9uX3Rlc3QgKnRlc3QpCit7CisJaW50IHJldDsKKworCWN1cnJlbnRfY29uX3Rlc3QgPSB0ZXN0OworCW91dGdvaW5nX2NvbiA9IGluY29taW5nX2NvbiA9IDA7CisKKwlvdXRnb2luZ19jb24gPSBzY2NwX2Nvbm5lY3Rpb25fc29ja2V0KCk7CisJaWYgKCFvdXRnb2luZ19jb24pIHsKKwkJRkFJTCgiQ29ubmVjdGlvbiBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuOworCX0KKworCW91dGdvaW5nX2Nvbi0+c3RhdGVfY2IgPSBzY2NwX2Nvbm5fb3V0X3N0YXRlOworCW91dGdvaW5nX2Nvbi0+ZGF0YV9jYiA9IHNjY3BfY29ubl9vdXRfZGF0YTsKKwlvdXRnb2luZ19kYXRhID0gaW5jb21pbmdfZGF0YSA9IDA7CisJaW5jb21pbmdfc3RhdGUgPSBvdXRnb2luZ19zdGF0ZSA9IDE7CisKKwkvKiBzdGFydCB0ZXN0aW5nICovCisJaWYgKHRlc3QtPndpdGhfZGF0YSkgeworCQlpZiAoc2NjcF9jb25uZWN0aW9uX2Nvbm5lY3Qob3V0Z29pbmdfY29uLCAmc2NjcF9zc25fYnNzYXAsIHRlc3RfZGF0YTEpICE9IDApCisJCQlGQUlMKCJCaW5kaW5nIGZhaWxlZFxuIik7CisJfSBlbHNlIHsKKwkJKytpbmNvbWluZ19kYXRhOworCQlpZiAoc2NjcF9jb25uZWN0aW9uX2Nvbm5lY3Qob3V0Z29pbmdfY29uLCAmc2NjcF9zc25fYnNzYXAsIE5VTEwpICE9IDApCisJCQlGQUlMKCJCaW5kaW5nIGZhaWxlZFxuIik7CisJfQorCisJaWYgKHRlc3QtPnJlZnVzZSkgeworCQlpZiAob3V0Z29pbmdfY29uKQorCQkJRkFJTCgiT3V0Z29pbmcgY29ubmVjdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHJlZnVzZWQuXG4iKTsKKwl9IGVsc2UgeworCQlpZiAoIWluY29taW5nX2NvbikKKwkJCUZBSUwoIkNyZWF0aW5nIGluY29taW5nIGRpZG4ndCB3b3JrLlxuIik7CisKKwkJcHJpbnRmKCJcdFdyaXRpbmcgdGVzdCBkYXRhMlxuIik7CisJCXNjY3BfY29ubmVjdGlvbl93cml0ZShvdXRnb2luZ19jb24sIHRlc3RfZGF0YTIpOworCQlzY2NwX2Nvbm5lY3Rpb25fc2VuZF9pdChvdXRnb2luZ19jb24pOworCisJCS8qIGNsb3NpbmcgY29ubmVjdGlvbiAqLworCQlpZiAodGVzdC0+Y2xvc2Vfc2lkZSA9PSAwKQorCQkJcmV0ID0gc2NjcF9jb25uZWN0aW9uX2Nsb3NlKG91dGdvaW5nX2NvbiwgMCk7CisJCWVsc2UKKwkJCXJldCA9IHNjY3BfY29ubmVjdGlvbl9jbG9zZShpbmNvbWluZ19jb24sIDApOworCisJCWlmIChyZXQgIT0gMCkKKwkJCUZBSUwoIkNsb3NpbmcgdGhlIGNvbm5lY3Rpb24gZmFpbGVkXG4iKTsKKwl9CisKKwkvKiBvdXRnb2luZyBzaG91bGQgYmUgZ29uZSBub3cgKi8KKwlpZiAob3V0Z29pbmdfY29uKQorCQlGQUlMKCJPdXRnb2luZyBjb25uZWN0aW9uIHdhcyBub3QgcHJvcGVybHkgY2xvc2VkXG4iKTsKKworCWlmIChpbmNvbWluZ19jb24pCisJCUZBSUwoIkluY29taW5nIGNvbm5lY3Rpb24gd2FzIG5vdCBwcm9wZXJ5IGNsb3NlZC5cbiIpOworCisJaWYgKHRlc3QtPnJlZnVzZSA9PSAwKSB7CisJCWlmIChvdXRnb2luZ19kYXRhICE9IDEgfHwgaW5jb21pbmdfZGF0YSAhPSAyKSB7CisJCQlGQUlMKCJEYXRhIHNlbmRpbmcgZmFpbGVkOiAlZC8lZCAlZC8lZFxuIiwKKwkJCSAgICAgb3V0Z29pbmdfZGF0YSwgMSwKKwkJCSAgICAgaW5jb21pbmdfZGF0YSwgMik7CisJCX0KKwl9CisKKwlpZiAoIWluY29taW5nX3N0YXRlIHx8ICFvdXRnb2luZ19zdGF0ZSkKKwkJRkFJTCgiRmFpbHVyZSB3aXRoIHRoZSBzdGF0ZSB0cmFuc2l0aW9uLiAlZCAlZFxuIiwKKwkJICAgICBvdXRnb2luZ19zdGF0ZSwgaW5jb21pbmdfc3RhdGUpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3NjY3BfY29ubmVjdGlvbih2b2lkKQoreworCXNjY3Bfc3lzdGVtX2luaXQoc2NjcF93cml0ZV9sb29wLCBOVUxMKTsKKwlzY2NwX3NldF9yZWFkKE5VTEwsIE5VTEwsIE5VTEwpOworCXNjY3BfY29ubmVjdGlvbl9zZXRfaW5jb21pbmcoJnNjY3Bfc3NuX2Jzc2FwLCBzY2NwX2Nvbm5fYWNjZXB0LCBOVUxMKTsKKworCXRlc3RfZGF0YTEgPSBtc2diX2FsbG9jKDQsICJkYXRhMSIpOworCXRlc3RfZGF0YTEtPmwzaCA9IG1zZ2JfcHV0KHRlc3RfZGF0YTEsIDQpOworCSooKHVuc2lnbmVkIGludCopdGVzdF9kYXRhMS0+bDNoKSA9IDB4MjM0MjExMjI7CisKKwl0ZXN0X2RhdGEyID0gbXNnYl9hbGxvYyg0LCAiZGF0YTIiKTsKKwl0ZXN0X2RhdGEyLT5sM2ggPSBtc2diX3B1dCh0ZXN0X2RhdGEyLCA0KTsKKwkqKCh1bnNpZ25lZCBpbnQqKXRlc3RfZGF0YTItPmwzaCkgPSAweDQyMjMyMjExOworCisJdGVzdF9kYXRhMyA9IG1zZ2JfYWxsb2MoNCwgImRhdGEzIik7CisJdGVzdF9kYXRhMy0+bDNoID0gbXNnYl9wdXQodGVzdF9kYXRhMywgNCk7CisJKigodW5zaWduZWQgaW50Kil0ZXN0X2RhdGEzLT5sM2gpID0gMHgyMzIzZmY1NTsKKworCisJZm9yIChjdXJyZW50X3Rlc3QgPSAwOyBjdXJyZW50X3Rlc3QgPCBBUlJBWV9TSVpFKGNvbm5lY3Rpb25fdGVzdHMpOyArK2N1cnJlbnRfdGVzdCkgeworCQlwcmludGYoIlRlc3RpbmcgJWQgcmVmdXNlOiAlZCB3aXRoX2RhdGE6ICVkXG4iLAorCQkJY3VycmVudF90ZXN0LCBjb25uZWN0aW9uX3Rlc3RzW2N1cnJlbnRfdGVzdF0ucmVmdXNlLAorCQkJY29ubmVjdGlvbl90ZXN0c1tjdXJyZW50X3Rlc3RdLndpdGhfZGF0YSk7CisJCWRvX3Rlc3Rfc2NjcF9jb25uZWN0aW9uKCZjb25uZWN0aW9uX3Rlc3RzW2N1cnJlbnRfdGVzdF0pOworCX0KKworCW1zZ2JfZnJlZSh0ZXN0X2RhdGExKTsKKwltc2diX2ZyZWUodGVzdF9kYXRhMik7CisJbXNnYl9mcmVlKHRlc3RfZGF0YTMpOworfQorCisvKiBpbnZhbGlkIGlucHV0ICovCitzdGF0aWMgdm9pZCB0ZXN0X3NjY3Bfc3lzdGVtX2NyYXNoKHZvaWQpCit7CisJcHJpbnRmKCJ0cnlpbmcgdG8gcHJvdm9rZSBhIGNyYXNoIHdpdGggaW52YWxpZCBpbnB1dFxuIik7CisJc2NjcF9zZXRfcmVhZCgmc2NjcF9zc25fYnNzYXAsIHNjY3BfcmVhZF9jYiwgTlVMTCk7CisJc2NjcF9jb25uZWN0aW9uX3NldF9pbmNvbWluZygmc2NjcF9zc25fYnNzYXAsIHNjY3BfYWNjZXB0X2NiLCBOVUxMKTsKKworCWZvciAoY3VycmVudF90ZXN0ID0gMDsgY3VycmVudF90ZXN0IDwgQVJSQVlfU0laRSh0ZXN0X2RhdGEpOyArK2N1cnJlbnRfdGVzdCkgeworCQlpbnQgb3JpZ2luYWxfbGVuZ3RoID0gdGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0ubGVuZ3RoOworCQlpbnQgbGVuZ3RoID0gb3JpZ2luYWxfbGVuZ3RoICsgMjsKKwkJaW50IGk7CisKKwkJcHJpbnRmKCJUZXN0aW5nIHBhY2tldDogJWRcbiIsIGN1cnJlbnRfdGVzdCk7CisKKwkJZm9yIChpID0gbGVuZ3RoOyBpID49IDA7IC0taSkgeworCQkJdW5zaWduZWQgaW50IGxlbmd0aCA9IE1JTih0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5sZW5ndGgsIGkpOworCQkJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2NfaGVhZHJvb20obGVuZ3RoICsgMiwgMiwgX19mdW5jX18pOworCQkJbXNnLT5sMmggPSBtc2diX3B1dChtc2csIGxlbmd0aCk7CisJCQltZW1jcHkobXNnLT5sMmgsIHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLmRhdGEsIGxlbmd0aCk7CisJCQlzY2NwX3N5c3RlbV9pbmNvbWluZyhtc2cpOworCQkJbXNnYl9mcmVlKG1zZyk7CisJCX0KKwl9CisKKwlwcmludGYoInN1cnZpdmVkXG4iKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9zY2NwX3BhcnNpbmcodm9pZCkKK3sKKwlmb3IgKGN1cnJlbnRfdGVzdCA9IDA7IGN1cnJlbnRfdGVzdCA8IEFSUkFZX1NJWkUocGFyc2VfcmVzdWx0KTsgKytjdXJyZW50X3Rlc3QpIHsKKwkJc3RydWN0IG1zZ2IgKm1zZzsKKwkJc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0IHJlc3VsdDsKKworCQltc2cgPSBtc2diX2FsbG9jX2hlYWRyb29tKDEwMjQsIDEyOCwgInBhcnNlLXRlc3QiKTsKKwkJbXNnYl9wdXQobXNnLCAxKTsKKwkJbXNnLT5sMmggPSBtc2diX3B1dChtc2csIHBhcnNlX3Jlc3VsdFtjdXJyZW50X3Rlc3RdLmlucHV0X2xlbik7CisJCW1lbWNweShtc2ctPmwyaCwgcGFyc2VfcmVzdWx0W2N1cnJlbnRfdGVzdF0uaW5wdXQsIG1zZ2JfbDJsZW4obXNnKSk7CisKKwkJbWVtc2V0KCZyZXN1bHQsIDAsIHNpemVvZihyZXN1bHQpKTsKKwkJaWYgKHNjY3BfcGFyc2VfaGVhZGVyKG1zZywgJnJlc3VsdCkgIT0gMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gc2NjcCBwYXJzZSB0ZXN0OiAlZFxuIiwgY3VycmVudF90ZXN0KTsKKwkJfSBlbHNlIHsKKwkJCWlmIChwYXJzZV9yZXN1bHRbY3VycmVudF90ZXN0XS53YW50ZWRfbGVuICE9IHJlc3VsdC5kYXRhX2xlbikgeworCQkJCWZwcmludGYoc3RkZXJyLCAiVW5leHBlY3RlZCBkYXRhIGxlbmd0aC5cbiIpOworCQkJCWFib3J0KCk7CisJCQl9CisKKwkJCWlmIChwYXJzZV9yZXN1bHRbY3VycmVudF90ZXN0XS5oYXNfc3JjX3JlZikgeworCQkJCWlmIChtZW1jbXAocmVzdWx0LnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJCQkJCSAgICZwYXJzZV9yZXN1bHRbY3VycmVudF90ZXN0XS5zcmNfcmVmLAorCQkJCQkgICBzaXplb2Yoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSkpICE9IDApIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJTUkMgUkVGIGRpZCBub3QgbWF0Y2hcbiIpOworCQkJCQlhYm9ydCgpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHBhcnNlX3Jlc3VsdFtjdXJyZW50X3Rlc3RdLmhhc19kc3RfcmVmKSB7CisJCQkJaWYgKG1lbWNtcChyZXN1bHQuZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCQkJCQkgICAmcGFyc2VfcmVzdWx0W2N1cnJlbnRfdGVzdF0uZHN0X3JlZiwKKwkJCQkJICAgc2l6ZW9mKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UpKSAhPSAwKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLCAiRFNUIFJFRiBkaWQgbm90IG1hdGNoXG4iKTsKKwkJCQkJYWJvcnQoKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChwYXJzZV9yZXN1bHRbY3VycmVudF90ZXN0XS5zcmNfc3NuICE9IC0xKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJOb3QgaW1wbGVtZW50ZWQuXG4iKTsKKwkJCQlhYm9ydCgpOworCQkJfQorCisJCQlpZiAocGFyc2VfcmVzdWx0W2N1cnJlbnRfdGVzdF0uZHN0X3NzbiAhPSAtMSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiTm90IGltcGxlbWVudGVkLlxuIik7CisJCQkJYWJvcnQoKTsKKwkJCX0KKwkJfQorCisJCW1zZ2JfZnJlZShtc2cpOworCX0KK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJdGVzdF9zY2NwX3N5c3RlbSgpOworCXRlc3Rfc2NjcF9zZW5kX3VkdCgpOworCXRlc3Rfc2NjcF91ZHRfY29tbXVuaWNhdGlvbigpOworCXRlc3Rfc2NjcF9jb25uZWN0aW9uKCk7CisJdGVzdF9zY2NwX3N5c3RlbV9jcmFzaCgpOworCXRlc3Rfc2NjcF9wYXJzaW5nKCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZGJfc3RvcmVfY291bnRlcigpIHt9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL3Ntcy50eHQgYi9vcGVuYnNjL3Rlc3RzL3Ntcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZjODg1YgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvc21zLnR4dApAQCAtMCwwICsxLDUwIEBACiswMyAwMiAwMSAwYSAwMiA0MyAwYiAwMCAxZCAzOSAwMSAxYSAwMCAwMSAwMCAwNyA5MSA1NSAxMSAxOCAzMSAyOCAwMCAwZSAzMSAyMCAwNCA4MSAyMSA0MyAwMCAwMCBmZiAwNCBkNCBmMiA5YyAwZQorCiswMyAwMiAwMSAwYSAwMiA0MyAwYiAwMCAxZCAtCiszOSAtIFRyYW5zYWN0aW9uSUQgMywgU01TIG1lc3NhZ2VzCTo6IGdoLT5wcm90b19kaXNjcgorMDEgLSBDUC1EQVRBCQkJCTo6IGdoLT5tc2dfdHlwZQorMWEgLSBMZW5ndGg6IDI2CQkJCTo6IGdoLT5kYXRhWzBdCiswMCAtIE1USSAwIFJQLURBVEEgKG1zLT5uKQorMDEgLSBNUiAxCiswMCAtIFJQLU9BCiswNyAtIFJQLURBIChTTVNDIExlbmd0aCkKKzkxIC0gSW50ZXJuYXRpb25hbCBObywgTnVtYmVyaW5nIFBsYW4KKzU1IDExIDE4IDMxIDI4IDAwIC0gNTUxMTgxMTM4MjAwCiswZSAtIFJQLVVEIGxlbiAoMTQpCisKK1RQRFUgKDE0IGJ5dGUpOgorMzEgLSBNVEkoMDEpLCBWUEYoMjpyZWxhdGl2ZSksIE1NUygwKSwgU1JJKDEpLCBVREhJKDApLCBSUCgwKQorMjAgLSBNZXNzYWdlIFJlZmVyZW5jZQorMDQgLSBEQSBsZW5ndGgKKzgxIC0gTnVtYmVyaW5nIFBsYW4sIE5hdGlvbmFsIG51bWJlcgorMjEgNDMgLSBEQSAxMjM0CiswMCAtIFBJRAorMDAgLSBEQ1MKK2ZmIC0gVmFsaWRpdHkgcGVyaW9kCiswNCAtIFVzZXIgRGF0YSBsZW5ndGggKDA0KQorZDQgZjIgOWMgMGUgLSBnc21fZGVmYXVsdCA3Yml0IGVuY29kZWQgIlRlc3QiICg0IGJ5dGUpCisKKzAzIDAyIDAxIDBhIDAyIDQzIDBiIDAwIDlmIDA5IDAxIDljIDAwIGRhIDAwIDA3IDkxIDg4IDk2IDEzIDAwIDAwIDk5IDkwIDExIDdiIDA0IDgxIDIyIDIyIDAwIDA4IGZmIDg2IDZjIDM4IDhjIDUwIDkyIDgwIDg4IDRjIDAwIDRkIDAwIDRkIDAwIDQxIDZhIDE5IDY3IDAzIDc0IDA2IDhjIGExIDdkIGIyIDAwIDIwIDAwIDIwIDUxIDY4IDc0IDAzIDk5IDk2IDUyIDc1IDdkIGIyIDhkIGVmIDZhIDE5IDY3IDAzIGZmIDBjIDZhIDE5IDY3IDAzIDk2IGY2IDk4IGE4IDk2IGFhIGZmIDAxIDhiIDkzIDYwIGE4IDgwIDcwIDY2IDBlIDUxIDMyIDg0IGM0IGZmIDBjIDk3IDQ4IDZkIDNiIDYyIDk1IDhjIGM3IGZmIDAxIDczIGZlIDU3IDI4IDUyIGEwIDUxIDY1IDkwIDAxIDk2IDUwIDkxIGNmIDU5IDI3IDgwIDZmIDc2IGRmIDZkIDBiIDU3IGZhIDk2IDhhIDkxIDc3IDVlIDYzIDUzIDYxIGZmIDBjIDhhIGNiIDRlIDBhIDdkIGIyIDY0IDFjIDVjIDBiIDMwIDBjIDZhIDE5IDY3IDAzIDMwIDBkCisKKzAzIDAyIDAxIDBhIDAyIDQzIDBiIDAwIDlmIC0gbG93ZXIgbGV2ZWxzCiswOSAtIFRyYW5zYWN0aW9uSUQgMCwgU01TIG1lc3NhZ2VzCiswMSAtIENQLURBVEEKKzljIC0gTGVuZ3RoOiAoMTU2KQorMDAgLSBNVEkgMCBSUC1EQVRBIChtcy0+bikKK2RhIC0gTVIgKD8pCiswMCAtIFJQLU9BCiswNyAtIFJQLURBIChTTVNDIExlbmd0aCkKKzkxIC0gSW50ZXJuYXRpb25hbCBOby4KKzg4IDk2IDEzIDAwIDAwIDk5Cis5MCAtIFJQLVVEIGxlbiAoMTQ0KQorMTEgLQorN2IgLSBNZXNzYWdlIFJlZmVyZW5jZQorMDQgLSBEQSBsZW5ndGgKKzgxIC0gTnVtYmVyaW5nIFBsYW4KKzIyIDIyIC0gQWRkcmVzcyAyMjIyCiswMCAtIFBJRAorMDggLSBEQ1MgKFVDUzIgY2hhcnNldCkKK2ZmIC0gVmFsaWRpdHkgcGVyaW9kCis4NiAtIFVzZXIgRGF0YSBsZW5ndGggKDEzNCkKKzZjIDM4IDhjIDUwIDkyIDgwIDg4IDRjIDAwIDRkIDAwIDRkIDAwIDQxIDZhIDE5IDY3IDAzIDc0IDA2IDhjIGExIDdkIGIyIDAwIDIwIDAwIDIwIDUxIDY4IDc0IDAzIDk5IDk2IDUyIDc1IDdkIGIyIDhkIGVmIDZhIDE5IDY3IDAzIGZmIDBjIDZhIDE5IDY3IDAzIDk2IGY2IDk4IGE4IDk2IGFhIGZmIDAxIDhiIDkzIDYwIGE4IDgwIDcwIDY2IDBlIDUxIDMyIDg0IGM0IGZmIDBjIDk3IDQ4IDZkIDNiIDYyIDk1IDhjIGM3IGZmIDAxIDczIGZlIDU3IDI4IDUyIGEwIDUxIDY1IDkwIDAxIDk2IDUwIDkxIGNmIDU5IDI3IDgwIDZmIDc2IGRmIDZkIDBiIDU3IGZhIDk2IDhhIDkxIDc3IDVlIDYzIDUzIDYxIGZmIDBjIDhhIGNiIDRlIDBhIDdkIGIyIDY0IDFjIDVjIDBiIDMwIDBjIDZhIDE5IDY3IDAzIDMwIDBkCisKZGlmZiAtLWdpdCBhL29wZW5ic2MvdG9vbHMvaGxyc3RhdC5wbCBiL29wZW5ic2MvdG9vbHMvaGxyc3RhdC5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NjhmYzlhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90b29scy9obHJzdGF0LnBsCkBAIC0wLDAgKzEsNzMgQEAKKyMhL3Vzci9iaW4vcGVybAorCit1c2Ugc3RyaWN0OwordXNlIERCSTsKK215ICRkYmggPSBEQkktPmNvbm5lY3QoImRiaTpTUUxpdGU6ZGJuYW1lPWhsci5zcWxpdGUzIiwiIiwiIik7CisKKworbXkgJW1jY19uYW1lczsKK215ICVtY2NfbW5jX25hbWVzOworCitzdWIgZ2V0X21jY19tbmNfbmFtZSgkKQoreworCW15ICRtY2NfbW5jID0gc2hpZnQ7CisJbXkgJHJldCA9ICRtY2NfbW5jOworCisJaWYgKCRtY2NfbW5jX25hbWVzeyRtY2NfbW5jfSBuZSAnJykgeworCQkkcmV0ID0gJG1jY19tbmNfbmFtZXN7JG1jY19tbmN9OworCX0KKworCXJldHVybiAkcmV0OworfQorCitzdWIgcmVhZF9uZXR3b3JrcygkKQoreworCW15ICRmaWxlbmFtZSA9IHNoaWZ0OworCW15ICRjdXJfbmFtZTsKKworCW9wZW4oSU5GSUxFLCAkZmlsZW5hbWUpOworCXdoaWxlIChteSAkbCA9IDxJTkZJTEU+KSB7CisJCWNob21wKCRsKTsKKwkJaWYgKCRsID1+IC9eIy8pIHsKKwkJCW5leHQ7CisJCX0KKwkJaWYgKCRsID1+IC9eXHQvKSB7CisJCQlteSAoJG1jYywgJG1uYywgJGJyYW5kLCAkcikgPSBzcGxpdCgnICcsICRsLCA0KTsKKwkJCSNwcmludGYoIiVzfCVzfCVzXG4iLCAkbWNjLCAkbW5jLCAkYnJhbmQpOworCQkJJG1jY19tbmNfbmFtZXN7IiRtY2MtJG1uYyJ9ID0gJGJyYW5kOworCQkJJG1jY19uYW1lc3skbWNjfSA9ICRjdXJfbmFtZTsKKwkJfSBlbHNpZiAoJGwgPX4gL14oXHdcdylcdCguKikvKSB7CisJCQkjcHJpbnRmKCIlc3wlc1xuIiwgJDEsICQyKTsKKwkJCSRjdXJfbmFtZSA9ICQyOworCQl9CisJfQorCWNsb3NlKElORklMRSk7Cit9CisKK3JlYWRfbmV0d29ya3MoIm5ldHdvcmtzLnRhYiIpOworCitteSAlb3Blcl9jb3VudDsKK215ICVjb3VudHJ5X2NvdW50OworCisjbXkgJHN0aCA9ICRkYmgtPnByZXBhcmUoIlNFTEVDVCBpbXNpIEZST00gc3Vic2NyaWJlciB3aGVyZSBhdXRob3JpemVkPTEiKTsKK215ICRzdGggPSAkZGJoLT5wcmVwYXJlKCJTRUxFQ1QgaW1zaSBGUk9NIHN1YnNjcmliZXIiKTsKKworJHN0aC0+ZXhlY3V0ZSgpOworCit3aGlsZSAobXkgJGhyZWYgPSAkc3RoLT5mZXRjaHJvd19oYXNocmVmKSB7CisJbXkgKCRtY2MsICRtbmMpID0gJCRocmVme2ltc2l9ID1+IC8oXGR7M30pKFxkezJ9KS4qLzsKKwkjcHJpbnRmKCIlcyAlcy0lcyBcbiIsICQkaHJlZntpbXNpfSwgJG1jYywgJG1uYyk7CisJJG9wZXJfY291bnR7IiRtY2MtJG1uYyJ9Kys7CisJJGNvdW50cnlfY291bnR7JG1jY30rKzsKK30KKworCitmb3JlYWNoIG15ICRjIChzb3J0eyRjb3VudHJ5X2NvdW50eyRifSA8PT4gJGNvdW50cnlfY291bnR7JGF9fSBrZXlzICVjb3VudHJ5X2NvdW50KSB7CisJcHJpbnRmKCIlczogJWRcbiIsICRtY2NfbmFtZXN7JGN9LCAkY291bnRyeV9jb3VudHskY30pOworCisJZm9yZWFjaCBteSAkayAoc29ydHskb3Blcl9jb3VudHskYn0gPD0+ICRvcGVyX2NvdW50eyRhfX0ga2V5cyAlb3Blcl9jb3VudCkgeworCQlpZiAoJGsgPX4gL14kYy0vKSB7CisJCQlwcmludGYoIlx0JXM6ICVkXG4iLCBnZXRfbWNjX21uY19uYW1lKCRrKSwgJG9wZXJfY291bnR7JGt9KTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzLy5naXRpZ25vcmUgYi9ycmxwLWVwaGVtZXJpcy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YjQ1ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNCBAQAorYXNuMV9nZW4vKgorKi5vCisqLmEKK3JybHAtdGVzdApkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvQ09QWUlORyBiL3JybHAtZXBoZW1lcmlzL0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ3MDg4ZQotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL0NPUFlJTkcKQEAgLTAsMCArMSwyIEBACitTZWUgdGhlIGluY2x1ZGVkIGdwbC0yLjAudHh0IG9yIGdwbC0zLjAudHh0IGRlcGVuZGluZyBvbiB5b3VyCitwcmVmZXJlbmNlcy4KZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL01ha2VmaWxlIGIvcnJscC1lcGhlbWVyaXMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQyY2FjNwotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL01ha2VmaWxlCkBAIC0wLDAgKzEsNDQgQEAKKworQVNOMUM9Li4vLi4vLi4vdG1wL3JybHAvYXNuMWMvYXNuMWMvYXNuMWMKK0FTTjFfSU5DTFVERT0vaG9tZS90bnQvdG1wL3JybHAvYXNuMWMvc2tlbGV0b25zCitDQz1nY2MKK0NGTEFHUz0tSSQoQVNOMV9JTkNMVURFKSAtSWFzbjFfZ2VuIC1PMyAtV2FsbAorCitBU04xX0ZJTEVTPSQod2lsZGNhcmQgYXNuMS8qLmFzbikKKworCithbGw6IHJybHAtdGVzdAorCisKK3JybHAtdGVzdDogbGliZ3NtLWFzbjEuYSBncHMubyB1YngubyB1YngtcGFyc2UubyBycmxwLm8gbWFpbi5vCisJJChDQykgLW8gJEAgZ3BzLm8gdWJ4Lm8gdWJ4LXBhcnNlLm8gcnJscC5vIG1haW4ubyAtTC4gLWxnc20tYXNuMSAtbG0KKworCisjCisjIEFTTjEgZmlsZSBhdXRvZ2VuZXJhdGlvbiAobmVlZCByZWN1cnNpdmUgbWFrZWZpbGUgY2FsbCkKKyMKKworQVNOMV9TT1VSQ0VTID0gJCh3aWxkY2FyZCBhc24xX2dlbi8qLmMpCitBU04xX09CSkVDVFMgPSAkKEFTTjFfU09VUkNFUzouYz0ubykKKworbGliZ3NtLWFzbjEuYTogJChBU04xX0ZJTEVTKQorCW1rZGlyIC1wIGFzbjFfZ2VuICYmIFwKKwljZCBhc24xX2dlbiAmJiBcCisJJChBU04xQykgLWZza2VsZXRvbnMtY29weSAtZm5hdGl2ZS10eXBlcyAtZ2VuLVBFUiAkKGFkZHByZWZpeCAuLi8sJF4pCisJQHJtIGFzbjFfZ2VuL2NvbnZlcnRlci1zYW1wbGUuYyBhc24xX2dlbi9NYWtlZmlsZS5hbS5zYW1wbGUKKwlAJChNQUtFKSBsaWJnc20tYXNuMS5hLnN1Ym1ha2UKKworbGliZ3NtLWFzbjEuYS5zdWJtYWtlOiAkKEFTTjFfT0JKRUNUUykKKwkkKEFSKSByY3MgbGliZ3NtLWFzbjEuYSAkXgorCisuUEhPTlk6IGxpYmdzbS1hc24xLmEuc3VibWFrZQorCisKKyMKKyMgQ2xlYW4KKyMKKworY2xlYW46CisJcm0gLVJmIGFzbjFfZ2VuCisJcm0gLWYgbGliZ3NtLWFzbjEuYSAqLm8gcnJscC10ZXN0CisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUJTLUNvZGUuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtQlMtQ29kZS5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQyNTM2NgotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUJTLUNvZGUuYXNuCkBAIC0wLDAgKzEsMTMxIEBACistLSAkSWQ6IE1BUC1CUy1Db2RlLmFzbiAyODE0OSAyMDA5LTA0LTI1IDE3OjQ1OjM0WiBldHhyYWIgJAorLS0gM0dQUCBUUyAyOS4wMDIgVjguOS4wICgyMDA5LTA0KSAKKy0tIDE3LjcuMTAJQmVhcmVyIFNlcnZpY2UgQ29kZXMKKyAKK01BUC1CUy1Db2RlIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUJTLUNvZGUgKDIwKSB2ZXJzaW9uMTEgKDExKX0KKworREVGSU5JVElPTlMKKworOjo9CisKK0JFR0lOCisKK0JlYXJlclNlcnZpY2VDb2RlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgY29kZSBpZGVudGlmeWluZyBhIHNpbmdsZQorCS0tIGJlYXJlciBzZXJ2aWNlLCBhIGdyb3VwIG9mIGJlYXJlciBzZXJ2aWNlcywgb3IgYWxsIGJlYXJlcgorCS0tIHNlcnZpY2VzLiBUaGUgc2VydmljZXMgYXJlIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMi4wMDIgWzNdLgorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCS0tCisJLS0gcGxtbi1zcGVjaWZpYyBiZWFyZXIgc2VydmljZXM6CisJLS0gYml0cyA4NzY1NDMyMTogZGVmaW5lZCBieSB0aGUgSFBMTU4gb3BlcmF0b3IKKworCS0tIHJlc3Qgb2YgYmVhcmVyIHNlcnZpY2VzOgorCS0tIGJpdCA4OiAwICh1bnVzZWQpCisJLS0gYml0cyA3NjU0MzIxOiBncm91cCAoYml0cyA3NjU0KSwgYW5kIHJhdGUsIGlmIGFwcGxpY2FibGUKKwktLSAoYml0cyAzMjEpCisKK0V4dC1CZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi41KSkKKwktLSBUaGlzIHR5cGUgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIGNvZGUgaWRlbnRpZnlpbmcgYSBzaW5nbGUKKwktLSBiZWFyZXIgc2VydmljZSwgYSBncm91cCBvZiBiZWFyZXIgc2VydmljZXMsIG9yIGFsbCBiZWFyZXIKKwktLSBzZXJ2aWNlcy4gVGhlIHNlcnZpY2VzIGFyZSBkZWZpbmVkIGluIFRTIDNHUFAgVFMgMjIuMDAyIFszXS4KKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKwktLQorCS0tIE9DVEVUIDE6CisJLS0gcGxtbi1zcGVjaWZpYyBiZWFyZXIgc2VydmljZXM6CisJLS0gYml0cyA4NzY1NDMyMTogZGVmaW5lZCBieSB0aGUgSFBMTU4gb3BlcmF0b3IKKwktLQorCS0tIHJlc3Qgb2YgYmVhcmVyIHNlcnZpY2VzOgorCS0tIGJpdCA4OiAwICh1bnVzZWQpCisJLS0gYml0cyA3NjU0MzIxOiBncm91cCAoYml0cyA3NjU0KSwgYW5kIHJhdGUsIGlmIGFwcGxpY2FibGUKKwktLSAoYml0cyAzMjEpCisKKwktLSBPQ1RFVFMgMi01OiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gSWYgcmVjZWl2ZWQgdGhlCisgICAgLS0gRXh0LVRlbGVzZXJ2aWNlQ29kZSBzaGFsbCBiZQorCS0tIHRyZWF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBleGNlcHRpb24gaGFuZGxpbmcgZGVmaW5lZCBmb3IgdGhlCisJLS0gb3BlcmF0aW9uIHRoYXQgdXNlcyB0aGlzIHR5cGUuIAorCisKKwktLSBFeHQtQmVhcmVyU2VydmljZUNvZGUgaW5jbHVkZXMgYWxsIHZhbHVlcyBkZWZpbmVkIGZvciBCZWFyZXJTZXJ2aWNlQ29kZS4KKworYWxsQmVhcmVyU2VydmljZXMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAwMDAwMCdCCisKK2FsbERhdGFDREEtU2VydmljZXMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDAwMCdCCitkYXRhQ0RBLTMwMGJwcwkJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDAwMSdCCitkYXRhQ0RBLTEyMDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDAxMCdCCitkYXRhQ0RBLTEyMDAtNzVicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDAxMSdCCitkYXRhQ0RBLTI0MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDEwMCdCCitkYXRhQ0RBLTQ4MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDEwMSdCCitkYXRhQ0RBLTk2MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDExMCdCCitnZW5lcmFsLWRhdGFDREEJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDExMSdCCisKK2FsbERhdGFDRFMtU2VydmljZXMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMTAwMCdCCitkYXRhQ0RTLTEyMDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMTAxMCdCCitkYXRhQ0RTLTI0MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMTEwMCdCCitkYXRhQ0RTLTQ4MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMTEwMSdCCitkYXRhQ0RTLTk2MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMTExMCdCCitnZW5lcmFsLWRhdGFDRFMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMTExMSdCCisKK2FsbFBhZEFjY2Vzc0NBLVNlcnZpY2VzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDAwMDAnQgorcGFkQWNjZXNzQ0EtMzAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDAwMDEnQgorcGFkQWNjZXNzQ0EtMTIwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMTAwMDEwJ0IKK3BhZEFjY2Vzc0NBLTEyMDAtNzVicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMDAxMSdCCitwYWRBY2Nlc3NDQS0yNDAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDAxMDAnQgorcGFkQWNjZXNzQ0EtNDgwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMTAwMTAxJ0IKK3BhZEFjY2Vzc0NBLTk2MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMDExMCdCCitnZW5lcmFsLXBhZEFjY2Vzc0NBCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDAxMTEnQgorCithbGxEYXRhUERTLVNlcnZpY2VzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDEwMDAnQgorZGF0YVBEUy0yNDAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDExMDAnQgorZGF0YVBEUy00ODAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDExMDEnQgorZGF0YVBEUy05NjAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDExMTAnQgorZ2VuZXJhbC1kYXRhUERTCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDExMTEnQgorCithbGxBbHRlcm5hdGVTcGVlY2gtRGF0YUNEQQlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMTEwMDAwJ0IKKworYWxsQWx0ZXJuYXRlU3BlZWNoLURhdGFDRFMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDExMTAwMCdCCisKK2FsbFNwZWVjaEZvbGxvd2VkQnlEYXRhQ0RBCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDEwMDAwMDAnQgorCithbGxTcGVlY2hGb2xsb3dlZEJ5RGF0YUNEUwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAxMDAxMDAwJ0IKKworLS0gVGhlIGZvbGxvd2luZyBub24taGllcmFyY2hpY2FsIENvbXBvdW5kIEJlYXJlciBTZXJ2aWNlCistLSBHcm91cHMgYXJlIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMi4wMzA6CithbGxEYXRhQ2lyY3VpdEFzeW5jaHJvbm91cwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAxMDEwMDAwJ0IKKwktLSBjb3ZlcnMgImFsbERhdGFDREEtU2VydmljZXMiLCAiYWxsQWx0ZXJuYXRlU3BlZWNoLURhdGFDREEiIGFuZAorCS0tICJhbGxTcGVlY2hGb2xsb3dlZEJ5RGF0YUNEQSIKK2FsbEFzeW5jaHJvbm91c1NlcnZpY2VzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDExMDAwMDAnQgorCS0tIGNvdmVycyAiYWxsRGF0YUNEQS1TZXJ2aWNlcyIsICJhbGxBbHRlcm5hdGVTcGVlY2gtRGF0YUNEQSIsCisJLS0gImFsbFNwZWVjaEZvbGxvd2VkQnlEYXRhQ0RBIiBhbmQgImFsbFBhZEFjY2Vzc0NEQS1TZXJ2aWNlcyIKK2FsbERhdGFDaXJjdWl0U3luY2hyb25vdXMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMTAxMTAwMCdCCisJLS0gY292ZXJzICJhbGxEYXRhQ0RTLVNlcnZpY2VzIiwgImFsbEFsdGVybmF0ZVNwZWVjaC1EYXRhQ0RTIiBhbmQKKwktLSAiYWxsU3BlZWNoRm9sbG93ZWRCeURhdGFDRFMiCithbGxTeW5jaHJvbm91c1NlcnZpY2VzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDExMDEwMDAnQgorCS0tIGNvdmVycyAiYWxsRGF0YUNEUy1TZXJ2aWNlcyIsICJhbGxBbHRlcm5hdGVTcGVlY2gtRGF0YUNEUyIsCisJLS0gImFsbFNwZWVjaEZvbGxvd2VkQnlEYXRhQ0RTIiBhbmQgImFsbERhdGFQRFMtU2VydmljZXMiCistLQorLS0gQ29tcG91bmQgQmVhcmVyIFNlcnZpY2UgR3JvdXAgQ29kZXMgYXJlIG9ubHkgdXNlZCBpbiBjYWxsCistLSBpbmRlcGVuZGVudCBzdXBwbGVtZW50YXJ5IHNlcnZpY2Ugb3BlcmF0aW9ucywgaS5lLiB0aGV5CistLSBhcmUgbm90IHVzZWQgaW4gSW5zZXJ0U3Vic2NyaWJlckRhdGEgb3IgaW4KKy0tIERlbGV0ZVN1YnNjcmliZXJEYXRhIG1lc3NhZ2VzLgorCithbGxQTE1OLXNwZWNpZmljQlMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMDAwMCdCCitwbG1uLXNwZWNpZmljQlMtMQlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMDAxJ0IKK3BsbW4tc3BlY2lmaWNCUy0yCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTAwMTAnQgorcGxtbi1zcGVjaWZpY0JTLTMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMDAxMSdCCitwbG1uLXNwZWNpZmljQlMtNAlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMTAwJ0IKK3BsbW4tc3BlY2lmaWNCUy01CUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTAxMDEnQgorcGxtbi1zcGVjaWZpY0JTLTYJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMDExMCdCCitwbG1uLXNwZWNpZmljQlMtNwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMTExJ0IKK3BsbW4tc3BlY2lmaWNCUy04CUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTEwMDAnQgorcGxtbi1zcGVjaWZpY0JTLTkJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMTAwMSdCCitwbG1uLXNwZWNpZmljQlMtQQlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDExMDEwJ0IKK3BsbW4tc3BlY2lmaWNCUy1CCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTEwMTEnQgorcGxtbi1zcGVjaWZpY0JTLUMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMTEwMCdCCitwbG1uLXNwZWNpZmljQlMtRAlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDExMTAxJ0IKK3BsbW4tc3BlY2lmaWNCUy1FCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTExMTAnQgorcGxtbi1zcGVjaWZpY0JTLUYJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMTExMSdCCisKK0VORAorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1Db21tb25EYXRhVHlwZXMuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtQ29tbW9uRGF0YVR5cGVzLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2QyMDJlCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtQ29tbW9uRGF0YVR5cGVzLmFzbgpAQCAtMCwwICsxLDYzMyBAQAorLS0gJElkOiBNQVAtQ29tbW9uRGF0YVR5cGVzLmFzbiAzMDQ3MCAyMDA5LTEwLTEwIDEyOjM3OjU2WiBrcmogJAorLS0gM0dQUCBUUyAyOS4wMDIgVjguOS4wICgyMDA5LTA0KQorLS0gMTcuNy44CUNvbW1vbiBkYXRhIHR5cGVzCisKK01BUC1Db21tb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtQ29tbW9uRGF0YVR5cGVzICgxOCkgdmVyc2lvbjExICgxMSl9CisKK0RFRklOSVRJT05TCisKK0lNUExJQ0lUIFRBR1MKKworOjo9CisKK0JFR0lOCisKK0VYUE9SVFMKKworCS0tIGdlbmVyYWwgZGF0YSB0eXBlcyBhbmQgdmFsdWVzCisJQWRkcmVzc1N0cmluZywKKwlJU0ROLUFkZHJlc3NTdHJpbmcsCisJbWF4SVNETi1BZGRyZXNzTGVuZ3RoLAorCUZUTi1BZGRyZXNzU3RyaW5nLAorCUlTRE4tU3ViYWRkcmVzc1N0cmluZywKKwlFeHRlcm5hbFNpZ25hbEluZm8sIAorCUV4dC1FeHRlcm5hbFNpZ25hbEluZm8sIAorQWNjZXNzTmV0d29ya1NpZ25hbEluZm8sCisJU2lnbmFsSW5mbywKKwltYXhTaWduYWxJbmZvTGVuZ3RoLAorCUFsZXJ0aW5nUGF0dGVybiwKKwlUQkNELVNUUklORywKKworCS0tIGRhdGEgdHlwZXMgZm9yIG51bWJlcmluZyBhbmQgaWRlbnRpZmljYXRpb24KKwlJTVNJLAorCVRNU0ksIAorCUlkZW50aXR5LAorCVN1YnNjcmliZXJJZCwKKwlJTUVJLAorCUhMUi1MaXN0LAorCUxNU0ksCisJR2xvYmFsQ2VsbElkLAorCU5ldHdvcmtSZXNvdXJjZSwKKwlBZGRpdGlvbmFsTmV0d29ya1Jlc291cmNlLAorCU5BRUEtUHJlZmVycmVkQ0ksIAorCU5BRUEtQ0lDLCAKKwlBU0NJLUNhbGxSZWZlcmVuY2UsCisJU3Vic2NyaWJlcklkZW50aXR5LAorCVBMTU4tSWQsCisKKwktLSBkYXRhIHR5cGVzIGZvciBDQU1FTAorCUNlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJLCAKKwlDZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRGaXhlZExlbmd0aCwKKwlMQUlGaXhlZExlbmd0aCwKKworCS0tIGRhdGEgdHlwZXMgZm9yIHN1YnNjcmliZXIgbWFuYWdlbWVudAorCUJhc2ljU2VydmljZUNvZGUsCisJRXh0LUJhc2ljU2VydmljZUNvZGUsCisJRU1MUFAtSW5mbywKKwlFTUxQUC1Qcmlvcml0eSwgCisJTUMtU1MtSW5mbywKKwlNYXhNQy1CZWFyZXJzLAorCU1DLUJlYXJlcnMsCisJRXh0LVNTLVN0YXR1cywKKworCS0tIGRhdGEgdHlwZXMgZm9yIGdlb2dyYXBoaWMgbG9jYXRpb24KKwlBZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24sCisJTENTQ2xpZW50RXh0ZXJuYWxJRCwKKwlMQ1NDbGllbnRJbnRlcm5hbElELAorCUxDU1NlcnZpY2VUeXBlSUQsCistLS0gV1MgYWRkZWQgZXhwb3J0cyBuZWVkZWQgYnkgZ3NtX21hcC5hc24gKGV4dHJhIGFzbjEgZmlsZSB0byBoYW5kbGUgb2xkZXIgcHJvdC4gdmVyLikKKwlQcm90b2NvbElkLAorCUxDU1NlcnZpY2VUeXBlSUQJCis7CisKK0lNUE9SVFMKKwlUZWxlc2VydmljZUNvZGUsCisJRXh0LVRlbGVzZXJ2aWNlQ29kZQorRlJPTSBNQVAtVFMtQ29kZSB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1UUy1Db2RlICgxOSkgdmVyc2lvbjExICgxMSl9CisKKwlCZWFyZXJTZXJ2aWNlQ29kZSwKKwlFeHQtQmVhcmVyU2VydmljZUNvZGUKK0ZST00gTUFQLUJTLUNvZGUgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtQlMtQ29kZSAoMjApIHZlcnNpb24xMSAoMTEpfQorCisJU1MtQ29kZQorRlJPTSBNQVAtU1MtQ29kZSB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1TUy1Db2RlICgxNSkgdmVyc2lvbjExICgxMSl9CisKKwlFeHRlbnNpb25Db250YWluZXIKK0ZST00gTUFQLUV4dGVuc2lvbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KKzsKKworCistLSBnZW5lcmFsIGRhdGEgdHlwZXMKKworVEJDRC1TVFJJTkcgOjo9IE9DVEVUIFNUUklORworCS0tIFRoaXMgdHlwZSAoVGVsZXBob255IEJpbmFyeSBDb2RlZCBEZWNpbWFsIFN0cmluZykgaXMgdXNlZCB0bworCS0tIHJlcHJlc2VudCBzZXZlcmFsIGRpZ2l0cyBmcm9tIDAgdGhyb3VnaCA5LCAqLCAjLCBhLCBiLCBjLCB0d28KKwktLSBkaWdpdHMgcGVyIG9jdGV0LCBlYWNoIGRpZ2l0IGVuY29kZWQgMDAwMCB0byAxMDAxICgwIHRvIDkpLAorCS0tIDEwMTAgKCopLCAxMDExICgjKSwgMTEwMCAoYSksIDExMDEgKGIpIG9yIDExMTAgKGMpOyAxMTExIHVzZWQKKwktLSBhcyBmaWxsZXIgd2hlbiB0aGVyZSBpcyBhbiBvZGQgbnVtYmVyIG9mIGRpZ2l0cy4KKworCS0tIGJpdHMgODc2NSBvZiBvY3RldCBuIGVuY29kaW5nIGRpZ2l0IDJuCisJLS0gYml0cyA0MzIxIG9mIG9jdGV0IG4gZW5jb2RpbmcgZGlnaXQgMihuLTEpICsxCisKK0FkZHJlc3NTdHJpbmcgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4ubWF4QWRkcmVzc0xlbmd0aCkpCisJLS0gVGhpcyB0eXBlIGlzIHVzZWQgdG8gcmVwcmVzZW50IGEgbnVtYmVyIGZvciBhZGRyZXNzaW5nCisJLS0gcHVycG9zZXMuIEl0IGlzIGNvbXBvc2VkIG9mCisJLS0JYSkJb25lIG9jdGV0IGZvciBuYXR1cmUgb2YgYWRkcmVzcywgYW5kIG51bWJlcmluZyBwbGFuCisJLS0JCWluZGljYXRvci4KKwktLQliKQlkaWdpdHMgb2YgYW4gYWRkcmVzcyBlbmNvZGVkIGFzIFRCQ0QtU3RyaW5nLgorCisJLS0gYSkJVGhlIGZpcnN0IG9jdGV0IGluY2x1ZGVzIGEgb25lIGJpdCBleHRlbnNpb24gaW5kaWNhdG9yLCBhCisJLS0JCTMgYml0cyBuYXR1cmUgb2YgYWRkcmVzcyBpbmRpY2F0b3IgYW5kIGEgNCBiaXRzIG51bWJlcmluZworCS0tCQlwbGFuIGluZGljYXRvciwgZW5jb2RlZCBhcyBmb2xsb3dzOgorCisJLS0gYml0IDg6IDEgIChubyBleHRlbnNpb24pCisKKwktLSBiaXRzIDc2NTogbmF0dXJlIG9mIGFkZHJlc3MgaW5kaWNhdG9yCisJLS0JMDAwICB1bmtub3duCisJLS0JMDAxICBpbnRlcm5hdGlvbmFsIG51bWJlcgorCS0tCTAxMCAgbmF0aW9uYWwgc2lnbmlmaWNhbnQgbnVtYmVyCisJLS0JMDExICBuZXR3b3JrIHNwZWNpZmljIG51bWJlcgorCS0tCTEwMCAgc3Vic2NyaWJlciBudW1iZXIKKwktLQkxMDEgIHJlc2VydmVkCisJLS0JMTEwICBhYmJyZXZpYXRlZCBudW1iZXIKKwktLQkxMTEgIHJlc2VydmVkIGZvciBleHRlbnNpb24KKworCS0tIGJpdHMgNDMyMTogbnVtYmVyaW5nIHBsYW4gaW5kaWNhdG9yCisJLS0JMDAwMCAgdW5rbm93bgorCS0tCTAwMDEgIElTRE4vVGVsZXBob255IE51bWJlcmluZyBQbGFuIChSZWMgSVRVLVQgRS4xNjQpCisJLS0JMDAxMCAgc3BhcmUKKwktLQkwMDExICBkYXRhIG51bWJlcmluZyBwbGFuIChJVFUtVCBSZWMgWC4xMjEpCisJLS0JMDEwMCAgdGVsZXggbnVtYmVyaW5nIHBsYW4gKElUVS1UIFJlYyBGLjY5KQorCS0tCTAxMDEgIHNwYXJlCisJLS0JMDExMCAgbGFuZCBtb2JpbGUgbnVtYmVyaW5nIHBsYW4gKElUVS1UIFJlYyBFLjIxMikKKwktLQkwMTExICBzcGFyZQorCS0tCTEwMDAgIG5hdGlvbmFsIG51bWJlcmluZyBwbGFuCisJLS0JMTAwMSAgcHJpdmF0ZSBudW1iZXJpbmcgcGxhbgorCS0tCTExMTEgIHJlc2VydmVkIGZvciBleHRlbnNpb24KKworCS0tCWFsbCBvdGhlciB2YWx1ZXMgYXJlIHJlc2VydmVkLgorCisJLS0gYikJVGhlIGZvbGxvd2luZyBvY3RldHMgcmVwcmVzZW50aW5nIGRpZ2l0cyBvZiBhbiBhZGRyZXNzCisJLS0JCWVuY29kZWQgYXMgYSBUQkNELVNUUklORy4KKworbWF4QWRkcmVzc0xlbmd0aCAgSU5URUdFUiA6Oj0gMjAKKworSVNETi1BZGRyZXNzU3RyaW5nIDo6PSAKKwkJCUFkZHJlc3NTdHJpbmcgKFNJWkUgKDEuLm1heElTRE4tQWRkcmVzc0xlbmd0aCkpCisJLS0gVGhpcyB0eXBlIGlzIHVzZWQgdG8gcmVwcmVzZW50IElTRE4gbnVtYmVycy4KKworbWF4SVNETi1BZGRyZXNzTGVuZ3RoICBJTlRFR0VSIDo6PSA5CisKK0ZUTi1BZGRyZXNzU3RyaW5nIDo6PSAKKwkJCUFkZHJlc3NTdHJpbmcgKFNJWkUgKDEuLm1heEZUTi1BZGRyZXNzTGVuZ3RoKSkKKwktLSBUaGlzIHR5cGUgaXMgdXNlZCB0byByZXByZXNlbnQgZm9yd2FyZGVkLXRvIG51bWJlcnMuIAorCS0tIElmIE5BSSA9IGludGVybmF0aW9uYWwgdGhlIGZpcnN0IGRpZ2l0cyByZXByZXNlbnQgdGhlIGNvdW50cnkgY29kZSAoQ0MpCisJLS0gYW5kIHRoZSBuZXR3b3JrIGRlc3RpbmF0aW9uIGNvZGUgKE5EQykgYXMgZm9yIEUuMTY0LgorCittYXhGVE4tQWRkcmVzc0xlbmd0aCAgSU5URUdFUiA6Oj0gMTUKKworSVNETi1TdWJhZGRyZXNzU3RyaW5nIDo6PSAKKwkJCU9DVEVUIFNUUklORyAoU0laRSAoMS4ubWF4SVNETi1TdWJhZGRyZXNzTGVuZ3RoKSkKKwktLSBUaGlzIHR5cGUgaXMgdXNlZCB0byByZXByZXNlbnQgSVNETiBzdWJhZGRyZXNzZXMuCisJLS0gSXQgaXMgY29tcG9zZWQgb2YKKwktLQlhKQlvbmUgb2N0ZXQgZm9yIHR5cGUgb2Ygc3ViYWRkcmVzcyBhbmQgb2RkL2V2ZW4gaW5kaWNhdG9yLgorCS0tCWIpCTIwIG9jdGV0cyBmb3Igc3ViYWRkcmVzcyBpbmZvcm1hdGlvbi4KKworCS0tCWEpCVRoZSBmaXJzdCBvY3RldCBpbmNsdWRlcyBhIG9uZSBiaXQgZXh0ZW5zaW9uIGluZGljYXRvciwgYQorCS0tCQkzIGJpdHMgdHlwZSBvZiBzdWJhZGRyZXNzIGFuZCBhIG9uZSBiaXQgb2RkL2V2ZW4gaW5kaWNhdG9yLAorCS0tCQllbmNvZGVkIGFzIGZvbGxvd3M6CisKKwktLQliaXQgODogMSAgKG5vIGV4dGVuc2lvbikKKworCS0tCWJpdHMgNzY1OiB0eXBlIG9mIHN1YmFkZHJlc3MKKwktLQkJMDAwICBOU0FQIChYLjIxMy9JU08gODM0OCBBRDIpCisJLS0JCTAxMCAgVXNlciBTcGVjaWZpZWQKKwktLQkJQWxsIG90aGVyIHZhbHVlcyBhcmUgcmVzZXJ2ZWQKKworCS0tCWJpdCA0OiBvZGQvZXZlbiBpbmRpY2F0b3IKKwktLQkJMCAgZXZlbiBudW1iZXIgb2YgYWRkcmVzcyBzaWduYWxzCisJLS0JCTEgIG9kZCBudW1iZXIgb2YgYWRkcmVzcyBzaWduYWxzCisJLS0JCVRoZSBvZGQvZXZlbiBpbmRpY2F0b3IgaXMgdXNlZCB3aGVuIHRoZSB0eXBlIG9mIHN1YmFkZHJlc3MKKwktLQkJaXMgInVzZXIgc3BlY2lmaWVkIiBhbmQgdGhlIGNvZGluZyBpcyBCQ0QuCisKKwktLQliaXRzIDMyMTogMDAwICh1bnVzZWQpCisKKwktLQliKSBTdWJhZGRyZXNzIGluZm9ybWF0aW9uLgorCS0tCVRoZSBOU0FQIFguMjEzL0lTTzgzNDhBRDIgYWRkcmVzcyBzaGFsbCBiZSBmb3JtYXR0ZWQgYXMgc3BlY2lmaWVkCisJLS0JYnkgb2N0ZXQgNCB3aGljaCBjb250YWlucyB0aGUgQXV0aG9yaXR5IGFuZCBGb3JtYXQgSWRlbnRpZmllcgorCS0tCShBRkkpLiBUaGUgZW5jb2RpbmcgaXMgbWFkZSBhY2NvcmRpbmcgdG8gdGhlICJwcmVmZXJyZWQgYmluYXJ5CisJLS0JZW5jb2RpbmciIGFzIGRlZmluZWQgaW4gWC4yMTMvSVNPODM0QUQyLiBGb3IgdGhlIGRlZmluaXRpb24KKwktLQlvZiB0aGlzIHR5cGUgb2Ygc3ViYWRkcmVzcywgc2VlIElUVS1UIFJlYyBJLjMzNC4KKworCS0tCUZvciBVc2VyLXNwZWNpZmljIHN1YmFkZHJlc3MsIHRoaXMgZmllbGQgaXMgZW5jb2RlZCBhY2NvcmRpbmcKKwktLQl0byB0aGUgdXNlciBzcGVjaWZpY2F0aW9uLCBzdWJqZWN0IHRvIGEgbWF4aW11bSBsZW5ndGggb2YgMjAKKwktLQlvY3RldHMuIFdoZW4gaW50ZXJ3b3JraW5nIHdpdGggWC4yNSBuZXR3b3JrcyBCQ0QgY29kaW5nIHNob3VsZAorCS0tCWJlIGFwcGxpZWQuCisKK21heElTRE4tU3ViYWRkcmVzc0xlbmd0aCAgSU5URUdFUiA6Oj0gMjEKKworRXh0ZXJuYWxTaWduYWxJbmZvIDo6PSBTRVFVRU5DRSB7CisJcHJvdG9jb2xJZAlQcm90b2NvbElkLAorCXNpZ25hbEluZm8JU2lnbmFsSW5mbywKKwktLSBJbmZvcm1hdGlvbiBhYm91dCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGdpdmVuIGluCisJLS0gY2xhdXNlIDcuNi45LgorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLS0gZXh0ZW5zaW9uQ29udGFpbmVyIG11c3Qgbm90IGJlIHVzZWQgaW4gdmVyc2lvbiAyCisJLi4ufQorCitTaWduYWxJbmZvIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLm1heFNpZ25hbEluZm9MZW5ndGgpKQorCittYXhTaWduYWxJbmZvTGVuZ3RoICBJTlRFR0VSIDo6PSAyMDAKKwktLSBUaGlzIE5hbWVkVmFsdWUgcmVwcmVzZW50cyB0aGUgdGhlb3JldGljYWwgbWF4aW11bSBudW1iZXIgb2Ygb2N0ZXRzIHdoaWNoIGlzCisJLS0gYXZhaWxhYmxlIHRvIGNhcnJ5IGEgc2luZ2xlIGluc3RhbmNlIG9mIHRoZSBTaWduYWxJbmZvIGRhdGEgdHlwZSwKKwktLSB3aXRob3V0IHJlcXVpcmluZyBzZWdtZW50YXRpb24gdG8gY29wZSB3aXRoIHRoZSBuZXR3b3JrIGxheWVyIHNlcnZpY2UuCisJLS0gSG93ZXZlciwgdGhlIGFjdHVhbCBtYXhpbXVtIHNpemUgYXZhaWxhYmxlIGZvciBhbiBpbnN0YW5jZSBvZiB0aGUgZGF0YQorCS0tIHR5cGUgbWF5IGJlIGxvd2VyLCBlc3BlY2lhbGx5IHdoZW4gb3RoZXIgaW5mb3JtYXRpb24gZWxlbWVudHMKKwktLSBoYXZlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBzYW1lIGNvbXBvbmVudC4KKworUHJvdG9jb2xJZCA6Oj0gRU5VTUVSQVRFRCB7CisJZ3NtLTA0MDggICgxKSwKKwlnc20tMDgwNiAgKDIpLAorCWdzbS1CU1NNQVAgICgzKSwKKwktLSBWYWx1ZSAzIGlzIHJlc2VydmVkIGFuZCBtdXN0IG5vdCBiZSB1c2VkCisJZXRzLTMwMDEwMi0xICAoNCl9CisKK0V4dC1FeHRlcm5hbFNpZ25hbEluZm8gOjo9IFNFUVVFTkNFIHsKKwlleHQtUHJvdG9jb2xJZAlFeHQtUHJvdG9jb2xJZCwKKwlzaWduYWxJbmZvCVNpZ25hbEluZm8sCisJLS0gSW5mb3JtYXRpb24gYWJvdXQgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBnaXZlbiBpbgorCS0tIGNsYXVzZSA3LjYuOS4xMAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitFeHQtUHJvdG9jb2xJZCA6Oj0gRU5VTUVSQVRFRCB7CisJZXRzLTMwMDM1NiAgKDEpLAorCS4uLiAKKwkgfQorLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0gRm9yIEV4dC1FeHRlcm5hbFNpZ25hbEluZm8gc2VxdWVuY2VzIGNvbnRhaW5pbmcgdGhpcyBwYXJhbWV0ZXIgd2l0aCBhbnkKKy0tIG90aGVyIHZhbHVlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUgdGhlIHdob2xlIAorLS0gRXh0LUV4dGVybmFsU2lnbmFsSW5mbyBzZXF1ZW5jZS4KKworQWNjZXNzTmV0d29ya1NpZ25hbEluZm8gOjo9IFNFUVVFTkNFIHsKKwlhY2Nlc3NOZXR3b3JrUHJvdG9jb2xJZAlBY2Nlc3NOZXR3b3JrUHJvdG9jb2xJZCwKKwlzaWduYWxJbmZvCUxvbmdTaWduYWxJbmZvLAorCS0tIEluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZ2l2ZW4gaW4gY2xhdXNlIDcuNi45LjEKKwkKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTG9uZ1NpZ25hbEluZm8gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4ubWF4TG9uZ1NpZ25hbEluZm9MZW5ndGgpKQorCittYXhMb25nU2lnbmFsSW5mb0xlbmd0aCAgSU5URUdFUiA6Oj0gMjU2MAorCS0tIFRoaXMgTmFtZWQgVmFsdWUgcmVwcmVzZW50cyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygb2N0ZXRzIHdoaWNoIGlzIGF2YWlsYWJsZQorCS0tIHRvIGNhcnJ5IGEgc2luZ2xlIGluc3RhbmNlIG9mIHRoZSBMb25nU2lnbmFsSW5mbyBkYXRhIHR5cGUgdXNpbmcKKwktLSBXaGl0ZSBCb29rIFNDQ1Agd2l0aCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VnbWVudHMuCisJLS0gSXQgdGFrZXMgYWNjb3VudCBvZiB0aGUgb2N0ZXRzIHVzZWQgYnkgdGhlIGxvd2VyIGxheWVycyBvZiB0aGUgcHJvdG9jb2wsIGFuZAorCS0tIG90aGVyIGluZm9ybWF0aW9uIGVsZW1lbnRzIHdoaWNoIG1heSBiZSBpbmNsdWRlZCBpbiB0aGUgc2FtZSBjb21wb25lbnQuCisKK0FjY2Vzc05ldHdvcmtQcm90b2NvbElkIDo6PSBFTlVNRVJBVEVEIHsKKwl0czNHLTQ4MDA2ICAgKDEpLAorCXRzM0ctMjU0MTMgKDIpLAorCS4uLn0KKwktLSBleGNlcHRpb24gaGFuZGxpbmc6CisJLS0gRm9yIEFjY2Vzc05ldHdvcmtTaWduYWxJbmZvIHNlcXVlbmNlcyBjb250YWluaW5nIHRoaXMgcGFyYW1ldGVyIHdpdGggYW55CisJLS0gb3RoZXIgdmFsdWUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZSB0aGUgd2hvbGUgCisJLS0gQWNjZXNzTmV0d29ya1NpZ25hbEluZm8gc2VxdWVuY2UuCisKK0FsZXJ0aW5nUGF0dGVybiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSApCisJLS0gVGhpcyB0eXBlIGlzIHVzZWQgdG8gcmVwcmVzZW50IEFsZXJ0aW5nIFBhdHRlcm4KKworCS0tCWJpdHMgODc2NSA6IDAwMDAgKHVudXNlZCkKKworCS0tCWJpdHMgNDMgOiB0eXBlIG9mIFBhdHRlcm4KKwktLQkJMDAgbGV2ZWwKKwktLQkJMDEgY2F0ZWdvcnkKKwktLQkJMTAgY2F0ZWdvcnkKKwktLQkJYWxsIG90aGVyIHZhbHVlcyBhcmUgcmVzZXJ2ZWQuCisKKwktLQliaXRzIDIxIDogdHlwZSBvZiBhbGVydGluZworCithbGVydGluZ0xldmVsLTAgICBBbGVydGluZ1BhdHRlcm4gOjo9ICcwMDAwMDAwMCdCCithbGVydGluZ0xldmVsLTEgICBBbGVydGluZ1BhdHRlcm4gOjo9ICcwMDAwMDAwMSdCCithbGVydGluZ0xldmVsLTIgICBBbGVydGluZ1BhdHRlcm4gOjo9ICcwMDAwMDAxMCdCCisJLS0gYWxsIG90aGVyIHZhbHVlcyBvZiBBbGVydGluZyBsZXZlbCBhcmUgcmVzZXJ2ZWQKKwktLSBBbGVydGluZyBMZXZlbHMgYXJlIGRlZmluZWQgaW4gR1NNIDAyLjA3CisJCithbGVydGluZ0NhdGVnb3J5LTEgICBBbGVydGluZ1BhdHRlcm4gOjo9ICcwMDAwMDEwMCdCCithbGVydGluZ0NhdGVnb3J5LTIgICBBbGVydGluZ1BhdHRlcm4gOjo9ICcwMDAwMDEwMSdCCithbGVydGluZ0NhdGVnb3J5LTMgICBBbGVydGluZ1BhdHRlcm4gOjo9ICcwMDAwMDExMCdCCithbGVydGluZ0NhdGVnb3J5LTQgICBBbGVydGluZ1BhdHRlcm4gOjo9ICcwMDAwMDExMSdCCithbGVydGluZ0NhdGVnb3J5LTUgICBBbGVydGluZ1BhdHRlcm4gOjo9ICcwMDAwMTAwMCdCCisJLS0gYWxsIG90aGVyIHZhbHVlcyBvZiBBbGVydGluZyBDYXRlZ29yeSBhcmUgcmVzZXJ2ZWQKKwktLSBBbGVydGluZyBjYXRlZ29yaWVzIGFyZSBkZWZpbmVkIGluIEdTTSAwMi4wNworCistLSBkYXRhIHR5cGVzIGZvciBudW1iZXJpbmcgYW5kIGlkZW50aWZpY2F0aW9uCisKK0lNU0kgOjo9IFRCQ0QtU1RSSU5HIChTSVpFICgzLi44KSkKKwktLSBkaWdpdHMgb2YgTUNDLCBNTkMsIE1TSU4gYXJlIGNvbmNhdGVuYXRlZCBpbiB0aGlzIG9yZGVyLgorCitJZGVudGl0eSA6Oj0gQ0hPSUNFIHsKKwlpbXNpCQkJSU1TSSwKKwlpbXNpLVdpdGhMTVNJCUlNU0ktV2l0aExNU0l9CisKK0lNU0ktV2l0aExNU0kgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJSU1TSSwKKwlsbXNpCQkJTE1TSSwKKwktLSBhIHNwZWNpYWwgdmFsdWUgMDAwMDAwMDAgaW5kaWNhdGVzIHRoYXQgdGhlIExNU0kgaXMgbm90IGluIHVzZQorCS4uLn0KKworQVNDSS1DYWxsUmVmZXJlbmNlIDo6PSBUQkNELVNUUklORyAoU0laRSAoMS4uOCkpCisJLS0gZGlnaXRzIG9mIFZHQ1MvVkJTLWFyZWEsR3JvdXAtSUQgYXJlIGNvbmNhdGVuYXRlZCBpbiB0aGlzIG9yZGVyIGlmIHRoZXJlIGlzIGEKKwktLSBWR0NTL1ZCUy1hcmVhLgorCitUTVNJIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjQpKQorCitTdWJzY3JpYmVySWQgOjo9IENIT0lDRSB7CisJaW1zaQkJCVswXSBJTVNJLAorCXRtc2kJCQlbMV0gVE1TSX0KKworSU1FSSA6Oj0gVEJDRC1TVFJJTkcgKFNJWkUgKDgpKQorCS0tCVJlZmVycyB0byBJbnRlcm5hdGlvbmFsIE1vYmlsZSBTdGF0aW9uIEVxdWlwbWVudCBJZGVudGl0eQorCS0tCWFuZCBTb2Z0d2FyZSBWZXJzaW9uIE51bWJlciAoU1ZOKSBkZWZpbmVkIGluIFRTIDNHUFAgVFMgMjMuMDAzIFsxN10uCisJLS0JSWYgdGhlIFNWTiBpcyBub3QgcHJlc2VudCB0aGUgbGFzdCBvY3RldCBzaGFsbCBjb250YWluIHRoZQorCS0tCWRpZ2l0IDAgYW5kIGEgZmlsbGVyLgorCS0tCUlmIHByZXNlbnQgdGhlIFNWTiBzaGFsbCBiZSBpbmNsdWRlZCBpbiB0aGUgbGFzdCBvY3RldC4KKworSExSLUlkIDo6PSBJTVNJCisJLS0gbGVhZGluZyBkaWdpdHMgb2YgSU1TSSwgaS5lLiAoTUNDLCBNTkMsIGxlYWRpbmcgZGlnaXRzIG9mCisJLS0gTVNJTikgZm9ybWluZyBITFIgSWQgZGVmaW5lZCBpbiBUUyAzR1BQIFRTIDIzLjAwMyBbMTddLgorCitITFItTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZITFItSWQpIE9GCisJCQkJSExSLUlkCisKK21heE51bU9mSExSLUlkICBJTlRFR0VSIDo6PSA1MAorCitMTVNJIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDQpKQorCitHbG9iYWxDZWxsSWQgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNS4uNykpCisJLS0gUmVmZXJzIHRvIENlbGwgR2xvYmFsIElkZW50aWZpY2F0aW9uIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMy4wMDMgWzE3XS4KKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKwktLSBvY3RldCAxIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDFzdCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBDb3VudHJ5IENvZGUgMm5kIGRpZ2l0CisJLS0gb2N0ZXQgMiBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAzcmQgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgTmV0d29yayBDb2RlIDNyZCBkaWdpdAorCS0tCQkJb3IgZmlsbGVyICgxMTExKSBmb3IgMiBkaWdpdCBNTkNzCisJLS0gb2N0ZXQgMyBiaXRzIDQzMjEJTW9iaWxlIE5ldHdvcmsgQ29kZSAxc3QgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgTmV0d29yayBDb2RlIDJuZCBkaWdpdAorCS0tIG9jdGV0cyA0IGFuZCA1CUxvY2F0aW9uIEFyZWEgQ29kZSBhY2NvcmRpbmcgdG8gVFMgM0dQUCBUUyAyNC4wMDggWzM1XQorCS0tIG9jdGV0cyA2IGFuZCA3CUNlbGwgSWRlbnRpdHkgKENJKSBhY2NvcmRpbmcgdG8gVFMgM0dQUCBUUyAyNC4wMDggWzM1XQorCitOZXR3b3JrUmVzb3VyY2UgOjo9IEVOVU1FUkFURUQgeworCXBsbW4gICgwKSwKKwlobHIgICgxKSwKKwl2bHIgICgyKSwKKwlwdmxyICAoMyksCisJY29udHJvbGxpbmdNU0MgICg0KSwKKwl2bXNjICAoNSksCisJZWlyICAoNiksCisJcnNzICAoNyl9CisKK0FkZGl0aW9uYWxOZXR3b3JrUmVzb3VyY2UgOjo9IEVOVU1FUkFURUQgeworCXNnc24gKDApLAorCWdnc24gKDEpLAorCWdtbGMgKDIpLAorCWdzbVNDRiAoMyksCisJbnBsciAoNCksCisJYXVjICg1KSwKKwkuLi4gLAorCXVlICg2KSwKKwltbWUgKDcpfQorCS0tIGlmIHVua25vd24gdmFsdWUgaXMgcmVjZWl2ZWQgaW4gQWRkaXRpb25hbE5ldHdvcmtSZXNvdXJjZQorCS0tIGl0IHNoYWxsIGJlIGlnbm9yZWQuCisKKworTkFFQS1QcmVmZXJyZWRDSSA6Oj0gU0VRVUVOQ0UgeworCW5hZWEtUHJlZmVycmVkQ0lDCVswXSBOQUVBLUNJQywKKwlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK05BRUEtQ0lDIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDMpKQorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBieSB0aGUgQ2FycmllciBJZGVudGlmaWNhdGlvbgorCS0tIHBhcmFtZXRlciBpbiBBTlNJIFQxLjExMy4zLiBDYXJyaWVyIGNvZGVzIGJldHdlZW4gIjAwMCIgYW5kICI5OTkiIG1heQorCS0tIGJlIGVuY29kZWQgYXMgMyBkaWdpdHMgdXNpbmcgIjAwMCIgdG8gIjk5OSIgb3IgYXMgNCBkaWdpdHMgdXNpbmcgCisJLS0gIjAwMDAiIHRvICIwOTk5Ii4gQ2FycmllciBjb2RlcyBiZXR3ZWVuICIxMDAwIiBhbmQgIjk5OTkiIGFyZSBlbmNvZGVkCisJLS0gdXNpbmcgNCBkaWdpdHMuCisKK1N1YnNjcmliZXJJZGVudGl0eSA6Oj0gQ0hPSUNFIHsKKwlpbXNpCQkJWzBdIElNU0ksCisJbXNpc2RuCQlbMV0gSVNETi1BZGRyZXNzU3RyaW5nCisJfQorCitMQ1NDbGllbnRFeHRlcm5hbElEIDo6PSBTRVFVRU5DRSB7CisJZXh0ZXJuYWxBZGRyZXNzCVswXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uIH0KKworTENTQ2xpZW50SW50ZXJuYWxJRCA6Oj0gRU5VTUVSQVRFRCB7CisJYnJvYWRjYXN0U2VydmljZQkoMCksCisJby1hbmRNLUhQTE1OCSgxKSwKKwlvLWFuZE0tVlBMTU4JKDIpLAorCWFub255bW91c0xvY2F0aW9uCSgzKSwKKwl0YXJnZXRNU3N1YnNjcmliZWRTZXJ2aWNlCSg0KSwKKwkuLi4gfQorLS0gZm9yIGEgQ0FNRUwgcGhhc2UgMyBQTE1OIG9wZXJhdG9yIGNsaWVudCwgdGhlIHZhbHVlIHRhcmdldE1Tc3Vic2NyaWJlZFNlcnZpY2Ugc2hhbGwgYmUgdXNlZAorCitMQ1NTZXJ2aWNlVHlwZUlEIDo6PSBJTlRFR0VSICgwLi4xMjcpCisJLS0gdGhlIGludGVnZXIgdmFsdWVzIDAtNjMgYXJlIHJlc2VydmVkIGZvciBTdGFuZGFyZCBMQ1Mgc2VydmljZSB0eXBlcworCS0tIHRoZSBpbnRlZ2VyIHZhbHVlcyA2NC0xMjcgYXJlIHJlc2VydmVkIGZvciBOb24gU3RhbmRhcmQgTENTIHNlcnZpY2UgdHlwZXMKKworLS0gU3RhbmRhcmQgTENTIFNlcnZpY2UgVHlwZXMKK2VtZXJnZW5jeVNlcnZpY2VzCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAwCitlbWVyZ2VuY3lBbGVydFNlcnZpY2VzCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxCitwZXJzb25UcmFja2luZwkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDIKK2ZsZWV0TWFuYWdlbWVudAkJTENTU2VydmljZVR5cGVJRCA6Oj0gMworYXNzZXRNYW5hZ2VtZW50CQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA0Cit0cmFmZmljQ29uZ2VzdGlvblJlcG9ydGluZwkJTENTU2VydmljZVR5cGVJRCA6Oj0gNQorcm9hZHNpZGVBc3Npc3RhbmNlCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA2Cityb3V0aW5nVG9OZWFyZXN0Q29tbWVyY2lhbEVudGVycHJpc2UJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDcKK25hdmlnYXRpb24JCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA4CisJLS10aGlzIHNlcnZpY2UgdHlwZSBpcyByZXNlcnZlZCBmb3IgdXNlIGluIHByZXZpb3VzIHJlbGVhc2VzCitjaXR5U2lnaHRzZWVpbmcJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDkKK2xvY2FsaXplZEFkdmVydGlzaW5nCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMAorbW9iaWxlWWVsbG93UGFnZXMJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDExIAordHJhZmZpY0FuZFB1YmxpY1RyYW5zcG9ydGF0aW9uSW5mbwkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTIKK3dlYXRoZXIJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTMKK2Fzc2V0QW5kU2VydmljZUZpbmRpbmcJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDE0CitnYW1pbmcJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTUKK2ZpbmRZb3VyRnJpZW5kCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTYKK2RhdGluZwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxNworY2hhdHRpbmcJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTgKK3JvdXRlRmluZGluZwkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDE5Cit3aGVyZUFtSQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAyMAorCistLSBUaGUgdmFsdWVzIG9mIExDU1NlcnZpY2VUeXBlSUQgYXJlIGRlZmluZWQgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjIuMDcxLgorCistLSBOb24gU3RhbmRhcmQgTENTIFNlcnZpY2UgVHlwZXMKK3NlcnY2NAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA2NAorc2VydjY1CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDY1CitzZXJ2NjYJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNjYKK3NlcnY2NwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA2Nworc2VydjY4CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDY4CitzZXJ2NjkJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNjkKK3NlcnY3MAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA3MAorc2VydjcxCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDcxCitzZXJ2NzIJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNzIKK3NlcnY3MwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA3Mworc2Vydjc0CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDc0CitzZXJ2NzUJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNzUKK3NlcnY3NgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA3Ngorc2Vydjc3CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDc3CitzZXJ2NzgJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNzgKK3NlcnY3OQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA3OQorc2VydjgwCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDgwCitzZXJ2ODEJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gODEKK3NlcnY4MgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA4Mgorc2VydjgzCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDgzCitzZXJ2ODQJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gODQKK3NlcnY4NQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA4NQorc2Vydjg2CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDg2CitzZXJ2ODcJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gODcKK3NlcnY4OAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA4OAorc2Vydjg5CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDg5CitzZXJ2OTAJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gOTAKK3NlcnY5MQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA5MQorc2VydjkyCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDkyCitzZXJ2OTMJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gOTMKK3NlcnY5NAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA5NAorc2Vydjk1CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDk1CitzZXJ2OTYJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gOTYKK3NlcnY5NwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA5Nworc2Vydjk4CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDk4CitzZXJ2OTkJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gOTkKK3NlcnYxMDAJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTAwCitzZXJ2MTAxCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEwMQorc2VydjEwMgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMDIKK3NlcnYxMDMJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTAzCitzZXJ2MTA0CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEwNAorc2VydjEwNQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMDUKK3NlcnYxMDYJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTA2CitzZXJ2MTA3CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEwNworc2VydjEwOAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMDgKK3NlcnYxMDkJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTA5CitzZXJ2MTEwCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDExMAorc2VydjExMQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMTEKK3NlcnYxMTIJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTEyCitzZXJ2MTEzCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDExMworc2VydjExNAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMTQKK3NlcnYxMTUJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTE1CitzZXJ2MTE2CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDExNgorc2VydjExNwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMTcKK3NlcnYxMTgJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTE4CitzZXJ2MTE5CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDExOQorc2VydjEyMAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMjAKK3NlcnYxMjEJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTIxCitzZXJ2MTIyCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEyMgorc2VydjEyMwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMjMKK3NlcnYxMjQJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTI0CitzZXJ2MTI1CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEyNQorc2VydjEyNgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMjYKK3NlcnYxMjcJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTI3CisKK1BMTU4tSWQgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMykpCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisJLS0gb2N0ZXQgMSBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAxc3QgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgQ291bnRyeSBDb2RlIDJuZCBkaWdpdAorCS0tIG9jdGV0IDIgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgM3JkIGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAzcmQgZGlnaXQKKwktLQkJCW9yIGZpbGxlciAoMTExMSkgZm9yIDIgZGlnaXQgTU5DcworCS0tIG9jdGV0IDMgYml0cyA0MzIxCU1vYmlsZSBOZXR3b3JrIENvZGUgMXN0IGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAybmQgZGlnaXQKKworLS0gZGF0YSB0eXBlcyBmb3IgQ0FNRUwKKworQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUkgOjo9IENIT0lDRSB7CisJY2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkRml4ZWRMZW5ndGgJWzBdIENlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZEZpeGVkTGVuZ3RoLAorCWxhaUZpeGVkTGVuZ3RoCVsxXSBMQUlGaXhlZExlbmd0aH0KKworQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkRml4ZWRMZW5ndGggOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNykpCisJLS0gUmVmZXJzIHRvIENlbGwgR2xvYmFsIElkZW50aWZpY2F0aW9uIG9yIFNlcnZpY2UgQXJlIElkZW50aWZpY2F0aW9uCisJLS0gZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAwMy4KKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKwktLSBvY3RldCAxIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDFzdCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBDb3VudHJ5IENvZGUgMm5kIGRpZ2l0CisJLS0gb2N0ZXQgMiBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAzcmQgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgTmV0d29yayBDb2RlIDNyZCBkaWdpdAorCS0tCQkJb3IgZmlsbGVyICgxMTExKSBmb3IgMiBkaWdpdCBNTkNzCisJLS0gb2N0ZXQgMyBiaXRzIDQzMjEJTW9iaWxlIE5ldHdvcmsgQ29kZSAxc3QgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgTmV0d29yayBDb2RlIDJuZCBkaWdpdAorCS0tIG9jdGV0cyA0IGFuZCA1CUxvY2F0aW9uIEFyZWEgQ29kZSBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyNC4wMDgKKwktLSBvY3RldHMgNiBhbmQgNwlDZWxsIElkZW50aXR5IChDSSkgdmFsdWUgb3IgCisJLS0gCQkJU2VydmljZSBBcmVhIENvZGUgKFNBQykgdmFsdWUgCisJLS0JCQlhY2NvcmRpbmcgdG8gM0dQUCBUUyAyMy4wMDMKKworTEFJRml4ZWRMZW5ndGggOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNSkpCisJLS0gUmVmZXJzIHRvIExvY2F0aW9uIEFyZWEgSWRlbnRpZmljYXRpb24gZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAwMyBbMTddLgorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCS0tIG9jdGV0IDEgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgMXN0IGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIENvdW50cnkgQ29kZSAybmQgZGlnaXQKKwktLSBvY3RldCAyIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDNyZCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgM3JkIGRpZ2l0CisJLS0JCQlvciBmaWxsZXIgKDExMTEpIGZvciAyIGRpZ2l0IE1OQ3MKKwktLSBvY3RldCAzIGJpdHMgNDMyMQlNb2JpbGUgTmV0d29yayBDb2RlIDFzdCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgMm5kIGRpZ2l0CisJLS0gb2N0ZXRzIDQgYW5kIDUJTG9jYXRpb24gQXJlYSBDb2RlIGFjY29yZGluZyB0byAzR1BQIFRTIDI0LjAwOCBbMzVdCisKKy0tIGRhdGEgdHlwZXMgZm9yIHN1YnNjcmliZXIgbWFuYWdlbWVudAorCitCYXNpY1NlcnZpY2VDb2RlIDo6PSBDSE9JQ0UgeworCWJlYXJlclNlcnZpY2UJWzJdIEJlYXJlclNlcnZpY2VDb2RlLAorCXRlbGVzZXJ2aWNlCVszXSBUZWxlc2VydmljZUNvZGV9CisKK0V4dC1CYXNpY1NlcnZpY2VDb2RlIDo6PSBDSE9JQ0UgeworCWV4dC1CZWFyZXJTZXJ2aWNlCVsyXSBFeHQtQmVhcmVyU2VydmljZUNvZGUsCisJZXh0LVRlbGVzZXJ2aWNlCVszXSBFeHQtVGVsZXNlcnZpY2VDb2RlfQorCitFTUxQUC1JbmZvIDo6PSBTRVFVRU5DRSB7CisJbWF4aW11bWVudGl0bGVkUHJpb3JpdHkJRU1MUFAtUHJpb3JpdHksCisJZGVmYXVsdFByaW9yaXR5CUVNTFBQLVByaW9yaXR5LAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitFTUxQUC1Qcmlvcml0eSA6Oj0gSU5URUdFUiAoMC4uMTUpCisJLS0gVGhlIG1hcHBpbmcgZnJvbSB0aGUgdmFsdWVzIEEsQiwwLDEsMiwzLDQgdG8gdGhlIGludGVnZXItdmFsdWUgaXMKKwktLSBzcGVjaWZpZWQgYXMgZm9sbG93cyB3aGVyZSBBIGlzIHRoZSBoaWdoZXN0IGFuZCA0IGlzIHRoZSBsb3dlc3QKKwktLSBwcmlvcml0eSBsZXZlbAorCS0tIHRoZSBpbnRlZ2VyIHZhbHVlcyA3LTE1IGFyZSBzcGFyZSBhbmQgc2hhbGwgYmUgbWFwcGVkIHRvIHZhbHVlIDQKKworcHJpb3JpdHlMZXZlbEEJCUVNTFBQLVByaW9yaXR5IDo6PSA2Citwcmlvcml0eUxldmVsQgkJRU1MUFAtUHJpb3JpdHkgOjo9IDUKK3ByaW9yaXR5TGV2ZWwwCQlFTUxQUC1Qcmlvcml0eSA6Oj0gMAorcHJpb3JpdHlMZXZlbDEJCUVNTFBQLVByaW9yaXR5IDo6PSAxCitwcmlvcml0eUxldmVsMgkJRU1MUFAtUHJpb3JpdHkgOjo9IDIKK3ByaW9yaXR5TGV2ZWwzCQlFTUxQUC1Qcmlvcml0eSA6Oj0gMworcHJpb3JpdHlMZXZlbDQJCUVNTFBQLVByaW9yaXR5IDo6PSA0CisKK01DLVNTLUluZm8gOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlbMF0gU1MtQ29kZSwKKwlzcy1TdGF0dXMJCVsxXSBFeHQtU1MtU3RhdHVzLAorCW5iclNCCQlbMl0gTWF4TUMtQmVhcmVycywKKwluYnJVc2VyCQlbM10gTUMtQmVhcmVycywKKwlleHRlbnNpb25Db250YWluZXIJWzRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK01heE1DLUJlYXJlcnMgOjo9IElOVEVHRVIgKDIuLm1heE51bU9mTUMtQmVhcmVycykKKworTUMtQmVhcmVycyA6Oj0gSU5URUdFUiAoMS4ubWF4TnVtT2ZNQy1CZWFyZXJzKQorCittYXhOdW1PZk1DLUJlYXJlcnMgIElOVEVHRVIgOjo9IDcKKworRXh0LVNTLVN0YXR1cyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi41KSkKKworCS0tIE9DVEVUIDE6CisJLS0KKwktLSBiaXRzIDg3NjU6IDAwMDAgKHVudXNlZCkKKwktLSBiaXRzIDQzMjE6IFVzZWQgdG8gY29udmV5IHRoZSAiUCBiaXQiLCJSIGJpdCIsIkEgYml0IiBhbmQgIlEgYml0IiwKKwktLQkJICAgIHJlcHJlc2VudGluZyBzdXBwbGVtZW50YXJ5IHNlcnZpY2Ugc3RhdGUgaW5mb3JtYXRpb24KKwktLQkJICAgIGFzIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMy4wMTEgWzIyXQorCisJLS0gYml0IDQ6ICJRIGJpdCIKKworCS0tIGJpdCAzOiAiUCBiaXQiCisKKwktLSBiaXQgMjogIlIgYml0IgorCisJLS0gYml0IDE6ICJBIGJpdCIKKworCS0tIE9DVEVUUyAyLTU6IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiBUaGV5IHNoYWxsIGJlIGRpc2NhcmRlZCBpZgorCS0tIHJlY2VpdmVkIGFuZCBub3QgdW5kZXJzdG9vZC4KKworCisJLS0gZGF0YSB0eXBlcyBmb3IgZ2VvZ3JhcGhpYyBsb2NhdGlvbgorCitBZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24gOjo9IElOVEVHRVIgKDAuLjMyNzY3KQorLS0gdGhlIHZhbHVlIHJlcHJlc2VudHMgdGhlIGVsYXBzZWQgdGltZSBpbiBtaW51dGVzIHNpbmNlIHRoZSBsYXN0CistLSBuZXR3b3JrIGNvbnRhY3Qgb2YgdGhlIG1vYmlsZSBzdGF0aW9uIChpLmUuIHRoZSBhY3R1YWxpdHkgb2YgdGhlCistLSBsb2NhdGlvbiBpbmZvcm1hdGlvbikuCistLSB2YWx1ZSAiMCIgaW5kaWNhdGVzIHRoYXQgdGhlIE1TIGlzIGN1cnJlbnRseSBpbiBjb250YWN0IHdpdGggdGhlCistLSAgICAgICAgICAgbmV0d29yaworLS0gdmFsdWUgIjMyNzY3IiBpbmRpY2F0ZXMgdGhhdCB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24gaXMgYXQgbGVhc3QKKy0tICAgICAgICAgICAgICAgMzI3NjcgbWludXRlcyBvbGQKKworRU5ECisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUVSLURhdGFUeXBlcy5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1FUi1EYXRhVHlwZXMuYXNuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYjkwZmMKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1FUi1EYXRhVHlwZXMuYXNuCkBAIC0wLDAgKzEsNDE1IEBACistLSAkSWQ6IE1BUC1FUi1EYXRhVHlwZXMuYXNuIDI4MTQ5IDIwMDktMDQtMjUgMTc6NDU6MzRaIGV0eHJhYiAkCistLSAzR1BQIFRTIDI5LjAwMiBWOC45LjAgKDIwMDktMDQpIAorLS0gMTcuNy43CUVycm9yIGRhdGEgdHlwZXMKKworTUFQLUVSLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FUi1EYXRhVHlwZXMgKDE3KSB2ZXJzaW9uMTEgKDExKX0KKworREVGSU5JVElPTlMKKworSU1QTElDSVQgVEFHUworCis6Oj0KKworQkVHSU4KKworRVhQT1JUUworCVJvYW1pbmdOb3RBbGxvd2VkUGFyYW0sCisJQ2FsbEJhcnJlZFBhcmFtLAorCUNVRy1SZWplY3RQYXJhbSwKKwlTUy1JbmNvbXBhdGliaWxpdHlDYXVzZSwKKwlQVy1SZWdpc3RyYXRpb25GYWlsdXJlQ2F1c2UsCisJU00tRGVsaXZlcnlGYWlsdXJlQ2F1c2UsCisJU3lzdGVtRmFpbHVyZVBhcmFtLAorCURhdGFNaXNzaW5nUGFyYW0sCisJVW5leHBlY3RlZERhdGFQYXJhbSwKKwlGYWNpbGl0eU5vdFN1cFBhcmFtLAorCU9SLU5vdEFsbG93ZWRQYXJhbSwKKwlVbmtub3duU3Vic2NyaWJlclBhcmFtLAorCU51bWJlckNoYW5nZWRQYXJhbSwKKwlVbmlkZW50aWZpZWRTdWJQYXJhbSwKKwlJbGxlZ2FsU3Vic2NyaWJlclBhcmFtLAorCUlsbGVnYWxFcXVpcG1lbnRQYXJhbSwKKwlCZWFyZXJTZXJ2Tm90UHJvdlBhcmFtLAorCVRlbGVzZXJ2Tm90UHJvdlBhcmFtLAorCVRyYWNpbmdCdWZmZXJGdWxsUGFyYW0sCisJTm9Sb2FtaW5nTmJQYXJhbSwKKwlBYnNlbnRTdWJzY3JpYmVyUGFyYW0sCisJQnVzeVN1YnNjcmliZXJQYXJhbSwKKwlOb1N1YnNjcmliZXJSZXBseVBhcmFtLAorCUZvcndhcmRpbmdWaW9sYXRpb25QYXJhbSwKKwlGb3J3YXJkaW5nRmFpbGVkUGFyYW0sIAorCUFUSS1Ob3RBbGxvd2VkUGFyYW0sCisJU3ViQnVzeUZvck1ULVNNUy1QYXJhbSwKKwlNZXNzYWdlV2FpdExpc3RGdWxsUGFyYW0sCisJQWJzZW50U3Vic2NyaWJlclNNLVBhcmFtLAorCUFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00sCisJUmVzb3VyY2VMaW1pdGF0aW9uUGFyYW0sCisJTm9Hcm91cENhbGxOYlBhcmFtLAorCUluY29tcGF0aWJsZVRlcm1pbmFsUGFyYW0sCisJU2hvcnRUZXJtRGVuaWFsUGFyYW0sCisJTG9uZ1Rlcm1EZW5pYWxQYXJhbSwKKwlVbmF1dGhvcml6ZWRSZXF1ZXN0aW5nTmV0d29yay1QYXJhbSwKKwlVbmF1dGhvcml6ZWRMQ1NDbGllbnQtUGFyYW0sCisJUG9zaXRpb25NZXRob2RGYWlsdXJlLVBhcmFtLAorVW5rbm93bk9yVW5yZWFjaGFibGVMQ1NDbGllbnQtUGFyYW0sCisJTU0tRXZlbnROb3RTdXBwb3J0ZWQtUGFyYW0sCitBVFNJLU5vdEFsbG93ZWRQYXJhbSwKK0FUTS1Ob3RBbGxvd2VkUGFyYW0sCitJbGxlZ2FsU1MtT3BlcmF0aW9uUGFyYW0sCitTUy1Ob3RBdmFpbGFibGVQYXJhbSwKK1NTLVN1YnNjcmlwdGlvblZpb2xhdGlvblBhcmFtLAorSW5mb3JtYXRpb25Ob3RBdmFpbGFibGVQYXJhbSwKK1RhcmdldENlbGxPdXRzaWRlR0NBLVBhcmFtLAorT25nb2luZ0dyb3VwQ2FsbFBhcmFtCisKKzsKKworSU1QT1JUUworCVNTLVN0YXR1cworRlJPTSBNQVAtU1MtRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVNTLURhdGFUeXBlcyAoMTQpIHZlcnNpb24xMSAoMTEpfQorCisJU2lnbmFsSW5mbywKKwlCYXNpY1NlcnZpY2VDb2RlLAorCU5ldHdvcmtSZXNvdXJjZSwKKwlBZGRpdGlvbmFsTmV0d29ya1Jlc291cmNlCitGUk9NIE1BUC1Db21tb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtQ29tbW9uRGF0YVR5cGVzICgxOCkgdmVyc2lvbjExICgxMSl9CisKKworCVNTLUNvZGUKK0ZST00gTUFQLVNTLUNvZGUgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU1MtQ29kZSAoMTUpIHZlcnNpb24xMSAoMTEpfQorCisJRXh0ZW5zaW9uQ29udGFpbmVyCitGUk9NIE1BUC1FeHRlbnNpb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjExICgxMSl9Cis7CisKK1JvYW1pbmdOb3RBbGxvd2VkUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlyb2FtaW5nTm90QWxsb3dlZENhdXNlCVJvYW1pbmdOb3RBbGxvd2VkQ2F1c2UsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJYWRkaXRpb25hbFJvYW1pbmdOb3RBbGxvd2VkQ2F1c2UJWzBdIEFkZGl0aW9uYWxSb2FtaW5nTm90QWxsb3dlZENhdXNlIE9QVElPTkFMIH0KKworLS0JaWYgdGhlIGFkZGl0aW9uYWxSb2FtaW5nTm90YWxsb3dlZENhdXNlIGlzIHJlY2VpdmVkIGJ5IHRoZSBNU0MvVkxSIG9yIFNHU04gdGhlbiB0aGUgCistLQlyb2FtaW5nTm90QWxsb3dlZENhdXNlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworQWRkaXRpb25hbFJvYW1pbmdOb3RBbGxvd2VkQ2F1c2UgOjo9IEVOVU1FUkFURUQgeworCXN1cHBvcnRlZFJBVC1UeXBlc05vdEFsbG93ZWQgKDApLAorCS4uLn0KKworUm9hbWluZ05vdEFsbG93ZWRDYXVzZSA6Oj0gRU5VTUVSQVRFRCB7CisJcGxtblJvYW1pbmdOb3RBbGxvd2VkICAoMCksCisJb3BlcmF0b3JEZXRlcm1pbmVkQmFycmluZyAgKDMpfQorCitDYWxsQmFycmVkUGFyYW0gOjo9IENIT0lDRSB7CisJY2FsbEJhcnJpbmdDYXVzZQlDYWxsQmFycmluZ0NhdXNlLAorCS0tIGNhbGwgQmFycmluZ0NhdXNlIG11c3Qgbm90IGJlIHVzZWQgaW4gdmVyc2lvbiAzIGFuZCBoaWdoZXIKKwlleHRlbnNpYmxlQ2FsbEJhcnJlZFBhcmFtCUV4dGVuc2libGVDYWxsQmFycmVkUGFyYW0KKwktLSBleHRlbnNpYmxlQ2FsbEJhcnJlZFBhcmFtIG11c3Qgbm90IGJlIHVzZWQgaW4gdmVyc2lvbiA8MworCX0KKworQ2FsbEJhcnJpbmdDYXVzZSA6Oj0gRU5VTUVSQVRFRCB7CisJYmFycmluZ1NlcnZpY2VBY3RpdmUgICgwKSwKKwlvcGVyYXRvckJhcnJpbmcgICgxKX0KKworRXh0ZW5zaWJsZUNhbGxCYXJyZWRQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWNhbGxCYXJyaW5nQ2F1c2UJQ2FsbEJhcnJpbmdDYXVzZQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJdW5hdXRob3Jpc2VkTWVzc2FnZU9yaWdpbmF0b3IJWzFdIE5VTEwJCU9QVElPTkFMIH0KKworQ1VHLVJlamVjdFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJY3VnLVJlamVjdENhdXNlCUNVRy1SZWplY3RDYXVzZQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQ1VHLVJlamVjdENhdXNlIDo6PSBFTlVNRVJBVEVEIHsKKwlpbmNvbWluZ0NhbGxzQmFycmVkV2l0aGluQ1VHICAoMCksCisJc3Vic2NyaWJlck5vdE1lbWJlck9mQ1VHICAoMSksCisJcmVxdWVzdGVkQmFzaWNTZXJ2aWNlVmlvbGF0ZXNDVUctQ29uc3RyYWludHMgICg1KSwKKwljYWxsZWRQYXJ0eVNTLUludGVyYWN0aW9uVmlvbGF0aW9uICAoNyl9CisKK1NTLUluY29tcGF0aWJpbGl0eUNhdXNlIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJWzFdIFNTLUNvZGUJT1BUSU9OQUwsCisJYmFzaWNTZXJ2aWNlCUJhc2ljU2VydmljZUNvZGUJT1BUSU9OQUwsCisJc3MtU3RhdHVzCQlbNF0gU1MtU3RhdHVzCU9QVElPTkFMLAorCS4uLn0KKworUFctUmVnaXN0cmF0aW9uRmFpbHVyZUNhdXNlIDo6PSBFTlVNRVJBVEVEIHsKKwl1bmRldGVybWluZWQgICgwKSwKKwlpbnZhbGlkRm9ybWF0ICAoMSksCisJbmV3UGFzc3dvcmRzTWlzbWF0Y2ggICgyKX0KKworU00tRW51bWVyYXRlZERlbGl2ZXJ5RmFpbHVyZUNhdXNlIDo6PSBFTlVNRVJBVEVEIHsKKwltZW1vcnlDYXBhY2l0eUV4Y2VlZGVkICAoMCksCisJZXF1aXBtZW50UHJvdG9jb2xFcnJvciAgKDEpLAorCWVxdWlwbWVudE5vdFNNLUVxdWlwcGVkICAoMiksCisJdW5rbm93blNlcnZpY2VDZW50cmUgICgzKSwKKwlzYy1Db25nZXN0aW9uICAoNCksCisJaW52YWxpZFNNRS1BZGRyZXNzICAoNSksCisJc3Vic2NyaWJlck5vdFNDLVN1YnNjcmliZXIgICg2KX0KKworU00tRGVsaXZlcnlGYWlsdXJlQ2F1c2UgOjo9IFNFUVVFTkNFIHsKKwlzbS1FbnVtZXJhdGVkRGVsaXZlcnlGYWlsdXJlQ2F1c2UJU00tRW51bWVyYXRlZERlbGl2ZXJ5RmFpbHVyZUNhdXNlLAorCWRpYWdub3N0aWNJbmZvCVNpZ25hbEluZm8JT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0Fic2VudFN1YnNjcmliZXJTTS1QYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlPUFRJT05BTCwKKwktLSBBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIGNhbiBiZSBlaXRoZXIgZm9yIG5vbi1HUFJTIAorCS0tIG9yIGZvciBHUFJTCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJYWRkaXRpb25hbEFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gIAlbMF0gCUFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JT1BUSU9OQUwgfQorCS0tIGlmIHJlY2VpdmVkLCBhZGRpdGlvbmFsQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSAKKwktLSBpcyBmb3IgR1BSUyBhbmQgYWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSBpcyAKKwktLSBmb3Igbm9uLUdQUlMKKworQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSA6Oj0gSU5URUdFUiAoMC4uMjU1KQorCS0tIEFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gdmFsdWVzIGFyZSBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDQwCisKK1N5c3RlbUZhaWx1cmVQYXJhbSA6Oj0gQ0hPSUNFIHsKKwluZXR3b3JrUmVzb3VyY2UJTmV0d29ya1Jlc291cmNlLAorCS0tIG5ldHdvcmtSZXNvdXJjZSBtdXN0IG5vdCBiZSB1c2VkIGluIHZlcnNpb24gMworCWV4dGVuc2libGVTeXN0ZW1GYWlsdXJlUGFyYW0JRXh0ZW5zaWJsZVN5c3RlbUZhaWx1cmVQYXJhbQorCS0tIGV4dGVuc2libGVTeXN0ZW1GYWlsdXJlUGFyYW0gbXVzdCBub3QgYmUgdXNlZCBpbiB2ZXJzaW9uIDwzCisJfQorCitFeHRlbnNpYmxlU3lzdGVtRmFpbHVyZVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJbmV0d29ya1Jlc291cmNlCU5ldHdvcmtSZXNvdXJjZQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlhZGRpdGlvbmFsTmV0d29ya1Jlc291cmNlCVswXSBBZGRpdGlvbmFsTmV0d29ya1Jlc291cmNlCU9QVElPTkFMLAorCWZhaWx1cmVDYXVzZVBhcmFtCVsxXSBGYWlsdXJlQ2F1c2VQYXJhbQlPUFRJT05BTCB9CisKK0ZhaWx1cmVDYXVzZVBhcmFtIDo6PSBFTlVNRVJBVEVEIHsKKwlsaW1pdFJlYWNoZWRPbk51bWJlck9mQ29uY3VycmVudExvY2F0aW9uUmVxdWVzdHMgKDApLAorCS4uLiB9CisJLS0gaWYgdW5rbm93biB2YWx1ZSBpcyByZWNlaXZlZCBpbiBGYWlsdXJlQ2F1c2VQYXJhbSBpdCBzaGFsbCBiZSBpZ25vcmVkCisKKworRGF0YU1pc3NpbmdQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitVbmV4cGVjdGVkRGF0YVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0ZhY2lsaXR5Tm90U3VwUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlzaGFwZU9mTG9jYXRpb25Fc3RpbWF0ZU5vdFN1cHBvcnRlZCBbMF0JTlVMTAkJT1BUSU9OQUwsCisJbmVlZGVkTGNzQ2FwYWJpbGl0eU5vdFN1cHBvcnRlZEluU2VydmluZ05vZGUgWzFdIE5VTEwJT1BUSU9OQUwgfQorCitPUi1Ob3RBbGxvd2VkUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworVW5rbm93blN1YnNjcmliZXJQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCXVua25vd25TdWJzY3JpYmVyRGlhZ25vc3RpYwlVbmtub3duU3Vic2NyaWJlckRpYWdub3N0aWMJT1BUSU9OQUx9CisKK1Vua25vd25TdWJzY3JpYmVyRGlhZ25vc3RpYyA6Oj0gRU5VTUVSQVRFRCB7CisJaW1zaVVua25vd24gICgwKSwKKwlncHJzLWVwcy1TdWJzY3JpcHRpb25Vbmtub3duICAoMSksCisJLi4uLAorCW5wZGJNaXNtYXRjaCAgKDIpfQorCS0tIGlmIHVua25vd24gdmFsdWVzIGFyZSByZWNlaXZlZCBpbiAJCisJLS0gVW5rbm93blN1YnNjcmliZXJEaWFnbm9zdGljIHRoZXkgc2hhbGwgYmUgZGlzY2FyZGVkCisKK051bWJlckNoYW5nZWRQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitVbmlkZW50aWZpZWRTdWJQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitJbGxlZ2FsU3Vic2NyaWJlclBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0lsbGVnYWxFcXVpcG1lbnRQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitCZWFyZXJTZXJ2Tm90UHJvdlBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1RlbGVzZXJ2Tm90UHJvdlBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1RyYWNpbmdCdWZmZXJGdWxsUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTm9Sb2FtaW5nTmJQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitBYnNlbnRTdWJzY3JpYmVyUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlhYnNlbnRTdWJzY3JpYmVyUmVhc29uCVswXSBBYnNlbnRTdWJzY3JpYmVyUmVhc29uCU9QVElPTkFMfQorCitBYnNlbnRTdWJzY3JpYmVyUmVhc29uIDo6PSBFTlVNRVJBVEVEIHsKKwlpbXNpRGV0YWNoICgwKSwKKwlyZXN0cmljdGVkQXJlYSAoMSksCisJbm9QYWdlUmVzcG9uc2UgKDIpLAorCS4uLiAsCisJcHVyZ2VkTVMgKDMpfQorLS0gZXhjZXB0aW9uIGhhbmRsaW5nOiBhdCByZWNlcHRpb24gb2Ygb3RoZXIgdmFsdWVzIHRoYW4gdGhlIG9uZXMgbGlzdGVkIHRoZSAKKy0tIEFic2VudFN1YnNjcmliZXJSZWFzb24gc2hhbGwgYmUgaWdub3JlZC4gCistLSBUaGUgQWJzZW50U3Vic2NyaWJlclJlYXNvbjogcHVyZ2VkTVMgaXMgZGVmaW5lZCBmb3IgdGhlIFN1cGVyLUNoYXJnZXIgZmVhdHVyZSAKKy0tIChzZWUgVFMgMjMuMTE2KS4gSWYgdGhpcyB2YWx1ZSBpcyByZWNlaXZlZCBpbiBhIFByb3ZpZGUgUm9hbWluZyBOdW1iZXIgcmVzcG9uc2UKKy0tIGl0IHNoYWxsIGJlIG1hcHBlZCB0byB0aGUgQWJzZW50U3Vic2NyaWJlclJlYXNvbjogaW1zaURldGFjaCBpbiB0aGUgU2VuZCBSb3V0ZWluZworLS0gSW5mb3JtYXRpb24gcmVzcG9uc2UKKworQnVzeVN1YnNjcmliZXJQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWNjYnMtUG9zc2libGUJWzBdIE5VTEwJCU9QVElPTkFMLAorCWNjYnMtQnVzeQkJWzFdIE5VTEwJCU9QVElPTkFMfQorCitOb1N1YnNjcmliZXJSZXBseVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0ZvcndhcmRpbmdWaW9sYXRpb25QYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitGb3J3YXJkaW5nRmFpbGVkUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQVRJLU5vdEFsbG93ZWRQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitBVFNJLU5vdEFsbG93ZWRQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitBVE0tTm90QWxsb3dlZFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0lsbGVnYWxTUy1PcGVyYXRpb25QYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitTUy1Ob3RBdmFpbGFibGVQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitTUy1TdWJzY3JpcHRpb25WaW9sYXRpb25QYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitJbmZvcm1hdGlvbk5vdEF2YWlsYWJsZVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1N1YkJ1c3lGb3JNVC1TTVMtUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJZ3Byc0Nvbm5lY3Rpb25TdXNwZW5kZWQJTlVMTAkJCU9QVElPTkFMIH0KKwktLSBJZiBHcHJzQ29ubmVjdGlvblN1c3BlbmRlZCBpcyBub3QgdW5kZXJzdG9vZCBpdCBzaGFsbCAKKwktLSBiZSBkaXNjYXJkZWQKKworTWVzc2FnZVdhaXRMaXN0RnVsbFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1Jlc291cmNlTGltaXRhdGlvblBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK05vR3JvdXBDYWxsTmJQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitJbmNvbXBhdGlibGVUZXJtaW5hbFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1Nob3J0VGVybURlbmlhbFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJLi4ufQorCitMb25nVGVybURlbmlhbFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJLi4ufQorCitVbmF1dGhvcml6ZWRSZXF1ZXN0aW5nTmV0d29yay1QYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitVbmF1dGhvcml6ZWRMQ1NDbGllbnQtUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwl1bmF1dGhvcml6ZWRMQ1NDbGllbnQtRGlhZ25vc3RpYwlbMF0gVW5hdXRob3JpemVkTENTQ2xpZW50LURpYWdub3N0aWMJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxXSBFeHRlbnNpb25Db250YWluZXIJCQlPUFRJT05BTCwKKwkuLi4gfQorCitVbmF1dGhvcml6ZWRMQ1NDbGllbnQtRGlhZ25vc3RpYyA6Oj0gRU5VTUVSQVRFRCB7CisJbm9BZGRpdGlvbmFsSW5mb3JtYXRpb24gKDApLAorCWNsaWVudE5vdEluTVNQcml2YWN5RXhjZXB0aW9uTGlzdCAoMSksCisJY2FsbFRvQ2xpZW50Tm90U2V0dXAgKDIpLAorCXByaXZhY3lPdmVycmlkZU5vdEFwcGxpY2FibGUgKDMpLAorCWRpc2FsbG93ZWRCeUxvY2FsUmVndWxhdG9yeVJlcXVpcmVtZW50cyAoNCksCisJLi4uLAorCXVuYXV0aG9yaXplZFByaXZhY3lDbGFzcyAoNSksCisJdW5hdXRob3JpemVkQ2FsbFNlc3Npb25VbnJlbGF0ZWRFeHRlcm5hbENsaWVudCAoNiksCisJdW5hdXRob3JpemVkQ2FsbFNlc3Npb25SZWxhdGVkRXh0ZXJuYWxDbGllbnQgKDcpIH0KKy0tCWV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tCWFueSB1bnJlY29nbml6ZWQgdmFsdWUgc2hhbGwgYmUgaWdub3JlZAorCitQb3NpdGlvbk1ldGhvZEZhaWx1cmUtUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlwb3NpdGlvbk1ldGhvZEZhaWx1cmUtRGlhZ25vc3RpYwlbMF0gUG9zaXRpb25NZXRob2RGYWlsdXJlLURpYWdub3N0aWMJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxXSBFeHRlbnNpb25Db250YWluZXIJCQlPUFRJT05BTCwKKwkuLi4gfQorCitQb3NpdGlvbk1ldGhvZEZhaWx1cmUtRGlhZ25vc3RpYyA6Oj0gRU5VTUVSQVRFRCB7CisJY29uZ2VzdGlvbiAgKDApLAorCWluc3VmZmljaWVudFJlc291cmNlcyAgKDEpLAorCWluc3VmZmljaWVudE1lYXN1cmVtZW50RGF0YSAgKDIpLAorCWluY29uc2lzdGVudE1lYXN1cmVtZW50RGF0YSAgKDMpLAorCWxvY2F0aW9uUHJvY2VkdXJlTm90Q29tcGxldGVkICAoNCksCisJbG9jYXRpb25Qcm9jZWR1cmVOb3RTdXBwb3J0ZWRCeVRhcmdldE1TICAoNSksCisJcW9TTm90QXR0YWluYWJsZSAgKDYpLAorCXBvc2l0aW9uTWV0aG9kTm90QXZhaWxhYmxlSW5OZXR3b3JrCSg3KSwKKwlwb3NpdGlvbk1ldGhvZE5vdEF2YWlsYWJsZUluTG9jYXRpb25BcmVhCSg4KSwKKwkuLi4gfQorLS0JZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0JYW55IHVucmVjb2duaXplZCB2YWx1ZSBzaGFsbCBiZSBpZ25vcmVkCisKK1Vua25vd25PclVucmVhY2hhYmxlTENTQ2xpZW50LVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK01NLUV2ZW50Tm90U3VwcG9ydGVkLVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1RhcmdldENlbGxPdXRzaWRlR0NBLVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK09uZ29pbmdHcm91cENhbGxQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCisKK0VORAorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1FeHRlbnNpb25EYXRhVHlwZXMuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtRXh0ZW5zaW9uRGF0YVR5cGVzLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTRjMDU3Ci0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtRXh0ZW5zaW9uRGF0YVR5cGVzLmFzbgpAQCAtMCwwICsxLDc0IEBACistLSAkSWQ6IE1BUC1FeHRlbnNpb25EYXRhVHlwZXMuYXNuIDI4MTQ5IDIwMDktMDQtMjUgMTc6NDU6MzRaIGV0eHJhYiAkCistLSBNQVAtRXh0ZW5zaW9uRGF0YVR5cGVzLmFzbgorLS0KKy0tIFRha2VuIGZyb20gM0dQUCBUUyAyOS4wMDIgVjguOS4wICgyMDA5LTA0KQorLS0KKy0tIDE3LjcuMTEgRXh0ZW5zaW9uIGRhdGEgdHlwZXMKKy0tCisKK01BUC1FeHRlbnNpb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjExICgxMSl9CisKK0RFRklOSVRJT05TCisKK0lNUExJQ0lUIFRBR1MKKworOjo9CisKK0JFR0lOCisKK0VYUE9SVFMKKworCVByaXZhdGVFeHRlbnNpb24sCisJRXh0ZW5zaW9uQ29udGFpbmVyLAorCVNMUi1BcmdFeHRlbnNpb25Db250YWluZXI7CisKKworLS0gSU9DIGZvciBwcml2YXRlIE1BUCBleHRlbnNpb25zCisKKworTUFQLUVYVEVOU0lPTiAgOjo9IENMQVNTIHsKKwkmRXh0ZW5zaW9uVHlwZQkJCQlPUFRJT05BTCwKKwkmZXh0ZW5zaW9uSWQgCU9CSkVDVCBJREVOVElGSUVSIH0KKwktLSBUaGUgbGVuZ3RoIG9mIHRoZSBPYmplY3QgSWRlbnRpZmllciBzaGFsbCBub3QgZXhjZWVkIDE2IG9jdGV0cyBhbmQgdGhlCisJLS0gbnVtYmVyIG9mIGNvbXBvbmVudHMgb2YgdGhlIE9iamVjdCBJZGVudGlmaWVyIHNoYWxsIG5vdCBleGNlZWQgMTYKKworLS0gZGF0YSB0eXBlcworCitFeHRlbnNpb25Db250YWluZXIgOjo9IFNFUVVFTkNFIHsKKwlwcml2YXRlRXh0ZW5zaW9uTGlzdAlbMF1Qcml2YXRlRXh0ZW5zaW9uTGlzdAlPUFRJT05BTCwgCisJcGNzLUV4dGVuc2lvbnMJWzFdUENTLUV4dGVuc2lvbnMJT1BUSU9OQUwsCisJLi4ufQorCitTTFItQXJnRXh0ZW5zaW9uQ29udGFpbmVyIDo6PSBTRVFVRU5DRSB7CisJcHJpdmF0ZUV4dGVuc2lvbkxpc3QJWzBdUHJpdmF0ZUV4dGVuc2lvbkxpc3QJT1BUSU9OQUwsIAorCXNsci1BcmctUENTLUV4dGVuc2lvbnMJWzFdU0xSLUFyZy1QQ1MtRXh0ZW5zaW9ucwlPUFRJT05BTCwKKwkuLi59CisKK1ByaXZhdGVFeHRlbnNpb25MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlByaXZhdGVFeHRlbnNpb25zKSBPRgorCQkJCVByaXZhdGVFeHRlbnNpb24KKworUHJpdmF0ZUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgeworCWV4dElkCQlNQVAtRVhURU5TSU9OLiZleHRlbnNpb25JZAorCQkJCSh7RXh0ZW5zaW9uU2V0fSksCisJZXh0VHlwZQkJTUFQLUVYVEVOU0lPTi4mRXh0ZW5zaW9uVHlwZQorCQkJCSh7RXh0ZW5zaW9uU2V0fXtAZXh0SWR9KQlPUFRJT05BTH0KKworbWF4TnVtT2ZQcml2YXRlRXh0ZW5zaW9ucyAgSU5URUdFUiA6Oj0gMTAKKworRXh0ZW5zaW9uU2V0CQlNQVAtRVhURU5TSU9OIDo6PQorCQl7Li4uCisJCSAtLSBFeHRlbnNpb25TZXQgaXMgdGhlIHNldCBvZiBhbGwgZGVmaW5lZCBwcml2YXRlIGV4dGVuc2lvbnMKKwl9CisJLS0gVW5zdXBwb3J0ZWQgcHJpdmF0ZSBleHRlbnNpb25zIHNoYWxsIGJlIGRpc2NhcmRlZCBpZiByZWNlaXZlZC4KKworUENTLUV4dGVuc2lvbnMgOjo9IFNFUVVFTkNFIHsKKwkuLi59CisKK1NMUi1BcmctUENTLUV4dGVuc2lvbnMgOjo9IFNFUVVFTkNFIHsKKwkuLi4sCisJbmEtRVNSSy1SZXF1ZXN0CVswXQlOVUxMCQlPUFRJT05BTCB9CisKK0VORAorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1MQ1MtRGF0YVR5cGVzLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUxDUy1EYXRhVHlwZXMuYXNuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MzRiODkKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1MQ1MtRGF0YVR5cGVzLmFzbgpAQCAtMCwwICsxLDY1NyBAQAorLS0gJElkOiBNQVAtTENTLURhdGFUeXBlcy5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKKy0tIE1BUC1MQ1MtRGF0YVR5cGVzLmFzbgorLS0KKy0tIFRha2VuIGZyb20gM0dQUCBUUyAyOS4wMDIgIFY4LjkuMCAoMjAwOS0wNCkKKy0tCistLSAxNy43LjEzIExvY2F0aW9uIHNlcnZpY2UgZGF0YSB0eXBlcworLS0KKworTUFQLUxDUy1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtTENTLURhdGFUeXBlcyAoMjUpIHZlcnNpb24xMSAoMTEpfQorCitERUZJTklUSU9OUworSU1QTElDSVQgVEFHUworOjo9CitCRUdJTgorCitFWFBPUlRTCisJUm91dGluZ0luZm9Gb3JMQ1MtQXJnLAorCVJvdXRpbmdJbmZvRm9yTENTLVJlcywKKwlQcm92aWRlU3Vic2NyaWJlckxvY2F0aW9uLUFyZywKKwlQcm92aWRlU3Vic2NyaWJlckxvY2F0aW9uLVJlcywKKwlTdWJzY3JpYmVyTG9jYXRpb25SZXBvcnQtQXJnLAorCVN1YnNjcmliZXJMb2NhdGlvblJlcG9ydC1SZXMsCitMb2NhdGlvblR5cGUsIAorRGVmZXJyZWRMb2NhdGlvbkV2ZW50VHlwZSwKK0xDU0NsaWVudE5hbWUsCitMQ1MtUW9TLAorSG9yaXpvbnRhbC1BY2N1cmFjeSwKK1Jlc3BvbnNlVGltZSwKK0V4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiwgCitWZWxvY2l0eUVzdGltYXRlLAorU3VwcG9ydGVkR0FEU2hhcGVzLAorQWRkLUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uLAorTENTUmVxdWVzdG9ySUQsIAorTENTLVJlZmVyZW5jZU51bWJlciwKK0xDU0NvZGV3b3JkLAorQXJlYUV2ZW50SW5mbywKK1JlcG9ydGluZ1BMTU5MaXN0LAorUGVyaW9kaWNMRFJJbmZvLAorU2VxdWVuY2VOdW1iZXIKKzsKKworSU1QT1JUUworCUFkZHJlc3NTdHJpbmcsCisJSVNETi1BZGRyZXNzU3RyaW5nLAorCUlNRUksCisJSU1TSSwKKwlMTVNJLAorCVN1YnNjcmliZXJJZGVudGl0eSwKKwlBZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24sCisJTENTQ2xpZW50RXh0ZXJuYWxJRCwKKwlMQ1NDbGllbnRJbnRlcm5hbElELAorTENTU2VydmljZVR5cGVJRCwKK0NlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJLAorUExNTi1JZAorRlJPTSBNQVAtQ29tbW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUNvbW1vbkRhdGFUeXBlcyAoMTgpIHZlcnNpb24xMSAoMTEpfQorCisJRXh0ZW5zaW9uQ29udGFpbmVyLAorCVNMUi1BcmdFeHRlbnNpb25Db250YWluZXIKK0ZST00gTUFQLUV4dGVuc2lvbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KKworCVVTU0QtRGF0YUNvZGluZ1NjaGVtZSwKK1VTU0QtU3RyaW5nCitGUk9NIE1BUC1TUy1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpCisgICBtYXAtU1MtRGF0YVR5cGVzICgxNCkgdmVyc2lvbjExICgxMSl9CisKKwlBUE4sCisJR1NOLUFkZHJlc3MsCisJU3VwcG9ydGVkTENTLUNhcGFiaWxpdHlTZXRzCitGUk9NIE1BUC1NUy1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtTVMtRGF0YVR5cGVzICgxMSkgdmVyc2lvbjExICgxMSl9CisKKwlBZGRpdGlvbmFsLU51bWJlcgorRlJPTSBNQVAtU00tRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVNNLURhdGFUeXBlcyAoMTYpIHZlcnNpb24xMSAoMTEpfQorOworCisKK1JvdXRpbmdJbmZvRm9yTENTLUFyZyA6Oj0gU0VRVUVOQ0UgeworCW1sY051bWJlcgkJWzBdIElTRE4tQWRkcmVzc1N0cmluZywKKwl0YXJnZXRNUwkJWzFdIFN1YnNjcmliZXJJZGVudGl0eSwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1JvdXRpbmdJbmZvRm9yTENTLVJlcyA6Oj0gU0VRVUVOQ0UgeworCXRhcmdldE1TCQlbMF0gU3Vic2NyaWJlcklkZW50aXR5LAorCWxjc0xvY2F0aW9uSW5mbwlbMV0gTENTTG9jYXRpb25JbmZvLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwl2LWdtbGMtQWRkcmVzcwlbM10JR1NOLUFkZHJlc3MJT1BUSU9OQUwsCisJaC1nbWxjLUFkZHJlc3MJWzRdCUdTTi1BZGRyZXNzCU9QVElPTkFMLAorCXBwci1BZGRyZXNzCVs1XQlHU04tQWRkcmVzcwlPUFRJT05BTCwKKwlhZGRpdGlvbmFsLXYtZ21sYy1BZGRyZXNzCVs2XQlHU04tQWRkcmVzcwlPUFRJT05BTCB9CisKK0xDU0xvY2F0aW9uSW5mbyA6Oj0gU0VRVUVOQ0UgeworCW5ldHdvcmtOb2RlLU51bWJlcglJU0ROLUFkZHJlc3NTdHJpbmcsCisJLS0gTmV0d29ya05vZGUtbnVtYmVyIGNhbiBiZSBlaXRoZXIgbXNjLW51bWJlciBvciBzZ3NuLW51bWJlcgorCWxtc2kJCQlbMF0gTE1TSQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlncHJzTm9kZUluZGljYXRvciAJWzJdIE5VTEwJCU9QVElPTkFMLAorCS0tIGdwcnNOb2RlSW5kaWNhdG9yIGlzIHNldCBvbmx5IGlmIHRoZSBTR1NOIG51bWJlciBpcyBzZW50IGFzIHRoZSBOZXR3b3JrIE5vZGUgTnVtYmVyCisJYWRkaXRpb25hbC1OdW1iZXIJWzNdIEFkZGl0aW9uYWwtTnVtYmVyCU9QVElPTkFMLAorCXN1cHBvcnRlZExDUy1DYXBhYmlsaXR5U2V0cwlbNF0JU3VwcG9ydGVkTENTLUNhcGFiaWxpdHlTZXRzCU9QVElPTkFMLAorCWFkZGl0aW9uYWwtTENTLUNhcGFiaWxpdHlTZXRzCVs1XQlTdXBwb3J0ZWRMQ1MtQ2FwYWJpbGl0eVNldHMJT1BUSU9OQUwKKwl9CisKK1Byb3ZpZGVTdWJzY3JpYmVyTG9jYXRpb24tQXJnIDo6PSBTRVFVRU5DRSB7CisJbG9jYXRpb25UeXBlCUxvY2F0aW9uVHlwZSwKKwltbGMtTnVtYmVyCUlTRE4tQWRkcmVzc1N0cmluZywKKwlsY3MtQ2xpZW50SUQJWzBdIExDUy1DbGllbnRJRAlPUFRJT05BTCwKKwlwcml2YWN5T3ZlcnJpZGUJWzFdIE5VTEwJCU9QVElPTkFMLAorCWltc2kJCQlbMl0gSU1TSQkJT1BUSU9OQUwsCisJbXNpc2RuCQlbM10gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWxtc2kJCQlbNF0gTE1TSQkJT1BUSU9OQUwsCisJaW1laQkJCVs1XSBJTUVJCQlPUFRJT05BTCwKKwlsY3MtUHJpb3JpdHkJWzZdIExDUy1Qcmlvcml0eQlPUFRJT05BTCwKKwlsY3MtUW9TCQlbN10gTENTLVFvUwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzhdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCXN1cHBvcnRlZEdBRFNoYXBlcwlbOV0JU3VwcG9ydGVkR0FEU2hhcGVzCU9QVElPTkFMLAorCWxjcy1SZWZlcmVuY2VOdW1iZXIJWzEwXQlMQ1MtUmVmZXJlbmNlTnVtYmVyCU9QVElPTkFMLAorCWxjc1NlcnZpY2VUeXBlSUQJWzExXQlMQ1NTZXJ2aWNlVHlwZUlECU9QVElPTkFMLAorCWxjc0NvZGV3b3JkCVsxMl0JTENTQ29kZXdvcmQJT1BUSU9OQUwsCisJbGNzLVByaXZhY3lDaGVjawlbMTNdCUxDUy1Qcml2YWN5Q2hlY2sJT1BUSU9OQUwsCisJYXJlYUV2ZW50SW5mbwlbMTRdCUFyZWFFdmVudEluZm8JT1BUSU9OQUwsCisJaC1nbWxjLUFkZHJlc3MJWzE1XQlHU04tQWRkcmVzcwlPUFRJT05BTCwKKwltby1sclNob3J0Q2lyY3VpdEluZGljYXRvcglbMTZdIE5VTEwJCU9QVElPTkFMLAorCXBlcmlvZGljTERSSW5mbwlbMTddIFBlcmlvZGljTERSSW5mbwlPUFRJT05BTCwKKwlyZXBvcnRpbmdQTE1OTGlzdAlbMThdIFJlcG9ydGluZ1BMTU5MaXN0CU9QVElPTkFMIH0KKworCS0tIG9uZSBvZiBpbXNpIG9yIG1zaXNkbiBpcyBtYW5kYXRvcnkKKwktLSBJZiBhIGxvY2F0aW9uIGVzdGltYXRlIHR5cGUgaW5kaWNhdGVzIGFjdGl2YXRlIGRlZmVycmVkIGxvY2F0aW9uIG9yIGNhbmNlbCBkZWZlcnJlZCAKKwktLSBsb2NhdGlvbiwgYSBsY3MtUmVmZXJlbmNlIG51bWJlciBzaGFsbCBiZSBpbmNsdWRlZC4KKworTG9jYXRpb25UeXBlIDo6PSBTRVFVRU5DRSB7CisJbG9jYXRpb25Fc3RpbWF0ZVR5cGUJWzBdIExvY2F0aW9uRXN0aW1hdGVUeXBlLAorCS4uLiwKKwlkZWZlcnJlZExvY2F0aW9uRXZlbnRUeXBlCVsxXSBEZWZlcnJlZExvY2F0aW9uRXZlbnRUeXBlCU9QVElPTkFMIH0KKworTG9jYXRpb25Fc3RpbWF0ZVR5cGUgOjo9IEVOVU1FUkFURUQgeworCWN1cnJlbnRMb2NhdGlvbgkoMCksCisJY3VycmVudE9yTGFzdEtub3duTG9jYXRpb24JKDEpLAorCWluaXRpYWxMb2NhdGlvbgkoMiksCisJLi4uLAorCWFjdGl2YXRlRGVmZXJyZWRMb2NhdGlvbgkoMyksCisJY2FuY2VsRGVmZXJyZWRMb2NhdGlvbgkoNCkgLAorCW5vdGlmaWNhdGlvblZlcmlmaWNhdGlvbk9ubHkJKDUpIH0KKy0tCWV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tCWEgUHJvdmlkZVN1YnNjcmliZXJMb2NhdGlvbi1BcmcgY29udGFpbmluZyBhbiB1bnJlY29nbml6ZWQgTG9jYXRpb25Fc3RpbWF0ZVR5cGUKKy0tCXNoYWxsIGJlIHJlamVjdGVkIGJ5IHRoZSByZWNlaXZlciB3aXRoIGEgcmV0dXJuIGVycm9yIGNhdXNlIG9mIHVuZXhwZWN0ZWQgZGF0YSB2YWx1ZQorCitEZWZlcnJlZExvY2F0aW9uRXZlbnRUeXBlIDo6PSBCSVQgU1RSSU5HIHsKKwltc0F2YWlsYWJsZQkoMCkgLAorCWVudGVyaW5nSW50b0FyZWEJKDEpLAorCWxlYXZpbmdGcm9tQXJlYQkoMiksCisJYmVpbmdJbnNpZGVBcmVhCSgzKSAsCisJcGVyaW9kaWNMRFIJKDQpICB9IChTSVpFICgxLi4xNikpIAorLS0gYmVpbmdJbnNpZGVBcmVhIGlzIGFsd2F5cyB0cmVhdGVkIGFzIG9uZVRpbWVFdmVudCByZWdhcmRsZXNzIG9mIHRoZSBwb3NzaWJsZSB2YWx1ZQorLS0gb2Ygb2NjdXJyZW5jZUluZm8gaW5zaWRlIGFyZWFFdmVudEluZm8uCistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSBhIFByb3ZpZGVTdWJzY3JpYmVyTG9jYXRpb24tQXJnIGNvbnRhaW5pbmcgb3RoZXIgdmFsdWVzIHRoYW4gbGlzdGVkIGFib3ZlIGluIAorLS0gRGVmZXJyZWRMb2NhdGlvbkV2ZW50VHlwZSBzaGFsbCBiZSByZWplY3RlZCBieSB0aGUgcmVjZWl2ZXIgd2l0aCBhIHJldHVybiBlcnJvciBjYXVzZSBvZiAKKy0tIHVuZXhwZWN0ZWQgZGF0YSB2YWx1ZS4KKworTENTLUNsaWVudElEIDo6PSBTRVFVRU5DRSB7CisJbGNzQ2xpZW50VHlwZQlbMF0gTENTQ2xpZW50VHlwZSwKKwlsY3NDbGllbnRFeHRlcm5hbElECVsxXSBMQ1NDbGllbnRFeHRlcm5hbElECU9QVElPTkFMLAorCWxjc0NsaWVudERpYWxlZEJ5TVMJWzJdIEFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJbGNzQ2xpZW50SW50ZXJuYWxJRAlbM10gTENTQ2xpZW50SW50ZXJuYWxJRAlPUFRJT05BTCwKKwlsY3NDbGllbnROYW1lCVs0XSBMQ1NDbGllbnROYW1lCU9QVElPTkFMLAorCS4uLiwKKwlsY3NBUE4JCVs1XSBBUE4JCU9QVElPTkFMLAorCWxjc1JlcXVlc3RvcklECVs2XSBMQ1NSZXF1ZXN0b3JJRAlPUFRJT05BTCB9CisKK0xDU0NsaWVudFR5cGUgOjo9IEVOVU1FUkFURUQgeworCWVtZXJnZW5jeVNlcnZpY2VzCSgwKSwKKwl2YWx1ZUFkZGVkU2VydmljZXMJKDEpLAorCXBsbW5PcGVyYXRvclNlcnZpY2VzCSgyKSwKKwlsYXdmdWxJbnRlcmNlcHRTZXJ2aWNlcwkoMyksCisJLi4uIH0KKwktLQlleGNlcHRpb24gaGFuZGxpbmc6CisJLS0JdW5yZWNvZ25pemVkIHZhbHVlcyBtYXkgYmUgaWdub3JlZCBpZiB0aGUgTENTIGNsaWVudCB1c2VzIHRoZSBwcml2YWN5IG92ZXJyaWRlCisJLS0Jb3RoZXJ3aXNlLCBhbiB1bnJlY29nbml6ZWQgdmFsdWUgc2hhbGwgYmUgdHJlYXRlZCBhcyB1bmV4cGVjdGVkIGRhdGEgYnkgYSByZWNlaXZlcgorCS0tCWEgcmV0dXJuIGVycm9yIHNoYWxsIHRoZW4gYmUgcmV0dXJuZWQgaWYgcmVjZWl2ZWQgaW4gYSBNQVAgaW52b2tlIAorCitMQ1NDbGllbnROYW1lIDo6PSBTRVFVRU5DRSB7CisJZGF0YUNvZGluZ1NjaGVtZQlbMF0gVVNTRC1EYXRhQ29kaW5nU2NoZW1lLAorCW5hbWVTdHJpbmcJWzJdIE5hbWVTdHJpbmcsCisJLi4uLAorCWxjcy1Gb3JtYXRJbmRpY2F0b3IJWzNdIExDUy1Gb3JtYXRJbmRpY2F0b3IJT1BUSU9OQUwgfQorCistLSBUaGUgVVNTRC1EYXRhQ29kaW5nU2NoZW1lIHNoYWxsIGluZGljYXRlIHVzZSBvZiB0aGUgZGVmYXVsdCBhbHBoYWJldCB0aHJvdWdoIHRoZQorLS0gZm9sbG93aW5nIGVuY29kaW5nCistLQliaXQJNyA2IDUgNCAzIDIgMSAwCistLQkJMCAwIDAgMCAxIDEgMSAxCisKK05hbWVTdHJpbmcgOjo9IFVTU0QtU3RyaW5nIChTSVpFICgxLi5tYXhOYW1lU3RyaW5nTGVuZ3RoKSkKKworbWF4TmFtZVN0cmluZ0xlbmd0aCAgSU5URUdFUiA6Oj0gNjMKKworTENTUmVxdWVzdG9ySUQgOjo9IFNFUVVFTkNFIHsKKwlkYXRhQ29kaW5nU2NoZW1lCVswXSBVU1NELURhdGFDb2RpbmdTY2hlbWUsCisJcmVxdWVzdG9ySURTdHJpbmcJWzFdIFJlcXVlc3RvcklEU3RyaW5nLAorCS4uLiwKKwlsY3MtRm9ybWF0SW5kaWNhdG9yCVsyXSBMQ1MtRm9ybWF0SW5kaWNhdG9yCU9QVElPTkFMIH0KKworUmVxdWVzdG9ySURTdHJpbmcgOjo9IFVTU0QtU3RyaW5nIChTSVpFICgxLi5tYXhSZXF1ZXN0b3JJRFN0cmluZ0xlbmd0aCkpCisKK21heFJlcXVlc3RvcklEU3RyaW5nTGVuZ3RoICBJTlRFR0VSIDo6PSA2MworCitMQ1MtRm9ybWF0SW5kaWNhdG9yIDo6PSBFTlVNRVJBVEVEIHsKKwlsb2dpY2FsTmFtZQkoMCksCisJZS1tYWlsQWRkcmVzcwkoMSksCisJbXNpc2RuCQkoMiksCisJdXJsCQkJKDMpLAorCXNpcFVybAkJKDQpLAorCS4uLiB9CisKK0xDUy1Qcmlvcml0eSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSAwID0gaGlnaGVzdCBwcmlvcml0eQorCS0tIDEgPSBub3JtYWwgcHJpb3JpdHkKKwktLSBhbGwgb3RoZXIgdmFsdWVzIHRyZWF0ZWQgYXMgMSAKKworTENTLVFvUyA6Oj0gU0VRVUVOQ0UgeworCWhvcml6b250YWwtYWNjdXJhY3kJWzBdIEhvcml6b250YWwtQWNjdXJhY3kJT1BUSU9OQUwsCisJdmVydGljYWxDb29yZGluYXRlUmVxdWVzdAlbMV0gTlVMTAkJT1BUSU9OQUwsCisJdmVydGljYWwtYWNjdXJhY3kJWzJdIFZlcnRpY2FsLUFjY3VyYWN5CU9QVElPTkFMLAlyZXNwb25zZVRpbWUJWzNdIFJlc3BvbnNlVGltZQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJdmVsb2NpdHlSZXF1ZXN0CVs1XSBOVUxMCQlPUFRJT05BTAorfQorCitIb3Jpem9udGFsLUFjY3VyYWN5IDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIGJpdCA4ID0gMAorCS0tIGJpdHMgNy0xID0gNyBiaXQgVW5jZXJ0YWludHkgQ29kZSBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyLiBUaGUgaG9yaXpvbnRhbCBsb2NhdGlvbiAKKwktLSBlcnJvciBzaG91bGQgYmUgbGVzcyB0aGFuIHRoZSBlcnJvciBpbmRpY2F0ZWQgYnkgdGhlIHVuY2VydGFpbnR5IGNvZGUgd2l0aCA2NyUKKwktLSBjb25maWRlbmNlLgorCitWZXJ0aWNhbC1BY2N1cmFjeSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBiaXQgOCA9IDAKKwktLSBiaXRzIDctMSA9IDcgYml0IFZlcnRpY2FsIFVuY2VydGFpbnR5IENvZGUgZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMi4gCisJLS0gVGhlIHZlcnRpY2FsIGxvY2F0aW9uIGVycm9yIHNob3VsZCBiZSBsZXNzIHRoYW4gdGhlIGVycm9yIGluZGljYXRlZCAKKwktLSBieSB0aGUgdW5jZXJ0YWludHkgY29kZSB3aXRoIDY3JSBjb25maWRlbmNlLgorCitSZXNwb25zZVRpbWUgOjo9IFNFUVVFTkNFIHsKKwlyZXNwb25zZVRpbWVDYXRlZ29yeQlSZXNwb25zZVRpbWVDYXRlZ29yeSwKKwkuLi59CistLQlub3RlOiBhbiBleHBhbmRhYmxlIFNFUVVFTkNFIHNpbXBsaWZpZXMgbGF0ZXIgYWRkaXRpb24gb2YgYSBudW1lcmljIHJlc3BvbnNlIHRpbWUuCisKK1Jlc3BvbnNlVGltZUNhdGVnb3J5IDo6PSBFTlVNRVJBVEVEIHsKKwlsb3dkZWxheSAgKDApLAorCWRlbGF5dG9sZXJhbnQgICgxKSwKKwkuLi4gfQorLS0JZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0JYW4gdW5yZWNvZ25pemVkIHZhbHVlIHNoYWxsIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgdmFsdWUgMSAoZGVsYXl0b2xlcmFudCkKKworU3VwcG9ydGVkR0FEU2hhcGVzIDo6PSBCSVQgU1RSSU5HIHsKKwllbGxpcHNvaWRQb2ludCAgKDApLAorCWVsbGlwc29pZFBvaW50V2l0aFVuY2VydGFpbnR5Q2lyY2xlICgxKSwKKwllbGxpcHNvaWRQb2ludFdpdGhVbmNlcnRhaW50eUVsbGlwc2UgKDIpLAorCXBvbHlnb24gKDMpLAorCWVsbGlwc29pZFBvaW50V2l0aEFsdGl0dWRlICg0KSwKKwllbGxpcHNvaWRQb2ludFdpdGhBbHRpdHVkZUFuZFVuY2VydGFpbnR5RWxpcHNvaWQgKDUpLAorCWVsbGlwc29pZEFyYyAgKDYpIH0gKFNJWkUgKDcuLjE2KSkKKy0tIEEgbm9kZSBzaGFsbCBtYXJrIGluIHRoZSBCSVQgU1RSSU5HIGFsbCBTaGFwZXMgZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMiBpdCBzdXBwb3J0cy4KKy0tIGV4Y2VwdGlvbiBoYW5kbGluZzogYml0cyA3IHRvIDE1IHNoYWxsIGJlIGlnbm9yZWQgaWYgcmVjZWl2ZWQuCisKK0xDUy1SZWZlcmVuY2VOdW1iZXI6Oj0gT0NURVQgU1RSSU5HIChTSVpFKDEpKQorCitMQ1NDb2Rld29yZCA6Oj0gU0VRVUVOQ0UgeworCWRhdGFDb2RpbmdTY2hlbWUJWzBdIFVTU0QtRGF0YUNvZGluZ1NjaGVtZSwKKwlsY3NDb2Rld29yZFN0cmluZwlbMV0gTENTQ29kZXdvcmRTdHJpbmcsCisJLi4ufQorCitMQ1NDb2Rld29yZFN0cmluZyA6Oj0gVVNTRC1TdHJpbmcgKFNJWkUgKDEuLm1heExDU0NvZGV3b3JkU3RyaW5nTGVuZ3RoKSkKKworbWF4TENTQ29kZXdvcmRTdHJpbmdMZW5ndGggIElOVEVHRVIgOjo9IDIwCisKK0xDUy1Qcml2YWN5Q2hlY2sgOjo9IFNFUVVFTkNFIHsKKwljYWxsU2Vzc2lvblVucmVsYXRlZAlbMF0gUHJpdmFjeUNoZWNrUmVsYXRlZEFjdGlvbiwKKwljYWxsU2Vzc2lvblJlbGF0ZWQJWzFdIFByaXZhY3lDaGVja1JlbGF0ZWRBY3Rpb24JT1BUSU9OQUwsCisJLi4ufQorCitQcml2YWN5Q2hlY2tSZWxhdGVkQWN0aW9uIDo6PSBFTlVNRVJBVEVEIHsKKwlhbGxvd2VkV2l0aG91dE5vdGlmaWNhdGlvbiAoMCksCisJYWxsb3dlZFdpdGhOb3RpZmljYXRpb24gKDEpLAorCWFsbG93ZWRJZk5vUmVzcG9uc2UgKDIpLAorCXJlc3RyaWN0ZWRJZk5vUmVzcG9uc2UgKDMpLAorCW5vdEFsbG93ZWQgKDQpLAorCS4uLn0KKy0tCWV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tCWEgUHJvdmlkZVN1YnNjcmliZXJMb2NhdGlvbi1BcmcgY29udGFpbmluZyBhbiB1bnJlY29nbml6ZWQgUHJpdmFjeUNoZWNrUmVsYXRlZEFjdGlvbgorLS0Jc2hhbGwgYmUgcmVqZWN0ZWQgYnkgdGhlIHJlY2VpdmVyIHdpdGggYSByZXR1cm4gZXJyb3IgY2F1c2Ugb2YgdW5leHBlY3RlZCBkYXRhIHZhbHVlCisKK0FyZWFFdmVudEluZm8gOjo9IFNFUVVFTkNFIHsKKwlhcmVhRGVmaW5pdGlvbglbMF0JQXJlYURlZmluaXRpb24sCisJb2NjdXJyZW5jZUluZm8JWzFdCU9jY3VycmVuY2VJbmZvCU9QVElPTkFMLAorCWludGVydmFsVGltZQlbMl0JSW50ZXJ2YWxUaW1lCU9QVElPTkFMLAorCS4uLn0KKworQXJlYURlZmluaXRpb24gOjo9IFNFUVVFTkNFIHsKKwlhcmVhTGlzdAkJWzBdCUFyZWFMaXN0LAorCS4uLn0KKworQXJlYUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQXJlYXMpIE9GIEFyZWEKKworbWF4TnVtT2ZBcmVhcyAgSU5URUdFUiA6Oj0gMTAKKworQXJlYSA6Oj0gU0VRVUVOQ0UgeworCWFyZWFUeXBlCQlbMF0JQXJlYVR5cGUsCisJYXJlYUlkZW50aWZpY2F0aW9uCVsxXQlBcmVhSWRlbnRpZmljYXRpb24sCisJLi4ufQorCitBcmVhVHlwZSA6Oj0gRU5VTUVSQVRFRCB7CisJY291bnRyeUNvZGUJKDApLAorCXBsbW5JZAkJKDEpLAorCWxvY2F0aW9uQXJlYUlkCSgyKSwKKwlyb3V0aW5nQXJlYUlkCSgzKSwKKwljZWxsR2xvYmFsSWQJKDQpLAorCS4uLiwKKwl1dHJhbkNlbGxJZAkoNSkgfQorCitBcmVhSWRlbnRpZmljYXRpb24gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMi4uNykpCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisJLS0gb2N0ZXQgMSBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAxc3QgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgQ291bnRyeSBDb2RlIDJuZCBkaWdpdAorCS0tIG9jdGV0IDIgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgM3JkIGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAzcmQgZGlnaXQgaWYgMyBkaWdpdCBNTkMgaW5jbHVkZWQKKwktLQkJCW9yIGZpbGxlciAoMTExMSkKKwktLSBvY3RldCAzIGJpdHMgNDMyMQlNb2JpbGUgTmV0d29yayBDb2RlIDFzdCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgMm5kIGRpZ2l0CisJLS0gb2N0ZXRzIDQgYW5kIDUJTG9jYXRpb24gQXJlYSBDb2RlIChMQUMpIGZvciBMb2NhbCBBcmVhIElkLAorCS0tCQkJUm91dGluZyBBcmVhIElkIGFuZCBDZWxsIEdsb2JhbCBJZAorCS0tIG9jdGV0IDYJUm91dGluZyBBcmVhIENvZGUgKFJBQykgZm9yIFJvdXRpbmcgQXJlYSBJZAorCS0tIG9jdGV0cyA2IGFuZCA3CUNlbGwgSWRlbnRpdHkgKENJKSBmb3IgQ2VsbCBHbG9iYWwgSWQKKwktLSBvY3RldHMgNCB1bnRpbCA3CVV0cmFuIENlbGwgSWRlbnRpdHkgKFVDLUlkKSBmb3IgVXRyYW4gQ2VsbCBJZAorCitPY2N1cnJlbmNlSW5mbyA6Oj0gRU5VTUVSQVRFRCB7CisJb25lVGltZUV2ZW50CSgwKSwKKwltdWx0aXBsZVRpbWVFdmVudAkoMSksCisJLi4ufQorCitJbnRlcnZhbFRpbWUgOjo9IElOVEVHRVIgKDEuLjMyNzY3KQorCS0tIG1pbmltdW0gaW50ZXJ2YWwgdGltZSBiZXR3ZWVuIGFyZWEgcmVwb3J0cyBpbiBzZWNvbmRzCisKK1BlcmlvZGljTERSSW5mbyA6Oj0gU0VRVUVOQ0UgeworCXJlcG9ydGluZ0Ftb3VudAkJUmVwb3J0aW5nQW1vdW50LAorCXJlcG9ydGluZ0ludGVydmFsCVJlcG9ydGluZ0ludGVydmFsLAorCS4uLn0KKy0tIHJlcG9ydGluZ0ludGVydmFsIHggcmVwb3J0aW5nQW1vdW50IHNoYWxsIG5vdCBleGNlZWQgODYzOTk5OSAoOTkgZGF5cywgMjMgaG91cnMsCistLSA1OSBtaW51dGVzIGFuZCA1OSBzZWNvbmRzKSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIE9NQSBNTFAgYW5kIFJMUAorCitSZXBvcnRpbmdBbW91bnQgOjo9IElOVEVHRVIgKDEuLm1heFJlcG9ydGluZ0Ftb3VudCkKKworbWF4UmVwb3J0aW5nQW1vdW50IElOVEVHRVIgOjo9IDg2Mzk5OTkKKworUmVwb3J0aW5nSW50ZXJ2YWwgOjo9IElOVEVHRVIgKDEuLm1heFJlcG9ydGluZ0ludGVydmFsKQorLS0gUmVwb3J0aW5nSW50ZXJ2YWwgaXMgaW4gc2Vjb25kcworCittYXhSZXBvcnRpbmdJbnRlcnZhbCBJTlRFR0VSIDo6PSA4NjM5OTk5CisKK1JlcG9ydGluZ1BMTU5MaXN0Ojo9IFNFUVVFTkNFIHsKKwlwbG1uLUxpc3RQcmlvcml0aXplZAkJCVswXSBOVUxMCQkJCQlPUFRJT05BTCwKKwlwbG1uLUxpc3QgCQkJCQkJWzFdIFBMTU5MaXN0LAorCS4uLn0KKworUExNTkxpc3Q6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZSZXBvcnRpbmdQTE1OKSBPRgorCQkJCVJlcG9ydGluZ1BMTU4KKworbWF4TnVtT2ZSZXBvcnRpbmdQTE1OIElOVEVHRVIgOjo9IDIwCisKK1JlcG9ydGluZ1BMTU46Oj0gU0VRVUVOQ0UgeworCXBsbW4tSWQgCQkJCQkJWzBdIFBMTU4tSWQsCisJcmFuLVRlY2hub2xvZ3kgCQkJCQlbMV0gUkFOLVRlY2hub2xvZ3kJCQlPUFRJT05BTCwKKwlyYW4tUGVyaW9kaWNMb2NhdGlvblN1cHBvcnQJCVsyXSBOVUxMCQkJCQlPUFRJT05BTCwKKwkuLi59CisKK1JBTi1UZWNobm9sb2d5IDo6PSBFTlVNRVJBVEVEIHsKKwlnc20JCQkoMCksCisJdW10cwkJKDEpLAorCS4uLn0KKworUHJvdmlkZVN1YnNjcmliZXJMb2NhdGlvbi1SZXMgOjo9IFNFUVVFTkNFIHsKKwlsb2NhdGlvbkVzdGltYXRlCUV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiwKKwlhZ2VPZkxvY2F0aW9uRXN0aW1hdGUJWzBdIEFnZU9mTG9jYXRpb25JbmZvcm1hdGlvbglPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCWFkZC1Mb2NhdGlvbkVzdGltYXRlCVsyXSBBZGQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gCU9QVElPTkFMLAorCWRlZmVycmVkbXQtbHJSZXNwb25zZUluZGljYXRvcglbM10gTlVMTAkJT1BUSU9OQUwsCisJZ2VyYW5Qb3NpdGlvbmluZ0RhdGEJWzRdIFBvc2l0aW9uaW5nRGF0YUluZm9ybWF0aW9uCU9QVElPTkFMLAorCXV0cmFuUG9zaXRpb25pbmdEYXRhCVs1XSBVdHJhblBvc2l0aW9uaW5nRGF0YUluZm8JT1BUSU9OQUwsCisJY2VsbElkT3JTYWkJWzZdIENlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJCU9QVElPTkFMLAorCXNhaS1QcmVzZW50CVs3XSBOVUxMCQlPUFRJT05BTCwKKwlhY2N1cmFjeUZ1bGZpbG1lbnRJbmRpY2F0b3IJWzhdIEFjY3VyYWN5RnVsZmlsbWVudEluZGljYXRvcgkJT1BUSU9OQUwsCisJdmVsb2NpdHlFc3RpbWF0ZQlbOV0gVmVsb2NpdHlFc3RpbWF0ZQlPUFRJT05BTCwKKwltby1sclNob3J0Q2lyY3VpdEluZGljYXRvcglbMTBdIE5VTEwJCU9QVElPTkFMIH0KKworLS0JaWYgZGVmZXJyZWRtdC1sclJlc3BvbnNlSW5kaWNhdG9yIGlzIHNldCwgbG9jYXRpb25Fc3RpbWF0ZSBpcyBpZ25vcmVkLgorCistLSB0aGUgYWRkLUxvY2F0aW9uRXN0aW1hdGUgcGFyYW1ldGVyIHNoYWxsIG5vdCBiZSBzZW50IHRvIGEgbm9kZSB0aGF0IGRpZCBub3QgaW5kaWNhdGUgdGhlCistLSBnZW9ncmFwaGljIHNoYXBlcyBzdXBwb3J0ZWQgaW4gdGhlIFByb3ZpZGVTdWJzY3JpYmVyTG9jYXRpb24tQXJnCistLSBUaGUgbG9jYXRpb25Fc3RpbWF0ZSBhbmQgdGhlIGFkZC1sb2NhdGlvbkVzdGltYXRlIHBhcmFtZXRlcnMgc2hhbGwgbm90IGJlIHNlbnQgaWYKKy0tIHRoZSBzdXBwb3J0ZWRHQURTaGFwZXMgcGFyYW1ldGVyIGhhcyBiZWVuIHJlY2VpdmVkIGluIFByb3ZpZGVTdWJzY3JpYmVyTG9jYXRpb24tQXJnCistLSBhbmQgdGhlIHNoYXBlIGVuY29kZWQgaW4gbG9jYXRpb25Fc3RpbWF0ZSBvciBhZGQtTG9jYXRpb25Fc3RpbWF0ZSBpcyBub3QgbWFya2VkCistLSBhcyBzdXBwb3J0ZWQgaW4gc3VwcG9ydGVkR0FEU2hhcGVzLiBJbiBzdWNoIGEgY2FzZSBQcm92aWRlU3Vic2NyaWJlckxvY2F0aW9uCistLSBzaGFsbCBiZSByZWplY3RlZCB3aXRoIGVycm9yIEZhY2lsaXR5Tm90U3VwcG9ydGVkIHdpdGggYWRkaXRpb25hbCBpbmRpY2F0aW9uCistLSBzaGFwZU9mTG9jYXRpb25Fc3RpbWF0ZU5vdFN1cHBvcnRlZC4KKy0tIHNhaS1QcmVzZW50IGluZGljYXRlcyB0aGF0IHRoZSBjZWxsSWRPclNhaSBwYXJhbWV0ZXIgY29udGFpbnMgYSBTZXJ2aWNlIEFyZWEgSWRlbnRpdHkuCisKK0FjY3VyYWN5RnVsZmlsbWVudEluZGljYXRvciA6Oj0gRU5VTUVSQVRFRCB7CisJcmVxdWVzdGVkQWNjdXJhY3lGdWxmaWxsZWQgICgwKSwKKwlyZXF1ZXN0ZWRBY2N1cmFjeU5vdEZ1bGZpbGxlZCAgKDEpLAorCS4uLgl9CisKK0V4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24pKQorCS0tIFJlZmVycyB0byBnZW9ncmFwaGljYWwgSW5mb3JtYXRpb24gZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMi4KKwktLSBUaGlzIGlzIGNvbXBvc2VkIG9mIDEgb3IgbW9yZSBvY3RldHMgd2l0aCBhbiBpbnRlcm5hbCBzdHJ1Y3R1cmUgYWNjb3JkaW5nIHRvCisJLS0gM0dQUCBUUyAyMy4wMzIKKwktLSBPY3RldCAxOiBUeXBlIG9mIHNoYXBlLCBvbmx5IHRoZSBmb2xsb3dpbmcgc2hhcGVzIGluIDNHUFAgVFMgMjMuMDMyIGFyZSBhbGxvd2VkOgorCS0tCQkoYSkgRWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgY2lyY2xlCisJLS0JCShiKSBFbGxpcHNvaWQgcG9pbnQgd2l0aCB1bmNlcnRhaW50eSBlbGxpcHNlCisJLS0JCShjKSBFbGxpcHNvaWQgcG9pbnQgd2l0aCBhbHRpdHVkZSBhbmQgdW5jZXJ0YWludHkgZWxsaXBzb2lkCisJLS0JCShkKSBFbGxpcHNvaWQgQXJjCisJLS0JCShlKSBFbGxpcHNvaWQgUG9pbnQKKwktLSBBbnkgb3RoZXIgdmFsdWUgaW4gb2N0ZXQgMSBzaGFsbCBiZSB0cmVhdGVkIGFzIGludmFsaWQKKwktLSBPY3RldHMgMiB0byA4IGZvciBjYXNlIChhKSCWIEVsbGlwc29pZCBwb2ludCB3aXRoIHVuY2VydGFpbnR5IGNpcmNsZQorCS0tCQlEZWdyZWVzIG9mIExhdGl0dWRlCQkJCTMgb2N0ZXRzCisJLS0JCURlZ3JlZXMgb2YgTG9uZ2l0dWRlCQkJCTMgb2N0ZXRzCisJLS0JCVVuY2VydGFpbnR5IGNvZGUJCQkJMSBvY3RldAorCS0tIE9jdGV0cyAyIHRvIDExIGZvciBjYXNlIChiKSCWIEVsbGlwc29pZCBwb2ludCB3aXRoIHVuY2VydGFpbnR5IGVsbGlwc2U6CisJLS0JCURlZ3JlZXMgb2YgTGF0aXR1ZGUJCQkJMyBvY3RldHMKKwktLQkJRGVncmVlcyBvZiBMb25naXR1ZGUJCQkJMyBvY3RldHMKKwktLQkJVW5jZXJ0YWludHkgc2VtaS1tYWpvciBheGlzCQkJCTEgb2N0ZXQKKwktLQkJVW5jZXJ0YWludHkgc2VtaS1taW5vciBheGlzCQkJCTEgb2N0ZXQKKwktLQkJQW5nbGUgb2YgbWFqb3IgYXhpcwkJCQkxIG9jdGV0CisJLS0JCUNvbmZpZGVuY2UJCQkJMSBvY3RldAorCS0tIE9jdGV0cyAyIHRvIDE0IGZvciBjYXNlIChjKSCWIEVsbGlwc29pZCBwb2ludCB3aXRoIGFsdGl0dWRlIGFuZCB1bmNlcnRhaW50eSBlbGxpcHNvaWQKKwktLQkJRGVncmVlcyBvZiBMYXRpdHVkZQkJCQkzIG9jdGV0cworCS0tCQlEZWdyZWVzIG9mIExvbmdpdHVkZQkJCQkzIG9jdGV0cworCS0tCQlBbHRpdHVkZQkJCQkyIG9jdGV0cworCS0tCQlVbmNlcnRhaW50eSBzZW1pLW1ham9yIGF4aXMJCQkJMSBvY3RldAorCS0tCQlVbmNlcnRhaW50eSBzZW1pLW1pbm9yIGF4aXMJCQkJMSBvY3RldAorCS0tCQlBbmdsZSBvZiBtYWpvciBheGlzCQkJCTEgb2N0ZXQKKwktLQkJVW5jZXJ0YWludHkgYWx0aXR1ZGUJCQkJMSBvY3RldAorCS0tCQlDb25maWRlbmNlCQkJCTEgb2N0ZXQKKwktLSBPY3RldHMgMiB0byAxMyBmb3IgY2FzZSAoZCkgliBFbGxpcHNvaWQgQXJjCisJLS0JCURlZ3JlZXMgb2YgTGF0aXR1ZGUJCQkJMyBvY3RldHMKKwktLQkJRGVncmVlcyBvZiBMb25naXR1ZGUJCQkJMyBvY3RldHMKKwktLQkJSW5uZXIgcmFkaXVzCQkJCTIgb2N0ZXRzCisJLS0JCVVuY2VydGFpbnR5IHJhZGl1cwkJCQkxIG9jdGV0CisJLS0JCU9mZnNldCBhbmdsZQkJCQkxIG9jdGV0CisJLS0JCUluY2x1ZGVkIGFuZ2xlCQkJCTEgb2N0ZXQKKwktLQkJQ29uZmlkZW5jZQkJCQkxIG9jdGV0CisJLS0gT2N0ZXRzIDIgdG8gNyBmb3IgY2FzZSAoZSkgliBFbGxpcHNvaWQgUG9pbnQKKwktLQkJRGVncmVlcyBvZiBMYXRpdHVkZQkJCQkzIG9jdGV0cworCS0tCQlEZWdyZWVzIG9mIExvbmdpdHVkZQkJCQkzIG9jdGV0cworCisJLS0KKwktLSBBbiBFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gcGFyYW1ldGVyIGNvbXByaXNpbmcgbW9yZSB0aGFuIG9uZSBvY3RldCBhbmQKKwktLSBjb250YWluaW5nIGFueSBvdGhlciBzaGFwZSBvciBhbiBpbmNvcnJlY3QgbnVtYmVyIG9mIG9jdGV0cyBvciBjb2RpbmcgYWNjb3JkaW5nCisJLS0gdG8gM0dQUCBUUyAyMy4wMzIgc2hhbGwgYmUgdHJlYXRlZCBhcyBpbnZhbGlkIGRhdGEgYnkgYSByZWNlaXZlci4KKwktLQorCS0tIEFuIEV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiBwYXJhbWV0ZXIgY29tcHJpc2luZyBvbmUgb2N0ZXQgc2hhbGwgYmUgZGlzY2FyZGVkCisJLS0gYnkgdGhlIHJlY2VpdmVyIGlmIGFuIEFkZC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiBwYXJhbWV0ZXIgaXMgcmVjZWl2ZWQgCisJLS0gaW4gdGhlIHNhbWUgbWVzc2FnZS4KKwktLQorCS0tIEFuIEV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiBwYXJhbWV0ZXIgY29tcHJpc2luZyBvbmUgb2N0ZXQgc2hhbGwgYmUgdHJlYXRlZCBhcworCS0tIGludmFsaWQgZGF0YSBieSB0aGUgcmVjZWl2ZXIgaWYgYW4gQWRkLUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIHBhcmFtZXRlciBpcyBub3QKKwktLSByZWNlaXZlZCBpbiB0aGUgc2FtZSBtZXNzYWdlLgorCittYXhFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gIElOVEVHRVIgOjo9IDIwCisJLS0gdGhlIG1heGltdW0gbGVuZ3RoIGFsbG93cyBmb3IgZnVydGhlciBzaGFwZXMgaW4gM0dQUCBUUyAyMy4wMzIgdG8gYmUgaW5jbHVkZWQgaW4gbGF0ZXIgCisJLS0gdmVyc2lvbnMgb2YgM0dQUCBUUyAyOS4wMDIKKworVmVsb2NpdHlFc3RpbWF0ZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg0Li43KSkKKwktLSBSZWZlcnMgdG8gVmVsb2NpdHkgZGVzY3JpcHRpb24gZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMi4KKwktLSBUaGlzIGlzIGNvbXBvc2VkIG9mIDQgb3IgbW9yZSBvY3RldHMgd2l0aCBhbiBpbnRlcm5hbCBzdHJ1Y3R1cmUgYWNjb3JkaW5nIHRvCisJLS0gM0dQUCBUUyAyMy4wMzIKKwktLSBPY3RldCAxOiBUeXBlIG9mIHZlbG9jaXR5LCBvbmx5IHRoZSBmb2xsb3dpbmcgdHlwZXMgaW4gM0dQUCBUUyAyMy4wMzIgYXJlIGFsbG93ZWQ6CisJLS0JCShhKSBIb3Jpem9udGFsIFZlbG9jaXR5CisJLS0JCShiKSBIb3Jpem9udGFsIHdpdGggVmVydGljYWwgVmVsb2NpdHkKKwktLQkJKGMpIEhvcml6b250YWwgVmVsb2NpdHkgd2l0aCBVbmNlcnRhaW50eQorCS0tCQkoZCkgSG9yaXpvbnRhbCB3aXRoIFZlcnRpY2FsIFZlbG9jaXR5IGFuZCBVbmNlcnRhaW50eQorCS0tIEZvciB0eXBlcyBIb3Jpem9udGFsIHdpdGggVmVydGljYWwgVmVsb2NpdHkgYW5kIEhvcml6b250YWwgd2l0aCBWZXJ0aWNhbCBWZWxvY2l0eQorCS0tIGFuZCBVbmNlcnRhaW50eSwgdGhlIGRpcmVjdGlvbiBvZiB0aGUgVmVydGljYWwgU3BlZWQgaXMgYWxzbyBpbmNsdWRlZCBpbiBPY3RldCAxCisJLS0gQW55IG90aGVyIHZhbHVlIGluIG9jdGV0IDEgc2hhbGwgYmUgdHJlYXRlZCBhcyBpbnZhbGlkCisJLS0gT2N0ZXRzIDIgdG8gNCBmb3IgY2FzZSAoYSkgSG9yaXpvbnRhbCB2ZWxvY2l0eToKKwktLQkJQmVhcmluZwkJCQkxIG9jdGV0CisJLS0JCUhvcml6b250YWwgU3BlZWQJCQkJMiBvY3RldHMKKwktLSBPY3RldHMgMiB0byA1IGZvciBjYXNlIChiKSCWIEhvcml6b250YWwgd2l0aCBWZXJ0aWNhbCBWZWxvY2l0eToKKwktLQkJQmVhcmluZwkJCQkxIG9jdGV0CisJLS0JCUhvcml6b250YWwgU3BlZWQJCQkJMiBvY3RldHMKKwktLQkJVmVydGljYWwgU3BlZWQJCQkJMSBvY3RldAorCS0tIE9jdGV0cyAyIHRvIDUgZm9yIGNhc2UgKGMpIJYgSG9yaXpvbnRhbCB2ZWxvY2l0eSB3aXRoIFVuY2VydGFpbnR5OgorCS0tCQlCZWFyaW5nCQkJCTEgb2N0ZXQKKwktLQkJSG9yaXpvbnRhbCBTcGVlZAkJCQkyIG9jdGV0cworCS0tCQlVbmNlcnRhaW50eSBTcGVlZAkJCQkxIG9jdGV0CisJLS0gT2N0ZXRzIDIgdG8gNyBmb3IgY2FzZSAoZCkgliBIb3Jpem9udGFsIHdpdGggVmVydGljYWwgVmVsb2NpdHkgYW5kIFVuY2VydGFpbnR5OgorCS0tCQlCZWFyaW5nCQkJCTEgb2N0ZXQKKwktLQkJSG9yaXpvbnRhbCBTcGVlZAkJCQkyIG9jdGV0cworCS0tCQlWZXJ0aWNhbCBTcGVlZAkJCQkxIG9jdGV0CisJLS0JCUhvcml6b250YWwgVW5jZXJ0YWludHkgU3BlZWQJCQkxIG9jdGV0CisJLS0JCVZlcnRpY2FsIFVuY2VydGFpbnR5IFNwZWVkCQkJCTEgb2N0ZXQKKworUG9zaXRpb25pbmdEYXRhSW5mb3JtYXRpb24gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMi4ubWF4UG9zaXRpb25pbmdEYXRhSW5mb3JtYXRpb24pKQorCS0tIFJlZmVycyB0byB0aGUgUG9zaXRpb25pbmcgRGF0YSBkZWZpbmVkIGluIDNHUFAgVFMgNDkuMDMxLgorCS0tIFRoaXMgaXMgY29tcG9zZWQgb2YgMiBvciBtb3JlIG9jdGV0cyB3aXRoIGFuIGludGVybmFsIHN0cnVjdHVyZSBhY2NvcmRpbmcgdG8KKwktLSAzR1BQIFRTIDQ5LjAzMS4gCisKK21heFBvc2l0aW9uaW5nRGF0YUluZm9ybWF0aW9uIElOVEVHRVIgOjo9IDEwCisJLS0gCisKK1V0cmFuUG9zaXRpb25pbmdEYXRhSW5mbyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgzLi5tYXhVdHJhblBvc2l0aW9uaW5nRGF0YUluZm8pKQorCS0tIFJlZmVycyB0byB0aGUgUG9zaXRpb24gRGF0YSBkZWZpbmVkIGluIDNHUFAgVFMgMjUuNDEzLgorCS0tIFRoaXMgaXMgY29tcG9zZWQgb2YgdGhlIHBvc2l0aW9uaW5nRGF0YURpc2NyaW1pbmF0b3IgYW5kIHRoZSBwb3NpdGlvbmluZ0RhdGFTZXQKKwktLSBpbmNsdWRlZCBpbiBwb3NpdGlvbkRhdGEgYXMgZGVmaW5lZCBpbiAzR1BQIFRTIDI1LjQxMy4KKworbWF4VXRyYW5Qb3NpdGlvbmluZ0RhdGFJbmZvIElOVEVHRVIgOjo9IDExCisJLS0gCisKK0FkZC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhBZGQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24pKQorCS0tIFJlZmVycyB0byBnZW9ncmFwaGljYWwgSW5mb3JtYXRpb24gZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMi4KKwktLSBUaGlzIGlzIGNvbXBvc2VkIG9mIDEgb3IgbW9yZSBvY3RldHMgd2l0aCBhbiBpbnRlcm5hbCBzdHJ1Y3R1cmUgYWNjb3JkaW5nIHRvIAorCS0tIDNHUFAgVFMgMjMuMDMyCisJLS0gT2N0ZXQgMTogVHlwZSBvZiBzaGFwZSwgYWxsIHRoZSBzaGFwZXMgZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMiBhcmUgYWxsb3dlZDoKKwktLSBPY3RldHMgMiB0byBuICh3aGVyZSBuIGlzIHRoZSB0b3RhbCBudW1iZXIgb2Ygb2N0ZXRzIG5lY2Vzc2FyeSB0byBlbmNvZGUgdGhlIHNoYXBlCisJLS0gYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjMuMDMyKSBhcmUgdXNlZCB0byBlbmNvZGUgdGhlIHNoYXBlIGl0c2VsZiBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCisJLS0gZW5jb2RpbmcgZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMgorCS0tCisJLS0gQW4gQWRkLUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIHBhcmFtZXRlciwgd2hldGhlciB2YWxpZCBvciBpbnZhbGlkLCByZWNlaXZlZCAKKwktLSB0b2dldGhlciB3aXRoIGEgdmFsaWQgRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIHBhcmFtZXRlciBpbiB0aGUgc2FtZSBtZXNzYWdlIAorCS0tIHNoYWxsIGJlIGRpc2NhcmRlZC4KKwktLQorCS0tIEFuIEFkZC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiBwYXJhbWV0ZXIgY29udGFpbmluZyBhbnkgc2hhcGUgbm90IGRlZmluZWQgaW4gCisJLS0gM0dQUCBUUyAyMy4wMzIgb3IgYW4gaW5jb3JyZWN0IG51bWJlciBvZiBvY3RldHMgb3IgY29kaW5nIGFjY29yZGluZyB0byAKKwktLSAzR1BQIFRTIDIzLjAzMiBzaGFsbCBiZSB0cmVhdGVkIGFzIGludmFsaWQgZGF0YSBieSBhIHJlY2VpdmVyIGlmIG5vdCByZWNlaXZlZCAKKwktLSB0b2dldGhlciB3aXRoIGEgdmFsaWQgRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIHBhcmFtZXRlciBpbiB0aGUgc2FtZSBtZXNzYWdlLgorCittYXhBZGQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gIElOVEVHRVIgOjo9IDkxCisJLS0gdGhlIG1heGltdW0gbGVuZ3RoIGFsbG93cyBzdXBwb3J0IGZvciBhbGwgdGhlIHNoYXBlcyBjdXJyZW50bHkgZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMgorCitTdWJzY3JpYmVyTG9jYXRpb25SZXBvcnQtQXJnIDo6PSBTRVFVRU5DRSB7CisJbGNzLUV2ZW50CQlMQ1MtRXZlbnQsCisJbGNzLUNsaWVudElECUxDUy1DbGllbnRJRCwgCisJbGNzTG9jYXRpb25JbmZvCUxDU0xvY2F0aW9uSW5mbywKKwltc2lzZG4JCVswXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJaW1zaQkJCVsxXSBJTVNJCQlPUFRJT05BTCwKKwlpbWVpCQkJWzJdIElNRUkJCU9QVElPTkFMLAorCW5hLUVTUkQJCVszXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJbmEtRVNSSwkJWzRdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlsb2NhdGlvbkVzdGltYXRlCVs1XSBFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJYWdlT2ZMb2NhdGlvbkVzdGltYXRlCVs2XSBBZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJc2xyLUFyZ0V4dGVuc2lvbkNvbnRhaW5lcglbN10gU0xSLUFyZ0V4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCWFkZC1Mb2NhdGlvbkVzdGltYXRlCVs4XSBBZGQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJZGVmZXJyZWRtdC1sckRhdGEJWzldIERlZmVycmVkbXQtbHJEYXRhCU9QVElPTkFMLCAKKwlsY3MtUmVmZXJlbmNlTnVtYmVyCVsxMF0gTENTLVJlZmVyZW5jZU51bWJlcglPUFRJT05BTCwKKwlnZXJhblBvc2l0aW9uaW5nRGF0YQlbMTFdIFBvc2l0aW9uaW5nRGF0YUluZm9ybWF0aW9uCU9QVElPTkFMLAorCXV0cmFuUG9zaXRpb25pbmdEYXRhCVsxMl0gVXRyYW5Qb3NpdGlvbmluZ0RhdGFJbmZvCU9QVElPTkFMLAorCWNlbGxJZE9yU2FpCVsxM10JQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUkJT1BUSU9OQUwsCisJaC1nbWxjLUFkZHJlc3MJWzE0XQlHU04tQWRkcmVzcwlPUFRJT05BTCwKKwlsY3NTZXJ2aWNlVHlwZUlECVsxNV0JTENTU2VydmljZVR5cGVJRAlPUFRJT05BTCwKKwlzYWktUHJlc2VudAlbMTddIE5VTEwJCU9QVElPTkFMLAorCXBzZXVkb255bUluZGljYXRvcglbMThdIE5VTEwJCU9QVElPTkFMLAorCWFjY3VyYWN5RnVsZmlsbWVudEluZGljYXRvcglbMTldIEFjY3VyYWN5RnVsZmlsbWVudEluZGljYXRvcglPUFRJT05BTCwKKwl2ZWxvY2l0eUVzdGltYXRlCVsyMF0gVmVsb2NpdHlFc3RpbWF0ZQlPUFRJT05BTCwKKwlzZXF1ZW5jZU51bWJlcglbMjFdIFNlcXVlbmNlTnVtYmVyCU9QVElPTkFMLAorCXBlcmlvZGljTERSSW5mbwlbMjJdIFBlcmlvZGljTERSSW5mbwlPUFRJT05BTCwKKwltby1sclNob3J0Q2lyY3VpdEluZGljYXRvcglbMjNdIE5VTEwJCU9QVElPTkFMIH0KKworCS0tIG9uZSBvZiBtc2lzZG4gb3IgaW1zaSBpcyBtYW5kYXRvcnkKKwktLSBhIGxvY2F0aW9uIGVzdGltYXRlIHRoYXQgaXMgdmFsaWQgZm9yIHRoZSBsb2NhdGlvbkVzdGltYXRlIHBhcmFtZXRlciBzaG91bGQgCisJLS0gYmUgdHJhbnNmZXJyZWQgaW4gdGhpcyBwYXJhbWV0ZXIgaW4gcHJlZmVyZW5jZSB0byB0aGUgYWRkLUxvY2F0aW9uRXN0aW1hdGUuCisJLS0gdGhlIGRlZmVycmVkbXQtbHJEYXRhIHBhcmFtZXRlciBzaGFsbCBiZSBpbmNsdWRlZCBpZiBhbmQgb25seSBpZiB0aGUgbGNzLUV2ZW50CisJLS0gaW5kaWNhdGVzIGEgZGVmZXJyZWRtdC1sclJlc3BvbnNlLgorCS0tIGlmIHRoZSBsY3MtRXZlbnQgaW5kaWNhdGVzIGEgZGVmZXJyZWRtdC1sclJlc3BvbnNlIHRoZW4gdGhlIGxvY2F0aW9uRXN0aW1hdGUgCisJLS0gYW5kIHRoZSBhZGQtbG9jYXRpb25Fc3RpbWF0ZSBwYXJhbWV0ZXJzIHNoYWxsIG5vdCBiZSBzZW50IGlmIHRoZSAKKwktLSBzdXBwb3J0ZWRHQURTaGFwZXMgcGFyYW1ldGVyIGhhZCBiZWVuIHJlY2VpdmVkIGluIFByb3ZpZGVTdWJzY3JpYmVyTG9jYXRpb24tQXJnCisJLS0gYW5kIHRoZSBzaGFwZSBlbmNvZGVkIGluIGxvY2F0aW9uRXN0aW1hdGUgb3IgYWRkLUxvY2F0aW9uRXN0aW1hdGUgd2FzIG5vdCBtYXJrZWQKKwktLSBhcyBzdXBwb3J0ZWQgaW4gc3VwcG9ydGVkR0FEU2hhcGVzLiBJbiBzdWNoIGEgY2FzZSB0ZXJtaW5hdGlvbkNhdXNlIAorCS0tIGluIGRlZmVycmVkbXQtbHJEYXRhIHNoYWxsIGJlIHByZXNlbnQgd2l0aCB2YWx1ZSAKKwktLSBzaGFwZU9mTG9jYXRpb25Fc3RpbWF0ZU5vdFN1cHBvcnRlZC4gCisJLS0gSWYgYSBsY3MgZXZlbnQgaW5kaWNhdGVzIGRlZmVycmVkIG10LWxyIHJlc3BvbnNlLCB0aGUgbGNzLVJlZmVyZW5jZSBudW1iZXIgc2hhbGwgYmUgCisJLS0gaW5jbHVkZWQuIAorCS0tIHNhaS1QcmVzZW50IGluZGljYXRlcyB0aGF0IHRoZSBjZWxsSWRPclNhaSBwYXJhbWV0ZXIgY29udGFpbnMgYSBTZXJ2aWNlIEFyZWEgSWRlbnRpdHkuCisKK0RlZmVycmVkbXQtbHJEYXRhIDo6PSBTRVFVRU5DRSB7CisJZGVmZXJyZWRMb2NhdGlvbkV2ZW50VHlwZQlEZWZlcnJlZExvY2F0aW9uRXZlbnRUeXBlLAorCXRlcm1pbmF0aW9uQ2F1c2UJWzBdIFRlcm1pbmF0aW9uQ2F1c2UJT1BUSU9OQUwsCisJbGNzTG9jYXRpb25JbmZvCVsxXSBMQ1NMb2NhdGlvbkluZm8JT1BUSU9OQUwsCisJLi4ufQorCS0tIGxjc0xvY2F0aW9uSW5mbyBtYXkgYmUgaW5jbHVkZWQgb25seSBpZiBhIHRlcm1pbmF0aW9uQ2F1c2UgaXMgcHJlc2VudCAKKwktLSBpbmRpY2F0aW5nIG10LWxyUmVzdGFydC4KKworTENTLUV2ZW50IDo6PSBFTlVNRVJBVEVEIHsKKwllbWVyZ2VuY3lDYWxsT3JpZ2luYXRpb24gICgwKSwKKwllbWVyZ2VuY3lDYWxsUmVsZWFzZSAgKDEpLCAKKwltby1sciAgKDIpLAorCS4uLiwKKwlkZWZlcnJlZG10LWxyUmVzcG9uc2UgICgzKSAsCisJZGVmZXJyZWRtby1sclRUVFBJbml0aWF0aW9uICAoNCkgIH0KKwktLQlkZWZlcnJlZG10LWxyUmVzcG9uc2UgaXMgYXBwbGljYWJsZSB0byB0aGUgZGVsaXZlcnkgb2YgYSBsb2NhdGlvbiBlc3RpbWF0ZSAKKwktLQlmb3IgYW4gTERSIGluaXRpYXRlZCBlYXJsaWVyIGJ5IGVpdGhlciB0aGUgbmV0d29yayAodmlhIGFuIE1ULUxSIGFjdGl2YXRlIGRlZmVycmVkIAorCS0tCWxvY2F0aW9uKSBvciB0aGUgVUUgKHZpYSBhIGRlZmVycmVkIE1PLUxSIFRUVFAgaW5pdGlhdGlvbikKKwktLQlleGNlcHRpb24gaGFuZGxpbmc6CisJLS0JYSBTdWJzY3JpYmVyTG9jYXRpb25SZXBvcnQtQXJnIGNvbnRhaW5pbmcgYW4gdW5yZWNvZ25pemVkIExDUy1FdmVudAorCS0tCXNoYWxsIGJlIHJlamVjdGVkIGJ5IGEgcmVjZWl2ZXIgd2l0aCBhIHJldHVybiBlcnJvciBjYXVzZSBvZiB1bmV4cGVjdGVkIGRhdGEgdmFsdWUKKworVGVybWluYXRpb25DYXVzZSA6Oj0gRU5VTUVSQVRFRCB7CisJbm9ybWFsICAoMCksCisJZXJyb3J1bmRlZmluZWQgICgxKSwKKwlpbnRlcm5hbFRpbWVvdXQgICgyKSwKKwljb25nZXN0aW9uICAoMyksCisJbXQtbHJSZXN0YXJ0ICAoNCksCisJcHJpdmFjeVZpb2xhdGlvbiAgKDUpLAorCS4uLiwKKwlzaGFwZU9mTG9jYXRpb25Fc3RpbWF0ZU5vdFN1cHBvcnRlZCAoNikgLAorCXN1YnNjcmliZXJUZXJtaW5hdGlvbiAoNyksCisJdUVUZXJtaW5hdGlvbiAoOCksCisJbmV0d29ya1Rlcm1pbmF0aW9uICg5KSAgfSAKKy0tIG10LWxyUmVzdGFydCBzaGFsbCBiZSB1c2VkIHRvIHRyaWdnZXIgdGhlIEdNTEMgdG8gcmVzdGFydCB0aGUgbG9jYXRpb24gcHJvY2VkdXJlLCAKKy0tIGVpdGhlciBiZWNhdXNlIHRoZSBzZW5kaW5nIG5vZGUga25vd3MgdGhhdCB0aGUgdGVybWluYWwgaGFzIG1vdmVkIHVuZGVyIGNvdmVyYWdlIAorLS0gb2YgYW5vdGhlciBNU0Mgb3IgU0dTTiAoZS5nLiBTZW5kIElkZW50aWZpY2F0aW9uIHJlY2VpdmVkKSwgb3IgYmVjYXVzZSB0aGUgc3Vic2NyaWJlcgorLS0gaGFzIGJlZW4gZGVyZWdpc3RlcmVkIGR1ZSB0byBhIENhbmNlbCBMb2NhdGlvbiByZWNlaXZlZCBmcm9tIEhMUi4KKy0tCistLSBleGNlcHRpb24gaGFuZGxpbmcKKy0tIGFuIHVucmVjb2duaXplZCB2YWx1ZSBzaGFsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIHZhbHVlIDEgKGVycm9ydW5kZWZpbmVkKSAKKworU2VxdWVuY2VOdW1iZXIgOjo9IElOVEVHRVIgKDEuLm1heFJlcG9ydGluZ0Ftb3VudCkKKworU3Vic2NyaWJlckxvY2F0aW9uUmVwb3J0LVJlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsIAorCS4uLiwgCisJbmEtRVNSSwkJWzBdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwluYS1FU1JECQlbMV0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWgtZ21sYy1BZGRyZXNzCVsyXQlHU04tQWRkcmVzcwlPUFRJT05BTCwKKwltby1sclNob3J0Q2lyY3VpdEluZGljYXRvcglbM10gTlVMTAkJT1BUSU9OQUwsCisJcmVwb3J0aW5nUExNTkxpc3QJWzRdIFJlcG9ydGluZ1BMTU5MaXN0CU9QVElPTkFMLAorCWxjcy1SZWZlcmVuY2VOdW1iZXIJWzVdCUxDUy1SZWZlcmVuY2VOdW1iZXIJT1BUSU9OQUwgfQorCistLSBuYS1FU1JLIGFuZCBuYS1FU1JEIGFyZSBtdXR1YWxseSBleGNsdXNpdmUKKy0tCistLSBleGNlcHRpb24gaGFuZGxpbmcKKy0tIHJlY2VpcHQgb2YgYm90aCBuYS1FU1JLIGFuZCBuYS1FU1JEIHNoYWxsIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgYSByZXR1cm4gZXJyb3IKKworCitFTkQKKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtTVMtRGF0YVR5cGVzLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLU1TLURhdGFUeXBlcy5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMxMmEwMgotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLU1TLURhdGFUeXBlcy5hc24KQEAgLTAsMCArMSwyNzgwIEBACistLSAkSWQ6IE1BUC1NUy1EYXRhVHlwZXMuYXNuIDI4MTQ5IDIwMDktMDQtMjUgMTc6NDU6MzRaIGV0eHJhYiAkCistLSAzR1BQIFRTIDI5LjAwMiBWOC45LjAgKDIwMDktMDQpIAorLS0gMTcuNy4xCU1vYmlsZSBTZXJ2aWNlIGRhdGEgdHlwZXMKKworTUFQLU1TLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1NUy1EYXRhVHlwZXMgKDExKSB2ZXJzaW9uMTEgKDExKX0KKworREVGSU5JVElPTlMKKworSU1QTElDSVQgVEFHUworCis6Oj0KKworQkVHSU4KKworRVhQT1JUUworCisJLS0gbG9jYXRpb24gcmVnaXN0cmF0aW9uIHR5cGVzCisJVXBkYXRlTG9jYXRpb25BcmcsCisJVXBkYXRlTG9jYXRpb25SZXMsCisJQ2FuY2VsTG9jYXRpb25BcmcsCisJQ2FuY2VsTG9jYXRpb25SZXMsIAorCVB1cmdlTVMtQXJnLCAKKwlQdXJnZU1TLVJlcywKKwlTZW5kSWRlbnRpZmljYXRpb25BcmcsCisJU2VuZElkZW50aWZpY2F0aW9uUmVzLCAKKwlVcGRhdGVHcHJzTG9jYXRpb25BcmcsCisJVXBkYXRlR3Byc0xvY2F0aW9uUmVzLAorCUlTVC1TdXBwb3J0SW5kaWNhdG9yLCAKKwlTdXBwb3J0ZWRMQ1MtQ2FwYWJpbGl0eVNldHMsCisKKwktLSBncHJzIGxvY2F0aW9uIHJlZ2lzdHJhdGlvbiB0eXBlcworCUdTTi1BZGRyZXNzLAorCisJLS0gaGFuZG92ZXIgdHlwZXMKKwlGb3J3YXJkQWNjZXNzU2lnbmFsbGluZy1BcmcsCisJUHJlcGFyZUhPLUFyZywKKwlQcmVwYXJlSE8tUmVzLAorCVByZXBhcmVTdWJzZXF1ZW50SE8tQXJnLCAKKwlQcmVwYXJlU3Vic2VxdWVudEhPLVJlcywKKwlQcm9jZXNzQWNjZXNzU2lnbmFsbGluZy1BcmcsCisJU2VuZEVuZFNpZ25hbC1BcmcsCisJU2VuZEVuZFNpZ25hbC1SZXMsCisKKwktLSBhdXRoZW50aWNhdGlvbiBtYW5hZ2VtZW50IHR5cGVzCisJU2VuZEF1dGhlbnRpY2F0aW9uSW5mb0FyZywKKwlTZW5kQXV0aGVudGljYXRpb25JbmZvUmVzLCAKKwlBdXRoZW50aWNhdGlvbkZhaWx1cmVSZXBvcnRBcmcsCitBdXRoZW50aWNhdGlvbkZhaWx1cmVSZXBvcnRSZXMsCisKKwktLSBzZWN1cml0eSBtYW5hZ2VtZW50IHR5cGVzCisJS2MsIAorCUNrc24sCisKKwktLSBlcXVpcG1lbnQgbWFuYWdlbWVudCB0eXBlcworCUNoZWNrSU1FSS1BcmcsCisJQ2hlY2tJTUVJLVJlcywKKworCS0tIHN1YnNjcmliZXIgbWFuYWdlbWVudCB0eXBlcworCUluc2VydFN1YnNjcmliZXJEYXRhQXJnLAorCUluc2VydFN1YnNjcmliZXJEYXRhUmVzLCAKKwlMU0FJZGVudGl0eSwKKwlEZWxldGVTdWJzY3JpYmVyRGF0YUFyZywKKwlEZWxldGVTdWJzY3JpYmVyRGF0YVJlcywKKwlFeHQtUW9TLVN1YnNjcmliZWQsCisJRXh0Mi1Rb1MtU3Vic2NyaWJlZCwgCisJRXh0My1Rb1MtU3Vic2NyaWJlZCwKKwlTdWJzY3JpYmVyRGF0YSwKKwlPREItRGF0YSwKKwlTdWJzY3JpYmVyU3RhdHVzLAorCVpvbmVDb2RlTGlzdCwKKwltYXhOdW1PZlpvbmVDb2RlcywgCisJTy1DU0ksIAorRC1DU0ksCisJTy1CY3NtQ2FtZWxURFBDcml0ZXJpYUxpc3QsIAorCVQtQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWFMaXN0LAorCVNTLUNTSSwKKwlTZXJ2aWNlS2V5LAorCURlZmF1bHRDYWxsSGFuZGxpbmcsCisJQ2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcsCisJQmFzaWNTZXJ2aWNlQ3JpdGVyaWEsCisJU3VwcG9ydGVkQ2FtZWxQaGFzZXMsCisJT2ZmZXJlZENhbWVsNENTSXMsCisJT2ZmZXJlZENhbWVsNEZ1bmN0aW9uYWxpdGllcywKKwltYXhOdW1PZkNhbWVsVERQRGF0YSwKKwlDVUctSW5kZXgsIAorCUNVRy1JbmZvLAorCUNVRy1JbnRlcmxvY2ssCisJSW50ZXJDVUctUmVzdHJpY3Rpb25zLAorCUludHJhQ1VHLU9wdGlvbnMsCisJTm90aWZpY2F0aW9uVG9NU1VzZXIsIAorCVFvUy1TdWJzY3JpYmVkLAorSVNULUFsZXJ0VGltZXJWYWx1ZSwKKwlULUNTSSwKKwlULUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQsCitBUE4sCitBZGRpdGlvbmFsSW5mbywKKworCS0tIGZhdWx0IHJlY292ZXJ5IHR5cGVzCisJUmVzZXRBcmcsCisJUmVzdG9yZURhdGFBcmcsCisJUmVzdG9yZURhdGFSZXMsCisKKy0tIHByb3ZpZGUgc3Vic2NyaWJlciBpbmZvIHR5cGVzIAorR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24sIAorTVMtQ2xhc3NtYXJrMiwKK0dQUlNNU0NsYXNzLAorCisJLS0gc3Vic2NyaWJlciBpbmZvcm1hdGlvbiBlbnF1aXJ5IHR5cGVzCisJUHJvdmlkZVN1YnNjcmliZXJJbmZvQXJnLAorCVByb3ZpZGVTdWJzY3JpYmVySW5mb1JlcywKKwlTdWJzY3JpYmVySW5mbywKKwlMb2NhdGlvbkluZm9ybWF0aW9uLAorCUxvY2F0aW9uSW5mb3JtYXRpb25HUFJTLAorCVJBSWRlbnRpdHksCisJU3Vic2NyaWJlclN0YXRlLAorCUdQUlNDaGFyZ2luZ0lELCAKK01OUEluZm9SZXMsCisJUm91dGVpbmdOdW1iZXIsCisKKwktLSBhbnkgdGltZSBpbmZvcm1hdGlvbiBlbnF1aXJ5IHR5cGVzCisJQW55VGltZUludGVycm9nYXRpb25BcmcsCisJQW55VGltZUludGVycm9nYXRpb25SZXMsCisKKwktLSBhbnkgdGltZSBpbmZvcm1hdGlvbiBoYW5kbGluZyB0eXBlcworCUFueVRpbWVTdWJzY3JpcHRpb25JbnRlcnJvZ2F0aW9uQXJnLAorCUFueVRpbWVTdWJzY3JpcHRpb25JbnRlcnJvZ2F0aW9uUmVzLAorCUFueVRpbWVNb2RpZmljYXRpb25BcmcsCisJQW55VGltZU1vZGlmaWNhdGlvblJlcywKKworCS0tIHN1YnNjcmliZXIgZGF0YSBtb2RpZmljYXRpb24gbm90aWZpY2F0aW9uIHR5cGVzCisJTm90ZVN1YnNjcmliZXJEYXRhTW9kaWZpZWRBcmcsCisJTm90ZVN1YnNjcmliZXJEYXRhTW9kaWZpZWRSZXMsCisKKwktLSBncHJzIGxvY2F0aW9uIGluZm9ybWF0aW9uIHJldHJpZXZhbCB0eXBlcworCVNlbmRSb3V0aW5nSW5mb0ZvckdwcnNBcmcsCisJU2VuZFJvdXRpbmdJbmZvRm9yR3Byc1JlcywKKworCS0tIGZhaWx1cmUgcmVwb3J0aW5nIHR5cGVzCisJRmFpbHVyZVJlcG9ydEFyZywKKwlGYWlsdXJlUmVwb3J0UmVzLAorCisJLS0gZ3BycyBub3RpZmljYXRpb24gdHlwZXMKKwlOb3RlTXNQcmVzZW50Rm9yR3Byc0FyZywKKwlOb3RlTXNQcmVzZW50Rm9yR3Byc1JlcywKKworCS0tIE1vYmlsaXR5IE1hbmFnZW1lbnQgdHlwZXMKK05vdGVNTS1FdmVudEFyZywKKwlOb3RlTU0tRXZlbnRSZXMsCisJTnVtYmVyUG9ydGFiaWxpdHlTdGF0dXMsCisJUGFnaW5nQXJlYSwKKworCS0tIFZHQ1MgLyBWQlMgdHlwZXMgdHlwZXMKK0dyb3VwSWQsIAorTG9uZy1Hcm91cElkLAorQWRkaXRpb25hbFN1YnNjcmlwdGlvbnMKKworOworCitJTVBPUlRTCisJbWF4TnVtT2ZTUywKKwlTUy1TdWJzY3JpcHRpb25PcHRpb24sCisJU1MtTGlzdCwKKwlTUy1Gb3JCUy1Db2RlLAorCVBhc3N3b3JkCitGUk9NIE1BUC1TUy1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU1MtRGF0YVR5cGVzICgxNCkgdmVyc2lvbjExICgxMSl9CisKKwlTUy1Db2RlCitGUk9NIE1BUC1TUy1Db2RlIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVNTLUNvZGUgKDE1KSB2ZXJzaW9uMTEgKDExKX0KKworCUV4dC1CZWFyZXJTZXJ2aWNlQ29kZQorRlJPTSBNQVAtQlMtQ29kZSB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1CUy1Db2RlICgyMCkgdmVyc2lvbjExICgxMSl9CisKKwlFeHQtVGVsZXNlcnZpY2VDb2RlCitGUk9NIE1BUC1UUy1Db2RlIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVRTLUNvZGUgKDE5KSB2ZXJzaW9uMTEgKDExKX0KKworCUFkZHJlc3NTdHJpbmcsCitJU0ROLUFkZHJlc3NTdHJpbmcsIAorCUlTRE4tU3ViYWRkcmVzc1N0cmluZywgCisJRlROLUFkZHJlc3NTdHJpbmcsCisJQWNjZXNzTmV0d29ya1NpZ25hbEluZm8sCisJSU1TSSwgCisJSU1FSSwKKwlUTVNJLAorCUhMUi1MaXN0LAorCUxNU0ksCisJSWRlbnRpdHksCisJR2xvYmFsQ2VsbElkLAorCUNlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJLAorCUV4dC1CYXNpY1NlcnZpY2VDb2RlLAorCU5BRUEtUHJlZmVycmVkQ0ksCisJRU1MUFAtSW5mbywgCisJTUMtU1MtSW5mbywKKwlTdWJzY3JpYmVySWRlbnRpdHksCisJQWdlT2ZMb2NhdGlvbkluZm9ybWF0aW9uLAorCUxDU0NsaWVudEV4dGVybmFsSUQsCisJTENTQ2xpZW50SW50ZXJuYWxJRCwKKwlFeHQtU1MtU3RhdHVzLAorCUxDU1NlcnZpY2VUeXBlSUQsCisJQVNDSS1DYWxsUmVmZXJlbmNlLAorCVRCQ0QtU1RSSU5HLAorCUxBSUZpeGVkTGVuZ3RoLAorCVBMTU4tSWQsCitFTUxQUC1Qcmlvcml0eQorRlJPTSBNQVAtQ29tbW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUNvbW1vbkRhdGFUeXBlcyAoMTgpIHZlcnNpb24xMSAoMTEpfQorCisJRXh0ZW5zaW9uQ29udGFpbmVyCitGUk9NIE1BUC1FeHRlbnNpb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjExICgxMSl9CisKKwlBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCitGUk9NIE1BUC1FUi1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRVItRGF0YVR5cGVzICgxNykgdmVyc2lvbjExICgxMSl9CisKKwlUcmFjZVByb3BhZ2F0aW9uTGlzdAorRlJPTSBNQVAtT00tRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLU9NLURhdGFUeXBlcyAoMTIpIHZlcnNpb24xMSAoMTEpfQorCis7CisKKy0tIGxvY2F0aW9uIHJlZ2lzdHJhdGlvbiB0eXBlcworCitVcGRhdGVMb2NhdGlvbkFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlJTVNJLAorCW1zYy1OdW1iZXIJWzFdIElTRE4tQWRkcmVzc1N0cmluZywKKwl2bHItTnVtYmVyCUlTRE4tQWRkcmVzc1N0cmluZywKKwlsbXNpCQkJWzEwXSBMTVNJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJdmxyLUNhcGFiaWxpdHkJWzZdIFZMUi1DYXBhYmlsaXR5CU9QVElPTkFMLAorCWluZm9ybVByZXZpb3VzTmV0d29ya0VudGl0eQlbMTFdCU5VTEwJCU9QVElPTkFMLAorCWNzLUxDUy1Ob3RTdXBwb3J0ZWRCeVVFCVsxMl0JTlVMTAkJT1BUSU9OQUwsCisJdi1nbWxjLUFkZHJlc3MJWzJdCUdTTi1BZGRyZXNzCU9QVElPTkFMLAorCWFkZC1pbmZvCQlbMTNdIEFERC1JbmZvCU9QVElPTkFMLAorCXBhZ2luZ0FyZWEJWzE0XSBQYWdpbmdBcmVhCU9QVElPTkFMLAorCXNraXBTdWJzY3JpYmVyRGF0YVVwZGF0ZQlbMTVdIE5VTEwJCU9QVElPTkFMIAorCS0tIFRoZSBza2lwU3Vic2NyaWJlckRhdGFVcGRhdGUgcGFyYW1ldGVyIGluIHRoZSBVcGRhdGVMb2NhdGlvbkFyZyBhbmQgdGhlIEFERC1JbmZvCisJLS0gc3RydWN0dXJlcyBjYXJyeSB0aGUgc2FtZSBzZW1hbnRpYy4KKwkgfQorCitWTFItQ2FwYWJpbGl0eSA6Oj0gU0VRVUVOQ0V7CisJc3VwcG9ydGVkQ2FtZWxQaGFzZXMgIAlbMF0gU3VwcG9ydGVkQ2FtZWxQaGFzZXMJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCXNvbHNhU3VwcG9ydEluZGljYXRvcglbMl0gTlVMTAkJT1BUSU9OQUwsCisJaXN0U3VwcG9ydEluZGljYXRvcglbMV0gSVNULVN1cHBvcnRJbmRpY2F0b3IJT1BUSU9OQUwsCisJc3VwZXJDaGFyZ2VyU3VwcG9ydGVkSW5TZXJ2aW5nTmV0d29ya0VudGl0eQlbM10gU3VwZXJDaGFyZ2VySW5mbwlPUFRJT05BTCwKKwlsb25nRlROLVN1cHBvcnRlZAlbNF0JTlVMTAkJT1BUSU9OQUwsCisJc3VwcG9ydGVkTENTLUNhcGFiaWxpdHlTZXRzCVs1XQlTdXBwb3J0ZWRMQ1MtQ2FwYWJpbGl0eVNldHMJT1BUSU9OQUwsCisJb2ZmZXJlZENhbWVsNENTSXMJWzZdIE9mZmVyZWRDYW1lbDRDU0lzCU9QVElPTkFMLAorCXN1cHBvcnRlZFJBVC1UeXBlc0luZGljYXRvcglbN10JU3VwcG9ydGVkUkFULVR5cGVzCU9QVElPTkFMLAorCWxvbmdHcm91cElELVN1cHBvcnRlZAlbOF0JTlVMTAkJT1BUSU9OQUwgfQorCitTdXBwb3J0ZWRSQVQtVHlwZXM6Oj0gQklUIFNUUklORyB7CisJdXRyYW4gICgwKSwKKwlnZXJhbiAgKDEpLAorCWdhbiAgICAoMiksCisJaS1oc3BhLWV2b2x1dGlvbiAoMyksCisJZS11dHJhbgkoNCl9IChTSVpFICgyLi44KSkKKwktLSBleGNlcHRpb24gaGFuZGxpbmc6IGJpdHMgNSB0byA3IHNoYWxsIGJlIGlnbm9yZWQgaWYgcmVjZWl2ZWQgYW5kIG5vdCB1bmRlcnN0b29kCisJIAorCisKK1N1cGVyQ2hhcmdlckluZm8gOjo9IENIT0lDRSB7CisJc2VuZFN1YnNjcmliZXJEYXRhCVswXSBOVUxMLAorCXN1YnNjcmliZXJEYXRhU3RvcmVkCVsxXSBBZ2VJbmRpY2F0b3IgfQorCitBZ2VJbmRpY2F0b3IgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uNikpCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBvZiB0aGlzIHBhcmFtZXRlciBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYy4KKworSVNULVN1cHBvcnRJbmRpY2F0b3IgOjo9ICBFTlVNRVJBVEVEIHsKKwliYXNpY0lTVFN1cHBvcnRlZAkoMCksCisJaXN0Q29tbWFuZFN1cHBvcnRlZAkoMSksCisJLi4ufQorLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0gcmVjZXB0aW9uIG9mIHZhbHVlcyA+IDEgc2hhbGwgYmUgbWFwcGVkIHRvICcgaXN0Q29tbWFuZFN1cHBvcnRlZCAnCisKK1N1cHBvcnRlZExDUy1DYXBhYmlsaXR5U2V0cyA6Oj0gQklUIFNUUklORyB7CisJbGNzQ2FwYWJpbGl0eVNldDEgKDApLAorCWxjc0NhcGFiaWxpdHlTZXQyICgxKSwKKwlsY3NDYXBhYmlsaXR5U2V0MyAoMiksCisJbGNzQ2FwYWJpbGl0eVNldDQgKDMpICwKKwlsY3NDYXBhYmlsaXR5U2V0NSAoNCkgfSAoU0laRSAoMi4uMTYpKSAKKy0tIENvcmUgbmV0d29yayBzaWduYWxsaW5nIGNhcGFiaWxpdHkgc2V0MSBpbmRpY2F0ZXMgTENTIFJlbGVhc2U5OCBvciBSZWxlYXNlOTkgdmVyc2lvbi4KKy0tIENvcmUgbmV0d29yayBzaWduYWxsaW5nIGNhcGFiaWxpdHkgc2V0MiBpbmRpY2F0ZXMgTENTIFJlbGVhc2U0LgorLS0gQ29yZSBuZXR3b3JrIHNpZ25hbGxpbmcgY2FwYWJpbGl0eSBzZXQzIGluZGljYXRlcyBMQ1MgUmVsZWFzZTUuCistLSBDb3JlIG5ldHdvcmsgc2lnbmFsbGluZyBjYXBhYmlsaXR5IHNldDQgaW5kaWNhdGVzIExDUyBSZWxlYXNlNi4KKy0tIENvcmUgbmV0d29yayBzaWduYWxsaW5nIGNhcGFiaWxpdHkgc2V0NSBpbmRpY2F0ZXMgTENTIFJlbGVhc2U3IG9yIGxhdGVyIHZlcnNpb24uCistLSBBIG5vZGUgc2hhbGwgbWFyayBpbiB0aGUgQklUIFNUUklORyBhbGwgTENTIGNhcGFiaWxpdHkgc2V0cyBpdCBzdXBwb3J0cy4gCistLSBJZiBubyBiaXQgaXMgc2V0IHRoZW4gdGhlIHNlbmRpbmcgbm9kZSBkb2VzIG5vdCBzdXBwb3J0IExDUy4KKy0tIElmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IHNlbnQgYnkgYW4gVkxSIHRoZW4gdGhlIFZMUiBtYXkgc3VwcG9ydCBhdCBtb3N0IGNhcGFiaWxpdHkgc2V0MS4KKy0tIElmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IHNlbnQgYnkgYW4gU0dTTiB0aGVuIG5vIHN1cHBvcnQgZm9yIExDUyBpcyBhc3N1bWVkLgorLS0gQW4gU0dTTiBpcyBub3QgYWxsb3dlZCB0byBpbmRpY2F0ZSBzdXBwb3J0IG9mIGNhcGFiaWxpdHkgc2V0MS4KKy0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitVcGRhdGVMb2NhdGlvblJlcyA6Oj0gU0VRVUVOQ0UgeworCWhsci1OdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWFkZC1DYXBhYmlsaXR5CU5VTEwJCQlPUFRJT05BTCwKKwlwYWdpbmdBcmVhLUNhcGFiaWxpdHkJWzBdTlVMTAkJCU9QVElPTkFMIH0KKworQURELUluZm8gOjo9IFNFUVVFTkNFIHsKKwlpbWVpc3YJCVswXSBJTUVJLAorCXNraXBTdWJzY3JpYmVyRGF0YVVwZGF0ZQlbMV0gTlVMTAkJT1BUSU9OQUwsCisJLS0gVGhlIHNraXBTdWJzY3JpYmVyRGF0YVVwZGF0ZSBwYXJhbWV0ZXIgaW4gdGhlIFVwZGF0ZUxvY2F0aW9uQXJnIGFuZCB0aGUgQURELUluZm8KKwktLSBzdHJ1Y3R1cmVzIGNhcnJ5IHRoZSBzYW1lIHNlbWFudGljLgorCS4uLn0KKworCitQYWdpbmdBcmVhIDo6PSBTRVFVRU5DRSBTSVpFICgxLi41KSBPRiBMb2NhdGlvbkFyZWEgCisKKworTG9jYXRpb25BcmVhIDo6PSBDSE9JQ0UgeworCWxhaUZpeGVkTGVuZ3RoCVswXSBMQUlGaXhlZExlbmd0aCwKKwlsYWMJCQlbMV0gTEFDfQorCisKK0xBQyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgyKSkKKwktLSBSZWZlcnMgdG8gTG9jYXRpb24gQXJlYSBDb2RlIG9mIHRoZSBMb2NhdGlvbiBBcmVhIElkZW50aWZpY2F0aW9uIGRlZmluZWQgaW4gCisgICAgIC0tIDNHUFAgVFMgMjMuMDAzIFsxN10uCisJLS0gTG9jYXRpb24gQXJlYSBDb2RlIGFjY29yZGluZyB0byAzR1BQIFRTIDI0LjAwOCBbMzVdCisKK0NhbmNlbExvY2F0aW9uQXJnIDo6PSBbM10gU0VRVUVOQ0UgeworCWlkZW50aXR5CQlJZGVudGl0eSwKKwljYW5jZWxsYXRpb25UeXBlCUNhbmNlbGxhdGlvblR5cGUJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJdHlwZU9mVXBkYXRlCVswXSBUeXBlT2ZVcGRhdGUJT1BUSU9OQUwgfQorCitUeXBlT2ZVcGRhdGUgOjo9IEVOVU1FUkFURUQgeworCXNnc24tY2hhbmdlICgwKSwKKwltbWUtY2hhbmdlICgxKSwKKwkuLi59CisJLS0gVHlwZU9mVXBkYXRlIHNoYWxsIGJlIGFic2VudCBpZiBDYW5jZWxsYXRpb25UeXBlIGlzIGRpZmZlcmVudCBmcm9tIHVwZGF0ZVByb2NlZHVyZQorCitDYW5jZWxsYXRpb25UeXBlIDo6PSBFTlVNRVJBVEVEIHsKKwl1cGRhdGVQcm9jZWR1cmUJKDApLAorCXN1YnNjcmlwdGlvbldpdGhkcmF3CSgxKSwKKwkuLi59CisJLS0gVGhlIEhMUiBzaGFsbCBub3Qgc2VuZCB2YWx1ZXMgb3RoZXIgdGhhbiBsaXN0ZWQgYWJvdmUKKworQ2FuY2VsTG9jYXRpb25SZXMgOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworUHVyZ2VNUy1BcmcgOjo9IFszXSBTRVFVRU5DRSB7CisJaW1zaQkJCUlNU0ksCisJdmxyLU51bWJlcglbMF0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCXNnc24tTnVtYmVyCVsxXQlJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1B1cmdlTVMtUmVzIDo6PSBTRVFVRU5DRSB7CisJZnJlZXplVE1TSQlbMF0JTlVMTAkJT1BUSU9OQUwsCisJZnJlZXplUC1UTVNJCVsxXQlOVUxMCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlmcmVlemVNLVRNU0kJWzJdCU5VTEwJCU9QVElPTkFMIH0KKworU2VuZElkZW50aWZpY2F0aW9uQXJnIDo6PSBTRVFVRU5DRSB7CisJdG1zaQkJCVRNU0ksCisJbnVtYmVyT2ZSZXF1ZXN0ZWRWZWN0b3JzCU51bWJlck9mUmVxdWVzdGVkVmVjdG9ycyAJT1BUSU9OQUwsCisJLS0gd2l0aGluIGEgZGlhbG9ndWUgbnVtYmVyT2ZSZXF1ZXN0ZWRWZWN0b3JzIHNoYWxsIGJlIHByZXNlbnQgaW4gCisJLS0gdGhlIGZpcnN0IHNlcnZpY2UgcmVxdWVzdCBhbmQgc2hhbGwgbm90IGJlIHByZXNlbnQgaW4gc3Vic2VxdWVudCBzZXJ2aWNlIHJlcXVlc3RzLiAKKwktLSBJZiByZWNlaXZlZCBpbiBhIHN1YnNlcXVlbnQgc2VydmljZSByZXF1ZXN0IGl0IHNoYWxsIGJlIGRpc2NhcmRlZC4gCisJc2VnbWVudGF0aW9uUHJvaGliaXRlZAlOVUxMCQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJbXNjLU51bWJlcglJU0ROLUFkZHJlc3NTdHJpbmcgCU9QVElPTkFMLAorCXByZXZpb3VzLUxBSQlbMF0gTEFJRml4ZWRMZW5ndGgJT1BUSU9OQUwsCisJaG9wQ291bnRlcglbMV0gSG9wQ291bnRlcglPUFRJT05BTCB9CisKK0hvcENvdW50ZXIgOjo9IElOVEVHRVIgKDAuLjMpCisKK1NlbmRJZGVudGlmaWNhdGlvblJlcyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwlpbXNpCQkJSU1TSQkJCU9QVElPTkFMLAorCS0tIElNU0kgc2hhbGwgYmUgcHJlc2VudCBpbiB0aGUgZmlyc3QgKG9yIG9ubHkpIHNlcnZpY2UgcmVzcG9uc2Ugb2YgYSBkaWFsb2d1ZS4KKwktLSBJZiBtdWx0aXBsZSBzZXJ2aWNlIHJlcXVlc3RzIGFyZSBwcmVzZW50IGluIGEgZGlhbG9ndWUgdGhlbiBJTVNJCisJLS0gc2hhbGwgbm90IGJlIHByZXNlbnQgaW4gYW55IHNlcnZpY2UgcmVzcG9uc2Ugb3RoZXIgdGhhbiB0aGUgZmlyc3Qgb25lLgorCWF1dGhlbnRpY2F0aW9uU2V0TGlzdAlBdXRoZW50aWNhdGlvblNldExpc3QJT1BUSU9OQUwsCisJY3VycmVudFNlY3VyaXR5Q29udGV4dAlbMl1DdXJyZW50U2VjdXJpdHlDb250ZXh0CU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworLS0gYXV0aGVudGljYXRpb24gbWFuYWdlbWVudCB0eXBlcworCitBdXRoZW50aWNhdGlvblNldExpc3QgOjo9IENIT0lDRSB7CisJdHJpcGxldExpc3QJWzBdIFRyaXBsZXRMaXN0LAorCXF1aW50dXBsZXRMaXN0CVsxXSBRdWludHVwbGV0TGlzdCB9CisKK1RyaXBsZXRMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi41KSBPRgorCQkJCUF1dGhlbnRpY2F0aW9uVHJpcGxldAorCitRdWludHVwbGV0TGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4uNSkgT0YKKwkJCQlBdXRoZW50aWNhdGlvblF1aW50dXBsZXQKKworQXV0aGVudGljYXRpb25UcmlwbGV0IDo6PSBTRVFVRU5DRSB7CisJcmFuZAkJCVJBTkQsCisJc3JlcwkJCVNSRVMsCisJa2MJCQlLYywKKwkuLi59CisKK0F1dGhlbnRpY2F0aW9uUXVpbnR1cGxldCA6Oj0gU0VRVUVOQ0UgeworCXJhbmQJCQlSQU5ELAorCXhyZXMJCQlYUkVTLAorCWNrCQkJQ0ssCisJaWsJCQlJSywKKwlhdXRuCQkJQVVUTiwKKwkuLi59CisKK0N1cnJlbnRTZWN1cml0eUNvbnRleHQgOjo9IENIT0lDRSB7CisJZ3NtLVNlY3VyaXR5Q29udGV4dERhdGEJWzBdIEdTTS1TZWN1cml0eUNvbnRleHREYXRhLAorCXVtdHMtU2VjdXJpdHlDb250ZXh0RGF0YQlbMV0gVU1UUy1TZWN1cml0eUNvbnRleHREYXRhIH0KKworR1NNLVNlY3VyaXR5Q29udGV4dERhdGEgOjo9IFNFUVVFTkNFIHsKKwlrYwkJCUtjLAorCWNrc24JCQlDa3NuLAorCS4uLiB9CisKK1VNVFMtU2VjdXJpdHlDb250ZXh0RGF0YSA6Oj0gU0VRVUVOQ0UgeworCWNrCQkJQ0ssCisJaWsJCQlJSywKKwlrc2kJCQlLU0ksCisJLi4uIH0KKworUkFORCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxNikpCisKK1NSRVMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNCkpCisKK0tjIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDgpKQorCitYUkVTIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDQuLjE2KSkKKworQ0sgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMTYpKQorCitJSyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxNikpCisKK0FVVE4gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMTYpKQorCitBVVRTIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDE0KSkKKworQ2tzbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgaW4gM0dQUCBUUyAyNC4wMDgKKworS1NJIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiAzR1BQIFRTIDI0LjAwOAorCitBdXRoZW50aWNhdGlvbkZhaWx1cmVSZXBvcnRBcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJSU1TSSwKKwlmYWlsdXJlQ2F1c2UJRmFpbHVyZUNhdXNlLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlyZS1hdHRlbXB0CUJPT0xFQU4JCU9QVElPTkFMLAorCWFjY2Vzc1R5cGUJQWNjZXNzVHlwZQlPUFRJT05BTCwKKwlyYW5kCQkJUkFORAkJCU9QVElPTkFMLAorCXZsci1OdW1iZXIJWzBdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlzZ3NuLU51bWJlcglbMV0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMIH0KKworQWNjZXNzVHlwZSA6Oj0gRU5VTUVSQVRFRCB7CisJY2FsbCAoMCksCisJZW1lcmdlbmN5Q2FsbCAoMSksCisJbG9jYXRpb25VcGRhdGluZyAoMiksCisJc3VwcGxlbWVudGFyeVNlcnZpY2UgKDMpLAorCXNob3J0TWVzc2FnZSAoNCksCisJZ3Byc0F0dGFjaCAoNSksCisJcm91dGluZ0FyZWFVcGRhdGluZyAoNiksCisJc2VydmljZVJlcXVlc3QgKDcpLAorCXBkcENvbnRleHRBY3RpdmF0aW9uICg4KSwKKwlwZHBDb250ZXh0RGVhY3RpdmF0aW9uICg5KSwKKwkuLi4sCisJZ3Byc0RldGFjaCAoMTApfQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKwktLSByZWNlaXZlZCB2YWx1ZXMgZ3JlYXRlciB0aGFuIDEwIHNoYWxsIGJlIGlnbm9yZWQuCisKK0F1dGhlbnRpY2F0aW9uRmFpbHVyZVJlcG9ydFJlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitGYWlsdXJlQ2F1c2UgOjo9IEVOVU1FUkFURUQgeworCXdyb25nVXNlclJlc3BvbnNlICAoMCksCisJd3JvbmdOZXR3b3JrU2lnbmF0dXJlICAoMSl9CisKKy0tIGdwcnMgbG9jYXRpb24gcmVnaXN0cmF0aW9uIHR5cGVzCisKK1VwZGF0ZUdwcnNMb2NhdGlvbkFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlJTVNJLAorCXNnc24tTnVtYmVyCUlTRE4tQWRkcmVzc1N0cmluZywJCisJc2dzbi1BZGRyZXNzCUdTTi1BZGRyZXNzLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlzZ3NuLUNhcGFiaWxpdHkJWzBdIFNHU04tQ2FwYWJpbGl0eQlPUFRJT05BTCwKKwlpbmZvcm1QcmV2aW91c05ldHdvcmtFbnRpdHkJWzFdCU5VTEwJCU9QVElPTkFMLAorCXBzLUxDUy1Ob3RTdXBwb3J0ZWRCeVVFCVsyXQlOVUxMCQlPUFRJT05BTCwKKwl2LWdtbGMtQWRkcmVzcwlbM10JR1NOLUFkZHJlc3MJT1BUSU9OQUwsCisJYWRkLWluZm8JCVs0XSAgQURELUluZm8JT1BUSU9OQUwsCisJZXBzLWluZm8JCVs1XQlFUFMtSW5mbwlPUFRJT05BTCwKKwlzZXJ2aW5nTm9kZVR5cGVJbmRpY2F0b3IJWzZdCU5VTEwJCU9QVElPTkFMLAorCXNraXBTdWJzY3JpYmVyRGF0YVVwZGF0ZQlbN10gTlVMTAkJT1BUSU9OQUwsCisJdXNlZFJBVC1UeXBlCVs4XSBVc2VkLVJBVC1UeXBlCU9QVElPTkFMIAorCSB9CisKK1VzZWQtUkFULVR5cGU6Oj0gRU5VTUVSQVRFRCB7CisJdXRyYW4gICgwKSwKKwlnZXJhbiAgKDEpLAorCWdhbiAgICAoMiksCisJaS1oc3BhLWV2b2x1dGlvbiAoMyksCisJZS11dHJhbgkoNCksCisJLi4ufQorCitFUFMtSW5mbyA6Oj0gQ0hPSUNFeworCXBkbi1ndy11cGRhdGUJWzBdIFBETi1HVy1VcGRhdGUsCisJaXNyLUluZm9ybWF0aW9uCVsxXSBJU1ItSW5mb3JtYXRpb24gfQorCitQRE4tR1ctVXBkYXRlIDo6PSBTRVFVRU5DRXsKKwlhcG4JCQlbMF0gQVBOCQlPUFRJT05BTCwKKwlwZG4tZ3ctSWRlbnRpdHkJWzFdIFBETi1HVy1JZGVudGl0eQlPUFRJT05BTCwKKwljb250ZXh0SWQJCVsyXSBDb250ZXh0SWQgICAgICAgICAgICAgICAgICAgICBPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitJU1ItSW5mb3JtYXRpb246Oj0gQklUIFNUUklORyB7CisJdXBkYXRlTU1FICAoMCksCisJY2FuY2VsU0dTTiAgKDEpfSAoU0laRSAoMi4uOCkpCisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOiByZWNlcHRpb24gb2YgdW5rbm93biBiaXQgYXNzaWdubWVudHMgaW4gdGhlCisJLS0gSVNSLUluZm9ybWF0aW9uIGRhdGEgdHlwZSBzaGFsbCBiZSBkaXNjYXJkZWQgYnkgdGhlIHJlY2VpdmVyIAorCitTR1NOLUNhcGFiaWxpdHkgOjo9IFNFUVVFTkNFeworCXNvbHNhU3VwcG9ydEluZGljYXRvcglOVUxMCQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlzdXBlckNoYXJnZXJTdXBwb3J0ZWRJblNlcnZpbmdOZXR3b3JrRW50aXR5CVsyXSBTdXBlckNoYXJnZXJJbmZvCU9QVElPTkFMICwKKwlncHJzRW5oYW5jZW1lbnRzU3VwcG9ydEluZGljYXRvciAJWzNdIE5VTEwJCU9QVElPTkFMLAorCXN1cHBvcnRlZENhbWVsUGhhc2VzICAJWzRdIFN1cHBvcnRlZENhbWVsUGhhc2VzCU9QVElPTkFMLAorCXN1cHBvcnRlZExDUy1DYXBhYmlsaXR5U2V0cwlbNV0gIFN1cHBvcnRlZExDUy1DYXBhYmlsaXR5U2V0cwlPUFRJT05BTCwKKwlvZmZlcmVkQ2FtZWw0Q1NJcwlbNl0gT2ZmZXJlZENhbWVsNENTSXMJT1BUSU9OQUwsCisJc21zQ2FsbEJhcnJpbmdTdXBwb3J0SW5kaWNhdG9yCVs3XQlOVUxMCQlPUFRJT05BTCwJc3VwcG9ydGVkUkFULVR5cGVzSW5kaWNhdG9yCVs4XQlTdXBwb3J0ZWRSQVQtVHlwZXMJT1BUSU9OQUwsCisJc3VwcG9ydGVkRmVhdHVyZXMJWzldIFN1cHBvcnRlZEZlYXR1cmVzCU9QVElPTkFMIH0KKworU3VwcG9ydGVkRmVhdHVyZXM6Oj0gQklUIFNUUklORyB7CisJb2RiLWFsbCAoMCksCisJb2RiLUhQTE1OLUFQTiAoMSksCisJb2RiLVZQTE1OLUFQTiAoMiksCisJcmVnU3ViICgzKX0gKFNJWkUgKDQuLjgpKQorCitHU04tQWRkcmVzcyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg1Li4xNykpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gVFMgM0dQUCBUUyAyMy4wMDMgWzE3XQorCitVcGRhdGVHcHJzTG9jYXRpb25SZXMgOjo9IFNFUVVFTkNFIHsKKwlobHItTnVtYmVyCUlTRE4tQWRkcmVzc1N0cmluZywKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlhZGQtQ2FwYWJpbGl0eQlOVUxMCQkJT1BUSU9OQUwsCisJc2dzbi1tbWVTZXBhcmF0aW9uU3VwcG9ydGVkCVswXSBOVUxMCQlPUFRJT05BTCB9CisKKy0tIGhhbmRvdmVyIHR5cGVzCisKK0ZvcndhcmRBY2Nlc3NTaWduYWxsaW5nLUFyZyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwlhbi1BUERVCQlBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbywKKwlpbnRlZ3JpdHlQcm90ZWN0aW9uSW5mbwlbMF0gSW50ZWdyaXR5UHJvdGVjdGlvbkluZm9ybWF0aW9uCQlPUFRJT05BTCwKKwllbmNyeXB0aW9uSW5mbwlbMV0gRW5jcnlwdGlvbkluZm9ybWF0aW9uCQlPUFRJT05BTCwKKwlrZXlTdGF0dXMJCVsyXQlLZXlTdGF0dXMJT1BUSU9OQUwsCisJYWxsb3dlZEdTTS1BbGdvcml0aG1zCVs0XQlBbGxvd2VkR1NNLUFsZ29yaXRobXMJT1BUSU9OQUwsCisJYWxsb3dlZFVNVFMtQWxnb3JpdGhtcwlbNV0JQWxsb3dlZFVNVFMtQWxnb3JpdGhtcwlPUFRJT05BTCwKKwlyYWRpb1Jlc291cmNlSW5mb3JtYXRpb24JWzZdIFJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbglPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzNdCUV4dGVuc2lvbkNvbnRhaW5lciAJT1BUSU9OQUwsCisJLi4uLAorCXJhZGlvUmVzb3VyY2VMaXN0CVs3XQlSYWRpb1Jlc291cmNlTGlzdAlPUFRJT05BTCwKKwlic3NtYXAtU2VydmljZUhhbmRvdmVyCVs5XQlCU1NNQVAtU2VydmljZUhhbmRvdmVyCU9QVElPTkFMLAorCXJhbmFwLVNlcnZpY2VIYW5kb3ZlcglbOF0JUkFOQVAtU2VydmljZUhhbmRvdmVyCU9QVElPTkFMLAorCWJzc21hcC1TZXJ2aWNlSGFuZG92ZXJMaXN0CVsxMF0JQlNTTUFQLVNlcnZpY2VIYW5kb3Zlckxpc3QJT1BUSU9OQUwsCisJY3VycmVudGx5VXNlZENvZGVjCVsxMV0gQ29kZWMJT1BUSU9OQUwsCisJaXVTdXBwb3J0ZWRDb2RlY3NMaXN0CVsxMl0gU3VwcG9ydGVkQ29kZWNzTGlzdAlPUFRJT05BTCwKKwlyYWItQ29uZmlndXJhdGlvbkluZGljYXRvcglbMTNdIE5VTEwJCU9QVElPTkFMLAorCWl1U2VsZWN0ZWRDb2RlYwlbMTRdCUNvZGVjCU9QVElPTkFMLAorCWFsdGVybmF0aXZlQ2hhbm5lbFR5cGUJWzE1XQlSYWRpb1Jlc291cmNlSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJdHJhY2VQcm9wYWdhdGlvbkxpc3QJWzE3XQlUcmFjZVByb3BhZ2F0aW9uTGlzdAlPUFRJT05BTCB9CisKK0FsbG93ZWRHU00tQWxnb3JpdGhtcyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgY29kZWQgYXMgQWxnb3JpdGhtIGlkZW50aWZpZXIgb2N0ZXQgZnJvbQorCS0tIFBlcm1pdHRlZCBBbGdvcml0aG1zIGRlZmluZWQgaW4gM0dQUCBUUyA0OC4wMDgKKwktLSBBIG5vZGUgc2hhbGwgbWFyayBhbGwgR1NNIGFsZ29yaXRobXMgdGhhdCBhcmUgYWxsb3dlZCBpbiBNU0MtQgorCitBbGxvd2VkVU1UUy1BbGdvcml0aG1zIDo6PSBTRVFVRU5DRSB7CisJaW50ZWdyaXR5UHJvdGVjdGlvbkFsZ29yaXRobXMJWzBdIAlQZXJtaXR0ZWRJbnRlZ3JpdHlQcm90ZWN0aW9uQWxnb3JpdGhtcwlPUFRJT05BTCwKKwllbmNyeXB0aW9uQWxnb3JpdGhtcwlbMV0gCVBlcm1pdHRlZEVuY3J5cHRpb25BbGdvcml0aG1zCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1Blcm1pdHRlZEludGVncml0eVByb3RlY3Rpb25BbGdvcml0aG1zIDo6PQorCQlPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLm1heFBlcm1pdHRlZEludGVncml0eVByb3RlY3Rpb25BbGdvcml0aG1zTGVuZ3RoKSkKKwktLSBPY3RldHMgY29udGFpbiBhIGNvbXBsZXRlIFBlcm1pdHRlZEludGVncml0eVByb3RlY3Rpb25BbGdvcml0aG1zIGRhdGEgdHlwZSAKKwktLSBhcyBkZWZpbmVkIGluIDNHUFAgVFMgMjUuNDEzLCBlbmNvZGVkIGFjY29yZGluZyB0byB0aGUgZW5jb2Rpbmcgc2NoZW1lIAorCS0tIG1hbmRhdGVkIGJ5IDNHUFAgVFMgMjUuNDEzLiAKKwktLSBQYWRkaW5nIGJpdHMgYXJlIGluY2x1ZGVkLCBpZiBuZWVkZWQsIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSAKKwktLSBsYXN0IG9jdGV0IG9mIHRoZSBvY3RldCBzdHJpbmcuIAorCisKK21heFBlcm1pdHRlZEludGVncml0eVByb3RlY3Rpb25BbGdvcml0aG1zTGVuZ3RoIElOVEVHRVIgOjo9IDkKKworUGVybWl0dGVkRW5jcnlwdGlvbkFsZ29yaXRobXMgOjo9CisJCU9DVEVUIFNUUklORyAoU0laRSAoMS4ubWF4UGVybWl0dGVkRW5jcnlwdGlvbkFsZ29yaXRobXNMZW5ndGgpKQorCS0tIE9jdGV0cyBjb250YWluIGEgY29tcGxldGUgUGVybWl0dGVkRW5jcnlwdGlvbkFsZ29yaXRobXMgZGF0YSB0eXBlIAorCS0tIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyNS40MTMsIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBzY2hlbWUgCisJLS0gbWFuZGF0ZWQgYnkgM0dQUCBUUyAyNS40MTMKKwktLSBQYWRkaW5nIGJpdHMgYXJlIGluY2x1ZGVkLCBpZiBuZWVkZWQsIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSAKKwktLSBsYXN0IG9jdGV0IG9mIHRoZSBvY3RldCBzdHJpbmcuIAorCisKK21heFBlcm1pdHRlZEVuY3J5cHRpb25BbGdvcml0aG1zTGVuZ3RoIElOVEVHRVIgOjo9IDkKKworS2V5U3RhdHVzIDo6PSBFTlVNRVJBVEVEIHsKKwlvbGQgICgwKSwKKwluZXcgICgxKSwKKwkuLi59CisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorCS0tIHJlY2VpdmVkIHZhbHVlcyBpbiByYW5nZSAyLTMxIHNoYWxsIGJlIHRyZWF0ZWQgYXMgIm9sZCIKKwktLSByZWNlaXZlZCB2YWx1ZXMgZ3JlYXRlciB0aGFuIDMxIHNoYWxsIGJlIHRyZWF0ZWQgYXMgIm5ldyIKKworUHJlcGFyZUhPLUFyZyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwl0YXJnZXRDZWxsSWQJWzBdIEdsb2JhbENlbGxJZAlPUFRJT05BTCwKKwloby1OdW1iZXJOb3RSZXF1aXJlZAlOVUxMCQkJT1BUSU9OQUwsIAorCXRhcmdldFJOQ0lkCVsxXSBSTkNJZAkJT1BUSU9OQUwsCisJYW4tQVBEVQkJWzJdIEFjY2Vzc05ldHdvcmtTaWduYWxJbmZvCU9QVElPTkFMLAorCW11bHRpcGxlQmVhcmVyUmVxdWVzdGVkCVszXSBOVUxMCQlPUFRJT05BTCwKKwlpbXNpCQkJWzRdIElNU0kJCU9QVElPTkFMLAorCWludGVncml0eVByb3RlY3Rpb25JbmZvCVs1XSBJbnRlZ3JpdHlQcm90ZWN0aW9uSW5mb3JtYXRpb24JCU9QVElPTkFMLAorCWVuY3J5cHRpb25JbmZvCVs2XSBFbmNyeXB0aW9uSW5mb3JtYXRpb24JCU9QVElPTkFMLAorCXJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbglbN10gUmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uCU9QVElPTkFMLAorCWFsbG93ZWRHU00tQWxnb3JpdGhtcwlbOV0JQWxsb3dlZEdTTS1BbGdvcml0aG1zCU9QVElPTkFMLAorCWFsbG93ZWRVTVRTLUFsZ29yaXRobXMJWzEwXQlBbGxvd2VkVU1UUy1BbGdvcml0aG1zCU9QVElPTkFMLAorCXJhZGlvUmVzb3VyY2VMaXN0CVsxMV0gUmFkaW9SZXNvdXJjZUxpc3QJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs4XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlyYWItSWQJCVsxMl0gUkFCLUlkCU9QVElPTkFMLAorCWJzc21hcC1TZXJ2aWNlSGFuZG92ZXIJWzEzXQlCU1NNQVAtU2VydmljZUhhbmRvdmVyCU9QVElPTkFMLAorCXJhbmFwLVNlcnZpY2VIYW5kb3ZlcglbMTRdCVJBTkFQLVNlcnZpY2VIYW5kb3ZlcglPUFRJT05BTCwgCisJYnNzbWFwLVNlcnZpY2VIYW5kb3Zlckxpc3QJWzE1XQlCU1NNQVAtU2VydmljZUhhbmRvdmVyTGlzdAlPUFRJT05BTCwKKwlhc2NpQ2FsbFJlZmVyZW5jZQlbMjBdCUFTQ0ktQ2FsbFJlZmVyZW5jZQlPUFRJT05BTCwKKwlnZXJhbi1jbGFzc21hcmsJWzE2XSBHRVJBTi1DbGFzc21hcmsJT1BUSU9OQUwsCisJaXVDdXJyZW50bHlVc2VkQ29kZWMJWzE3XSBDb2RlYwlPUFRJT05BTCwKKwlpdVN1cHBvcnRlZENvZGVjc0xpc3QJWzE4XSBTdXBwb3J0ZWRDb2RlY3NMaXN0CU9QVElPTkFMLAorCXJhYi1Db25maWd1cmF0aW9uSW5kaWNhdG9yCVsxOV0gTlVMTAkJT1BUSU9OQUwsCisJdWVzYmktSXUJCVsyMV0JVUVTQkktSXUJT1BUSU9OQUwsCisJaW1laXN2CQlbMjJdCUlNRUkJCU9QVElPTkFMLAorCWFsdGVybmF0aXZlQ2hhbm5lbFR5cGUJWzIzXQlSYWRpb1Jlc291cmNlSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJdHJhY2VQcm9wYWdhdGlvbkxpc3QJWzI1XQlUcmFjZVByb3BhZ2F0aW9uTGlzdAlPUFRJT05BTAkgfQorCitCU1NNQVAtU2VydmljZUhhbmRvdmVyTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4uIG1heE51bU9mU2VydmljZUhhbmRvdmVycykgT0YKKwkJCQlCU1NNQVAtU2VydmljZUhhbmRvdmVySW5mbworCitCU1NNQVAtU2VydmljZUhhbmRvdmVySW5mbyA6Oj0gU0VRVUVOQ0UgeworCWJzc21hcC1TZXJ2aWNlSGFuZG92ZXIJQlNTTUFQLVNlcnZpY2VIYW5kb3ZlciwKKwlyYWItSWQJCVJBQi1JZCwKKwktLSBSQUIgSWRlbnRpdHkgaXMgbmVlZGVkIHRvIHJlbGF0ZSB0aGUgc2VydmljZSBoYW5kb3ZlcnMgd2l0aCB0aGUgcmFkaW8gYWNjZXNzIGJlYXJlcnMuIAorCS4uLn0KKworbWF4TnVtT2ZTZXJ2aWNlSGFuZG92ZXJzICBJTlRFR0VSIDo6PSA3CisKK0JTU01BUC1TZXJ2aWNlSGFuZG92ZXIgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdGhlIFNlcnZpY2UgSGFuZG92ZXIgaW5mb3JtYXRpb24gZWxlbWVudCBpbgorCS0tIDNHUFAgVFMgNDguMDA4LgorCitSQU5BUC1TZXJ2aWNlSGFuZG92ZXIgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gT2N0ZXQgY29udGFpbnMgYSBjb21wbGV0ZSBTZXJ2aWNlLUhhbmRvdmVyIGRhdGEgdHlwZSAKKwktLSBhcyBkZWZpbmVkIGluIDNHUFAgVFMgMjUuNDEzLCBlbmNvZGVkIGFjY29yZGluZyB0byB0aGUgZW5jb2Rpbmcgc2NoZW1lIAorCS0tIG1hbmRhdGVkIGJ5IDNHUFAgVFMgMjUuNDEzCisJLS0gUGFkZGluZyBiaXRzIGFyZSBpbmNsdWRlZCBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cy4gCisKKworUmFkaW9SZXNvdXJjZUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLiBtYXhOdW1PZlJhZGlvUmVzb3VyY2VzKSBPRgorCQkJCVJhZGlvUmVzb3VyY2UKKworUmFkaW9SZXNvdXJjZSA6Oj0gU0VRVUVOQ0UgeworCXJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbglSYWRpb1Jlc291cmNlSW5mb3JtYXRpb24sCisJcmFiLUlkCQlSQUItSWQsCisJLS0gUkFCIElkZW50aXR5IGlzIG5lZWRlZCB0byByZWxhdGUgdGhlIHJhZGlvIHJlc291cmNlcyB3aXRoIHRoZSByYWRpbyBhY2Nlc3MgYmVhcmVycy4gCisJLi4ufQorCittYXhOdW1PZlJhZGlvUmVzb3VyY2VzICBJTlRFR0VSIDo6PSA3CisKK1ByZXBhcmVITy1SZXMgOjo9IFszXSBTRVFVRU5DRSB7CisJaGFuZG92ZXJOdW1iZXIJWzBdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlyZWxvY2F0aW9uTnVtYmVyTGlzdAlbMV0JUmVsb2NhdGlvbk51bWJlckxpc3QJT1BUSU9OQUwsCisJYW4tQVBEVQkJWzJdCUFjY2Vzc05ldHdvcmtTaWduYWxJbmZvCU9QVElPTkFMLAorCW11bHRpY2FsbEJlYXJlckluZm8JWzNdCU11bHRpY2FsbEJlYXJlckluZm8JT1BUSU9OQUwsCisJbXVsdGlwbGVCZWFyZXJOb3RTdXBwb3J0ZWQJTlVMTAkJCU9QVElPTkFMLAorCXNlbGVjdGVkVU1UUy1BbGdvcml0aG1zCVs1XQlTZWxlY3RlZFVNVFMtQWxnb3JpdGhtcwlPUFRJT05BTCwKKwljaG9zZW5SYWRpb1Jlc291cmNlSW5mb3JtYXRpb24JWzZdIENob3NlblJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbgkgT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs0XQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWl1U2VsZWN0ZWRDb2RlYwlbN10gQ29kZWMJCU9QVElPTkFMLAorCWl1QXZhaWxhYmxlQ29kZWNzTGlzdAlbOF0gQ29kZWNMaXN0CU9QVElPTkFMIH0KKworU2VsZWN0ZWRVTVRTLUFsZ29yaXRobXMgOjo9IFNFUVVFTkNFIHsKKwlpbnRlZ3JpdHlQcm90ZWN0aW9uQWxnb3JpdGhtCVswXSAJQ2hvc2VuSW50ZWdyaXR5UHJvdGVjdGlvbkFsZ29yaXRobQlPUFRJT05BTCwKKwllbmNyeXB0aW9uQWxnb3JpdGhtCVsxXSAJQ2hvc2VuRW5jcnlwdGlvbkFsZ29yaXRobQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0Nob3NlbkludGVncml0eVByb3RlY3Rpb25BbGdvcml0aG0gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gT2N0ZXQgY29udGFpbnMgYSBjb21wbGV0ZSBJbnRlZ3JpdHlQcm90ZWN0aW9uQWxnb3JpdGhtIGRhdGEgdHlwZSAKKwktLSBhcyBkZWZpbmVkIGluIDNHUFAgVFMgMjUuNDEzLCBlbmNvZGVkIGFjY29yZGluZyB0byB0aGUgZW5jb2Rpbmcgc2NoZW1lIAorCS0tIG1hbmRhdGVkIGJ5IDNHUFAgVFMgMjUuNDEzCisJLS0gUGFkZGluZyBiaXRzIGFyZSBpbmNsdWRlZCBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cy4gCisKK0Nob3NlbkVuY3J5cHRpb25BbGdvcml0aG0gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gT2N0ZXQgY29udGFpbnMgYSBjb21wbGV0ZSBFbmNyeXB0aW9uQWxnb3JpdGhtIGRhdGEgdHlwZSAKKwktLSBhcyBkZWZpbmVkIGluIDNHUFAgVFMgMjUuNDEzLCBlbmNvZGVkIGFjY29yZGluZyB0byB0aGUgZW5jb2Rpbmcgc2NoZW1lIAorCS0tIG1hbmRhdGVkIGJ5IDNHUFAgVFMgMjUuNDEzCisJLS0gUGFkZGluZyBiaXRzIGFyZSBpbmNsdWRlZCBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cy4gCisKK0Nob3NlblJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbiA6Oj0gU0VRVUVOQ0UgeworCWNob3NlbkNoYW5uZWxJbmZvCVswXSBDaG9zZW5DaGFubmVsSW5mbwlPUFRJT05BTCwKKwljaG9zZW5TcGVlY2hWZXJzaW9uCVsxXSBDaG9zZW5TcGVlY2hWZXJzaW9uCU9QVElPTkFMLAorCS4uLn0KKworQ2hvc2VuQ2hhbm5lbEluZm8gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdGhlIENob3NlbiBDaGFubmVsIGluZm9ybWF0aW9uIGVsZW1lbnQgaW4gM0dQUCBUUyA0OC4wMDgKKworQ2hvc2VuU3BlZWNoVmVyc2lvbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0aGUgU3BlZWNoIFZlcnNpb24gKGNob3NlbikgaW5mb3JtYXRpb24gZWxlbWVudCBpbiAzR1BQIFRTCisJLS0gNDguMDA4IAorCitQcmVwYXJlU3Vic2VxdWVudEhPLUFyZyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwl0YXJnZXRDZWxsSWQJWzBdIEdsb2JhbENlbGxJZAlPUFRJT05BTCwKKwl0YXJnZXRNU0MtTnVtYmVyCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJdGFyZ2V0Uk5DSWQJWzJdIFJOQ0lkCQlPUFRJT05BTCwKKwlhbi1BUERVCQlbM10JQWNjZXNzTmV0d29ya1NpZ25hbEluZm8JT1BUSU9OQUwsCisJc2VsZWN0ZWRSYWItSWQJWzRdCVJBQi1JZAlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzVdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJZ2VyYW4tY2xhc3NtYXJrCVs2XSBHRVJBTi1DbGFzc21hcmsJT1BUSU9OQUwsCisJcmFiLUNvbmZpZ3VyYXRpb25JbmRpY2F0b3IJWzddIE5VTEwJCU9QVElPTkFMIH0KKworUHJlcGFyZVN1YnNlcXVlbnRITy1SZXMgOjo9IFszXSBTRVFVRU5DRSB7CisJYW4tQVBEVQkJQWNjZXNzTmV0d29ya1NpZ25hbEluZm8sCisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitQcm9jZXNzQWNjZXNzU2lnbmFsbGluZy1BcmcgOjo9IFszXSBTRVFVRU5DRSB7CisJYW4tQVBEVQkJQWNjZXNzTmV0d29ya1NpZ25hbEluZm8sCisJc2VsZWN0ZWRVTVRTLUFsZ29yaXRobXMJWzFdCVNlbGVjdGVkVU1UUy1BbGdvcml0aG1zCU9QVElPTkFMLAorCXNlbGVjdGVkR1NNLUFsZ29yaXRobQlbMl0JU2VsZWN0ZWRHU00tQWxnb3JpdGhtCU9QVElPTkFMLAorCWNob3NlblJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbglbM10gQ2hvc2VuUmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uIE9QVElPTkFMLAorCXNlbGVjdGVkUmFiLUlkCVs0XSBSQUItSWQJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXQlFeHRlbnNpb25Db250YWluZXIgCU9QVElPTkFMLAorCS4uLiwKKwlpVVNlbGVjdGVkQ29kZWMJWzVdIENvZGVjCQlPUFRJT05BTCwKKwlpdUF2YWlsYWJsZUNvZGVjc0xpc3QJWzZdIENvZGVjTGlzdAlPUFRJT05BTCB9CisKK1N1cHBvcnRlZENvZGVjc0xpc3QgOjo9IFNFUVVFTkNFIHsKKwl1dHJhbkNvZGVjTGlzdAlbMF0gQ29kZWNMaXN0CU9QVElPTkFMLAorCWdlcmFuQ29kZWNMaXN0CVsxXSBDb2RlY0xpc3QJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitDb2RlY0xpc3QgOjo9IFNFUVVFTkNFIHsKKwljb2RlYzEJCVsxXSBDb2RlYywKKwljb2RlYzIJCVsyXSBDb2RlYwkJT1BUSU9OQUwsCisJY29kZWMzCQlbM10gQ29kZWMJCU9QVElPTkFMLAorCWNvZGVjNAkJWzRdIENvZGVjCQlPUFRJT05BTCwKKwljb2RlYzUJCVs1XSBDb2RlYwkJT1BUSU9OQUwsCisJY29kZWM2CQlbNl0gQ29kZWMJCU9QVElPTkFMLAorCWNvZGVjNwkJWzddIENvZGVjCQlPUFRJT05BTCwKKwljb2RlYzgJCVs4XSBDb2RlYwkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs5XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCS0tIENvZGVjcyBhcmUgc2VudCBpbiBwcmlvcml0eSBvcmRlciB3aGVyZSBjb2RlYzEgaGFzIGhpZ2hlc3QgcHJpb3JpdHkKKworQ29kZWMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uNCkpCisKKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKwktLSBvY3RldCAxCUNvZGVkIGFzIENvZGVjIElkZW50aWZpY2F0aW9uIGNvZGUgaW4gM0dQUCBUUyAyNi4xMDMKKwktLSBvY3RldHMgMiwzLDQJUGFyYW1ldGVycyBmb3IgdGhlIENvZGVjIGFzIGRlZmluZWQgaW4gM0dQUCBUUworCS0tCQkJMjYuMTAzLCBpZiBhdmFpbGFibGUsIGxlbmd0aCBkZXBlbmRpbmcgb24gdGhlIGNvZGVjCisKK0dFUkFOLUNsYXNzbWFyayA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgyLi44NykpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdGhlIEdFUkFOIENsYXNzbWFyayBpbmZvcm1hdGlvbiBlbGVtZW50IGluIDNHUFAgVFMgNDguMDA4CisKK1NlbGVjdGVkR1NNLUFsZ29yaXRobSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgY29kZWQgYXMgQWxnb3JpdGhtIGlkZW50aWZpZXIgb2N0ZXQgZnJvbSBDaG9zZW4gRW5jcnlwdGlvbgorCS0tIEFsZ29yaXRobSBkZWZpbmVkIGluIDNHUFAgVFMgNDguMDA4CisJLS0gQSBub2RlIHNoYWxsIG1hcmsgb25seSB0aGUgc2VsZWN0ZWQgR1NNIGFsZ29yaXRobQorCitTZW5kRW5kU2lnbmFsLUFyZyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwlhbi1BUERVCQlBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbywKKwlleHRlbnNpb25Db250YWluZXIJWzBdCUV4dGVuc2lvbkNvbnRhaW5lciAJT1BUSU9OQUwsCisJLi4ufQorCitTZW5kRW5kU2lnbmFsLVJlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0JRXh0ZW5zaW9uQ29udGFpbmVyIAlPUFRJT05BTCwKKwkuLi59CisKK1JOQ0lkIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDcpKQorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCS0tIG9jdGV0IDEgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgMXN0IGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIENvdW50cnkgQ29kZSAybmQgZGlnaXQKKwktLSBvY3RldCAyIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDNyZCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgM3JkIGRpZ2l0CisJLS0JCQlvciBmaWxsZXIgKDExMTEpIGZvciAyIGRpZ2l0IE1OQ3MKKwktLSBvY3RldCAzIGJpdHMgNDMyMQlNb2JpbGUgTmV0d29yayBDb2RlIDFzdCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgMm5kIGRpZ2l0CisJLS0gb2N0ZXRzIDQgYW5kIDUJTG9jYXRpb24gQXJlYSBDb2RlIGFjY29yZGluZyB0byAzR1BQIFRTIDI0LjAwOAorCS0tIG9jdGV0cyA2IGFuZCA3CVJOQyBJZCB2YWx1ZSBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyNS40MTMKKworUmVsb2NhdGlvbk51bWJlckxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mUmVsb2NhdGlvbk51bWJlcikgT0YKKwkJCQlSZWxvY2F0aW9uTnVtYmVyCisKK011bHRpY2FsbEJlYXJlckluZm8gOjo9IElOVEVHRVIgKDEuLm1heE51bU9mUmVsb2NhdGlvbk51bWJlcikKKworUmVsb2NhdGlvbk51bWJlciA6Oj0gU0VRVUVOQ0UgeworCWhhbmRvdmVyTnVtYmVyCUlTRE4tQWRkcmVzc1N0cmluZywKKwlyYWItSWQJCVJBQi1JZCwKKwktLSBSQUIgSWRlbnRpdHkgaXMgbmVlZGVkIHRvIHJlbGF0ZSB0aGUgY2FsbHMgd2l0aCB0aGUgcmFkaW8gYWNjZXNzIGJlYXJlcnMuIAorCS4uLn0KKworUkFCLUlkIDo6PSBJTlRFR0VSICgxLi5tYXhOck9mUkFCcykKKworbWF4TnJPZlJBQnMgSU5URUdFUiA6Oj0gMjU1CisKK21heE51bU9mUmVsb2NhdGlvbk51bWJlciAgSU5URUdFUiA6Oj0gNworCitSYWRpb1Jlc291cmNlSW5mb3JtYXRpb24gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMy4uMTMpKQorCS0tIE9jdGV0cyBhcmUgY29kZWQgYWNjb3JkaW5nIHRoZSBDaGFubmVsIFR5cGUgaW5mb3JtYXRpb24gZWxlbWVudCBpbiAzR1BQIFRTIDQ4LjAwOAorCitJbnRlZ3JpdHlQcm90ZWN0aW9uSW5mb3JtYXRpb24gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMTguLm1heE51bU9mSW50ZWdyaXR5SW5mbykpCisJLS0gT2N0ZXRzIGNvbnRhaW4gYSBjb21wbGV0ZSBJbnRlZ3JpdHlQcm90ZWN0aW9uSW5mb3JtYXRpb24gZGF0YSB0eXBlIAorCS0tIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyNS40MTMsIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBzY2hlbWUgCisJLS0gbWFuZGF0ZWQgYnkgM0dQUCBUUyAyNS40MTMKKwktLSBQYWRkaW5nIGJpdHMgYXJlIGluY2x1ZGVkLCBpZiBuZWVkZWQsIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSAKKwktLSBsYXN0IG9jdGV0IG9mIHRoZSBvY3RldCBzdHJpbmcuIAorCittYXhOdW1PZkludGVncml0eUluZm8gSU5URUdFUiA6Oj0gMTAwCisKK0VuY3J5cHRpb25JbmZvcm1hdGlvbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxOC4ubWF4TnVtT2ZFbmNyeXB0aW9uSW5mbykpCisJLS0gT2N0ZXRzIGNvbnRhaW4gYSBjb21wbGV0ZSBFbmNyeXB0aW9uSW5mb3JtYXRpb24gZGF0YSB0eXBlIAorCS0tIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyNS40MTMsIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBzY2hlbWUgCisJLS0gbWFuZGF0ZWQgYnkgM0dQUCBUUyAyNS40MTMKKwktLSBQYWRkaW5nIGJpdHMgYXJlIGluY2x1ZGVkLCBpZiBuZWVkZWQsIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSAKKwktLSBsYXN0IG9jdGV0IG9mIHRoZSBvY3RldCBzdHJpbmcuIAorCittYXhOdW1PZkVuY3J5cHRpb25JbmZvIElOVEVHRVIgOjo9IDEwMAorCistLSBhdXRoZW50aWNhdGlvbiBtYW5hZ2VtZW50IHR5cGVzCisKK1NlbmRBdXRoZW50aWNhdGlvbkluZm9BcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJWzBdIElNU0ksCisJbnVtYmVyT2ZSZXF1ZXN0ZWRWZWN0b3JzCU51bWJlck9mUmVxdWVzdGVkVmVjdG9ycywKKwlzZWdtZW50YXRpb25Qcm9oaWJpdGVkCU5VTEwJCQlPUFRJT05BTCwKKwlpbW1lZGlhdGVSZXNwb25zZVByZWZlcnJlZAlbMV0gTlVMTAkJCU9QVElPTkFMLAorCXJlLXN5bmNocm9uaXNhdGlvbkluZm8JUmUtc3luY2hyb25pc2F0aW9uSW5mbwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJcmVxdWVzdGluZ05vZGVUeXBlCVszXSBSZXF1ZXN0aW5nTm9kZVR5cGUJT1BUSU9OQUwsCisJcmVxdWVzdGluZ1BMTU4tSWQJWzRdIFBMTU4tSWQJT1BUSU9OQUwsCisJbnVtYmVyT2ZSZXF1ZXN0ZWRBZGRpdGlvbmFsLVZlY3RvcnMJWzVdIE51bWJlck9mUmVxdWVzdGVkVmVjdG9ycwlPUFRJT05BTCwKKwlhZGRpdGlvbmFsVmVjdG9yc0FyZUZvckVQUwlbNl0gTlVMTAkJT1BUSU9OQUwgfQkKKworCitOdW1iZXJPZlJlcXVlc3RlZFZlY3RvcnMgOjo9IElOVEVHRVIgKDEuLjUpCisKK1JlLXN5bmNocm9uaXNhdGlvbkluZm8gOjo9IFNFUVVFTkNFIHsKKwlyYW5kCQkJUkFORCwKKwlhdXRzCQkJQVVUUywKKwkuLi59CisKK1NlbmRBdXRoZW50aWNhdGlvbkluZm9SZXMgOjo9IFszXSBTRVFVRU5DRSB7CisJYXV0aGVudGljYXRpb25TZXRMaXN0CUF1dGhlbnRpY2F0aW9uU2V0TGlzdCAJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJZXBzLUF1dGhlbnRpY2F0aW9uU2V0TGlzdAlbMl0gRVBTLUF1dGhlbnRpY2F0aW9uU2V0TGlzdAlPUFRJT05BTCB9CisKK0VQUy1BdXRoZW50aWNhdGlvblNldExpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLjUpIE9GCisJCQkJRVBDLUFWCisKK0VQQy1BViA6Oj0gU0VRVUVOQ0UgeworCXJhbmQJCQlSQU5ELAorCXhyZXMJCQlYUkVTLAorCWF1dG4JCQlBVVROLAorCWthc21lCQlLQVNNRSwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworS0FTTUUgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMTYpKQorCitSZXF1ZXN0aW5nTm9kZVR5cGUgOjo9IEVOVU1FUkFURUQgeworCXZsciAgKDApLAorCXNnc24gICgxKSwKKwkuLi4sCisJcy1jc2NmICAoMiksCisJYnNmICAoMyksCisJZ2FuLWFhYS1zZXJ2ZXIgICg0KSwKKwl3bGFuLWFhYS1zZXJ2ZXIgICg1KSwKKwltbWUJCSgxNiksCisJbW1lLXNnc24JKDE3KQorCX0KKwktLSB0aGUgdmFsdWVzIDIsIDMsIDQgYW5kIDUgc2hhbGwgbm90IGJlIHVzZWQgb24gdGhlIE1BUC1EIG9yIEdyIGludGVyZmFjZXMKKwktLSBleGNlcHRpb24gaGFuZGxpbmc6CisJLS0gcmVjZWl2ZWQgdmFsdWVzIGluIHRoZSByYW5nZSAoNi0xNSkgc2hhbGwgYmUgdHJlYXRlZCBhcyAidmxyIgorCS0tIHJlY2VpdmVkIHZhbHVlcyBncmVhdGVyIHRoYW4gMTcgc2hhbGwgYmUgdHJlYXRlZCBhcyAic2dzbiIKKworLS0gZXF1aXBtZW50IG1hbmFnZW1lbnQgdHlwZXMKKworQ2hlY2tJTUVJLUFyZyA6Oj0gU0VRVUVOQ0UgeworCWltZWkJCQlJTUVJLAorCXJlcXVlc3RlZEVxdWlwbWVudEluZm8JUmVxdWVzdGVkRXF1aXBtZW50SW5mbywKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQ2hlY2tJTUVJLVJlcyA6Oj0gU0VRVUVOQ0UgeworCWVxdWlwbWVudFN0YXR1cwlFcXVpcG1lbnRTdGF0dXMJT1BUSU9OQUwsCisJYm11ZWYJCVVFU0JJLUl1CQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzBdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1JlcXVlc3RlZEVxdWlwbWVudEluZm86Oj0gQklUIFNUUklORyB7CisJZXF1aXBtZW50U3RhdHVzICAoMCksCisJYm11ZWYgICgxKX0gKFNJWkUgKDIuLjgpKQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzogcmVjZXB0aW9uIG9mIHVua25vd24gYml0IGFzc2lnbm1lbnRzIGluIHRoZQorCS0tIFJlcXVlc3RlZEVxdWlwbWVudEluZm8gZGF0YSB0eXBlIHNoYWxsIGJlIGRpc2NhcmRlZCBieSB0aGUgcmVjZWl2ZXIgCisKK1VFU0JJLUl1IDo6PSBTRVFVRU5DRSB7CisJdWVzYmktSXVBCVswXSBVRVNCSS1JdUEJCQkJT1BUSU9OQUwsCisJdWVzYmktSXVCCVsxXSBVRVNCSS1JdUIJCQkJT1BUSU9OQUwsCisJLi4ufQorCitVRVNCSS1JdUEJCQkJOjo9IEJJVCBTVFJJTkcgKFNJWkUoMS4uMTI4KSkKKy0tIFNlZSAzR1BQIFRTIDI1LjQxMworCitVRVNCSS1JdUIJCQkJOjo9IEJJVCBTVFJJTkcgKFNJWkUoMS4uMTI4KSkKKy0tIFNlZSAzR1BQIFRTIDI1LjQxMworCitFcXVpcG1lbnRTdGF0dXMgOjo9IEVOVU1FUkFURUQgeworCXdoaXRlTGlzdGVkICAoMCksCisJYmxhY2tMaXN0ZWQgICgxKSwKKwlncmV5TGlzdGVkICAoMil9CisKKy0tIHN1YnNjcmliZXIgbWFuYWdlbWVudCB0eXBlcworCitJbnNlcnRTdWJzY3JpYmVyRGF0YUFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlbMF0gSU1TSQkJT1BUSU9OQUwsCisJQ09NUE9ORU5UUyBPRglTdWJzY3JpYmVyRGF0YSwKKwlleHRlbnNpb25Db250YWluZXIJWzE0XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwJCisJbmFlYS1QcmVmZXJyZWRDSQlbMTVdIE5BRUEtUHJlZmVycmVkQ0kJT1BUSU9OQUwsCisJLS0gbmFlYS1QcmVmZXJyZWRDSSBpcyBpbmNsdWRlZCBhdCB0aGUgZGlzY3JldGlvbiBvZiB0aGUgSExSIG9wZXJhdG9yLgorCWdwcnNTdWJzY3JpcHRpb25EYXRhCVsxNl0gR1BSU1N1YnNjcmlwdGlvbkRhdGEJT1BUSU9OQUwsCisJcm9hbWluZ1Jlc3RyaWN0ZWRJblNnc25EdWVUb1Vuc3VwcG9ydGVkRmVhdHVyZSBbMjNdIAlOVUxMCQorCQkJCQkJCU9QVElPTkFMLCAKKwluZXR3b3JrQWNjZXNzTW9kZQlbMjRdIE5ldHdvcmtBY2Nlc3NNb2RlCU9QVElPTkFMLAorCWxzYUluZm9ybWF0aW9uCVsyNV0gTFNBSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJbG11LUluZGljYXRvcglbMjFdCU5VTEwJCU9QVElPTkFMLAorCWxjc0luZm9ybWF0aW9uCVsyMl0JTENTSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJaXN0QWxlcnRUaW1lcglbMjZdIElTVC1BbGVydFRpbWVyVmFsdWUJT1BUSU9OQUwsCisJc3VwZXJDaGFyZ2VyU3VwcG9ydGVkSW5ITFIJWzI3XSBBZ2VJbmRpY2F0b3IJT1BUSU9OQUwsCisJbWMtU1MtSW5mbwlbMjhdIE1DLVNTLUluZm8JT1BUSU9OQUwsCisJY3MtQWxsb2NhdGlvblJldGVudGlvblByaW9yaXR5CVsyOV0gQ1MtQWxsb2NhdGlvblJldGVudGlvblByaW9yaXR5CQlPUFRJT05BTCwKKwlzZ3NuLUNBTUVMLVN1YnNjcmlwdGlvbkluZm8JWzE3XSBTR1NOLUNBTUVMLVN1YnNjcmlwdGlvbkluZm8JT1BUSU9OQUwsCisJY2hhcmdpbmdDaGFyYWN0ZXJpc3RpY3MgCVsxOF0JQ2hhcmdpbmdDaGFyYWN0ZXJpc3RpY3MgCU9QVElPTkFMLAorCWFjY2Vzc1Jlc3RyaWN0aW9uRGF0YQlbMTldIEFjY2Vzc1Jlc3RyaWN0aW9uRGF0YQlPUFRJT05BTCwKKwlpY3MtSW5kaWNhdG9yCVsyMF0JQk9PTEVBTglPUFRJT05BTCwKKwllcHMtU3Vic2NyaXB0aW9uRGF0YQlbMzFdCUVQUy1TdWJzY3JpcHRpb25EYXRhCU9QVElPTkFMLAorCWNzZy1TdWJzY3JpcHRpb25EYXRhTGlzdAlbMzJdIENTRy1TdWJzY3JpcHRpb25EYXRhTGlzdAlPUFRJT05BTCB9CisJLS0gSWYgdGhlIE5ldHdvcmsgQWNjZXNzIE1vZGUgcGFyYW1ldGVyIGlzIHNlbnQsIGl0IHNoYWxsIGJlIHByZXNlbnQgb25seSBpbiAKKwktLSB0aGUgZmlyc3Qgc2VxdWVuY2UgaWYgc2VxbWVudGF0aW9uIGlzIHVzZWQKKworQ1NHLVN1YnNjcmlwdGlvbkRhdGFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi41MCkgT0YKKwkJCQlDU0ctU3Vic2NyaXB0aW9uRGF0YQorCitDU0ctU3Vic2NyaXB0aW9uRGF0YSA6Oj0gU0VRVUVOQ0UgeworCWNzZy1JZAkgCQlDU0ctSWQsCisJZXhwaXJhdGlvbkRhdGUJCVRpbWUJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcgkJRXh0ZW5zaW9uQ29udGFpbmVyIAlPUFRJT05BTCwKKwkuLi59CisKK0NTRy1JZCA6Oj0gQklUIFNUUklORyAoU0laRSAoMjcpKQorCS0tIGNvZGVkIGFjY29yZGluZyB0byAzR1BQIFRTIDIzLjAwMyBbMTddLgorCitUaW1lIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDQpKQorCS0tIE9jdGV0cyBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIElFVEYgUkZDIDM1ODggWzEzOV0KKworCitFUFMtU3Vic2NyaXB0aW9uRGF0YSA6Oj0gU0VRVUVOQ0UgeworCWFwbi1vaS1SZXBsYWNlbWVudAlbMF0JQVBOLU9JLVJlcGxhY2VtZW50CU9QVElPTkFMLAorCXJmc3AtaWQJCVsyXQlSRlNQLUlECQlPUFRJT05BTCwKKwlhbWJyCQkJWzNdCUFNQlIJCU9QVElPTkFMLAorCWFwbi1Db25maWd1cmF0aW9uUHJvZmlsZQlbNF0JQVBOLUNvbmZpZ3VyYXRpb25Qcm9maWxlCU9QVElPTkFMLAorCXN0bi1zcgkJWzZdCUlTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzVdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitBUE4tT0ktUmVwbGFjZW1lbnQgOjo9ICBPQ1RFVCBTVFJJTkcgKFNJWkUgKDkuLjEwMCkpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhcyBBUE4gT3BlcmF0b3IgSWRlbnRpZmllciBhY2NvcmRpbmcgdG8gVFMgM0dQUCBUUyAyMy4wMDMgWzE3XSAKKworUkZTUC1JRCA6Oj0gIElOVEVHRVIgKDEuLjI1NikKKworQVBOLUNvbmZpZ3VyYXRpb25Qcm9maWxlIDo6PSBTRVFVRU5DRSB7CisJZGVmYXVsdENvbnRleHQJQ29udGV4dElkLAorCWNvbXBsZXRlRGF0YUxpc3RJbmNsdWRlZAlOVUxMCQkJT1BUSU9OQUwsCisJCS0tIElmIHNlZ21lbnRhdGlvbiBpcyB1c2VkLCBjb21wbGV0ZURhdGFMaXN0SW5jbHVkZWQgbWF5IG9ubHkgYmUgcHJlc2VudCBpbiB0aGUKKwkJLS0gZmlyc3Qgc2VnbWVudCBvZiBBUE4tQ29uZmlndXJhdGlvblByb2ZpbGUuCisJZXBzRGF0YUxpc3QJWzFdCUVQUy1EYXRhTGlzdCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitFUFMtRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQVBOLUNvbmZpZ3VyYXRpb25zKSBPRgorCQkJCUFQTi1Db25maWd1cmF0aW9uCisKKworbWF4TnVtT2ZBUE4tQ29uZmlndXJhdGlvbnMgIElOVEVHRVIgOjo9IDUwCisKKworQVBOLUNvbmZpZ3VyYXRpb24gOjo9IFNFUVVFTkNFIHsKKwljb250ZXh0SWQJCVswXSBDb250ZXh0SWQsCisJc2VydmVkUGFydHlJUC1BZGRyZXNzCVsxXSBQRFAtQWRkcmVzcwlPUFRJT05BTCwKKwlhcG4JCQlbMl0gQVBOLAorCWVwcy1xb3MtU3Vic2NyaWJlZAlbM10gRVBTLVFvUy1TdWJzY3JpYmVkLAorCXBkbi1ndy1JZGVudGl0eQlbNF0gUEROLUdXLUlkZW50aXR5CU9QVElPTkFMLAorCXBkbi1ndy1BbGxvY2F0aW9uVHlwZQlbNV0gUEROLUdXLUFsbG9jYXRpb25UeXBlCU9QVElPTkFMLAorCXZwbG1uQWRkcmVzc0FsbG93ZWQJWzZdIE5VTEwJCU9QVElPTkFMLAorCWNoYXJnaW5nQ2hhcmFjdGVyaXN0aWNzCVs3XSBDaGFyZ2luZ0NoYXJhY3RlcmlzdGljcwlPUFRJT05BTCwKKwlhbWJyCQkJWzhdIEFNQlIJCU9QVElPTkFMLAorCXNwZWNpZmljQVBOSW5mb0xpc3QJWzldIFNwZWNpZmljQVBOSW5mb0xpc3QJT1BUSU9OQUwsCWV4dGVuc2lvbkNvbnRhaW5lcglbMTBdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitFUFMtUW9TLVN1YnNjcmliZWQgOjo9IFNFUVVFTkNFIHsKKwlxb3MtQ2xhc3MtSWRlbnRpZmllcglbMF0gUW9TLUNsYXNzLUlkZW50aWZpZXIsCisJYWxsb2NhdGlvbi1SZXRlbnRpb24tUHJpb3JpdHkJWzFdIEFsbG9jYXRpb24tUmV0ZW50aW9uLVByaW9yaXR5LAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CisKK0FNQlIgOjo9IFNFUVVFTkNFIHsKKwltYXgtUmVxdWVzdGVkQmFuZHdpZHRoLVVMCVswXSBCYW5kd2lkdGgsCisJbWF4LVJlcXVlc3RlZEJhbmR3aWR0aC1ETAlbMV0gQmFuZHdpZHRoLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CisKKworU3BlY2lmaWNBUE5JbmZvTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZTcGVjaWZpY0FQTkluZm9zKSBPRgorCQkJCVNwZWNpZmljQVBOSW5mbworCittYXhOdW1PZlNwZWNpZmljQVBOSW5mb3MgIElOVEVHRVIgOjo9IDUwCisKK1NwZWNpZmljQVBOSW5mbyA6Oj0gU0VRVUVOQ0UgeworCWFwbgkJCVswXSBBUE4sCisJcGRuLWd3LUlkZW50aXR5CVsxXSBQRE4tR1ctSWRlbnRpdHksCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uIH0KKworQmFuZHdpZHRoIDo6PSBJTlRFR0VSIAorCS0tIGJpdHMgcGVyIHNlY29uZAorCitRb1MtQ2xhc3MtSWRlbnRpZmllciA6Oj0gSU5URUdFUiAoMS4uOSkKKwktLSB2YWx1ZXMgYXJlIGRlZmluZWQgaW4gIDNHUFAgVFMgMjkuMjEyCisKKworCitBbGxvY2F0aW9uLVJldGVudGlvbi1Qcmlvcml0eSA6Oj0gU0VRVUVOQ0UgeworCXByaW9yaXR5LWxldmVsCVswXSBJTlRFR0VSLAorCXByZS1lbXB0aW9uLWNhcGFiaWxpdHkJWzFdIEJPT0xFQU4JT1BUSU9OQUwsCisJcHJlLWVtcHRpb24tdnVsbmVyYWJpbGl0eQlbMl0gQk9PTEVBTglPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitQRE4tR1ctSWRlbnRpdHkgOjo9IFNFUVVFTkNFIHsKKwlwZG4tZ3ctaXB2NC1BZGRyZXNzCVswXSBQRFAtQWRkcmVzcwlPUFRJT05BTCwKKwlwZG4tZ3ctaXB2Ni1BZGRyZXNzCVsxXSBQRFAtQWRkcmVzcwlPUFRJT05BTCwKKwlwZG4tZ3ctbmFtZQlbMl0gRlFETgkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uIH0KKworRlFETiA6Oj0gIE9DVEVUIFNUUklORyAoU0laRSAoOS4uMTAwKSkKKworCitQRE4tR1ctQWxsb2NhdGlvblR5cGUgOjo9IEVOVU1FUkFURUQgeworCXN0YXRpYwkoMCksCisJZHluYW1pYwkoMSl9CisKKworQWNjZXNzUmVzdHJpY3Rpb25EYXRhIDo6PSBCSVQgU1RSSU5HIHsKKwl1dHJhbk5vdEFsbG93ZWQgKDApLAorCWdlcmFuTm90QWxsb3dlZCAoMSksCisJZ2FuTm90QWxsb3dlZCAgICgyKSwKKwlpLWhzcGEtZXZvbHV0aW9uTm90QWxsb3dlZCAoMyksCisJZS11dHJhbk5vdEFsbG93ZWQgKDQpLAorCWhvLXRvTm9uM0dQUC1BY2Nlc3NOb3RBbGxvd2VkICg1KSB9IChTSVpFICgyLi44KSkKKwktLSBleGNlcHRpb24gaGFuZGxpbmc6IAorCS0tIGFjY2VzcyByZXN0cmljdGlvbiBkYXRhIHJlbGF0ZWQgdG8gYW4gYWNjZXNzIHR5cGUgbm90IHN1cHBvcnRlZCBieSBhIG5vZGUKKwktLSBzaGFsbCBiZSBpZ25vcmVkCisJLS0gYml0cyA2IHRvIDcgc2hhbGwgYmUgaWdub3JlZCBpZiByZWNlaXZlZCBhbmQgbm90IHVuZGVyc3Rvb2QKKwkKKworQ1MtQWxsb2NhdGlvblJldGVudGlvblByaW9yaXR5IDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIFRoaXMgZGF0YSB0eXBlIGVuY29kZXMgZWFjaCBwcmlvcml0eSBsZXZlbCBkZWZpbmVkIGluIFRTIDIzLjEwNyBhcyB0aGUgYmluYXJ5IHZhbHVlCisJLS0gb2YgdGhlIHByaW9yaXR5IGxldmVsLgorCitJU1QtQWxlcnRUaW1lclZhbHVlIDo6PSBJTlRFR0VSICgxNS4uMjU1KQorCitMQ1NJbmZvcm1hdGlvbiA6Oj0gU0VRVUVOQ0UgeworCWdtbGMtTGlzdAlbMF0JR01MQy1MaXN0CU9QVElPTkFMLAorCWxjcy1Qcml2YWN5RXhjZXB0aW9uTGlzdAlbMV0JTENTLVByaXZhY3lFeGNlcHRpb25MaXN0CU9QVElPTkFMLAorCW1vbHItTGlzdAkJWzJdCU1PTFItTGlzdAlPUFRJT05BTCwKKwkuLi4sCisJYWRkLWxjcy1Qcml2YWN5RXhjZXB0aW9uTGlzdAlbM10JTENTLVByaXZhY3lFeGNlcHRpb25MaXN0CU9QVElPTkFMIH0KKwktLSBhZGQtbGNzLVByaXZhY3lFeGNlcHRpb25MaXN0IG1heSBiZSBzZW50IG9ubHkgaWYgbGNzLVByaXZhY3lFeGNlcHRpb25MaXN0IGlzCisJLS0gcHJlc2VudCBhbmQgY29udGFpbnMgZm91ciBpbnN0YW5jZXMgb2YgTENTLVByaXZhY3lDbGFzcy4gSWYgdGhlIG1lbnRpb25lZCBjb25kaXRpb24KKwktLSBpcyBub3Qgc2F0aXNmaWVkIHRoZSByZWNlaXZpbmcgbm9kZSBzaGFsbCBkaXNjYXJkIGFkZC1sY3MtUHJpdmFjeUV4Y2VwdGlvbkxpc3QuCisJLS0gSWYgYW4gTENTLVByaXZhY3lDbGFzcyBpcyByZWNlaXZlZCBib3RoIGluIGxjcy1Qcml2YWN5RXhjZXB0aW9uTGlzdCBhbmQgaW4KKwktLSBhZGQtbGNzLVByaXZhY3lFeGNlcHRpb25MaXN0IHdpdGggdGhlIHNhbWUgU1MtQ29kZSwgdGhlbiB0aGUgZXJyb3IgdW5leHBlY3RlZCAKKwktLSBkYXRhIHZhbHVlIHNoYWxsIGJlIHJldHVybmVkLgorCitHTUxDLUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mR01MQykgT0YKKwkJCQlJU0ROLUFkZHJlc3NTdHJpbmcKKwktLSBpZiBzZWdtZW50YXRpb24gaXMgdXNlZCwgdGhlIGNvbXBsZXRlIEdNTEMtTGlzdCBzaGFsbCBiZSBzZW50IGluIG9uZSBzZWdtZW50CisKK21heE51bU9mR01MQyAgSU5URUdFUiA6Oj0gNQorCitOZXR3b3JrQWNjZXNzTW9kZSA6Oj0gRU5VTUVSQVRFRCB7CisJcGFja2V0QW5kQ2lyY3VpdAkoMCksCisJb25seUNpcmN1aXQJCSgxKSwKKwlvbmx5UGFja2V0CQkoMiksCisJLi4ufQorCS0tIGlmIHVua25vd24gdmFsdWVzIGFyZSByZWNlaXZlZCBpbiBOZXR3b3JrQWNjZXNzTW9kZQorCS0tIHRoZXkgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitHUFJTRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mUERQLUNvbnRleHRzKSBPRgorCQkJCVBEUC1Db250ZXh0CisKK21heE51bU9mUERQLUNvbnRleHRzICBJTlRFR0VSIDo6PSA1MAorCitQRFAtQ29udGV4dCA6Oj0gU0VRVUVOQ0UgeworCXBkcC1Db250ZXh0SWQJQ29udGV4dElkLAorCXBkcC1UeXBlCQlbMTZdIFBEUC1UeXBlLAorCXBkcC1BZGRyZXNzCVsxN10gUERQLUFkZHJlc3MJT1BUSU9OQUwsCisJcW9zLVN1YnNjcmliZWQJWzE4XSBRb1MtU3Vic2NyaWJlZCwKKwl2cGxtbkFkZHJlc3NBbGxvd2VkCVsxOV0gTlVMTAlPUFRJT05BTCwKKwlhcG4JCQlbMjBdIEFQTiwKKwlleHRlbnNpb25Db250YWluZXIJWzIxXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlleHQtUW9TLVN1YnNjcmliZWQJWzBdIEV4dC1Rb1MtU3Vic2NyaWJlZAlPUFRJT05BTCwgCisJcGRwLUNoYXJnaW5nQ2hhcmFjdGVyaXN0aWNzCVsxXSBDaGFyZ2luZ0NoYXJhY3RlcmlzdGljcwlPUFRJT05BTCwKKwlleHQyLVFvUy1TdWJzY3JpYmVkCVsyXSBFeHQyLVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMLAorCS0tIGV4dDItUW9TLVN1YnNjcmliZWQgbWF5IGJlIHByZXNlbnQgb25seSBpZiBleHQtUW9TLVN1YnNjcmliZWQgaXMgcHJlc2VudC4KKwlleHQzLVFvUy1TdWJzY3JpYmVkCVszXSBFeHQzLVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMCisJLS0gZXh0My1Rb1MtU3Vic2NyaWJlZCBtYXkgYmUgcHJlc2VudCBvbmx5IGlmIGV4dDItUW9TLVN1YnNjcmliZWQgaXMgcHJlc2VudC4KKwkgfQorCitDb250ZXh0SWQgOjo9IElOVEVHRVIgKDEuLm1heE51bU9mUERQLUNvbnRleHRzKQorCitHUFJTU3Vic2NyaXB0aW9uRGF0YSA6Oj0gU0VRVUVOQ0UgeworCWNvbXBsZXRlRGF0YUxpc3RJbmNsdWRlZAlOVUxMCQkJT1BUSU9OQUwsCisJCS0tIElmIHNlZ21lbnRhdGlvbiBpcyB1c2VkLCBjb21wbGV0ZURhdGFMaXN0SW5jbHVkZWQgbWF5IG9ubHkgYmUgcHJlc2VudCBpbiB0aGUKKwkJLS0gZmlyc3Qgc2VnbWVudCBvZiBHUFJTU3Vic2NyaXB0aW9uRGF0YS4KKwlncHJzRGF0YUxpc3QJWzFdCUdQUlNEYXRhTGlzdCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitTR1NOLUNBTUVMLVN1YnNjcmlwdGlvbkluZm8gOjo9IFNFUVVFTkNFIHsKKwlncHJzLUNTSQkJWzBdCUdQUlMtQ1NJCU9QVElPTkFMLAorCW1vLXNtcy1DU0kJWzFdCVNNUy1DU0kJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCW10LXNtcy1DU0kJWzNdCVNNUy1DU0kJT1BUSU9OQUwsCisJbXQtc21zQ0FNRUxURFAtQ3JpdGVyaWFMaXN0CVs0XQlNVC1zbXNDQU1FTFREUC1Dcml0ZXJpYUxpc3QJT1BUSU9OQUwsCisJbWctY3NpCQlbNV0JTUctQ1NJCU9QVElPTkFMCisJfQorCitHUFJTLUNTSSA6Oj0gU0VRVUVOQ0UgeworCWdwcnMtQ2FtZWxURFBEYXRhTGlzdAlbMF0gR1BSUy1DYW1lbFREUERhdGFMaXN0CU9QVElPTkFMLAorCWNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCVsxXSBDYW1lbENhcGFiaWxpdHlIYW5kbGluZwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwlub3RpZmljYXRpb25Ub0NTRQlbM10JTlVMTAkJT1BUSU9OQUwsCisJY3NpLUFjdGl2ZQlbNF0JTlVMTAkJT1BUSU9OQUwsCisJLi4ufQorLS0Jbm90aWZpY2F0aW9uVG9DU0UgYW5kIGNzaS1BY3RpdmUgc2hhbGwgbm90IGJlIHByZXNlbnQgd2hlbiBHUFJTLUNTSSBpcyBzZW50IHRvIFNHU04uCistLQlUaGV5IG1heSBvbmx5IGJlIGluY2x1ZGVkIGluIEFUU0kvQVRNIGFjay9OU0RDIG1lc3NhZ2UuIAorLS0JR1BSUy1DYW1lbFREUERhdGEgYW5kICBjYW1lbENhcGFiaWxpdHlIYW5kbGluZyBzaGFsbCBiZSBwcmVzZW50IGluIAorLS0JdGhlIEdQUlMtQ1NJIHNlcXVlbmNlLgorLS0JSWYgR1BSUy1DU0kgaXMgc2VnbWVudGVkLCBncHJzLUNhbWVsVERQRGF0YUxpc3QgYW5kIGNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nIHNoYWxsIGJlIAorLS0JcHJlc2VudCBpbiB0aGUgZmlyc3Qgc2VnbWVudAorCitHUFJTLUNhbWVsVERQRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQ2FtZWxURFBEYXRhKSBPRgorCUdQUlMtQ2FtZWxURFBEYXRhCistLQlHUFJTLUNhbWVsVERQRGF0YUxpc3Qgc2hhbGwgbm90IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBpbnN0YW5jZSBvZgorLS0JR1BSUy1DYW1lbFREUERhdGEgY29udGFpbmluZyB0aGUgc2FtZSB2YWx1ZSBmb3IgZ3Bycy1UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQuCisKK0dQUlMtQ2FtZWxURFBEYXRhIDo6PSBTRVFVRU5DRSB7CisJZ3Bycy1UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQJWzBdIEdQUlMtVHJpZ2dlckRldGVjdGlvblBvaW50LAorCXNlcnZpY2VLZXkJWzFdIFNlcnZpY2VLZXksCisJZ3NtU0NGLUFkZHJlc3MJWzJdIElTRE4tQWRkcmVzc1N0cmluZywKKwlkZWZhdWx0U2Vzc2lvbkhhbmRsaW5nCVszXSBEZWZhdWx0R1BSUy1IYW5kbGluZywKKwlleHRlbnNpb25Db250YWluZXIJWzRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4KKwl9CisKK0RlZmF1bHRHUFJTLUhhbmRsaW5nIDo6PSBFTlVNRVJBVEVEIHsKKwljb250aW51ZVRyYW5zYWN0aW9uICgwKSAsCisJcmVsZWFzZVRyYW5zYWN0aW9uICgxKSAsCisJLi4ufQorLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0gcmVjZXB0aW9uIG9mIHZhbHVlcyBpbiByYW5nZSAyLTMxIHNoYWxsIGJlIHRyZWF0ZWQgYXMgImNvbnRpbnVlVHJhbnNhY3Rpb24iCistLSByZWNlcHRpb24gb2YgdmFsdWVzIGdyZWF0ZXIgdGhhbiAzMSBzaGFsbCBiZSB0cmVhdGVkIGFzICJyZWxlYXNlVHJhbnNhY3Rpb24iCisKK0dQUlMtVHJpZ2dlckRldGVjdGlvblBvaW50IDo6PSBFTlVNRVJBVEVEIHsKKwlhdHRhY2ggCQkJKDEpLAorCWF0dGFjaENoYW5nZU9mUG9zaXRpb24gCQkoMiksCisJcGRwLUNvbnRleHRFc3RhYmxpc2htZW50IAkJKDExKSwKKwlwZHAtQ29udGV4dEVzdGFibGlzaG1lbnRBY2tub3dsZWRnZW1lbnQJKDEyKSwKKwlwZHAtQ29udGV4dENoYW5nZU9mUG9zaXRpb24gCQkoMTQpLAorCS4uLiB9CistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSBGb3IgR1BSUy1DYW1lbFREUERhdGEgc2VxdWVuY2VzIGNvbnRhaW5pbmcgdGhpcyBwYXJhbWV0ZXIgd2l0aCBhbnkKKy0tIG90aGVyIHZhbHVlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUgdGhlIHdob2xlIAorLS0gR1BSUy1DYW1lbFREUERhdGFzZXF1ZW5jZS4KKworQVBOIDo6PSAgT0NURVQgU1RSSU5HIChTSVpFICgyLi42MykpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gVFMgM0dQUCBUUyAyMy4wMDMgWzE3XSAKKworUERQLVR5cGUgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMikpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gVFMgM0dQUCBUUyAyOS4wNjAgWzEwNV0KKworUERQLUFkZHJlc3MgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uMTYpKQorCS0tIE9jdGV0cyBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIFRTIDNHUFAgVFMgMjkuMDYwIFsxMDVdCisKKwktLSBUaGUgcG9zc2libGUgc2l6ZSB2YWx1ZXMgYXJlOgorCS0tIDEtNyBvY3RldHMgIFguMjUgYWRkcmVzcyB0eXBlCisJLS0gIDQgIG9jdGV0cyAgSVB2NCBhZGRyZXNzIHR5cGUKKwktLSAxNiAgb2N0ZXRzICBJcHY2IGFkZHJlc3MgdHlwZQorCitRb1MtU3Vic2NyaWJlZCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgzKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDI0LjAwOCBbMzVdIFF1YWxpdHkgb2YgU2VydmljZSBPY3RldHMgCisJLS0gMy01LgorCitFeHQtUW9TLVN1YnNjcmliZWQgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uOSkpCisJLS0gT0NURVQgMTogCisJLS0gIEFsbG9jYXRpb24vUmV0ZW50aW9uIFByaW9yaXR5IChUaGlzIG9jdGV0IGVuY29kZXMgZWFjaCBwcmlvcml0eSBsZXZlbCBkZWZpbmVkIGluCisJLS0gICAgIDIzLjEwNyBhcyB0aGUgYmluYXJ5IHZhbHVlIG9mIHRoZSBwcmlvcml0eSBsZXZlbCwgZGVjbGFyYXRpb24gaW4gMjkuMDYwKQorCS0tIE9jdGV0cyAyLTkgYXJlIGNvZGVkIGFjY29yZGluZyB0byAzR1BQIFRTIDI0LjAwOCBbMzVdIFF1YWxpdHkgb2YgU2VydmljZSBPY3RldHMgCisJLS0gNi0xMy4KKworRXh0Mi1Rb1MtU3Vic2NyaWJlZCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi4zKSkKKwktLSBPY3RldHMgMS0zIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyNC4wMDggWzM1XSBRdWFsaXR5IG9mIFNlcnZpY2UgT2N0ZXRzIDE0LTE2LgorCS0tIElmIFF1YWxpdHkgb2YgU2VydmljZSBpbmZvcm1hdGlvbiBpcyBzdHJ1Y3R1cmVkIHdpdGggMTQgb2N0ZXQgbGVuZ3RoLCB0aGVuCisJLS0gT2N0ZXQgMSBpcyBjb2RlZCBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyNC4wMDggWzM1XSBRdWFsaXR5IG9mIFNlcnZpY2UgT2N0ZXQgMTQuCisKK0V4dDMtUW9TLVN1YnNjcmliZWQgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uMikpCisJLS0gT2N0ZXRzIDEtMiBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjQuMDA4IFszNV0gUXVhbGl0eSBvZiBTZXJ2aWNlIE9jdGV0cyAxNy0xOC4KKworQ2hhcmdpbmdDaGFyYWN0ZXJpc3RpY3MgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMikpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gM0dQUCBUUyAzMi4yMTUuCisKK0xTQU9ubHlBY2Nlc3NJbmRpY2F0b3IgOjo9IEVOVU1FUkFURUQgeworCWFjY2Vzc091dHNpZGVMU0FzQWxsb3dlZCAgKDApLAorCWFjY2Vzc091dHNpZGVMU0FzUmVzdHJpY3RlZCAoMSl9CisKK0xTQURhdGFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkxTQXMpIE9GCisJCQkJTFNBRGF0YQorCittYXhOdW1PZkxTQXMgIElOVEVHRVIgOjo9IDIwCisKK0xTQURhdGEgOjo9IFNFUVVFTkNFIHsKKwlsc2FJZGVudGl0eQlbMF0gTFNBSWRlbnRpdHksCisJbHNhQXR0cmlidXRlcwlbMV0gTFNBQXR0cmlidXRlcywKKwlsc2FBY3RpdmVNb2RlSW5kaWNhdG9yCVsyXSBOVUxMCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0xTQUluZm9ybWF0aW9uIDo6PSBTRVFVRU5DRSB7CisJY29tcGxldGVEYXRhTGlzdEluY2x1ZGVkCU5VTEwJCQlPUFRJT05BTCwKKworCQktLSBJZiBzZWdtZW50YXRpb24gaXMgdXNlZCwgY29tcGxldGVEYXRhTGlzdEluY2x1ZGVkIG1heSBvbmx5IGJlIHByZXNlbnQgaW4gdGhlCisJCS0tIGZpcnN0IHNlZ21lbnQuCisJbHNhT25seUFjY2Vzc0luZGljYXRvcglbMV0JTFNBT25seUFjY2Vzc0luZGljYXRvcglPUFRJT05BTCwKKwlsc2FEYXRhTGlzdAlbMl0JTFNBRGF0YUxpc3QJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitMU0FJZGVudGl0eSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgzKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDIzLjAwMyBbMTddCisKK0xTQUF0dHJpYnV0ZXMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gVFMgM0dQUCBUUyA0OC4wMDggWzQ5XQorCitTdWJzY3JpYmVyRGF0YSA6Oj0gU0VRVUVOQ0UgeworCW1zaXNkbgkJWzFdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwljYXRlZ29yeQkJWzJdIENhdGVnb3J5CU9QVElPTkFMLAorCXN1YnNjcmliZXJTdGF0dXMJWzNdIFN1YnNjcmliZXJTdGF0dXMJT1BUSU9OQUwsCisJYmVhcmVyU2VydmljZUxpc3QJWzRdIEJlYXJlclNlcnZpY2VMaXN0CU9QVElPTkFMLAorCS0tIFRoZSBleGNlcHRpb24gaGFuZGxpbmcgZm9yIHJlY2VwdGlvbiBvZiB1bnN1cHBvcnRlZCAvIG5vdCBhbGxvY2F0ZWQKKwktLSBiZWFyZXJTZXJ2aWNlQ29kZXMgaXMgZGVmaW5lZCBpbiBzZWN0aW9uIDguOC4xCisJdGVsZXNlcnZpY2VMaXN0CVs2XSBUZWxlc2VydmljZUxpc3QJT1BUSU9OQUwsCisJLS0gVGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBmb3IgcmVjZXB0aW9uIG9mIHVuc3VwcG9ydGVkIC8gbm90IGFsbG9jYXRlZAorCS0tIHRlbGVzZXJ2aWNlQ29kZXMgaXMgZGVmaW5lZCBpbiBzZWN0aW9uIDguOC4xCisJcHJvdmlzaW9uZWRTUwlbN10gRXh0LVNTLUluZm9MaXN0CU9QVElPTkFMLAorCW9kYi1EYXRhCQlbOF0gT0RCLURhdGEJT1BUSU9OQUwsCisJcm9hbWluZ1Jlc3RyaWN0aW9uRHVlVG9VbnN1cHBvcnRlZEZlYXR1cmUgIFs5XSBOVUxMCU9QVElPTkFMLAorCXJlZ2lvbmFsU3Vic2NyaXB0aW9uRGF0YQlbMTBdIFpvbmVDb2RlTGlzdAlPUFRJT05BTCwKKwl2YnNTdWJzY3JpcHRpb25EYXRhCVsxMV0gVkJTRGF0YUxpc3QJT1BUSU9OQUwsCisJdmdjc1N1YnNjcmlwdGlvbkRhdGEJWzEyXSBWR0NTRGF0YUxpc3QJT1BUSU9OQUwsCisJdmxyQ2FtZWxTdWJzY3JpcHRpb25JbmZvCVsxM10gVmxyQ2FtZWxTdWJzY3JpcHRpb25JbmZvCU9QVElPTkFMCisJfQorCitDYXRlZ29yeSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgaW4gSVRVLVQgUmVjIFEuNzYzLgorCitTdWJzY3JpYmVyU3RhdHVzIDo6PSBFTlVNRVJBVEVEIHsKKwlzZXJ2aWNlR3JhbnRlZCAgKDApLAorCW9wZXJhdG9yRGV0ZXJtaW5lZEJhcnJpbmcgICgxKX0KKworQmVhcmVyU2VydmljZUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQmVhcmVyU2VydmljZXMpIE9GCisJCQkJRXh0LUJlYXJlclNlcnZpY2VDb2RlCisKK21heE51bU9mQmVhcmVyU2VydmljZXMgIElOVEVHRVIgOjo9IDUwCisKK1RlbGVzZXJ2aWNlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZUZWxlc2VydmljZXMpIE9GCisJCQkJRXh0LVRlbGVzZXJ2aWNlQ29kZQorCittYXhOdW1PZlRlbGVzZXJ2aWNlcyAgSU5URUdFUiA6Oj0gMjAKKworT0RCLURhdGEgOjo9IFNFUVVFTkNFIHsKKwlvZGItR2VuZXJhbERhdGEJT0RCLUdlbmVyYWxEYXRhLAorCW9kYi1IUExNTi1EYXRhCU9EQi1IUExNTi1EYXRhCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitPREItR2VuZXJhbERhdGEgOjo9IEJJVCBTVFJJTkcgeworCWFsbE9HLUNhbGxzQmFycmVkICAoMCksCisJaW50ZXJuYXRpb25hbE9HQ2FsbHNCYXJyZWQgICgxKSwKKwlpbnRlcm5hdGlvbmFsT0dDYWxsc05vdFRvSFBMTU4tQ291bnRyeUJhcnJlZCAgKDIpLAorCWludGVyem9uYWxPR0NhbGxzQmFycmVkICg2KSwKKwlpbnRlcnpvbmFsT0dDYWxsc05vdFRvSFBMTU4tQ291bnRyeUJhcnJlZCAoNyksCisJaW50ZXJ6b25hbE9HQ2FsbHNBbmRJbnRlcm5hdGlvbmFsT0dDYWxsc05vdFRvSFBMTU4tQ291bnRyeUJhcnJlZCAoOCksCisJcHJlbWl1bVJhdGVJbmZvcm1hdGlvbk9HQ2FsbHNCYXJyZWQgICgzKSwKKwlwcmVtaXVtUmF0ZUVudGVydGFpbmVtZW50T0dDYWxsc0JhcnJlZCAgKDQpLAorCXNzLUFjY2Vzc0JhcnJlZCAgKDUpLAorCWFsbEVDVC1CYXJyZWQgKDkpLAorCWNoYXJnZWFibGVFQ1QtQmFycmVkICgxMCksCisJaW50ZXJuYXRpb25hbEVDVC1CYXJyZWQgKDExKSwKKwlpbnRlcnpvbmFsRUNULUJhcnJlZCAoMTIpLAorCWRvdWJseUNoYXJnZWFibGVFQ1QtQmFycmVkICgxMyksCisJbXVsdGlwbGVFQ1QtQmFycmVkICgxNCksCisJYWxsUGFja2V0T3JpZW50ZWRTZXJ2aWNlc0JhcnJlZCAoMTUpLAorCXJvYW1lckFjY2Vzc1RvSFBMTU4tQVAtQmFycmVkICAoMTYpLAorCXJvYW1lckFjY2Vzc1RvVlBMTU4tQVAtQmFycmVkICAoMTcpLAorCXJvYW1pbmdPdXRzaWRlUExNTk9HLUNhbGxzQmFycmVkICAoMTgpLAorCWFsbElDLUNhbGxzQmFycmVkICAoMTkpLAorCXJvYW1pbmdPdXRzaWRlUExNTklDLUNhbGxzQmFycmVkICAoMjApLAorCXJvYW1pbmdPdXRzaWRlUExNTklDb3VudHJ5SUMtQ2FsbHNCYXJyZWQgICgyMSksCisJcm9hbWluZ091dHNpZGVQTE1OLUJhcnJlZCAgKDIyKSwKKwlyb2FtaW5nT3V0c2lkZVBMTU4tQ291bnRyeUJhcnJlZCAgKDIzKSwKKwlyZWdpc3RyYXRpb25BbGxDRi1CYXJyZWQgICgyNCksCisJcmVnaXN0cmF0aW9uQ0ZOb3RUb0hQTE1OLUJhcnJlZCAgKDI1KSwKKwlyZWdpc3RyYXRpb25JbnRlcnpvbmFsQ0YtQmFycmVkICAoMjYpLAorCXJlZ2lzdHJhdGlvbkludGVyem9uYWxDRk5vdFRvSFBMTU4tQmFycmVkICAoMjcpLAorCXJlZ2lzdHJhdGlvbkludGVybmF0aW9uYWxDRi1CYXJyZWQgICgyOCl9IChTSVpFICgxNS4uMzIpKQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzogcmVjZXB0aW9uIG9mIHVua25vd24gYml0IGFzc2lnbm1lbnRzIGluIHRoZQorCS0tIE9EQi1HZW5lcmFsRGF0YSB0eXBlIHNoYWxsIGJlIHRyZWF0ZWQgbGlrZSB1bnN1cHBvcnRlZCBPREItR2VuZXJhbERhdGEKKwktLSBXaGVuIHRoZSBPREItR2VuZXJhbERhdGEgdHlwZSBpcyByZW1vdmVkIGZyb20gdGhlIEhMUiBmb3IgYSBnaXZlbiBzdWJzY3JpYmVyLCAKKwktLSBpbiBOb3RlU3Vic2NyaWJlckRhdGFNb2RpZmllZCBvcGVyYXRpb24gc2VudCB0b3dhcmQgdGhlIGdzbVNDRiAKKwktLSBhbGwgYml0cyBzaGFsbCBiZSBzZXQgdG8gIk8iLgorCitPREItSFBMTU4tRGF0YSA6Oj0gQklUIFNUUklORyB7CisJcGxtbi1TcGVjaWZpY0JhcnJpbmdUeXBlMSAgKDApLAorCXBsbW4tU3BlY2lmaWNCYXJyaW5nVHlwZTIgICgxKSwKKwlwbG1uLVNwZWNpZmljQmFycmluZ1R5cGUzICAoMiksCisJcGxtbi1TcGVjaWZpY0JhcnJpbmdUeXBlNCAgKDMpfSAoU0laRSAoNC4uMzIpKQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzogcmVjZXB0aW9uIG9mIHVua25vd24gYml0IGFzc2lnbm1lbnRzIGluIHRoZQorCS0tIE9EQi1IUExNTi1EYXRhIHR5cGUgc2hhbGwgYmUgdHJlYXRlZCBsaWtlIHVuc3VwcG9ydGVkIE9EQi1IUExNTi1EYXRhIAorCS0tIFdoZW4gdGhlIE9EQi1IUExNTi1EYXRhIHR5cGUgaXMgcmVtb3ZlZCBmcm9tIHRoZSBITFIgZm9yIGEgZ2l2ZW4gc3Vic2NyaWJlciwgCisJLS0gaW4gTm90ZVN1YnNjcmliZXJEYXRhTW9kaWZpZWQgb3BlcmF0aW9uIHNlbnQgdG93YXJkIHRoZSBnc21TQ0YKKwktLSBhbGwgYml0cyBzaGFsbCBiZSBzZXQgdG8gIk8iLgorCitFeHQtU1MtSW5mb0xpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mU1MpIE9GCisJCQkJRXh0LVNTLUluZm8KKworRXh0LVNTLUluZm8gOjo9IENIT0lDRSB7CisJZm9yd2FyZGluZ0luZm8JWzBdIEV4dC1Gb3J3SW5mbywKKwljYWxsQmFycmluZ0luZm8JWzFdIEV4dC1DYWxsQmFySW5mbywKKwljdWctSW5mbwkJWzJdIENVRy1JbmZvLAorCXNzLURhdGEJCVszXSBFeHQtU1MtRGF0YSwKKwllbWxwcC1JbmZvCVs0XSBFTUxQUC1JbmZvfQorCitFeHQtRm9yd0luZm8gOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlTUy1Db2RlLAorCWZvcndhcmRpbmdGZWF0dXJlTGlzdAlFeHQtRm9yd0ZlYXR1cmVMaXN0LAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworRXh0LUZvcndGZWF0dXJlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZFeHQtQmFzaWNTZXJ2aWNlR3JvdXBzKSBPRgorCQkJCUV4dC1Gb3J3RmVhdHVyZQorCitFeHQtRm9yd0ZlYXR1cmUgOjo9IFNFUVVFTkNFIHsKKwliYXNpY1NlcnZpY2UJRXh0LUJhc2ljU2VydmljZUNvZGUJT1BUSU9OQUwsCisJc3MtU3RhdHVzCQlbNF0gRXh0LVNTLVN0YXR1cywKKwlmb3J3YXJkZWRUb051bWJlcglbNV0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCS0tIFdoZW4gdGhpcyBkYXRhIHR5cGUgaXMgc2VudCBmcm9tIGFuIEhMUiB3aGljaCBzdXBwb3J0cyBDQU1FTCBQaGFzZSAyCisJLS0gdG8gYSBWTFIgdGhhdCBzdXBwb3J0cyBDQU1FTCBQaGFzZSAyIHRoZSBWTFIgc2hhbGwgbm90IGNoZWNrIHRoZQorCS0tIGZvcm1hdCBvZiB0aGUgbnVtYmVyCisJZm9yd2FyZGVkVG9TdWJhZGRyZXNzCVs4XSBJU0ROLVN1YmFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJZm9yd2FyZGluZ09wdGlvbnMJWzZdIEV4dC1Gb3J3T3B0aW9ucwlPUFRJT05BTCwKKwlub1JlcGx5Q29uZGl0aW9uVGltZQlbN10gRXh0LU5vUmVwQ29uZFRpbWUJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs5XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWxvbmdGb3J3YXJkZWRUb051bWJlcglbMTBdIEZUTi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMIH0KKworRXh0LUZvcndPcHRpb25zIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjUpKQorCisJLS0gT0NURVQgMToKKworCS0tICBiaXQgODogbm90aWZpY2F0aW9uIHRvIGZvcndhcmRpbmcgcGFydHkKKwktLQkwICBubyBub3RpZmljYXRpb24KKwktLQkxICBub3RpZmljYXRpb24KKworCS0tICBiaXQgNzogcmVkaXJlY3RpbmcgcHJlc2VudGF0aW9uCisJLS0JMCBubyBwcmVzZW50YXRpb24gIAorCS0tCTEgIHByZXNlbnRhdGlvbgorCisJLS0gIGJpdCA2OiBub3RpZmljYXRpb24gdG8gY2FsbGluZyBwYXJ0eQorCS0tCTAgIG5vIG5vdGlmaWNhdGlvbgorCS0tCTEgIG5vdGlmaWNhdGlvbgorCisJLS0gIGJpdCA1OiAwICh1bnVzZWQpCisKKwktLSAgYml0cyA0MzogZm9yd2FyZGluZyByZWFzb24KKwktLQkwMCAgbXMgbm90IHJlYWNoYWJsZQorCS0tCTAxICBtcyBidXN5CisJLS0JMTAgIG5vIHJlcGx5CisJLS0JMTEgIHVuY29uZGl0aW9uYWwKKworCS0tIGJpdHMgMjE6IDAwICh1bnVzZWQpCisKKwktLSBPQ1RFVFMgMi01OiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gVGhleSBzaGFsbCBiZSBkaXNjYXJkZWQgaWYKKwktLSByZWNlaXZlZCBhbmQgbm90IHVuZGVyc3Rvb2QuCisKK0V4dC1Ob1JlcENvbmRUaW1lIDo6PSBJTlRFR0VSICgxLi4xMDApCisJLS0gT25seSB2YWx1ZXMgNS0zMCBhcmUgdXNlZC4KKwktLSBWYWx1ZXMgaW4gdGhlIHJhbmdlcyAxLTQgYW5kIDMxLTEwMCBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKKwktLSBJZiByZWNlaXZlZDoKKwktLQkJdmFsdWVzIDEtNCBzaGFsbCBiZSBtYXBwZWQgb24gdG8gdmFsdWUgNQorCS0tCQl2YWx1ZXMgMzEtMTAwIHNoYWxsIGJlIG1hcHBlZCBvbiB0byB2YWx1ZSAzMAorCitFeHQtQ2FsbEJhckluZm8gOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlTUy1Db2RlLAorCWNhbGxCYXJyaW5nRmVhdHVyZUxpc3QJRXh0LUNhbGxCYXJGZWF0dXJlTGlzdCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworRXh0LUNhbGxCYXJGZWF0dXJlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZFeHQtQmFzaWNTZXJ2aWNlR3JvdXBzKSBPRgorCQkJCUV4dC1DYWxsQmFycmluZ0ZlYXR1cmUKKworRXh0LUNhbGxCYXJyaW5nRmVhdHVyZSA6Oj0gU0VRVUVOQ0UgeworCWJhc2ljU2VydmljZQlFeHQtQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKKwlzcy1TdGF0dXMJCVs0XSBFeHQtU1MtU3RhdHVzLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitDVUctSW5mbyA6Oj0gU0VRVUVOQ0UgeworCWN1Zy1TdWJzY3JpcHRpb25MaXN0CUNVRy1TdWJzY3JpcHRpb25MaXN0LAorCWN1Zy1GZWF0dXJlTGlzdAlDVUctRmVhdHVyZUxpc3QJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitDVUctU3Vic2NyaXB0aW9uTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMC4ubWF4TnVtT2ZDVUcpIE9GCisJCQkJQ1VHLVN1YnNjcmlwdGlvbgorCitDVUctU3Vic2NyaXB0aW9uIDo6PSBTRVFVRU5DRSB7CisJY3VnLUluZGV4CUNVRy1JbmRleCwKKwljdWctSW50ZXJsb2NrCUNVRy1JbnRlcmxvY2ssCisJaW50cmFDVUctT3B0aW9ucwlJbnRyYUNVRy1PcHRpb25zLAorCWJhc2ljU2VydmljZUdyb3VwTGlzdAlFeHQtQmFzaWNTZXJ2aWNlR3JvdXBMaXN0CU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQ1VHLUluZGV4IDo6PSBJTlRFR0VSICgwLi4zMjc2NykKKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgaW4gRVRTIDMwMCAxMzguCisKK0NVRy1JbnRlcmxvY2sgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNCkpCisKK0ludHJhQ1VHLU9wdGlvbnMgOjo9IEVOVU1FUkFURUQgeworCW5vQ1VHLVJlc3RyaWN0aW9ucyAgKDApLAorCWN1Z0lDLUNhbGxCYXJyZWQgICgxKSwKKwljdWdPRy1DYWxsQmFycmVkICAoMil9CisKK21heE51bU9mQ1VHICBJTlRFR0VSIDo6PSAxMAorCitDVUctRmVhdHVyZUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mRXh0LUJhc2ljU2VydmljZUdyb3VwcykgT0YKKwkJCQlDVUctRmVhdHVyZQorCitFeHQtQmFzaWNTZXJ2aWNlR3JvdXBMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkV4dC1CYXNpY1NlcnZpY2VHcm91cHMpIE9GCisJCQkJRXh0LUJhc2ljU2VydmljZUNvZGUKKworbWF4TnVtT2ZFeHQtQmFzaWNTZXJ2aWNlR3JvdXBzICBJTlRFR0VSIDo6PSAzMgorCitDVUctRmVhdHVyZSA6Oj0gU0VRVUVOQ0UgeworCWJhc2ljU2VydmljZQlFeHQtQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKKwlwcmVmZXJlbnRpYWxDVUctSW5kaWNhdG9yCUNVRy1JbmRleAlPUFRJT05BTCwKKwlpbnRlckNVRy1SZXN0cmljdGlvbnMJSW50ZXJDVUctUmVzdHJpY3Rpb25zLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitJbnRlckNVRy1SZXN0cmljdGlvbnMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisKKwktLSBiaXRzIDg3NjU0MzogMDAwMDAwICh1bnVzZWQpCisJLS0gRXhjZXB0aW9uIGhhbmRsaW5nOgorCS0tIGJpdHMgODc2NTQzIHNoYWxsIGJlIGlnbm9yZWQgaWYgcmVjZWl2ZWQgYW5kIG5vdCB1bmRlcnN0b29kCisKKwktLSBiaXRzIDIxCisJLS0JMDAgIENVRyBvbmx5IGZhY2lsaXRpZXMKKwktLQkwMSAgQ1VHIHdpdGggb3V0Z29pbmcgYWNjZXNzCisJLS0JMTAgIENVRyB3aXRoIGluY29taW5nIGFjY2VzcworCS0tCTExICBDVUcgd2l0aCBib3RoIG91dGdvaW5nIGFuZCBpbmNvbWluZyBhY2Nlc3MKKworRXh0LVNTLURhdGEgOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlTUy1Db2RlLAorCXNzLVN0YXR1cwlbNF0gRXh0LVNTLVN0YXR1cywKKwlzcy1TdWJzY3JpcHRpb25PcHRpb24JU1MtU3Vic2NyaXB0aW9uT3B0aW9uCU9QVElPTkFMLAorCWJhc2ljU2VydmljZUdyb3VwTGlzdAlFeHQtQmFzaWNTZXJ2aWNlR3JvdXBMaXN0CU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNV0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTENTLVByaXZhY3lFeGNlcHRpb25MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlByaXZhY3lDbGFzcykgT0YKKwkJCQlMQ1MtUHJpdmFjeUNsYXNzCisKK21heE51bU9mUHJpdmFjeUNsYXNzICBJTlRFR0VSIDo6PSA0CisKK0xDUy1Qcml2YWN5Q2xhc3MgOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlTUy1Db2RlLAorCXNzLVN0YXR1cwkJRXh0LVNTLVN0YXR1cywKKwlub3RpZmljYXRpb25Ub01TVXNlcglbMF0gTm90aWZpY2F0aW9uVG9NU1VzZXIJT1BUSU9OQUwsCisJLS0gbm90aWZpY2F0aW9uVG9NU1VzZXIgbWF5IGJlIHNlbnQgb25seSBmb3IgU1MtY29kZXMgY2FsbFNlc3Npb25SZWxhdGVkCisJLS0gYW5kIGNhbGxTZXNzaW9uVW5yZWxhdGVkLiBJZiBub3QgcmVjZWl2ZWQgZm9yIFNTLWNvZGVzIGNhbGxTZXNzaW9uUmVsYXRlZAorCS0tIGFuZCBjYWxsU2Vzc2lvblVucmVsYXRlZCwKKwktLSB0aGUgZGVmYXVsdCB2YWx1ZXMgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjMuMjcxIHNoYWxsIGJlIGFzc3VtZWQuCisJZXh0ZXJuYWxDbGllbnRMaXN0CVsxXSBFeHRlcm5hbENsaWVudExpc3QJT1BUSU9OQUwsCisJLS0gZXh0ZXJuYWxDbGllbnRMaXN0IG1heSBiZSBzZW50IG9ubHkgZm9yIFNTLWNvZGUgY2FsbFNlc3Npb25VbnJlbGF0ZWQgdG8gYQorCS0tIHZpc2l0ZWQgbm9kZSB0aGF0IGRvZXMgbm90IHN1cHBvcnQgTENTIFJlbGVhc2UgNCBvciBsYXRlciB2ZXJzaW9ucy4KKwktLSBleHRlcm5hbENsaWVudExpc3QgbWF5IGJlIHNlbnQgb25seSBmb3IgU1MtY29kZXMgY2FsbFNlc3Npb25VbnJlbGF0ZWQgYW5kCisJLS0gY2FsbFNlc3Npb25SZWxhdGVkIHRvIGEgdmlzaXRlZCBub2RlIHRoYXQgc3VwcG9ydHMgTENTIFJlbGVhc2UgNCBvciBsYXRlciB2ZXJzaW9ucy4KKwlwbG1uQ2xpZW50TGlzdAlbMl0gUExNTkNsaWVudExpc3QJT1BUSU9OQUwsCisJLS0gcGxtbkNsaWVudExpc3QgbWF5IGJlIHNlbnQgb25seSBmb3IgU1MtY29kZSBwbG1ub3BlcmF0b3IuCisJZXh0ZW5zaW9uQ29udGFpbmVyCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWV4dC1leHRlcm5hbENsaWVudExpc3QJWzRdIEV4dC1FeHRlcm5hbENsaWVudExpc3QJT1BUSU9OQUwsCisJLS0gRXh0LWV4dGVybmFsQ2xpZW50TGlzdCBtYXkgYmUgc2VudCBvbmx5IGlmIHRoZSB2aXNpdGVkIG5vZGUgc3VwcG9ydHMgTENTIFJlbGVhc2UgNCBvcgorCS0tIGxhdGVyIHZlcnNpb25zLCB0aGUgdXNlciBkaWQgc3BlY2lmeSBtb3JlIHRoYW4gNSBjbGllbnRzLCBhbmQgV2hpdGUgQm9vayBTQ0NQIGlzIHVzZWQuCisJc2VydmljZVR5cGVMaXN0CVs1XQlTZXJ2aWNlVHlwZUxpc3QJT1BUSU9OQUwKKwktLSBzZXJ2aWNlVHlwZUxpc3QgbWF5IGJlIHNlbnQgb25seSBmb3IgU1MtY29kZSBzZXJ2aWNlVHlwZSBhbmQgaWYgdGhlIHZpc2l0ZWQgbm9kZQorCS0tIHN1cHBvcnRzIExDUyBSZWxlYXNlIDUgb3IgbGF0ZXIgdmVyc2lvbnMuCisJLS0gCisJLS0gaWYgc2VnbWVudGF0aW9uIGlzIHVzZWQsIHRoZSBjb21wbGV0ZSBMQ1MtUHJpdmFjeUNsYXNzIHNoYWxsIGJlIHNlbnQgaW4gb25lIHNlZ21lbnQKK30KKworRXh0ZXJuYWxDbGllbnRMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgwLi5tYXhOdW1PZkV4dGVybmFsQ2xpZW50KSBPRgorCQkJCUV4dGVybmFsQ2xpZW50CisKK21heE51bU9mRXh0ZXJuYWxDbGllbnQgIElOVEVHRVIgOjo9IDUKKworUExNTkNsaWVudExpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mUExNTkNsaWVudCkgT0YKKwkJCQlMQ1NDbGllbnRJbnRlcm5hbElECisKK21heE51bU9mUExNTkNsaWVudCAgSU5URUdFUiA6Oj0gNQorCitFeHQtRXh0ZXJuYWxDbGllbnRMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkV4dC1FeHRlcm5hbENsaWVudCkgT0YKKwkJCQlFeHRlcm5hbENsaWVudAorCittYXhOdW1PZkV4dC1FeHRlcm5hbENsaWVudCAgSU5URUdFUiA6Oj0gMzUKKworRXh0ZXJuYWxDbGllbnQgOjo9IFNFUVVFTkNFIHsKKwljbGllbnRJZGVudGl0eQlMQ1NDbGllbnRFeHRlcm5hbElELAorCWdtbGMtUmVzdHJpY3Rpb24JWzBdIEdNTEMtUmVzdHJpY3Rpb24JT1BUSU9OQUwsCisJbm90aWZpY2F0aW9uVG9NU1VzZXIJWzFdIE5vdGlmaWNhdGlvblRvTVNVc2VyCU9QVElPTkFMLAorCS0tIElmIG5vdGlmaWNhdGlvblRvTVNVc2VyIGlzIG5vdCByZWNlaXZlZCwgdGhlIGRlZmF1bHQgdmFsdWUgYWNjb3JkaW5nIHRvIAorCS0tIDNHUFAgVFMgMjMuMjcxIHNoYWxsIGJlIGFzc3VtZWQuCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uIH0KKworR01MQy1SZXN0cmljdGlvbiA6Oj0gRU5VTUVSQVRFRCB7CisJZ21sYy1MaXN0CQkoMCksCisJaG9tZS1Db3VudHJ5CSgxKSAsCisJLi4uIH0KKy0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tIEF0IHJlY2VwdGlvbiBvZiBhbnkgb3RoZXIgdmFsdWUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZQorLS0gR01MQy1SZXN0cmljdGlvbi4KKworTm90aWZpY2F0aW9uVG9NU1VzZXIgOjo9IEVOVU1FUkFURUQgeworCW5vdGlmeUxvY2F0aW9uQWxsb3dlZAkoMCksCisJbm90aWZ5QW5kVmVyaWZ5LUxvY2F0aW9uQWxsb3dlZElmTm9SZXNwb25zZQkoMSksCisJbm90aWZ5QW5kVmVyaWZ5LUxvY2F0aW9uTm90QWxsb3dlZElmTm9SZXNwb25zZQkoMiksCisJLi4uLAorCWxvY2F0aW9uTm90QWxsb3dlZCAoMykgfQorLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0gQXQgcmVjZXB0aW9uIG9mIGFueSBvdGhlciB2YWx1ZSB0aGFuIHRoZSBvbmVzIGxpc3RlZCB0aGUgcmVjZWl2ZXIgc2hhbGwgaWdub3JlCistLSBOb3RpZmljYXRpb25Ub01TVXNlci4KKworU2VydmljZVR5cGVMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlNlcnZpY2VUeXBlKSBPRgorCQkJCVNlcnZpY2VUeXBlCisKK21heE51bU9mU2VydmljZVR5cGUgIElOVEVHRVIgOjo9IDMyCisKK1NlcnZpY2VUeXBlIDo6PSBTRVFVRU5DRSB7CisJc2VydmljZVR5cGVJZGVudGl0eQlMQ1NTZXJ2aWNlVHlwZUlELAorCWdtbGMtUmVzdHJpY3Rpb24JWzBdIEdNTEMtUmVzdHJpY3Rpb24JT1BUSU9OQUwsCisJbm90aWZpY2F0aW9uVG9NU1VzZXIJWzFdIE5vdGlmaWNhdGlvblRvTVNVc2VyCU9QVElPTkFMLAorCS0tIElmIG5vdGlmaWNhdGlvblRvTVNVc2VyIGlzIG5vdCByZWNlaXZlZCwgdGhlIGRlZmF1bHQgdmFsdWUgYWNjb3JkaW5nIHRvIAorCS0tIDNHUFAgVFMgMjMuMjcxIHNoYWxsIGJlIGFzc3VtZWQuCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uIH0KKworTU9MUi1MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZk1PTFItQ2xhc3MpIE9GCisJCQkJTU9MUi1DbGFzcworCittYXhOdW1PZk1PTFItQ2xhc3MgIElOVEVHRVIgOjo9IDMKKworTU9MUi1DbGFzcyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVNTLUNvZGUsCisJc3MtU3RhdHVzCQlFeHQtU1MtU3RhdHVzLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworWm9uZUNvZGVMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlpvbmVDb2RlcykKKwkJCQlPRiBab25lQ29kZQorCitab25lQ29kZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgyKSkKKwktLSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiBUUyAzR1BQIFRTIDIzLjAwMyBbMTddCisKK21heE51bU9mWm9uZUNvZGVzICBJTlRFR0VSIDo6PSAxMAorCitJbnNlcnRTdWJzY3JpYmVyRGF0YVJlcyA6Oj0gU0VRVUVOQ0UgeworCXRlbGVzZXJ2aWNlTGlzdAlbMV0gVGVsZXNlcnZpY2VMaXN0CU9QVElPTkFMLAorCWJlYXJlclNlcnZpY2VMaXN0CVsyXSBCZWFyZXJTZXJ2aWNlTGlzdAlPUFRJT05BTCwKKwlzcy1MaXN0CQlbM10gU1MtTGlzdAlPUFRJT05BTCwKKwlvZGItR2VuZXJhbERhdGEJWzRdIE9EQi1HZW5lcmFsRGF0YQlPUFRJT05BTCwKKwlyZWdpb25hbFN1YnNjcmlwdGlvblJlc3BvbnNlCVs1XSBSZWdpb25hbFN1YnNjcmlwdGlvblJlc3BvbnNlCU9QVElPTkFMLAorCXN1cHBvcnRlZENhbWVsUGhhc2VzCVs2XSBTdXBwb3J0ZWRDYW1lbFBoYXNlcwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzddIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCW9mZmVyZWRDYW1lbDRDU0lzCVs4XSBPZmZlcmVkQ2FtZWw0Q1NJcwlPUFRJT05BTCwKKwlzdXBwb3J0ZWRGZWF0dXJlcwlbOV0gU3VwcG9ydGVkRmVhdHVyZXMJT1BUSU9OQUwgfQorCitSZWdpb25hbFN1YnNjcmlwdGlvblJlc3BvbnNlIDo6PSBFTlVNRVJBVEVEIHsKKwluZXR3b3JrTm9kZS1BcmVhUmVzdHJpY3RlZAkoMCksCisJdG9vTWFueVpvbmVDb2RlcwkoMSksCisJem9uZUNvZGVzQ29uZmxpY3QJKDIpLAorCXJlZ2lvbmFsU3Vic2NOb3RTdXBwb3J0ZWQJKDMpfQorCitEZWxldGVTdWJzY3JpYmVyRGF0YUFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlbMF0gSU1TSSwKKwliYXNpY1NlcnZpY2VMaXN0CVsxXSBCYXNpY1NlcnZpY2VMaXN0CU9QVElPTkFMLAorCS0tIFRoZSBleGNlcHRpb24gaGFuZGxpbmcgZm9yIHJlY2VwdGlvbiBvZiB1bnN1cHBvcnRlZC9ub3QgYWxsb2NhdGVkCisJLS0gYmFzaWNTZXJ2aWNlQ29kZXMgaXMgZGVmaW5lZCBpbiBzZWN0aW9uIDYuOC4yCisJc3MtTGlzdAkJWzJdIFNTLUxpc3QJT1BUSU9OQUwsCisJcm9hbWluZ1Jlc3RyaWN0aW9uRHVlVG9VbnN1cHBvcnRlZEZlYXR1cmUgWzRdIE5VTEwJT1BUSU9OQUwsCisJcmVnaW9uYWxTdWJzY3JpcHRpb25JZGVudGlmaWVyCVs1XSBab25lQ29kZQlPUFRJT05BTCwKKwl2YnNHcm91cEluZGljYXRpb24JWzddIE5VTEwJCU9QVElPTkFMLAorCXZnY3NHcm91cEluZGljYXRpb24JWzhdIE5VTEwJIAlPUFRJT05BTCwKKwljYW1lbFN1YnNjcmlwdGlvbkluZm9XaXRoZHJhdwlbOV0gTlVMTAkgCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNl0gRXh0ZW5zaW9uQ29udGFpbmVyIAlPUFRJT05BTCwKKwkuLi4sCisJZ3Byc1N1YnNjcmlwdGlvbkRhdGFXaXRoZHJhdwlbMTBdIEdQUlNTdWJzY3JpcHRpb25EYXRhV2l0aGRyYXcJT1BUSU9OQUwsCisJcm9hbWluZ1Jlc3RyaWN0ZWRJblNnc25EdWVUb1Vuc3VwcHBvcnRlZEZlYXR1cmUgWzExXSBOVUxMCU9QVElPTkFMLAorCWxzYUluZm9ybWF0aW9uV2l0aGRyYXcJWzEyXSBMU0FJbmZvcm1hdGlvbldpdGhkcmF3CU9QVElPTkFMLAorCWdtbGMtTGlzdFdpdGhkcmF3IAlbMTNdCU5VTEwJCU9QVElPTkFMLAorCWlzdEluZm9ybWF0aW9uV2l0aGRyYXcJWzE0XSBOVUxMCQlPUFRJT05BTCwKKwlzcGVjaWZpY0NTSS1XaXRoZHJhdwlbMTVdIFNwZWNpZmljQ1NJLVdpdGhkcmF3CU9QVElPTkFMLAorCWNoYXJnaW5nQ2hhcmFjdGVyaXN0aWNzV2l0aGRyYXcJWzE2XSBOVUxMCQlPUFRJT05BTCwKKwlzdG4tc3JXaXRoZHJhdwlbMTddIE5VTEwJCU9QVElPTkFMLAorCWVwc1N1YnNjcmlwdGlvbkRhdGFXaXRoZHJhdwlbMThdIEVQUy1TdWJzY3JpcHRpb25EYXRhV2l0aGRyYXcJT1BUSU9OQUwsCisJYXBuLW9pLXJlcGxhY2VtZW50V2l0aGRyYXcJWzE5XSBOVUxMCQlPUFRJT05BTCwKKwljc2ctU3Vic2NyaXB0aW9uRGVsZXRlZAlbMjBdCU5VTEwJCU9QVElPTkFMIH0KKworU3BlY2lmaWNDU0ktV2l0aGRyYXcgOjo9IEJJVCBTVFJJTkcgeworCW8tY3NpICgwKSwKKwlzcy1jc2kgKDEpLAorCXRpZi1jc2kgKDIpLAorCWQtY3NpICgzKSwKKwl2dC1jc2kgKDQpLAorCW1vLXNtcy1jc2kgKDUpLAorCW0tY3NpICg2KSwKKwlncHJzLWNzaSAoNyksCisJdC1jc2kgKDgpLAorCW10LXNtcy1jc2kgKDkpLAorCW1nLWNzaSAoMTApLAorCW8tSU0tQ1NJICgxMSksIAorCWQtSU0tQ1NJICgxMiksCisJdnQtSU0tQ1NJICgxMykgfSAoU0laRSg4Li4zMikpIAorLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0gYml0cyAxMSB0byAzMSBzaGFsbCBiZSBpZ25vcmVkIGlmIHJlY2VpdmVkIGJ5IGEgbm9uLUlQIE11bHRpbWVkaWEgQ29yZSBOZXR3b3JrIGVudGl0eS4KKy0tIGJpdHMgMC0xMCBhbmQgMTQtMzEgc2hhbGwgYmUgaWdub3JlZCBpZiByZWNlaXZlZCBieSBhbiBJUCBNdWx0aW1lZGlhIENvcmUgTmV0d29yayBlbnRpdHkuCistLSBiaXRzIDExLTEzIGFyZSBvbmx5IGFwcGxpY2FibGUgaW4gYW4gSVAgTXVsdGltZWRpYSBDb3JlIE5ldHdvcmsuCistLSBCaXQgOCBhbmQgYml0cyAxMS0xMyBhcmUgb25seSBhcHBsaWNhYmxlIGZvciB0aGUgTm90ZVN1YnNjcmliZXJEYXRhTW9kaWZpZWQgb3BlcmF0aW9uLgorCitHUFJTU3Vic2NyaXB0aW9uRGF0YVdpdGhkcmF3IDo6PSBDSE9JQ0UgeworCWFsbEdQUlNEYXRhCU5VTEwsCisJY29udGV4dElkTGlzdAlDb250ZXh0SWRMaXN0fQorCitFUFMtU3Vic2NyaXB0aW9uRGF0YVdpdGhkcmF3IDo6PSBDSE9JQ0UgeworCWFsbEVQUy1EYXRhCU5VTEwsCisJY29udGV4dElkTGlzdAlDb250ZXh0SWRMaXN0fQorCitDb250ZXh0SWRMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlBEUC1Db250ZXh0cykgT0YKKwkJCQlDb250ZXh0SWQKKworTFNBSW5mb3JtYXRpb25XaXRoZHJhdyA6Oj0gQ0hPSUNFIHsKKwlhbGxMU0FEYXRhCU5VTEwsCisJbHNhSWRlbnRpdHlMaXN0CUxTQUlkZW50aXR5TGlzdCB9CisKK0xTQUlkZW50aXR5TGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZMU0FzKSBPRgorCQkJCUxTQUlkZW50aXR5CisKK0Jhc2ljU2VydmljZUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQmFzaWNTZXJ2aWNlcykgT0YKKwkJCQlFeHQtQmFzaWNTZXJ2aWNlQ29kZQorCittYXhOdW1PZkJhc2ljU2VydmljZXMgIElOVEVHRVIgOjo9IDcwCisKK0RlbGV0ZVN1YnNjcmliZXJEYXRhUmVzIDo6PSBTRVFVRU5DRSB7CisJcmVnaW9uYWxTdWJzY3JpcHRpb25SZXNwb25zZQlbMF0gUmVnaW9uYWxTdWJzY3JpcHRpb25SZXNwb25zZQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworVmxyQ2FtZWxTdWJzY3JpcHRpb25JbmZvIDo6PSBTRVFVRU5DRSB7CisJby1DU0kJCVswXSBPLUNTSQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCXNzLUNTSQkJWzJdIFNTLUNTSQlPUFRJT05BTCwKKwlvLUJjc21DYW1lbFREUC1Dcml0ZXJpYUxpc3QJWzRdIE8tQmNzbUNhbWVsVERQQ3JpdGVyaWFMaXN0CU9QVElPTkFMLAorCXRpZi1DU0kJCVszXSBOVUxMCU9QVElPTkFMLAorCW0tQ1NJCQlbNV0gTS1DU0kJT1BUSU9OQUwsCisJbW8tc21zLUNTSQlbNl0gU01TLUNTSQlPUFRJT05BTCwKKwl2dC1DU0kJCVs3XSBULUNTSQlPUFRJT05BTCwKKwl0LUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhTGlzdAlbOF0gVC1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYUxpc3QJT1BUSU9OQUwsCisJZC1DU0kJCVs5XSBELUNTSQlPUFRJT05BTCwKKwltdC1zbXMtQ1NJCVsxMF0gU01TLUNTSQlPUFRJT05BTCwKKwltdC1zbXNDQU1FTFREUC1Dcml0ZXJpYUxpc3QJWzExXQlNVC1zbXNDQU1FTFREUC1Dcml0ZXJpYUxpc3QJT1BUSU9OQUwKKwl9CisKK01ULXNtc0NBTUVMVERQLUNyaXRlcmlhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4uIG1heE51bU9mQ2FtZWxURFBEYXRhKSBPRgorCU1ULXNtc0NBTUVMVERQLUNyaXRlcmlhCisKK01ULXNtc0NBTUVMVERQLUNyaXRlcmlhIDo6PSBTRVFVRU5DRSB7CisJc21zLVRyaWdnZXJEZXRlY3Rpb25Qb2ludAlTTVMtVHJpZ2dlckRldGVjdGlvblBvaW50LAorCXRwZHUtVHlwZUNyaXRlcmlvbglbMF0JVFBEVS1UeXBlQ3JpdGVyaW9uCQlPUFRJT05BTCwKKwkuLi4gfQorCitUUERVLVR5cGVDcml0ZXJpb24gOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mVFBEVVR5cGVzKSBPRgorCU1ULVNNUy1UUERVLVR5cGUKKworCittYXhOdW1PZlRQRFVUeXBlcyBJTlRFR0VSIDo6PSA1CisKK01ULVNNUy1UUERVLVR5cGUgOjo9IEVOVU1FUkFURUQgeworCXNtcy1ERUxJVkVSIAkoMCksCisJc21zLVNVQk1JVC1SRVBPUlQgCSgxKSwKKwlzbXMtU1RBVFVTLVJFUE9SVCAJKDIpLAorCS4uLiB9CisKKy0tCWV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tCUZvciBUUERVLVR5cGVDcml0ZXJpb24gc2VxdWVuY2VzIGNvbnRhaW5pbmcgdGhpcyBwYXJhbWV0ZXIgd2l0aCBhbnkKKy0tCW90aGVyIHZhbHVlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIGFib3ZlIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUgCistLQl0aGUgd2hvbGUgVFBEVS1UeXBlQ3JpdGVyaW9uIHNlcXVlbmNlLgorLS0JSW4gQ0FNRUwgcGhhc2UgNCwgc21zLVNVQk1JVC1SRVBPUlQgc2hhbGwgbm90IGJlIHVzZWQgYW5kIGEgcmVjZWl2ZWQgVFBEVS1UeXBlQ3JpdGVyaW9uCistLQlzZXF1ZW5jZSBjb250YWluaW5nIHNtcy1TVUJNSVQtUkVQT1JUIHNoYWxsIGJlIHdob2xseSBpZ25vcmVkLgorCitELUNTSSA6Oj0gU0VRVUVOQ0UgeworCWRwLUFuYWx5c2VkSW5mb0NyaXRlcmlhTGlzdAlbMF0gRFAtQW5hbHlzZWRJbmZvQ3JpdGVyaWFMaXN0CU9QVElPTkFMLAorCWNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCVsxXSBDYW1lbENhcGFiaWxpdHlIYW5kbGluZwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwlub3RpZmljYXRpb25Ub0NTRQlbM10JTlVMTAkJT1BUSU9OQUwsCisJY3NpLUFjdGl2ZQlbNF0JTlVMTAkJT1BUSU9OQUwsCisJLi4ufSAKKy0tCW5vdGlmaWNhdGlvblRvQ1NFIGFuZCBjc2ktQWN0aXZlIHNoYWxsIG5vdCBiZSBwcmVzZW50IHdoZW4gRC1DU0kgaXMgc2VudCB0byBWTFIvR01TQy4KKy0tCVRoZXkgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gQVRTSS9BVE0gYWNrL05TREMgbWVzc2FnZS4KKy0tCURQLUFuYWx5c2VkSW5mb0NyaXRlcmlhIGFuZCAgY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcgc2hhbGwgYmUgcHJlc2VudCBpbiAKKy0tCXRoZSBELUNTSSBzZXF1ZW5jZS4KKy0tCUlmIEQtQ1NJIGlzIHNlZ21lbnRlZCwgdGhlbiB0aGUgZmlyc3Qgc2VnbWVudCBzaGFsbCBjb250YWluIGRwLUFuYWx5c2VkSW5mb0NyaXRlcmlhTGlzdAorLS0JYW5kIGNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nLiBTdWJzZXF1ZW50IHNlZ21lbnRzIHNoYWxsIG5vdCBjb250YWluCistLQljYW1lbENhcGFiaWxpdHlIYW5kbGluZywgYnV0IG1heSBjb250YWluIGRwLUFuYWx5c2VkSW5mb0NyaXRlcmlhTGlzdC4KKworRFAtQW5hbHlzZWRJbmZvQ3JpdGVyaWFMaXN0ICA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZEUC1BbmFseXNlZEluZm9Dcml0ZXJpYSkgT0YKKwkJCQlEUC1BbmFseXNlZEluZm9Dcml0ZXJpdW0KKworbWF4TnVtT2ZEUC1BbmFseXNlZEluZm9Dcml0ZXJpYSBJTlRFR0VSIDo6PSAxMAorCitEUC1BbmFseXNlZEluZm9Dcml0ZXJpdW0gOjo9IFNFUVVFTkNFIHsKKwlkaWFsbGVkTnVtYmVyCUlTRE4tQWRkcmVzc1N0cmluZywKKwlzZXJ2aWNlS2V5CVNlcnZpY2VLZXksCisJZ3NtU0NGLUFkZHJlc3MJSVNETi1BZGRyZXNzU3RyaW5nLAorCWRlZmF1bHRDYWxsSGFuZGxpbmcJRGVmYXVsdENhbGxIYW5kbGluZywKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworU1MtQ1NJIDo6PSBTRVFVRU5DRSB7CisJc3MtQ2FtZWxEYXRhCVNTLUNhbWVsRGF0YSwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlub3RpZmljYXRpb25Ub0NTRQlbMF0JTlVMTAkJT1BUSU9OQUwsCisJY3NpLUFjdGl2ZQlbMV0JTlVMTAkJT1BUSU9OQUwKKy0tCW5vdGlmaWNhdGlvblRvQ1NFIGFuZCBjc2ktQWN0aXZlIHNoYWxsIG5vdCBiZSBwcmVzZW50IHdoZW4gU1MtQ1NJIGlzIHNlbnQgdG8gVkxSLgorLS0JVGhleSBtYXkgb25seSBiZSBpbmNsdWRlZCBpbiBBVFNJL0FUTSBhY2svTlNEQyBtZXNzYWdlLgorfQorCitTUy1DYW1lbERhdGEgIDo6PSBTRVFVRU5DRSB7CisJc3MtRXZlbnRMaXN0CVNTLUV2ZW50TGlzdCwKKwlnc21TQ0YtQWRkcmVzcwlJU0ROLUFkZHJlc3NTdHJpbmcsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsIAorCS4uLn0KKworU1MtRXZlbnRMaXN0ICA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZDYW1lbFNTRXZlbnRzKSBPRiBTUy1Db2RlCisJLS0gQWN0aW9ucyBmb3IgdGhlIGZvbGxvd2luZyBTUy1Db2RlIHZhbHVlcyBhcmUgZGVmaW5lZCBpbiBDQU1FTCBQaGFzZSAzOgorCS0tIGVjdAkJU1MtQ29kZSA6Oj0gJzAwMTEwMDAxJ0IKKwktLSBtdWx0aVBUWQlTUy1Db2RlIDo6PSAnMDEwMTAwMDEnQgorCS0tIGNkCQlTUy1Db2RlIDo6PSAnMDAxMDAxMDAnQgorCS0tIGNjYnMJCVNTLUNvZGUgOjo9ICcwMTAwMDEwMCdCCisJLS0gYWxsIG90aGVyIFNTIGNvZGVzIHNoYWxsIGJlIGlnbm9yZWQKKwktLSBXaGVuIFNTLUNTSSBpcyBzZW50IHRvIHRoZSBWTFIsIGl0IHNoYWxsIG5vdCBjb250YWluIGEgbWFya2luZyBmb3IgY2Nicy4KKwktLSBJZiB0aGUgVkxSIHJlY2VpdmVzIFNTLUNTSSBjb250YWluaW5nIGEgbWFya2luZyBmb3IgY2NicywgdGhlIFZMUiBzaGFsbCBkaXNjYXJkIHRoZQorCS0tIGNjYnMgbWFya2luZyBpbiBTUy1DU0kuCisKK21heE51bU9mQ2FtZWxTU0V2ZW50cyBJTlRFR0VSIDo6PSAxMAorCitPLUNTSSA6Oj0gU0VRVUVOQ0UgeworCW8tQmNzbUNhbWVsVERQRGF0YUxpc3QJTy1CY3NtQ2FtZWxURFBEYXRhTGlzdCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwljYW1lbENhcGFiaWxpdHlIYW5kbGluZwlbMF0gQ2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcJT1BUSU9OQUwsCisJbm90aWZpY2F0aW9uVG9DU0UJWzFdCU5VTEwJCU9QVElPTkFMLAorCWNzaUFjdGl2ZQkJWzJdCU5VTEwJCU9QVElPTkFMfQorLS0Jbm90aWZpY2F0aW9udG9DU0UgYW5kIGNzaUFjdGl2ZSBzaGFsbCBub3QgYmUgcHJlc2VudCB3aGVuIE8tQ1NJIGlzIHNlbnQgdG8gVkxSL0dNU0MuCistLQlUaGV5IG1heSBvbmx5IGJlIGluY2x1ZGVkIGluIEFUU0kvQVRNIGFjay9OU0RDIG1lc3NhZ2UuCistLQlPLUNTSSBzaGFsbCBub3QgYmUgc2VnbWVudGVkLgorCitPLUJjc21DYW1lbFREUERhdGFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkNhbWVsVERQRGF0YSkgT0YKKwlPLUJjc21DYW1lbFREUERhdGEKKwktLSBPLUJjc21DYW1lbFREUERhdGFMaXN0IHNoYWxsIG5vdCBjb250YWluIG1vcmUgdGhhbiBvbmUgaW5zdGFuY2Ugb2YKKwktLSBPLUJjc21DYW1lbFREUERhdGEgY29udGFpbmluZyB0aGUgc2FtZSB2YWx1ZSBmb3Igby1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50LgorCS0tIEZvciBDQU1FTCBQaGFzZSAyLCB0aGlzIG1lYW5zIHRoYXQgb25seSBvbmUgaW5zdGFuY2Ugb2YgTy1CY3NtQ2FtZWxURFBEYXRhIGlzIGFsbG93ZWQKKwktLSB3aXRoIG8tQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludCBiZWluZyBlcXVhbCB0byBEUDIuCisKK21heE51bU9mQ2FtZWxURFBEYXRhICBJTlRFR0VSIDo6PSAxMAorCitPLUJjc21DYW1lbFREUERhdGEgOjo9IFNFUVVFTkNFIHsKKwlvLUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQJTy1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50LAorCXNlcnZpY2VLZXkJU2VydmljZUtleSwKKwlnc21TQ0YtQWRkcmVzcwlbMF0gSVNETi1BZGRyZXNzU3RyaW5nLAorCWRlZmF1bHRDYWxsSGFuZGxpbmcJWzFdIERlZmF1bHRDYWxsSGFuZGxpbmcsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uCisJfQorCitTZXJ2aWNlS2V5IDo6PSBJTlRFR0VSICgwLi4yMTQ3NDgzNjQ3KQorCitPLUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQgOjo9IEVOVU1FUkFURUQgeworCWNvbGxlY3RlZEluZm8gKDIpLAorCS4uLiwKKwlyb3V0ZVNlbGVjdEZhaWx1cmUgKDQpIH0KKwktLSBleGNlcHRpb24gaGFuZGxpbmc6CisJLS0gRm9yIE8tQmNzbUNhbWVsVERQRGF0YSBzZXF1ZW5jZXMgY29udGFpbmluZyB0aGlzIHBhcmFtZXRlciB3aXRoIGFueQorCS0tIG90aGVyIHZhbHVlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUgdGhlIHdob2xlIAorCS0tIE8tQmNzbUNhbWVsVERQRGF0YXNlcXVlbmNlLiAKKwktLSBGb3IgTy1CY3NtQ2FtZWxURFAtQ3JpdGVyaWEgc2VxdWVuY2VzIGNvbnRhaW5pbmcgdGhpcyBwYXJhbWV0ZXIgd2l0aCBhbnkKKwktLSBvdGhlciB2YWx1ZSB0aGFuIHRoZSBvbmVzIGxpc3RlZCB0aGUgcmVjZWl2ZXIgc2hhbGwgaWdub3JlIHRoZSB3aG9sZQorCS0tIE8tQmNzbUNhbWVsVERQLUNyaXRlcmlhIHNlcXVlbmNlLgorCitPLUJjc21DYW1lbFREUENyaXRlcmlhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZDYW1lbFREUERhdGEpIE9GCisJTy1CY3NtQ2FtZWxURFAtQ3JpdGVyaWEgCisKK1QtQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkNhbWVsVERQRGF0YSkgT0YKKwlULUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhIAorCitPLUJjc21DYW1lbFREUC1Dcml0ZXJpYSA6Oj0gU0VRVUVOQ0UgeworCW8tQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludAlPLUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQsCQorCWRlc3RpbmF0aW9uTnVtYmVyQ3JpdGVyaWEgCVswXSBEZXN0aW5hdGlvbk51bWJlckNyaXRlcmlhCU9QVElPTkFMLAorCWJhc2ljU2VydmljZUNyaXRlcmlhCVsxXSBCYXNpY1NlcnZpY2VDcml0ZXJpYQlPUFRJT05BTCwKKwljYWxsVHlwZUNyaXRlcmlhCVsyXSBDYWxsVHlwZUNyaXRlcmlhCU9QVElPTkFMLAorCS4uLiwKKwlvLUNhdXNlVmFsdWVDcml0ZXJpYQlbM10gTy1DYXVzZVZhbHVlQ3JpdGVyaWEJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs0XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwgfQorCitULUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhIDo6PSBTRVFVRU5DRSB7CisJdC1CQ1NNLVRyaWdnZXJEZXRlY3Rpb25Qb2ludAlULUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQsCQorCWJhc2ljU2VydmljZUNyaXRlcmlhCVswXSBCYXNpY1NlcnZpY2VDcml0ZXJpYQlPUFRJT05BTCwKKwl0LUNhdXNlVmFsdWVDcml0ZXJpYQlbMV0gVC1DYXVzZVZhbHVlQ3JpdGVyaWEJT1BUSU9OQUwsCisJLi4uIH0KKworRGVzdGluYXRpb25OdW1iZXJDcml0ZXJpYSAgOjo9IFNFUVVFTkNFIHsKKwltYXRjaFR5cGUJCVswXSBNYXRjaFR5cGUsCisJZGVzdGluYXRpb25OdW1iZXJMaXN0IAlbMV0gRGVzdGluYXRpb25OdW1iZXJMaXN0CU9QVElPTkFMLAorCWRlc3RpbmF0aW9uTnVtYmVyTGVuZ3RoTGlzdAlbMl0gRGVzdGluYXRpb25OdW1iZXJMZW5ndGhMaXN0CU9QVElPTkFMLAorCS0tIG9uZSBvciBib3RoIG9mIGRlc3RpbmF0aW9uTnVtYmVyTGlzdCBhbmQgZGVzdGluYXRpb25OdW1iZXJMZW5ndGhMaXN0IAorCS0tIHNoYWxsIGJlIHByZXNlbnQKKwkuLi59CisKK0Rlc3RpbmF0aW9uTnVtYmVyTGlzdCAgOjo9IFNFUVVFTkNFIFNJWkUJKDEuLm1heE51bU9mQ2FtZWxEZXN0aW5hdGlvbk51bWJlcnMpIE9GCisJCQkJSVNETi1BZGRyZXNzU3RyaW5nCisJLS0gVGhlIHJlY2VpdmluZyBlbnRpdHkgc2hhbGwgbm90IGNoZWNrIHRoZSBmb3JtYXQgb2YgYSBudW1iZXIgaW4KKwktLSB0aGUgZGlhbGxlZCBudW1iZXIgbGlzdAorCitEZXN0aW5hdGlvbk51bWJlckxlbmd0aExpc3QgIDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkNhbWVsRGVzdGluYXRpb25OdW1iZXJMZW5ndGhzKSBPRiAKKwkJCQkJSU5URUdFUigxLi5tYXhOdW1PZklTRE4tQWRkcmVzc0RpZ2l0cykKKworQmFzaWNTZXJ2aWNlQ3JpdGVyaWEgICA6Oj0gU0VRVUVOQ0UgU0laRSgxLi5tYXhOdW1PZkNhbWVsQmFzaWNTZXJ2aWNlQ3JpdGVyaWEpIE9GCisJRXh0LUJhc2ljU2VydmljZUNvZGUKKworbWF4TnVtT2ZJU0ROLUFkZHJlc3NEaWdpdHMgIElOVEVHRVIgOjo9IDE1CisKK21heE51bU9mQ2FtZWxEZXN0aW5hdGlvbk51bWJlcnMgIElOVEVHRVIgOjo9IDEwCisKK21heE51bU9mQ2FtZWxEZXN0aW5hdGlvbk51bWJlckxlbmd0aHMgIElOVEVHRVIgOjo9IDMKKworbWF4TnVtT2ZDYW1lbEJhc2ljU2VydmljZUNyaXRlcmlhICBJTlRFR0VSIDo6PSA1CisKK0NhbGxUeXBlQ3JpdGVyaWEgICAgICAgOjo9IEVOVU1FUkFURUQgeworCWZvcndhcmRlZCAJKDApLAorCW5vdEZvcndhcmRlZAkoMSl9CisKK01hdGNoVHlwZSAgICAgICA6Oj0gRU5VTUVSQVRFRCB7CisJaW5oaWJpdGluZyAJKDApLAorCWVuYWJsaW5nCQkoMSl9CisKK08tQ2F1c2VWYWx1ZUNyaXRlcmlhICAgOjo9IFNFUVVFTkNFIFNJWkUoMS4ubWF4TnVtT2ZDQU1FTC1PLUNhdXNlVmFsdWVDcml0ZXJpYSkgT0YKKwlDYXVzZVZhbHVlCisKK1QtQ2F1c2VWYWx1ZUNyaXRlcmlhICAgOjo9IFNFUVVFTkNFIFNJWkUoMS4ubWF4TnVtT2ZDQU1FTC1ULUNhdXNlVmFsdWVDcml0ZXJpYSkgT0YKKwlDYXVzZVZhbHVlCisKK21heE51bU9mQ0FNRUwtTy1DYXVzZVZhbHVlQ3JpdGVyaWEgIElOVEVHRVIgOjo9IDUKKworbWF4TnVtT2ZDQU1FTC1ULUNhdXNlVmFsdWVDcml0ZXJpYSAgSU5URUdFUiA6Oj0gNQorCitDYXVzZVZhbHVlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUoMSkpCistLSBUeXBlIGV4dHJhY3RlZCBmcm9tIENhdXNlIHBhcmFtZXRlciBpbiBJVFUtVCBSZWNvbW1lbmRhdGlvbiBRLjc2My4KKy0tIEZvciB0aGUgdXNlIG9mIGNhdXNlIHZhbHVlIHJlZmVyIHRvIElUVS1UIFJlY29tbWVuZGF0aW9uIFEuODUwLgorCitEZWZhdWx0Q2FsbEhhbmRsaW5nIDo6PSBFTlVNRVJBVEVEIHsKKwljb250aW51ZUNhbGwgKDApICwKKwlyZWxlYXNlQ2FsbCAoMSkgLAorCS4uLn0KKwktLSBleGNlcHRpb24gaGFuZGxpbmc6CisJLS0gcmVjZXB0aW9uIG9mIHZhbHVlcyBpbiByYW5nZSAyLTMxIHNoYWxsIGJlIHRyZWF0ZWQgYXMgImNvbnRpbnVlQ2FsbCIKKwktLSByZWNlcHRpb24gb2YgdmFsdWVzIGdyZWF0ZXIgdGhhbiAzMSBzaGFsbCBiZSB0cmVhdGVkIGFzICJyZWxlYXNlQ2FsbCIKKworQ2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcgOjo9IElOVEVHRVIoMS4uMTYpIAorCS0tIHZhbHVlIDEgPSBDQU1FTCBwaGFzZSAxLAorCS0tIHZhbHVlIDIgPSBDQU1FTCBwaGFzZSAyLAorCS0tIHZhbHVlIDMgPSBDQU1FTCBQaGFzZSAzLAorCS0tIHZhbHVlIDQgPSBDQU1FTCBwaGFzZSA0OgorCS0tIHJlY2VwdGlvbiBvZiB2YWx1ZXMgZ3JlYXRlciB0aGFuIDQgc2hhbGwgYmUgdHJlYXRlZCBhcyBDQU1FTCBwaGFzZSA0LgorCitTdXBwb3J0ZWRDYW1lbFBoYXNlcyA6Oj0gQklUIFNUUklORyB7CisJcGhhc2UxICgwKSwKKwlwaGFzZTIgKDEpLAorCXBoYXNlMyAoMiksCisJcGhhc2U0ICgzKX0gKFNJWkUgKDEuLjE2KSkgCistLSBBIG5vZGUgc2hhbGwgbWFyayBpbiB0aGUgQklUIFNUUklORyBhbGwgQ0FNRUwgUGhhc2VzIGl0IHN1cHBvcnRzLgorLS0gT3RoZXIgdmFsdWVzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworT2ZmZXJlZENhbWVsNENTSXMgOjo9IEJJVCBTVFJJTkcgeyAJCisJby1jc2kJCSgwKSwKKwlkLWNzaQkJKDEpLAorCXZ0LWNzaQkJKDIpLAorCXQtY3NpCQkoMyksCisJbXQtc21zLWNzaQkoNCksCisJbWctY3NpCQkoNSksCisJcHNpLWVuaGFuY2VtZW50cwkoNikgCit9IChTSVpFICg3Li4xNikpCistLSBBIG5vZGUgc3VwcG9ydGluZyBDYW1lbCBwaGFzZSA0IHNoYWxsIG1hcmsgaW4gdGhlIEJJVCBTVFJJTkcgYWxsIENhbWVsNCBDU0lzIAorLS0gaXQgb2ZmZXJzLgorLS0gT3RoZXIgdmFsdWVzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworT2ZmZXJlZENhbWVsNEZ1bmN0aW9uYWxpdGllcyA6Oj0gQklUIFNUUklORyB7IAkKKwlpbml0aWF0ZUNhbGxBdHRlbXB0CSgwKSwKKwlzcGxpdExlZwkJKDEpLAorCW1vdmVMZWcJCSgyKSwKKwlkaXNjb25uZWN0TGVnCSgzKSwKKwllbnRpdHlSZWxlYXNlZAkoNCksCisJZGZjLVdpdGhBcmd1bWVudAkoNSksCisJcGxheVRvbmUJCSg2KSwKKwlkdG1mLU1pZENhbGwJKDcpLAorCWNoYXJnaW5nSW5kaWNhdG9yCSg4KSwKKwlhbGVydGluZ0RQCSg5KSwKKwlsb2NhdGlvbkF0QWxlcnRpbmcJKDEwKSwKKwljaGFuZ2VPZlBvc2l0aW9uRFAJKDExKSwKKwlvci1JbnRlcmFjdGlvbnMJKDEyKSwKKwl3YXJuaW5nVG9uZUVuaGFuY2VtZW50cwkoMTMpLAorCWNmLUVuaGFuY2VtZW50cwkoMTQpLAorCXN1YnNjcmliZWRFbmhhbmNlZERpYWxsZWRTZXJ2aWNlcyAJKDE1KSwKKwlzZXJ2aW5nTmV0d29ya0VuaGFuY2VkRGlhbGxlZFNlcnZpY2VzICgxNiksCisJY3JpdGVyaWFGb3JDaGFuZ2VPZlBvc2l0aW9uRFAJKDE3KSwKKwlzZXJ2aWNlQ2hhbmdlRFAJKDE4KSwKKwljb2xsZWN0SW5mb3JtYXRpb24JKDE5KQorfSAoU0laRSAoMTUuLjY0KSkKKy0tIEEgbm9kZSBzdXBwb3J0aW5nIENhbWVsIHBoYXNlIDQgc2hhbGwgbWFyayBpbiB0aGUgQklUIFNUUklORyBhbGwgQ0FNRUw0IAorLS0gZnVuY3Rpb25hbGl0aWVzIGl0IG9mZmVycy4KKy0tIE90aGVyIHZhbHVlcyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK1NNUy1DU0kgOjo9IFNFUVVFTkNFIHsKKwlzbXMtQ0FNRUwtVERQLURhdGFMaXN0CVswXSBTTVMtQ0FNRUwtVERQLURhdGFMaXN0CU9QVElPTkFMLAorCWNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCVsxXSBDYW1lbENhcGFiaWxpdHlIYW5kbGluZwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwlub3RpZmljYXRpb25Ub0NTRQlbM10gTlVMTAkJT1BUSU9OQUwsCisJY3NpLUFjdGl2ZQlbNF0gTlVMTAkJT1BUSU9OQUwsCisJLi4ufQorLS0Jbm90aWZpY2F0aW9uVG9DU0UgYW5kIGNzaS1BY3RpdmUgc2hhbGwgbm90IGJlIHByZXNlbnQKKy0tCXdoZW4gTU8tU01TLUNTSSBvciBNVC1TTVMtQ1NJIGlzIHNlbnQgdG8gVkxSIG9yIFNHU04uCistLQlUaGV5IG1heSBvbmx5IGJlIGluY2x1ZGVkIGluIEFUU0kvQVRNIGFjay9OU0RDIG1lc3NhZ2UuCistLQlTTVMtQ0FNRUwtVERQLURhdGEgYW5kICBjYW1lbENhcGFiaWxpdHlIYW5kbGluZyBzaGFsbCBiZSBwcmVzZW50IGluIAorLS0JdGhlIFNNUy1DU0kgc2VxdWVuY2UuCistLQlJZiBTTVMtQ1NJIGlzIHNlZ21lbnRlZCwgc21zLUNBTUVMLVREUC1EYXRhTGlzdCBhbmQgY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcgc2hhbGwgYmUgCistLQlwcmVzZW50IGluIHRoZSBmaXJzdCBzZWdtZW50CisKK1NNUy1DQU1FTC1URFAtRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQ2FtZWxURFBEYXRhKSBPRgorCVNNUy1DQU1FTC1URFAtRGF0YQorLS0JU01TLUNBTUVMLVREUC1EYXRhTGlzdCBzaGFsbCBub3QgY29udGFpbiBtb3JlIHRoYW4gb25lIGluc3RhbmNlIG9mCistLQlTTVMtQ0FNRUwtVERQLURhdGEgY29udGFpbmluZyB0aGUgc2FtZSB2YWx1ZSBmb3Igc21zLVRyaWdnZXJEZXRlY3Rpb25Qb2ludC4KKworU01TLUNBTUVMLVREUC1EYXRhIDo6PSBTRVFVRU5DRSB7CisJc21zLVRyaWdnZXJEZXRlY3Rpb25Qb2ludAlbMF0gU01TLVRyaWdnZXJEZXRlY3Rpb25Qb2ludCwKKwlzZXJ2aWNlS2V5CVsxXSBTZXJ2aWNlS2V5LAorCWdzbVNDRi1BZGRyZXNzCVsyXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJZGVmYXVsdFNNUy1IYW5kbGluZwlbM10gRGVmYXVsdFNNUy1IYW5kbGluZywKKwlleHRlbnNpb25Db250YWluZXIJWzRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4KKwl9CisKK1NNUy1UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQgOjo9IEVOVU1FUkFURUQgeworCXNtcy1Db2xsZWN0ZWRJbmZvICgxKSwKKwkuLi4sCisJc21zLURlbGl2ZXJ5UmVxdWVzdCAoMikKKwl9CistLQlleGNlcHRpb24gaGFuZGxpbmc6CistLQlGb3IgU01TLUNBTUVMLVREUC1EYXRhIGFuZCBNVC1zbXNDQU1FTFREUC1Dcml0ZXJpYSBzZXF1ZW5jZXMgY29udGFpbmluZyB0aGlzIAorLS0JcGFyYW1ldGVyIHdpdGggYW55IG90aGVyIHZhbHVlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUKKy0tCXRoZSB3aG9sZSBzZXF1ZW5jZS4KKy0tCistLQlJZiB0aGlzIHBhcmFtZXRlciBpcyByZWNlaXZlZCB3aXRoIGFueSBvdGhlciB2YWx1ZSB0aGFuIHNtcy1Db2xsZWN0ZWRJbmZvCistLQlpbiBhbiBTTVMtQ0FNRUwtVERQLURhdGEgc2VxdWVuY2UgY29udGFpbmVkIGluIG1vLXNtcy1DU0ksIHRoZW4gdGhlIHJlY2VpdmVyIHNoYWxsCistLQlpZ25vcmUgdGhlIHdob2xlIFNNUy1DQU1FTC1URFAtRGF0YSBzZXF1ZW5jZS4KKy0tCistLQlJZiB0aGlzIHBhcmFtZXRlciBpcyByZWNlaXZlZCB3aXRoIGFueSBvdGhlciB2YWx1ZSB0aGFuIHNtcy1EZWxpdmVyeVJlcXVlc3QKKy0tCWluIGFuIFNNUy1DQU1FTC1URFAtRGF0YSBzZXF1ZW5jZSBjb250YWluZWQgaW4gbXQtc21zLUNTSSB0aGVuIHRoZSByZWNlaXZlciBzaGFsbAorLS0JaWdub3JlIHRoZSB3aG9sZSBTTVMtQ0FNRUwtVERQLURhdGEgc2VxdWVuY2UuCistLQorLS0JSWYgdGhpcyBwYXJhbWV0ZXIgaXMgcmVjZWl2ZWQgd2l0aCBhbnkgb3RoZXIgdmFsdWUgdGhhbiBzbXMtRGVsaXZlcnlSZXF1ZXN0CistLQlpbiBhbiBNVC1zbXNDQU1FTFREUC1Dcml0ZXJpYSBzZXF1ZW5jZSB0aGVuIHRoZSByZWNlaXZlciBzaGFsbAorLS0JaWdub3JlIHRoZSB3aG9sZSBNVC1zbXNDQU1FTFREUC1Dcml0ZXJpYSBzZXF1ZW5jZS4KKworRGVmYXVsdFNNUy1IYW5kbGluZyA6Oj0gRU5VTUVSQVRFRCB7CisJY29udGludWVUcmFuc2FjdGlvbiAoMCkgLAorCXJlbGVhc2VUcmFuc2FjdGlvbiAoMSkgLAorCS4uLn0KKy0tCWV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tCXJlY2VwdGlvbiBvZiB2YWx1ZXMgaW4gcmFuZ2UgMi0zMSBzaGFsbCBiZSB0cmVhdGVkIGFzICJjb250aW51ZVRyYW5zYWN0aW9uIgorLS0JcmVjZXB0aW9uIG9mIHZhbHVlcyBncmVhdGVyIHRoYW4gMzEgc2hhbGwgYmUgdHJlYXRlZCBhcyAicmVsZWFzZVRyYW5zYWN0aW9uIgorCitNLUNTSSA6Oj0gU0VRVUVOQ0UgeworCW1vYmlsaXR5VHJpZ2dlcnMJTW9iaWxpdHlUcmlnZ2VycywKKwlzZXJ2aWNlS2V5CVNlcnZpY2VLZXksCisJZ3NtU0NGLUFkZHJlc3MJWzBdCUlTRE4tQWRkcmVzc1N0cmluZywKKwlleHRlbnNpb25Db250YWluZXIJWzFdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwlub3RpZmljYXRpb25Ub0NTRQlbMl0gTlVMTAkJT1BUSU9OQUwsCisJY3NpLUFjdGl2ZQlbM10gTlVMTAkJT1BUSU9OQUwsCisJLi4ufQorLS0Jbm90aWZpY2F0aW9uVG9DU0UgYW5kIGNzaS1BY3RpdmUgc2hhbGwgbm90IGJlIHByZXNlbnQgd2hlbiBNLUNTSSBpcyBzZW50IHRvIFZMUi4KKy0tCVRoZXkgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gQVRTSS9BVE0gYWNrL05TREMgbWVzc2FnZS4KKworTUctQ1NJIDo6PSBTRVFVRU5DRSB7CisJbW9iaWxpdHlUcmlnZ2VycwlNb2JpbGl0eVRyaWdnZXJzLAorCXNlcnZpY2VLZXkJU2VydmljZUtleSwKKwlnc21TQ0YtQWRkcmVzcwlbMF0JSVNETi1BZGRyZXNzU3RyaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCW5vdGlmaWNhdGlvblRvQ1NFCVsyXSBOVUxMCQlPUFRJT05BTCwKKwljc2ktQWN0aXZlCVszXSBOVUxMCQlPUFRJT05BTCwKKwkuLi59CistLQlub3RpZmljYXRpb25Ub0NTRSBhbmQgY3NpLUFjdGl2ZSBzaGFsbCBub3QgYmUgcHJlc2VudCB3aGVuIE1HLUNTSSBpcyBzZW50IHRvIFNHU04uCistLQlUaGV5IG1heSBvbmx5IGJlIGluY2x1ZGVkIGluIEFUU0kvQVRNIGFjay9OU0RDIG1lc3NhZ2UuCisKK01vYmlsaXR5VHJpZ2dlcnMgIDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZk1vYmlsaXR5VHJpZ2dlcnMpIE9GCisJTU0tQ29kZQorCittYXhOdW1PZk1vYmlsaXR5VHJpZ2dlcnMgSU5URUdFUiA6Oj0gMTAKKworTU0tQ29kZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKy0tCVRoaXMgdHlwZSBpcyB1c2VkIHRvIGluZGljYXRlIGEgTW9iaWxpdHkgTWFuYWdlbWVudCBldmVudC4KKy0tCUFjdGlvbnMgZm9yIHRoZSBmb2xsb3dpbmcgTU0tQ29kZSB2YWx1ZXMgYXJlIGRlZmluZWQgaW4gQ0FNRUwgUGhhc2UgNDoKKy0tCistLQlDUyBkb21haW4gTU0gZXZlbnRzOgorLS0JTG9jYXRpb24tdXBkYXRlLWluLXNhbWUtVkxSCU1NLUNvZGUgOjo9ICcwMDAwMDAwMCdCCistLQlMb2NhdGlvbi11cGRhdGUtdG8tb3RoZXItVkxSCU1NLUNvZGUgOjo9ICcwMDAwMDAwMSdCCistLQlJTVNJLUF0dGFjaAlNTS1Db2RlIDo6PSAnMDAwMDAwMTAnQgorLS0JTVMtaW5pdGlhdGVkLUlNU0ktRGV0YWNoCU1NLUNvZGUgOjo9ICcwMDAwMDAxMSdCCistLQlOZXR3b3JrLWluaXRpYXRlZC1JTVNJLURldGFjaAlNTS1Db2RlIDo6PSAnMDAwMDAxMDAnQgorLS0KKy0tCVBTIGRvbWFpbiBNTSBldmVudHM6CistLQlSb3V0ZWluZy1BcmVhLXVwZGF0ZS1pbi1zYW1lLVNHU04JTU0tQ29kZSA6Oj0gJzEwMDAwMDAwJ0IKKy0tCVJvdXRlaW5nLUFyZWEtdXBkYXRlLXRvLW90aGVyLVNHU04tdXBkYXRlLWZyb20tbmV3LVNHU04KKy0tCQkJCU1NLUNvZGUgOjo9ICcxMDAwMDAwMSdCCistLQlSb3V0ZWluZy1BcmVhLXVwZGF0ZS10by1vdGhlci1TR1NOLWRpc2Nvbm5lY3QtYnktZGV0YWNoCistLQkJCQlNTS1Db2RlIDo6PSAnMTAwMDAwMTAnQgorLS0JR1BSUy1BdHRhY2gJTU0tQ29kZSA6Oj0gJzEwMDAwMDExJ0IKKy0tCU1TLWluaXRpYXRlZC1HUFJTLURldGFjaAlNTS1Db2RlIDo6PSAnMTAwMDAxMDAnQgorLS0JTmV0d29yay1pbml0aWF0ZWQtR1BSUy1EZXRhY2gJTU0tQ29kZSA6Oj0gJzEwMDAwMTAxJ0IgCistLQlOZXR3b3JrLWluaXRpYXRlZC10cmFuc2Zlci10by1NUy1ub3QtcmVhY2hhYmxlLWZvci1wYWdpbmcKKy0tCQkJCU1NLUNvZGUgOjo9ICcxMDAwMDExMCdCCistLQorLS0JSWYgdGhlIE1TQyByZWNlaXZlcyBhbnkgb3RoZXIgTU0tY29kZSB0aGFuIHRoZSBvbmVzIGxpc3RlZCBhYm92ZSBmb3IgdGhlCistLQlDUyBkb21haW4sIHRoZW4gdGhlIE1TQyBzaGFsbCBpZ25vcmUgdGhhdCBNTS1jb2RlLgorLS0JSWYgdGhlIFNHU04gcmVjZWl2ZXMgYW55IG90aGVyIE1NLWNvZGUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgYWJvdmUgZm9yIHRoZQorLS0JUFMgZG9tYWluLCB0aGVuIHRoZSBTR1NOIHNoYWxsIGlnbm9yZSB0aGF0IE1NLWNvZGUuCisKK1QtQ1NJIDo6PSBTRVFVRU5DRSB7CisJdC1CY3NtQ2FtZWxURFBEYXRhTGlzdAlULUJjc21DYW1lbFREUERhdGFMaXN0LAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCVswXSBDYW1lbENhcGFiaWxpdHlIYW5kbGluZwlPUFRJT05BTCwKKwlub3RpZmljYXRpb25Ub0NTRQlbMV0gTlVMTAkJT1BUSU9OQUwsCisJY3NpLUFjdGl2ZQlbMl0gTlVMTAkJT1BUSU9OQUx9CistLQlub3RpZmljYXRpb25Ub0NTRSBhbmQgY3NpLUFjdGl2ZSBzaGFsbCBub3QgYmUgcHJlc2VudCB3aGVuIFZULUNTSS9ULUNTSSBpcyBzZW50CistLQl0byBWTFIvR01TQy4KKy0tCVRoZXkgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gQVRTSS9BVE0gYWNrL05TREMgbWVzc2FnZS4KKy0tCVQtQ1NJIHNoYWxsIG5vdCBiZSBzZWdtZW50ZWQuCisKK1QtQmNzbUNhbWVsVERQRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQ2FtZWxURFBEYXRhKSBPRgorCVQtQmNzbUNhbWVsVERQRGF0YQorCS0tLSBULUJjc21DYW1lbFREUERhdGFMaXN0IHNoYWxsIG5vdCBjb250YWluIG1vcmUgdGhhbiBvbmUgaW5zdGFuY2Ugb2YKKwktLS0gVC1CY3NtQ2FtZWxURFBEYXRhIGNvbnRhaW5pbmcgdGhlIHNhbWUgdmFsdWUgZm9yIHQtQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludC4KKwktLS0gRm9yIENBTUVMIFBoYXNlIDIsIHRoaXMgbWVhbnMgdGhhdCBvbmx5IG9uZSBpbnN0YW5jZSBvZiBULUJjc21DYW1lbFREUERhdGEgaXMgYWxsb3dlZAorCS0tLSB3aXRoIHQtQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludCBiZWluZyBlcXVhbCB0byBEUDEyLiAKKwktLS0gRm9yIENBTUVMIFBoYXNlIDMsIG1vcmUgVERQknMgYXJlIGFsbG93ZWQuCisKK1QtQmNzbUNhbWVsVERQRGF0YSA6Oj0gU0VRVUVOQ0UgeworCXQtQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludAlULUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQsCisJc2VydmljZUtleQlTZXJ2aWNlS2V5LAorCWdzbVNDRi1BZGRyZXNzCVswXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJZGVmYXVsdENhbGxIYW5kbGluZwlbMV0gRGVmYXVsdENhbGxIYW5kbGluZywKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1QtQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludCA6Oj0gRU5VTUVSQVRFRCB7CisJdGVybUF0dGVtcHRBdXRob3JpemVkICgxMiksCisJLi4uICwKKwl0QnVzeSAoMTMpLAorCXROb0Fuc3dlciAoMTQpfQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKwktLSBGb3IgVC1CY3NtQ2FtZWxURFBEYXRhIHNlcXVlbmNlcyBjb250YWluaW5nIHRoaXMgcGFyYW1ldGVyIHdpdGggYW55IG90aGVyCisJLS0gdmFsdWUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgYWJvdmUsIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUgdGhlIHdob2xlCisJLS0gVC1CY3NtQ2FtZWxURFBEYXRhIHNlcXVlbmNlLgorCistLSBncHJzIGxvY2F0aW9uIGluZm9ybWF0aW9uIHJldHJpZXZhbCB0eXBlcworCitTZW5kUm91dGluZ0luZm9Gb3JHcHJzQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCQlbMF0gSU1TSSwKKwlnZ3NuLUFkZHJlc3MJCVsxXSBHU04tQWRkcmVzcwlPUFRJT05BTCwgCisJZ2dzbi1OdW1iZXIJCVsyXQlJU0ROLUFkZHJlc3NTdHJpbmcsCisJZXh0ZW5zaW9uQ29udGFpbmVyCQlbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworU2VuZFJvdXRpbmdJbmZvRm9yR3Byc1JlcyA6Oj0gU0VRVUVOQ0UgeworCXNnc24tQWRkcmVzcwkJWzBdIEdTTi1BZGRyZXNzLAorCWdnc24tQWRkcmVzcwkJWzFdCUdTTi1BZGRyZXNzCU9QVElPTkFMLAorCW1vYmlsZU5vdFJlYWNoYWJsZVJlYXNvbgkJWzJdCUFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcgkJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKKy0tIGZhaWx1cmUgcmVwb3J0IHR5cGVzCisKK0ZhaWx1cmVSZXBvcnRBcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJCVswXSBJTVNJLAorCWdnc24tTnVtYmVyCQlbMV0gSVNETi1BZGRyZXNzU3RyaW5nCSwKKwlnZ3NuLUFkZHJlc3MJCVsyXSBHU04tQWRkcmVzcwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitGYWlsdXJlUmVwb3J0UmVzIDo6PSBTRVFVRU5DRSB7CisJZ2dzbi1BZGRyZXNzCQlbMF0gR1NOLUFkZHJlc3MJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCQlbMV0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworLS0gZ3BycyBub3RpZmljYXRpb24gdHlwZXMKKworTm90ZU1zUHJlc2VudEZvckdwcnNBcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJCVswXSBJTVNJLAorCXNnc24tQWRkcmVzcwkJWzFdIEdTTi1BZGRyZXNzLAorCWdnc24tQWRkcmVzcwkJWzJdIEdTTi1BZGRyZXNzCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcgkJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK05vdGVNc1ByZXNlbnRGb3JHcHJzUmVzIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCQlbMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworLS0gZmF1bHQgcmVjb3ZlcnkgdHlwZXMKKworUmVzZXRBcmcgOjo9IFNFUVVFTkNFIHsKKwlobHItTnVtYmVyCUlTRE4tQWRkcmVzc1N0cmluZywKKwlobHItTGlzdAkJSExSLUxpc3QJCU9QVElPTkFMLAorCS4uLn0KKworUmVzdG9yZURhdGFBcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJSU1TSSwKKwlsbXNpCQkJTE1TSQkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwl2bHItQ2FwYWJpbGl0eQlbNl0gVkxSLUNhcGFiaWxpdHkJT1BUSU9OQUwgfQorCitSZXN0b3JlRGF0YVJlcyA6Oj0gU0VRVUVOQ0UgeworCWhsci1OdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAorCW1zTm90UmVhY2hhYmxlCU5VTEwJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworLS0gVkJTL1ZHQ1MgdHlwZXMKK1ZCU0RhdGFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlZCU0dyb3VwSWRzKSBPRgorCQkJCVZvaWNlQnJvYWRjYXN0RGF0YQorCitWR0NTRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mVkdDU0dyb3VwSWRzKSBPRgorCQkJCVZvaWNlR3JvdXBDYWxsRGF0YQorCittYXhOdW1PZlZCU0dyb3VwSWRzICBJTlRFR0VSIDo6PSA1MAorCittYXhOdW1PZlZHQ1NHcm91cElkcyAgSU5URUdFUiA6Oj0gNTAKKworVm9pY2VHcm91cENhbGxEYXRhICA6Oj0gU0VRVUVOQ0UgeworCWdyb3VwSWQJCUdyb3VwSWQsIAorCS0tIGdyb3VwSWQgc2hhbGwgYmUgZmlsbGVkIHdpdGggc2l4IFRCQ0QgZmlsbGVycyAoMTExMSlpZiB0aGUgbG9uZ0dyb3VwSWQgaXMgcHJlc2VudCAgCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJYWRkaXRpb25hbFN1YnNjcmlwdGlvbnMJQWRkaXRpb25hbFN1YnNjcmlwdGlvbnMJT1BUSU9OQUwsCisJYWRkaXRpb25hbEluZm8JWzBdIEFkZGl0aW9uYWxJbmZvCU9QVElPTkFMLAorCWxvbmdHcm91cElkCVsxXSBMb25nLUdyb3VwSWQJT1BUSU9OQUwgfQorCisJLS0gVm9pY2VHcm91cENhbGxEYXRhIGNvbnRhaW5pbmcgYSBsb25nR3JvdXBJZCBzaGFsbCBub3QgYmUgc2VudCB0byBWTFJzIHRoYXQgZGlkIG5vdAorCS0tIGluZGljYXRlIHN1cHBvcnQgb2YgbG9uZyBHcm91cCBJRHMgd2l0aGluIHRoZSBVcGRhdGUgTG9jYXRpb24gb3IgUmVzdG9yZSBEYXRhIAorCS0tIHJlcXVlc3QgbWVzc2FnZQorCitBZGRpdGlvbmFsSW5mbyA6Oj0gQklUIFNUUklORyAoU0laRSAoMS4uMTM2KSkKKy0tCSBSZWZlcnMgdG8gQWRkaXRpb25hbCBJbmZvIGFzIHNwZWNpZmllZCBpbiAzR1BQIFRTIDQzLjA2OCAKKworQWRkaXRpb25hbFN1YnNjcmlwdGlvbnMgOjo9IEJJVCBTVFJJTkcgeworCXByaXZpbGVnZWRVcGxpbmtSZXF1ZXN0ICgwKSwKKwllbWVyZ2VuY3lVcGxpbmtSZXF1ZXN0ICgxKSwKKwllbWVyZ2VuY3lSZXNldCAoMil9IChTSVpFICgzLi44KSkKKy0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitWb2ljZUJyb2FkY2FzdERhdGEgOjo9IFNFUVVFTkNFIHsKKwlncm91cGlkCQlHcm91cElkLCAKKwktLSBncm91cElkIHNoYWxsIGJlIGZpbGxlZCB3aXRoIHNpeCBUQkNEIGZpbGxlcnMgKDExMTEpaWYgdGhlIGxvbmdHcm91cElkIGlzIHByZXNlbnQKKwlicm9hZGNhc3RJbml0RW50aXRsZW1lbnQJTlVMTAkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWxvbmdHcm91cElkCVswXSBMb25nLUdyb3VwSWQJT1BUSU9OQUwgfQorCQorLS0gVm9pY2VCcm9hZGNhc3REYXRhIGNvbnRhaW5pbmcgYSBsb25nR3JvdXBJZCBzaGFsbCBub3QgYmUgc2VudCB0byBWTFJzIHRoYXQgZGlkIG5vdAorLS0gaW5kaWNhdGUgc3VwcG9ydCBvZiBsb25nIEdyb3VwIElEcyB3aXRoaW4gdGhlIFVwZGF0ZSBMb2NhdGlvbiBvciBSZXN0b3JlIERhdGEgCisJLS0gcmVxdWVzdCBtZXNzYWdlCisKK0dyb3VwSWQgIDo6PSBUQkNELVNUUklORyAoU0laRSAoMykpCisJLS0gV2hlbiBHcm91cC1JZCBpcyBsZXNzIHRoYW4gc2l4IGNoYXJhY3RlcnMgaW4gbGVuZ3RoLCB0aGUgVEJDRCBmaWxsZXIgKDExMTEpCisJLS0gaXMgdXNlZCB0byBmaWxsIHVudXNlZCBoYWxmIG9jdGV0cy4KKwktLSBSZWZlcnMgdG8gdGhlIEdyb3VwIElkZW50aWZpY2F0aW9uIGFzIHNwZWNpZmllZCBpbiAzR1BQIFRTIDIzLjAwMyAKKwktLSBhbmQgM0dQUCBUUyA0My4wNjgvIDQzLjA2OQorCitMb25nLUdyb3VwSWQgIDo6PSBUQkNELVNUUklORyAoU0laRSAoNCkpCisJLS0gV2hlbiBMb25nLUdyb3VwLUlkIGlzIGxlc3MgdGhhbiBlaWdodCBjaGFyYWN0ZXJzIGluIGxlbmd0aCwgdGhlIFRCQ0QgZmlsbGVyICgxMTExKQorCS0tIGlzIHVzZWQgdG8gZmlsbCB1bnVzZWQgaGFsZiBvY3RldHMuCisJLS0gUmVmZXJzIHRvIHRoZSBHcm91cCBJZGVudGlmaWNhdGlvbiBhcyBzcGVjaWZpZWQgaW4gM0dQUCBUUyAyMy4wMDMgCisJLS0gYW5kIDNHUFAgVFMgNDMuMDY4LyA0My4wNjkKKworCistLSBwcm92aWRlIHN1YnNjcmliZXIgaW5mbyB0eXBlcworCitQcm92aWRlU3Vic2NyaWJlckluZm9BcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQlbMF0gSU1TSSwKKwlsbXNpCQlbMV0gTE1TSQlPUFRJT05BTCwKKwlyZXF1ZXN0ZWRJbmZvCVsyXSBSZXF1ZXN0ZWRJbmZvLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwljYWxsUHJpb3JpdHkJWzRdCUVNTFBQLVByaW9yaXR5CU9QVElPTkFMCisJfQorCitQcm92aWRlU3Vic2NyaWJlckluZm9SZXMgOjo9IFNFUVVFTkNFIHsKKwlzdWJzY3JpYmVySW5mbwlTdWJzY3JpYmVySW5mbywKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworU3Vic2NyaWJlckluZm8gOjo9IFNFUVVFTkNFIHsKKwlsb2NhdGlvbkluZm9ybWF0aW9uCVswXSBMb2NhdGlvbkluZm9ybWF0aW9uCU9QVElPTkFMLAorCXN1YnNjcmliZXJTdGF0ZQlbMV0gU3Vic2NyaWJlclN0YXRlCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJbG9jYXRpb25JbmZvcm1hdGlvbkdQUlMJWzNdIExvY2F0aW9uSW5mb3JtYXRpb25HUFJTCU9QVElPTkFMLAorCXBzLVN1YnNjcmliZXJTdGF0ZQlbNF0gUFMtU3Vic2NyaWJlclN0YXRlCU9QVElPTkFMLAorCWltZWkJCQlbNV0gSU1FSQkJT1BUSU9OQUwsCisJbXMtQ2xhc3NtYXJrMglbNl0gTVMtQ2xhc3NtYXJrMglPUFRJT05BTCwKKwlncHJzLU1TLUNsYXNzCVs3XSBHUFJTTVNDbGFzcwlPUFRJT05BTCwKKwltbnBJbmZvUmVzCVs4XSBNTlBJbmZvUmVzCU9QVElPTkFMIH0KKworLS0JSWYgdGhlIEhMUiByZWNlaXZlcyBsb2NhdGlvbkluZm9ybWF0aW9uLCBzdWJzY3JpYmVyU3RhdGUgb3IgbXMtQ2xhc3NtYXJrMiBmcm9tIGFuIFNHU04KKy0tCWl0IHNoYWxsIGRpc2NhcmQgdGhlbS4KKy0tCUlmIHRoZSBITFIgcmVjZWl2ZXMgbG9jYXRpb25JbmZvcm1hdGlvbkdQUlMsIHBzLVN1YnNjcmliZXJTdGF0ZSBvciBncHJzLU1TLUNsYXNzIGZyb20KKy0tCWEgVkxSIGl0IHNoYWxsIGRpc2NhcmQgdGhlbS4KKy0tCUlmIHRoZSBITFIgcmVjZWl2ZXMgcGFyYW1ldGVycyB3aGljaCBpdCBoYXMgbm90IHJlcXVlc3RlZCwgaXQgc2hhbGwgZGlzY2FyZCB0aGVtLgorCitNTlBJbmZvUmVzIDo6PSBTRVFVRU5DRSB7CisJcm91dGVpbmdOdW1iZXIJWzBdIFJvdXRlaW5nTnVtYmVyIAlPUFRJT05BTCwKKwlpbXNpCQkJWzFdIElNU0kJCU9QVElPTkFMLAorCW1zaXNkbgkJWzJdIElTRE4tQWRkcmVzc1N0cmluZyAJT1BUSU9OQUwsCisJbnVtYmVyUG9ydGFiaWxpdHlTdGF0dXMJWzNdIE51bWJlclBvcnRhYmlsaXR5U3RhdHVzCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CistLQlUaGUgSU1TSSBwYXJhbWV0ZXIgY29udGFpbnMgYSBnZW5lcmljIElNU0ksIGkuZS4gaXQgaXMgbm90IHRpZWQgbmVjZXNzYXJpbHkgdG8gdGhlIAorLS0JU3Vic2NyaWJlci4gTUNDIGFuZCBNTkMgdmFsdWVzIGluIHRoaXMgSU1TSSBzaGFsbCBwb2ludCB0byB0aGUgU3Vic2NyaXB0aW9uIE5ldHdvcmsgb2YgCistLQl0aGUgU3Vic2NyaWJlci4gU2VlIDNHUFAgVFMgMjMuMDY2IFsxMDhdLgorCitSb3V0ZWluZ051bWJlciA6Oj0gVEJDRC1TVFJJTkcgKFNJWkUgKDEuLjUpKQorCisKK051bWJlclBvcnRhYmlsaXR5U3RhdHVzIDo6PSBFTlVNRVJBVEVEIHsKKwlub3RLbm93blRvQmVQb3J0ZWQJKDApLAorCW93bk51bWJlclBvcnRlZE91dAkoMSksCisJZm9yZWlnbk51bWJlclBvcnRlZFRvRm9yZWlnbk5ldHdvcmsJKDIpLAorCS4uLiwKKwlvd25OdW1iZXJOb3RQb3J0ZWRPdXQJKDQpLAorCWZvcmVpZ25OdW1iZXJQb3J0ZWRJbgkoNSkKKwl9CisJLS0JZXhjZXB0aW9uIGhhbmRsaW5nOiAKKwktLSAgcmVjZXB0aW9uIG9mIG90aGVyIHZhbHVlcyB0aGFuIHRoZSBvbmVzIGxpc3RlZCB0aGUgcmVjZWl2ZXIgc2hhbGwgaWdub3JlIHRoZSAKKwktLSAgd2hvbGUgTnVtYmVyUG9ydGFiaWxpdHlTdGF0dXM7CisJLS0gIG93bk51bWJlck5vdFBvcnRlZE91dCBvciBmb3JlaWduTnVtYmVyUG9ydGVkSW4gbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gQW55IFRpbWUgCisJLS0gIEludGVycm9nYXRpb24gbWVzc2FnZS4KKworTVMtQ2xhc3NtYXJrMiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgzKSkKKwktLSBUaGlzIHBhcmFtZXRlciBjYXJyaWVzIHRoZSB2YWx1ZSBwYXJ0IG9mIHRoZSBNUyBDbGFzc21hcmsgMiBJRSBkZWZpbmVkIGluIAorCS0tIDNHUFAgVFMgMjQuMDA4IFszNV0uCisKK0dQUlNNU0NsYXNzIDo6PSBTRVFVRU5DRSB7CisJbVNOZXR3b3JrQ2FwYWJpbGl0eQlbMF0gTVNOZXR3b3JrQ2FwYWJpbGl0eSwKKwltU1JhZGlvQWNjZXNzQ2FwYWJpbGl0eQlbMV0gTVNSYWRpb0FjY2Vzc0NhcGFiaWxpdHkJT1BUSU9OQUwKKwl9CisKK01TTmV0d29ya0NhcGFiaWxpdHkgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uOCkpCisJLS0gVGhpcyBwYXJhbWV0ZXIgY2FycmllcyB0aGUgdmFsdWUgcGFydCBvZiB0aGUgTVMgTmV0d29yayBDYXBhYmlsaXR5IElFIGRlZmluZWQgaW4gCisJLS0gM0dQUCBUUyAyNC4wMDggWzM1XS4KKwkKK01TUmFkaW9BY2Nlc3NDYXBhYmlsaXR5IDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjUwKSkKKwktLSBUaGlzIHBhcmFtZXRlciBjYXJyaWVzIHRoZSB2YWx1ZSBwYXJ0IG9mIHRoZSBNUyBSYWRpbyBBY2Nlc3MgQ2FwYWJpbGl0eSBJRSBkZWZpbmVkIGluCisJLS0gM0dQUCBUUyAyNC4wMDggWzM1XS4KKworUmVxdWVzdGVkSW5mbyA6Oj0gU0VRVUVOQ0UgeworCWxvY2F0aW9uSW5mb3JtYXRpb24JWzBdIE5VTEwJCU9QVElPTkFMLAorCXN1YnNjcmliZXJTdGF0ZQlbMV0gTlVMTAkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLCAKKwljdXJyZW50TG9jYXRpb24JWzNdIE5VTEwJCU9QVElPTkFMLAorCXJlcXVlc3RlZERvbWFpbglbNF0gRG9tYWluVHlwZQlPUFRJT05BTCwKKwlpbWVpCQkJWzZdIE5VTEwJCU9QVElPTkFMLAorCW1zLWNsYXNzbWFyawlbNV0gTlVMTAkJT1BUSU9OQUwsCisJbW5wUmVxdWVzdGVkSW5mbwlbN10gTlVMTCAJCU9QVElPTkFMIH0KKworLS0JY3VycmVudExvY2F0aW9uIHNoYWxsIGJlIGFic2VudCBpZiBsb2NhdGlvbkluZm9ybWF0aW9uIGlzIGFic2VudAorCitEb21haW5UeXBlIDo6PSAgRU5VTUVSQVRFRCB7CisJY3MtRG9tYWluCQkoMCksCisJcHMtRG9tYWluCQkoMSksCisJLi4ufQorLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0gcmVjZXB0aW9uIG9mIHZhbHVlcyA+IDEgc2hhbGwgYmUgbWFwcGVkIHRvICdjcy1Eb21haW4nCisKK0xvY2F0aW9uSW5mb3JtYXRpb24gOjo9IFNFUVVFTkNFIHsKKwlhZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24JQWdlT2ZMb2NhdGlvbkluZm9ybWF0aW9uCU9QVElPTkFMLAorCWdlb2dyYXBoaWNhbEluZm9ybWF0aW9uCVswXSBHZW9ncmFwaGljYWxJbmZvcm1hdGlvbglPUFRJT05BTCwKKwl2bHItbnVtYmVyCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJbG9jYXRpb25OdW1iZXIJWzJdIExvY2F0aW9uTnVtYmVyCU9QVElPTkFMLAorCWNlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJCVszXSBDZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRPckxBSQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCXNlbGVjdGVkTFNBLUlkCVs1XSBMU0FJZGVudGl0eQlPUFRJT05BTCwKKwltc2MtTnVtYmVyCVs2XSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJZ2VvZGV0aWNJbmZvcm1hdGlvbglbN10gR2VvZGV0aWNJbmZvcm1hdGlvbglPUFRJT05BTCwgCisJY3VycmVudExvY2F0aW9uUmV0cmlldmVkCVs4XSBOVUxMCQlPUFRJT05BTCwKKwlzYWktUHJlc2VudAlbOV0gTlVMTAkJT1BUSU9OQUwgfQorLS0gc2FpLVByZXNlbnQgaW5kaWNhdGVzIHRoYXQgdGhlIGNlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJIHBhcmFtZXRlciBjb250YWlucworLS0gYSBTZXJ2aWNlIEFyZWEgSWRlbnRpdHkuCistLSBjdXJyZW50TG9jYXRpb25SZXRyaWV2ZWQgc2hhbGwgYmUgcHJlc2VudCAKKy0tIGlmIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiB3ZXJlIHJldHJpZXZlZCBhZnRlciBhIHN1Y2Nlc3NmdWxsIHBhZ2luZy4KKworTG9jYXRpb25JbmZvcm1hdGlvbkdQUlMgOjo9IFNFUVVFTkNFIHsKKwljZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRPckxBSQlbMF0gQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUkgT1BUSU9OQUwsCisJcm91dGVpbmdBcmVhSWRlbnRpdHkJWzFdIFJBSWRlbnRpdHkJT1BUSU9OQUwsCisJZ2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24JWzJdIEdlb2dyYXBoaWNhbEluZm9ybWF0aW9uCU9QVElPTkFMLAorCXNnc24tTnVtYmVyCVszXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJc2VsZWN0ZWRMU0FJZGVudGl0eQlbNF0gTFNBSWRlbnRpdHkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs1XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCXNhaS1QcmVzZW50CVs2XSBOVUxMCQlPUFRJT05BTCwKKwlnZW9kZXRpY0luZm9ybWF0aW9uCVs3XSBHZW9kZXRpY0luZm9ybWF0aW9uCU9QVElPTkFMLAorCWN1cnJlbnRMb2NhdGlvblJldHJpZXZlZAlbOF0gTlVMTAkJT1BUSU9OQUwsCisJYWdlT2ZMb2NhdGlvbkluZm9ybWF0aW9uCVs5XSBBZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24JT1BUSU9OQUwgfQorLS0gc2FpLVByZXNlbnQgaW5kaWNhdGVzIHRoYXQgdGhlIGNlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJIHBhcmFtZXRlciBjb250YWlucworLS0gYSBTZXJ2aWNlIEFyZWEgSWRlbnRpdHkuCistLSBjdXJyZW50TG9jYXRpb25SZXRyaWV2ZWQgc2hhbGwgYmUgcHJlc2VudCBpZiB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24KKy0tIHdhcyByZXRyaWV2ZWQgYWZ0ZXIgc3VjY2Vzc2Z1bCBwYWdpbmcuCisKK1JBSWRlbnRpdHkgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNikpCistLSBSb3V0aW5nIEFyZWEgSWRlbnRpdHkgaXMgY29kZWQgaW4gYWNjb3JkYW5jZSB3aXRoIDNHUFAgVFMgMjkuMDYwIFsxMDVdLgorLS0gSXQgc2hhbGwgY29udGFpbiB0aGUgdmFsdWUgcGFydCBkZWZpbmVkIGluIDNHUFAgVFMgMjkuMDYwIG9ubHkuIEkuZS4gdGhlIDNHUFAgVFMgMjkuMDYwCistLSB0eXBlIGlkZW50aWZpZXIgb2N0ZXQgc2hhbGwgbm90IGJlIGluY2x1ZGVkLgorCisKK0dlb2dyYXBoaWNhbEluZm9ybWF0aW9uIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDgpKQorLS0JUmVmZXJzIHRvIGdlb2dyYXBoaWNhbCBJbmZvcm1hdGlvbiBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyLgorLS0JT25seSB0aGUgZGVzY3JpcHRpb24gb2YgYW4gZWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgY2lyY2xlCistLQlhcyBzcGVjaWZpZWQgaW4gM0dQUCBUUyAyMy4wMzIgaXMgYWxsb3dlZCB0byBiZSB1c2VkCistLQlUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGFjY29yZGluZyB0byAzR1BQIFRTIDIzLjAzMiBpcyBhcyBmb2xsb3dzOgorLS0JCVR5cGUgb2Ygc2hhcGUgKGVsbGlwc29pZCBwb2ludCB3aXRoIHVuY2VydGFpbnR5IGNpcmNsZSkJMSBvY3RldAorLS0JCURlZ3JlZXMgb2YgTGF0aXR1ZGUJCQkJMyBvY3RldHMKKy0tCQlEZWdyZWVzIG9mIExvbmdpdHVkZQkJCQkzIG9jdGV0cworLS0JCVVuY2VydGFpbnR5IGNvZGUJCQkJMSBvY3RldAorCitHZW9kZXRpY0luZm9ybWF0aW9uIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEwKSkKKy0tCVJlZmVycyB0byBDYWxsaW5nIEdlb2RldGljIExvY2F0aW9uIGRlZmluZWQgaW4gUS43NjMgKDE5OTkpLgorLS0JT25seSB0aGUgZGVzY3JpcHRpb24gb2YgYW4gZWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgY2lyY2xlCistLQlhcyBzcGVjaWZpZWQgaW4gUS43NjMgKDE5OTkpIGlzIGFsbG93ZWQgdG8gYmUgdXNlZAorLS0JVGhlIGludGVybmFsIHN0cnVjdHVyZSBhY2NvcmRpbmcgdG8gUS43NjMgKDE5OTkpIGlzIGFzIGZvbGxvd3M6CistLQkJU2NyZWVuaW5nIGFuZCBwcmVzZW50YXRpb24gaW5kaWNhdG9ycwkJMSBvY3RldAorLS0JCVR5cGUgb2Ygc2hhcGUgKGVsbGlwc29pZCBwb2ludCB3aXRoIHVuY2VydGFpbnR5IGNpcmNsZSkJMSBvY3RldAorLS0JCURlZ3JlZXMgb2YgTGF0aXR1ZGUJCQkJMyBvY3RldHMKKy0tCQlEZWdyZWVzIG9mIExvbmdpdHVkZQkJCQkzIG9jdGV0cworLS0JCVVuY2VydGFpbnR5IGNvZGUJCQkJMSBvY3RldAorLS0JCUNvbmZpZGVuY2UJCQkJMSBvY3RldAorCitMb2NhdGlvbk51bWJlciA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgyLi4xMCkpCisJLS0gdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGluIElUVS1UIFJlYyBRLjc2MworCitTdWJzY3JpYmVyU3RhdGUgOjo9IENIT0lDRSB7CisJYXNzdW1lZElkbGUJWzBdIE5VTEwsCisJY2FtZWxCdXN5CQlbMV0gTlVMTCwKKwluZXREZXROb3RSZWFjaGFibGUJTm90UmVhY2hhYmxlUmVhc29uLAorCW5vdFByb3ZpZGVkRnJvbVZMUglbMl0gTlVMTH0KKworUFMtU3Vic2NyaWJlclN0YXRlIDo6PSBDSE9JQ0UgeworCW5vdFByb3ZpZGVkRnJvbVNHU04JWzBdIE5VTEwsCisJcHMtRGV0YWNoZWQJWzFdIE5VTEwsCisJcHMtQXR0YWNoZWROb3RSZWFjaGFibGVGb3JQYWdpbmcJWzJdIE5VTEwsCisJcHMtQXR0YWNoZWRSZWFjaGFibGVGb3JQYWdpbmcJWzNdIE5VTEwsCisJcHMtUERQLUFjdGl2ZU5vdFJlYWNoYWJsZUZvclBhZ2luZwlbNF0gUERQLUNvbnRleHRJbmZvTGlzdCwKKwlwcy1QRFAtQWN0aXZlUmVhY2hhYmxlRm9yUGFnaW5nCVs1XSBQRFAtQ29udGV4dEluZm9MaXN0LAorCW5ldERldE5vdFJlYWNoYWJsZQlOb3RSZWFjaGFibGVSZWFzb24gfQorCitQRFAtQ29udGV4dEluZm9MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlBEUC1Db250ZXh0cykgT0YKKwkJCQlQRFAtQ29udGV4dEluZm8KKworUERQLUNvbnRleHRJbmZvIDo6PSBTRVFVRU5DRSB7CisJcGRwLUNvbnRleHRJZGVudGlmaWVyCVswXSBDb250ZXh0SWQsCisJcGRwLUNvbnRleHRBY3RpdmUJWzFdIE5VTEwJCU9QVElPTkFMLAorCXBkcC1UeXBlCQlbMl0gUERQLVR5cGUsCisJcGRwLUFkZHJlc3MJWzNdIFBEUC1BZGRyZXNzCU9QVElPTkFMLAorCWFwbi1TdWJzY3JpYmVkCVs0XSBBUE4JCU9QVElPTkFMLAorCWFwbi1JblVzZQkJWzVdIEFQTgkJT1BUSU9OQUwsCisJbnNhcGkJCVs2XSBOU0FQSQkJT1BUSU9OQUwsCisJdHJhbnNhY3Rpb25JZAlbN10gVHJhbnNhY3Rpb25JZAlPUFRJT05BTCwKKwl0ZWlkLUZvckduQW5kR3AJWzhdIFRFSUQJCU9QVElPTkFMLAorCXRlaWQtRm9ySXUJWzldIFRFSUQJCU9QVElPTkFMLAorCWdnc24tQWRkcmVzcwlbMTBdIEdTTi1BZGRyZXNzIAlPUFRJT05BTCwKKwlxb3MtU3Vic2NyaWJlZAlbMTFdIEV4dC1Rb1MtU3Vic2NyaWJlZAlPUFRJT05BTCwKKwlxb3MtUmVxdWVzdGVkCVsxMl0gRXh0LVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMLAorCXFvcy1OZWdvdGlhdGVkCVsxM10gRXh0LVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMLAorCWNoYXJnaW5nSWQJWzE0XSBHUFJTQ2hhcmdpbmdJRAlPUFRJT05BTCwKKwljaGFyZ2luZ0NoYXJhY3RlcmlzdGljcwlbMTVdIENoYXJnaW5nQ2hhcmFjdGVyaXN0aWNzCU9QVElPTkFMLAorCXJuYy1BZGRyZXNzCVsxNl0gR1NOLUFkZHJlc3MJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxN10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlxb3MyLVN1YnNjcmliZWQJWzE4XSBFeHQyLVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMLAorCS0tIHFvczItU3Vic2NyaWJlZCBtYXkgYmUgcHJlc2VudCBvbmx5IGlmIHFvcy1TdWJzY3JpYmVkIGlzIHByZXNlbnQuCisJcW9zMi1SZXF1ZXN0ZWQJWzE5XSBFeHQyLVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMLAorCS0tIHFvczItUmVxdWVzdGVkIG1heSBiZSBwcmVzZW50IG9ubHkgaWYgcW9zLVJlcXVlc3RlZCBpcyBwcmVzZW50LgorCXFvczItTmVnb3RpYXRlZAlbMjBdIEV4dDItUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwsCisJLS0gcW9zMi1OZWdvdGlhdGVkIG1heSBiZSBwcmVzZW50IG9ubHkgaWYgcW9zLU5lZ290aWF0ZWQgaXMgcHJlc2VudC4KKwkJcW9zMy1TdWJzY3JpYmVkCVsyMV0gRXh0My1Rb1MtU3Vic2NyaWJlZAlPUFRJT05BTCwKKwktLSBxb3MzLVN1YnNjcmliZWQgbWF5IGJlIHByZXNlbnQgb25seSBpZiBxb3MyLVN1YnNjcmliZWQgaXMgcHJlc2VudC4KKwlxb3MzLVJlcXVlc3RlZAlbMjJdIEV4dDMtUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwsCisJLS0gcW9zMy1SZXF1ZXN0ZWQgbWF5IGJlIHByZXNlbnQgb25seSBpZiBxb3MyLVJlcXVlc3RlZCBpcyBwcmVzZW50LgorCXFvczMtTmVnb3RpYXRlZAlbMjNdIEV4dDMtUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwKKwktLSBxb3MzLU5lZ290aWF0ZWQgbWF5IGJlIHByZXNlbnQgb25seSBpZiBxb3MyLU5lZ290aWF0ZWQgaXMgcHJlc2VudC4KK30KKworTlNBUEkgOjo9IElOVEVHRVIgKDAuLjE1KQorLS0JVGhpcyB0eXBlIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIE5ldHdvcmsgbGF5ZXIgU2VydmljZSBBY2Nlc3MgUG9pbnQKKworVHJhbnNhY3Rpb25JZCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi4yKSkKKy0tCVRoaXMgdHlwZSBjYXJyaWVzIHRoZSB2YWx1ZSBwYXJ0IG9mIHRoZSB0cmFuc2FjdGlvbiBpZGVudGlmaWVyIHdoaWNoIGlzIHVzZWQgaW4gdGhlIAorLS0Jc2Vzc2lvbiBtYW5hZ2VtZW50IG1lc3NhZ2VzIG9uIHRoZSBhY2Nlc3MgaW50ZXJmYWNlLiBUaGUgZW5jb2RpbmcgaXMgZGVmaW5lZCBpbiAKKy0tCTNHUFAgVFMgMjQuMDA4CisKK1RFSUQgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNCkpCistLQlUaGlzIHR5cGUgY2FycmllcyB0aGUgdmFsdWUgcGFydCBvZiB0aGUgVHVubmVsIEVuZHBvaW50IElkZW50aWZpZXIgd2hpY2ggaXMgdXNlZCB0byAKKy0tCWRpc3Rpbmd1aXNoIGJldHdlZW4gZGlmZmVyZW50IHR1bm5lbHMgYmV0d2VlbiB0aGUgc2FtZSBwYWlyIG9mIGVudGl0aWVzIHdoaWNoIGNvbW11bmljYXRlIAorLS0JdXNpbmcgdGhlIEdQUlMgVHVubmVsbGluZyBQcm90b2NvbCBUaGUgZW5jb2RpbmcgaXMgZGVmaW5lZCBpbiAzR1BQIFRTIDI5LjA2MC4KKworR1BSU0NoYXJnaW5nSUQgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNCkpCistLQlUaGUgQ2hhcmdpbmcgSUQgaXMgYSB1bmlxdWUgZm91ciBvY3RldCB2YWx1ZSBnZW5lcmF0ZWQgYnkgdGhlIEdHU04gd2hlbiAKKy0tCWEgUERQIENvbnRleHQgaXMgYWN0aXZhdGVkLiBBIENoYXJnaW5nIElEIGlzIGdlbmVyYXRlZCBmb3IgZWFjaCBhY3RpdmF0ZWQgY29udGV4dC4KKy0tCVRoZSBlbmNvZGluZyBpcyBkZWZpbmVkIGluIDNHUFAgVFMgMjkuMDYwLgorCitOb3RSZWFjaGFibGVSZWFzb24gOjo9IEVOVU1FUkFURUQgeworCW1zUHVyZ2VkICgwKSwKKwlpbXNpRGV0YWNoZWQgKDEpLAorCXJlc3RyaWN0ZWRBcmVhICgyKSwKKwlub3RSZWdpc3RlcmVkICgzKX0KKworLS0gYW55IHRpbWUgaW50ZXJyb2dhdGlvbiBpbmZvIHR5cGVzCisKK0FueVRpbWVJbnRlcnJvZ2F0aW9uQXJnIDo6PSBTRVFVRU5DRSB7CisJc3Vic2NyaWJlcklkZW50aXR5CVswXSBTdWJzY3JpYmVySWRlbnRpdHksCisJcmVxdWVzdGVkSW5mbwlbMV0gUmVxdWVzdGVkSW5mbywKKwlnc21TQ0YtQWRkcmVzcwlbM10gSVNETi1BZGRyZXNzU3RyaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQW55VGltZUludGVycm9nYXRpb25SZXMgOjo9IFNFUVVFTkNFIHsKKwlzdWJzY3JpYmVySW5mbwlTdWJzY3JpYmVySW5mbywKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworLS0gYW55IHRpbWUgaW5mb3JtYXRpb24gaGFuZGxpbmcgdHlwZXMKKworQW55VGltZVN1YnNjcmlwdGlvbkludGVycm9nYXRpb25BcmcgOjo9IFNFUVVFTkNFIHsKKwlzdWJzY3JpYmVySWRlbnRpdHkJWzBdIFN1YnNjcmliZXJJZGVudGl0eSwKKwlyZXF1ZXN0ZWRTdWJzY3JpcHRpb25JbmZvCVsxXSBSZXF1ZXN0ZWRTdWJzY3JpcHRpb25JbmZvLAorCWdzbVNDRi1BZGRyZXNzCVsyXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJbG9uZ0ZUTi1TdXBwb3J0ZWQJWzRdCU5VTEwJCU9QVElPTkFMLAorCS4uLn0KKworQW55VGltZVN1YnNjcmlwdGlvbkludGVycm9nYXRpb25SZXMgOjo9IFNFUVVFTkNFIHsKKwljYWxsRm9yd2FyZGluZ0RhdGEJWzFdIENhbGxGb3J3YXJkaW5nRGF0YQlPUFRJT05BTCwKKwljYWxsQmFycmluZ0RhdGEJWzJdIENhbGxCYXJyaW5nRGF0YQlPUFRJT05BTCwKKwlvZGItSW5mbwkJWzNdIE9EQi1JbmZvCU9QVElPTkFMLAorCWNhbWVsLVN1YnNjcmlwdGlvbkluZm8JWzRdIENBTUVMLVN1YnNjcmlwdGlvbkluZm8JT1BUSU9OQUwsCisJc3VwcG9ydGVkVkxSLUNBTUVMLVBoYXNlcwlbNV0gU3VwcG9ydGVkQ2FtZWxQaGFzZXMJT1BUSU9OQUwsCisJc3VwcG9ydGVkU0dTTi1DQU1FTC1QaGFzZXMJWzZdIFN1cHBvcnRlZENhbWVsUGhhc2VzCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbN10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJb2ZmZXJlZENhbWVsNENTSXNJblZMUglbOF0gT2ZmZXJlZENhbWVsNENTSXMJT1BUSU9OQUwsCisJb2ZmZXJlZENhbWVsNENTSXNJblNHU04JWzldIE9mZmVyZWRDYW1lbDRDU0lzCU9QVElPTkFMLAorCW1zaXNkbi1CUy1MaXN0CVsxMF0gTVNJU0ROLUJTLUxpc3QJT1BUSU9OQUwgfQorCitSZXF1ZXN0ZWRTdWJzY3JpcHRpb25JbmZvIDo6PSBTRVFVRU5DRSB7CisJcmVxdWVzdGVkU1MtSW5mbwlbMV0gU1MtRm9yQlMtQ29kZQlPUFRJT05BTCwKKwlvZGIJCQlbMl0gTlVMTAkJT1BUSU9OQUwsCisJcmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbwlbM10gUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbwkJT1BUSU9OQUwsCisJc3VwcG9ydGVkVkxSLUNBTUVMLVBoYXNlcwlbNF0gTlVMTAkJT1BUSU9OQUwsCisJc3VwcG9ydGVkU0dTTi1DQU1FTC1QaGFzZXMJWzVdIE5VTEwJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlhZGRpdGlvbmFsUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbworCQkJCVs3XSBBZGRpdGlvbmFsUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbworCQkJCQkJCU9QVElPTkFMLAorCW1zaXNkbi1CUy1MaXN0CVs4XSBOVUxMCQlPUFRJT05BTCB9CisKK01TSVNETi1CUy1MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZk1TSVNETikgT0YKKwkJCQlNU0lTRE4tQlMKKworbWF4TnVtT2ZNU0lTRE4gIElOVEVHRVIgOjo9IDUwCisKKworTVNJU0ROLUJTIDo6PSBTRVFVRU5DRSB7CisJbXNpc2RuCQkJSVNETi1BZGRyZXNzU3RyaW5nLAkKKwliYXNpY1NlcnZpY2VMaXN0CVswXQlCYXNpY1NlcnZpY2VMaXN0CU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbyA6Oj0gRU5VTUVSQVRFRCB7CisJby1DU0kJCSgwKSwKKwl0LUNTSQkJKDEpLAorCXZ0LUNTSQkJKDIpLAorCXRpZi1DU0kJCSgzKSwKKwlncHJzLUNTSQkJKDQpLAorCW1vLXNtcy1DU0kJKDUpLAorCXNzLUNTSQkJKDYpLAorCW0tQ1NJCQkoNyksCisJZC1jc2kJCSg4KX0KKworQWRkaXRpb25hbFJlcXVlc3RlZENBTUVMLVN1YnNjcmlwdGlvbkluZm8gOjo9IEVOVU1FUkFURUQgeworCW10LXNtcy1DU0kJKDApLAorCW1nLWNzaQkJKDEpLAorCW8tSU0tQ1NJIAkJKDIpLAorCWQtSU0tQ1NJCQkoMyksCisJdnQtSU0tQ1NJCSAJKDQpLAorCS4uLn0KKy0tCWV4Y2VwdGlvbiBoYW5kbGluZzogdW5rbm93biB2YWx1ZXMgc2hhbGwgYmUgZGlzY2FyZGVkIGJ5IHRoZSByZWNlaXZlci4KKworQ2FsbEZvcndhcmRpbmdEYXRhIDo6PSBTRVFVRU5DRSB7CisJZm9yd2FyZGluZ0ZlYXR1cmVMaXN0CUV4dC1Gb3J3RmVhdHVyZUxpc3QsCisJbm90aWZpY2F0aW9uVG9DU0UJTlVMTAkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQ2FsbEJhcnJpbmdEYXRhIDo6PSBTRVFVRU5DRSB7CisJY2FsbEJhcnJpbmdGZWF0dXJlTGlzdAlFeHQtQ2FsbEJhckZlYXR1cmVMaXN0LAorCXBhc3N3b3JkCQlQYXNzd29yZAkJT1BUSU9OQUwsCisJd3JvbmdQYXNzd29yZEF0dGVtcHRzQ291bnRlcglXcm9uZ1Bhc3N3b3JkQXR0ZW1wdHNDb3VudGVyCU9QVElPTkFMLAorCW5vdGlmaWNhdGlvblRvQ1NFCU5VTEwJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworV3JvbmdQYXNzd29yZEF0dGVtcHRzQ291bnRlciA6Oj0gSU5URUdFUiAoMC4uNCkKKworT0RCLUluZm8gOjo9IFNFUVVFTkNFIHsKKwlvZGItRGF0YQkJT0RCLURhdGEsCisJbm90aWZpY2F0aW9uVG9DU0UJTlVMTAkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitDQU1FTC1TdWJzY3JpcHRpb25JbmZvIDo6PSBTRVFVRU5DRSB7CisJby1DU0kJCVswXQlPLUNTSQlPUFRJT05BTCwKKwlvLUJjc21DYW1lbFREUC1Dcml0ZXJpYUxpc3QJWzFdCU8tQmNzbUNhbWVsVERQQ3JpdGVyaWFMaXN0CU9QVElPTkFMLCAKKwlkLUNTSQkJWzJdCUQtQ1NJCU9QVElPTkFMLAorCXQtQ1NJCQlbM10JVC1DU0kJT1BUSU9OQUwsCisJdC1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYUxpc3QJWzRdCVQtQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWFMaXN0CU9QVElPTkFMLAorCXZ0LUNTSQkJWzVdCVQtQ1NJCU9QVElPTkFMLAorCXZ0LUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhTGlzdAlbNl0JVC1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYUxpc3QJT1BUSU9OQUwsCisJdGlmLUNTSQkJWzddCU5VTEwJCU9QVElPTkFMLAorCXRpZi1DU0ktTm90aWZpY2F0aW9uVG9DU0UJWzhdCU5VTEwJCU9QVElPTkFMLAorCWdwcnMtQ1NJCQlbOV0JR1BSUy1DU0kJT1BUSU9OQUwsCisJbW8tc21zLUNTSQlbMTBdCVNNUy1DU0kJT1BUSU9OQUwsCisJc3MtQ1NJCQlbMTFdCVNTLUNTSQlPUFRJT05BTCwKKwltLUNTSQkJWzEyXQlNLUNTSQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzEzXQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCXNwZWNpZmljQ1NJRGVsZXRlZExpc3QJWzE0XQlTcGVjaWZpY0NTSS1XaXRoZHJhdwlPUFRJT05BTCwKKwltdC1zbXMtQ1NJCVsxNV0JU01TLUNTSQlPUFRJT05BTCwKKwltdC1zbXNDQU1FTFREUC1Dcml0ZXJpYUxpc3QJWzE2XQlNVC1zbXNDQU1FTFREUC1Dcml0ZXJpYUxpc3QJT1BUSU9OQUwsCisJbWctY3NpCQlbMTddCU1HLUNTSQlPUFRJT05BTCwKKwlvLUlNLUNTSQkJWzE4XSBPLUNTSQlPUFRJT05BTCwKKwlvLUlNLUJjc21DYW1lbFREUC1Dcml0ZXJpYUxpc3QJWzE5XSBPLUJjc21DYW1lbFREUENyaXRlcmlhTGlzdAlPUFRJT05BTCwKKwlkLUlNLUNTSQkJWzIwXSBELUNTSQlPUFRJT05BTCwKKwl2dC1JTS1DU0kJCVsyMV0gVC1DU0kJT1BUSU9OQUwsCisJdnQtSU0tQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWFMaXN0CVsyMl0JVC1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYUxpc3QJT1BUSU9OQUwKKwl9CisKK0FueVRpbWVNb2RpZmljYXRpb25BcmcgOjo9IFNFUVVFTkNFIHsKKwlzdWJzY3JpYmVySWRlbnRpdHkJWzBdCVN1YnNjcmliZXJJZGVudGl0eSwKKwlnc21TQ0YtQWRkcmVzcwlbMV0JSVNETi1BZGRyZXNzU3RyaW5nLAorCW1vZGlmaWNhdGlvblJlcXVlc3RGb3ItQ0YtSW5mbwlbMl0JTW9kaWZpY2F0aW9uUmVxdWVzdEZvci1DRi1JbmZvIE9QVElPTkFMLAorCW1vZGlmaWNhdGlvblJlcXVlc3RGb3ItQ0ItSW5mbwlbM10JTW9kaWZpY2F0aW9uUmVxdWVzdEZvci1DQi1JbmZvIE9QVElPTkFMLAorCW1vZGlmaWNhdGlvblJlcXVlc3RGb3ItQ1NJCVs0XQlNb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUNTSQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzVdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwlsb25nRlROLVN1cHBvcnRlZAlbNl0JTlVMTAkJT1BUSU9OQUwsCisJLi4uLAorCW1vZGlmaWNhdGlvblJlcXVlc3RGb3ItT0RCLWRhdGEJWzddCU1vZGlmaWNhdGlvblJlcXVlc3RGb3ItT0RCLWRhdGEgT1BUSU9OQUwsCisJbW9kaWZpY2F0aW9uUmVxdWVzdEZvci1JUC1TTS1HVy1EYXRhCVs4XQlNb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUlQLVNNLUdXLURhdGEgT1BUSU9OQUwgfQorCitBbnlUaW1lTW9kaWZpY2F0aW9uUmVzIDo6PSBTRVFVRU5DRSB7CisJc3MtSW5mb0Zvci1DU0UJWzBdCUV4dC1TUy1JbmZvRm9yLUNTRQlPUFRJT05BTCwKKwljYW1lbC1TdWJzY3JpcHRpb25JbmZvCVsxXQlDQU1FTC1TdWJzY3JpcHRpb25JbmZvCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlvZGItSW5mbwkJWzNdCU9EQi1JbmZvCU9QVElPTkFMIH0KKworTW9kaWZpY2F0aW9uUmVxdWVzdEZvci1DRi1JbmZvIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJWzBdCVNTLUNvZGUsCisJYmFzaWNTZXJ2aWNlCVsxXQlFeHQtQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKKwlzcy1TdGF0dXMJCVsyXQlFeHQtU1MtU3RhdHVzCU9QVElPTkFMLAorCWZvcndhcmRlZFRvTnVtYmVyCVszXQlBZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWZvcndhcmRlZFRvU3ViYWRkcmVzcwlbNF0JSVNETi1TdWJhZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCW5vUmVwbHlDb25kaXRpb25UaW1lCVs1XQlFeHQtTm9SZXBDb25kVGltZQlPUFRJT05BTCwKKwltb2RpZnlOb3RpZmljYXRpb25Ub0NTRQlbNl0JTW9kaWZpY2F0aW9uSW5zdHJ1Y3Rpb24JT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs3XQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitNb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUNCLUluZm8gOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlbMF0JU1MtQ29kZSwKKwliYXNpY1NlcnZpY2UJWzFdCUV4dC1CYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAorCXNzLVN0YXR1cwkJWzJdCUV4dC1TUy1TdGF0dXMJT1BUSU9OQUwsCisJcGFzc3dvcmQJCVszXQlQYXNzd29yZAlPUFRJT05BTCwKKwl3cm9uZ1Bhc3N3b3JkQXR0ZW1wdHNDb3VudGVyCVs0XQlXcm9uZ1Bhc3N3b3JkQXR0ZW1wdHNDb3VudGVyCU9QVElPTkFMLAorCW1vZGlmeU5vdGlmaWNhdGlvblRvQ1NFCVs1XQlNb2RpZmljYXRpb25JbnN0cnVjdGlvbglPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzZdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK01vZGlmaWNhdGlvblJlcXVlc3RGb3ItT0RCLWRhdGEgOjo9IFNFUVVFTkNFIHsKKwlvZGItZGF0YQkJWzBdCU9EQi1EYXRhCU9QVElPTkFMLAorCW1vZGlmeU5vdGlmaWNhdGlvblRvQ1NFCVsxXQlNb2RpZmljYXRpb25JbnN0cnVjdGlvbglPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK01vZGlmaWNhdGlvblJlcXVlc3RGb3ItQ1NJIDo6PSBTRVFVRU5DRSB7CisJcmVxdWVzdGVkQ2FtZWwtU3Vic2NyaXB0aW9uSW5mbwlbMF0JUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbywKKwltb2RpZnlOb3RpZmljYXRpb25Ub0NTRQlbMV0JTW9kaWZpY2F0aW9uSW5zdHJ1Y3Rpb24JT1BUSU9OQUwsCisJbW9kaWZ5Q1NJLVN0YXRlCVsyXQlNb2RpZmljYXRpb25JbnN0cnVjdGlvbglPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzNdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJYWRkaXRpb25hbFJlcXVlc3RlZENBTUVMLVN1YnNjcmlwdGlvbkluZm8KKwkJCQlbNF0gQWRkaXRpb25hbFJlcXVlc3RlZENBTUVMLVN1YnNjcmlwdGlvbkluZm8KKwkJCQkJCQlPUFRJT05BTCB9CistLSByZXF1ZXN0ZWRDYW1lbC1TdWJzY3JpcHRpb25JbmZvIHNoYWxsIGJlIGRpc2NhcmRlZCBpZgorLS0gYWRkaXRpb25hbFJlcXVlc3RlZENBTUVMLVN1YnNjcmlwdGlvbkluZm8gaXMgcmVjZWl2ZWQKKworTW9kaWZpY2F0aW9uUmVxdWVzdEZvci1JUC1TTS1HVy1EYXRhIDo6PSBTRVFVRU5DRSB7CisJbW9kaWZ5UmVnaXN0cmF0aW9uU3RhdHVzCVswXQlNb2RpZmljYXRpb25JbnN0cnVjdGlvbglPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzFdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK01vZGlmaWNhdGlvbkluc3RydWN0aW9uIDo6PSBFTlVNRVJBVEVEIHsKKwlkZWFjdGl2YXRlCSgwKSwKKwlhY3RpdmF0ZQkJKDEpfQorCistLSBzdWJzY3JpYmVyIGRhdGEgbW9kaWZpY2F0aW9uIG5vdGlmaWNhdGlvbiB0eXBlcworCitOb3RlU3Vic2NyaWJlckRhdGFNb2RpZmllZEFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlJTVNJLAorCW1zaXNkbgkJSVNETi1BZGRyZXNzU3RyaW5nLAorCWZvcndhcmRpbmdJbmZvRm9yLUNTRQlbMF0gRXh0LUZvcndhcmRpbmdJbmZvRm9yLUNTRQlPUFRJT05BTCwKKwljYWxsQmFycmluZ0luZm9Gb3ItQ1NFCVsxXSBFeHQtQ2FsbEJhcnJpbmdJbmZvRm9yLUNTRQlPUFRJT05BTCwKKwlvZGItSW5mbwkJWzJdIE9EQi1JbmZvCU9QVElPTkFMLAorCWNhbWVsLVN1YnNjcmlwdGlvbkluZm8JWzNdIENBTUVMLVN1YnNjcmlwdGlvbkluZm8JT1BUSU9OQUwsCisJYWxsSW5mb3JtYXRpb25TZW50CVs0XSBOVUxMCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTm90ZVN1YnNjcmliZXJEYXRhTW9kaWZpZWRSZXMgOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworLS0gbW9iaWxpdHkgbWFuYWdlbWVudCBldmVudCBub3RpZmljYXRpb29uIGluZm8gdHlwZXMKKworTm90ZU1NLUV2ZW50QXJnOjo9IFNFUVVFTkNFIHsKKwlzZXJ2aWNlS2V5CVNlcnZpY2VLZXksCisJZXZlbnRNZXQJCVswXQlNTS1Db2RlLAorCWltc2kJCQlbMV0JSU1TSSwKKwltc2lzZG4JCVsyXQlJU0ROLUFkZHJlc3NTdHJpbmcsCisJbG9jYXRpb25JbmZvcm1hdGlvbglbM10JTG9jYXRpb25JbmZvcm1hdGlvbglPUFRJT05BTCwKKwlzdXBwb3J0ZWRDQU1FTFBoYXNlcwlbNV0JU3VwcG9ydGVkQ2FtZWxQaGFzZXMJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs2XQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWxvY2F0aW9uSW5mb3JtYXRpb25HUFJTCVs3XQlMb2NhdGlvbkluZm9ybWF0aW9uR1BSUwlPUFRJT05BTCwKKwlvZmZlcmVkQ2FtZWw0RnVuY3Rpb25hbGl0aWVzCVs4XSBPZmZlcmVkQ2FtZWw0RnVuY3Rpb25hbGl0aWVzCU9QVElPTkFMCit9CisKK05vdGVNTS1FdmVudFJlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIgCU9QVElPTkFMLAorCS4uLn0KKworRXh0LVNTLUluZm9Gb3ItQ1NFIDo6PSBDSE9JQ0UgeworCWZvcndhcmRpbmdJbmZvRm9yLUNTRQlbMF0gRXh0LUZvcndhcmRpbmdJbmZvRm9yLUNTRSwKKwljYWxsQmFycmluZ0luZm9Gb3ItQ1NFCVsxXSBFeHQtQ2FsbEJhcnJpbmdJbmZvRm9yLUNTRQorCX0KKworRXh0LUZvcndhcmRpbmdJbmZvRm9yLUNTRSA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVswXQlTUy1Db2RlLAorCWZvcndhcmRpbmdGZWF0dXJlTGlzdAlbMV0JRXh0LUZvcndGZWF0dXJlTGlzdCwKKwlub3RpZmljYXRpb25Ub0NTRQlbMl0JTlVMTAkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVszXQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitFeHQtQ2FsbEJhcnJpbmdJbmZvRm9yLUNTRSA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVswXQlTUy1Db2RlLAorCWNhbGxCYXJyaW5nRmVhdHVyZUxpc3QJWzFdCUV4dC1DYWxsQmFyRmVhdHVyZUxpc3QsCisJcGFzc3dvcmQJCVsyXQlQYXNzd29yZAlPUFRJT05BTCwKKwl3cm9uZ1Bhc3N3b3JkQXR0ZW1wdHNDb3VudGVyCVszXQlXcm9uZ1Bhc3N3b3JkQXR0ZW1wdHNDb3VudGVyCU9QVElPTkFMLAorCW5vdGlmaWNhdGlvblRvQ1NFCVs0XQlOVUxMCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzVdCUV4dGVuc2lvbkNvbnRhaW5lciAJT1BUSU9OQUwsCisJLi4ufQorCitFTkQKKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtT00tRGF0YVR5cGVzLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLU9NLURhdGFUeXBlcy5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI0ZGQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLU9NLURhdGFUeXBlcy5hc24KQEAgLTAsMCArMSwyMTYgQEAKKy0tICRJZDogTUFQLU9NLURhdGFUeXBlcy5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKKy0tIDE3LjcuMglPcGVyYXRpb24gYW5kIG1haW50ZW5hbmNlIGRhdGEgdHlwZXMKKy0tIDNHUFAgVFMgMjkuMDAyIFY4LjkuMCAoMjAwOS0wNCkKKyAKK01BUC1PTS1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtT00tRGF0YVR5cGVzICgxMikgdmVyc2lvbjExICgxMSl9CisKK0RFRklOSVRJT05TCisKK0lNUExJQ0lUIFRBR1MKKworOjo9CisKK0JFR0lOCisKK0VYUE9SVFMKKwlBY3RpdmF0ZVRyYWNlTW9kZUFyZywKKwlBY3RpdmF0ZVRyYWNlTW9kZVJlcywKKwlEZWFjdGl2YXRlVHJhY2VNb2RlQXJnLAorCURlYWN0aXZhdGVUcmFjZU1vZGVSZXMsCisJVHJhY2VQcm9wYWdhdGlvbkxpc3QKKzsKKworSU1QT1JUUworCUFkZHJlc3NTdHJpbmcsCisJSU1TSQorRlJPTSBNQVAtQ29tbW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUNvbW1vbkRhdGFUeXBlcyAoMTgpIHZlcnNpb24xMSAoMTEpfQorCisJRXh0ZW5zaW9uQ29udGFpbmVyCitGUk9NIE1BUC1FeHRlbnNpb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjExICgxMSl9CisKKzsKKworQWN0aXZhdGVUcmFjZU1vZGVBcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJWzBdIElNU0kJCU9QVElPTkFMLAorCXRyYWNlUmVmZXJlbmNlCVsxXSBUcmFjZVJlZmVyZW5jZSwKKwl0cmFjZVR5cGUJCVsyXSBUcmFjZVR5cGUsCisJb21jLUlkCQlbM10gQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJdHJhY2VSZWZlcmVuY2UyCVs1XSBUcmFjZVJlZmVyZW5jZTIJT1BUSU9OQUwsCisJdHJhY2VEZXB0aExpc3QJWzZdIFRyYWNlRGVwdGhMaXN0CU9QVElPTkFMLAorCXRyYWNlTkUtVHlwZUxpc3QJWzddIFRyYWNlTkUtVHlwZUxpc3QJT1BUSU9OQUwsCisJdHJhY2VJbnRlcmZhY2VMaXN0CVs4XSBUcmFjZUludGVyZmFjZUxpc3QJT1BUSU9OQUwsCisJdHJhY2VFdmVudExpc3QJWzldIFRyYWNlRXZlbnRMaXN0CU9QVElPTkFMCisJfQorCitUcmFjZVJlZmVyZW5jZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi4yKSkKKworVHJhY2VSZWZlcmVuY2UyIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDMpKQorCitUcmFjZVJlY29yZGluZ1Nlc3Npb25SZWZlcmVuY2UgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMikpCisKK1RyYWNlVHlwZSA6Oj0gSU5URUdFUgorCSgwLi4yNTUpCisJLS0gVHJhY2UgdHlwZXMgYXJlIGZ1bGx5IGRlZmluZWQgaW4gIDNHUFAgVFMgNTIuMDA4LiBbNjFdCisKK1RyYWNlRGVwdGhMaXN0IDo6PSBTRVFVRU5DRSB7CisJbXNjLXMtVHJhY2VEZXB0aAlbMF0gVHJhY2VEZXB0aAlPUFRJT05BTCwKKwltZ3ctVHJhY2VEZXB0aAlbMV0gVHJhY2VEZXB0aAlPUFRJT05BTCwKKwlzZ3NuLVRyYWNlRGVwdGgJWzJdIFRyYWNlRGVwdGgJT1BUSU9OQUwsCisJZ2dzbi1UcmFjZURlcHRoCVszXSBUcmFjZURlcHRoCU9QVElPTkFMLAorCXJuYy1UcmFjZURlcHRoCVs0XSBUcmFjZURlcHRoCU9QVElPTkFMLAorCWJtc2MtVHJhY2VEZXB0aAlbNV0gVHJhY2VEZXB0aAlPUFRJT05BTCwKKwkuLi59CisKK1RyYWNlRGVwdGggOjo9IEVOVU1FUkFURUQgeworCW1pbmltdW0gKDApLAorCW1lZGl1bSAoMSksCisJbWF4aW11bSAoMiksCisJLi4ufQorLS0gVGhlIHZhbHVlIG1lZGl1bSBpcyBhcHBsaWNhYmxlIG9ubHkgZm9yIFJOQy4gRm9yIG90aGVyIG5ldHdvcmsgZWxlbWVudHMsIGlmIHZhbHVlIG1lZGl1bQorLS0gaXMgcmVjZWl2ZWQsIHZhbHVlIG1pbmltdW0gc2hhbGwgYmUgYXBwbGllZC4KKworVHJhY2VORS1UeXBlTGlzdCA6Oj0gQklUIFNUUklORyB7CisJbXNjLXMgKDApLAorCW1ndyAoMSksCisJc2dzbiAoMiksCisJZ2dzbiAoMyksCisJcm5jICg0KSwKKwlibS1zYyAoNSl9IChTSVpFICg2Li4xNikpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworVHJhY2VJbnRlcmZhY2VMaXN0IDo6PSBTRVFVRU5DRSB7CisJbXNjLXMtTGlzdAlbMF0gTVNDLVMtSW50ZXJmYWNlTGlzdAlPUFRJT05BTCwKKwltZ3ctTGlzdAkJWzFdIE1HVy1JbnRlcmZhY2VMaXN0CU9QVElPTkFMLAorCXNnc24tTGlzdAkJWzJdIFNHU04tSW50ZXJmYWNlTGlzdAlPUFRJT05BTCwKKwlnZ3NuLUxpc3QJCVszXSBHR1NOLUludGVyZmFjZUxpc3QJT1BUSU9OQUwsCisJcm5jLUxpc3QJCVs0XSBSTkMtSW50ZXJmYWNlTGlzdAlPUFRJT05BTCwKKwlibXNjLUxpc3QJCVs1XSBCTVNDLUludGVyZmFjZUxpc3QJT1BUSU9OQUwsCisJLi4ufQorCitNU0MtUy1JbnRlcmZhY2VMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwlhICgwKSwKKwlpdSAoMSksCisJbWMgKDIpLAorCW1hcC1nICgzKSwKKwltYXAtYiAoNCksCisJbWFwLWUgKDUpLAorCW1hcC1mICg2KSwKKwljYXAgKDcpLAorCW1hcC1kICg4KSwKKwltYXAtYyAoOSl9IChTSVpFICgxMC4uMTYpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK01HVy1JbnRlcmZhY2VMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwltYyAoMCksCisJbmItdXAgKDEpLAorCWl1LXVwICgyKX0gKFNJWkUgKDMuLjgpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK1NHU04tSW50ZXJmYWNlTGlzdCA6Oj0gQklUIFNUUklORyB7CisJZ2IgKDApLAorCWl1ICgxKSwKKwlnbiAoMiksCisJbWFwLWdyICgzKSwKKwltYXAtZ2QgKDQpLAorCW1hcC1nZiAoNSksCisJZ3MgKDYpLAorCWdlICg3KX0gKFNJWkUgKDguLjE2KSkKKy0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitHR1NOLUludGVyZmFjZUxpc3QgOjo9IEJJVCBTVFJJTkcgeworCWduICgwKSwKKwlnaSAoMSksCisJZ21iICgyKX0gKFNJWkUgKDMuLjgpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK1JOQy1JbnRlcmZhY2VMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwlpdSAoMCksCisJaXVyICgxKSwKKwlpdWIgKDIpLAorCXV1ICgzKX0gKFNJWkUgKDQuLjgpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK0JNU0MtSW50ZXJmYWNlTGlzdCA6Oj0gQklUIFNUUklORyB7CisJZ21iICgwKX0gKFNJWkUgKDEuLjgpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK1RyYWNlRXZlbnRMaXN0IDo6PSBTRVFVRU5DRSB7CisJbXNjLXMtTGlzdAlbMF0gTVNDLVMtRXZlbnRMaXN0CU9QVElPTkFMLAorCW1ndy1MaXN0CQlbMV0gTUdXLUV2ZW50TGlzdAlPUFRJT05BTCwKKwlzZ3NuLUxpc3QJCVsyXSBTR1NOLUV2ZW50TGlzdAlPUFRJT05BTCwKKwlnZ3NuLUxpc3QJCVszXSBHR1NOLUV2ZW50TGlzdAlPUFRJT05BTCwKKwlibXNjLUxpc3QJCVs0XSBCTVNDLUV2ZW50TGlzdAlPUFRJT05BTCwKKwkuLi59CisKK01TQy1TLUV2ZW50TGlzdCA6Oj0gQklUIFNUUklORyB7CisJbW8tbXRDYWxsICgwKSwKKwltby1tdC1zbXMgKDEpLAorCWx1LWltc2lBdHRhY2gtaW1zaURldGFjaCAoMiksCisJaGFuZG92ZXJzICgzKSwKKwlzcyAoNCl9IChTSVpFICg1Li4xNikpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworTUdXLUV2ZW50TGlzdCA6Oj0gQklUIFNUUklORyB7CisJY29udGV4dCAoMCl9IChTSVpFICgxLi44KSkKKy0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitTR1NOLUV2ZW50TGlzdCA6Oj0gQklUIFNUUklORyB7CisJcGRwQ29udGV4dCAoMCksCisJbW8tbXQtc21zICgxKSwKKwlyYXUtZ3Byc0F0dGFjaC1ncHJzRGV0YWNoICgyKSwKKwltYm1zQ29udGV4dCAoMyl9IChTSVpFICg0Li4xNikpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworR0dTTi1FdmVudExpc3QgOjo9IEJJVCBTVFJJTkcgeworCXBkcENvbnRleHQgKDApLAorCW1ibXNDb250ZXh0ICgxKX0gKFNJWkUgKDIuLjgpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK0JNU0MtRXZlbnRMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwltYm1zTXVsdGljYXN0U2VydmljZUFjdGl2YXRpb24gKDApfSAoU0laRSAoMS4uOCkpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworCitUcmFjZVByb3BhZ2F0aW9uTGlzdCA6Oj0gU0VRVUVOQ0UgeworCXRyYWNlUmVmZXJlbmNlCVswXSBUcmFjZVJlZmVyZW5jZQlPUFRJT05BTCwKKwl0cmFjZVR5cGUJCVsxXSBUcmFjZVR5cGUJT1BUSU9OQUwsCisJdHJhY2VSZWZlcmVuY2UyCVsyXSBUcmFjZVJlZmVyZW5jZTIJT1BUSU9OQUwsCisJdHJhY2VSZWNvcmRpbmdTZXNzaW9uUmVmZXJlbmNlCVszXSBUcmFjZVJlY29yZGluZ1Nlc3Npb25SZWZlcmVuY2UgT1BUSU9OQUwsCisJcm5jLVRyYWNlRGVwdGgJWzRdIFRyYWNlRGVwdGgJT1BUSU9OQUwsCisJcm5jLUludGVyZmFjZUxpc3QJWzVdIFJOQy1JbnRlcmZhY2VMaXN0CU9QVElPTkFMLAorCW1zYy1zLVRyYWNlRGVwdGgJWzZdIFRyYWNlRGVwdGgJT1BUSU9OQUwsCisJbXNjLXMtSW50ZXJmYWNlTGlzdAlbN10gTVNDLVMtSW50ZXJmYWNlTGlzdAlPUFRJT05BTCwKKwltc2Mtcy1FdmVudExpc3QJWzhdIE1TQy1TLUV2ZW50TGlzdAlPUFRJT05BTCwKKwltZ3ctVHJhY2VEZXB0aAlbOV0gVHJhY2VEZXB0aAlPUFRJT05BTCwKKwltZ3ctSW50ZXJmYWNlTGlzdAlbMTBdIE1HVy1JbnRlcmZhY2VMaXN0CU9QVElPTkFMLAorCW1ndy1FdmVudExpc3QJWzExXSBNR1ctRXZlbnRMaXN0CU9QVElPTkFMLAorCS4uLn0KKworQWN0aXZhdGVUcmFjZU1vZGVSZXMgOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJWzBdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJdHJhY2VTdXBwb3J0SW5kaWNhdG9yCVsxXQlOVUxMCQlPUFRJT05BTAorCX0KKworRGVhY3RpdmF0ZVRyYWNlTW9kZUFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlbMF0gSU1TSQkJT1BUSU9OQUwsCisJdHJhY2VSZWZlcmVuY2UJWzFdIFRyYWNlUmVmZXJlbmNlLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwl0cmFjZVJlZmVyZW5jZTIJWzNdIFRyYWNlUmVmZXJlbmNlMglPUFRJT05BTAorCX0KKworRGVhY3RpdmF0ZVRyYWNlTW9kZVJlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworRU5ECisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVNNLURhdGFUeXBlcy5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1TTS1EYXRhVHlwZXMuYXNuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZjk0MWYKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1TTS1EYXRhVHlwZXMuYXNuCkBAIC0wLDAgKzEsMjcwIEBACistLSAkSWQ6IE1BUC1TTS1EYXRhVHlwZXMuYXNuIDI4MTQ5IDIwMDktMDQtMjUgMTc6NDU6MzRaIGV0eHJhYiAkCistLSAzR1BQIFRTIDI5LjAwMiAgVjguOS4wICgyMDA5LTA0KSAgCistLSAxNy43LjYJU2hvcnQgbWVzc2FnZSBkYXRhIHR5cGVzCisKK01BUC1TTS1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU00tRGF0YVR5cGVzICgxNikgdmVyc2lvbjExICgxMSl9CisKK0RFRklOSVRJT05TCisKK0lNUExJQ0lUIFRBR1MKKworOjo9CisKK0JFR0lOCisKK0VYUE9SVFMKKwlSb3V0aW5nSW5mb0ZvclNNLUFyZywKKwlSb3V0aW5nSW5mb0ZvclNNLVJlcywKKwlNTy1Gb3J3YXJkU00tQXJnLAorCU1PLUZvcndhcmRTTS1SZXMsCisJTVQtRm9yd2FyZFNNLUFyZywKKwlNVC1Gb3J3YXJkU00tUmVzLAorCVJlcG9ydFNNLURlbGl2ZXJ5U3RhdHVzQXJnLAorCVJlcG9ydFNNLURlbGl2ZXJ5U3RhdHVzUmVzLAorCUFsZXJ0U2VydmljZUNlbnRyZUFyZywKKwlJbmZvcm1TZXJ2aWNlQ2VudHJlQXJnLAorCVJlYWR5Rm9yU00tQXJnLCAKKwlSZWFkeUZvclNNLVJlcywKKwlTTS1EZWxpdmVyeU91dGNvbWUsCisJQWxlcnRSZWFzb24sCisJQWRkaXRpb25hbC1OdW1iZXIsCisJTVQtRm9yd2FyZFNNLVZHQ1MtQXJnLAorCU1ULUZvcndhcmRTTS1WR0NTLVJlcworOworCitJTVBPUlRTCisJQWRkcmVzc1N0cmluZywKKwlJU0ROLUFkZHJlc3NTdHJpbmcsCisJU2lnbmFsSW5mbywKKwlJTVNJLAorCUxNU0ksCisJQVNDSS1DYWxsUmVmZXJlbmNlCisKK0ZST00gTUFQLUNvbW1vbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1Db21tb25EYXRhVHlwZXMgKDE4KSB2ZXJzaW9uMTEgKDExKX0KKworCUFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00KK0ZST00gTUFQLUVSLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FUi1EYXRhVHlwZXMgKDE3KSB2ZXJzaW9uMTEgKDExKX0KKworCUV4dGVuc2lvbkNvbnRhaW5lcgorRlJPTSBNQVAtRXh0ZW5zaW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUV4dGVuc2lvbkRhdGFUeXBlcyAoMjEpIHZlcnNpb24xMSAoMTEpfQorOworCisKK1JvdXRpbmdJbmZvRm9yU00tQXJnIDo6PSBTRVFVRU5DRSB7CisJbXNpc2RuCQlbMF0gSVNETi1BZGRyZXNzU3RyaW5nLAorCXNtLVJQLVBSSQkJWzFdIEJPT0xFQU4sCisJc2VydmljZUNlbnRyZUFkZHJlc3MJWzJdIEFkZHJlc3NTdHJpbmcsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs2XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlncHJzU3VwcG9ydEluZGljYXRvcglbN10JTlVMTAkJT1BUSU9OQUwsCisJLS0gZ3Byc1N1cHBvcnRJbmRpY2F0b3IgaXMgc2V0IG9ubHkgaWYgdGhlIFNNUy1HTVNDIHN1cHBvcnRzCisJLS0gcmVjZWl2aW5nIG9mIHR3byBudW1iZXJzIGZyb20gdGhlIEhMUgorCXNtLVJQLU1USQkJWzhdIFNNLVJQLU1USQlPUFRJT05BTCwKKwlzbS1SUC1TTUVBCVs5XSBTTS1SUC1TTUVBCU9QVElPTkFMLAorCXNtLWRlbGl2ZXJ5Tm90SW50ZW5kZWQJWzEwXSBTTS1EZWxpdmVyeU5vdEludGVuZGVkCU9QVElPTkFMIH0KKworU00tRGVsaXZlcnlOb3RJbnRlbmRlZCA6Oj0gRU5VTUVSQVRFRCB7CisJb25seUlNU0ktcmVxdWVzdGVkICAoMCksCisJb25seU1DQy1NTkMtcmVxdWVzdGVkICAoMSksCisJLi4ufQorCitTTS1SUC1NVEkgOjo9IElOVEVHRVIgKDAuLjEwKQorCS0tIDAgU01TIERlbGl2ZXIgCisJLS0gMSBTTVMgU3RhdHVzIFJlcG9ydAorCS0tIG90aGVyIHZhbHVlcyBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIHNoYWxsIGJlIGRpc2NhcmRlZCBpZgorCS0tIHJlY2VpdmVkCisKK1NNLVJQLVNNRUEgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uMTIpKQorCS0tIHRoaXMgcGFyYW1ldGVyIGNvbnRhaW5zIGFuIGFkZHJlc3MgZmllbGQgd2hpY2ggaXMgZW5jb2RlZCAKKwktLSBhcyBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDQwLiBBbiBhZGRyZXNzIGZpZWxkIGNvbnRhaW5zIDMgZWxlbWVudHMgOgorCS0tIAkJYWRkcmVzcy1sZW5ndGgKKwktLSAJCXR5cGUtb2YtYWRkcmVzcworCS0tIAkJYWRkcmVzcy12YWx1ZQorCitSb3V0aW5nSW5mb0ZvclNNLVJlcyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlJTVNJLAorCWxvY2F0aW9uSW5mb1dpdGhMTVNJCVswXSBMb2NhdGlvbkluZm9XaXRoTE1TSSwKKwlleHRlbnNpb25Db250YWluZXIJWzRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0xvY2F0aW9uSW5mb1dpdGhMTVNJIDo6PSBTRVFVRU5DRSB7CisJbmV0d29ya05vZGUtTnVtYmVyCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJbG1zaQkJCUxNU0kJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlncHJzTm9kZUluZGljYXRvcglbNV0JTlVMTAkJT1BUSU9OQUwsCisJLS0gZ3Byc05vZGVJbmRpY2F0b3IgaXMgc2V0IG9ubHkgaWYgdGhlIFNHU04gbnVtYmVyIGlzIHNlbnQgYXMgdGhlIAorCS0tIE5ldHdvcmsgTm9kZSBOdW1iZXIKKwlhZGRpdGlvbmFsLU51bWJlcglbNl0gQWRkaXRpb25hbC1OdW1iZXIJT1BUSU9OQUwgCisJLS0gTmV0d29ya05vZGUtbnVtYmVyIGNhbiBiZSBlaXRoZXIgbXNjLW51bWJlciBvciBzZ3NuLW51bWJlciBvciBJUC1TTS1HVworCS0tIG51bWJlciBvciBTTVMgUm91dGVyIG51bWJlcgorCX0KKworQWRkaXRpb25hbC1OdW1iZXIgOjo9IENIT0lDRSB7CisJbXNjLU51bWJlcglbMF0gSVNETi1BZGRyZXNzU3RyaW5nLAorCXNnc24tTnVtYmVyCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmd9CisJLS0gYWRkaXRpb25hbC1udW1iZXIgY2FuIGJlIGVpdGhlciBtc2MtbnVtYmVyIG9yIHNnc24tbnVtYmVyCisJLS0gaWYgcmVjZWl2ZWQgbmV0d29ya05vZGUtbnVtYmVyIGlzIG1zYy1udW1iZXIgdGhlbiB0aGUgCQorCS0tIGFkZGl0aW9uYWwgbnVtYmVyIGlzIHNnc24tbnVtYmVyIAorCS0tIGlmIHJlY2VpdmVkIG5ldHdvcmtOb2RlLW51bWJlciBpcyBzZ3NuLW51bWJlciB0aGVuIHRoZSAKKwktLSBhZGRpdGlvbmFsIG51bWJlciBpcyBtc2MtbnVtYmVyIAorCitNTy1Gb3J3YXJkU00tQXJnIDo6PSBTRVFVRU5DRSB7CisJc20tUlAtREEJCVNNLVJQLURBLAorCXNtLVJQLU9BCQlTTS1SUC1PQSwKKwlzbS1SUC1VSQkJU2lnbmFsSW5mbywKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJaW1zaQkJCUlNU0kgCQlPUFRJT05BTCB9CisKK01PLUZvcndhcmRTTS1SZXMgOjo9IFNFUVVFTkNFIHsKKwlzbS1SUC1VSQkJU2lnbmFsSW5mbyAJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK01ULUZvcndhcmRTTS1BcmcgOjo9IFNFUVVFTkNFIHsKKwlzbS1SUC1EQQkJU00tUlAtREEsCisJc20tUlAtT0EJCVNNLVJQLU9BLAorCXNtLVJQLVVJCQlTaWduYWxJbmZvLAorCW1vcmVNZXNzYWdlc1RvU2VuZAlOVUxMCQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK01ULUZvcndhcmRTTS1SZXMgOjo9IFNFUVVFTkNFIHsKKwlzbS1SUC1VSQkJU2lnbmFsSW5mbwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworU00tUlAtREEgOjo9IENIT0lDRSB7CisJaW1zaQkJCVswXSBJTVNJLAorCWxtc2kJCQlbMV0gTE1TSSwKKwlzZXJ2aWNlQ2VudHJlQWRkcmVzc0RBCVs0XSBBZGRyZXNzU3RyaW5nLAorCW5vU00tUlAtREEJWzVdIE5VTEx9CisKK1NNLVJQLU9BIDo6PSBDSE9JQ0UgeworCW1zaXNkbgkJWzJdIElTRE4tQWRkcmVzc1N0cmluZywKKwlzZXJ2aWNlQ2VudHJlQWRkcmVzc09BCVs0XSBBZGRyZXNzU3RyaW5nLAorCW5vU00tUlAtT0EJWzVdIE5VTEx9CisKK1JlcG9ydFNNLURlbGl2ZXJ5U3RhdHVzQXJnIDo6PSBTRVFVRU5DRSB7CisJbXNpc2RuCQlJU0ROLUFkZHJlc3NTdHJpbmcsCisJc2VydmljZUNlbnRyZUFkZHJlc3MJQWRkcmVzc1N0cmluZywKKwlzbS1EZWxpdmVyeU91dGNvbWUJU00tRGVsaXZlcnlPdXRjb21lLAorCWFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JWzBdIEFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00KKwkJCQkJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJZ3Byc1N1cHBvcnRJbmRpY2F0b3IJWzJdCU5VTEwJCU9QVElPTkFMLAorCS0tIGdwcnNTdXBwb3J0SW5kaWNhdG9yIGlzIHNldCBvbmx5IGlmIHRoZSBTTVMtR01TQyBzdXBwb3J0cyAKKwktLSBoYW5kbGluZyBvZiB0d28gZGVsaXZlcnkgb3V0Y29tZXMKKwlkZWxpdmVyeU91dGNvbWVJbmRpY2F0b3IJWzNdIAlOVUxMCQlPUFRJT05BTCwKKwktLSBEZWxpdmVyeU91dGNvbWVJbmRpY2F0b3IgaXMgc2V0IHdoZW4gdGhlIFNNLURlbGl2ZXJ5T3V0Y29tZQorCS0tIGlzIGZvciBHUFJTCisJYWRkaXRpb25hbFNNLURlbGl2ZXJ5T3V0Y29tZQlbNF0gCVNNLURlbGl2ZXJ5T3V0Y29tZSAJT1BUSU9OQUwsCisJLS0gSWYgcmVjZWl2ZWQsIGFkZGl0aW9uYWxTTS1EZWxpdmVyeU91dGNvbWUgaXMgZm9yIEdQUlMKKwktLSBJZiBEZWxpdmVyeU91dGNvbWVJbmRpY2F0b3IgaXMgc2V0LCB0aGVuIEFkZGl0aW9uYWxTTS1EZWxpdmVyeU91dGNvbWUgc2hhbGwgYmUgYWJzZW50CisJYWRkaXRpb25hbEFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JWzVdIAlBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIE9QVElPTkFMLAorCS0tIElmIHJlY2VpdmVkIGFkZGl0aW9uYWxBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIGlzIGZvciBHUFJTCisJLS0gSWYgRGVsaXZlcnlPdXRjb21lSW5kaWNhdG9yIGlzIHNldCwgdGhlbiBBZGRpdGlvbmFsQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSAKKwktLSBzaGFsbCBiZSBhYnNlbnQKKwlpcC1zbS1ndy1JbmRpY2F0b3IJWzZdIAlOVUxMCQlPUFRJT05BTCwKKwktLSB0aGUgaXAtc20tZ3cgaW5kaWNhdG9yIGluZGljYXRlcyBieSBpdHMgcHJlc2VuY2UgdGhhdCBzbS1kZWxpdmVyeU91dGNvbWUKKwktLSBpcyBmb3IgZGVsaXZlcnkgdmlhIElNUworCS0tIElmIHByZXNlbnQsIGRlbGl2ZXJ5T3V0Y29tZUluZGljYXRvciBzaGFsbCBiZSBhYnNlbnQuCisJaXAtc20tZ3ctc20tZGVsaXZlcnlPdXRjb21lCVs3XSAJU00tRGVsaXZlcnlPdXRjb21lCU9QVElPTkFMLCAKKwktLSBJZiByZWNlaXZlZCBpcC1zbS1ndy1zbS1kZWxpdmVyeU91dGNvbWUgaXMgZm9yIGRlbGl2ZXJ5IHZpYSBJTVMKKwktLSBJZiBpcC1zbS1ndy1JbmRpY2F0b3IgaXMgc2V0LCB0aGVuIGlwLXNtLWd3LXNtLWRlbGl2ZXJ5T3V0Y29tZSBzaGFsbCBiZSBhYnNlbnQKKwlpcC1zbS1ndy1hYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCVs4XQlBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCU9QVElPTkFMCisJLS0gSWYgcmVjZWl2ZWQgaXAtc20tZ3ctc20tYWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSBpcyBmb3IgZGVsaXZlcnkgdmlhIElNUworCS0tIElmIGlwLXNtLWd3LUluZGljYXRvciBpcyBzZXQsIHRoZW4gaXAtc20tZ3ctc20tYWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSAKKwktLSBzaGFsbCBiZSBhYnNlbnQKK30KKworU00tRGVsaXZlcnlPdXRjb21lIDo6PSBFTlVNRVJBVEVEIHsKKwltZW1vcnlDYXBhY2l0eUV4Y2VlZGVkICAoMCksCisJYWJzZW50U3Vic2NyaWJlciAgKDEpLAorCXN1Y2Nlc3NmdWxUcmFuc2ZlciAgKDIpfQorCitSZXBvcnRTTS1EZWxpdmVyeVN0YXR1c1JlcyA6Oj0gU0VRVUVOQ0UgeworCXN0b3JlZE1TSVNETglJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0FsZXJ0U2VydmljZUNlbnRyZUFyZyA6Oj0gU0VRVUVOQ0UgeworCW1zaXNkbgkJSVNETi1BZGRyZXNzU3RyaW5nLAorCXNlcnZpY2VDZW50cmVBZGRyZXNzCUFkZHJlc3NTdHJpbmcsCisJLi4ufQorCitJbmZvcm1TZXJ2aWNlQ2VudHJlQXJnIDo6PSBTRVFVRU5DRSB7CisJc3RvcmVkTVNJU0ROCUlTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwltdy1TdGF0dXMJTVctU3RhdHVzCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlhYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCUFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JT1BUSU9OQUwsCisJYWRkaXRpb25hbEFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JWzBdCUFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JT1BUSU9OQUwgfQorCS0tIGFkZGl0aW9uYWxBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIG1heSBiZSBwcmVzZW50IG9ubHkgaWYgCisJLS0gYWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSBpcyBwcmVzZW50LgorCS0tIGlmIGluY2x1ZGVkLCBhZGRpdGlvbmFsQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSBpcyBmb3IgR1BSUyBhbmQKKwktLSBhYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIGlzIGZvciBub24tR1BSUworCitNVy1TdGF0dXMgOjo9IEJJVCBTVFJJTkcgeworCXNjLUFkZHJlc3NOb3RJbmNsdWRlZCAgKDApLAorCW1ucmYtU2V0ICAoMSksCisJbWNlZi1TZXQgICgyKSAsCisJbW5yZy1TZXQJICAoMyl9IChTSVpFICg2Li4xNikpCisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorCS0tIGJpdHMgNCB0byAxNSBzaGFsbCBiZSBpZ25vcmVkIGlmIHJlY2VpdmVkIGFuZCBub3QgdW5kZXJzdG9vZAorCitSZWFkeUZvclNNLUFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlbMF0gSU1TSSwKKwlhbGVydFJlYXNvbglBbGVydFJlYXNvbiwKKwlhbGVydFJlYXNvbkluZGljYXRvcglOVUxMCQkJT1BUSU9OQUwsCisJLS0gYWxlcnRSZWFzb25JbmRpY2F0b3IgaXMgc2V0IG9ubHkgd2hlbiB0aGUgYWxlcnRSZWFzb24gCisJLS0gc2VudCB0byBITFIgaXMgZm9yIEdQUlMKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlhZGRpdGlvbmFsQWxlcnRSZWFzb25JbmRpY2F0b3IJWzFdIE5VTEwJCU9QVElPTkFMCisJLS0gYWRkaXRpb25hbEFsZXJ0UmVhc29uSW5kaWNhdG9yIGlzIHNldCBvbmx5IHdoZW4gdGhlIGFsZXJ0UmVhc29uCisJLS0gc2VudCB0byBITFIgaXMgZm9yIElQLVNNLUdXCisJfQorCitSZWFkeUZvclNNLVJlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitBbGVydFJlYXNvbiA6Oj0gRU5VTUVSQVRFRCB7CisJbXMtUHJlc2VudCAgKDApLAorCW1lbW9yeUF2YWlsYWJsZSAgKDEpfQorCitNVC1Gb3J3YXJkU00tVkdDUy1BcmcgOjo9IFNFUVVFTkNFIHsKKwlhc2NpQ2FsbFJlZmVyZW5jZQlBU0NJLUNhbGxSZWZlcmVuY2UsCisJc20tUlAtT0EJCVNNLVJQLU9BLAorCXNtLVJQLVVJCQlTaWduYWxJbmZvLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitNVC1Gb3J3YXJkU00tVkdDUy1SZXMgOjo9IFNFUVVFTkNFIHsKKwlzbS1SUC1VSQkJWzBdIFNpZ25hbEluZm8JT1BUSU9OQUwsCisJZGlzcGF0Y2hlckxpc3QJWzFdIERpc3BhdGNoZXJMaXN0CU9QVElPTkFMLAorCW9uZ29pbmdDYWxsCU5VTEwJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0Rpc3BhdGNoZXJMaXN0IDo6PSAKKwlTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkRpc3BhdGNoZXJzKSBPRgorCQkJCUlTRE4tQWRkcmVzc1N0cmluZworCittYXhOdW1PZkRpc3BhdGNoZXJzICBJTlRFR0VSIDo6PSA1CisKKworCitFTkQKKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtU1MtQ29kZS5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1TUy1Db2RlLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjNmMmRjCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtU1MtQ29kZS5hc24KQEAgLTAsMCArMSwxOTAgQEAKKy0tICRJZDogTUFQLVNTLUNvZGUuYXNuIDI4MTQ5IDIwMDktMDQtMjUgMTc6NDU6MzRaIGV0eHJhYiAkCistLSAzR1BQIFRTIDI5LjAwMiBWOC45LjAgKDIwMDktMDQpCistLSAxNy43LjUJU3VwcGxlbWVudGFyeSBzZXJ2aWNlIGNvZGVzCisKK01BUC1TUy1Db2RlIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVNTLUNvZGUgKDE1KSB2ZXJzaW9uMTEgKDExKX0KKworREVGSU5JVElPTlMKKworOjo9CisKK0JFR0lOCisKK1NTLUNvZGUgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gVGhpcyB0eXBlIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBjb2RlIGlkZW50aWZ5aW5nIGEgc2luZ2xlCisJLS0gc3VwcGxlbWVudGFyeSBzZXJ2aWNlLCBhIGdyb3VwIG9mIHN1cHBsZW1lbnRhcnkgc2VydmljZXMsIG9yCisJLS0gYWxsIHN1cHBsZW1lbnRhcnkgc2VydmljZXMuIFRoZSBzZXJ2aWNlcyBhbmQgYWJicmV2aWF0aW9ucworCS0tIHVzZWQgYXJlIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMi4wMDQgWzVdLiBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzCisJLS0gZGVmaW5lZCBhcyBmb2xsb3dzOgorCS0tCisJLS0gYml0cyA4NzY1NDMyMTogZ3JvdXAgKGJpdHMgODc2NSksIGFuZCBzcGVjaWZpYyBzZXJ2aWNlCisJLS0gKGJpdHMgNDMyMSkKKworYWxsU1MJCQlTUy1Db2RlIDo6PSAnMDAwMDAwMDAnQgorCS0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlCisJLS0gYWxsIFNTCisKK2FsbExpbmVJZGVudGlmaWNhdGlvblNTCVNTLUNvZGUgOjo9ICcwMDAxMDAwMCdCCisJLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UKKwktLSBhbGwgbGluZSBpZGVudGlmaWNhdGlvbiBTUworY2xpcAkJCQlTUy1Db2RlIDo6PSAnMDAwMTAwMDEnQgorCS0tIGNhbGxpbmcgbGluZSBpZGVudGlmaWNhdGlvbiBwcmVzZW50YXRpb24KK2NsaXIJCQkJU1MtQ29kZSA6Oj0gJzAwMDEwMDEwJ0IKKwktLSBjYWxsaW5nIGxpbmUgaWRlbnRpZmljYXRpb24gcmVzdHJpY3Rpb24KK2NvbHAJCQkJU1MtQ29kZSA6Oj0gJzAwMDEwMDExJ0IKKwktLSBjb25uZWN0ZWQgbGluZSBpZGVudGlmaWNhdGlvbiBwcmVzZW50YXRpb24KK2NvbHIJCQkJU1MtQ29kZSA6Oj0gJzAwMDEwMTAwJ0IKKwktLSBjb25uZWN0ZWQgbGluZSBpZGVudGlmaWNhdGlvbiByZXN0cmljdGlvbgorbWNpCQkJCVNTLUNvZGUgOjo9ICcwMDAxMDEwMSdCCisJLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UKKwktLSBtYWxpY2lvdXMgY2FsbCBpZGVudGlmaWNhdGlvbgorCithbGxOYW1lSWRlbnRpZmljYXRpb25TUwlTUy1Db2RlIDo6PSAnMDAwMTEwMDAnQgorCS0tIGFsbCBuYW1lIGlkZW50aWZpY2F0aW9uIFNTCitjbmFwCQkJCVNTLUNvZGUgOjo9ICcwMDAxMTAwMSdCCisJLS0gY2FsbGluZyBuYW1lIHByZXNlbnRhdGlvbgorCisJLS0gU1MtQ29kZXMgJzAwMDExMDEwJ0IgdG8gJzAwMDExMTExJ0IgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgCisJLS0gTmFtZUlkZW50aWZpY2F0aW9uIFN1cHBsZW1lbnRhcnkgU2VydmljZSB1c2UuCisKK2FsbEZvcndhcmRpbmdTUwlTUy1Db2RlIDo6PSAnMDAxMDAwMDAnQgorCS0tIGFsbCBmb3J3YXJkaW5nIFNTCitjZnUJCQkJU1MtQ29kZSA6Oj0gJzAwMTAwMDAxJ0IKKwktLSBjYWxsIGZvcndhcmRpbmcgdW5jb25kaXRpb25hbAorYWxsQ29uZEZvcndhcmRpbmdTUwlTUy1Db2RlIDo6PSAnMDAxMDEwMDAnQgorCS0tIGFsbCBjb25kaXRpb25hbCBmb3J3YXJkaW5nIFNTCitjZmIJCQkJU1MtQ29kZSA6Oj0gJzAwMTAxMDAxJ0IKKwktLSBjYWxsIGZvcndhcmRpbmcgb24gbW9iaWxlIHN1YnNjcmliZXIgYnVzeQorY2ZucnkJCQlTUy1Db2RlIDo6PSAnMDAxMDEwMTAnQgorCS0tIGNhbGwgZm9yd2FyZGluZyBvbiBubyByZXBseQorY2ZucmMJCQlTUy1Db2RlIDo6PSAnMDAxMDEwMTEnQgorCS0tIGNhbGwgZm9yd2FyZGluZyBvbiBtb2JpbGUgc3Vic2NyaWJlciBub3QgcmVhY2hhYmxlIAorY2QJCQkJU1MtQ29kZSA6Oj0gJzAwMTAwMTAwJ0IKKwktLSBjYWxsIGRlZmxlY3Rpb24KKworYWxsQ2FsbE9mZmVyaW5nU1MJU1MtQ29kZSA6Oj0gJzAwMTEwMDAwJ0IKKwktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQorCS0tIGFsbCBjYWxsIG9mZmVyaW5nIFNTIGluY2x1ZGVzIGFsc28gYWxsIGZvcndhcmRpbmcgU1MKK2VjdAkJCQlTUy1Db2RlIDo6PSAnMDAxMTAwMDEnQgorCQktLSBleHBsaWNpdCBjYWxsIHRyYW5zZmVyCittYWgJCQkJU1MtQ29kZSA6Oj0gJzAwMTEwMDEwJ0IKKwktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQorCS0tIG1vYmlsZSBhY2Nlc3MgaHVudGluZworCithbGxDYWxsQ29tcGxldGlvblNTCVNTLUNvZGUgOjo9ICcwMTAwMDAwMCdCCisJLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UKKwktLSBhbGwgQ2FsbCBjb21wbGV0aW9uIFNTCitjdwkJCQlTUy1Db2RlIDo6PSAnMDEwMDAwMDEnQgorCS0tIGNhbGwgd2FpdGluZworaG9sZAkJCQlTUy1Db2RlIDo6PSAnMDEwMDAwMTAnQgorCS0tIGNhbGwgaG9sZAorY2Nicy1BCQkJU1MtQ29kZSA6Oj0gJzAxMDAwMDExJ0IKKwktLSBjb21wbGV0aW9uIG9mIGNhbGwgdG8gYnVzeSBzdWJzY3JpYmVycywgb3JpZ2luYXRpbmcgc2lkZQorCS0tIHRoaXMgU1MtQ29kZSBpcyB1c2VkIG9ubHkgaW4gSW5zZXJ0U3Vic2NyaWJlckRhdGEsIERlbGV0ZVN1YnNjcmliZXJEYXRhIAorCS0tIGFuZCBJbnRlcnJvZ2F0ZVNTCitjY2JzLUIJCQlTUy1Db2RlIDo6PSAnMDEwMDAxMDAnQgorCS0tIGNvbXBsZXRpb24gb2YgY2FsbCB0byBidXN5IHN1YnNjcmliZXJzLCBkZXN0aW5hdGlvbiBzaWRlCisJLS0gdGhpcyBTUy1Db2RlIGlzIHVzZWQgb25seSBpbiBJbnNlcnRTdWJzY3JpYmVyRGF0YSBhbmQgRGVsZXRlU3Vic2NyaWJlckRhdGEKK21jCQkJCVNTLUNvZGUgOjo9ICcwMTAwMDEwMSdCCisJLS0gbXVsdGljYWxsCisKK2FsbE11bHRpUGFydHlTUwlTUy1Db2RlIDo6PSAnMDEwMTAwMDAnQgorCS0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlCisJLS0gYWxsIG11bHRpcGFydHkgU1MKK211bHRpUFRZCQkJU1MtQ29kZSA6Oj0gJzAxMDEwMDAxJ0IKKwktLSBtdWx0aXBhcnR5CisKK2FsbENvbW11bml0eU9mSW50ZXJlc3QtU1MJU1MtQ29kZSA6Oj0gJzAxMTAwMDAwJ0IKKwktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQorCS0tIGFsbCBjb21tdW5pdHkgb2YgaW50ZXJlc3QgU1MKK2N1ZwkJCQlTUy1Db2RlIDo6PSAnMDExMDAwMDEnQgorCS0tIGNsb3NlZCB1c2VyIGdyb3VwCisKK2FsbENoYXJnaW5nU1MJCVNTLUNvZGUgOjo9ICcwMTExMDAwMCdCCisJLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UKKwktLSBhbGwgY2hhcmdpbmcgU1MKK2FvY2kJCQkJU1MtQ29kZSA6Oj0gJzAxMTEwMDAxJ0IKKwktLSBhZHZpY2Ugb2YgY2hhcmdlIGluZm9ybWF0aW9uCithb2NjCQkJCVNTLUNvZGUgOjo9ICcwMTExMDAxMCdCCisJLS0gYWR2aWNlIG9mIGNoYXJnZSBjaGFyZ2luZworCithbGxBZGRpdGlvbmFsSW5mb1RyYW5zZmVyU1MJU1MtQ29kZSA6Oj0gJzEwMDAwMDAwJ0IKKwktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQorCS0tIGFsbCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRyYW5zZmVyIFNTCit1dXMxCQkJCVNTLUNvZGUgOjo9ICcxMDAwMDAwMSdCCisJLS0gVVVTMSB1c2VyLXRvLXVzZXIgc2lnbmFsbGluZyAKK3V1czIJCQkJU1MtQ29kZSA6Oj0gJzEwMDAwMDEwJ0IKKwktLSBVVVMyIHVzZXItdG8tdXNlciBzaWduYWxsaW5nCit1dXMzCQkJCVNTLUNvZGUgOjo9ICcxMDAwMDAxMSdCCisJLS0gVVVTMyB1c2VyLXRvLXVzZXIgc2lnbmFsbGluZworCithbGxCYXJyaW5nU1MJCVNTLUNvZGUgOjo9ICcxMDAxMDAwMCdCCisJLS0gYWxsIGJhcnJpbmcgU1MKK2JhcnJpbmdPZk91dGdvaW5nQ2FsbHMJU1MtQ29kZSA6Oj0gJzEwMDEwMDAxJ0IKKwktLSBiYXJyaW5nIG9mIG91dGdvaW5nIGNhbGxzCitiYW9jCQkJCVNTLUNvZGUgOjo9ICcxMDAxMDAxMCdCCisJLS0gYmFycmluZyBvZiBhbGwgb3V0Z29pbmcgY2FsbHMKK2JvaWMJCQkJU1MtQ29kZSA6Oj0gJzEwMDEwMDExJ0IKKwktLSBiYXJyaW5nIG9mIG91dGdvaW5nIGludGVybmF0aW9uYWwgY2FsbHMKK2JvaWNFeEhDCQkJU1MtQ29kZSA6Oj0gJzEwMDEwMTAwJ0IKKwktLSBiYXJyaW5nIG9mIG91dGdvaW5nIGludGVybmF0aW9uYWwgY2FsbHMgZXhjZXB0IHRob3NlIGRpcmVjdGVkCisJLS0gdG8gdGhlIGhvbWUgUExNTiBDb3VudHJ5CitiYXJyaW5nT2ZJbmNvbWluZ0NhbGxzCVNTLUNvZGUgOjo9ICcxMDAxMTAwMSdCCisJLS0gYmFycmluZyBvZiBpbmNvbWluZyBjYWxscworYmFpYwkJCQlTUy1Db2RlIDo6PSAnMTAwMTEwMTAnQgorCS0tIGJhcnJpbmcgb2YgYWxsIGluY29taW5nIGNhbGxzCitiaWNSb2FtCQkJU1MtQ29kZSA6Oj0gJzEwMDExMDExJ0IKKwktLSBiYXJyaW5nIG9mIGluY29taW5nIGNhbGxzIHdoZW4gcm9hbWluZyBvdXRzaWRlIGhvbWUgUExNTgorCS0tIENvdW50cnkKKworYWxsUExNTi1zcGVjaWZpY1NTCVNTLUNvZGUgOjo9ICcxMTExMDAwMCdCCitwbG1uLXNwZWNpZmljU1MtMQlTUy1Db2RlIDo6PSAnMTExMTAwMDEnQgorcGxtbi1zcGVjaWZpY1NTLTIJU1MtQ29kZSA6Oj0gJzExMTEwMDEwJ0IKK3BsbW4tc3BlY2lmaWNTUy0zCVNTLUNvZGUgOjo9ICcxMTExMDAxMSdCCitwbG1uLXNwZWNpZmljU1MtNAlTUy1Db2RlIDo6PSAnMTExMTAxMDAnQgorcGxtbi1zcGVjaWZpY1NTLTUJU1MtQ29kZSA6Oj0gJzExMTEwMTAxJ0IKK3BsbW4tc3BlY2lmaWNTUy02CVNTLUNvZGUgOjo9ICcxMTExMDExMCdCCitwbG1uLXNwZWNpZmljU1MtNwlTUy1Db2RlIDo6PSAnMTExMTAxMTEnQgorcGxtbi1zcGVjaWZpY1NTLTgJU1MtQ29kZSA6Oj0gJzExMTExMDAwJ0IKK3BsbW4tc3BlY2lmaWNTUy05CVNTLUNvZGUgOjo9ICcxMTExMTAwMSdCCitwbG1uLXNwZWNpZmljU1MtQQlTUy1Db2RlIDo6PSAnMTExMTEwMTAnQgorcGxtbi1zcGVjaWZpY1NTLUIJU1MtQ29kZSA6Oj0gJzExMTExMDExJ0IKK3BsbW4tc3BlY2lmaWNTUy1DCVNTLUNvZGUgOjo9ICcxMTExMTEwMCdCCitwbG1uLXNwZWNpZmljU1MtRAlTUy1Db2RlIDo6PSAnMTExMTExMDEnQgorcGxtbi1zcGVjaWZpY1NTLUUJU1MtQ29kZSA6Oj0gJzExMTExMTEwJ0IKK3BsbW4tc3BlY2lmaWNTUy1GCVNTLUNvZGUgOjo9ICcxMTExMTExMSdCCisKK2FsbENhbGxQcmlvcml0eVNTCVNTLUNvZGUgOjo9ICcxMDEwMDAwMCdCCisJLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UKKwktLSBhbGwgY2FsbCBwcmlvcml0eSBTUworZW1scHAJCQlTUy1Db2RlIDo6PSAnMTAxMDAwMDEnQgorCS0tIGVuaGFuY2VkIE11bHRpbGV2ZWwgUHJlY2VkZW5jZSBQcmUtZW1wdGlvbiAoRU1MUFApIHNlcnZpY2UKKworYWxsTENTUHJpdmFjeUV4Y2VwdGlvbglTUy1Db2RlIDo6PSAnMTAxMTAwMDAnQgorCS0tIGFsbCBMQ1MgUHJpdmFjeSBFeGNlcHRpb24gQ2xhc3NlcwordW5pdmVyc2FsCQkJU1MtQ29kZSA6Oj0gJzEwMTEwMDAxJ0IKKwktLSBhbGxvdyBsb2NhdGlvbiBieSBhbnkgTENTIGNsaWVudAorY2FsbFNlc3Npb25SZWxhdGVkCVNTLUNvZGUgOjo9ICcxMDExMDAxMCdCCisJLS0gYWxsb3cgbG9jYXRpb24gYnkgYW55IHZhbHVlIGFkZGVkIExDUyBjbGllbnQgdG8gd2hpY2ggYSBjYWxsL3Nlc3Npb24gCisJLS0gaXMgZXN0YWJsaXNoZWQgZnJvbSB0aGUgdGFyZ2V0IE1TCitjYWxsU2Vzc2lvblVucmVsYXRlZAlTUy1Db2RlIDo6PSAnMTAxMTAwMTEnQgorCS0tIGFsbG93IGxvY2F0aW9uIGJ5IGRlc2lnbmF0ZWQgZXh0ZXJuYWwgdmFsdWUgYWRkZWQgTENTIGNsaWVudHMKK3BsbW5vcGVyYXRvcgkJU1MtQ29kZSA6Oj0gJzEwMTEwMTAwJ0IKKwktLSBhbGxvdyBsb2NhdGlvbiBieSBkZXNpZ25hdGVkIFBMTU4gb3BlcmF0b3IgTENTIGNsaWVudHMgCitzZXJ2aWNlVHlwZQkJU1MtQ29kZSA6Oj0gJzEwMTEwMTAxJ0IKKwktLSBhbGxvdyBsb2NhdGlvbiBieSBMQ1MgY2xpZW50cyBvZiBhIGRlc2lnbmF0ZWQgTENTIHNlcnZpY2UgdHlwZQorCithbGxNT0xSLVNTCQlTUy1Db2RlIDo6PSAnMTEwMDAwMDAnQgorCS0tIGFsbCBNb2JpbGUgT3JpZ2luYXRpbmcgTG9jYXRpb24gUmVxdWVzdCBDbGFzc2VzCitiYXNpY1NlbGZMb2NhdGlvbglTUy1Db2RlIDo6PSAnMTEwMDAwMDEnQgorCS0tIGFsbG93IGFuIE1TIHRvIHJlcXVlc3QgaXRzIG93biBsb2NhdGlvbgorYXV0b25vbW91c1NlbGZMb2NhdGlvbglTUy1Db2RlIDo6PSAnMTEwMDAwMTAnQgorCS0tIGFsbG93IGFuIE1TIHRvIHBlcmZvcm0gc2VsZiBsb2NhdGlvbiB3aXRob3V0IGludGVyYWN0aW9uCisJLS0gd2l0aCB0aGUgUExNTiBmb3IgYSBwcmVkZXRlcm1pbmVkIHBlcmlvZCBvZiB0aW1lCit0cmFuc2ZlclRvVGhpcmRQYXJ0eQlTUy1Db2RlIDo6PSAnMTEwMDAwMTEnQgorCS0tIGFsbG93IGFuIE1TIHRvIHJlcXVlc3QgdHJhbnNmZXIgb2YgaXRzIGxvY2F0aW9uIHRvIGFub3RoZXIgTENTIGNsaWVudAorCitFTkQKKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtU1MtRGF0YVR5cGVzLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVNTLURhdGFUeXBlcy5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUzZjdmMAotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVNTLURhdGFUeXBlcy5hc24KQEAgLTAsMCArMSwzNDIgQEAKKy0tICRJZDogTUFQLVNTLURhdGFUeXBlcy5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKKy0tIDNHUFAgVFMgMjkuMDAyIFY4LjkuMCAoMjAwOS0wNCkgIAorLS0gMTcuNy40CVN1cHBsZW1lbnRhcnkgc2VydmljZSBkYXRhIHR5cGVzCisgCitNQVAtU1MtRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVNTLURhdGFUeXBlcyAoMTQpIHZlcnNpb24xMSAoMTEpfQorCitERUZJTklUSU9OUworCitJTVBMSUNJVCBUQUdTCisKKzo6PQorCitCRUdJTgorCitFWFBPUlRTCisJUmVnaXN0ZXJTUy1BcmcsCisJU1MtSW5mbywKKwlTUy1TdGF0dXMsCisJU1MtU3Vic2NyaXB0aW9uT3B0aW9uLAorCVNTLUZvckJTLUNvZGUsCisJSW50ZXJyb2dhdGVTUy1SZXMsCisJVVNTRC1BcmcsCisJVVNTRC1SZXMsIAorCVVTU0QtRGF0YUNvZGluZ1NjaGVtZSwKKwlVU1NELVN0cmluZywKKwlQYXNzd29yZCwKKwlHdWlkYW5jZUluZm8sCisJU1MtTGlzdCwKKwlTUy1JbmZvTGlzdCwKKwlPdmVycmlkZUNhdGVnb3J5LAorCUNsaVJlc3RyaWN0aW9uT3B0aW9uLAorCU5vUmVwbHlDb25kaXRpb25UaW1lLAorCUZvcndhcmRpbmdPcHRpb25zLAorCW1heE51bU9mU1MsCisJU1MtRGF0YSwKKwlTUy1JbnZvY2F0aW9uTm90aWZpY2F0aW9uQXJnLAorCVNTLUludm9jYXRpb25Ob3RpZmljYXRpb25SZXMsCisJQ0NCUy1GZWF0dXJlLAorCVJlZ2lzdGVyQ0MtRW50cnlBcmcsCisJUmVnaXN0ZXJDQy1FbnRyeVJlcywKKwlFcmFzZUNDLUVudHJ5QXJnLAorCUVyYXNlQ0MtRW50cnlSZXMKKzsKKworSU1QT1JUUworCUFkZHJlc3NTdHJpbmcsCisJSVNETi1BZGRyZXNzU3RyaW5nLAorCUlTRE4tU3ViYWRkcmVzc1N0cmluZywKKwlGVE4tQWRkcmVzc1N0cmluZywKKwlJTVNJLAorCUJhc2ljU2VydmljZUNvZGUsCisJQWxlcnRpbmdQYXR0ZXJuLAorCUVNTFBQLVByaW9yaXR5LCAKKwlNYXhNQy1CZWFyZXJzLAorCU1DLUJlYXJlcnMsCisJRXh0ZXJuYWxTaWduYWxJbmZvCitGUk9NIE1BUC1Db21tb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtQ29tbW9uRGF0YVR5cGVzICgxOCkgdmVyc2lvbjExICgxMSl9CisKKwlFeHRlbnNpb25Db250YWluZXIKK0ZST00gTUFQLUV4dGVuc2lvbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KKworCVNTLUNvZGUKK0ZST00gTUFQLVNTLUNvZGUgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU1MtQ29kZSAoMTUpIHZlcnNpb24xMSAoMTEpfQorOworCisKK1JlZ2lzdGVyU1MtQXJnIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJU1MtQ29kZSwKKwliYXNpY1NlcnZpY2UJQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKKwlmb3J3YXJkZWRUb051bWJlcglbNF0gQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlmb3J3YXJkZWRUb1N1YmFkZHJlc3MJWzZdIElTRE4tU3ViYWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlub1JlcGx5Q29uZGl0aW9uVGltZQlbNV0gTm9SZXBseUNvbmRpdGlvblRpbWUJT1BUSU9OQUwsCisJLi4uLAorCWRlZmF1bHRQcmlvcml0eQlbN10gRU1MUFAtUHJpb3JpdHkJT1BUSU9OQUwsCisJbmJyVXNlcgkJWzhdIE1DLUJlYXJlcnMJT1BUSU9OQUwsCisJbG9uZ0ZUTi1TdXBwb3J0ZWQJWzldCU5VTEwJCU9QVElPTkFMIH0KKworTm9SZXBseUNvbmRpdGlvblRpbWUgOjo9IElOVEVHRVIgKDUuLjMwKQorCitTUy1JbmZvIDo6PSBDSE9JQ0UgeworCWZvcndhcmRpbmdJbmZvCVswXSBGb3J3YXJkaW5nSW5mbywKKwljYWxsQmFycmluZ0luZm8JWzFdIENhbGxCYXJyaW5nSW5mbywKKwlzcy1EYXRhCQlbM10gU1MtRGF0YX0KKworRm9yd2FyZGluZ0luZm8gOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlTUy1Db2RlCQlPUFRJT05BTCwKKwlmb3J3YXJkaW5nRmVhdHVyZUxpc3QJRm9yd2FyZGluZ0ZlYXR1cmVMaXN0LAorCS4uLn0KKworRm9yd2FyZGluZ0ZlYXR1cmVMaXN0IDo6PSAKKwlTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkJhc2ljU2VydmljZUdyb3VwcykgT0YKKwkJCQlGb3J3YXJkaW5nRmVhdHVyZQorCitGb3J3YXJkaW5nRmVhdHVyZSA6Oj0gU0VRVUVOQ0UgeworCWJhc2ljU2VydmljZQlCYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAorCXNzLVN0YXR1cwkJWzRdIFNTLVN0YXR1cwlPUFRJT05BTCwKKwlmb3J3YXJkZWRUb051bWJlcglbNV0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWZvcndhcmRlZFRvU3ViYWRkcmVzcwlbOF0gSVNETi1TdWJhZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWZvcndhcmRpbmdPcHRpb25zCVs2XSBGb3J3YXJkaW5nT3B0aW9ucwlPUFRJT05BTCwKKwlub1JlcGx5Q29uZGl0aW9uVGltZQlbN10gTm9SZXBseUNvbmRpdGlvblRpbWUJT1BUSU9OQUwsCisJLi4uLAorCWxvbmdGb3J3YXJkZWRUb051bWJlcglbOV0gRlROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwgfQorCitTUy1TdGF0dXMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisKKwktLSBiaXRzIDg3NjU6IDAwMDAgKHVudXNlZCkKKwktLSBiaXRzIDQzMjE6IFVzZWQgdG8gY29udmV5IHRoZSAiUCBiaXQiLCJSIGJpdCIsIkEgYml0IiBhbmQgIlEgYml0IiwKKwktLQkJICAgIHJlcHJlc2VudGluZyBzdXBwbGVtZW50YXJ5IHNlcnZpY2Ugc3RhdGUgaW5mb3JtYXRpb24KKwktLQkJICAgIGFzIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMy4wMTEgWzIyXQorCisJLS0gYml0IDQ6ICJRIGJpdCIKKworCS0tIGJpdCAzOiAiUCBiaXQiCisKKwktLSBiaXQgMjogIlIgYml0IgorCisJLS0gYml0IDE6ICJBIGJpdCIKKworRm9yd2FyZGluZ09wdGlvbnMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisKKwktLSBiaXQgODogbm90aWZpY2F0aW9uIHRvIGZvcndhcmRpbmcgcGFydHkKKwktLQkwICBubyBub3RpZmljYXRpb24KKwktLQkxICBub3RpZmljYXRpb24KKworCS0tIGJpdCA3OiByZWRpcmVjdGluZyBwcmVzZW50YXRpb24KKwktLQkwIG5vIHByZXNlbnRhdGlvbiAgCisJLS0JMSAgcHJlc2VudGF0aW9uCisKKwktLSBiaXQgNjogbm90aWZpY2F0aW9uIHRvIGNhbGxpbmcgcGFydHkKKwktLQkwICBubyBub3RpZmljYXRpb24KKwktLQkxICBub3RpZmljYXRpb24KKworCS0tIGJpdCA1OiAwICh1bnVzZWQpCisKKwktLSBiaXRzIDQzOiBmb3J3YXJkaW5nIHJlYXNvbgorCS0tCTAwICBtcyBub3QgcmVhY2hhYmxlCisJLS0JMDEgIG1zIGJ1c3kKKwktLQkxMCAgbm8gcmVwbHkKKwktLQkxMSAgdW5jb25kaXRpb25hbCB3aGVuIHVzZWQgaW4gYSBTUkkgUmVzdWx0LCAKKwktLQkgICAgb3IgY2FsbCBkZWZsZWN0aW9uIHdoZW4gdXNlZCBpbiBhIFJDSCBBcmd1bWVudAorCS0tIGJpdHMgMjE6IDAwICh1bnVzZWQpCisKK0NhbGxCYXJyaW5nSW5mbyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVNTLUNvZGUJCU9QVElPTkFMLAorCWNhbGxCYXJyaW5nRmVhdHVyZUxpc3QJQ2FsbEJhcnJpbmdGZWF0dXJlTGlzdCwKKwkuLi59CisKK0NhbGxCYXJyaW5nRmVhdHVyZUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQmFzaWNTZXJ2aWNlR3JvdXBzKSBPRgorCQkJCUNhbGxCYXJyaW5nRmVhdHVyZQorCitDYWxsQmFycmluZ0ZlYXR1cmUgOjo9IFNFUVVFTkNFIHsKKwliYXNpY1NlcnZpY2UJQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKKwlzcy1TdGF0dXMJWzRdIFNTLVN0YXR1cwlPUFRJT05BTCwKKwkuLi59CisKK1NTLURhdGEgOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlTUy1Db2RlCQlPUFRJT05BTCwKKwlzcy1TdGF0dXMJCVs0XSBTUy1TdGF0dXMJT1BUSU9OQUwsCisJc3MtU3Vic2NyaXB0aW9uT3B0aW9uCVNTLVN1YnNjcmlwdGlvbk9wdGlvbglPUFRJT05BTCwKKwliYXNpY1NlcnZpY2VHcm91cExpc3QJQmFzaWNTZXJ2aWNlR3JvdXBMaXN0CU9QVElPTkFMLAorCS4uLiwKKwlkZWZhdWx0UHJpb3JpdHkJRU1MUFAtUHJpb3JpdHkJT1BUSU9OQUwsCisJbmJyVXNlcgkJWzVdIE1DLUJlYXJlcnMJT1BUSU9OQUwKKwl9CisKK1NTLVN1YnNjcmlwdGlvbk9wdGlvbiA6Oj0gQ0hPSUNFIHsKKwljbGlSZXN0cmljdGlvbk9wdGlvbglbMl0gQ2xpUmVzdHJpY3Rpb25PcHRpb24sCisJb3ZlcnJpZGVDYXRlZ29yeQlbMV0gT3ZlcnJpZGVDYXRlZ29yeX0KKworQ2xpUmVzdHJpY3Rpb25PcHRpb24gOjo9IEVOVU1FUkFURUQgeworCXBlcm1hbmVudCAgKDApLAorCXRlbXBvcmFyeURlZmF1bHRSZXN0cmljdGVkICAoMSksCisJdGVtcG9yYXJ5RGVmYXVsdEFsbG93ZWQgICgyKX0KKworT3ZlcnJpZGVDYXRlZ29yeSA6Oj0gRU5VTUVSQVRFRCB7CisJb3ZlcnJpZGVFbmFibGVkICAoMCksCisJb3ZlcnJpZGVEaXNhYmxlZCAgKDEpfQorCitTUy1Gb3JCUy1Db2RlIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJU1MtQ29kZSwKKwliYXNpY1NlcnZpY2UJQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKKwkuLi4sCisJbG9uZ0ZUTi1TdXBwb3J0ZWQJWzRdCU5VTEwJCU9QVElPTkFMIH0KKworR2VuZXJpY1NlcnZpY2VJbmZvIDo6PSBTRVFVRU5DRSB7CisJc3MtU3RhdHVzCVNTLVN0YXR1cywKKwljbGlSZXN0cmljdGlvbk9wdGlvbglDbGlSZXN0cmljdGlvbk9wdGlvbglPUFRJT05BTCwKKwkuLi4sCisJbWF4aW11bUVudGl0bGVkUHJpb3JpdHkJWzBdIEVNTFBQLVByaW9yaXR5CU9QVElPTkFMLAorCWRlZmF1bHRQcmlvcml0eQlbMV0gRU1MUFAtUHJpb3JpdHkJT1BUSU9OQUwsCisJY2Nicy1GZWF0dXJlTGlzdAlbMl0gQ0NCUy1GZWF0dXJlTGlzdAlPUFRJT05BTCwKKwluYnJTQgkJWzNdIE1heE1DLUJlYXJlcnMJT1BUSU9OQUwsCisJbmJyVXNlcgkJWzRdIE1DLUJlYXJlcnMJT1BUSU9OQUwsCisJbmJyU04JCVs1XSBNQy1CZWFyZXJzCU9QVElPTkFMIH0KKworQ0NCUy1GZWF0dXJlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZDQ0JTLVJlcXVlc3RzKSBPRgorCQkJCUNDQlMtRmVhdHVyZQorCittYXhOdW1PZkNDQlMtUmVxdWVzdHMgIElOVEVHRVIgOjo9IDUKKworQ0NCUy1GZWF0dXJlIDo6PSBTRVFVRU5DRSB7CisJY2Nicy1JbmRleAlbMF0gQ0NCUy1JbmRleAlPUFRJT05BTCwKKwliLXN1YnNjcmliZXJOdW1iZXIJWzFdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwliLXN1YnNjcmliZXJTdWJhZGRyZXNzCVsyXSBJU0ROLVN1YmFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJYmFzaWNTZXJ2aWNlR3JvdXAJWzNdIEJhc2ljU2VydmljZUNvZGUJT1BUSU9OQUwsCisJLi4ufQorCitDQ0JTLUluZGV4ICA6Oj0gSU5URUdFUiAoMS4ubWF4TnVtT2ZDQ0JTLVJlcXVlc3RzKQorCitJbnRlcnJvZ2F0ZVNTLVJlcyA6Oj0gQ0hPSUNFIHsKKwlzcy1TdGF0dXMJCVswXSBTUy1TdGF0dXMsCisJYmFzaWNTZXJ2aWNlR3JvdXBMaXN0CVsyXSBCYXNpY1NlcnZpY2VHcm91cExpc3QsCisJZm9yd2FyZGluZ0ZlYXR1cmVMaXN0CVszXSBGb3J3YXJkaW5nRmVhdHVyZUxpc3QsCisJZ2VuZXJpY1NlcnZpY2VJbmZvCVs0XQlHZW5lcmljU2VydmljZUluZm8gfQorCitVU1NELUFyZyA6Oj0gU0VRVUVOQ0UgeworCXVzc2QtRGF0YUNvZGluZ1NjaGVtZQlVU1NELURhdGFDb2RpbmdTY2hlbWUsCisJdXNzZC1TdHJpbmcJVVNTRC1TdHJpbmcsCisJLi4uICwKKwlhbGVydGluZ1BhdHRlcm4JQWxlcnRpbmdQYXR0ZXJuCU9QVElPTkFMLAorCW1zaXNkbgkJWzBdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCB9CisKK1VTU0QtUmVzIDo6PSBTRVFVRU5DRSB7CisJdXNzZC1EYXRhQ29kaW5nU2NoZW1lCVVTU0QtRGF0YUNvZGluZ1NjaGVtZSwKKwl1c3NkLVN0cmluZwlVU1NELVN0cmluZywKKwkuLi59CisKK1VTU0QtRGF0YUNvZGluZ1NjaGVtZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBUaGUgc3RydWN0dXJlIG9mIHRoZSBVU1NELURhdGFDb2RpbmdTY2hlbWUgaXMgZGVmaW5lZCBieQorCS0tIHRoZSBDZWxsIEJyb2FkY2FzdCBEYXRhIENvZGluZyBTY2hlbWUgYXMgZGVzY3JpYmVkIGluCisJLS0gVFMgM0dQUCBUUyAyMy4wMzggWzI1XQorCitVU1NELVN0cmluZyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhVU1NELVN0cmluZ0xlbmd0aCkpCisJLS0gVGhlIHN0cnVjdHVyZSBvZiB0aGUgY29udGVudHMgb2YgdGhlIFVTU0QtU3RyaW5nIGlzIGRlcGVuZGVudAorCS0tIG9uIHRoZSBVU1NELURhdGFDb2RpbmdTY2hlbWUgYXMgZGVzY3JpYmVkIGluIFRTIDNHUFAgVFMgMjMuMDM4IFsyNV0uCisKK21heFVTU0QtU3RyaW5nTGVuZ3RoICBJTlRFR0VSIDo6PSAxNjAKKworUGFzc3dvcmQgOjo9IE51bWVyaWNTdHJpbmcKKwkoRlJPTSAoIjAifCIxInwiMiJ8IjMifCI0InwiNSJ8IjYifCI3InwiOCJ8IjkiKSkKKwkoU0laRSAoNCkpCisKK0d1aWRhbmNlSW5mbyA6Oj0gRU5VTUVSQVRFRCB7CisJZW50ZXJQVyAgKDApLAorCWVudGVyTmV3UFcgICgxKSwKKwllbnRlck5ld1BXLUFnYWluICAoMil9CisJLS0gSG93IHRoaXMgaW5mb3JtYXRpb24gaXMgcmVhbGx5IGRlbGl2ZXJlZCB0byB0aGUgc3Vic2NyaWJlcgorCS0tIChkaXNwbGF5LCBhbm5vdW5jZW1lbnQsIC4uLikgaXMgbm90IHBhcnQgb2YgdGhpcworCS0tIHNwZWNpZmljYXRpb24uCisKK1NTLUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mU1MpIE9GCisJCQkJU1MtQ29kZQorCittYXhOdW1PZlNTICBJTlRFR0VSIDo6PSAzMAorCitTUy1JbmZvTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZTUykgT0YKKwkJCQlTUy1JbmZvCisKK0Jhc2ljU2VydmljZUdyb3VwTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZCYXNpY1NlcnZpY2VHcm91cHMpIE9GCisJCQkJQmFzaWNTZXJ2aWNlQ29kZQorCittYXhOdW1PZkJhc2ljU2VydmljZUdyb3VwcyAgSU5URUdFUiA6Oj0gMTMKKworU1MtSW52b2NhdGlvbk5vdGlmaWNhdGlvbkFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlbMF0gSU1TSSwKKwltc2lzZG4JCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJc3MtRXZlbnQJCVsyXSBTUy1Db2RlLAorCS0tIFRoZSBmb2xsb3dpbmcgU1MtQ29kZSB2YWx1ZXMgYXJlIGFsbG93ZWQgOgorCS0tIGVjdAkJU1MtQ29kZSA6Oj0gJzAwMTEwMDAxJ0IKKwktLSBtdWx0aVBUWQlTUy1Db2RlIDo6PSAnMDEwMTAwMDEnQgorCS0tIGNkCQlTUy1Db2RlIDo6PSAnMDAxMDAxMDAnQgorCS0tIGNjYnMJCVNTLUNvZGUgOjo9ICcwMTAwMDEwMCdCCisJc3MtRXZlbnRTcGVjaWZpY2F0aW9uCVszXSBTUy1FdmVudFNwZWNpZmljYXRpb24JT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs0XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWItc3Vic2NyaWJlck51bWJlcglbNV0JSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWNjYnMtUmVxdWVzdFN0YXRlCVs2XQlDQ0JTLVJlcXVlc3RTdGF0ZQlPUFRJT05BTAorCX0KKworQ0NCUy1SZXF1ZXN0U3RhdGUgOjo9IEVOVU1FUkFURUQgeworCXJlcXVlc3QgIAkoMCksCisJcmVjYWxsICAJKDEpLAorCWFjdGl2ZSAgCSgyKSwKKwljb21wbGV0ZWQJKDMpLAorCXN1c3BlbmRlZAkoNCksCisJZnJvemVuCSg1KSwKKwlkZWxldGVkCSg2KQorCX0KKworU1MtSW52b2NhdGlvbk5vdGlmaWNhdGlvblJlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uCisJfQorCitTUy1FdmVudFNwZWNpZmljYXRpb24gOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heEV2ZW50U3BlY2lmaWNhdGlvbikgT0YKKwkJCQlBZGRyZXNzU3RyaW5nCisKK21heEV2ZW50U3BlY2lmaWNhdGlvbiAgSU5URUdFUiA6Oj0gMgorCitSZWdpc3RlckNDLUVudHJ5QXJnIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJWzBdCVNTLUNvZGUsCisJY2Nicy1EYXRhCQlbMV0JQ0NCUy1EYXRhCU9QVElPTkFMLAorCS4uLn0KKworQ0NCUy1EYXRhIDo6PSBTRVFVRU5DRSB7CisJY2Nicy1GZWF0dXJlCVswXQlDQ0JTLUZlYXR1cmUsCisJdHJhbnNsYXRlZEItTnVtYmVyCVsxXQlJU0ROLUFkZHJlc3NTdHJpbmcsCisJc2VydmljZUluZGljYXRvcglbMl0JU2VydmljZUluZGljYXRvcglPUFRJT05BTCwKKwljYWxsSW5mbwkJWzNdCUV4dGVybmFsU2lnbmFsSW5mbywKKwluZXR3b3JrU2lnbmFsSW5mbwlbNF0JRXh0ZXJuYWxTaWduYWxJbmZvLAorCS4uLn0KKworU2VydmljZUluZGljYXRvciA6Oj0gQklUIFNUUklORyB7CisJY2xpci1pbnZva2VkICgwKSwKKwljYW1lbC1pbnZva2VkICgxKX0gKFNJWkUoMi4uMzIpKSAKKwktLSBleGNlcHRpb24gaGFuZGxpbmc6CisJLS0gYml0cyAyIHRvIDMxIHNoYWxsIGJlIGlnbm9yZWQgaWYgcmVjZWl2ZWQgYW5kIG5vdCB1bmRlcnN0b29kCisKK1JlZ2lzdGVyQ0MtRW50cnlSZXMgOjo9IFNFUVVFTkNFIHsKKwljY2JzLUZlYXR1cmUJWzBdIENDQlMtRmVhdHVyZQlPUFRJT05BTCwKKwkuLi59CisKK0VyYXNlQ0MtRW50cnlBcmcgOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlbMF0JU1MtQ29kZSwKKwljY2JzLUluZGV4CVsxXQlDQ0JTLUluZGV4CU9QVElPTkFMLAorCS4uLn0KKworRXJhc2VDQy1FbnRyeVJlcyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVswXQlTUy1Db2RlLAorCXNzLVN0YXR1cwkJWzFdIFNTLVN0YXR1cwlPUFRJT05BTCwKKwkuLi59CisKK0VORAorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1UUy1Db2RlLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVRTLUNvZGUuYXNuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYzAwYmYKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1UUy1Db2RlLmFzbgpAQCAtMCwwICsxLDkyIEBACistLSAkSWQ6IE1BUC1UUy1Db2RlLmFzbiAyODE0OSAyMDA5LTA0LTI1IDE3OjQ1OjM0WiBldHhyYWIgJAorLS0gM0dQUCBUUyAyOS4wMDIgVjguOS4wICgyMDA5LTA0KSAKKy0tIDE3LjcuOQlUZWxlc2VydmljZSBDb2RlcworIAorTUFQLVRTLUNvZGUgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtVFMtQ29kZSAoMTkpIHZlcnNpb24xMSAoMTEpfQorCitERUZJTklUSU9OUworCis6Oj0KKworQkVHSU4KKworVGVsZXNlcnZpY2VDb2RlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgY29kZSBpZGVudGlmeWluZyBhIHNpbmdsZQorCS0tIHRlbGVzZXJ2aWNlLCBhIGdyb3VwIG9mIHRlbGVzZXJ2aWNlcywgb3IgYWxsIHRlbGVzZXJ2aWNlcy4gVGhlCisJLS0gc2VydmljZXMgYXJlIGRlZmluZWQgaW4gVFMgR1NNIDIyLjAwMyBbNF0uCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisKKwktLSBiaXRzIDg3NjU0MzIxOiBncm91cCAoYml0cyA4NzY1KSBhbmQgc3BlY2lmaWMgc2VydmljZQorCS0tIChiaXRzIDQzMjEpCisKK0V4dC1UZWxlc2VydmljZUNvZGUgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uNSkpCisJLS0gVGhpcyB0eXBlIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBjb2RlIGlkZW50aWZ5aW5nIGEgc2luZ2xlCisJLS0gdGVsZXNlcnZpY2UsIGEgZ3JvdXAgb2YgdGVsZXNlcnZpY2VzLCBvciBhbGwgdGVsZXNlcnZpY2VzLiBUaGUKKwktLSBzZXJ2aWNlcyBhcmUgZGVmaW5lZCBpbiBUUyBHU00gMjIuMDAzIFs0XS4KKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKworCS0tIE9DVEVUIDE6CisJLS0gYml0cyA4NzY1NDMyMTogZ3JvdXAgKGJpdHMgODc2NSkgYW5kIHNwZWNpZmljIHNlcnZpY2UKKwktLSAoYml0cyA0MzIxKQorCisJLS0gT0NURVRTIDItNTogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuIElmIHJlY2VpdmVkIHRoZQorICAgIC0tIEV4dC1UZWxlc2VydmljZUNvZGUgc2hhbGwgYmUKKyAJLS0gdHJlYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBkZWZpbmVkIGZvciB0aGUKKwktLSBvcGVyYXRpb24gdGhhdCB1c2VzIHRoaXMgdHlwZS4KKworCS0tIEV4dC1UZWxlc2VydmljZUNvZGUgaW5jbHVkZXMgYWxsIHZhbHVlcyBkZWZpbmVkIGZvciBUZWxlc2VydmljZUNvZGUuCisKK2FsbFRlbGVzZXJ2aWNlcwlUZWxlc2VydmljZUNvZGUgOjo9ICcwMDAwMDAwMCdCCisKK2FsbFNwZWVjaFRyYW5zbWlzc2lvblNlcnZpY2VzCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMDAwJ0IKK3RlbGVwaG9ueQkJCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMDAxJ0IKK2VtZXJnZW5jeUNhbGxzCQlUZWxlc2VydmljZUNvZGUgOjo9ICcwMDAxMDAxMCdCCisKK2FsbFNob3J0TWVzc2FnZVNlcnZpY2VzCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAwMTAwMDAwJ0IKK3Nob3J0TWVzc2FnZU1ULVBQCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAwMTAwMDAxJ0IKK3Nob3J0TWVzc2FnZU1PLVBQCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAwMTAwMDEwJ0IKKworYWxsRmFjc2ltaWxlVHJhbnNtaXNzaW9uU2VydmljZXMJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDExMDAwMDAnQgorZmFjc2ltaWxlR3JvdXAzQW5kQWx0ZXJTcGVlY2gJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDExMDAwMDEnQgorYXV0b21hdGljRmFjc2ltaWxlR3JvdXAzCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAxMTAwMDEwJ0IKK2ZhY3NpbWlsZUdyb3VwNAlUZWxlc2VydmljZUNvZGUgOjo9ICcwMTEwMDAxMSdCCisKKy0tIFRoZSBmb2xsb3dpbmcgbm9uLWhpZXJhcmNoaWNhbCBDb21wb3VuZCBUZWxlc2VydmljZSBHcm91cHMKKy0tIGFyZSBkZWZpbmVkIGluIFRTIDNHUFAgVFMgMjIuMDMwOgorYWxsRGF0YVRlbGVzZXJ2aWNlcwlUZWxlc2VydmljZUNvZGUgOjo9ICcwMTExMDAwMCdCCisJLS0gY292ZXJzIFRlbGVzZXJ2aWNlIEdyb3VwcyAnYWxsRmFjc2ltaWxlVHJhbnNtaXNzaW9uU2VydmljZXMnCisJLS0gYW5kICdhbGxTaG9ydE1lc3NhZ2VTZXJ2aWNlcycKK2FsbFRlbGVzZXJ2aWNlcy1FeGVwdFNNUwlUZWxlc2VydmljZUNvZGUgOjo9ICcxMDAwMDAwMCdCCisJLS0gY292ZXJzIFRlbGVzZXJ2aWNlIEdyb3VwcyAnYWxsU3BlZWNoVHJhbnNtaXNzaW9uU2VydmljZXMnIGFuZAorCS0tICdhbGxGYWNzaW1pbGVUcmFuc21pc3Npb25TZXJ2aWNlcycKKy0tCistLSBDb21wb3VuZCBUZWxlc2VydmljZSBHcm91cCBDb2RlcyBhcmUgb25seSB1c2VkIGluIGNhbGwKKy0tIGluZGVwZW5kZW50IHN1cHBsZW1lbnRhcnkgc2VydmljZSBvcGVyYXRpb25zLCBpLmUuIHRoZXkKKy0tIGFyZSBub3QgdXNlZCBpbiBJbnNlcnRTdWJzY3JpYmVyRGF0YSBvciBpbgorLS0gRGVsZXRlU3Vic2NyaWJlckRhdGEgbWVzc2FnZXMuCisKK2FsbFZvaWNlR3JvdXBDYWxsU2VydmljZXMJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTAwMTAwMDAnQgordm9pY2VHcm91cENhbGwJCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzEwMDEwMDAxJ0IKK3ZvaWNlQnJvYWRjYXN0Q2FsbAlUZWxlc2VydmljZUNvZGUgOjo9ICcxMDAxMDAxMCdCCisKK2FsbFBMTU4tc3BlY2lmaWNUUwlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMDAwMCdCCitwbG1uLXNwZWNpZmljVFMtMQlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMDAwMSdCCitwbG1uLXNwZWNpZmljVFMtMglUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMDAxMCdCCitwbG1uLXNwZWNpZmljVFMtMwlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMDAxMSdCCitwbG1uLXNwZWNpZmljVFMtNAlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMDEwMCdCCitwbG1uLXNwZWNpZmljVFMtNQlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMDEwMSdCCitwbG1uLXNwZWNpZmljVFMtNglUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMDExMCdCCitwbG1uLXNwZWNpZmljVFMtNwlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMDExMSdCCitwbG1uLXNwZWNpZmljVFMtOAlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMTAwMCdCCitwbG1uLXNwZWNpZmljVFMtOQlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMTAwMSdCCitwbG1uLXNwZWNpZmljVFMtQQlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMTAxMCdCCitwbG1uLXNwZWNpZmljVFMtQglUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMTAxMSdCCitwbG1uLXNwZWNpZmljVFMtQwlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMTEwMCdCCitwbG1uLXNwZWNpZmljVFMtRAlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMTEwMSdCCitwbG1uLXNwZWNpZmljVFMtRQlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMTExMCdCCitwbG1uLXNwZWNpZmljVFMtRglUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMTExMSdCCisKK0VORAorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL1JSTFAtQ29tcG9uZW50cy5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL1JSTFAtQ29tcG9uZW50cy5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhZGU2YQotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvUlJMUC1Db21wb25lbnRzLmFzbgpAQCAtMCwwICsxLDE0ODggQEAKKy0tIFJSTFAtQ29tcG9uZW50cy5hc24KKy0tICRJZCQKKy0tIFRha2VuIGZyb20gM0dQUCBUUyA0NC4wMzEgVjcuNC4wICgyMDA3LTAzKQorLS0gaHR0cDovL3d3dy4zZ3BwLm9yZy9mdHAvU3BlY3MvYXJjaGl2ZS80NF9zZXJpZXMvNDQuMDMxLzQ0MDMxLTc0MC56aXAvNDQwMzEtNzQwLmRvYworLS0KKy0tIDQgQ29tcG9uZW50cworLS0gNSBFbGVtZW50cyBvZiBDb21wb25lbnRzCistLQorCitSUkxQLUNvbXBvbmVudHMKKy0tIHsgUlJMUC1Db21wb25lbnRzIH0KKworREVGSU5JVElPTlMgQVVUT01BVElDIFRBR1MgOjo9CisKK0JFR0lOCisKK0lNUE9SVFMKKwlFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24sIFZlbG9jaXR5RXN0aW1hdGUKK0ZST00KKwlNQVAtTENTLURhdGFUeXBlcyB7CisJaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKwlnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUxDUy1EYXRhVHlwZXMgKDI1KSB2ZXJzaW9uMTEgKDExKX0KKworCUV4dGVuc2lvbkNvbnRhaW5lcgorRlJPTSBNQVAtRXh0ZW5zaW9uRGF0YVR5cGVzIHsKKwlpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorCWdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjExICgxMSl9Cis7CisKKworLS0gQWRkIGhlcmUgb3RoZXIgQVNOLjEgZGVmaW5pdGlvbnMgcHJlc2VudGVkIGJlbG93CistLSBpbiBjaGFwdGVycyA0IGFuZCA1LgorCistLSBNZWFzdXJlbWVudCBQb3NpdGlvbiByZXF1ZXN0IGNvbXBvbmVudAorTXNyUG9zaXRpb24tUmVxIDo6PSBTRVFVRU5DRSB7CisJcG9zaXRpb25JbnN0cnVjdAkJUG9zaXRpb25JbnN0cnVjdCwKKwlyZWZlcmVuY2VBc3Npc3REYXRhCQlSZWZlcmVuY2VBc3Npc3REYXRhCQlPUFRJT05BTCwKKwltc3JBc3Npc3REYXRhCQkJTXNyQXNzaXN0RGF0YQkJCU9QVElPTkFMLAorCXN5c3RlbUluZm9Bc3Npc3REYXRhCVN5c3RlbUluZm9Bc3Npc3REYXRhCU9QVElPTkFMLAorCWdwcy1Bc3Npc3REYXRhCQkJR1BTLUFzc2lzdERhdGEJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJCUV4dGVuc2lvbkNvbnRhaW5lcgkJT1BUSU9OQUwsCisJLi4uLAorCS0tIFJlbGVhc2UgOTggZXh0ZW5zaW9uIGVsZW1lbnQKK3JlbDk4LU1zclBvc2l0aW9uLVJlcS1leHRlbnNpb24JCQlSZWw5OC1Nc3JQb3NpdGlvbi1SZXEtRXh0ZW5zaW9uCQkJT1BUSU9OQUwsCQorCS0tIFJlbGVhc2UgNSBleHRlbnNpb24gZWxlbWVudAorcmVsNS1Nc3JQb3NpdGlvbi1SZXEtZXh0ZW5zaW9uCQkJUmVsNS1Nc3JQb3NpdGlvbi1SZXEtRXh0ZW5zaW9uCQkJT1BUSU9OQUwsCisJLS0gUmVsZWFzZSA3IGV4dGVuc2lvbiBlbGVtZW50CityZWw3LU1zclBvc2l0aW9uLVJlcS1leHRlbnNpb24JCQlSZWw3LU1zclBvc2l0aW9uLVJlcS1FeHRlbnNpb24JCQlPUFRJT05BTAorfQorCistLSBNZWFzdXJlbWVudCBQb3NpdGlvbiByZXNwb25zZSBjb21wb25lbnQKK01zclBvc2l0aW9uLVJzcCA6Oj0gU0VRVUVOQ0UgeworCW11bHRpcGxlU2V0cwkJCU11bHRpcGxlU2V0cwkJCU9QVElPTkFMLAorCXJlZmVyZW5jZUlkZW50aXR5CQlSZWZlcmVuY2VJZGVudGl0eQkJT1BUSU9OQUwsCisJb3RkLU1lYXN1cmVJbmZvCQkJT1RELU1lYXN1cmVJbmZvCQkJT1BUSU9OQUwsCisJbG9jYXRpb25JbmZvCQkJTG9jYXRpb25JbmZvCQkJT1BUSU9OQUwsCisJZ3BzLU1lYXN1cmVJbmZvCQkJR1BTLU1lYXN1cmVJbmZvCQkJT1BUSU9OQUwsCisJbG9jYXRpb25FcnJvcgkJCUxvY2F0aW9uRXJyb3IJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJCUV4dGVuc2lvbkNvbnRhaW5lcgkJT1BUSU9OQUwsCisJLi4uLAkKKwktLSBSZWxlYXNlIGV4dGVuc2lvbiBoZXJlCisJcmVsLTk4LU1zclBvc2l0aW9uLVJzcC1FeHRlbnNpb24JCQorCQkJCQkJCVJlbC05OC1Nc3JQb3NpdGlvbi1Sc3AtRXh0ZW5zaW9uCQlPUFRJT05BTCwKKwlyZWwtNS1Nc3JQb3NpdGlvbi1Sc3AtRXh0ZW5zaW9uCisJCQkJCQkJUmVsLTUtTXNyUG9zaXRpb24tUnNwLUV4dGVuc2lvbgkJT1BUSU9OQUwsCisJLS0gcmVsLTUtTXNyUG9zaXRpb24tUnNwLUV4dGVuc2lvbiBhbmQgb3RoZXIgcG9zc2libGUgZnV0dXJlIGV4dGVuc2lvbnMKKwktLSBhcmUgdGhlIG9ubHkgaW5mb3JtYXRpb24gZWxlbWVudHMgdGhhdCBtYXkgYmUgaW5jbHVkZWQgaW4gdGhlIDJuZAorCS0tIE1zclBvc2l0aW9uLVJzcCBjb21wb25lbnQgd2hlbiBSUkxQIHBzZXVkby1zZWdtZW50YXRpb24gaXMgdXNlZAorCXJlbC03LU1zclBvc2l0aW9uLVJzcC1FeHRlbnNpb24KKwkJCQkJCQlSZWwtNy1Nc3JQb3NpdGlvbi1Sc3AtRXh0ZW5zaW9uCQlPUFRJT05BTAorfQorCistLSBBc3Npc3RhbmNlIERhdGEgY29tcG9uZW50CitBc3Npc3RhbmNlRGF0YSA6Oj0gU0VRVUVOQ0UgeworCXJlZmVyZW5jZUFzc2lzdERhdGEJUmVmZXJlbmNlQXNzaXN0RGF0YQkJCU9QVElPTkFMLAorCW1zckFzc2lzdERhdGEJCQlNc3JBc3Npc3REYXRhCQkJT1BUSU9OQUwsCisJc3lzdGVtSW5mb0Fzc2lzdERhdGEJU3lzdGVtSW5mb0Fzc2lzdERhdGEJT1BUSU9OQUwsCisJZ3BzLUFzc2lzdERhdGEJCQlHUFMtQXNzaXN0RGF0YQkJCU9QVElPTkFMLAkKKwltb3JlQXNzRGF0YVRvQmVTZW50CQlNb3JlQXNzRGF0YVRvQmVTZW50CQlPUFRJT05BTCwJLS0gSWYgbm90IHByZXNlbnQsIGludGVycHJldCBhcyBvbmx5CisJCQkJCQkJCQkJCQkJCQkJLS0gQXNzaXN0YW5jZSBEYXRhIGNvbXBvbmVudCB1c2VkIHRvCisJCQkJCQkJCQkJCQkJCQkJLS0gZGVsaXZlciBlbnRpcmUgc2V0IG9mIGFzc2lzdGFuY2UKKwkJCQkJCQkJCQkJCQkJCQktLSBkYXRhLgorCWV4dGVuc2lvbkNvbnRhaW5lcgkJRXh0ZW5zaW9uQ29udGFpbmVyCQlPUFRJT05BTCwKKwkuLi4sCisJLS0gUmVsZWFzZSBleHRlbnNpb24gaGVyZQorCXJlbDk4LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbglSZWw5OC1Bc3Npc3RhbmNlRGF0YS1FeHRlbnNpb24JT1BUSU9OQUwsCisJcmVsNS1Bc3Npc3RhbmNlRGF0YS1FeHRlbnNpb24JUmVsNS1Bc3Npc3RhbmNlRGF0YS1FeHRlbnNpb24JT1BUSU9OQUwsCisgcmVsNy1Bc3Npc3RhbmNlRGF0YS1FeHRlbnNpb24gUmVsNy1Bc3Npc3RhbmNlRGF0YS1FeHRlbnNpb24gT1BUSU9OQUwJCit9CisKKy0tIFByb3RvY29sIEVycm9yIGNvbXBvbmVudAorUHJvdG9jb2xFcnJvciA6Oj0gU0VRVUVOQ0UgeworCWVycm9yQ2F1c2UJCQkJRXJyb3JDb2RlcywJCisJZXh0ZW5zaW9uQ29udGFpbmVyCQlFeHRlbnNpb25Db250YWluZXIJCU9QVElPTkFMLAorCS4uLiwKKwktLSBSZWxlYXNlIGV4dGVuc2lvbnMgaGVyZQorCXJlbC01LVByb3RvY29sRXJyb3ItRXh0ZW5zaW9uIFJlbC01LVByb3RvY29sRXJyb3ItRXh0ZW5zaW9uCQlPUFRJT05BTAorfQorCistLSBQb3NpdGlvbiBpbnN0cnVjdGlvbnMKK1Bvc2l0aW9uSW5zdHJ1Y3QgOjo9IFNFUVVFTkNFIHsKKwktLSBNZXRob2QgdHlwZQorCW1ldGhvZFR5cGUJCQkJTWV0aG9kVHlwZSwJCisJcG9zaXRpb25NZXRob2QJCQlQb3NpdGlvbk1ldGhvZCwKKwltZWFzdXJlUmVzcG9uc2VUaW1lCQlNZWFzdXJlUmVzcG9uc2VUaW1lLAkJCisJdXNlTXVsdGlwbGVTZXRzCQkJVXNlTXVsdGlwbGVTZXRzLAkJCisJZW52aXJvbm1lbnRDaGFyYWN0ZXIJRW52aXJvbm1lbnRDaGFyYWN0ZXIJT1BUSU9OQUwJCit9CisKKy0tCitNZXRob2RUeXBlIDo6PSBDSE9JQ0UgeworCW1zQXNzaXN0ZWQJCUFjY3VyYWN5T3B0LAktLSBhY2N1cmFjeSBpcyBvcHRpb25hbAorCW1zQmFzZWQJCQlBY2N1cmFjeSwJCS0tIGFjY3VyYWN5IGlzIG1hbmRhdG9yeQorCW1zQmFzZWRQcmVmCQlBY2N1cmFjeSwJCS0tIGFjY3VyYWN5IGlzIG1hbmRhdG9yeQorCW1zQXNzaXN0ZWRQcmVmCUFjY3VyYWN5IAkJLS0gYWNjdXJhY3kgaXMgbWFuZGF0b3J5Cit9CisKKy0tIEFjY3VyYWN5IG9mIHRoZSBsb2NhdGlvbiBlc3RpbWF0aW9uCitBY2N1cmFjeU9wdCA6Oj0gU0VRVUVOQ0UgeworCWFjY3VyYWN5CQlBY2N1cmFjeQlPUFRJT05BTAorfQorCistLSBUaGUgdmFsdWVzIG9mIHRoaXMgZmllbGQgYXJlIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMzIgKFVuY2VydGFpbnR5IGNvZGUpCitBY2N1cmFjeSA6Oj0gSU5URUdFUiAoMC4uMTI3KQorCisKKy0tIFBvc2l0aW9uIE1ldGhvZAorUG9zaXRpb25NZXRob2QgOjo9IEVOVU1FUkFURUQgeworCWVvdGQgKDApLAorCWdwcyAoMSksCisJZ3BzT3JFT1REICgyKQorfQorCistLSBNZWFzdXJlbWVudCByZXF1ZXN0IHJlc3BvbnNlIHRpbWUKK01lYXN1cmVSZXNwb25zZVRpbWUgOjo9IElOVEVHRVIgKDAuLjcpCisKKy0tIHVzZU11bHRpcGxlIFNldHMsIEZGUyEKK1VzZU11bHRpcGxlU2V0cyA6Oj0gRU5VTUVSQVRFRCB7CisJbXVsdGlwbGVTZXRzICgwKSwJCS0tIG11bHRpcGxlIHNldHMgYXJlIGFsbG93ZWQKKwlvbmVTZXQgKDEpCQkJCS0tIHNlbmRpbmcgb2YgbXVsdGlwbGUgaXMgbm90IGFsbG93ZWQKK30KKworLS0gRW52aXJvbm1lbnQgY2hhcmFjdGVyaXphdGlvbgorRW52aXJvbm1lbnRDaGFyYWN0ZXIgOjo9IEVOVU1FUkFURUQgeworCWJhZEFyZWEgKDApLAkJLS0gYmFkIHVyYmFuIG9yIHN1YnVyYmFuLCBoZWF2eSBtdWx0aXBhdGggYW5kIE5MT1MKKwlub3RCYWRBcmVhICgxKSwJCS0tIGxpZ2h0IG11bHRpcGF0aCBhbmQgTkxPUworCW1peGVkQXJlYSAoMiksCQktLSBub3QgZGVmaW5lZCBvciBtaXhlZCBlbnZpcm9ubWVudAorCS4uLgorfQorCistLSBFLU9URCByZWZlcmVuY2UgQlRTIGZvciBBc3NpdGFuY2UgZGF0YSBJRQorUmVmZXJlbmNlQXNzaXN0RGF0YSA6Oj0gU0VRVUVOQ0UgeworCWJjY2hDYXJyaWVyCQlCQ0NIQ2FycmllciwJCQkJCQktLSBCQ0NIIGNhcnJpZXIKKwlic2ljCQkJQlNJQywJCQkJCQkJCS0tIEJTSUMKKwl0aW1lU2xvdFNjaGVtZQlUaW1lU2xvdFNjaGVtZSwgCQkJCQktLSBUaW1lc2xvdCBzY2hlbWUKKwlidHNQb3NpdGlvbgkJQlRTUG9zaXRpb24JCQlPUFRJT05BTAorfQorCistLSBlbGxpcHNvaWQgcG9pbnQgYW5kCistLSBlbGxpcHNvaWQgcG9pbnQgd2l0aCBhbHRpdHVkZSBhbmQgdW5jZXJ0YWludHkgZWxsaXBzb2lkIHNoYXBlcyBhcmUgc3VwcG9ydGVkCitCVFNQb3NpdGlvbiA6Oj0gRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uCisKKy0tIFJGIGNoYW5uZWwgbnVtYmVyIG9mIEJDQ0gKK0JDQ0hDYXJyaWVyIDo6PSBJTlRFR0VSICgwLi4xMDIzKQorCistLSBCYXNlIHN0YXRpb24gSWRlbnRpdHkgQ29kZQorQlNJQyA6Oj0gSU5URUdFUiAoMC4uNjMpCisKKy0tIFRpbWVzbG90IHNjaGVtZQorVGltZVNsb3RTY2hlbWUgOjo9IEVOVU1FUkFURUQgeworCWVxdWFsTGVuZ3RoICgwKSwKKwl2YXJpb3VzTGVuZ3RoICgxKQorfQorCistLSBUaW1lIHNsb3QgKG1vZHVsbykKK01vZHVsb1RpbWVTbG90IDo6PSBJTlRFR0VSICgwLi4zKQorCistLSBFLU9URCBtZWFzdXJlbWVudCBhc3Npc3RhbmNlIGRhdGEgSUUKKy0tIFRoZSB0b3RhbCBudW1iZXIgb2YgbmVpZ2hib3JzIGluIHRoaXMgZWxlbWVudCAoTXNyQXNzaXN0RGF0YSkKKy0tIGFuZCBpbiBTeXN0ZW1JbmZvQXNzaXN0RGF0YSBlbGVtZW50IChwcmVzZW50ZWQgbmVpZ2hib3JzCistLSBjYW4gYmUgYXQgYSBtYXhpbXVtIDE1ISkKK01zckFzc2lzdERhdGEgOjo9IFNFUVVFTkNFIHsKKwkgbXNyQXNzaXN0TGlzdCBTZXFPZk1zckFzc2lzdEJUUworfQorU2VxT2ZNc3JBc3Npc3RCVFMgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjE1KSkgT0YgTXNyQXNzaXN0QlRTCisKK01zckFzc2lzdEJUUyA6Oj0gU0VRVUVOQ0UgeworCWJjY2hDYXJyaWVyCQkJQkNDSENhcnJpZXIsCQktLSBCQ0NIIGNhcnJpZXIKKwlic2ljCQkJCUJTSUMsCQkJCS0tIEJTSUMKKwltdWx0aUZyYW1lT2Zmc2V0CU11bHRpRnJhbWVPZmZzZXQsIAktLSBtdWx0aWZyYW1lIG9mZnNldAorCXRpbWVTbG90U2NoZW1lCQlUaW1lU2xvdFNjaGVtZSwJCS0tIFRpbWVzbG90IHNjaGVtZQorCXJvdWdoUlRECQkJUm91Z2hSVEQsCQkJLS0gcm91Z2ggUlREIHZhbHVlCisKKwktLSBMb2NhdGlvbiBDYWxjdWxhdGlvbiBBc3Npc3RhbmNlIGRhdGEgaXMgbW92ZWQgaGVyZQorCWNhbGNBc3Npc3RhbmNlQlRTCUNhbGNBc3Npc3RhbmNlQlRTCU9QVElPTkFMCit9CisKKy0tIE11bHRpZnJhbWUgb2Zmc2V0CitNdWx0aUZyYW1lT2Zmc2V0IDo6PSBJTlRFR0VSICgwLi41MSkKKy0tIFRoZSBNdWx0aWZyYW1lIE9mZnNldCB2YWx1ZSA1MSBzaGFsbCBub3QgYmUgZW5jb2RlZCBieSB0aGUgdHJhbnNtaXR0aW5nIGVudGl0eSBhbmQKKy0tIHNoYWxsIGJlIHRyZWF0ZWQgYnkgdGhlIHJlY2VpdmluZyBlbnRpdHkgYXMgMC4KKworLS0gUm91Z2ggUlREIHZhbHVlIGJldHdlZW4gb25lIGJhc2Ugc3RhdGlvbiBhbmQgcmVmZXJlbmNlIEJUUworUm91Z2hSVEQgOjo9IElOVEVHRVIgKDAuLjEyNTApCistLSBUaGUgUm91Z2hSVEQgdmFsdWUgMTI1MCBzaGFsbCBub3QgYmUgZW5jb2RlZCBieSB0aGUgdHJhbnNtaXR0aW5nIGVudGl0eSBhbmQgc2hhbGwKKy0tIGJlIHRyZWF0ZWQgYnkgdGhlIHJlY2VpdmluZyBlbnRpdHkgYXMgMC4KKworLS0gRS1PVEQgTWVhc3VyZW1lbnQgYXNzaXN0YW5jZSBkYXRhIGZvciBzeXN0ZW0gaW5mb3JtYXRpb24gTGlzdCBJRQorLS0gVGhlIHRvdGFsIG51bWJlciBvZiBiYXNlIHN0YXRpb25zIGluIHRoaXMgZWxlbWVudCAoU3lzdGVtSW5mb0Fzc2lzdERhdGEKKy0tIHByZXNlbnRlZCBuZWlnaGJvcnMpIGFuZCBpbiBNc3JBc3Npc3REYXRhIGVsZW1lbnQgY2FuIGJlIGF0IGEgbWF4aW11bSAxNS4KK1N5c3RlbUluZm9Bc3Npc3REYXRhIDo6PSBTRVFVRU5DRSB7CisJc3lzdGVtSW5mb0Fzc2lzdExpc3QgCVNlcU9mU3lzdGVtSW5mb0Fzc2lzdEJUUworfQorU2VxT2ZTeXN0ZW1JbmZvQXNzaXN0QlRTOjo9IFNFUVVFTkNFIChTSVpFKDEuLjMyKSkgT0YgU3lzdGVtSW5mb0Fzc2lzdEJUUworCistLSB3aGV0aGVyIG4udGggaXMgcHJlc2VudCBvciBub3QgPworU3lzdGVtSW5mb0Fzc2lzdEJUUyA6Oj0gQ0hPSUNFIHsKKwlub3RQcmVzZW50CQlOVUxMLAorCXByZXNlbnQJCQlBc3Npc3RCVFNEYXRhCit9CisKKy0tIEFjdHVhbCBhc3Npc3RhbmNlIGRhdGEgZm9yIHN5c3RlbSBpbmZvcm1hdGlvbiBiYXNlIHN0YXRpb24KK0Fzc2lzdEJUU0RhdGEgOjo9IFNFUVVFTkNFIHsKKwlic2ljCQkJCUJTSUMsCQkJCS0tIEJTSUMKKwltdWx0aUZyYW1lT2Zmc2V0CU11bHRpRnJhbWVPZmZzZXQsCS0tIG11bHRpZnJhbWUgb2Zmc2V0CisJdGltZVNsb3RTY2hlbWUJCVRpbWVTbG90U2NoZW1lLAkJLS0gVGltZXNsb3Qgc2NoZW1lCisJcm91Z2hSVEQJCQlSb3VnaFJURCwJCQktLSByb3VnaCBSVEQgdmFsdWUKKworCS0tIExvY2F0aW9uIENhbGN1bGF0aW9uIEFzc2lzdGFuY2UgZGF0YQorCWNhbGNBc3Npc3RhbmNlQlRTCUNhbGNBc3Npc3RhbmNlQlRTCU9QVElPTkFMCit9CisKKy0tIEUtT1REIExvY2F0aW9uIGNhbGN1bGF0aW9uIGFzc2lzdGFuY2UgZGF0YSwKKy0tIENhbGNBc3Npc3RhbmNlQlRTIGVsZW1lbnQgaXMgb3B0aW9uYWwgbm90IHN1YmZpZWxkcworQ2FsY0Fzc2lzdGFuY2VCVFMgOjo9IFNFUVVFTkNFIHsKKwlmaW5lUlRECQkJCUZpbmVSVEQsCQktLSBmaW5lIFJURCB2YWx1ZSBiZXR3ZWVuIGJhc2Ugc3RhdGlvbnMKKwlyZWZlcmVuY2VXR1M4NAkJUmVmZXJlbmNlV0dTODQJLS0gcmVmZXJlbmNlIGNvb3JkaW5hdGVzCit9CisKKy0tIENvb3JkaW5hdGVzIG9mIG5laWdoYm91ciBCVFMsIFdHUy04NCBlbGxpcHNvaWQKK1JlZmVyZW5jZVdHUzg0IDo6PSBTRVFVRU5DRSB7CisJcmVsYXRpdmVOb3J0aAlSZWxEaXN0YW5jZSwJCQkJLS0gcmVsYXRpdmUgZGlzdGFuY2UgKHNvdXRoIG5lZ2F0aXZlKQorCXJlbGF0aXZlRWFzdAlSZWxEaXN0YW5jZSwJCQkJLS0gcmVsYXRpdmUgZGlzdGFuY2UgKHdlc3QgbmVnYXRpdmUpCisJLS0gUmVsYXRpdmUgQWx0aXR1ZGUgaXMgbm90IGFsd2F5cyBrbm93bgorCXJlbGF0aXZlQWx0CQlSZWxhdGl2ZUFsdAkJT1BUSU9OQUwJLS0gcmVsYXRpdmUgYWx0aXR1ZGUKK30KKworLS0gRmluZSBSVEQgdmFsdWUgYmV0d2VlbiB0aGlzIEJUUyBhbmQgdGhlIHJlZmVyZW5jZSBCVFMJCitGaW5lUlREIDo6PSBJTlRFR0VSICgwLi4yNTUpCisKKy0tIFJlbGF0aXZlIG5vcnRoL2Vhc3QgZGlzdGFuY2UKK1JlbERpc3RhbmNlIDo6PSBJTlRFR0VSICgtMjAwMDAwLi4yMDAwMDApCisKKy0tIFJlbGF0aXZlIGFsdGl0dWRlCitSZWxhdGl2ZUFsdCA6Oj0gSU5URUdFUiAoLTQwMDAuLjQwMDApCisKKy0tIE1lYXN1cmUgcG9zaXRpb24gcmVzcG9uc2UgSUVzCistLSBSZWZlcmVuY2UgSWRlbnRpdHkKKy0tIE11bHRpcGxlIHNldHMKK011bHRpcGxlU2V0cyA6Oj0gU0VRVUVOQ0UgeworCS0tIG51bWJlciBvZiByZWZlcmVuY2Ugc2V0cworCW5ick9mU2V0cwkJCUlOVEVHRVIgKDIuLjMpLAkJCisKKwktLSBUaGlzIGZpZWxkIGFjdHVhbGx5IHRlbGxzIHRoZSBudW1iZXIgb2YgcmVmZXJlbmNlIEJUU3MKKwluYnJPZlJlZmVyZW5jZUJUU3MJSU5URUdFUiAoMS4uMyksCisKKwktLSBUaGlzIGZpZWxkIGlzIGNvbmRpdGlvbmFsIGFuZCBpbmNsdWRlZCBvcHRpb25hbGx5IG9ubHkgaWYKKwktLSBuYnJPZlNldHMgaXMgMyBhbmQgbnVtYmVyIG9mIHJlZmVyZW5jZSBCVFNzIGlzIDIuCisJcmVmZXJlbmNlUmVsYXRpb24JCVJlZmVyZW5jZVJlbGF0aW9uCQlPUFRJT05BTAorfQorCistLSBSZWxhdGlvbiBiZXR3ZWVuIHJlZmVuY2UgQlRTcyBhbmQgc2V0cworUmVmZXJlbmNlUmVsYXRpb24gOjo9IEVOVU1FUkFURUQgeworCXNlY29uZEJUU1RoaXJkU2V0ICgwKSwJLS0gMXN0IEJUUyByZWxhdGVkIHRvIDFzdCBhbmQgMm5kIHNldHMKKwlzZWNvbmRCVFNTZWNvbmRTZXQgKDEpLAktLSAxc3QgQlRTIHJlbGF0ZWQgdG8gMXN0IGFuZCAzcmQgc2V0cworCWZpcnN0QlRTRmlyc3RTZXQgKDIpCS0tIDFzdCBCVFMgcmVsYXRlZCB0byAxc3Qgc2V0Cit9CisKKy0tIFJlZmVyZW5jZSBCVFMgSWRlbnRpdHksIHRoaXMgZWxlbWVudCBjb250YWlucyBudW1iZXIgb2YKKy0tIEJUU3MgdG9sZCBuYnJPZlJlZmVyZW5jZUJUU3MgZmllbGQgaW4gTXVsdGlwbGUgc2V0cyBlbGVtZW50KQorUmVmZXJlbmNlSWRlbnRpdHkgOjo9IFNFUVVFTkNFIHsKKwktLSBSZWZlcmVuY2UgQlRTIGxpc3QKKwlyZWZCVFNMaXN0CQlTZXFPZlJlZmVyZW5jZUlkZW50aXR5VHlwZQorfQorU2VxT2ZSZWZlcmVuY2VJZGVudGl0eVR5cGUgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjMpKSBPRiBSZWZlcmVuY2VJZGVudGl0eVR5cGUKKworLS0gQ2VsbCBpZGVudGl0eQorUmVmZXJlbmNlSWRlbnRpdHlUeXBlIDo6PSBDSE9JQ0UgeworCWJzaWNBbmRDYXJyaWVyCUJTSUNBbmRDYXJyaWVyLAkJLS0gQlNJQyBhbmQgQ2FycmllcgorCWNpCQkJCUNlbGxJRCwJCQkJLS0gQ2VsbCBJRCwgTEFDIG5vdCBuZWVkZWQKKwlyZXF1ZXN0SW5kZXgJUmVxdWVzdEluZGV4LAkJLS0gSW5kZXggdG8gUmVxdWVzdGVkIE5laWdoYm9yIExpc3QKKwlzeXN0ZW1JbmZvSW5kZXgJU3lzdGVtSW5mb0luZGV4LAktLSBJbmRleCB0byBTeXN0ZW0gaW5mbyBsaXN0LCB0aGlzIHR5cGUgb2YgcmVmLiBpZGVudGl0eQorCQkJCQkJCQkJCS0tIHNoYWxsIG5vdCBiZSB1c2VkIGJ5IHRoZSBNUyB1bmxlc3MgaXQgaGFzIHJlY2VpdmVkCisJCQkJCQkJCQkJLS0gdGhlIFN5c3RlbUluZm9Bc3Npc3REYXRhIGZyb20gdGhlIFNNTEMgZm9yIHRoaXMgY2VsbC4KKwljaUFuZExBQwkJQ2VsbElEQW5kTEFDCQktLSBDSSBhbmQgTEFDCit9CisKK0JTSUNBbmRDYXJyaWVyIDo6PSBTRVFVRU5DRSB7CisJY2FycmllcglCQ0NIQ2FycmllciwKKwlic2ljCQlCU0lDCit9CisKK1JlcXVlc3RJbmRleCA6Oj0gSU5URUdFUiAoMS4uMTYpCisKK1N5c3RlbUluZm9JbmRleCA6Oj0gSU5URUdFUiAoMS4uMzIpCisKK0NlbGxJREFuZExBQyA6Oj0gU0VRVUVOQ0UgeworCXJlZmVyZW5jZUxBQwlMQUNJRCwJCQkJLS0gTG9jYXRpb24gYXJlYSBjb2RlCisJcmVmZXJlbmNlQ0kJCUNlbGxJRAkJCQktLSBDZWxsIGlkZW50aXR5Cit9CitDZWxsSUQgOjo9IElOVEVHRVIgKDAuLjY1NTM1KQorTEFDSUQgOjo9IElOVEVHRVIgKDAuLjY1NTM1KQorCistLSBPVEQtTWVhc3VyZUluZm8KK09URC1NZWFzdXJlSW5mbyA6Oj0gU0VRVUVOQ0UgeworCS0tIE1lYXN1cmVtZW50IGluZm8gZWxlbWVudHMsIE9URC1Nc3JFbGVtZW50IGlzIHJlcGVhdGVkIG51bWJlciBvZiB0aW1lcworCS0tIHRvbGQgaW4gbmJyT2ZSZWZlcmVuY2VCVFNzIGluIE11bHRpcGxlU2V0cywgZGVmYXVsdCB2YWx1ZSBpcyAxCisJb3RkTXNyRmlyc3RTZXRzCQlPVEQtTXNyRWxlbWVudEZpcnN0LAorCisJLS0gaWYgbW9yZSB0aGFuIG9uZSBzZXRzIGFyZSBwcmVzZW50IHRoaXMgZWxlbWVudCBpcyByZXBlYXRlZAorCS0tIE51bWJlck9mU2V0cyAtIDEgKC0xID0gZmlyc3Qgc2V0KQorCW90ZE1zclJlc3RTZXRzCQlTZXFPZk9URC1Nc3JFbGVtZW50UmVzdAkJT1BUSU9OQUwKK30KKworU2VxT2ZPVEQtTXNyRWxlbWVudFJlc3QgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjIpKSBPRiBPVEQtTXNyRWxlbWVudFJlc3QKKworLS0gT1REIG1lYXN1cmVudCBpbmZvcm1hdGlvbiBmb3IgMSBzZXQKK09URC1Nc3JFbGVtZW50Rmlyc3QgOjo9IFNFUVVFTkNFIHsKKwlyZWZGcmFtZU51bWJlcgkJCUlOVEVHRVIgKDAuLjQyNDMxKSwgCQkJCS0tIEZyYW1lIG51bWJlciBtb2R1bG8gNDI0MzIKKwlyZWZlcmVuY2VUaW1lU2xvdAkJTW9kdWxvVGltZVNsb3QsCisJdG9hTWVhc3VyZW1lbnRzT2ZSZWYJVE9BLU1lYXN1cmVtZW50c09mUmVmCU9QVElPTkFMLAorCXN0ZFJlc29sdXRpb24JCQlTdGRSZXNvbHV0aW9uLAorCXRhQ29ycmVjdGlvbgkJCUlOVEVHRVIgKDAuLjk2MCkJCU9QVElPTkFMLAktLSBUQSBjb3JyZWN0aW9uCisKKwktLSBtZWFzdXJlZCBuZWlnaGJvcnMgaW4gT1REIG1lYXN1cmVtZW50cworCW90ZC1GaXJzdFNldE1zcnMgCQlTZXFPZk9URC1GaXJzdFNldE1zcnMgCU9QVElPTkFMCit9CitTZXFPZk9URC1GaXJzdFNldE1zcnMgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjEwKSkgT0YgT1RELUZpcnN0U2V0TXNycworCistLSBPVEQgbWVhc3VyZW50IGluZm9ybWF0aW9uIDIgYW5kIDMgc2V0cyBpZiBleGlzdAorT1RELU1zckVsZW1lbnRSZXN0IDo6PSBTRVFVRU5DRSB7CisJcmVmRnJhbWVOdW1iZXIJCQlJTlRFR0VSICgwLi40MjQzMSksIAkJCQkJLS0gRnJhbWUgbnVtYmVyIG1vZHVsbyA0MjQzMgorCXJlZmVyZW5jZVRpbWVTbG90CQlNb2R1bG9UaW1lU2xvdCwKKwl0b2FNZWFzdXJlbWVudHNPZlJlZglUT0EtTWVhc3VyZW1lbnRzT2ZSZWYJCU9QVElPTkFMLAorCXN0ZFJlc29sdXRpb24JCQlTdGRSZXNvbHV0aW9uLAorCXRhQ29ycmVjdGlvbgkJCUlOVEVHRVIgKDAuLjk2MCkJCQlPUFRJT05BTCwJLS0gVEEgY29ycmVjdGlvbgorCisJLS0gbWVhc3VyZWQgbmVpZ2hib3JzIGluIE9URCBtZWFzdXJlbWVudHMKKwlvdGQtTXNyc09mT3RoZXJTZXRzIAlTZXFPZk9URC1Nc3JzT2ZPdGhlclNldHMJT1BUSU9OQUwKK30KK1NlcU9mT1RELU1zcnNPZk90aGVyU2V0cyA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTApKSBPRiBPVEQtTXNyc09mT3RoZXJTZXRzCisKKy0tIFN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgVE9BIG1lYXN1cmVtZW50cyBmcm9tIHRoZSByZWZlcmVuY2UgQlRTCitUT0EtTWVhc3VyZW1lbnRzT2ZSZWYgOjo9IFNFUVVFTkNFIHsKKwlyZWZRdWFsaXR5CQkJUmVmUXVhbGl0eSwKKwludW1PZk1lYXN1cmVtZW50cwlOdW1PZk1lYXN1cmVtZW50cworfQorCitSZWZRdWFsaXR5IDo6PSBJTlRFR0VSICgwLi4zMSkJCQktLSBTdCBEZXYgb2YgVE9BIG9mIHJlZmVyZW5jZSBhcyBkZWZpbmVkIGluIGFubmV4CitOdW1PZk1lYXN1cmVtZW50cyA6Oj0gSU5URUdFUiAoMC4uNykJLS0gTm8uIG9mIG1lYXN1cmVtZW50cyBmb3IgUmVmUXVhbGl0eSBhcyBkZWZpbmVkIGluIGFubmV4CitTdGRSZXNvbHV0aW9uIDo6PSBJTlRFR0VSICgwLi4zKQkJLS0gVmFsdWVzIG9mIHJlc29sdXRpb24gYXJlIGRlZmluZWQgaW4gYW5uZXgKKworT1RELUZpcnN0U2V0TXNycyA6Oj0gT1RELU1lYXN1cmVtZW50V2l0aElECisKKy0tIE5laWdoYm91ciBpbmZvIGluIE9URCBtZWFzdXJlbWVudHMgMC0xMCB0aW1lcyBpbiBURCBtZWFzdXJlbWVudCBpbmZvCitPVEQtTXNyc09mT3RoZXJTZXRzIDo6PSBDSE9JQ0UgeworCWlkZW50aXR5Tm90UHJlc2VudAlPVEQtTWVhc3VyZW1lbnQsCQorCWlkZW50aXR5UHJlc2VudAkJT1RELU1lYXN1cmVtZW50V2l0aElECit9CisKKy0tIEZvciB0aGlzIE9URCBtZWFzdXJlbWVudCBpZGVudGl0eSBpcyBzYW1lIGFzIHRoZSBpZGVudGl0eSBvZiBCVFMKKy0tIGluIHRoZSBmaXJzdCBzZXQgd2l0aCBzYW1lIHNlcXVlbmNlIG51bWJlcgorT1RELU1lYXN1cmVtZW50IDo6PSBTRVFVRU5DRSB7CisJbmJvclRpbWVTbG90CU1vZHVsb1RpbWVTbG90LAorCWVvdGRRdWFsaXR5CQlFT1REUXVhbGl0eSwKKwlvdGRWYWx1ZQkJT1REVmFsdWUKK30KKworLS0gVGhpcyBtZWFzdXJlbWVudCBjb250YWlucyB0aGUgQlRTIGlkZW50aXR5IGFuZCBtZWFzdXJlbWVudAorT1RELU1lYXN1cmVtZW50V2l0aElEIDo6PVNFUVVFTkNFIHsKKwluZWlnaGJvcklkZW50aXR5CU5laWdoYm9ySWRlbnRpdHksCisJbmJvclRpbWVTbG90CQlNb2R1bG9UaW1lU2xvdCwKKwllb3RkUXVhbGl0eQkJCUVPVERRdWFsaXR5LAorCW90ZFZhbHVlCQkJT1REVmFsdWUKK30KKworRU9URFF1YWxpdHkgOjo9IFNFUVVFTkNFIHsKKwluYnJPZk1lYXN1cmVtZW50cwlJTlRFR0VSCSgwLi43KSwKKwlzdGRPZkVPVEQJCQlJTlRFR0VSICgwLi4zMSkKK30KKworTmVpZ2hib3JJZGVudGl0eSA6Oj0gQ0hPSUNFIHsKKwlic2ljQW5kQ2FycmllcgkJQlNJQ0FuZENhcnJpZXIsCQktLSBCU0lDIGFuZCBDYXJyaWVyCisJY2kJCQkJCUNlbGxJRCwJCQkJLS0gQ2VsbCBJRCwgTEFDIG5vdCBuZWVkZWQKKwltdWx0aUZyYW1lQ2FycmllcglNdWx0aUZyYW1lQ2FycmllciwgCS0tIE11bHRpRnJhbWVPZmZlc3QgYW5kIEJTSUMKKwlyZXF1ZXN0SW5kZXgJCVJlcXVlc3RJbmRleCwJCS0tIEluZGV4IHRvIFJlcXVlc3RlZCBOZWlnaGJvciBMaXN0CisJc3lzdGVtSW5mb0luZGV4CQlTeXN0ZW1JbmZvSW5kZXgsCS0tIEluZGV4IHRvIFN5c3RlbSBpbmZvIGxpc3QsIHRoaXMgdHlwZSBvZiBuZWlnaGJvdXIKKwkJCQkJCQkJCQkJLS0gaWRlbnRpdHkgc2hhbGwgbm90IGJlIHVzZWQgYnkgdGhlIE1TIHVubGVzcyBpdCBoYXMKKwkJCQkJCQkJCQkJLS0gcmVjZWl2ZWQgdGhlIFN5c3RlbUluZm9Bc3Npc3REYXRhIGZyb20gdGhlIFNNTEMgZm9yCisJCQkJCQkJCQkJCS0tIHRoaXMgY2VsbC4KKwljaUFuZExBQwkJCUNlbGxJREFuZExBQwkJLS0gQ0kgYW5kIExBQworfQorCistLSBNdWx0aWZyYW1lIGFuZCBjYXJyaWVyCitNdWx0aUZyYW1lQ2FycmllciA6Oj0gU0VRVUVOQ0UgeworCWJjY2hDYXJyaWVyCQkJQkNDSENhcnJpZXIsCisJbXVsdGlGcmFtZU9mZnNldAlNdWx0aUZyYW1lT2Zmc2V0Cit9CisKKy0tIE9URCBtZWFzdXJlbWVudCB2YWx1ZSBmb3IgbmVpZ2hib3VyCitPVERWYWx1ZSA6Oj0gSU5URUdFUiAoMC4uMzk5OTkpCisKKy0tIExvY2F0aW9uIGluZm9ybWF0aW9uIElFCitMb2NhdGlvbkluZm8gOjo9IFNFUVVFTkNFIHsKKwlyZWZGcmFtZQkJSU5URUdFUiAoMC4uNjU1MzUpLAkJCS0tIFJlZmVyZW5jZSBGcmFtZSBudW1iZXIKKwktLSBJZiByZWZGcmFtZSBpcyB3aXRoaW4gKDQyNDMyLi42NTUzNSksIGl0IHNoYWxsIGJlIGlnbm9yZWQgYnkgdGhlIHJlY2VpdmVyCisJLS0gaW4gdGhhdCBjYXNlIHRoZSBNUyBzaG91bGQgcHJvdmlkZSBHUFMgVE9XIGlmIGF2YWlsYWJsZQorCWdwc1RPVwkJCUlOVEVHRVIgKDAuLjE0Mzk5OTk5KQlPUFRJT05BTCwJLS0gR1BTIFRPVworCWZpeFR5cGUJCQlGaXhUeXBlLAorCS0tIE5vdGUgdGhhdCBhcHBsaWNhYmxlIHJhbmdlIGZvciByZWZGcmFtZSBpcyAwIC0gNDI0MzEKKwktLSBQb3NzaWJsZSBzaGFwZXMgY2FycmllZCBpbiBwb3NFc3RpbWF0ZSBhcmUKKwktLSBlbGxpcHNvaWQgcG9pbnQsCisJLS0gZWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgY2lyY2xlCisJLS0gZWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgZWxsaXBzZQorCS0tIGVsbGlwc29pZCBwb2ludCB3aXRoIGFsdGl0dWRlIGFuZCB1bmNlcnRhaW50eSBlbGxpcHNvaWQKKwlwb3NFc3RpbWF0ZQkJRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uCit9CisKK0ZpeFR5cGUgOjo9IElOVEVHRVIgeworCXR3b0RGaXggKDApLAorCXRocmVlREZpeCAoMSkKK30gKDAuLjEpCisKKy0tIEdQUy1NZWFzdXJlbWVudCBpbmZvcm1hdGlvbgorR1BTLU1lYXN1cmVJbmZvIDo6PSBTRVFVRU5DRSB7CisJLS0gTWVhc3VyZW1lbnQgaW5mbyBlbGVtZW50cworCS0tIHVzZXIgaGFzIHRvIG1ha2Ugc3VyZSB0aGF0IGluIHRoaXMgZWxlbWVudCBpcyBudW1iZXIgb2YgZWxlbWVudHMKKwktLSBkZWZpbmVkIGluIHJlZmVyZW5jZSBCVFMgaWRlbnRpdHkKKwlncHNNc3JTZXRMaXN0CVNlcU9mR1BTLU1zclNldEVsZW1lbnQJCit9CitTZXFPZkdQUy1Nc3JTZXRFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSgxLi4zKSkgT0YgR1BTLU1zclNldEVsZW1lbnQKKworLS0gT1REIG1lYXN1cmVudCBpbmZvcm1hdGlvbiAxLTMgdGltZXMgaW4gbWVzc2FnZQorR1BTLU1zclNldEVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwlyZWZGcmFtZQkJSU5URUdFUiAoMC4uNjU1MzUpCU9QVElPTkFMLCAJLS0gUmVmZXJlbmNlIEZyYW1lIG51bWJlcgorCWdwc1RPVwkJCUdQU1RPVzI0YiwJCQkJCQktLSBHUFMgVE9XCisJLS0gTm90ZSB0aGF0IGFwcGxpY2FibGUgcmFuZ2UgZm9yIHJlZkZyYW1lIGlzIDAgLSA0MjQzMQorCistLU5fU0FUIGNhbiBiZSByZWFkIGZyb20gbnVtYmVyIG9mIGVsZW1lbnRzIG9mIGdwcy1tc3JMaXN0CisKKwlncHMtbXNyTGlzdAkJU2VxT2ZHUFMtTXNyRWxlbWVudAorfQorCistLSAyNCBiaXQgcHJlc2VudGF0aW9uIGZvciBHUFNUT1cKK0dQU1RPVzI0YiA6Oj0gSU5URUdFUiAoMC4uMTQzOTk5OTkpCisKKy0tIG1lYXN1cmVkIGVsZW1lbnRzIGluIG1lYXN1cmVtZW50IHBhcmFtZXRlcnMgZmllbGQKK1NlcU9mR1BTLU1zckVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjE2KSkgT0YgR1BTLU1zckVsZW1lbnQKKworR1BTLU1zckVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwlzYXRlbGxpdGVJRAkJU2F0ZWxsaXRlSUQsCQkJCS0tIFNhdGVsbGl0ZSBpZGVudGlmaWVyCisJY05vCQkJCUlOVEVHRVIgKDAuLjYzKSwJCQktLSBjYXJyaWVyIG5vaXNlIHJhdGlvCisJZG9wcGxlcgkJCUlOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLCAJLS0gZG9wcGxlciwgbXVsbHRpcGx5IGJ5IDAuMgorCXdob2xlQ2hpcHMJCUlOVEVHRVIgKDAuLjEwMjIpLAkJCS0tIHdob2xlIHZhbHVlIG9mIHRoZSBjb2RlIHBoYXNlIG1lYXN1cmVtZW50CisJZnJhY0NoaXBzCQlJTlRFR0VSICgwLi4xMDI0KSwJCQktLSBmcmFjdGlvbmFsIHZhbHVlIG9mIHRoZSBjb2RlIHBoYXNlIG1lYXN1cmVtZW50CisJCQkJCQkJCQkJCS0tIGEgdmFsdWUgb2YgMTAyNCBzaGFsbCBub3QgYmUgZW5jb2RlZCBieSB0aGUgc2VuZGVyCisJCQkJCQkJCQkJCS0tIHRoZSByZWNlaXZlciBzaGFsbCBjb25zaWRlciBhIHZhbHVlIG9mIDEwMjQgdG8gYmUKKwkJCQkJCQkJCQkJLS0gaW52YWxpZCBkYXRhCisJbXBhdGhJbmRpYwkJTXBhdGhJbmRpYywJCQkJCS0tIG11bHRpcGF0aCBpbmRpY2F0b3IKKwlwc2V1UmFuZ2VSTVNFcnIJSU5URUdFUiAoMC4uNjMpCQkJCS0tIGluZGV4CQkKK30KKworLS0gTXVsdGlwYXRoIGluZGljYXRvcgorTXBhdGhJbmRpYyA6Oj0gRU5VTUVSQVRFRCB7CisJbm90TWVhc3VyZWQgKDApLAorCWxvdyAoMSksCisJbWVkaXVtICgyKSwKKwloaWdoICgzKQorfQorCistLSBMb2NhdGlvbiBlcnJvciBJRQorTG9jYXRpb25FcnJvciA6Oj0gU0VRVUVOQ0UgeworCWxvY0Vycm9yUmVhc29uCQkJCUxvY0Vycm9yUmVhc29uLAorCWFkZGl0aW9uYWxBc3Npc3RhbmNlRGF0YQlBZGRpdGlvbmFsQXNzaXN0YW5jZURhdGEJT1BUSU9OQUwsCisJLi4uCit9CisKK0xvY0Vycm9yUmVhc29uIDo6PSBFTlVNRVJBVEVEIHsKKwl1bkRlZmluZWQgKDApLAkKKwlub3RFbm91Z2hCVFNzICgxKSwKKwlub3RFbm91Z2hTYXRzICgyKSwKKwllb3RkTG9jQ2FsQXNzRGF0YU1pc3NpbmcgKDMpLAorCWVvdGRBc3NEYXRhTWlzc2luZyAoNCksCisJZ3BzTG9jQ2FsQXNzRGF0YU1pc3NpbmcgKDUpLAorCWdwc0Fzc0RhdGFNaXNzaW5nICg2KSwKKwltZXRob2ROb3RTdXBwb3J0ZWQgKDcpLAorCW5vdFByb2Nlc3NlZCAoOCksCisJcmVmQlRTRm9yR1BTTm90U2VydmluZ0JUUyAoOSksCisJcmVmQlRTRm9yRU9URE5vdFNlcnZpbmdCVFMgKDEwKSwKKwkuLi4sCisJbm90RW5vdWdoR0FOU1NTYXRzICgxMSksCQorIGdhbnNzQXNzRGF0YU1pc3NpbmcgKDEyKSwKKwlyZWZCVFNGb3JHQU5TU05vdFNlcnZpbmdCVFMgKDEzKQorfQorCistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSBhbiB1bnJlY29nbml6ZWQgdmFsdWUgc2hhbGwgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcyB2YWx1ZSAwCisKKworLS0gZGVmaW5lcyBhZGRpdGlvbmFsIGFzc2lzdGFuY2UgZGF0YSBuZWVkZWQgZm9yIGFueSBuZXcgbG9jYXRpb24gYXR0ZW1wdAorLS0gTVMgc2hhbGwgcmV0YWluIGFueSBhc3Npc3RhbmNlIGRhdGEgYWxyZWFkeSByZWNlaXZlZAorQWRkaXRpb25hbEFzc2lzdGFuY2VEYXRhIDo6PSBTRVFVRU5DRSB7CisJZ3BzQXNzaXN0YW5jZURhdGEJCUdQU0Fzc2lzdGFuY2VEYXRhCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJCUV4dGVuc2lvbkNvbnRhaW5lcgkJT1BUSU9OQUwsCisJLi4uLAorCWdhbnNzQXNzaXN0YW5jZURhdGEgR0FOU1NBc3Npc3RhbmNlRGF0YSBPUFRJT05BTAorfQorCitHUFNBc3Npc3RhbmNlRGF0YSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhHUFNBc3Npc3RhbmNlRGF0YSkpCistLSBHUFNBc3Npc3RhbmNlRGF0YSBoYXMgaWRlbnRpY2FsIHN0cnVjdHVyZSBhbmQgZW5jb2RpbmcgdG8gb2N0ZXRzIDMgdG8gbiBvZiB0aGUKKy0tIEdQUyBBc3Npc3RhbmNlIERhdGEgSUUgaW4gM0dQUCBUUyA0OS4wMzEKKworbWF4R1BTQXNzaXN0YW5jZURhdGEJSU5URUdFUiA6Oj0gNDAKKworR0FOU1NBc3Npc3RhbmNlRGF0YSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhHQU5TU0Fzc2lzdGFuY2VEYXRhKSkKKy0tIEdBTlNTQXNzaXN0YW5jZURhdGEgaGFzIGlkZW50aWNhbCBzdHJ1Y3R1cmUgYW5kIGVuY29kaW5nIHRvIG9jdGV0cyAzIHRvIG4gb2YgdGhlCistLSBHQU5TUyBBc3Npc3RhbmNlIERhdGEgSUUgaW4gM0dQUCBUUyA0OS4wMzEKKworbWF4R0FOU1NBc3Npc3RhbmNlRGF0YQlJTlRFR0VSIDo6PSA0MAorCisKKy0tIFByb3RvY29sIEVycm9yIENhdXNlcworRXJyb3JDb2RlcyA6Oj0gRU5VTUVSQVRFRCB7CisJdW5EZWZpbmVkICgwKSwKK21pc3NpbmdDb21wb25ldCAoMSksCQkJCitpbmNvcnJlY3REYXRhICgyKSwJCQkKK21pc3NpbmdJRW9yQ29tcG9uZW50RWxlbWVudCAoMyksCQkKK21lc3NhZ2VUb29TaG9ydCAoNCksCQkJCit1bmtub3dSZWZlcmVuY2VOdW1iZXIgKDUpLAkJCisuLi4KK30KKworLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0gYW4gdW5yZWNvZ25pemVkIHZhbHVlIHNoYWxsIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgdmFsdWUgMAorCistLSBHUFMgYXNzaXN0YW5jZSBkYXRhIElFCitHUFMtQXNzaXN0RGF0YSA6Oj0gU0VRVUVOQ0UgeworCWNvbnRyb2xIZWFkZXIJCUNvbnRyb2xIZWFkZXIKK30KKworLS0gTW9yZSBBc3Npc3RhbmNlIERhdGEgVG8gQmUgU2VudCBJRQorLS0gTW9yZSBBc3Npc3RhbmNlIERhdGEgQ29tcG9uZW50cyBPbiB0aGUgV2F5IGluZGljYXRpb24gZm9yIGRlbGl2ZXJ5IG9mIGFuIGVudGlyZSBzZXQgb2YgYXNzaXN0YW5jZQorLS0gZGF0YSBpbiBtdWx0aXBsZSBBc3Npc3RhbmNlIERhdGEgY29tcG9uZW50cy4KKworTW9yZUFzc0RhdGFUb0JlU2VudCA6Oj0gRU5VTUVSQVRFRCB7CisJbm9Nb3JlTWVzc2FnZXMgKDApLAkJCS0tIFRoaXMgaXMgdGhlIG9ubHkgb3IgbGFzdCBBc3Npc3RhbmNlIERhdGEgbWVzc2FnZSB1c2VkIHRvIGRlbGl2ZXIKKwkJCQkJCQkJLS0gdGhlIGVudGlyZSBzZXQgb2YgYXNzaXN0YW5jZSBkYXRhLgorCW1vcmVNZXNzYWdlc09uVGhlV2F5ICgxKQktLSBUaGUgU01MQyB3aWxsIHNlbmQgbW9yZSBBc3Npc3RhbmNlIERhdGEgbWVzc2FnZXMgb3IgYSBmaW5hbCBSUkxQCisJCQkJCQkJCS0tIE1lYXN1cmUgUG9zaXRpb24gUmVxdWVzdCBtZXNzYWdlIHRvIGRlbGl2ZXIgdGhlCisJCQkJCQkJCS0tIHRoZSBlbnRpcmUgc2V0IG9mIGFzc2lzdGFuY2UgZGF0YS4KK30KKworLS0gQ29udHJvbCBoZWFkZXIgb2YgdGhlIEdQUyBhc3Npc3RhbmNlIGRhdGEKK0NvbnRyb2xIZWFkZXIgOjo9IFNFUVVFTkNFIHsKKworCS0tIEZpZWxkIHR5cGUgUHJlc2VudCBpbmZvcm1hdGlvbgorCXJlZmVyZW5jZVRpbWUJCVJlZmVyZW5jZVRpbWUJCU9QVElPTkFMLAorCXJlZkxvY2F0aW9uCQkJUmVmTG9jYXRpb24JCQlPUFRJT05BTCwKKwlkZ3BzQ29ycmVjdGlvbnMJCURHUFNDb3JyZWN0aW9ucwkJT1BUSU9OQUwsCisJbmF2aWdhdGlvbk1vZGVsCQlOYXZpZ2F0aW9uTW9kZWwJCU9QVElPTkFMLAorCWlvbm9zcGhlcmljTW9kZWwJCUlvbm9zcGhlcmljTW9kZWwJCU9QVElPTkFMLAorCXV0Y01vZGVsCQkJVVRDTW9kZWwJCQlPUFRJT05BTCwKKwlhbG1hbmFjCQkJQWxtYW5hYwkJCU9QVElPTkFMLAorCWFjcXVpc0Fzc2lzdAkJQWNxdWlzQXNzaXN0CQlPUFRJT05BTCwKKwlyZWFsVGltZUludGVncml0eSBTZXFPZi1CYWRTYXRlbGxpdGVTZXQgT1BUSU9OQUwKK30KKworUmVmZXJlbmNlVGltZSA6Oj0gU0VRVUVOQ0UgeworCWdwc1RpbWUJCQkJR1BTVGltZSwKKwlnc21UaW1lCQkJCUdTTVRpbWUJCQkJT1BUSU9OQUwsCisJZ3BzVG93QXNzaXN0CQlHUFNUT1dBc3Npc3QJCU9QVElPTkFMCit9CisKKy0tIEdQUyBUaW1lIGluY2x1ZGVzIHdlZWsgbnVtYmVyIGFuZCB0aW1lLW9mLXdlZWsgKFRPVykKK0dQU1RpbWUgOjo9IFNFUVVFTkNFIHsKKwlncHNUT1cyM2IJCQlHUFNUT1cyM2IsCisJZ3BzV2VlawkJCQlHUFNXZWVrCit9CisKKy0tIEdQU1RPVywgcmFuZ2UgMC02MDQ3OTkuOTIsIHJlc29sdXRpb24gMC4wOCBzZWMsIDIzLWJpdCBwcmVzZW50YXRpb24KK0dQU1RPVzIzYiA6Oj0gSU5URUdFUiAoMC4uNzU1OTk5OSkKKworLS0gR1BTIHdlZWsgbnVtYmVyCitHUFNXZWVrIDo6PSBJTlRFR0VSICgwLi4xMDIzKQorCistLSBHUFNUT1dBc3Npc3QgY29uc2lzdHMgb2YgVExNIG1lc3NhZ2UsIEFudGktc3Bvb2YgZmxhZywgQWxlcnQgZmxhZywgYW5kIDIgcmVzZXJ2ZWQgYml0cyBpbiBUTE0gV29yZAorLS0gZm9yIGVhY2ggdmlzaWJsZSBzYXRlbGxpdGUuCistLSBOX1NBVCBjYW4gYmUgcmVhZCBmcm9tIG51bWJlciBvZiBlbGVtZW50cyBpbiBHUFNUT1dBc3Npc3QKK0dQU1RPV0Fzc2lzdCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTIpKSBPRiBHUFNUT1dBc3Npc3RFbGVtZW50CisKK0dQU1RPV0Fzc2lzdEVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwlzYXRlbGxpdGVJRAkJCVNhdGVsbGl0ZUlELAorCXRsbVdvcmQJCQkJVExNV29yZCwKKwlhbnRpU3Bvb2YJCQlBbnRpU3Bvb2ZGbGFnLAorCWFsZXJ0CQkJCUFsZXJ0RmxhZywKKwl0bG1Sc3ZkQml0cwkJCVRMTVJlc2VydmVkQml0cworfQorCistLSBUTE0gV29yZCwgMTQgYml0cworVExNV29yZCA6Oj0gSU5URUdFUiAoMC4uMTYzODMpCisKKy0tIEFudGktU3Bvb2YgZmxhZworQW50aVNwb29mRmxhZyA6Oj0gSU5URUdFUiAoMC4uMSkKKworLS0gQWxlcnQgZmxhZworQWxlcnRGbGFnIDo6PSBJTlRFR0VSICgwLi4xKQorCistLSBSZXNlcnZlZCBiaXRzIGluIFRMTSB3b3JkLCBNU0Igb2NjdXJzIGVhcmxpZXIgaW4gVExNIFdvcmQgdHJhbnNtaXR0ZWQgYnkgc2F0ZWxsaXRlCitUTE1SZXNlcnZlZEJpdHMgOjo9IElOVEVHRVIgKDAuLjMpCisKK0dTTVRpbWUgOjo9IFNFUVVFTkNFIHsKKwliY2NoQ2FycmllcgkJQkNDSENhcnJpZXIsCS0tIEJDQ0ggY2FycmllcgorCWJzaWMJCQlCU0lDLAkJCS0tIEJTSUMKKwlmcmFtZU51bWJlcgkJRnJhbWVOdW1iZXIsCisJdGltZVNsb3QJCVRpbWVTbG90LAorCWJpdE51bWJlcgkJQml0TnVtYmVyCit9CisKKy0tIEZyYW1lIG51bWJlcgorRnJhbWVOdW1iZXIgOjo9IElOVEVHRVIgKDAuLjIwOTcxNTEpCisKKy0tIFRpbWUgc2xvdCBudW1iZXIKK1RpbWVTbG90IDo6PSBJTlRFR0VSICgwLi43KQorCistLSBCaXQgbnVtYmVyCitCaXROdW1iZXIgOjo9IElOVEVHRVIgKDAuLjE1NikKKworCistLSBSZWZlcmVuY2UgTG9jYXRpb24gSUUKK1JlZkxvY2F0aW9uIDo6PSBTRVFVRU5DRSB7CisJdGhyZWVETG9jYXRpb24JCQlFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24KK30KKworLS0gREdQUyBDb3JyZWN0aW9ucyBJRQorREdQU0NvcnJlY3Rpb25zIDo6PSBTRVFVRU5DRSB7CisKKwlncHNUT1cJCUlOVEVHRVIgKDAuLjYwNDc5OSksCS0tIERHUFMgcmVmZXJlbmNlIHRpbWUKKwlzdGF0dXMJCUlOVEVHRVIgKDAuLjcpLAorCS0tIE5fU0FUIGNhbiBiZSByZWFkIGZyb20gbnVtYmVyIG9mIGVsZW1lbnRzIG9mIHNhdExpc3QKKwlzYXRMaXN0CQlTZXFPZlNhdEVsZW1lbnQgCQorfQorU2VxT2ZTYXRFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSAoMS4uMTYpKSBPRiBTYXRFbGVtZW50CisKKy0tIG51bWJlciBvZiBjb3JyZWN0aW9uIGZvciBzYXRlbGxpdGVzCitTYXRFbGVtZW50IDo6PSBTRVFVRU5DRSB7CisJc2F0ZWxsaXRlSUQJCVNhdGVsbGl0ZUlELAorCisKKy0tLSBTZXF1ZW5jZSBudW1iZXIgZm9yIGVwaGVtZXJpcworCWlvZGUgCQkJSU5URUdFUiAoMC4uMjM5KSwKKwktLSBVc2VyIERpZmZlcmVudGlhbCBSYW5nZSBFcnJvcgorCXVkcmUJCQlJTlRFR0VSICgwLi4zKSwJCQorCisJLS0gUHNldWRvIFJhbmdlIENvcnJlY3Rpb24sIHJhbmdlIGlzCisJLS0gLTY1NS4wNCAtICs2NTUuMDQsCisJcHNldWRvUmFuZ2VDb3IJSU5URUdFUiAoLTIwNDcuLjIwNDcpLCAJCisKKwktLSBQc2V1ZG8gUmFuZ2UgUmF0ZSBDb3JyZWN0aW9uLCByYW5nZSBpcworCS0tIC00LjA2NCAtICs0LjA2NCwKKwlyYW5nZVJhdGVDb3IJSU5URUdFUiAoLTEyNy4uMTI3KSwKKworLS0gRGVsdGEgUHNldWRvIFJhbmdlIENvcnJlY3Rpb24gMiAJCisJZGVsdGFQc2V1ZG9SYW5nZUNvcjIgCUlOVEVHRVIgKC0xMjcuLjEyNyksCS0tIFRoaXMgSUUgc2hhbGwgYmUgaWdub3JlZCBieSB0aGUgcmVjZWl2ZXIgYW5kCisJCQkJCQkJCQkJCQkJLS0gc2V0IHRvIHplcm8gYnkgdGhlIHNlbmRlcgorCS0tIERlbHRhIFBzZXVkbyBSYW5nZSBDb3JyZWN0aW9uIDIJCisJZGVsdGFSYW5nZVJhdGVDb3IyCQlJTlRFR0VSICgtNy4uNyksCQktLSBUaGlzIElFIHNoYWxsIGJlIGlnbm9yZWQgYnkgdGhlIHJlY2VpdmVyIGFuZAorCQkJCQkJCQkJCQkJCS0tIHNldCB0byB6ZXJvIGJ5IHRoZSBzZW5kZXIKKwktLSBEZWx0YSBQc2V1ZG8gUmFuZ2UgQ29ycmVjdGlvbiAzCisJZGVsdGFQc2V1ZG9SYW5nZUNvcjMgCUlOVEVHRVIgKC0xMjcuLjEyNyksCS0tIFRoaXMgSUUgc2hhbGwgYmUgaWdub3JlZCBieSB0aGUgcmVjZWl2ZXIgYW5kCisJCQkJCQkJCQkJCQkJLS0gc2V0IHRvIHplcm8gYnkgdGhlIHNlbmRlcgorCS0tIERlbHRhIFBzZXVkbyBSYW5nZSBDb3JyZWN0aW9uIDMKKwlkZWx0YVJhbmdlUmF0ZUNvcjMJCUlOVEVHRVIgKC03Li43KQkJCS0tIFRoaXMgSUUgc2hhbGwgYmUgaWdub3JlZCBieSB0aGUgcmVjZWl2ZXIgYW5kCisJCQkJCQkJCQkJCQkJLS0gc2V0IHRvIHplcm8gYnkgdGhlIHNlbmRlcgorfQorCitTYXRlbGxpdGVJRCA6Oj0gSU5URUdFUiAoMC4uNjMpCS0tIGlkZW50aWZpZXMgc2F0ZWxsaXRlCisKKy0tIE5hdmlnYXRpb24gTW9kZWwgSUUKK05hdmlnYXRpb25Nb2RlbCA6Oj0gU0VRVUVOQ0UgeworCW5hdk1vZGVsTGlzdAlTZXFPZk5hdk1vZGVsRWxlbWVudAkKK30KKworLS0gbmF2aWdhdGlvbiBtb2RlbCBzYXRlbGxpdGUgbGlzdAorU2VxT2ZOYXZNb2RlbEVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjE2KSkgT0YgTmF2TW9kZWxFbGVtZW50CisKK05hdk1vZGVsRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworCXNhdGVsbGl0ZUlECQlTYXRlbGxpdGVJRCwJCQkKKwlzYXRTdGF0dXMJCVNhdFN0YXR1cwkJLS0gc2F0ZWxsaXRlIHN0YXR1cworfQorCistLSB0aGUgU3RhdHVzIG9mIHRoZSBuYXZpZ2F0aW9uIG1vZGVsCitTYXRTdGF0dXMgOjo9IENIT0lDRSB7CisJLS0gTmV3IHNhdGVsbGl0ZSwgbmV3IE5hdmlnYXRpb24gTW9kZWwKKwluZXdTYXRlbGxpdGVBbmRNb2RlbFVDCVVuY29tcHJlc3NlZEVwaGVtZXJpcywKKworCS0tIEV4aXN0aW5nIHNhdGVsbGl0ZSwgRXhpc3RpbmcgTmF2aWdhdGlvbiBNb2RlbAorCW9sZFNhdGVsbGl0ZUFuZE1vZGVsCU5VTEwsCisKKwktLSBFeGlzdGluZyBzYXRlbGxpdGUsIG5ldyBOYXZpZ2F0aW9uIE1vZGVsCisJbmV3TmF2aU1vZGVsVUMJCQlVbmNvbXByZXNzZWRFcGhlbWVyaXMsCisJLi4uCit9CisKKy0tIFVuY29tcHJlc3NlZCBzYXRlbGxpdGUgZW1oZW1lcmlzIGFuZCBjbG9jayBjb3JyZWN0aW9ucworVW5jb21wcmVzc2VkRXBoZW1lcmlzIDo6PSBTRVFVRU5DRSB7CisJZXBoZW1Db2RlT25MMglJTlRFR0VSICgwLi4zKSwKKwllcGhlbVVSQQkJSU5URUdFUiAoMC4uMTUpLAorCWVwaGVtU1ZoZWFsdGgJSU5URUdFUiAoMC4uNjMpLAorCWVwaGVtSU9EQwkJSU5URUdFUgkoMC4uMTAyMyksCisJZXBoZW1MMlBmbGFnCUlOVEVHRVIgKDAuLjEpLAorCWVwaGVtU0YxUnN2ZAlFcGhlbWVyaXNTdWJmcmFtZTFSZXNlcnZlZCwKKwllcGhlbVRnZAkJSU5URUdFUiAoLTEyOC4uMTI3KSwKKwllcGhlbVRvYwkJSU5URUdFUiAoMC4uMzc3OTkpLAorCWVwaGVtQUYyCQlJTlRFR0VSICgtMTI4Li4xMjcpLAorCWVwaGVtQUYxCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwllcGhlbUFGMAkJSU5URUdFUiAoLTIwOTcxNTIuLjIwOTcxNTEpLAorCWVwaGVtQ3JzCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwllcGhlbURlbHRhTgkJSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJZXBoZW1NMAkJCUlOVEVHRVIgKC0yMTQ3NDgzNjQ4Li4yMTQ3NDgzNjQ3KSwKKwllcGhlbUN1YwkJSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJZXBoZW1FCQkJSU5URUdFUiAoMC4uNDI5NDk2NzI5NSksCisJZXBoZW1DdXMJCUlOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWVwaGVtQVBvd2VySGFsZglJTlRFR0VSICgwLi40Mjk0OTY3Mjk1KSwKKwllcGhlbVRvZQkJSU5URUdFUiAoMC4uMzc3OTkpLAorCWVwaGVtRml0RmxhZwlJTlRFR0VSICgwLi4xKSwKKwllcGhlbUFPREEJCUlOVEVHRVIgKDAuLjMxKSwKKwllcGhlbUNpYwkJSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJZXBoZW1PbWVnYUEwCUlOVEVHRVIgKC0yMTQ3NDgzNjQ4Li4yMTQ3NDgzNjQ3KSwKKwllcGhlbUNpcwkJSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJZXBoZW1JMAkJCUlOVEVHRVIgKC0yMTQ3NDgzNjQ4Li4yMTQ3NDgzNjQ3KSwKKwllcGhlbUNyYwkJSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJZXBoZW1XCQkJSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAorCWVwaGVtT21lZ2FBRG90CUlOVEVHRVIgKC04Mzg4NjA4Li44Mzg4NjA3KSwKKwllcGhlbUlEb3QJCUlOVEVHRVIgKC04MTkyLi44MTkxKQorfQorCistLSBSZXNlcnZlZCBiaXRzIGluIHN1YmZyYW1lIDEgb2YgbmF2aWdhdGlvbiBtZXNzYWdlCitFcGhlbWVyaXNTdWJmcmFtZTFSZXNlcnZlZCA6Oj0gU0VRVUVOQ0UgeworCXJlc2VydmVkMQkJSU5URUdFUiAoMC4uODM4ODYwNyksCS0tIDIzLWJpdCBmaWVsZAorCXJlc2VydmVkMgkJSU5URUdFUiAoMC4uMTY3NzcyMTUpLAktLSAyNC1iaXQgZmllbGQKKwlyZXNlcnZlZDMJCUlOVEVHRVIgKDAuLjE2Nzc3MjE1KSwJLS0gMjQtYml0IGZpZWxkCisJcmVzZXJ2ZWQ0CQlJTlRFR0VSICgwLi42NTUzNSkJCS0tIDE2LWJpdCBmaWVsZAorfQorCistLSBJb25vc3BoZXJpYyBNb2RlbCBJRQorSW9ub3NwaGVyaWNNb2RlbCA6Oj0gU0VRVUVOQ0UgeworCWFsZmEwCQkJSU5URUdFUiAoLTEyOC4uMTI3KSwKKwlhbGZhMQkJCUlOVEVHRVIgKC0xMjguLjEyNyksCisJYWxmYTIJCQlJTlRFR0VSICgtMTI4Li4xMjcpLAorCWFsZmEzCQkJSU5URUdFUiAoLTEyOC4uMTI3KSwKKwliZXRhMAkJCUlOVEVHRVIgKC0xMjguLjEyNyksCisJYmV0YTEJCQlJTlRFR0VSICgtMTI4Li4xMjcpLAorCWJldGEyCQkJSU5URUdFUiAoLTEyOC4uMTI3KSwKKwliZXRhMwkJCUlOVEVHRVIgKC0xMjguLjEyNykKK30KKworLS0gVW5pdmVyc2FsIFRpbWUgQ29vcmRpbmF0ZSBNb2RlbAorVVRDTW9kZWwgOjo9IFNFUVVFTkNFIHsKKwl1dGNBMQkJCUlOVEVHRVIgKC04Mzg4NjA4Li44Mzg4NjA3KSwKKwl1dGNBMAkJCUlOVEVHRVIgKC0yMTQ3NDgzNjQ4Li4yMTQ3NDgzNjQ3KSwKKwl1dGNUb3QJCQlJTlRFR0VSICgwLi4yNTUpLAorCXV0Y1dOdAkJCUlOVEVHRVIgKDAuLjI1NSksCisJdXRjRGVsdGFUbHMJCUlOVEVHRVIgKC0xMjguLjEyNyksCisJdXRjV05sc2YJCUlOVEVHRVIgKDAuLjI1NSksCisJdXRjRE4JCQlJTlRFR0VSICgtMTI4Li4xMjcpLAorCXV0Y0RlbHRhVGxzZglJTlRFR0VSICgtMTI4Li4xMjcpCit9CisKKy0tIEFsbWFuYWMsIExvbmcgdGVybSBtb2RlbAorLS0gTk9URTogVGhlc2UgYXJlIHBhcmFtZXRlcnMgYXJlIHN1YnNldCBvZiB0aGUgZXBoZW1lcmlzCistLSBOT1RFOiBCdXQgd2l0aCByZWR1Y2VkIHJlc29sdXRpb24gYW5kIGFjY3VyYWN5CitBbG1hbmFjIDo6PSBTRVFVRU5DRSB7CisJYWxhbWFuYWNXTmEJCUlOVEVHRVIgKDAuLjI1NSksCS0tIE9uY2UgcGVyIG1lc3NhZ2UKKworCS0tIG5hdmlnYXRpb24gbW9kZWwgc2F0ZWxsaXRlIGxpc3QuCisJLS0gVGhlIHNpemUgb2YgYWxtYW5hY0xpc3QgaXMgYWN0dWFsbHkgTnVtc19TYXRzX1RvdGFsIGZpZWxkCisJYWxtYW5hY0xpc3QJCVNlcU9mQWxtYW5hY0VsZW1lbnQJCQorfQorU2VxT2ZBbG1hbmFjRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uNjQpKSBPRiBBbG1hbmFjRWxlbWVudAorCistLSBBbG1hbmFjIGluZm8gb25jZSBwZXIgc2F0ZWxsaXRlCitBbG1hbmFjRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworCXNhdGVsbGl0ZUlECQkJU2F0ZWxsaXRlSUQsCisJYWxtYW5hY0UJCQlJTlRFR0VSICgwLi42NTUzNSksCisJYWxhbWFuYWNUb2EJCQlJTlRFR0VSICgwLi4yNTUpLAorCWFsbWFuYWNLc2lpCQkJSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJYWxtYW5hY09tZWdhRG90CQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwlhbG1hbmFjU1ZoZWFsdGgJCUlOVEVHRVIgKDAuLjI1NSksCisJYWxtYW5hY0FQb3dlckhhbGYJSU5URUdFUiAoMC4uMTY3NzcyMTUpLAorCWFsbWFuYWNPbWVnYTAJCUlOVEVHRVIgKC04Mzg4NjA4Li44Mzg4NjA3KSwKKwlhbG1hbmFjVwkJCUlOVEVHRVIgKC04Mzg4NjA4Li44Mzg4NjA3KSwKKwlhbG1hbmFjTTAJCQlJTlRFR0VSICgtODM4ODYwOC4uODM4ODYwNyksCisJYWxtYW5hY0FGMAkJCUlOVEVHRVIgKC0xMDI0Li4xMDIzKSwKKwlhbG1hbmFjQUYxCQkJSU5URUdFUiAoLTEwMjQuLjEwMjMpCit9CisKKy0tIEFjcXVpc2l0aW9uIEFzc2lzdGFuY2UKK0FjcXVpc0Fzc2lzdCA6Oj0gU0VRVUVOQ0UgeworCisJLS0gTnVtYmVyIG9mIFNhdGVsbGl0ZXMgY2FuIGJlIHJlYWQgZnJvbSBhY3F1aXN0TGlzdAorCXRpbWVSZWxhdGlvbglUaW1lUmVsYXRpb24sCisKKwktLSBBY3F1aXNpdGlvbiBhc3Npc3RhbmNlIGxpc3QKKwktLSBUaGUgc2l6ZSBvZiBOdW1iZXIgb2YgU2F0ZWxsaXRlcyBpcyBhY3R1YWxseSBOdW1iZXIgb2YgU2F0ZWxsaXRlcyBmaWVsZAorCWFjcXVpc0xpc3QJCVNlcU9mQWNxdWlzRWxlbWVudAkJCit9CitTZXFPZkFjcXVpc0VsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjE2KSkgT0YgQWNxdWlzRWxlbWVudAorCistLSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gR1BTIHRpbWUgYW5kIGFpci1pbnRlcmZhY2UgdGltaW5nCitUaW1lUmVsYXRpb24gOjo9IFNFUVVFTkNFIHsKKwktLQorCWdwc1RPVwkJR1BTVE9XMjNiLAkJLS0gMjNiIHByZXNlbnRhdGlvbgorCWdzbVRpbWUJCUdTTVRpbWUJCU9QVElPTkFMCit9CisKKy0tIGRhdGEgb2NjdXJpbmcgcGVyIG51bWJlciBvZiBzYXRlbGxpdGVzCitBY3F1aXNFbGVtZW50IDo6PSBTRVFVRU5DRSB7CisJc3ZpZAkJCQkJU2F0ZWxsaXRlSUQsCisKKwktLSBEb3BwbGVyIDB0aCBvcmRlciB0ZXJtLAorCS0tIC01MTIwLjAgLSA1MTE3LjUgSHogKD0gLTIwNDggLSAyMDQ3IHdpdGggMi41IEh6IHJlc29sdXRpb24pCisJZG9wcGxlcjAJCQkJSU5URUdFUiAoLTIwNDguLjIwNDcpLAkKKwlhZGRpb25hbERvcHBsZXIJCQlBZGRpb25hbERvcHBsZXJGaWVsZHMJT1BUSU9OQUwsCisJY29kZVBoYXNlCQkJCUlOVEVHRVIgKDAuLjEwMjIpLAktLSBDb2RlIFBoYXNlCisJaW50Q29kZVBoYXNlCQkJSU5URUdFUiAoMC4uMTkpLAktLSBJbnRlZ2VyIENvZGUgUGhhc2UKKwlncHNCaXROdW1iZXIJCQlJTlRFR0VSICgwLi4zKSwgCS0tIEdQUyBiaXQgbnVtYmVyCisJY29kZVBoYXNlU2VhcmNoV2luZG93CUlOVEVHRVIgKDAuLjE1KSwJLS0gQ29kZSBQaGFzZSBTZWFyY2ggV2luZG93CisJYWRkaW9uYWxBbmdsZQkJCUFkZGlvbmFsQW5nbGVGaWVsZHMJCU9QVElPTkFMCit9CisKK0FkZGlvbmFsRG9wcGxlckZpZWxkcyA6Oj0gU0VRVUVOQ0UgeworCS0tIERvcHBsZXIgMXN0IG9yZGVyIHRlcm0sIC0xLjAgLSArMC41IEh6L3NlYworIC0tICg9IC00MiArICgwIHRvIDYzKSB3aXRoIDEvNDIgSHovc2VjLiByZXNvbHV0aW9uKQorCWRvcHBsZXIxCQkJCUlOVEVHRVIgKDAuLjYzKSwKKwlkb3BwbGVyVW5jZXJ0YWludHkJCUlOVEVHRVIgKDAuLjcpCisgLS0gYSBzZW5kZXIgc2hhbGwgbm90IGVuY29kZSBhbnkgRG9wcGxlclVuY2VydGFpbnR5IHZhbHVlIGluIHRoZSByYW5nZSA1IHRvIDcKKyAtLSBhIHJlY2VpdmVyIHNoYWxsIGlnbm9yZSBhbnkgdmFsdWUgYmV0d2VlbiA1IGFuZCA3LgorfQorCitBZGRpb25hbEFuZ2xlRmllbGRzCTo6PSBTRVFVRU5DRSB7CisJLS0gYXppbXV0aCBhbmdsZSwgMCAtIDM0OC43NSBkZWcgKD0gMCAtIDMxIHdpdGggMTEuMjUgZGVnIHJlc29sdXRpb24pCisJYXppbXV0aAkJCQkJSU5URUdFUiAoMC4uMzEpLAorCS0tIGVsZXZhdGlvbiBhbmdsZSwgMCAtIDc4Ljc1IGRlZyAoPSAwIC0gNyB3aXRoIDExLjI1IGRlZyByZXNvbHV0aW9uKQorCWVsZXZhdGlvbgkJCQlJTlRFR0VSICgwLi43KQorfQorCistLSBSZWFsLVRpbWUgSW50ZWdyaXR5CistLSBudW1iZXIgb2YgYmFkIHNhdGVsbGl0ZXMgY2FuIGJlIHJlYWQgZnJvbSB0aGlzIGVsZW1lbnQKK1NlcU9mLUJhZFNhdGVsbGl0ZVNldCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTYpKSBPRiBTYXRlbGxpdGVJRAorCistLSBFeHRlbnNpb24gRWxlbWVudHMKKworLS0gUmVsZWFzZSA5OCBFeHRlbnNpb25zIGhlcmUKK1JlbDk4LU1zclBvc2l0aW9uLVJlcS1FeHRlbnNpb24gOjo9IFNFUVVFTkNFIHsKKwlyZWw5OC1FeHQtRXhwT1RECQkJUmVsOTgtRXh0LUV4cE9URAkJT1BUSU9OQUwsCS0tIEV4cGVjdGVkT1REIGV4dGVuc2lvbgorCS4uLiwgCisgZ3BzVGltZUFzc2lzdGFuY2VNZWFzdXJlbWVudFJlcXVlc3QgTlVMTCBPUFRJT05BTCwgCisgZ3BzUmVmZXJlbmNlVGltZVVuY2VydGFpbnR5IEdQU1JlZmVyZW5jZVRpbWVVbmNlcnRhaW50eSBPUFRJT05BTAorCistLSBGdXJ0aGVyIFI5OCBleHRlbnNpb25zIGhlcmUKK30KK1JlbDk4LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgeworCXJlbDk4LUV4dC1FeHBPVEQJCQlSZWw5OC1FeHQtRXhwT1RECQlPUFRJT05BTCwJLS0gRXhwZWN0ZWRPVEQgZXh0ZW5zaW9uCisJLi4uLCAKKyBncHNUaW1lQXNzaXN0YW5jZU1lYXN1cmVtZW50UmVxdWVzdCBOVUxMIE9QVElPTkFMLAorIGdwc1JlZmVyZW5jZVRpbWVVbmNlcnRhaW50eSBHUFNSZWZlcmVuY2VUaW1lVW5jZXJ0YWludHkgT1BUSU9OQUwKKworLS0gRnVydGhlciBSOTggZXh0ZW5zaW9ucyBoZXJlCit9CisKKy0tIFJlbGVhc2UgOTggRXhwT1REIGV4dGVuc2lvbgorUmVsOTgtRXh0LUV4cE9URCA6Oj0gU0VRVUVOQ0UgeworLS0gSWYgTXNyQXNzaXN0QlRTIGlzIGluY2x1ZGVkIGluIG1lc3NhZ2UsIG1zckFzc2lzdERhdGEtUjk4LUV4cE9URCBzaGFsbCBiZSBpbmNsdWRlZC4KKwltc3JBc3Npc3REYXRhLVI5OC1FeHBPVEQJCQlNc3JBc3Npc3REYXRhLVI5OC1FeHBPVEQJCQlPUFRJT05BTCwKKworLS0gSWYgU3lzdGVtSW5mb0Fzc2lzdGFEYXRhIGlzIGluY2x1ZGVkIGluIG1lc3NhZ2UsIHN5c3RlbUluZm9Bc3Npc3REYXRhLVI5OC1FeHBPVEQgc2hhbGwgYmUKKy0tIGluY2x1ZGVkLgorCXN5c3RlbUluZm9Bc3Npc3REYXRhLVI5OC1FeHBPVEQJU3lzdGVtSW5mb0Fzc2lzdERhdGEtUjk4LUV4cE9URAlPUFRJT05BTAorfQorCistLSBNc3JBc3Npc3REYXRhIFI5OCBleHRlbnNpb24KK01zckFzc2lzdERhdGEtUjk4LUV4cE9URCA6Oj0gU0VRVUVOQ0UgeworCSBtc3JBc3Npc3RMaXN0LVI5OC1FeHBPVEQJCQkgU2VxT2ZNc3JBc3Npc3RCVFMtUjk4LUV4cE9URAorfQorCistLSBJbmRleGVzIGluIFNlcU9mTXNyQXNzaXN0QlRTLVI5OC1FeHBPVEQgcmVmZXIgdG8gU2VxT2ZNc3JBc3Npc3RCVFMKKy0tIElmIHRoZSBpbmRleCBleGNlZWRzIHRoZSBTZWdPZk1zckFzc2lzdEJUUyByYW5nZSBvciBpZiB0aGVyZSBpcyBvdGhlcgorLS0gaW5jb25zaXN0ZW5jaWVzIGJldHdlZW4gdGhlIEJUUyBpbmRpY2VzLCB0aGUgTVMgc2hhbGwgYXBwbHkgcHJvdG9jb2wKKy0tIGVycm9yIGNhdXNlIGluY29ycmVjdERhdGEKK1NlcU9mTXNyQXNzaXN0QlRTLVI5OC1FeHBPVEQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjE1KSkgT0YgTXNyQXNzaXN0QlRTLVI5OC1FeHBPVEQKKworLS0gVGhpcyBlbGVtZW50IGNvbXBsZXRlcyBNc3JBc3Npc3RCVFMgSUUKK01zckFzc2lzdEJUUy1SOTgtRXhwT1REIDo6PSBTRVFVRU5DRSB7CisJZXhwZWN0ZWRPVEQJCQkJRXhwZWN0ZWRPVEQsCisJZXhwT1REVW5jZXJ0YWludHkJCUV4cE9URFVuY2VydGFpbnR5Cit9CisKKy0tIFN5c3RlbUluZm9Bc3Npc3REYXRhIFI5OCBleHRlbnNpb24KK1N5c3RlbUluZm9Bc3Npc3REYXRhLVI5OC1FeHBPVEQgOjo9IFNFUVVFTkNFIHsKKwlzeXN0ZW1JbmZvQXNzaXN0TGlzdFI5OC1FeHBPVEQgCVNlcU9mU3lzdGVtSW5mb0Fzc2lzdEJUUy1SOTgtRXhwT1RECit9CisKKy0tIFNlcU9mU3lzdGVtSW5mb0Fzc2lzdEJUUy1SOTgtRXhwT1REIGluZGV4IHJlZmVyIHRvIFNlcU9mU3lzdGVtSW5mb0Fzc2lzdEJUUworLS0gSWYgdGhlIGluZGV4IGV4Y2VlZHMgdGhlIFNlZ09mU3lzdGVtSW5mb0Fzc2lzdEJUUyByYW5nZSBvciBpZiB0aGVyZSBpcyBvdGhlcgorLS0gaW5jb25zaXN0ZW5jaWVzIGJldHdlZW4gdGhlIEJUUyBpbmRpY2VzLCB0aGUgTVMgc2hhbGwgYXBwbHkgcHJvdG9jb2wKKy0tIGVycm9yIGNhdXNlIGluY29ycmVjdERhdGEKK1NlcU9mU3lzdGVtSW5mb0Fzc2lzdEJUUy1SOTgtRXhwT1REIDo6PSBTRVFVRU5DRSAoU0laRSgxLi4zMikpIE9GIFN5c3RlbUluZm9Bc3Npc3RCVFMtUjk4LUV4cE9URAorCistLSB3aGV0aGVyIG4udGggaXMgcHJlc2VudCBvciBub3QgPworU3lzdGVtSW5mb0Fzc2lzdEJUUy1SOTgtRXhwT1REIDo6PSBDSE9JQ0UgeworCW5vdFByZXNlbnQJCU5VTEwsCisJcHJlc2VudAkJCUFzc2lzdEJUU0RhdGEtUjk4LUV4cE9URAorfQorCistLSBUaGlzIGVsZW1lbnQgY29tcGxldGVzIEFzc2lzdEJUU0RhdGEgSUUKK0Fzc2lzdEJUU0RhdGEtUjk4LUV4cE9URCA6Oj0gU0VRVUVOQ0UgeworCWV4cGVjdGVkT1RECQkJCUV4cGVjdGVkT1RELAorCWV4cE9URHVuY2VydGFpbnR5CQlFeHBPVERVbmNlcnRhaW50eQktLSBVbmNlcnRhaW50eSBvZiBleHBlY3RlZCBPVEQKK30KKworLS0gRXhwZWN0ZWQgT1REIHZhbHVlIGJldHdlZW4gbmJvciBiYXNlIHN0YXRpb24gYW5kIHJlZmVyZW5jZSBCVFMKKy0tIGF0IE1TJ3MgY3VycmVudCBlc3RpbWF0ZWQgbG9jYXRpb24uCitFeHBlY3RlZE9URCA6Oj0gSU5URUdFUiAoMC4uMTI1MCkKKy0tIFRoZSBFeHBlY3RlZE9URCB2YWx1ZSAxMjUwIHNoYWxsIG5vdCBiZSBlbmNvZGVkIGJ5IHRoZSB0cmFuc21pdHRpbmcgZW50aXR5IGFuZAorLS0gc2hhbGwgYmUgdHJlYXRlZCBieSB0aGUgcmVjZWl2aW5nIGVudGl0eSBhcyAwLgorLS0gVW5jZXJ0YWludHkgb2YgRXhwdGVjdGVkIE9URCBpbiBiaXRzCitFeHBPVERVbmNlcnRhaW50eSA6Oj0gSU5URUdFUigwLi43KQorCistLSBSZWxlYXNlIDk4IGV4dGVuc2lvbnMKKworR1BTUmVmZXJlbmNlVGltZVVuY2VydGFpbnR5IDo6PSBJTlRFR0VSICgwIC4uIDEyNykgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorCitHUFNUaW1lQXNzaXN0YW5jZU1lYXN1cmVtZW50cyA6Oj0gU0VRVUVOQ0UgeworIHJlZmVyZW5jZUZyYW1lTVNCIElOVEVHRVIgKDAgLi4gNjMpLCAtLSBNU0Igb2YgZnJhbWUgbnVtYmVyCisgZ3BzVG93U3VibXMgSU5URUdFUiAoMCAuLiA5OTk5KSBPUFRJT05BTCwgLS0gaW4gdW5pdHMgb2YgMTAwbnMsIGZvciBNUyBiYXNlZCBBR1BTCisgZGVsdGFUb3cgSU5URUdFUiAoMCAuLiAxMjcpIE9QVElPTkFMLCAtLSBmb3IgTVMgYXNzaXN0ZWQgQUdQUworIGdwc1JlZmVyZW5jZVRpbWVVbmNlcnRhaW50eSBHUFNSZWZlcmVuY2VUaW1lVW5jZXJ0YWludHkgT1BUSU9OQUwKK30KKworUmVsLTk4LU1zclBvc2l0aW9uLVJzcC1FeHRlbnNpb24gOjo9IFNFUVVFTkNFIHsKKworCS0tIEZpcnN0IGV4dGVuc2lvbiB0byBSZWxlYXNlIDk4CisJcmVsLTk4LUV4dC1NZWFzdXJlSW5mbwlTRVFVRU5DRSB7CisJCW90ZC1NZWFzdXJlSW5mby1SOTgtRXh0CU9URC1NZWFzdXJlSW5mby1SOTgtRXh0CQlPUFRJT05BTAorCX0sCisJLi4uLCAKKyB0aW1lQXNzaXN0YW5jZU1lYXN1cmVtZW50cyBHUFNUaW1lQXNzaXN0YW5jZU1lYXN1cmVtZW50cyBPUFRJT05BTCAKKyAtLSBGdXJ0aGVyIFI5OCBleHRlbnNpb25zIGhlcmUKK30KKworLS0gVGhpcyBpcyBhbiBhZGRpdGlvbiB0byBPVEQtTWVhc3VyZUluZm8gZWxlbWVudCBkZWZpbmVkIGluIG9yaWdpbmFsIG1lc3NhZ2UsCistLSBJZiBPVEQtTWVhc3VyZUluZm8gaXMgYWJzZW50LCBvciBpZiBvbmUgb3IgbW9yZSBPVEQtTXNyRWxlbWVudFJlc3QgYXJlIHByZXNlbnQKKy0tIE9URC1NZWFzdXJlSW5mby1SOTgtRXh0IHNoYWxsIGJlIGFic2VudC4KKy0tIE9URC1NZWFzdXJlSW5mby1SOTgtRXh0CitPVEQtTWVhc3VyZUluZm8tUjk4LUV4dCA6Oj0gU0VRVUVOQ0UgeworCS0tIE1lYXN1cmVtZW50IGluZm8gZWxlbWVudHMKKwlvdGRNc3JGaXJzdFNldHMtUjk4LUV4dAkJT1RELU1zckVsZW1lbnRGaXJzdC1SOTgtRXh0Cit9CisKKy0tIE9URCBtZWFzdXJlbWVudCBpbmZvcm1hdGlvbiBFeHQgZm9yIHRoZSBmaXJzdCBzZXQgb25seQorT1RELU1zckVsZW1lbnRGaXJzdC1SOTgtRXh0IDo6PSBTRVFVRU5DRSB7CisJLS0gYWRkaXRpb25hbCBtZWFzdXJlZCBuZWlnaGJvcnMgaW4gT1REIG1lYXN1cmVtZW50cworCW90ZC1GaXJzdFNldE1zcnMtUjk4LUV4dCAJU2VxT2ZPVEQtRmlyc3RTZXRNc3JzLVI5OC1FeHQgCU9QVElPTkFMCit9CitTZXFPZk9URC1GaXJzdFNldE1zcnMtUjk4LUV4dCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uNSkpIE9GIE9URC1GaXJzdFNldE1zcnMKKworUmVsLTUtTXNyUG9zaXRpb24tUnNwLUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgeworCisJZXh0ZW5kZWQtcmVmZXJlbmNlCUV4dGVuZGVkLXJlZmVyZW5jZSAJT1BUSU9OQUwsCisJLS0gVGhlIGV4dGVuZGVkLXJlZmVyZW5jZSBzaGFsbCBiZSBpbmNsdWRlZCBieSB0aGUgTVMgaWYgYW5kIG9ubHkgaWYgcHJldmlvdXNseQorCS0tIHJlY2VpdmVkIGZyb20gdGhlIFNNTEMgaW4gYSBNZWFzdXJlIFBvc2l0aW9uIFJlcXVlc3QuIFdoZW4gaW5jbHVkZWQsIHRoZSB2YWx1ZSBzZW50CisJLS0gYnkgdGhlIE1TIHNoYWxsIGVxdWFsIHRoZSB2YWx1ZSByZWNlaXZlZCBmcm9tIHRoZSBTTUxDLgorCisJLS0gZXh0ZW5zaW9uIHRvIFJlbGVhc2UgNSwgZm9yIFJSTFAgcHNldWRvLXNlZ21lbnRhdGlvbiBoZXJlCisJb3RkLU1lYXN1cmVJbmZvLTUtRXh0CU9URC1NZWFzdXJlSW5mby01LUV4dAlPUFRJT05BTCwKKwl1bFBzZXVkb1NlZ0luZAkJCVVsUHNldWRvU2VnSW5kCQkJT1BUSU9OQUwsCS0tIEluY2x1ZGVkIHdoZW4gdXBsaW5rIFJSTFAKKwktLSBQc2V1ZG8tc2VnbWVudGF0aW9uIGlzIHVzZWQsIG5vdCBpbmNsdWRlZCB3aGVuIG5vIHVwbGluayBwc2V1ZG8tc2VnbWVudGF0aW9uIGlzIHVzZWQKKwkuLi4KKwkJCQkJLS0gUG9zc2libHkgbW9yZSBleHRlbnNpb25zIGZvciBSZWxlYXNlIDUgaGVyZSBsYXRlcgorfQorCitFeHRlbmRlZC1yZWZlcmVuY2UgOjo9IFNFUVVFTkNFIHsKKwlzbWxjLWNvZGUJCQlJTlRFR0VSICgwLi42MyksCisJdHJhbnNhY3Rpb24tSUQJCUlOVEVHRVIgKDAuLjI2MjE0MykKK30KKworT1RELU1lYXN1cmVJbmZvLTUtRXh0IDo6PSBTZXFPZk9URC1Nc3JFbGVtZW50UmVzdAorCS0tIGlmIG1vcmUgdGhhbiBvbmUgbWVhc3VyZW1lbnQgc2V0cyBhcmUgcHJlc2VudCB0aGlzIGVsZW1lbnQgaXMgcmVwZWF0ZWQKKwktLSBOdW1iZXJPZlNldHMgLSAxICgtMSA9IGZpcnN0IHNldCkgY29tYmluZWQgaW4gT1RELU1lYXN1cmVJbmZvLTUtRXh0IGFuZAorCS0tIE9URC1NZWFzdXJlSW5mbyAoZS5nLiBpZiBOdW1iZXJPZlNldHMgaXMgMywgdGhlbiBvbmUgb3RkTXNyUmVzdFNldHMgbWF5CisJLS0gYmUgc2VudCBpbiBPVEQtTWVhc3VyZUluZm8tNS1FeHQgYW5kIG9uZSBpbiBPVEQtTWVhc3VyZUluZm8pCisKKy0tIEZpcnN0IHBhcnQgb2YgVXBsaW5rIFJSTFAgUHNldWRvLXNlZ21lbnRhdGlvbiBpbmRpY2F0aW9uLCBwb3NzaWJseSBtb3JlIG1heSBiZSBkZWZpbmVkCistLSBpbiB0aGUgZnV0dXJlIGZvciBzZWdtZW50YXRpb24gd2l0aCBtb3JlIHRoYW4gdHdvIHNlZ21lbnRzLgorVWxQc2V1ZG9TZWdJbmQgOjo9IEVOVU1FUkFURUQgeworCWZpcnN0T2ZNYW55ICgwKSwKKwlzZWNvbmRPZk1hbnkoMSkKK30KKworUmVsNS1Nc3JQb3NpdGlvbi1SZXEtRXh0ZW5zaW9uIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5kZWQtcmVmZXJlbmNlCQkJRXh0ZW5kZWQtcmVmZXJlbmNlLAorCS4uLgorCS0tIFBvc3NpYmx5IG1vcmUgZXh0ZW5zaW9ucyBmb3IgUmVsZWFzZSA1IGhlcmUgbGF0ZXIKK30KKworUmVsNS1Bc3Npc3RhbmNlRGF0YS1FeHRlbnNpb24gOjo9IFNFUVVFTkNFIHsKKwlleHRlbmRlZC1yZWZlcmVuY2UJCQlFeHRlbmRlZC1yZWZlcmVuY2UsCisJLi4uCisKKy0tIFBvc3NpYmx5IG1vcmUgZXh0ZW5zaW9ucyBmb3IgUmVsZWFzZSA1IGhlcmUgbGF0ZXIKK30KKworUmVsLTUtUHJvdG9jb2xFcnJvci1FeHRlbnNpb246Oj0gU0VRVUVOQ0UgeworCWV4dGVuZGVkLXJlZmVyZW5jZQkJCUV4dGVuZGVkLXJlZmVyZW5jZSAJT1BUSU9OQUwsCisJLS0gVGhlIGV4dGVuZGVkLXJlZmVyZW5jZSBzaGFsbCBiZSBpbmNsdWRlZCBieSB0aGUgTVMgaWYgYW5kIG9ubHkgaWYgcHJldmlvdXNseQorCS0tIHJlY2VpdmVkIGZyb20gdGhlIFNNTEMuCisJLS0gV2hlbiBpbmNsdWRlZCwgdGhlIHZhbHVlIHNlbnQgYnkgdGhlIE1TIHNoYWxsIGVxdWFsIHRoZSB2YWx1ZSByZWNlaXZlZCBmcm9tIHRoZSBTTUxDLgorCS4uLgorCisJLS0gUG9zc2libHkgbW9yZSBleHRlbnNpb25zIGZvciBSZWxlYXNlIDUgaGVyZSBsYXRlcgorfQorCistLSBSZWxlYXNlIDcgRXh0ZW5zaW9ucyBoZXJlCisKK1JlbDctTXNyUG9zaXRpb24tUmVxLUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgewordmVsb2NpdHlSZXF1ZXN0ZWQJCSBOVUxMCQkgT1BUSU9OQUwsCisgZ2Fuc3NQb3NpdGlvbk1ldGhvZCBHQU5TU1Bvc2l0aW9uaW5nTWV0aG9kIE9QVElPTkFMLAorIGdhbnNzLUFzc2lzdERhdGEgR0FOU1MtQXNzaXN0RGF0YSBPUFRJT05BTCwKKyBnYW5zc0NhcnJpZXJQaGFzZU1lYXN1cmVtZW50UmVxdWVzdCBOVUxMIE9QVElPTkFMLAorIGdhbnNzVE9ER1NNVGltZUFzc29jaWF0aW9uTWVhc3VyZW1lbnRSZXF1ZXN0IE5VTEwgT1BUSU9OQUwsCityZXF1aXJlZFJlc3BvbnNlVGltZQlSZXF1aXJlZFJlc3BvbnNlVGltZQlPUFRJT05BTCwKKwkuLi4KKwktLSBGdXJ0aGVyIFJlbGVhc2UgNyBleHRlbnRpb25zIGhlcmUKK30KKworLS0gYWRkaXRpb25hbCBzYXRlbGxpdGUgc3lzdGVtcyBtYXkgYmUgYWRkZWQgaW4gZnV0dXJlIHZlcnNpb25zIG9mIHRoZSBwcm90b2NvbAorR0FOU1NQb3NpdGlvbmluZ01ldGhvZCA6Oj0gQklUIFNUUklORyB7CisJZ3BzICgwKSwKKwlnYWxpbGVvICgxKX0gKFNJWkUgKDIuLjE2KSkKKworR0FOU1MtQXNzaXN0RGF0YSA6Oj0gU0VRVUVOQ0UgeworCWdhbnNzLWNvbnRyb2xIZWFkZXIJR0FOU1MtQ29udHJvbEhlYWRlcgorfQorCitHQU5TUy1Db250cm9sSGVhZGVyIDo6PSBTRVFVRU5DRSB7CisgZ2Fuc3NDb21tb25Bc3Npc3REYXRhIEdBTlNTQ29tbW9uQXNzaXN0RGF0YSBPUFRJT05BTCwKKyBnYW5zc0dlbmVyaWNBc3Npc3REYXRhTGlzdCBTZXFPZkdBTlNTR2VuZXJpY0Fzc2lzdERhdGFFbGVtZW50IE9QVElPTkFMCit9CisKKy0tIEdBTlNTIENvbW1vbiBBc3Npc3RhbmNlIERhdGEgRWxlbWVudHMKK0dBTlNTQ29tbW9uQXNzaXN0RGF0YSA6Oj0gU0VRVUVOQ0UgeworCWdhbnNzUmVmZXJlbmNlVGltZQkJIEdBTlNTUmVmZXJlbmNlVGltZQkJIE9QVElPTkFMLAorCWdhbnNzUmVmTG9jYXRpb24JCQlHQU5TU1JlZkxvY2F0aW9uCQkgT1BUSU9OQUwsCisJZ2Fuc3NJb25vc3BoZXJpY01vZGVsCQlHQU5TU0lvbm9zcGhlcmljTW9kZWwJIE9QVElPTkFMLAorCS4uLgorfQorCistLSBMaXN0IG9mIEdBTlNTIEdlbmVyaWMgQXNzaXN0YW5jZSBEYXRhIEVsZW1lbnRzLCB1cCB0byA4IEdBTlNTCitTZXFPZkdBTlNTR2VuZXJpY0Fzc2lzdERhdGFFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSAoMS4uOCkpIE9GIEdBTlNTR2VuZXJpY0Fzc2lzdERhdGFFbGVtZW50CisKKy0tIEdBTlNTIEdlbmVyaWMgQXNzaXN0YW5jZSBEYXRhIEVsZW1lbnRzCitHQU5TU0dlbmVyaWNBc3Npc3REYXRhRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworIGdhbnNzSUQgSU5URUdFUiAoMC4uNykgT1BUSU9OQUwsIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKyBnYW5zc1RpbWVNb2RlbCBTZXFPZkdBTlNTVGltZU1vZGVsIE9QVElPTkFMLAorCWdhbnNzRGlmZkNvcnJlY3Rpb25zCQkgR0FOU1NEaWZmQ29ycmVjdGlvbnMJIE9QVElPTkFMLAorCWdhbnNzTmF2aWdhdGlvbk1vZGVsCQkgR0FOU1NOYXZNb2RlbCBPUFRJT05BTCwKKwlnYW5zc1JlYWxUaW1lSW50ZWdyaXR5CSBHQU5TU1JlYWxUaW1lSW50ZWdyaXR5CSBPUFRJT05BTCwKKwlnYW5zc0RhdGFCaXRBc3Npc3QJCQkgR0FOU1NEYXRhQml0QXNzaXN0CQkgT1BUSU9OQUwsCisJZ2Fuc3NSZWZNZWFzdXJlbWVudEFzc2lzdAkgR0FOU1NSZWZNZWFzdXJlbWVudEFzc2lzdCBPUFRJT05BTCwKKyBnYW5zc0FsbWFuYWNNb2RlbCBHQU5TU0FsbWFuYWNNb2RlbCBPUFRJT05BTCwKKyBnYW5zc1VUQ01vZGVsIEdBTlNTVVRDTW9kZWwgT1BUSU9OQUwsCisJLi4uCit9CisKKy0tIEdBTlNTIENPTU1PTiBBU1NJU1RBTkNFIERBVEEgRUxFTUVOVFMKKworLS0gR0FOU1MgUmVmZXJlbmNlIFRpbWUgSUUKK0dBTlNTUmVmZXJlbmNlVGltZSA6Oj0gU0VRVUVOQ0UgeworCWdhbnNzUmVmVGltZUluZm8JCQkgR0FOU1NSZWZUaW1lSW5mbywKKwlnYW5zc1RPRC1HU01UaW1lQXNzb2NpYXRpb24gR0FOU1NUT0QtR1NNVGltZUFzc29jaWF0aW9uIE9QVElPTkFMCit9CisKKy0tIEdBTlNTIFJlZmVyZW5jZSBUaW1lIGluY2x1ZGVzIEdBTlNTIFRPRCwgR0FOU1MgRGF5LCB1bmNlcnRhaW50eQorR0FOU1NSZWZUaW1lSW5mbyA6Oj0gU0VRVUVOQ0UgeworCWdhbnNzRGF5CQkJIElOVEVHRVIoMCAuLiA4MTkxKSBPUFRJT05BTCwKKyBnYW5zc1RPRCBHQU5TU1RPRCwKKwlnYW5zc1RPRFVuY2VydGFpbnR5CSBHQU5TU1RPRFVuY2VydGFpbnR5IE9QVElPTkFMLAorIGdhbnNzVGltZUlEIElOVEVHRVIgKDAgLi4gNykgT1BUSU9OQUwKK30KKworLS0gR0FOU1MgVE9EIGludGVnZXIgc2Vjb25kcworR0FOU1NUT0QgOjo9IElOVEVHRVIgKDAgLi4gODYzOTkpCisKKy0tIEdBTlNTIFRPRCB1bmNlcnRhaW50eQorR0FOU1NUT0RVbmNlcnRhaW50eSA6Oj0gSU5URUdFUiAoMCAuLiAxMjcpIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKworLS0gR0FOU1MgVE9ELUdTTSBUaW1lIGFzc29jaWF0aW9uIAorR0FOU1NUT0QtR1NNVGltZUFzc29jaWF0aW9uIDo6PSBTRVFVRU5DRSB7CisJYmNjaENhcnJpZXIJCUJDQ0hDYXJyaWVyLAktLSBCQ0NIIGNhcnJpZXIKKwlic2ljCQkJQlNJQywJCQktLSBCU0lDCisJZnJhbWVOdW1iZXIJCUZyYW1lTnVtYmVyLAorCXRpbWVTbG90CQlUaW1lU2xvdCwKKwliaXROdW1iZXIJCUJpdE51bWJlciwKKyBmcmFtZURyaWZ0IEZyYW1lRHJpZnQgT1BUSU9OQUwKK30KKworLS0gRnJhbWUgZHJpZnQKK0ZyYW1lRHJpZnQgOjo9IElOVEVHRVIoLTY0IC4uIDYzKQorCistLSBHQU5TUyBSZWZlcmVuY2UgTG9jYXRpb24gSUUKK0dBTlNTUmVmTG9jYXRpb24gOjo9IFNFUVVFTkNFIHsKKwl0aHJlZURMb2NhdGlvbgkJCUV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbgorfQorCistLSBHQU5TUyBJb25vc3BoZXJpYyBNb2RlbCBJRQorLS0gR0FOU1MgSW9ub3NwaGVyaWMgTW9kZWwgY29uc2lzdHMgb2YgTmVRdWljayBtb2RlbCBwYXJhbWV0ZXJzIGFuZCBzdG9ybSBmbGFncworCitHQU5TU0lvbm9zcGhlcmljTW9kZWwgOjo9IFNFUVVFTkNFIHsKKyBnYW5zc0lvbm9Nb2RlbCBHQU5TU0lvbm9zcGhlcmVNb2RlbCwKKyBnYW5zc0lvbm9TdG9ybUZsYWdzIEdBTlNTSW9ub1N0b3JtRmxhZ3MgT1BUSU9OQUwsCisgLi4uCit9CisKKy0tIEdBTlNTIGlvbm9zcGhlcmUgbW9kZWwuIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXggCitHQU5TU0lvbm9zcGhlcmVNb2RlbCA6Oj0gU0VRVUVOQ0UgeworIGFpMCBJTlRFR0VSICgwIC4uIDQwOTUpLAorIGFpMSBJTlRFR0VSICgwIC4uIDQwOTUpLAorIGFpMiBJTlRFR0VSICgwIC4uIDQwOTUpCit9CisKKy0tIEdBTlNTIGlvbm9zcGhlcmUgc3Rvcm0gZmxhZ3MKK0dBTlNTSW9ub1N0b3JtRmxhZ3MgOjo9IFNFUVVFTkNFIHsKKwlpb25vU3Rvcm1GbGFnMQlJTlRFR0VSICgwIC4uIDEpLAorCWlvbm9TdG9ybUZsYWcyCUlOVEVHRVIgKDAgLi4gMSksCisJaW9ub1N0b3JtRmxhZzMJSU5URUdFUiAoMCAuLiAxKSwKKwlpb25vU3Rvcm1GbGFnNAlJTlRFR0VSICgwIC4uIDEpLAorCWlvbm9TdG9ybUZsYWc1CUlOVEVHRVIgKDAgLi4gMSkKK30KKworLS0gR0FOU1MgR0VORVJJQyBBU1NJU1RBTkNFIERBVEEgRUxFTUVOVFMKKworLS0gR0FOU1MgVGltZSBNb2RlbCBJRSBjb25zaXN0cyBvZiB0aW1lIG9mZnNldCBhbmQgZmlyc3QgYW5kIHNlY29uZCBvcmRlciBwYXJhbWV0ZXJzIHRvIHJlbGF0ZSBHTlNTCistLSBzcGVjaWZpYyBzeXN0ZW0gdGltZSB0byBzZWxlY3RlZCB0aW1lIHJlZmVyZW5jZQorU2VxT2ZHQU5TU1RpbWVNb2RlbCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uNykpIE9GIEdBTlNTVGltZU1vZGVsRWxlbWVudAorCitHQU5TU1RpbWVNb2RlbEVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwlnYW5zc1RpbWVNb2RlbFJlZlRpbWUJCUlOVEVHRVIoMCAuLiA2NTUzNSksCisJdEEwCQkgVEEwLAorCXRBMQkJIFRBMSBPUFRJT05BTCwKKwl0QTIJCSBUQTIgT1BUSU9OQUwsCisgZ25zc1RPSUQgSU5URUdFUiAoMCAuLiA3KSwKKyB3ZWVrTnVtYmVyIElOVEVHRVIgKDAgLi4gODE5MSkgT1BUSU9OQUwgCit9CisKKy0tIEdBTlNTIHRpbWUgbW9kZWwgcGFyYW1ldGVyIEEwCitUQTAgOjo9IElOVEVHRVIgKC0yMTQ3NDgzNjQ4IC4uIDIxNDc0ODM2NDcpCisKKy0tIEdBTlNTIHRpbWUgbW9kZWwgcGFyYW1ldGVyIEExCitUQTEgOjo9IElOVEVHRVIgKC04Mzg4NjA4IC4uIDgzODg2MDcpCisKKy0tIEdBTlNTIHRpbWUgbW9kZWwgcGFyYW1ldGVyIEEyCitUQTIgOjo9IElOVEVHRVIgKC02NCAuLiA2MykKKworLS0gREdBTlNTIENvcnJlY3Rpb25zIElFCitHQU5TU0RpZmZDb3JyZWN0aW9ucyA6Oj0gU0VRVUVOQ0UgeworCWRnYW5zc1JlZlRpbWUJCUlOVEVHRVIgKDAgLi4gMTE5KSwJIC0tIERHQU5TUyByZWZlcmVuY2UgdGltZQorCisJLS0gTl9TR05fVFlQRSBjYW4gYmUgcmVhZCBmcm9tIG51bWJlciBvZiBlbGVtZW50cyBvZiBzZ25UeXBlTGlzdAorCXNnblR5cGVMaXN0CQkgU2VxT2ZTZ25UeXBlRWxlbWVudAorfQorCitTZXFPZlNnblR5cGVFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSAoMS4uMykpIE9GIFNnblR5cGVFbGVtZW50IC0tIG1heCB0aHJlZSBzaWduYWxzIHBlciBHTlNTCisKKy0tIERHQU5TUyBzaWduYWwgdHlwZSBlbGVtZW50LCBvbmNlIHBlciBHTlNTIHNpZ25hbCB0eXBlIGluY2x1ZGVkIGluIERHQU5TUworU2duVHlwZUVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwlnYW5zc1NpZ25hbElECQkgR0FOU1NTaWduYWxJRCBPUFRJT05BTCwgLS0gc2lnbmFsIHR5cGUgaWRlbnRpdHkKKyBnYW5zc1N0YXR1c0hlYWx0aCBJTlRFR0VSICgwIC4uIDcpLAorCS0tIE5fU0dOIGNhbiBiZSByZWFkIGZyb20gbnVtYmVyIG9mIGVsZW1lbnRzIG9mIGRnYW5zc1Nnbkxpc3QKKyBkZ2Fuc3NTZ25MaXN0IFNlcU9mREdBTlNTU2duRWxlbWVudAorfQorCitHQU5TU1NpZ25hbElEIDo6PSBJTlRFR0VSICgwIC4uIDMpCS0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKK1NlcU9mREdBTlNTU2duRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUgKDEuLjE2KSkgT0YgREdBTlNTU2duRWxlbWVudAorCistLSBudW1iZXIgb2YgY29ycmVjdGlvbiBmb3Igc2lnbmFscworREdBTlNTU2duRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworCXN2SUQJCSBTVklELCAtLSBTYXRlbGxpdGUgaWRlbnRpdHkKKworLS0tIFNlcXVlbmNlIG51bWJlciBmb3IgR0FOU1MgTmF2aWdhdGlvbiBNb2RlbCB0aGF0IG1hdGNoZXMgdGhlIERHQU5TUyBjb3JyZWN0aW9uIHNldAorCWlvZCAJCQlJTlRFR0VSICgwIC4uIDEwMjMpLAorCisJLS0gVXNlciBEaWZmZXJlbnRpYWwgUmFuZ2UgRXJyb3IKKwl1ZHJlCQkJSU5URUdFUiAoMC4uMyksCQkKKworCS0tIFBzZXVkbyBSYW5nZSBDb3JyZWN0aW9uLCByYW5nZSBpcworCS0tIC02NTUuMDQgLSArNjU1LjA0LAorCXBzZXVkb1JhbmdlQ29yCUlOVEVHRVIgKC0yMDQ3Li4yMDQ3KSwgCQorCisJLS0gUHNldWRvIFJhbmdlIFJhdGUgQ29ycmVjdGlvbiwgcmFuZ2UgaXMKKwktLSAtNC4wNjQgLSArNC4wNjQsCisJcmFuZ2VSYXRlQ29yCUlOVEVHRVIgKC0xMjcuLjEyNykKK30KKworU1ZJRCA6Oj0gSU5URUdFUiAoMCAuLiA2MykJLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorCistLSBHQU5TUyBOYXZpZ2F0aW9uIE1vZGVsIElFCitHQU5TU05hdk1vZGVsIDo6PSBTRVFVRU5DRSB7Cisgbm9uQnJvYWRjYXN0SW5kRmxhZyBJTlRFR0VSICgwIC4uIDEpLAorIHRvZU1TQiBJTlRFR0VSICgwIC4uIDMxKSBPUFRJT05BTCwgLS0gNSBNU0Igb2YgdG9lIGFuZCB0b2MgCisgZU1TQiBJTlRFR0VSICgwIC4uIDEyNykgT1BUSU9OQUwsCisgc3FydEFNQlMgSU5URUdFUiAoMCAuLiA2MykgT1BUSU9OQUwsCisJZ2Fuc3NTYXRlbGxpdGVMaXN0IFNlcU9mR0FOU1NTYXRlbGxpdGVFbGVtZW50Cit9CisKK1NlcU9mR0FOU1NTYXRlbGxpdGVFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSgxLi4zMikpIE9GIEdBTlNTU2F0ZWxsaXRlRWxlbWVudAorCitHQU5TU1NhdGVsbGl0ZUVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwlzdklEIFNWSUQsCisgc3ZIZWFsdGggSU5URUdFUiAoLTcgLi4gMTMpLCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisgaW9kIElOVEVHRVIgKDAgLi4gMTAyMyksIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKyBnYW5zc0Nsb2NrTW9kZWwgR0FOU1NDbG9ja01vZGVsLCAKKyBnYW5zc09yYml0TW9kZWwgR0FOU1NPcmJpdE1vZGVsLCAKKyAuLi4KK30KKworLS0gR0FOU1Mgb3JiaXQgbW9kZWwgZm9yIHRoZSBHTlNTIHNhdGVsbGl0ZSBhY2NvcmRpbmcgdG8gdGhlIGNob2ljZQorR0FOU1NPcmJpdE1vZGVsIDo6PSBDSE9JQ0UgeworCWtlcGxlcmlhblNldAkgTmF2TW9kZWwtS2VwbGVyaWFuU2V0LAkKKyAuLi4KK30KKworLS0gTmF2aWdhdGlvbiBtb2RlbCBpbiBLZXBsZXJpYW4gcGFyYW1ldGVycworTmF2TW9kZWwtS2VwbGVyaWFuU2V0IDo6PSBTRVFVRU5DRSB7Cisga2VwbGVyVG9lTFNCIElOVEVHRVIgKDAgLi4gNTExKSwgLS0gOUxTQiBhcmUgZ2l2ZW4gaW4gR0FOU1NOYXZpZ2F0aW9uTW9kZWwKKwlrZXBsZXJXCQkJIElOVEVHRVIgKC0yMTQ3NDgzNjQ4Li4yMTQ3NDgzNjQ3KSwKKwlrZXBsZXJEZWx0YU4JIElOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWtlcGxlck0wCQkgSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAorCWtlcGxlck9tZWdhRG90CSBJTlRFR0VSICgtODM4ODYwOC4uODM4ODYwNyksCisJa2VwbGVyRUxTQiAJIElOVEVHRVIgKDAuLjMzNTU0NDMxKSwKKwlrZXBsZXJJRG90CQkgSU5URUdFUiAoLTgxOTIuLjgxOTEpLAorCWtlcGxlckFQb3dlckhhbGZMU0IgSU5URUdFUiAoMC4uIDY3MTA4ODYzKSwKKwlrZXBsZXJJMAkJIElOVEVHRVIgKC0yMTQ3NDgzNjQ4Li4yMTQ3NDgzNjQ3KSwKKwlrZXBsZXJPbWVnYTAgSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAorCWtlcGxlckNycwkJIElOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWtlcGxlckNpcwkJIElOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWtlcGxlckN1cwkJIElOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWtlcGxlckNyYwkJIElOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWtlcGxlckNpYwkJIElOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWtlcGxlckN1YwkJIElOVEVHRVIgKC0zMjc2OC4uMzI3NjcpCit9CisKKy0tIEdBTlNTIGNsb2NrIG1vZGVsIGZvciB0aGUgR05TUyBzYXRlbGxpdGUgYWNjb3JkaW5nIHRvIHRoZSBjaG9pY2UKK0dBTlNTQ2xvY2tNb2RlbCA6Oj0gQ0hPSUNFIHsKKwlzdGFuZGFyZENsb2NrTW9kZWxMaXN0CSBTZXFPZlN0YW5kYXJkQ2xvY2tNb2RlbEVsZW1lbnQsCQorIC4uLgorfQorCitTZXFPZlN0YW5kYXJkQ2xvY2tNb2RlbEVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjIpKSBPRiBTdGFuZGFyZENsb2NrTW9kZWxFbGVtZW50CisKK1N0YW5kYXJkQ2xvY2tNb2RlbEVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKyBzdGFuQ2xvY2tUb2NMU0IgSU5URUdFUiAoMCAuLiA1MTEpLCAtLSA5TFNCIG9mIHRpbWUgb2YgY2xvY2sKKyBzdGFuQ2xvY2tBRjIgSU5URUdFUiAoLTIwNDggLi4gMjA0NyksIAorIHN0YW5DbG9ja0FGMSBJTlRFR0VSICgtMTMxMDcyIC4uIDEzMTA3MSksIAorIHN0YW5DbG9ja0FGMCBJTlRFR0VSICgtMTM0MjE3NzI4IC4uIDEzNDIxNzcyNyksCisgc3RhbkNsb2NrVGdkIElOVEVHRVIgKC01MTIgLi4gNTExKSBPUFRJT05BTCwKKyBzdGFuTW9kZWxJRCBJTlRFR0VSICgwIC4uIDEpIE9QVElPTkFMLAorIC4uLgorfSAKKworLS0gR0FOU1MgUmVhbC1UaW1lIEludGVncml0eSBJRQorR0FOU1NSZWFsVGltZUludGVncml0eSA6Oj0gU0VRVUVOQ0UgeworIC0tIGxpc3Qgb2YgYmFkIHNpZ25hbHMKKyAtLSBOQlMgY2FuIGJlIHJlYWQgZnJvbSBudW1iZXIgb2YgZWxlbWVudHMgaW4gU2VxT2YtQmFkU2lnbmFsU2V0CisgZ2Fuc3NCYWRTaWduYWxMaXN0IFNlcU9mQmFkU2lnbmFsRWxlbWVudAorfQorCitTZXFPZkJhZFNpZ25hbEVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjE2KSkgT0YgQmFkU2lnbmFsRWxlbWVudAorCitCYWRTaWduYWxFbGVtZW50IDo6PSBTRVFVRU5DRSB7CisgYmFkU1ZJRCBTVklELCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisgYmFkU2lnbmFsSUQgSU5URUdFUiAoMCAuLiAzKSBPUFRJT05BTCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4Cit9CisKKworLS0gR0FOU1MgRGF0YSBCaXQgQXNzaXN0YW5jZSBJRQorR0FOU1NEYXRhQml0QXNzaXN0IDo6PSBTRVFVRU5DRSB7CisgZ2Fuc3NUT0QgSU5URUdFUiAoMCAuLiA1OSksCisgc3ZJRCBTVklELAorIGdhbnNzRGF0YVR5cGVJRCBJTlRFR0VSICgwIC4uIDIpLCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisgLS0gbGlzdCBvZiBuYXZpZ2F0aW9uIGRhdGEgYml0cworIC0tIE5fQklUIGNhbiBiZSByZWFkIGZyb20gbnVtYmVyIG9mIGVsZW1lbnRzIGluIFNlcU9mLURhdGFCaXRzCisgZ2Fuc3NEYXRhQml0cyBTZXFPZi1HQU5TU0RhdGFCaXRzCit9CisKK1NlcU9mLUdBTlNTRGF0YUJpdHMgOjo9IFNFUVVFTkNFIChTSVpFKDEgLi4gMTAyNCkpIE9GIEdBTlNTRGF0YUJpdAorR0FOU1NEYXRhQml0IDo6PSBJTlRFR0VSKDAgLi4gMSkKKworLS0gR0FOU1MgUmVmZXJlbmNlIE1lYXN1cmVtZW50IEFzc2lzdGFuY2UgSUUKKy0tIENvZGUgYW5kIERvcHBsZXIgYXNzaXN0YW5jZSBmcm9tIHRoZSBuZXR3b3JrLiAKK0dBTlNTUmVmTWVhc3VyZW1lbnRBc3Npc3QgOjo9IFNFUVVFTkNFIHsKKyBnYW5zc1NpZ25hbElEIElOVEVHRVIgKDAgLi4gMykgT1BUSU9OQUwsIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKyBnYW5zc1JlZk1lYXNBc3NpdExpc3QgU2VxT2ZHQU5TU1JlZk1lYXN1cmVtZW50RWxlbWVudAorfQorCitTZXFPZkdBTlNTUmVmTWVhc3VyZW1lbnRFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSgxIC4uIDE2KSkgT0YgR0FOU1NSZWZNZWFzdXJlbWVudEVsZW1lbnQKKworR0FOU1NSZWZNZWFzdXJlbWVudEVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKyBzdklEIFNWSUQsCisJLS0gRG9wcGxlciAwdGggb3JkZXIgdGVybSwKKwktLSAtMTAyNCBtL3MgdG8gMTAyMy41IG0vcyB3aXRoIDAuNSBtL3MgcmVzb2x1dGlvbikKKwlkb3BwbGVyMAkJCQlJTlRFR0VSICgtMjA0OCAuLiAyMDQ3KSwJLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorCWFkZGl0aW9uYWxEb3BwbGVyCQlBZGRpdGlvbmFsRG9wcGxlckZpZWxkcwkgT1BUSU9OQUwsCisJY29kZVBoYXNlCQkJCUlOVEVHRVIgKDAgLi4gMTAyMiksCSAtLSBDb2RlIFBoYXNlIGluIG1zCisJaW50Q29kZVBoYXNlCQkJSU5URUdFUiAoMCAuLiAxMjcpLAkgLS0gSW50ZWdlciBDb2RlIFBoYXNlIGluIG1zCisJY29kZVBoYXNlU2VhcmNoV2luZG93CUlOVEVHRVIgKDAgLi4gMzEpLAkgLS0gQ29kZSBQaGFzZSBTZWFyY2ggV2luZG93LCBzZWUgQW5uZXgKKwlhZGRpdGlvbmFsQW5nbGUJCQlBZGRpb25hbEFuZ2xlRmllbGRzCQkgT1BUSU9OQUwsCisgLi4uCit9CisKK0FkZGl0aW9uYWxEb3BwbGVyRmllbGRzIDo6PSBTRVFVRU5DRSB7CisJLS0gRG9wcGxlciAxc3Qgb3JkZXIgdGVybSwgLTAuMiAtICswLjEgbS9zMgorCWRvcHBsZXIxCQkJCUlOVEVHRVIgKDAuLjYzKSwKKwlkb3BwbGVyVW5jZXJ0YWludHkJCUlOVEVHRVIgKDAuLjQpCit9CisKKy0tIEdBTlNTIEFsbWFuYWMgTW9kZWwgSUUKK0dBTlNTQWxtYW5hY01vZGVsIDo6PSBTRVFVRU5DRSB7Cisgd2Vla051bWJlciBJTlRFR0VSICgwIC4uIDI1NSksCisgc3ZJRE1hc2sgU1ZJRE1BU0ssCisgdG9hIElOVEVHRVIgKDAgLi4gMjU1KSBPUFRJT05BTCwKKyBpb2RhIElOVEVHRVIgKDAgLi4gMykgT1BUSU9OQUwsCisgZ2Fuc3NBbG1hbmFjTGlzdCBTZXFPZkdBTlNTQWxtYW5hY0VsZW1lbnQKK30KKworLS0gU1YgSUQgTWFzaywgTFNCIGZvciBJRCAxIGFuZCBNU0IgZm9yIElEIDM2CitTVklETUFTSyA6Oj0gQklUIFNUUklORyAoU0laRSAoMS4uMzYpKQorCitTZXFPZkdBTlNTQWxtYW5hY0VsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEgLi4gMzYpKSBPRiBHQU5TU0FsbWFuYWNFbGVtZW50CisKKy0tIEdBTlNTIEFsbWFuYWMgTW9kZWwgCitHQU5TU0FsbWFuYWNFbGVtZW50IDo6PSBDSE9JQ0UgeworCWtlcGxlcmlhbkFsbWFuYWNTZXQJIEFsbWFuYWMtS2VwbGVyaWFuU2V0LAkKKyAuLi4KK30KKworLS0gQWxtYW5hYyBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBLZXBsZXJpYW4gcGFyYW1ldGVycworQWxtYW5hYy1LZXBsZXJpYW5TZXQgOjo9IFNFUVVFTkNFIHsKKyAJa2VwQWxtYW5hY0UJCQkgSU5URUdFUiAoMCAuLiAyMDQ3KSwKKwlrZXBBbG1hbmFjRGVsdGFJCQlJTlRFR0VSICgtMTAyNCAuLiAxMDIzKSwKKwlrZXBBbG1hbmFjT21lZ2FEb3QJCUlOVEVHRVIgKC0xMDI0IC4uIDEwMjMpLAorIGtlcFNWSGVhbHRoIElOVEVHRVIgKDAgLi4gMTUpLCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisJa2VwQWxtYW5hY0FQb3dlckhhbGYJSU5URUdFUiAoLTY1NTM2IC4uIDY1NTM1KSwKKwlrZXBBbG1hbmFjT21lZ2EwCQlJTlRFR0VSICgtMzI3NjggLi4gMzI3NjcpLAorCWtlcEFsbWFuYWNXCQkJIElOVEVHRVIgKC0zMjc2OCAuLiAzMjc2NyksCisJa2VwQWxtYW5hY00wCQkJSU5URUdFUiAoLTMyNzY4IC4uIDMyNzY3KSwKKwlrZXBBbG1hbmFjQUYwCQkJSU5URUdFUiAoLTgxOTIgLi4gODE5MSksCisJa2VwQWxtYW5hY0FGMQkJCUlOVEVHRVIgKC0xMDI0Li4xMDIzKQorfQorCistLSBHQU5TUyBVbml2ZXJzYWwgVGltZSBDb29yZGluYXRlIE1vZGVsCitHQU5TU1VUQ01vZGVsIDo6PSBTRVFVRU5DRSB7CisJZ2Fuc3NVdGNBMQkJCUlOVEVHRVIgKC04Mzg4NjA4Li44Mzg4NjA3KSwKKwlnYW5zc1V0Y0EwCQkJSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAorCWdhbnNzVXRjVG90CQkJSU5URUdFUiAoMC4uMjU1KSwKKwlnYW5zc1V0Y1dOdAkJCUlOVEVHRVIgKDAuLjI1NSksCisJZ2Fuc3NVdGNEZWx0YVRscwlJTlRFR0VSICgtMTI4Li4xMjcpLAorCWdhbnNzVXRjV05sc2YJCUlOVEVHRVIgKDAuLjI1NSksCisJZ2Fuc3NVdGNETgkJCUlOVEVHRVIgKC0xMjguLjEyNyksCisJZ2Fuc3NVdGNEZWx0YVRsc2YJSU5URUdFUiAoLTEyOC4uMTI3KQorfQorCistLVJlcXVpcmVkIE1lYXN1cmVtZW50IFJlcXVlc3QgUmVzcG9uc2UgVGltZSwgcmFuZ2UgaXMgMSB0byAxMjggc2Vjb25kcy4gCitSZXF1aXJlZFJlc3BvbnNlVGltZSA6Oj0gSU5URUdFUiAgKDEuLjEyOCkKKworUmVsLTctTXNyUG9zaXRpb24tUnNwLUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgeworCisJdmVsRXN0aW1hdGUgCVZlbG9jaXR5RXN0aW1hdGUgT1BUSU9OQUwsCisgLS0gSG9yaXpvbnRhbCBWZWxvY2l0eQorIC0tIEhvcml6b250YWwgd2l0aCBWZXJ0aWNhbCBWZWxvY2l0eQorIC0tIEhvcml6b250YWwgVmVsb2NpdHkgd2l0aCBVbmNlcnRhaW50eQorIC0tIEhvcml6b250YWwgd2l0aCBWZXJ0aWNhbCBWZWxvY2l0eSBhbmQgVW5jZXJ0YWludHkKKyBnYW5zc0xvY2F0aW9uSW5mbyBHQU5TU0xvY2F0aW9uSW5mbyBPUFRJT05BTCwKKyBnYW5zc01lYXN1cmVJbmZvIEdBTlNTTWVhc3VyZUluZm8gT1BUSU9OQUwsCisJLi4uCistLSBGdXJ0aGVyIFJlbGVhc2UgNyBleHRlbnNpb25zIGhlcmUKK30KKworLS0gR0FOU1MgTG9jYXRpb24gSW5mb3JtYXRpb24gY29udGFpbnMgbG9jYXRpb24gZXN0aW1hdGUsIHRpbWUgc3RhbXAgd2l0aCB1bmNlcnRhaW50eSAKKy0tIGFuZCBvcHRpb25hbGx5IFJlZmVyZW5jZSBGcmFtZSBmaWVsZAorR0FOU1NMb2NhdGlvbkluZm8gOjo9IFNFUVVFTkNFIHsKKyByZWZlcmVuY2VGcmFtZSBSZWZlcmVuY2VGcmFtZSBPUFRJT05BTCwgLS0gUmVmZXJlbmNlIEZyYW1lIE51bWJlcgorIGdhbnNzVE9EbSBHQU5TU1RPRG0gT1BUSU9OQUwsIC0tIEdOU1MgVE9EIG1vZHVsbworIGdhbnNzVE9ERnJhYyBJTlRFR0VSICgwIC4uIDE2Mzg0KSBPUFRJT05BTCwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorCWdhbnNzVE9EVW5jZXJ0YWludHkgR0FOU1NUT0RVbmNlcnRhaW50eSBPUFRJT05BTCwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorIGdhbnNzVGltZUlEIElOVEVHRVIgKDAgLi4gMykgT1BUSU9OQUwsIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKwlmaXhUeXBlCQkJIEZpeFR5cGUsCisgcG9zRGF0YSBQb3NpdGlvbkRhdGEsCisgc3RhdGlvbmFyeUluZGljYXRpb24gSU5URUdFUigwIC4uIDEpIE9QVElPTkFMLCAtLSAnMCcgaWYgbW92aW5nIG9yIG1vdGlvbiBub3Qga25vd24gCisJLS0gUG9zc2libGUgc2hhcGVzIGNhcnJpZWQgaW4gcG9zRXN0aW1hdGUgYXJlCisJLS0gZWxsaXBzb2lkIHBvaW50LAorCS0tIGVsbGlwc29pZCBwb2ludCB3aXRoIHVuY2VydGFpbnR5IGNpcmNsZQorCS0tIGVsbGlwc29pZCBwb2ludCB3aXRoIHVuY2VydGFpbnR5IGVsbGlwc2UKKwktLSBlbGxpcHNvaWQgcG9pbnQgd2l0aCBhbHRpdHVkZSBhbmQgdW5jZXJ0YWludHkgZWxsaXBzb2lkCisJcG9zRXN0aW1hdGUJCSBFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24sCisgLi4uCit9CisKK1Bvc2l0aW9uRGF0YSA6Oj0gQklUIFNUUklORyB7CisgZS1vdGQoMCksCisJZ3BzICgxKSwKKwlnYWxpbGVvICgyKSB9IChTSVpFICgzLi4xNikpCisKKworLS0gR0FOU1MgVE9EIG1vZHVsbyAxIGhvdXIKK0dBTlNTVE9EbSA6Oj0gSU5URUdFUiAoMCAuLiAzNTk5OTk5KQorCitSZWZlcmVuY2VGcmFtZSA6Oj0gU0VRVUVOQ0UgeworIHJlZmVyZW5jZUZOIElOVEVHRVIgKDAgLi4gNjU1MzUpLAorCS0tIE5vdGUgdGhhdCBhcHBsaWNhYmxlIHJhbmdlIGZvciByZWZlcmVuY2VGTiBpcyAwIC0gNDI0MzEKKyByZWZlcmVuY2VGTk1TQiBJTlRFR0VSICgwIC4uIDYzKSBPUFRJT05BTCAtLSBNU0Igb2YgUmVmZXJlbmNlIEZyYW1lIE51bWJlcgorfQorCisKKworLS0gR0FOU1MgTWVhc3VyZW1lbnQgSW5mb3JtYXRpb24gCitHQU5TU01lYXN1cmVJbmZvIDo6PSBTRVFVRU5DRSB7CisJLS0gTWVhc3VyZW1lbnQgaW5mbyBlbGVtZW50cworCS0tIHVzZXIgaGFzIHRvIG1ha2Ugc3VyZSB0aGF0IGluIHRoaXMgZWxlbWVudCBpcyBudW1iZXIgb2YgZWxlbWVudHMKKwktLSBkZWZpbmVkIGluIHJlZmVyZW5jZSBCVFMgaWRlbnRpdHkKKyBnYW5zc01zclNldExpc3QgU2VxT2ZHQU5TUy1Nc3JTZXRFbGVtZW50Cit9CitTZXFPZkdBTlNTLU1zclNldEVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjMpKSBPRiBHQU5TUy1Nc3JTZXRFbGVtZW50CisKKy0tIEdBTlNTIG1lYXN1cmVtZW50IGluZm9ybWF0aW9uIDEtMyB0aW1lcyBpbiBhIG1lc3NhZ2UKK0dBTlNTLU1zclNldEVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKyByZWZlcmVuY2VGcmFtZSBSZWZlcmVuY2VGcmFtZSBPUFRJT05BTCwgLS0gUmVmZXJlbmNlIEZyYW1lIE51bWJlcgorIGdhbnNzVE9EbSBHQU5TU1RPRG0gT1BUSU9OQUwsIC0tIEdBTlNTIFRPRCBtb2R1bG8KKyBkZWx0YUdOQVNTVE9EIElOVEVHRVIgKDAgLi4gMTI3KSBPUFRJT05BTCwKKwlnYW5zc1RPRFVuY2VydGFpbnR5IEdBTlNTVE9EVW5jZXJ0YWludHkgT1BUSU9OQUwsIC0tIENvZGluZyBhY2NvcmluZyB0byBBbm5leAorCisgLS1OX1NHTl9UWVBFIGNhbiBiZSByZWFkIGZyb20gbnVtYmVyIG9mIGVsZW1lbnRzIG9mIFNlcU9mR0FOU1MtU2duVHlwZUVsZW1lbnQKKyBnYW5zcy1TZ25UeXBlTGlzdCBTZXFPZkdBTlNTLVNnblR5cGVFbGVtZW50Cit9CisKKy0tIE1lYXN1cmVtZW50cyBjYW4gYmUgcmV0dXJuZWQgdXAgdG8gNiBkaWZmZXJlbnQgc2lnbmFsIHR5cGVzIAorU2VxT2ZHQU5TUy1TZ25UeXBlRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uNikpIE9GIEdBTlNTLVNnblR5cGVFbGVtZW50CisKK0dBTlNTLVNnblR5cGVFbGVtZW50IDo6PSBTRVFVRU5DRSB7CisJZ2Fuc3NTaWduYWxJRAkJSU5URUdFUiAoMCAuLiAxNSksIC0tIENvZGluZyBhY2Nyb2RpbmcgdG8gQW5uZXgKKyAtLU5fU0dOIGNhbiBiZSByZWFkIGZyb20gbnVtYmVyIG9mIGVsZW1lbnRzIG9mIFNlcU9mR0FOU1MtU2duRWxlbWVudAorIGdhbnNzLVNnbkxpc3QgU2VxT2ZHQU5TUy1TZ25FbGVtZW50Cit9CisKKy0tIE1lYXN1cmVtZW50cyBjYW4gYmUgcmV0dXJuZWQgdXAgdG8gMTYgcGVyIHNpZ25hbCB0eXBlcyAKK1NlcU9mR0FOU1MtU2duRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTYpKSBPRiBHQU5TUy1TZ25FbGVtZW50CisKKworR0FOU1MtU2duRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworIHN2SUQgU1ZJRCwKKyBjTm8gSU5URUdFUiAoMCAuLiA2MyksCisgbXBhdGhEZXQgTXBhdGhJbmRpYywgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorIGNhcnJpZXJRdWFsaXR5SW5kIElOVEVHRVIgKDAgLi4gMykgT1BUSU9OQUwsIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKyBjb2RlUGhhc2UgSU5URUdFUiAoMCAuLiAyMDk3MTUxKSwKKyBpbnRlZ2VyQ29kZVBoYXNlIElOVEVHRVIgKDAgLi4gNjMpIE9QVElPTkFMLAorIGNvZGVQaGFzZVJNU0Vycm9yIElOVEVHRVIgKDAuLjYzKSwgLS0gQ29kaW5nIGFjY29yaW5nIHRvIEFubmV4CisgZG9wcGxlciBJTlRFR0VSICgtMzI3NjggLi4gMzI3NjcpIE9QVElPTkFMLAorIGFkciBJTlRFR0VSICgwIC4uIDMzNTU0NDMxKSBPUFRJT05BTAorfQorCitSZWw3LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgeworIGdhbnNzLUFzc2lzdERhdGEgR0FOU1MtQXNzaXN0RGF0YSBPUFRJT05BTCwKKyBnYW5zc0NhcnJpZXJQaGFzZU1lYXN1cmVtZW50UmVxdWVzdCBOVUxMIE9QVElPTkFMLAorIGdhbnNzVE9ER1NNVGltZUFzc29jaWF0aW9uTWVhc3VyZW1lbnRSZXF1ZXN0IE5VTEwgT1BUSU9OQUwsCisJLi4uCistLSBQb3NzaWJseSBtb3JlIGV4dGVuc2lvbnMgZm9yIFJlbGVhc2UgNyBoZXJlCit9CisKK0VORApkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9SUkxQLU1lc3NhZ2VzLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvUlJMUC1NZXNzYWdlcy5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkxNDBlMgotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvUlJMUC1NZXNzYWdlcy5hc24KQEAgLTAsMCArMSwzOCBAQAorLS0gUlJMUC1NZXNzYWdlcy5hc24KKy0tICRJZCQKKy0tIFRha2VuIGZyb20gM0dQUCBUUyA0NC4wMzEgVjcuNC4wICgyMDA3LTAzKQorLS0gaHR0cDovL3d3dy4zZ3BwLm9yZy9mdHAvU3BlY3MvYXJjaGl2ZS80NF9zZXJpZXMvNDQuMDMxLzQ0MDMxLTc0MC56aXAvNDQwMzEtNzQwLmRvYworLS0KKy0tIDMuMSBHZW5lcmFsIEZvcm1hdCBvZiBSUkxQIE1lc3NhZ2UKKy0tCisKK1JSTFAtTWVzc2FnZXMKKy0tIHsgUlJMUC1tZXNzYWdlcyB9CisKK0RFRklOSVRJT05TIEFVVE9NQVRJQyBUQUdTIDo6PQorCitCRUdJTgorCitJTVBPUlRTCisJTXNyUG9zaXRpb24tUmVxLCBNc3JQb3NpdGlvbi1Sc3AsIEFzc2lzdGFuY2VEYXRhLAorCVByb3RvY29sRXJyb3IKK0ZST00KKwlSUkxQLUNvbXBvbmVudHMgCS0tIHsgUlJMUC1Db21wb25lbnRzIH0KKzsKKworUERVIDo6PSBTRVFVRU5DRSB7CisJcmVmZXJlbmNlTnVtYmVyCQkJSU5URUdFUiAoMC4uNyksCisJY29tcG9uZW50CQkJCVJSTFAtQ29tcG9uZW50Cit9CisKK1JSTFAtQ29tcG9uZW50IDo6PSBDSE9JQ0UgeworCW1zclBvc2l0aW9uUmVxCQkJTXNyUG9zaXRpb24tUmVxLAorCW1zclBvc2l0aW9uUnNwCQkJTXNyUG9zaXRpb24tUnNwLAorCWFzc2lzdGFuY2VEYXRhCQkJQXNzaXN0YW5jZURhdGEsCisJYXNzaXN0YW5jZURhdGFBY2sJCU5VTEwsCisJcHJvdG9jb2xFcnJvcgkJCVByb3RvY29sRXJyb3IsCisJLi4uCisKK30KKworRU5ECmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL3BhdGNoLXJybHAtY29tcG9uZW50cy5kaWZmIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9wYXRjaC1ycmxwLWNvbXBvbmVudHMuZGlmZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWU1NWFlCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9wYXRjaC1ycmxwLWNvbXBvbmVudHMuZGlmZgpAQCAtMCwwICsxLDM2IEBACistLS0gUlJMUC1Db21wb25lbnRzLmFzbgkyMDA5LTEwLTI2IDIyOjEwOjQ0LjAwMDAwMDAwMCArMDEwMAorKysrIFJSTFAtQ29tcG9uZW50cy5hc24JMjAwOS0xMC0yNiAyMjoxMDo0NC4wMDAwMDAwMDAgKzAxMDAKK0BAIC0xOCwxNiArMTgsMTYgQEAKKyAJRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uLCBWZWxvY2l0eUVzdGltYXRlCisgRlJPTQorIAlNQVAtTENTLURhdGFUeXBlcyB7CistCWNjaXR0IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCistCWdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtTENTLURhdGFUeXBlcyAoMjUpIHZlcnNpb241ICg1KX0KKysJaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKysJZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1MQ1MtRGF0YVR5cGVzICgyNSkgdmVyc2lvbjExICgxMSl9CisgCisgCUV4dGVuc2lvbkNvbnRhaW5lcgorIEZST00gTUFQLUV4dGVuc2lvbkRhdGFUeXBlcyB7CistCWNjaXR0IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCistCWdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjQgKDQpfQorKwlpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorKwlnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUV4dGVuc2lvbkRhdGFUeXBlcyAoMjEpIHZlcnNpb24xMSAoMTEpfQorIDsKKyAKKyAtLSBBZGQgaGVyZSBvdGhlciBBU04uMSBkZWZpbml0aW9ucyBwcmVzZW50ZWQgYmVsb3cKKyAtLSBpbiBjaGFwdGVycyA0IGFuZCA1LgorIAorQEAgLTMwNSwxMSArMzA1LDExIEBACisgU3lzdGVtSW5mb0luZGV4IDo6PSBJTlRFR0VSICgxLi4zMikKKyAKKyBDZWxsSURBbmRMQUMgOjo9IFNFUVVFTkNFIHsKKy0JcmVmZXJlbmNlTEFDCUxBQywJCQkJLS0gTG9jYXRpb24gYXJlYSBjb2RlCisrCXJlZmVyZW5jZUxBQwlMQUNJRCwJCQkJLS0gTG9jYXRpb24gYXJlYSBjb2RlCisgCXJlZmVyZW5jZUNJCQlDZWxsSUQJCQkJLS0gQ2VsbCBpZGVudGl0eQorIH0KKyBDZWxsSUQgOjo9IElOVEVHRVIgKDAuLjY1NTM1KQorLUxBQyA6Oj0gSU5URUdFUiAoMC4uNjU1MzUpCisrTEFDSUQgOjo9IElOVEVHRVIgKDAuLjY1NTM1KQorIAorIC0tIE9URC1NZWFzdXJlSW5mbworIE9URC1NZWFzdXJlSW5mbyA6Oj0gU0VRVUVOQ0UgewpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMWNfcGF0Y2hlcy8wMF9hZGRfZW51bWVyYXRlZF92ZXJib3NlLmRpZmYgYi9ycmxwLWVwaGVtZXJpcy9hc24xY19wYXRjaGVzLzAwX2FkZF9lbnVtZXJhdGVkX3ZlcmJvc2UuZGlmZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGMyMmEzCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMWNfcGF0Y2hlcy8wMF9hZGRfZW51bWVyYXRlZF92ZXJib3NlLmRpZmYKQEAgLTAsMCArMSw1NiBAQAorSW5kZXg6IHNrZWxldG9ucy9OYXRpdmVFbnVtZXJhdGVkLmMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLSBza2VsZXRvbnMvTmF0aXZlRW51bWVyYXRlZC5jCShyZXZpc2lvbiAxNDA3KQorKysrIHNrZWxldG9ucy9OYXRpdmVFbnVtZXJhdGVkLmMJKHdvcmtpbmcgY29weSkKK0BAIC0yMiw3ICsyMiw3IEBACisgCSJFTlVNRVJBVEVEIiwJCQkvKiBUaGUgQVNOLjEgdHlwZSBpcyBzdGlsbCBFTlVNRVJBVEVEICovCisgCSJFTlVNRVJBVEVEIiwKKyAJTmF0aXZlSW50ZWdlcl9mcmVlLAorLQlOYXRpdmVJbnRlZ2VyX3ByaW50LAorKwlOYXRpdmVFbnVtZXJhdGVkX3ByaW50LAorIAlhc25fZ2VuZXJpY19ub19jb25zdHJhaW50LAorIAlOYXRpdmVJbnRlZ2VyX2RlY29kZV9iZXIsCisgCU5hdGl2ZUludGVnZXJfZW5jb2RlX2RlciwKK0BAIC0yMDUsMyArMjA1LDMwIEBACisgCV9BU05fRU5DT0RFRF9PSyhlcik7CisgfQorIAorK2ludAorK05hdGl2ZUVudW1lcmF0ZWRfcHJpbnQoYXNuX1RZUEVfZGVzY3JpcHRvcl90ICp0ZCwgY29uc3Qgdm9pZCAqc3B0ciwgaW50IGlsZXZlbCwKKysJYXNuX2FwcF9jb25zdW1lX2J5dGVzX2YgKmNiLCB2b2lkICphcHBfa2V5KSB7CisrCWFzbl9JTlRFR0VSX3NwZWNpZmljc190ICpzcGVjcz0oYXNuX0lOVEVHRVJfc3BlY2lmaWNzX3QgKil0ZC0+c3BlY2lmaWNzOworKwljb25zdCBsb25nICpuYXRpdmUgPSAoY29uc3QgbG9uZyAqKXNwdHI7CisrCWNoYXIgc2NyYXRjaFsyNTZdOworKwlpbnQgcmV0OworKworKwkodm9pZCl0ZDsJLyogVW51c2VkIGFyZ3VtZW50ICovCisrCSh2b2lkKWlsZXZlbDsJLyogVW51c2VkIGFyZ3VtZW50ICovCisrCisrCWlmKG5hdGl2ZSkgeworKwkJY29uc3QgYXNuX0lOVEVHRVJfZW51bV9tYXBfdCAqbWFwID0gSU5URUdFUl9tYXBfdmFsdWUyZW51bShzcGVjcywgKm5hdGl2ZSk7CisrCQlpZiAobWFwICYmIG1hcC0+ZW51bV9sZW4gJiYgbWFwLT5lbnVtX25hbWUpIHsKKysJCQlyZXQgPSBzbnByaW50ZihzY3JhdGNoLCBzaXplb2Yoc2NyYXRjaCksCisrCQkJCSIlcyIsIG1hcC0+ZW51bV9uYW1lKTsKKysJCX0gZWxzZSB7CisrCQkJcmV0ID0gc25wcmludGYoc2NyYXRjaCwgc2l6ZW9mKHNjcmF0Y2gpLAorKwkJCQkoc3BlY3MgJiYgc3BlY3MtPmZpZWxkX3Vuc2lnbmVkKQorKwkJCQk/ICIlbHUiIDogIiVsZCIsICpuYXRpdmUpOworKwkJfQorKwkJYXNzZXJ0KHJldCA+IDAgJiYgKHNpemVfdClyZXQgPCBzaXplb2Yoc2NyYXRjaCkpOworKwkJcmV0dXJuIChjYihzY3JhdGNoLCByZXQsIGFwcF9rZXkpIDwgMCkgPyAtMSA6IDA7CisrCX0gZWxzZSB7CisrCQlyZXR1cm4gKGNiKCI8YWJzZW50PiIsIDgsIGFwcF9rZXkpIDwgMCkgPyAtMSA6IDA7CisrCX0KKyt9CitJbmRleDogc2tlbGV0b25zL05hdGl2ZUVudW1lcmF0ZWQuaAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tIHNrZWxldG9ucy9OYXRpdmVFbnVtZXJhdGVkLmgJKHJldmlzaW9uIDE0MDcpCisrKysgc2tlbGV0b25zL05hdGl2ZUVudW1lcmF0ZWQuaAkod29ya2luZyBjb3B5KQorQEAgLTI0LDYgKzI0LDcgQEAKKyB4ZXJfdHlwZV9lbmNvZGVyX2YgTmF0aXZlRW51bWVyYXRlZF9lbmNvZGVfeGVyOworIHBlcl90eXBlX2RlY29kZXJfZiBOYXRpdmVFbnVtZXJhdGVkX2RlY29kZV91cGVyOworIHBlcl90eXBlX2VuY29kZXJfZiBOYXRpdmVFbnVtZXJhdGVkX2VuY29kZV91cGVyOworK2Fzbl9zdHJ1Y3RfcHJpbnRfZiBOYXRpdmVFbnVtZXJhdGVkX3ByaW50OworIAorICNpZmRlZiBfX2NwbHVzcGx1cworIH0KZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjFjX3BhdGNoZXMvMDFfZml4X3Blcl9lbmNvZGluZ19kaWV0ZXIuZGlmZiBiL3JybHAtZXBoZW1lcmlzL2FzbjFjX3BhdGNoZXMvMDFfZml4X3Blcl9lbmNvZGluZ19kaWV0ZXIuZGlmZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDljMjAxCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMWNfcGF0Y2hlcy8wMV9maXhfcGVyX2VuY29kaW5nX2RpZXRlci5kaWZmCkBAIC0wLDAgKzEsMTcgQEAKK0luZGV4OiBza2VsZXRvbnMvcGVyX3N1cHBvcnQuYworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tIHNrZWxldG9ucy9wZXJfc3VwcG9ydC5jCShyZXZpc2lvbiAxNDA3KQorKysrIHNrZWxldG9ucy9wZXJfc3VwcG9ydC5jCSh3b3JraW5nIGNvcHkpCitAQCAtMzM2LDcgKzMzNiwxMiBAQAorIAkJYnVmWzNdID0gYml0czsKKyAJZWxzZSB7CisgCQlBU05fREVCVUcoIi0+W1BFUiBvdXQgc3BsaXQgJWRdIiwgb2JpdHMpOworKyNpZiAxIC8vIERpZXRlcgorKwkJcG8tPm5ib2ZmIC09IG9iaXRzOyAvLyB1bmRvIGluY3JlbWVudGF0aW9uIGZyb20gYSBmZXcgbGluZXMgYWJvdmUKKysJCXBlcl9wdXRfZmV3X2JpdHMocG8sIGJpdHMgPj4gKG9iaXRzIC0gMjQpLCAyNCk7IC8vIHNoaWZ0IGFjY29yZGluZyB0byB0aGUgcmVzdCBvZiB0aGUgYml0cyAKKysjZWxzZQkJCisgCQlwZXJfcHV0X2Zld19iaXRzKHBvLCBiaXRzID4+IDgsIDI0KTsKKysjZW5kaWYKKyAJCXBlcl9wdXRfZmV3X2JpdHMocG8sIGJpdHMsIG9iaXRzIC0gMjQpOworIAkJQVNOX0RFQlVHKCI8LVtQRVIgb3V0IHNwbGl0ICVkXSIsIG9iaXRzKTsKKyAJfQpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvZGF0YS51YnggYi9ycmxwLWVwaGVtZXJpcy9kYXRhLnVieApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2NkZGRjCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvZGF0YS51YngKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvZ2V0LXRlc3QtZGF0YS5zaCBiL3JybHAtZXBoZW1lcmlzL2dldC10ZXN0LWRhdGEuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTY5ZjQzYwotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2dldC10ZXN0LWRhdGEuc2gKQEAgLTAsMCArMSwxNyBAQAorIyEvYmluL3NoCisKK0RFVj0kMQorT1VURj0kMgorCisjIENoYW5nZSBtb2RlCitlY2hvIC1lbiAiXCRQVUJYLDQxLDEsMDAwMSwwMDAxLDk2MDAsMCoxNFxyXG4iID4gJHtERVZ9CisKKyMgV2FpdCBhIGxpdHRsZQorc2xlZXAgMgorCisjIFN0YXJ0IGR1bXAKK2VjaG8gLWVuICJceGI1XHg2Mlx4MDFceDAyXHgwMFx4MDBceDAzXHgwYSIgfCBcCisJc29jYXQgLXQ1ICR7REVWfSxiOTYwMCxyYXcsY2xvY2FsPTEsZWNobz0wIC0gPiAke09VVEZ9CitlY2hvIC1lbiAiXHhiNVx4NjJceDBiXHgxMFx4MDBceDAwXHgxYlx4NWMiIHwgXAorCXNvY2F0IC10MTAgJHtERVZ9LGI5NjAwLHJhdyxjbG9jYWw9MSxlY2hvPTAgLSA+PiAke09VVEZ9CisKZGlmZiAtLWdpdCBhL0NPUFlJTkcgYi9ycmxwLWVwaGVtZXJpcy9ncGwtMi4wLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIENPUFlJTkcKY29weSB0byBycmxwLWVwaGVtZXJpcy9ncGwtMi4wLnR4dApkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvZ3BsLTMuMC50eHQgYi9ycmxwLWVwaGVtZXJpcy9ncGwtMy4wLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGE5ZWQwCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvZ3BsLTMuMC50eHQKQEAgLTAsMCArMSw2NzQgQEAKKyAgICAgICAgICAgICAgICAgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAzLCAyOSBKdW5lIDIwMDcKKworIENvcHlyaWdodCAoQykgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gPGh0dHA6Ly9mc2Yub3JnLz4KKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWFtYmxlCisKKyAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGEgZnJlZSwgY29weWxlZnQgbGljZW5zZSBmb3IKK3NvZnR3YXJlIGFuZCBvdGhlciBraW5kcyBvZiB3b3Jrcy4KKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYW5kIG90aGVyIHByYWN0aWNhbCB3b3JrcyBhcmUgZGVzaWduZWQKK3RvIHRha2UgYXdheSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSB0aGUgd29ya3MuICBCeSBjb250cmFzdCwKK3RoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvCitzaGFyZSBhbmQgY2hhbmdlIGFsbCB2ZXJzaW9ucyBvZiBhIHByb2dyYW0tLXRvIG1ha2Ugc3VyZSBpdCByZW1haW5zIGZyZWUKK3NvZnR3YXJlIGZvciBhbGwgaXRzIHVzZXJzLiAgV2UsIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHVzZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3N0IG9mIG91ciBzb2Z0d2FyZTsgaXQgYXBwbGllcyBhbHNvIHRvCithbnkgb3RoZXIgd29yayByZWxlYXNlZCB0aGlzIHdheSBieSBpdHMgYXV0aG9ycy4gIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGVtIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0IGlmIHlvdQord2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdCBpbiBuZXcKK2ZyZWUgcHJvZ3JhbXMsIGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gcHJldmVudCBvdGhlcnMgZnJvbSBkZW55aW5nIHlvdQordGhlc2UgcmlnaHRzIG9yIGFza2luZyB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuICBUaGVyZWZvcmUsIHlvdSBoYXZlCitjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYKK3lvdSBtb2RpZnkgaXQ6IHJlc3BvbnNpYmlsaXRpZXMgdG8gcmVzcGVjdCB0aGUgZnJlZWRvbSBvZiBvdGhlcnMuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgorZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgcGFzcyBvbiB0byB0aGUgcmVjaXBpZW50cyB0aGUgc2FtZQorZnJlZWRvbXMgdGhhdCB5b3UgcmVjZWl2ZWQuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUKK29yIGNhbiBnZXQgdGhlIHNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5Citrbm93IHRoZWlyIHJpZ2h0cy4KKworICBEZXZlbG9wZXJzIHRoYXQgdXNlIHRoZSBHTlUgR1BMIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6CisoMSkgYXNzZXJ0IGNvcHlyaWdodCBvbiB0aGUgc29mdHdhcmUsIGFuZCAoMikgb2ZmZXIgeW91IHRoaXMgTGljZW5zZQorZ2l2aW5nIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSBpdC4KKworICBGb3IgdGhlIGRldmVsb3BlcnMnIGFuZCBhdXRob3JzJyBwcm90ZWN0aW9uLCB0aGUgR1BMIGNsZWFybHkgZXhwbGFpbnMKK3RoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZSBzb2Z0d2FyZS4gIEZvciBib3RoIHVzZXJzJyBhbmQKK2F1dGhvcnMnIHNha2UsIHRoZSBHUEwgcmVxdWlyZXMgdGhhdCBtb2RpZmllZCB2ZXJzaW9ucyBiZSBtYXJrZWQgYXMKK2NoYW5nZWQsIHNvIHRoYXQgdGhlaXIgcHJvYmxlbXMgd2lsbCBub3QgYmUgYXR0cmlidXRlZCBlcnJvbmVvdXNseSB0bworYXV0aG9ycyBvZiBwcmV2aW91cyB2ZXJzaW9ucy4KKworICBTb21lIGRldmljZXMgYXJlIGRlc2lnbmVkIHRvIGRlbnkgdXNlcnMgYWNjZXNzIHRvIGluc3RhbGwgb3IgcnVuCittb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgc29mdHdhcmUgaW5zaWRlIHRoZW0sIGFsdGhvdWdoIHRoZSBtYW51ZmFjdHVyZXIKK2NhbiBkbyBzby4gIFRoaXMgaXMgZnVuZGFtZW50YWxseSBpbmNvbXBhdGlibGUgd2l0aCB0aGUgYWltIG9mCitwcm90ZWN0aW5nIHVzZXJzJyBmcmVlZG9tIHRvIGNoYW5nZSB0aGUgc29mdHdhcmUuICBUaGUgc3lzdGVtYXRpYworcGF0dGVybiBvZiBzdWNoIGFidXNlIG9jY3VycyBpbiB0aGUgYXJlYSBvZiBwcm9kdWN0cyBmb3IgaW5kaXZpZHVhbHMgdG8KK3VzZSwgd2hpY2ggaXMgcHJlY2lzZWx5IHdoZXJlIGl0IGlzIG1vc3QgdW5hY2NlcHRhYmxlLiAgVGhlcmVmb3JlLCB3ZQoraGF2ZSBkZXNpZ25lZCB0aGlzIHZlcnNpb24gb2YgdGhlIEdQTCB0byBwcm9oaWJpdCB0aGUgcHJhY3RpY2UgZm9yIHRob3NlCitwcm9kdWN0cy4gIElmIHN1Y2ggcHJvYmxlbXMgYXJpc2Ugc3Vic3RhbnRpYWxseSBpbiBvdGhlciBkb21haW5zLCB3ZQorc3RhbmQgcmVhZHkgdG8gZXh0ZW5kIHRoaXMgcHJvdmlzaW9uIHRvIHRob3NlIGRvbWFpbnMgaW4gZnV0dXJlIHZlcnNpb25zCitvZiB0aGUgR1BMLCBhcyBuZWVkZWQgdG8gcHJvdGVjdCB0aGUgZnJlZWRvbSBvZiB1c2Vycy4KKworICBGaW5hbGx5LCBldmVyeSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZSBwYXRlbnRzLgorU3RhdGVzIHNob3VsZCBub3QgYWxsb3cgcGF0ZW50cyB0byByZXN0cmljdCBkZXZlbG9wbWVudCBhbmQgdXNlIG9mCitzb2Z0d2FyZSBvbiBnZW5lcmFsLXB1cnBvc2UgY29tcHV0ZXJzLCBidXQgaW4gdGhvc2UgdGhhdCBkbywgd2Ugd2lzaCB0bworYXZvaWQgdGhlIHNwZWNpYWwgZGFuZ2VyIHRoYXQgcGF0ZW50cyBhcHBsaWVkIHRvIGEgZnJlZSBwcm9ncmFtIGNvdWxkCittYWtlIGl0IGVmZmVjdGl2ZWx5IHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB0aGUgR1BMIGFzc3VyZXMgdGhhdAorcGF0ZW50cyBjYW5ub3QgYmUgdXNlZCB0byByZW5kZXIgdGhlIHByb2dyYW0gbm9uLWZyZWUuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCisKKyAgICAgICAgICAgICAgICAgICAgICAgVEVSTVMgQU5EIENPTkRJVElPTlMKKworICAwLiBEZWZpbml0aW9ucy4KKworICAiVGhpcyBMaWNlbnNlIiByZWZlcnMgdG8gdmVyc2lvbiAzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKworICAiQ29weXJpZ2h0IiBhbHNvIG1lYW5zIGNvcHlyaWdodC1saWtlIGxhd3MgdGhhdCBhcHBseSB0byBvdGhlciBraW5kcyBvZgord29ya3MsIHN1Y2ggYXMgc2VtaWNvbmR1Y3RvciBtYXNrcy4KKworICAiVGhlIFByb2dyYW0iIHJlZmVycyB0byBhbnkgY29weXJpZ2h0YWJsZSB3b3JrIGxpY2Vuc2VkIHVuZGVyIHRoaXMKK0xpY2Vuc2UuICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4gICJMaWNlbnNlZXMiIGFuZAorInJlY2lwaWVudHMiIG1heSBiZSBpbmRpdmlkdWFscyBvciBvcmdhbml6YXRpb25zLgorCisgIFRvICJtb2RpZnkiIGEgd29yayBtZWFucyB0byBjb3B5IGZyb20gb3IgYWRhcHQgYWxsIG9yIHBhcnQgb2YgdGhlIHdvcmsKK2luIGEgZmFzaGlvbiByZXF1aXJpbmcgY29weXJpZ2h0IHBlcm1pc3Npb24sIG90aGVyIHRoYW4gdGhlIG1ha2luZyBvZiBhbgorZXhhY3QgY29weS4gIFRoZSByZXN1bHRpbmcgd29yayBpcyBjYWxsZWQgYSAibW9kaWZpZWQgdmVyc2lvbiIgb2YgdGhlCitlYXJsaWVyIHdvcmsgb3IgYSB3b3JrICJiYXNlZCBvbiIgdGhlIGVhcmxpZXIgd29yay4KKworICBBICJjb3ZlcmVkIHdvcmsiIG1lYW5zIGVpdGhlciB0aGUgdW5tb2RpZmllZCBQcm9ncmFtIG9yIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0uCisKKyAgVG8gInByb3BhZ2F0ZSIgYSB3b3JrIG1lYW5zIHRvIGRvIGFueXRoaW5nIHdpdGggaXQgdGhhdCwgd2l0aG91dAorcGVybWlzc2lvbiwgd291bGQgbWFrZSB5b3UgZGlyZWN0bHkgb3Igc2Vjb25kYXJpbHkgbGlhYmxlIGZvcgoraW5mcmluZ2VtZW50IHVuZGVyIGFwcGxpY2FibGUgY29weXJpZ2h0IGxhdywgZXhjZXB0IGV4ZWN1dGluZyBpdCBvbiBhCitjb21wdXRlciBvciBtb2RpZnlpbmcgYSBwcml2YXRlIGNvcHkuICBQcm9wYWdhdGlvbiBpbmNsdWRlcyBjb3B5aW5nLAorZGlzdHJpYnV0aW9uICh3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uKSwgbWFraW5nIGF2YWlsYWJsZSB0byB0aGUKK3B1YmxpYywgYW5kIGluIHNvbWUgY291bnRyaWVzIG90aGVyIGFjdGl2aXRpZXMgYXMgd2VsbC4KKworICBUbyAiY29udmV5IiBhIHdvcmsgbWVhbnMgYW55IGtpbmQgb2YgcHJvcGFnYXRpb24gdGhhdCBlbmFibGVzIG90aGVyCitwYXJ0aWVzIHRvIG1ha2Ugb3IgcmVjZWl2ZSBjb3BpZXMuICBNZXJlIGludGVyYWN0aW9uIHdpdGggYSB1c2VyIHRocm91Z2gKK2EgY29tcHV0ZXIgbmV0d29yaywgd2l0aCBubyB0cmFuc2ZlciBvZiBhIGNvcHksIGlzIG5vdCBjb252ZXlpbmcuCisKKyAgQW4gaW50ZXJhY3RpdmUgdXNlciBpbnRlcmZhY2UgZGlzcGxheXMgIkFwcHJvcHJpYXRlIExlZ2FsIE5vdGljZXMiCit0byB0aGUgZXh0ZW50IHRoYXQgaXQgaW5jbHVkZXMgYSBjb252ZW5pZW50IGFuZCBwcm9taW5lbnRseSB2aXNpYmxlCitmZWF0dXJlIHRoYXQgKDEpIGRpc3BsYXlzIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UsIGFuZCAoMikKK3RlbGxzIHRoZSB1c2VyIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoZSB3b3JrIChleGNlcHQgdG8gdGhlCitleHRlbnQgdGhhdCB3YXJyYW50aWVzIGFyZSBwcm92aWRlZCksIHRoYXQgbGljZW5zZWVzIG1heSBjb252ZXkgdGhlCit3b3JrIHVuZGVyIHRoaXMgTGljZW5zZSwgYW5kIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZgordGhlIGludGVyZmFjZSBwcmVzZW50cyBhIGxpc3Qgb2YgdXNlciBjb21tYW5kcyBvciBvcHRpb25zLCBzdWNoIGFzIGEKK21lbnUsIGEgcHJvbWluZW50IGl0ZW0gaW4gdGhlIGxpc3QgbWVldHMgdGhpcyBjcml0ZXJpb24uCisKKyAgMS4gU291cmNlIENvZGUuCisKKyAgVGhlICJzb3VyY2UgY29kZSIgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsKK2ZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gICJPYmplY3QgY29kZSIgbWVhbnMgYW55IG5vbi1zb3VyY2UKK2Zvcm0gb2YgYSB3b3JrLgorCisgIEEgIlN0YW5kYXJkIEludGVyZmFjZSIgbWVhbnMgYW4gaW50ZXJmYWNlIHRoYXQgZWl0aGVyIGlzIGFuIG9mZmljaWFsCitzdGFuZGFyZCBkZWZpbmVkIGJ5IGEgcmVjb2duaXplZCBzdGFuZGFyZHMgYm9keSwgb3IsIGluIHRoZSBjYXNlIG9mCitpbnRlcmZhY2VzIHNwZWNpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIHByb2dyYW1taW5nIGxhbmd1YWdlLCBvbmUgdGhhdAoraXMgd2lkZWx5IHVzZWQgYW1vbmcgZGV2ZWxvcGVycyB3b3JraW5nIGluIHRoYXQgbGFuZ3VhZ2UuCisKKyAgVGhlICJTeXN0ZW0gTGlicmFyaWVzIiBvZiBhbiBleGVjdXRhYmxlIHdvcmsgaW5jbHVkZSBhbnl0aGluZywgb3RoZXIKK3RoYW4gdGhlIHdvcmsgYXMgYSB3aG9sZSwgdGhhdCAoYSkgaXMgaW5jbHVkZWQgaW4gdGhlIG5vcm1hbCBmb3JtIG9mCitwYWNrYWdpbmcgYSBNYWpvciBDb21wb25lbnQsIGJ1dCB3aGljaCBpcyBub3QgcGFydCBvZiB0aGF0IE1ham9yCitDb21wb25lbnQsIGFuZCAoYikgc2VydmVzIG9ubHkgdG8gZW5hYmxlIHVzZSBvZiB0aGUgd29yayB3aXRoIHRoYXQKK01ham9yIENvbXBvbmVudCwgb3IgdG8gaW1wbGVtZW50IGEgU3RhbmRhcmQgSW50ZXJmYWNlIGZvciB3aGljaCBhbgoraW1wbGVtZW50YXRpb24gaXMgYXZhaWxhYmxlIHRvIHRoZSBwdWJsaWMgaW4gc291cmNlIGNvZGUgZm9ybS4gIEEKKyJNYWpvciBDb21wb25lbnQiLCBpbiB0aGlzIGNvbnRleHQsIG1lYW5zIGEgbWFqb3IgZXNzZW50aWFsIGNvbXBvbmVudAorKGtlcm5lbCwgd2luZG93IHN5c3RlbSwgYW5kIHNvIG9uKSBvZiB0aGUgc3BlY2lmaWMgb3BlcmF0aW5nIHN5c3RlbQorKGlmIGFueSkgb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgd29yayBydW5zLCBvciBhIGNvbXBpbGVyIHVzZWQgdG8KK3Byb2R1Y2UgdGhlIHdvcmssIG9yIGFuIG9iamVjdCBjb2RlIGludGVycHJldGVyIHVzZWQgdG8gcnVuIGl0LgorCisgIFRoZSAiQ29ycmVzcG9uZGluZyBTb3VyY2UiIGZvciBhIHdvcmsgaW4gb2JqZWN0IGNvZGUgZm9ybSBtZWFucyBhbGwKK3RoZSBzb3VyY2UgY29kZSBuZWVkZWQgdG8gZ2VuZXJhdGUsIGluc3RhbGwsIGFuZCAoZm9yIGFuIGV4ZWN1dGFibGUKK3dvcmspIHJ1biB0aGUgb2JqZWN0IGNvZGUgYW5kIHRvIG1vZGlmeSB0aGUgd29yaywgaW5jbHVkaW5nIHNjcmlwdHMgdG8KK2NvbnRyb2wgdGhvc2UgYWN0aXZpdGllcy4gIEhvd2V2ZXIsIGl0IGRvZXMgbm90IGluY2x1ZGUgdGhlIHdvcmsncworU3lzdGVtIExpYnJhcmllcywgb3IgZ2VuZXJhbC1wdXJwb3NlIHRvb2xzIG9yIGdlbmVyYWxseSBhdmFpbGFibGUgZnJlZQorcHJvZ3JhbXMgd2hpY2ggYXJlIHVzZWQgdW5tb2RpZmllZCBpbiBwZXJmb3JtaW5nIHRob3NlIGFjdGl2aXRpZXMgYnV0Cit3aGljaCBhcmUgbm90IHBhcnQgb2YgdGhlIHdvcmsuICBGb3IgZXhhbXBsZSwgQ29ycmVzcG9uZGluZyBTb3VyY2UKK2luY2x1ZGVzIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBzb3VyY2UgZmlsZXMgZm9yCit0aGUgd29yaywgYW5kIHRoZSBzb3VyY2UgY29kZSBmb3Igc2hhcmVkIGxpYnJhcmllcyBhbmQgZHluYW1pY2FsbHkKK2xpbmtlZCBzdWJwcm9ncmFtcyB0aGF0IHRoZSB3b3JrIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byByZXF1aXJlLAorc3VjaCBhcyBieSBpbnRpbWF0ZSBkYXRhIGNvbW11bmljYXRpb24gb3IgY29udHJvbCBmbG93IGJldHdlZW4gdGhvc2UKK3N1YnByb2dyYW1zIGFuZCBvdGhlciBwYXJ0cyBvZiB0aGUgd29yay4KKworICBUaGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IHVzZXJzCitjYW4gcmVnZW5lcmF0ZSBhdXRvbWF0aWNhbGx5IGZyb20gb3RoZXIgcGFydHMgb2YgdGhlIENvcnJlc3BvbmRpbmcKK1NvdXJjZS4KKworICBUaGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgZm9yIGEgd29yayBpbiBzb3VyY2UgY29kZSBmb3JtIGlzIHRoYXQKK3NhbWUgd29yay4KKworICAyLiBCYXNpYyBQZXJtaXNzaW9ucy4KKworICBBbGwgcmlnaHRzIGdyYW50ZWQgdW5kZXIgdGhpcyBMaWNlbnNlIGFyZSBncmFudGVkIGZvciB0aGUgdGVybSBvZgorY29weXJpZ2h0IG9uIHRoZSBQcm9ncmFtLCBhbmQgYXJlIGlycmV2b2NhYmxlIHByb3ZpZGVkIHRoZSBzdGF0ZWQKK2NvbmRpdGlvbnMgYXJlIG1ldC4gIFRoaXMgTGljZW5zZSBleHBsaWNpdGx5IGFmZmlybXMgeW91ciB1bmxpbWl0ZWQKK3Blcm1pc3Npb24gdG8gcnVuIHRoZSB1bm1vZGlmaWVkIFByb2dyYW0uICBUaGUgb3V0cHV0IGZyb20gcnVubmluZyBhCitjb3ZlcmVkIHdvcmsgaXMgY292ZXJlZCBieSB0aGlzIExpY2Vuc2Ugb25seSBpZiB0aGUgb3V0cHV0LCBnaXZlbiBpdHMKK2NvbnRlbnQsIGNvbnN0aXR1dGVzIGEgY292ZXJlZCB3b3JrLiAgVGhpcyBMaWNlbnNlIGFja25vd2xlZGdlcyB5b3VyCityaWdodHMgb2YgZmFpciB1c2Ugb3Igb3RoZXIgZXF1aXZhbGVudCwgYXMgcHJvdmlkZWQgYnkgY29weXJpZ2h0IGxhdy4KKworICBZb3UgbWF5IG1ha2UsIHJ1biBhbmQgcHJvcGFnYXRlIGNvdmVyZWQgd29ya3MgdGhhdCB5b3UgZG8gbm90Citjb252ZXksIHdpdGhvdXQgY29uZGl0aW9ucyBzbyBsb25nIGFzIHlvdXIgbGljZW5zZSBvdGhlcndpc2UgcmVtYWlucworaW4gZm9yY2UuICBZb3UgbWF5IGNvbnZleSBjb3ZlcmVkIHdvcmtzIHRvIG90aGVycyBmb3IgdGhlIHNvbGUgcHVycG9zZQorb2YgaGF2aW5nIHRoZW0gbWFrZSBtb2RpZmljYXRpb25zIGV4Y2x1c2l2ZWx5IGZvciB5b3UsIG9yIHByb3ZpZGUgeW91Cit3aXRoIGZhY2lsaXRpZXMgZm9yIHJ1bm5pbmcgdGhvc2Ugd29ya3MsIHByb3ZpZGVkIHRoYXQgeW91IGNvbXBseSB3aXRoCit0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGluIGNvbnZleWluZyBhbGwgbWF0ZXJpYWwgZm9yIHdoaWNoIHlvdSBkbworbm90IGNvbnRyb2wgY29weXJpZ2h0LiAgVGhvc2UgdGh1cyBtYWtpbmcgb3IgcnVubmluZyB0aGUgY292ZXJlZCB3b3JrcworZm9yIHlvdSBtdXN0IGRvIHNvIGV4Y2x1c2l2ZWx5IG9uIHlvdXIgYmVoYWxmLCB1bmRlciB5b3VyIGRpcmVjdGlvbgorYW5kIGNvbnRyb2wsIG9uIHRlcm1zIHRoYXQgcHJvaGliaXQgdGhlbSBmcm9tIG1ha2luZyBhbnkgY29waWVzIG9mCit5b3VyIGNvcHlyaWdodGVkIG1hdGVyaWFsIG91dHNpZGUgdGhlaXIgcmVsYXRpb25zaGlwIHdpdGggeW91LgorCisgIENvbnZleWluZyB1bmRlciBhbnkgb3RoZXIgY2lyY3Vtc3RhbmNlcyBpcyBwZXJtaXR0ZWQgc29sZWx5IHVuZGVyCit0aGUgY29uZGl0aW9ucyBzdGF0ZWQgYmVsb3cuICBTdWJsaWNlbnNpbmcgaXMgbm90IGFsbG93ZWQ7IHNlY3Rpb24gMTAKK21ha2VzIGl0IHVubmVjZXNzYXJ5LgorCisgIDMuIFByb3RlY3RpbmcgVXNlcnMnIExlZ2FsIFJpZ2h0cyBGcm9tIEFudGktQ2lyY3VtdmVudGlvbiBMYXcuCisKKyAgTm8gY292ZXJlZCB3b3JrIHNoYWxsIGJlIGRlZW1lZCBwYXJ0IG9mIGFuIGVmZmVjdGl2ZSB0ZWNobm9sb2dpY2FsCittZWFzdXJlIHVuZGVyIGFueSBhcHBsaWNhYmxlIGxhdyBmdWxmaWxsaW5nIG9ibGlnYXRpb25zIHVuZGVyIGFydGljbGUKKzExIG9mIHRoZSBXSVBPIGNvcHlyaWdodCB0cmVhdHkgYWRvcHRlZCBvbiAyMCBEZWNlbWJlciAxOTk2LCBvcgorc2ltaWxhciBsYXdzIHByb2hpYml0aW5nIG9yIHJlc3RyaWN0aW5nIGNpcmN1bXZlbnRpb24gb2Ygc3VjaAorbWVhc3VyZXMuCisKKyAgV2hlbiB5b3UgY29udmV5IGEgY292ZXJlZCB3b3JrLCB5b3Ugd2FpdmUgYW55IGxlZ2FsIHBvd2VyIHRvIGZvcmJpZAorY2lyY3VtdmVudGlvbiBvZiB0ZWNobm9sb2dpY2FsIG1lYXN1cmVzIHRvIHRoZSBleHRlbnQgc3VjaCBjaXJjdW12ZW50aW9uCitpcyBlZmZlY3RlZCBieSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2Ugd2l0aCByZXNwZWN0IHRvCit0aGUgY292ZXJlZCB3b3JrLCBhbmQgeW91IGRpc2NsYWltIGFueSBpbnRlbnRpb24gdG8gbGltaXQgb3BlcmF0aW9uIG9yCittb2RpZmljYXRpb24gb2YgdGhlIHdvcmsgYXMgYSBtZWFucyBvZiBlbmZvcmNpbmcsIGFnYWluc3QgdGhlIHdvcmsncwordXNlcnMsIHlvdXIgb3IgdGhpcmQgcGFydGllcycgbGVnYWwgcmlnaHRzIHRvIGZvcmJpZCBjaXJjdW12ZW50aW9uIG9mCit0ZWNobm9sb2dpY2FsIG1lYXN1cmVzLgorCisgIDQuIENvbnZleWluZyBWZXJiYXRpbSBDb3BpZXMuCisKKyAgWW91IG1heSBjb252ZXkgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3Mgc291cmNlIGNvZGUgYXMgeW91CityZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdSBjb25zcGljdW91c2x5IGFuZAorYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlOwora2VlcCBpbnRhY3QgYWxsIG5vdGljZXMgc3RhdGluZyB0aGF0IHRoaXMgTGljZW5zZSBhbmQgYW55Citub24tcGVybWlzc2l2ZSB0ZXJtcyBhZGRlZCBpbiBhY2NvcmQgd2l0aCBzZWN0aW9uIDcgYXBwbHkgdG8gdGhlIGNvZGU7CitrZWVwIGludGFjdCBhbGwgbm90aWNlcyBvZiB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7IGFuZCBnaXZlIGFsbAorcmVjaXBpZW50cyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIFByb2dyYW0uCisKKyAgWW91IG1heSBjaGFyZ2UgYW55IHByaWNlIG9yIG5vIHByaWNlIGZvciBlYWNoIGNvcHkgdGhhdCB5b3UgY29udmV5LAorYW5kIHlvdSBtYXkgb2ZmZXIgc3VwcG9ydCBvciB3YXJyYW50eSBwcm90ZWN0aW9uIGZvciBhIGZlZS4KKworICA1LiBDb252ZXlpbmcgTW9kaWZpZWQgU291cmNlIFZlcnNpb25zLgorCisgIFlvdSBtYXkgY29udmV5IGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgb3IgdGhlIG1vZGlmaWNhdGlvbnMgdG8KK3Byb2R1Y2UgaXQgZnJvbSB0aGUgUHJvZ3JhbSwgaW4gdGhlIGZvcm0gb2Ygc291cmNlIGNvZGUgdW5kZXIgdGhlCit0ZXJtcyBvZiBzZWN0aW9uIDQsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFRoZSB3b3JrIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBtb2RpZmllZAorICAgIGl0LCBhbmQgZ2l2aW5nIGEgcmVsZXZhbnQgZGF0ZS4KKworICAgIGIpIFRoZSB3b3JrIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IGl0IGlzCisgICAgcmVsZWFzZWQgdW5kZXIgdGhpcyBMaWNlbnNlIGFuZCBhbnkgY29uZGl0aW9ucyBhZGRlZCB1bmRlciBzZWN0aW9uCisgICAgNy4gIFRoaXMgcmVxdWlyZW1lbnQgbW9kaWZpZXMgdGhlIHJlcXVpcmVtZW50IGluIHNlY3Rpb24gNCB0bworICAgICJrZWVwIGludGFjdCBhbGwgbm90aWNlcyIuCisKKyAgICBjKSBZb3UgbXVzdCBsaWNlbnNlIHRoZSBlbnRpcmUgd29yaywgYXMgYSB3aG9sZSwgdW5kZXIgdGhpcworICAgIExpY2Vuc2UgdG8gYW55b25lIHdobyBjb21lcyBpbnRvIHBvc3Nlc3Npb24gb2YgYSBjb3B5LiAgVGhpcworICAgIExpY2Vuc2Ugd2lsbCB0aGVyZWZvcmUgYXBwbHksIGFsb25nIHdpdGggYW55IGFwcGxpY2FibGUgc2VjdGlvbiA3CisgICAgYWRkaXRpb25hbCB0ZXJtcywgdG8gdGhlIHdob2xlIG9mIHRoZSB3b3JrLCBhbmQgYWxsIGl0cyBwYXJ0cywKKyAgICByZWdhcmRsZXNzIG9mIGhvdyB0aGV5IGFyZSBwYWNrYWdlZC4gIFRoaXMgTGljZW5zZSBnaXZlcyBubworICAgIHBlcm1pc3Npb24gdG8gbGljZW5zZSB0aGUgd29yayBpbiBhbnkgb3RoZXIgd2F5LCBidXQgaXQgZG9lcyBub3QKKyAgICBpbnZhbGlkYXRlIHN1Y2ggcGVybWlzc2lvbiBpZiB5b3UgaGF2ZSBzZXBhcmF0ZWx5IHJlY2VpdmVkIGl0LgorCisgICAgZCkgSWYgdGhlIHdvcmsgaGFzIGludGVyYWN0aXZlIHVzZXIgaW50ZXJmYWNlcywgZWFjaCBtdXN0IGRpc3BsYXkKKyAgICBBcHByb3ByaWF0ZSBMZWdhbCBOb3RpY2VzOyBob3dldmVyLCBpZiB0aGUgUHJvZ3JhbSBoYXMgaW50ZXJhY3RpdmUKKyAgICBpbnRlcmZhY2VzIHRoYXQgZG8gbm90IGRpc3BsYXkgQXBwcm9wcmlhdGUgTGVnYWwgTm90aWNlcywgeW91cgorICAgIHdvcmsgbmVlZCBub3QgbWFrZSB0aGVtIGRvIHNvLgorCisgIEEgY29tcGlsYXRpb24gb2YgYSBjb3ZlcmVkIHdvcmsgd2l0aCBvdGhlciBzZXBhcmF0ZSBhbmQgaW5kZXBlbmRlbnQKK3dvcmtzLCB3aGljaCBhcmUgbm90IGJ5IHRoZWlyIG5hdHVyZSBleHRlbnNpb25zIG9mIHRoZSBjb3ZlcmVkIHdvcmssCithbmQgd2hpY2ggYXJlIG5vdCBjb21iaW5lZCB3aXRoIGl0IHN1Y2ggYXMgdG8gZm9ybSBhIGxhcmdlciBwcm9ncmFtLAoraW4gb3Igb24gYSB2b2x1bWUgb2YgYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0sIGlzIGNhbGxlZCBhbgorImFnZ3JlZ2F0ZSIgaWYgdGhlIGNvbXBpbGF0aW9uIGFuZCBpdHMgcmVzdWx0aW5nIGNvcHlyaWdodCBhcmUgbm90Cit1c2VkIHRvIGxpbWl0IHRoZSBhY2Nlc3Mgb3IgbGVnYWwgcmlnaHRzIG9mIHRoZSBjb21waWxhdGlvbidzIHVzZXJzCitiZXlvbmQgd2hhdCB0aGUgaW5kaXZpZHVhbCB3b3JrcyBwZXJtaXQuICBJbmNsdXNpb24gb2YgYSBjb3ZlcmVkIHdvcmsKK2luIGFuIGFnZ3JlZ2F0ZSBkb2VzIG5vdCBjYXVzZSB0aGlzIExpY2Vuc2UgdG8gYXBwbHkgdG8gdGhlIG90aGVyCitwYXJ0cyBvZiB0aGUgYWdncmVnYXRlLgorCisgIDYuIENvbnZleWluZyBOb24tU291cmNlIEZvcm1zLgorCisgIFlvdSBtYXkgY29udmV5IGEgY292ZXJlZCB3b3JrIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgdGhlIHRlcm1zCitvZiBzZWN0aW9ucyA0IGFuZCA1LCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGNvbnZleSB0aGUKK21hY2hpbmUtcmVhZGFibGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwKK2luIG9uZSBvZiB0aGVzZSB3YXlzOgorCisgICAgYSkgQ29udmV5IHRoZSBvYmplY3QgY29kZSBpbiwgb3IgZW1ib2RpZWQgaW4sIGEgcGh5c2ljYWwgcHJvZHVjdAorICAgIChpbmNsdWRpbmcgYSBwaHlzaWNhbCBkaXN0cmlidXRpb24gbWVkaXVtKSwgYWNjb21wYW5pZWQgYnkgdGhlCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UgZml4ZWQgb24gYSBkdXJhYmxlIHBoeXNpY2FsIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLgorCisgICAgYikgQ29udmV5IHRoZSBvYmplY3QgY29kZSBpbiwgb3IgZW1ib2RpZWQgaW4sIGEgcGh5c2ljYWwgcHJvZHVjdAorICAgIChpbmNsdWRpbmcgYSBwaHlzaWNhbCBkaXN0cmlidXRpb24gbWVkaXVtKSwgYWNjb21wYW5pZWQgYnkgYQorICAgIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZSB5ZWFycyBhbmQgdmFsaWQgZm9yIGFzCisgICAgbG9uZyBhcyB5b3Ugb2ZmZXIgc3BhcmUgcGFydHMgb3IgY3VzdG9tZXIgc3VwcG9ydCBmb3IgdGhhdCBwcm9kdWN0CisgICAgbW9kZWwsIHRvIGdpdmUgYW55b25lIHdobyBwb3NzZXNzZXMgdGhlIG9iamVjdCBjb2RlIGVpdGhlciAoMSkgYQorICAgIGNvcHkgb2YgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIGZvciBhbGwgdGhlIHNvZnR3YXJlIGluIHRoZQorICAgIHByb2R1Y3QgdGhhdCBpcyBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgb24gYSBkdXJhYmxlIHBoeXNpY2FsCisgICAgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLCBmb3IgYSBwcmljZSBubworICAgIG1vcmUgdGhhbiB5b3VyIHJlYXNvbmFibGUgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgdGhpcworICAgIGNvbnZleWluZyBvZiBzb3VyY2UsIG9yICgyKSBhY2Nlc3MgdG8gY29weSB0aGUKKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBmcm9tIGEgbmV0d29yayBzZXJ2ZXIgYXQgbm8gY2hhcmdlLgorCisgICAgYykgQ29udmV5IGluZGl2aWR1YWwgY29waWVzIG9mIHRoZSBvYmplY3QgY29kZSB3aXRoIGEgY29weSBvZiB0aGUKKyAgICB3cml0dGVuIG9mZmVyIHRvIHByb3ZpZGUgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlLiAgVGhpcworICAgIGFsdGVybmF0aXZlIGlzIGFsbG93ZWQgb25seSBvY2Nhc2lvbmFsbHkgYW5kIG5vbmNvbW1lcmNpYWxseSwgYW5kCisgICAgb25seSBpZiB5b3UgcmVjZWl2ZWQgdGhlIG9iamVjdCBjb2RlIHdpdGggc3VjaCBhbiBvZmZlciwgaW4gYWNjb3JkCisgICAgd2l0aCBzdWJzZWN0aW9uIDZiLgorCisgICAgZCkgQ29udmV5IHRoZSBvYmplY3QgY29kZSBieSBvZmZlcmluZyBhY2Nlc3MgZnJvbSBhIGRlc2lnbmF0ZWQKKyAgICBwbGFjZSAoZ3JhdGlzIG9yIGZvciBhIGNoYXJnZSksIGFuZCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byB0aGUKKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBpbiB0aGUgc2FtZSB3YXkgdGhyb3VnaCB0aGUgc2FtZSBwbGFjZSBhdCBubworICAgIGZ1cnRoZXIgY2hhcmdlLiAgWW91IG5lZWQgbm90IHJlcXVpcmUgcmVjaXBpZW50cyB0byBjb3B5IHRoZQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLiAgSWYgdGhlIHBsYWNlIHRvCisgICAgY29weSB0aGUgb2JqZWN0IGNvZGUgaXMgYSBuZXR3b3JrIHNlcnZlciwgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlCisgICAgbWF5IGJlIG9uIGEgZGlmZmVyZW50IHNlcnZlciAob3BlcmF0ZWQgYnkgeW91IG9yIGEgdGhpcmQgcGFydHkpCisgICAgdGhhdCBzdXBwb3J0cyBlcXVpdmFsZW50IGNvcHlpbmcgZmFjaWxpdGllcywgcHJvdmlkZWQgeW91IG1haW50YWluCisgICAgY2xlYXIgZGlyZWN0aW9ucyBuZXh0IHRvIHRoZSBvYmplY3QgY29kZSBzYXlpbmcgd2hlcmUgdG8gZmluZCB0aGUKKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZS4gIFJlZ2FyZGxlc3Mgb2Ygd2hhdCBzZXJ2ZXIgaG9zdHMgdGhlCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UsIHlvdSByZW1haW4gb2JsaWdhdGVkIHRvIGVuc3VyZSB0aGF0IGl0IGlzCisgICAgYXZhaWxhYmxlIGZvciBhcyBsb25nIGFzIG5lZWRlZCB0byBzYXRpc2Z5IHRoZXNlIHJlcXVpcmVtZW50cy4KKworICAgIGUpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgdXNpbmcgcGVlci10by1wZWVyIHRyYW5zbWlzc2lvbiwgcHJvdmlkZWQKKyAgICB5b3UgaW5mb3JtIG90aGVyIHBlZXJzIHdoZXJlIHRoZSBvYmplY3QgY29kZSBhbmQgQ29ycmVzcG9uZGluZworICAgIFNvdXJjZSBvZiB0aGUgd29yayBhcmUgYmVpbmcgb2ZmZXJlZCB0byB0aGUgZ2VuZXJhbCBwdWJsaWMgYXQgbm8KKyAgICBjaGFyZ2UgdW5kZXIgc3Vic2VjdGlvbiA2ZC4KKworICBBIHNlcGFyYWJsZSBwb3J0aW9uIG9mIHRoZSBvYmplY3QgY29kZSwgd2hvc2Ugc291cmNlIGNvZGUgaXMgZXhjbHVkZWQKK2Zyb20gdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIGFzIGEgU3lzdGVtIExpYnJhcnksIG5lZWQgbm90IGJlCitpbmNsdWRlZCBpbiBjb252ZXlpbmcgdGhlIG9iamVjdCBjb2RlIHdvcmsuCisKKyAgQSAiVXNlciBQcm9kdWN0IiBpcyBlaXRoZXIgKDEpIGEgImNvbnN1bWVyIHByb2R1Y3QiLCB3aGljaCBtZWFucyBhbnkKK3RhbmdpYmxlIHBlcnNvbmFsIHByb3BlcnR5IHdoaWNoIGlzIG5vcm1hbGx5IHVzZWQgZm9yIHBlcnNvbmFsLCBmYW1pbHksCitvciBob3VzZWhvbGQgcHVycG9zZXMsIG9yICgyKSBhbnl0aGluZyBkZXNpZ25lZCBvciBzb2xkIGZvciBpbmNvcnBvcmF0aW9uCitpbnRvIGEgZHdlbGxpbmcuICBJbiBkZXRlcm1pbmluZyB3aGV0aGVyIGEgcHJvZHVjdCBpcyBhIGNvbnN1bWVyIHByb2R1Y3QsCitkb3VidGZ1bCBjYXNlcyBzaGFsbCBiZSByZXNvbHZlZCBpbiBmYXZvciBvZiBjb3ZlcmFnZS4gIEZvciBhIHBhcnRpY3VsYXIKK3Byb2R1Y3QgcmVjZWl2ZWQgYnkgYSBwYXJ0aWN1bGFyIHVzZXIsICJub3JtYWxseSB1c2VkIiByZWZlcnMgdG8gYQordHlwaWNhbCBvciBjb21tb24gdXNlIG9mIHRoYXQgY2xhc3Mgb2YgcHJvZHVjdCwgcmVnYXJkbGVzcyBvZiB0aGUgc3RhdHVzCitvZiB0aGUgcGFydGljdWxhciB1c2VyIG9yIG9mIHRoZSB3YXkgaW4gd2hpY2ggdGhlIHBhcnRpY3VsYXIgdXNlcgorYWN0dWFsbHkgdXNlcywgb3IgZXhwZWN0cyBvciBpcyBleHBlY3RlZCB0byB1c2UsIHRoZSBwcm9kdWN0LiAgQSBwcm9kdWN0CitpcyBhIGNvbnN1bWVyIHByb2R1Y3QgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBwcm9kdWN0IGhhcyBzdWJzdGFudGlhbAorY29tbWVyY2lhbCwgaW5kdXN0cmlhbCBvciBub24tY29uc3VtZXIgdXNlcywgdW5sZXNzIHN1Y2ggdXNlcyByZXByZXNlbnQKK3RoZSBvbmx5IHNpZ25pZmljYW50IG1vZGUgb2YgdXNlIG9mIHRoZSBwcm9kdWN0LgorCisgICJJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24iIGZvciBhIFVzZXIgUHJvZHVjdCBtZWFucyBhbnkgbWV0aG9kcywKK3Byb2NlZHVyZXMsIGF1dGhvcml6YXRpb24ga2V5cywgb3Igb3RoZXIgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gaW5zdGFsbAorYW5kIGV4ZWN1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgYSBjb3ZlcmVkIHdvcmsgaW4gdGhhdCBVc2VyIFByb2R1Y3QgZnJvbQorYSBtb2RpZmllZCB2ZXJzaW9uIG9mIGl0cyBDb3JyZXNwb25kaW5nIFNvdXJjZS4gIFRoZSBpbmZvcm1hdGlvbiBtdXN0CitzdWZmaWNlIHRvIGVuc3VyZSB0aGF0IHRoZSBjb250aW51ZWQgZnVuY3Rpb25pbmcgb2YgdGhlIG1vZGlmaWVkIG9iamVjdAorY29kZSBpcyBpbiBubyBjYXNlIHByZXZlbnRlZCBvciBpbnRlcmZlcmVkIHdpdGggc29sZWx5IGJlY2F1c2UKK21vZGlmaWNhdGlvbiBoYXMgYmVlbiBtYWRlLgorCisgIElmIHlvdSBjb252ZXkgYW4gb2JqZWN0IGNvZGUgd29yayB1bmRlciB0aGlzIHNlY3Rpb24gaW4sIG9yIHdpdGgsIG9yCitzcGVjaWZpY2FsbHkgZm9yIHVzZSBpbiwgYSBVc2VyIFByb2R1Y3QsIGFuZCB0aGUgY29udmV5aW5nIG9jY3VycyBhcworcGFydCBvZiBhIHRyYW5zYWN0aW9uIGluIHdoaWNoIHRoZSByaWdodCBvZiBwb3NzZXNzaW9uIGFuZCB1c2Ugb2YgdGhlCitVc2VyIFByb2R1Y3QgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIHJlY2lwaWVudCBpbiBwZXJwZXR1aXR5IG9yIGZvciBhCitmaXhlZCB0ZXJtIChyZWdhcmRsZXNzIG9mIGhvdyB0aGUgdHJhbnNhY3Rpb24gaXMgY2hhcmFjdGVyaXplZCksIHRoZQorQ29ycmVzcG9uZGluZyBTb3VyY2UgY29udmV5ZWQgdW5kZXIgdGhpcyBzZWN0aW9uIG11c3QgYmUgYWNjb21wYW5pZWQKK2J5IHRoZSBJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24uICBCdXQgdGhpcyByZXF1aXJlbWVudCBkb2VzIG5vdCBhcHBseQoraWYgbmVpdGhlciB5b3Ugbm9yIGFueSB0aGlyZCBwYXJ0eSByZXRhaW5zIHRoZSBhYmlsaXR5IHRvIGluc3RhbGwKK21vZGlmaWVkIG9iamVjdCBjb2RlIG9uIHRoZSBVc2VyIFByb2R1Y3QgKGZvciBleGFtcGxlLCB0aGUgd29yayBoYXMKK2JlZW4gaW5zdGFsbGVkIGluIFJPTSkuCisKKyAgVGhlIHJlcXVpcmVtZW50IHRvIHByb3ZpZGUgSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uIGRvZXMgbm90IGluY2x1ZGUgYQorcmVxdWlyZW1lbnQgdG8gY29udGludWUgdG8gcHJvdmlkZSBzdXBwb3J0IHNlcnZpY2UsIHdhcnJhbnR5LCBvciB1cGRhdGVzCitmb3IgYSB3b3JrIHRoYXQgaGFzIGJlZW4gbW9kaWZpZWQgb3IgaW5zdGFsbGVkIGJ5IHRoZSByZWNpcGllbnQsIG9yIGZvcgordGhlIFVzZXIgUHJvZHVjdCBpbiB3aGljaCBpdCBoYXMgYmVlbiBtb2RpZmllZCBvciBpbnN0YWxsZWQuICBBY2Nlc3MgdG8gYQorbmV0d29yayBtYXkgYmUgZGVuaWVkIHdoZW4gdGhlIG1vZGlmaWNhdGlvbiBpdHNlbGYgbWF0ZXJpYWxseSBhbmQKK2FkdmVyc2VseSBhZmZlY3RzIHRoZSBvcGVyYXRpb24gb2YgdGhlIG5ldHdvcmsgb3IgdmlvbGF0ZXMgdGhlIHJ1bGVzIGFuZAorcHJvdG9jb2xzIGZvciBjb21tdW5pY2F0aW9uIGFjcm9zcyB0aGUgbmV0d29yay4KKworICBDb3JyZXNwb25kaW5nIFNvdXJjZSBjb252ZXllZCwgYW5kIEluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiBwcm92aWRlZCwKK2luIGFjY29yZCB3aXRoIHRoaXMgc2VjdGlvbiBtdXN0IGJlIGluIGEgZm9ybWF0IHRoYXQgaXMgcHVibGljbHkKK2RvY3VtZW50ZWQgKGFuZCB3aXRoIGFuIGltcGxlbWVudGF0aW9uIGF2YWlsYWJsZSB0byB0aGUgcHVibGljIGluCitzb3VyY2UgY29kZSBmb3JtKSwgYW5kIG11c3QgcmVxdWlyZSBubyBzcGVjaWFsIHBhc3N3b3JkIG9yIGtleSBmb3IKK3VucGFja2luZywgcmVhZGluZyBvciBjb3B5aW5nLgorCisgIDcuIEFkZGl0aW9uYWwgVGVybXMuCisKKyAgIkFkZGl0aW9uYWwgcGVybWlzc2lvbnMiIGFyZSB0ZXJtcyB0aGF0IHN1cHBsZW1lbnQgdGhlIHRlcm1zIG9mIHRoaXMKK0xpY2Vuc2UgYnkgbWFraW5nIGV4Y2VwdGlvbnMgZnJvbSBvbmUgb3IgbW9yZSBvZiBpdHMgY29uZGl0aW9ucy4KK0FkZGl0aW9uYWwgcGVybWlzc2lvbnMgdGhhdCBhcmUgYXBwbGljYWJsZSB0byB0aGUgZW50aXJlIFByb2dyYW0gc2hhbGwKK2JlIHRyZWF0ZWQgYXMgdGhvdWdoIHRoZXkgd2VyZSBpbmNsdWRlZCBpbiB0aGlzIExpY2Vuc2UsIHRvIHRoZSBleHRlbnQKK3RoYXQgdGhleSBhcmUgdmFsaWQgdW5kZXIgYXBwbGljYWJsZSBsYXcuICBJZiBhZGRpdGlvbmFsIHBlcm1pc3Npb25zCithcHBseSBvbmx5IHRvIHBhcnQgb2YgdGhlIFByb2dyYW0sIHRoYXQgcGFydCBtYXkgYmUgdXNlZCBzZXBhcmF0ZWx5Cit1bmRlciB0aG9zZSBwZXJtaXNzaW9ucywgYnV0IHRoZSBlbnRpcmUgUHJvZ3JhbSByZW1haW5zIGdvdmVybmVkIGJ5Cit0aGlzIExpY2Vuc2Ugd2l0aG91dCByZWdhcmQgdG8gdGhlIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMuCisKKyAgV2hlbiB5b3UgY29udmV5IGEgY29weSBvZiBhIGNvdmVyZWQgd29yaywgeW91IG1heSBhdCB5b3VyIG9wdGlvbgorcmVtb3ZlIGFueSBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGZyb20gdGhhdCBjb3B5LCBvciBmcm9tIGFueSBwYXJ0IG9mCitpdC4gIChBZGRpdGlvbmFsIHBlcm1pc3Npb25zIG1heSBiZSB3cml0dGVuIHRvIHJlcXVpcmUgdGhlaXIgb3duCityZW1vdmFsIGluIGNlcnRhaW4gY2FzZXMgd2hlbiB5b3UgbW9kaWZ5IHRoZSB3b3JrLikgIFlvdSBtYXkgcGxhY2UKK2FkZGl0aW9uYWwgcGVybWlzc2lvbnMgb24gbWF0ZXJpYWwsIGFkZGVkIGJ5IHlvdSB0byBhIGNvdmVyZWQgd29yaywKK2ZvciB3aGljaCB5b3UgaGF2ZSBvciBjYW4gZ2l2ZSBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgcGVybWlzc2lvbi4KKworICBOb3R3aXRoc3RhbmRpbmcgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UsIGZvciBtYXRlcmlhbCB5b3UKK2FkZCB0byBhIGNvdmVyZWQgd29yaywgeW91IG1heSAoaWYgYXV0aG9yaXplZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YKK3RoYXQgbWF0ZXJpYWwpIHN1cHBsZW1lbnQgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSB3aXRoIHRlcm1zOgorCisgICAgYSkgRGlzY2xhaW1pbmcgd2FycmFudHkgb3IgbGltaXRpbmcgbGlhYmlsaXR5IGRpZmZlcmVudGx5IGZyb20gdGhlCisgICAgdGVybXMgb2Ygc2VjdGlvbnMgMTUgYW5kIDE2IG9mIHRoaXMgTGljZW5zZTsgb3IKKworICAgIGIpIFJlcXVpcmluZyBwcmVzZXJ2YXRpb24gb2Ygc3BlY2lmaWVkIHJlYXNvbmFibGUgbGVnYWwgbm90aWNlcyBvcgorICAgIGF1dGhvciBhdHRyaWJ1dGlvbnMgaW4gdGhhdCBtYXRlcmlhbCBvciBpbiB0aGUgQXBwcm9wcmlhdGUgTGVnYWwKKyAgICBOb3RpY2VzIGRpc3BsYXllZCBieSB3b3JrcyBjb250YWluaW5nIGl0OyBvcgorCisgICAgYykgUHJvaGliaXRpbmcgbWlzcmVwcmVzZW50YXRpb24gb2YgdGhlIG9yaWdpbiBvZiB0aGF0IG1hdGVyaWFsLCBvcgorICAgIHJlcXVpcmluZyB0aGF0IG1vZGlmaWVkIHZlcnNpb25zIG9mIHN1Y2ggbWF0ZXJpYWwgYmUgbWFya2VkIGluCisgICAgcmVhc29uYWJsZSB3YXlzIGFzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCB2ZXJzaW9uOyBvcgorCisgICAgZCkgTGltaXRpbmcgdGhlIHVzZSBmb3IgcHVibGljaXR5IHB1cnBvc2VzIG9mIG5hbWVzIG9mIGxpY2Vuc29ycyBvcgorICAgIGF1dGhvcnMgb2YgdGhlIG1hdGVyaWFsOyBvcgorCisgICAgZSkgRGVjbGluaW5nIHRvIGdyYW50IHJpZ2h0cyB1bmRlciB0cmFkZW1hcmsgbGF3IGZvciB1c2Ugb2Ygc29tZQorICAgIHRyYWRlIG5hbWVzLCB0cmFkZW1hcmtzLCBvciBzZXJ2aWNlIG1hcmtzOyBvcgorCisgICAgZikgUmVxdWlyaW5nIGluZGVtbmlmaWNhdGlvbiBvZiBsaWNlbnNvcnMgYW5kIGF1dGhvcnMgb2YgdGhhdAorICAgIG1hdGVyaWFsIGJ5IGFueW9uZSB3aG8gY29udmV5cyB0aGUgbWF0ZXJpYWwgKG9yIG1vZGlmaWVkIHZlcnNpb25zIG9mCisgICAgaXQpIHdpdGggY29udHJhY3R1YWwgYXNzdW1wdGlvbnMgb2YgbGlhYmlsaXR5IHRvIHRoZSByZWNpcGllbnQsIGZvcgorICAgIGFueSBsaWFiaWxpdHkgdGhhdCB0aGVzZSBjb250cmFjdHVhbCBhc3N1bXB0aW9ucyBkaXJlY3RseSBpbXBvc2Ugb24KKyAgICB0aG9zZSBsaWNlbnNvcnMgYW5kIGF1dGhvcnMuCisKKyAgQWxsIG90aGVyIG5vbi1wZXJtaXNzaXZlIGFkZGl0aW9uYWwgdGVybXMgYXJlIGNvbnNpZGVyZWQgImZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyIgd2l0aGluIHRoZSBtZWFuaW5nIG9mIHNlY3Rpb24gMTAuICBJZiB0aGUgUHJvZ3JhbSBhcyB5b3UKK3JlY2VpdmVkIGl0LCBvciBhbnkgcGFydCBvZiBpdCwgY29udGFpbnMgYSBub3RpY2Ugc3RhdGluZyB0aGF0IGl0IGlzCitnb3Zlcm5lZCBieSB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCBhIHRlcm0gdGhhdCBpcyBhIGZ1cnRoZXIKK3Jlc3RyaWN0aW9uLCB5b3UgbWF5IHJlbW92ZSB0aGF0IHRlcm0uICBJZiBhIGxpY2Vuc2UgZG9jdW1lbnQgY29udGFpbnMKK2EgZnVydGhlciByZXN0cmljdGlvbiBidXQgcGVybWl0cyByZWxpY2Vuc2luZyBvciBjb252ZXlpbmcgdW5kZXIgdGhpcworTGljZW5zZSwgeW91IG1heSBhZGQgdG8gYSBjb3ZlcmVkIHdvcmsgbWF0ZXJpYWwgZ292ZXJuZWQgYnkgdGhlIHRlcm1zCitvZiB0aGF0IGxpY2Vuc2UgZG9jdW1lbnQsIHByb3ZpZGVkIHRoYXQgdGhlIGZ1cnRoZXIgcmVzdHJpY3Rpb24gZG9lcworbm90IHN1cnZpdmUgc3VjaCByZWxpY2Vuc2luZyBvciBjb252ZXlpbmcuCisKKyAgSWYgeW91IGFkZCB0ZXJtcyB0byBhIGNvdmVyZWQgd29yayBpbiBhY2NvcmQgd2l0aCB0aGlzIHNlY3Rpb24sIHlvdQorbXVzdCBwbGFjZSwgaW4gdGhlIHJlbGV2YW50IHNvdXJjZSBmaWxlcywgYSBzdGF0ZW1lbnQgb2YgdGhlCithZGRpdGlvbmFsIHRlcm1zIHRoYXQgYXBwbHkgdG8gdGhvc2UgZmlsZXMsIG9yIGEgbm90aWNlIGluZGljYXRpbmcKK3doZXJlIHRvIGZpbmQgdGhlIGFwcGxpY2FibGUgdGVybXMuCisKKyAgQWRkaXRpb25hbCB0ZXJtcywgcGVybWlzc2l2ZSBvciBub24tcGVybWlzc2l2ZSwgbWF5IGJlIHN0YXRlZCBpbiB0aGUKK2Zvcm0gb2YgYSBzZXBhcmF0ZWx5IHdyaXR0ZW4gbGljZW5zZSwgb3Igc3RhdGVkIGFzIGV4Y2VwdGlvbnM7Cit0aGUgYWJvdmUgcmVxdWlyZW1lbnRzIGFwcGx5IGVpdGhlciB3YXkuCisKKyAgOC4gVGVybWluYXRpb24uCisKKyAgWW91IG1heSBub3QgcHJvcGFnYXRlIG9yIG1vZGlmeSBhIGNvdmVyZWQgd29yayBleGNlcHQgYXMgZXhwcmVzc2x5Citwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdCBvdGhlcndpc2UgdG8gcHJvcGFnYXRlIG9yCittb2RpZnkgaXQgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIKK3RoaXMgTGljZW5zZSAoaW5jbHVkaW5nIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCB1bmRlciB0aGUgdGhpcmQKK3BhcmFncmFwaCBvZiBzZWN0aW9uIDExKS4KKworICBIb3dldmVyLCBpZiB5b3UgY2Vhc2UgYWxsIHZpb2xhdGlvbiBvZiB0aGlzIExpY2Vuc2UsIHRoZW4geW91cgorbGljZW5zZSBmcm9tIGEgcGFydGljdWxhciBjb3B5cmlnaHQgaG9sZGVyIGlzIHJlaW5zdGF0ZWQgKGEpCitwcm92aXNpb25hbGx5LCB1bmxlc3MgYW5kIHVudGlsIHRoZSBjb3B5cmlnaHQgaG9sZGVyIGV4cGxpY2l0bHkgYW5kCitmaW5hbGx5IHRlcm1pbmF0ZXMgeW91ciBsaWNlbnNlLCBhbmQgKGIpIHBlcm1hbmVudGx5LCBpZiB0aGUgY29weXJpZ2h0Citob2xkZXIgZmFpbHMgdG8gbm90aWZ5IHlvdSBvZiB0aGUgdmlvbGF0aW9uIGJ5IHNvbWUgcmVhc29uYWJsZSBtZWFucworcHJpb3IgdG8gNjAgZGF5cyBhZnRlciB0aGUgY2Vzc2F0aW9uLgorCisgIE1vcmVvdmVyLCB5b3VyIGxpY2Vuc2UgZnJvbSBhIHBhcnRpY3VsYXIgY29weXJpZ2h0IGhvbGRlciBpcworcmVpbnN0YXRlZCBwZXJtYW5lbnRseSBpZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3RpZmllcyB5b3Ugb2YgdGhlCit2aW9sYXRpb24gYnkgc29tZSByZWFzb25hYmxlIG1lYW5zLCB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHlvdSBoYXZlCityZWNlaXZlZCBub3RpY2Ugb2YgdmlvbGF0aW9uIG9mIHRoaXMgTGljZW5zZSAoZm9yIGFueSB3b3JrKSBmcm9tIHRoYXQKK2NvcHlyaWdodCBob2xkZXIsIGFuZCB5b3UgY3VyZSB0aGUgdmlvbGF0aW9uIHByaW9yIHRvIDMwIGRheXMgYWZ0ZXIKK3lvdXIgcmVjZWlwdCBvZiB0aGUgbm90aWNlLgorCisgIFRlcm1pbmF0aW9uIG9mIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgc2VjdGlvbiBkb2VzIG5vdCB0ZXJtaW5hdGUgdGhlCitsaWNlbnNlcyBvZiBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcyBvciByaWdodHMgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZS4gIElmIHlvdXIgcmlnaHRzIGhhdmUgYmVlbiB0ZXJtaW5hdGVkIGFuZCBub3QgcGVybWFuZW50bHkKK3JlaW5zdGF0ZWQsIHlvdSBkbyBub3QgcXVhbGlmeSB0byByZWNlaXZlIG5ldyBsaWNlbnNlcyBmb3IgdGhlIHNhbWUKK21hdGVyaWFsIHVuZGVyIHNlY3Rpb24gMTAuCisKKyAgOS4gQWNjZXB0YW5jZSBOb3QgUmVxdWlyZWQgZm9yIEhhdmluZyBDb3BpZXMuCisKKyAgWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSBpbiBvcmRlciB0byByZWNlaXZlIG9yCitydW4gYSBjb3B5IG9mIHRoZSBQcm9ncmFtLiAgQW5jaWxsYXJ5IHByb3BhZ2F0aW9uIG9mIGEgY292ZXJlZCB3b3JrCitvY2N1cnJpbmcgc29sZWx5IGFzIGEgY29uc2VxdWVuY2Ugb2YgdXNpbmcgcGVlci10by1wZWVyIHRyYW5zbWlzc2lvbgordG8gcmVjZWl2ZSBhIGNvcHkgbGlrZXdpc2UgZG9lcyBub3QgcmVxdWlyZSBhY2NlcHRhbmNlLiAgSG93ZXZlciwKK25vdGhpbmcgb3RoZXIgdGhhbiB0aGlzIExpY2Vuc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIHByb3BhZ2F0ZSBvcgorbW9kaWZ5IGFueSBjb3ZlcmVkIHdvcmsuICBUaGVzZSBhY3Rpb25zIGluZnJpbmdlIGNvcHlyaWdodCBpZiB5b3UgZG8KK25vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieSBtb2RpZnlpbmcgb3IgcHJvcGFnYXRpbmcgYQorY292ZXJlZCB3b3JrLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzby4KKworICAxMC4gQXV0b21hdGljIExpY2Vuc2luZyBvZiBEb3duc3RyZWFtIFJlY2lwaWVudHMuCisKKyAgRWFjaCB0aW1lIHlvdSBjb252ZXkgYSBjb3ZlcmVkIHdvcmssIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseQorcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlIG9yaWdpbmFsIGxpY2Vuc29ycywgdG8gcnVuLCBtb2RpZnkgYW5kCitwcm9wYWdhdGUgdGhhdCB3b3JrLCBzdWJqZWN0IHRvIHRoaXMgTGljZW5zZS4gIFlvdSBhcmUgbm90IHJlc3BvbnNpYmxlCitmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB3aXRoIHRoaXMgTGljZW5zZS4KKworICBBbiAiZW50aXR5IHRyYW5zYWN0aW9uIiBpcyBhIHRyYW5zYWN0aW9uIHRyYW5zZmVycmluZyBjb250cm9sIG9mIGFuCitvcmdhbml6YXRpb24sIG9yIHN1YnN0YW50aWFsbHkgYWxsIGFzc2V0cyBvZiBvbmUsIG9yIHN1YmRpdmlkaW5nIGFuCitvcmdhbml6YXRpb24sIG9yIG1lcmdpbmcgb3JnYW5pemF0aW9ucy4gIElmIHByb3BhZ2F0aW9uIG9mIGEgY292ZXJlZAord29yayByZXN1bHRzIGZyb20gYW4gZW50aXR5IHRyYW5zYWN0aW9uLCBlYWNoIHBhcnR5IHRvIHRoYXQKK3RyYW5zYWN0aW9uIHdobyByZWNlaXZlcyBhIGNvcHkgb2YgdGhlIHdvcmsgYWxzbyByZWNlaXZlcyB3aGF0ZXZlcgorbGljZW5zZXMgdG8gdGhlIHdvcmsgdGhlIHBhcnR5J3MgcHJlZGVjZXNzb3IgaW4gaW50ZXJlc3QgaGFkIG9yIGNvdWxkCitnaXZlIHVuZGVyIHRoZSBwcmV2aW91cyBwYXJhZ3JhcGgsIHBsdXMgYSByaWdodCB0byBwb3NzZXNzaW9uIG9mIHRoZQorQ29ycmVzcG9uZGluZyBTb3VyY2Ugb2YgdGhlIHdvcmsgZnJvbSB0aGUgcHJlZGVjZXNzb3IgaW4gaW50ZXJlc3QsIGlmCit0aGUgcHJlZGVjZXNzb3IgaGFzIGl0IG9yIGNhbiBnZXQgaXQgd2l0aCByZWFzb25hYmxlIGVmZm9ydHMuCisKKyAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyIHJlc3RyaWN0aW9ucyBvbiB0aGUgZXhlcmNpc2Ugb2YgdGhlCityaWdodHMgZ3JhbnRlZCBvciBhZmZpcm1lZCB1bmRlciB0aGlzIExpY2Vuc2UuICBGb3IgZXhhbXBsZSwgeW91IG1heQorbm90IGltcG9zZSBhIGxpY2Vuc2UgZmVlLCByb3lhbHR5LCBvciBvdGhlciBjaGFyZ2UgZm9yIGV4ZXJjaXNlIG9mCityaWdodHMgZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2UsIGFuZCB5b3UgbWF5IG5vdCBpbml0aWF0ZSBsaXRpZ2F0aW9uCisoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdAorYW55IHBhdGVudCBjbGFpbSBpcyBpbmZyaW5nZWQgYnkgbWFraW5nLCB1c2luZywgc2VsbGluZywgb2ZmZXJpbmcgZm9yCitzYWxlLCBvciBpbXBvcnRpbmcgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24gb2YgaXQuCisKKyAgMTEuIFBhdGVudHMuCisKKyAgQSAiY29udHJpYnV0b3IiIGlzIGEgY29weXJpZ2h0IGhvbGRlciB3aG8gYXV0aG9yaXplcyB1c2UgdW5kZXIgdGhpcworTGljZW5zZSBvZiB0aGUgUHJvZ3JhbSBvciBhIHdvcmsgb24gd2hpY2ggdGhlIFByb2dyYW0gaXMgYmFzZWQuICBUaGUKK3dvcmsgdGh1cyBsaWNlbnNlZCBpcyBjYWxsZWQgdGhlIGNvbnRyaWJ1dG9yJ3MgImNvbnRyaWJ1dG9yIHZlcnNpb24iLgorCisgIEEgY29udHJpYnV0b3IncyAiZXNzZW50aWFsIHBhdGVudCBjbGFpbXMiIGFyZSBhbGwgcGF0ZW50IGNsYWltcworb3duZWQgb3IgY29udHJvbGxlZCBieSB0aGUgY29udHJpYnV0b3IsIHdoZXRoZXIgYWxyZWFkeSBhY3F1aXJlZCBvcgoraGVyZWFmdGVyIGFjcXVpcmVkLCB0aGF0IHdvdWxkIGJlIGluZnJpbmdlZCBieSBzb21lIG1hbm5lciwgcGVybWl0dGVkCitieSB0aGlzIExpY2Vuc2UsIG9mIG1ha2luZywgdXNpbmcsIG9yIHNlbGxpbmcgaXRzIGNvbnRyaWJ1dG9yIHZlcnNpb24sCitidXQgZG8gbm90IGluY2x1ZGUgY2xhaW1zIHRoYXQgd291bGQgYmUgaW5mcmluZ2VkIG9ubHkgYXMgYQorY29uc2VxdWVuY2Ugb2YgZnVydGhlciBtb2RpZmljYXRpb24gb2YgdGhlIGNvbnRyaWJ1dG9yIHZlcnNpb24uICBGb3IKK3B1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgImNvbnRyb2wiIGluY2x1ZGVzIHRoZSByaWdodCB0byBncmFudAorcGF0ZW50IHN1YmxpY2Vuc2VzIGluIGEgbWFubmVyIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVxdWlyZW1lbnRzIG9mCit0aGlzIExpY2Vuc2UuCisKKyAgRWFjaCBjb250cmlidXRvciBncmFudHMgeW91IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUKK3BhdGVudCBsaWNlbnNlIHVuZGVyIHRoZSBjb250cmlidXRvcidzIGVzc2VudGlhbCBwYXRlbnQgY2xhaW1zLCB0bworbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwgaW1wb3J0IGFuZCBvdGhlcndpc2UgcnVuLCBtb2RpZnkgYW5kCitwcm9wYWdhdGUgdGhlIGNvbnRlbnRzIG9mIGl0cyBjb250cmlidXRvciB2ZXJzaW9uLgorCisgIEluIHRoZSBmb2xsb3dpbmcgdGhyZWUgcGFyYWdyYXBocywgYSAicGF0ZW50IGxpY2Vuc2UiIGlzIGFueSBleHByZXNzCithZ3JlZW1lbnQgb3IgY29tbWl0bWVudCwgaG93ZXZlciBkZW5vbWluYXRlZCwgbm90IHRvIGVuZm9yY2UgYSBwYXRlbnQKKyhzdWNoIGFzIGFuIGV4cHJlc3MgcGVybWlzc2lvbiB0byBwcmFjdGljZSBhIHBhdGVudCBvciBjb3ZlbmFudCBub3QgdG8KK3N1ZSBmb3IgcGF0ZW50IGluZnJpbmdlbWVudCkuICBUbyAiZ3JhbnQiIHN1Y2ggYSBwYXRlbnQgbGljZW5zZSB0byBhCitwYXJ0eSBtZWFucyB0byBtYWtlIHN1Y2ggYW4gYWdyZWVtZW50IG9yIGNvbW1pdG1lbnQgbm90IHRvIGVuZm9yY2UgYQorcGF0ZW50IGFnYWluc3QgdGhlIHBhcnR5LgorCisgIElmIHlvdSBjb252ZXkgYSBjb3ZlcmVkIHdvcmssIGtub3dpbmdseSByZWx5aW5nIG9uIGEgcGF0ZW50IGxpY2Vuc2UsCithbmQgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIG9mIHRoZSB3b3JrIGlzIG5vdCBhdmFpbGFibGUgZm9yIGFueW9uZQordG8gY29weSwgZnJlZSBvZiBjaGFyZ2UgYW5kIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsIHRocm91Z2ggYQorcHVibGljbHkgYXZhaWxhYmxlIG5ldHdvcmsgc2VydmVyIG9yIG90aGVyIHJlYWRpbHkgYWNjZXNzaWJsZSBtZWFucywKK3RoZW4geW91IG11c3QgZWl0aGVyICgxKSBjYXVzZSB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgdG8gYmUgc28KK2F2YWlsYWJsZSwgb3IgKDIpIGFycmFuZ2UgdG8gZGVwcml2ZSB5b3Vyc2VsZiBvZiB0aGUgYmVuZWZpdCBvZiB0aGUKK3BhdGVudCBsaWNlbnNlIGZvciB0aGlzIHBhcnRpY3VsYXIgd29yaywgb3IgKDMpIGFycmFuZ2UsIGluIGEgbWFubmVyCitjb25zaXN0ZW50IHdpdGggdGhlIHJlcXVpcmVtZW50cyBvZiB0aGlzIExpY2Vuc2UsIHRvIGV4dGVuZCB0aGUgcGF0ZW50CitsaWNlbnNlIHRvIGRvd25zdHJlYW0gcmVjaXBpZW50cy4gICJLbm93aW5nbHkgcmVseWluZyIgbWVhbnMgeW91IGhhdmUKK2FjdHVhbCBrbm93bGVkZ2UgdGhhdCwgYnV0IGZvciB0aGUgcGF0ZW50IGxpY2Vuc2UsIHlvdXIgY29udmV5aW5nIHRoZQorY292ZXJlZCB3b3JrIGluIGEgY291bnRyeSwgb3IgeW91ciByZWNpcGllbnQncyB1c2Ugb2YgdGhlIGNvdmVyZWQgd29yaworaW4gYSBjb3VudHJ5LCB3b3VsZCBpbmZyaW5nZSBvbmUgb3IgbW9yZSBpZGVudGlmaWFibGUgcGF0ZW50cyBpbiB0aGF0Citjb3VudHJ5IHRoYXQgeW91IGhhdmUgcmVhc29uIHRvIGJlbGlldmUgYXJlIHZhbGlkLgorCisgIElmLCBwdXJzdWFudCB0byBvciBpbiBjb25uZWN0aW9uIHdpdGggYSBzaW5nbGUgdHJhbnNhY3Rpb24gb3IKK2FycmFuZ2VtZW50LCB5b3UgY29udmV5LCBvciBwcm9wYWdhdGUgYnkgcHJvY3VyaW5nIGNvbnZleWFuY2Ugb2YsIGEKK2NvdmVyZWQgd29yaywgYW5kIGdyYW50IGEgcGF0ZW50IGxpY2Vuc2UgdG8gc29tZSBvZiB0aGUgcGFydGllcworcmVjZWl2aW5nIHRoZSBjb3ZlcmVkIHdvcmsgYXV0aG9yaXppbmcgdGhlbSB0byB1c2UsIHByb3BhZ2F0ZSwgbW9kaWZ5CitvciBjb252ZXkgYSBzcGVjaWZpYyBjb3B5IG9mIHRoZSBjb3ZlcmVkIHdvcmssIHRoZW4gdGhlIHBhdGVudCBsaWNlbnNlCit5b3UgZ3JhbnQgaXMgYXV0b21hdGljYWxseSBleHRlbmRlZCB0byBhbGwgcmVjaXBpZW50cyBvZiB0aGUgY292ZXJlZAord29yayBhbmQgd29ya3MgYmFzZWQgb24gaXQuCisKKyAgQSBwYXRlbnQgbGljZW5zZSBpcyAiZGlzY3JpbWluYXRvcnkiIGlmIGl0IGRvZXMgbm90IGluY2x1ZGUgd2l0aGluCit0aGUgc2NvcGUgb2YgaXRzIGNvdmVyYWdlLCBwcm9oaWJpdHMgdGhlIGV4ZXJjaXNlIG9mLCBvciBpcworY29uZGl0aW9uZWQgb24gdGhlIG5vbi1leGVyY2lzZSBvZiBvbmUgb3IgbW9yZSBvZiB0aGUgcmlnaHRzIHRoYXQgYXJlCitzcGVjaWZpY2FsbHkgZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBZb3UgbWF5IG5vdCBjb252ZXkgYSBjb3ZlcmVkCit3b3JrIGlmIHlvdSBhcmUgYSBwYXJ0eSB0byBhbiBhcnJhbmdlbWVudCB3aXRoIGEgdGhpcmQgcGFydHkgdGhhdCBpcworaW4gdGhlIGJ1c2luZXNzIG9mIGRpc3RyaWJ1dGluZyBzb2Z0d2FyZSwgdW5kZXIgd2hpY2ggeW91IG1ha2UgcGF5bWVudAordG8gdGhlIHRoaXJkIHBhcnR5IGJhc2VkIG9uIHRoZSBleHRlbnQgb2YgeW91ciBhY3Rpdml0eSBvZiBjb252ZXlpbmcKK3RoZSB3b3JrLCBhbmQgdW5kZXIgd2hpY2ggdGhlIHRoaXJkIHBhcnR5IGdyYW50cywgdG8gYW55IG9mIHRoZQorcGFydGllcyB3aG8gd291bGQgcmVjZWl2ZSB0aGUgY292ZXJlZCB3b3JrIGZyb20geW91LCBhIGRpc2NyaW1pbmF0b3J5CitwYXRlbnQgbGljZW5zZSAoYSkgaW4gY29ubmVjdGlvbiB3aXRoIGNvcGllcyBvZiB0aGUgY292ZXJlZCB3b3JrCitjb252ZXllZCBieSB5b3UgKG9yIGNvcGllcyBtYWRlIGZyb20gdGhvc2UgY29waWVzKSwgb3IgKGIpIHByaW1hcmlseQorZm9yIGFuZCBpbiBjb25uZWN0aW9uIHdpdGggc3BlY2lmaWMgcHJvZHVjdHMgb3IgY29tcGlsYXRpb25zIHRoYXQKK2NvbnRhaW4gdGhlIGNvdmVyZWQgd29yaywgdW5sZXNzIHlvdSBlbnRlcmVkIGludG8gdGhhdCBhcnJhbmdlbWVudCwKK29yIHRoYXQgcGF0ZW50IGxpY2Vuc2Ugd2FzIGdyYW50ZWQsIHByaW9yIHRvIDI4IE1hcmNoIDIwMDcuCisKKyAgTm90aGluZyBpbiB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgY29uc3RydWVkIGFzIGV4Y2x1ZGluZyBvciBsaW1pdGluZworYW55IGltcGxpZWQgbGljZW5zZSBvciBvdGhlciBkZWZlbnNlcyB0byBpbmZyaW5nZW1lbnQgdGhhdCBtYXkKK290aGVyd2lzZSBiZSBhdmFpbGFibGUgdG8geW91IHVuZGVyIGFwcGxpY2FibGUgcGF0ZW50IGxhdy4KKworICAxMi4gTm8gU3VycmVuZGVyIG9mIE90aGVycycgRnJlZWRvbS4KKworICBJZiBjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdCBjb252ZXkgYQorY292ZXJlZCB3b3JrIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91IG1heQorbm90IGNvbnZleSBpdCBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgeW91IGFncmVlIHRvIHRlcm1zIHRoYXQgb2JsaWdhdGUgeW91Cit0byBjb2xsZWN0IGEgcm95YWx0eSBmb3IgZnVydGhlciBjb252ZXlpbmcgZnJvbSB0aG9zZSB0byB3aG9tIHlvdSBjb252ZXkKK3RoZSBQcm9ncmFtLCB0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCB0aG9zZSB0ZXJtcyBhbmQgdGhpcworTGljZW5zZSB3b3VsZCBiZSB0byByZWZyYWluIGVudGlyZWx5IGZyb20gY29udmV5aW5nIHRoZSBQcm9ncmFtLgorCisgIDEzLiBVc2Ugd2l0aCB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorCisgIE5vdHdpdGhzdGFuZGluZyBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSwgeW91IGhhdmUKK3Blcm1pc3Npb24gdG8gbGluayBvciBjb21iaW5lIGFueSBjb3ZlcmVkIHdvcmsgd2l0aCBhIHdvcmsgbGljZW5zZWQKK3VuZGVyIHZlcnNpb24gMyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGludG8gYSBzaW5nbGUKK2NvbWJpbmVkIHdvcmssIGFuZCB0byBjb252ZXkgdGhlIHJlc3VsdGluZyB3b3JrLiAgVGhlIHRlcm1zIG9mIHRoaXMKK0xpY2Vuc2Ugd2lsbCBjb250aW51ZSB0byBhcHBseSB0byB0aGUgcGFydCB3aGljaCBpcyB0aGUgY292ZXJlZCB3b3JrLAorYnV0IHRoZSBzcGVjaWFsIHJlcXVpcmVtZW50cyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorc2VjdGlvbiAxMywgY29uY2VybmluZyBpbnRlcmFjdGlvbiB0aHJvdWdoIGEgbmV0d29yayB3aWxsIGFwcGx5IHRvIHRoZQorY29tYmluYXRpb24gYXMgc3VjaC4KKworICAxNC4gUmV2aXNlZCBWZXJzaW9ucyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YKK3RoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKKyAgRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUKK1Byb2dyYW0gc3BlY2lmaWVzIHRoYXQgYSBjZXJ0YWluIG51bWJlcmVkIHZlcnNpb24gb2YgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSAib3IgYW55IGxhdGVyIHZlcnNpb24iIGFwcGxpZXMgdG8gaXQsIHlvdSBoYXZlIHRoZQorb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgbnVtYmVyZWQKK3ZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkCitieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgIElmIHRoZSBQcm9ncmFtIHNwZWNpZmllcyB0aGF0IGEgcHJveHkgY2FuIGRlY2lkZSB3aGljaCBmdXR1cmUKK3ZlcnNpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdXNlZCwgdGhhdCBwcm94eSdzCitwdWJsaWMgc3RhdGVtZW50IG9mIGFjY2VwdGFuY2Ugb2YgYSB2ZXJzaW9uIHBlcm1hbmVudGx5IGF1dGhvcml6ZXMgeW91Cit0byBjaG9vc2UgdGhhdCB2ZXJzaW9uIGZvciB0aGUgUHJvZ3JhbS4KKworICBMYXRlciBsaWNlbnNlIHZlcnNpb25zIG1heSBnaXZlIHlvdSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudAorcGVybWlzc2lvbnMuICBIb3dldmVyLCBubyBhZGRpdGlvbmFsIG9ibGlnYXRpb25zIGFyZSBpbXBvc2VkIG9uIGFueQorYXV0aG9yIG9yIGNvcHlyaWdodCBob2xkZXIgYXMgYSByZXN1bHQgb2YgeW91ciBjaG9vc2luZyB0byBmb2xsb3cgYQorbGF0ZXIgdmVyc2lvbi4KKworICAxNS4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4KKworICBUSEVSRSBJUyBOTyBXQVJSQU5UWSBGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZCitBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUCitIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZCitPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKK1RIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKK1BVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNCitJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YKK0FMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxNi4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuCisKKyAgSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCitXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1PRElGSUVTIEFORC9PUiBDT05WRVlTCitUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkKK0dFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRQorVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRgorREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQKK1BBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgUFJPR1JBTVMpLAorRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorU1VDSCBEQU1BR0VTLgorCisgIDE3LiBJbnRlcnByZXRhdGlvbiBvZiBTZWN0aW9ucyAxNSBhbmQgMTYuCisKKyAgSWYgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudHkgYW5kIGxpbWl0YXRpb24gb2YgbGlhYmlsaXR5IHByb3ZpZGVkCithYm92ZSBjYW5ub3QgYmUgZ2l2ZW4gbG9jYWwgbGVnYWwgZWZmZWN0IGFjY29yZGluZyB0byB0aGVpciB0ZXJtcywKK3Jldmlld2luZyBjb3VydHMgc2hhbGwgYXBwbHkgbG9jYWwgbGF3IHRoYXQgbW9zdCBjbG9zZWx5IGFwcHJveGltYXRlcworYW4gYWJzb2x1dGUgd2FpdmVyIG9mIGFsbCBjaXZpbCBsaWFiaWxpdHkgaW4gY29ubmVjdGlvbiB3aXRoIHRoZQorUHJvZ3JhbSwgdW5sZXNzIGEgd2FycmFudHkgb3IgYXNzdW1wdGlvbiBvZiBsaWFiaWxpdHkgYWNjb21wYW5pZXMgYQorY29weSBvZiB0aGUgUHJvZ3JhbSBpbiByZXR1cm4gZm9yIGEgZmVlLgorCisgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworICAgICAgICAgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK3N0YXRlIHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKK3RoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworICBJZiB0aGUgcHJvZ3JhbSBkb2VzIHRlcm1pbmFsIGludGVyYWN0aW9uLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0Citub3RpY2UgbGlrZSB0aGlzIHdoZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICA8cHJvZ3JhbT4gIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisgICAgVGhpcyBwcm9ncmFtIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KKyAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0CisgICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgorCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKK3BhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB5b3VyIHByb2dyYW0ncyBjb21tYW5kcworbWlnaHQgYmUgZGlmZmVyZW50OyBmb3IgYSBHVUkgaW50ZXJmYWNlLCB5b3Ugd291bGQgdXNlIGFuICJhYm91dCBib3giLgorCisgIFlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciBzY2hvb2wsCitpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYgbmVjZXNzYXJ5LgorRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcywgYW5kIGhvdyB0byBhcHBseSBhbmQgZm9sbG93IHRoZSBHTlUgR1BMLCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtCitpbnRvIHByb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UKK21heSBjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aAordGhlIGxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExlc3NlciBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4gIEJ1dCBmaXJzdCwgcGxlYXNlIHJlYWQKKzxodHRwOi8vd3d3LmdudS5vcmcvcGhpbG9zb3BoeS93aHktbm90LWxncGwuaHRtbD4uCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9ncHMuYyBiL3JybHAtZXBoZW1lcmlzL2dwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMzU3NDgKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9ncHMuYwpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIGdwcy5jCisgKgorICogQSBmZXcgdXRpbGl0eSBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIGxvdyBsZXZlbCBHUFMgZGF0YQorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFN5bHZhaW4gTXVuYXV0IDx0bnRAMjQ2dE50LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJncHMuaCIKKworCisjZGVmaW5lIEdFVF9GSUVMRF9VKHcsIG5iLCBwb3MpICgoKHcpID4+IChwb3MpKSAmICgoMTw8KG5iKSktMSkpCisjZGVmaW5lIEdFVF9GSUVMRF9TKHcsIG5iLCBwb3MpICgoKGludCkoKHcpIDw8ICgzMi0obmIpLShwb3MpKSkpID4+ICgzMi0obmIpKSkKKworLyoKKyAqIFVucGFja3MgR1BTIFN1YmZyYW1lIDEsMiwzIHBheWxvYWRzICgzICogOCB3b3JkcykKKyAqCisgKiBOb3RlOiBlcGgtPnN2X2lkIGlzIG5vdCBmaWxsZWQgaGVyZSBzaW5jZSBub3QgcHJlc2VudCBpbiB0aG9zZSBzdWJmcmFtZXMKKyAqCisgKiAobm8gcGFyaXR5IGJpdCBjaGVja2luZyBpcyBkb25lLCBvbmx5IHRoZSBsb3dlciAyNCBiaXRzIG9mIGVhY2ggd29yZAorICogIGFyZSB1c2VkKQorICovCitpbnQKK2dwc191bnBhY2tfc2YxMjModWludDMyX3QgKnNmLCBzdHJ1Y3QgZ3BzX2VwaGVtZXJpc19zdiAqZXBoKQoreworCXVpbnQzMl90ICpzZjEgPSAmc2ZbMF07CisJdWludDMyX3QgKnNmMiA9ICZzZls4XTsKKwl1aW50MzJfdCAqc2YzID0gJnNmWzE2XTsKKworCWludCBpb2RlMSwgaW9kZTI7CisKKwllcGgtPndlZWtfbm8JPSBHRVRfRklFTERfVShzZjFbMF0sIDEwLCAxNCk7CisJZXBoLT5jb2RlX29uX2wyCT0gR0VUX0ZJRUxEX1Uoc2YxWzBdLCAgMiwgMTIpOworCWVwaC0+c3ZfdXJhCT0gR0VUX0ZJRUxEX1Uoc2YxWzBdLCAgNCwgIDgpOworCWVwaC0+c3ZfaGVhbHRoCT0gR0VUX0ZJRUxEX1Uoc2YxWzBdLCAgNiwgIDIpOworCWVwaC0+bDJfcF9mbGFnCT0gR0VUX0ZJRUxEX1Uoc2YxWzFdLCAgMSwgMjMpOworCWVwaC0+dF9nZAk9IEdFVF9GSUVMRF9TKHNmMVs0XSwgIDgsICAwKTsKKwllcGgtPmlvZGMJPSAoR0VUX0ZJRUxEX1Uoc2YxWzBdLCAgMiwgIDApIDw8IDgpIHwgXAorCSAgICAgICAgICAgICAgICAgICBHRVRfRklFTERfVShzZjFbNV0sICA4LCAxNik7CisJZXBoLT50X29jCT0gR0VUX0ZJRUxEX1Uoc2YxWzVdLCAxNiwgIDApOworCWVwaC0+YV9mMgk9IEdFVF9GSUVMRF9TKHNmMVs2XSwgIDgsIDE2KTsKKwllcGgtPmFfZjEJPSBHRVRfRklFTERfUyhzZjFbNl0sIDE2LCAgMCk7CisJZXBoLT5hX2YwCT0gR0VUX0ZJRUxEX1Moc2YxWzddLCAyMiwgIDIpOworCisJaW9kZTEJCT0gR0VUX0ZJRUxEX1Uoc2YyWzBdLCAgOCwgMTYpOworCWVwaC0+Y19ycwk9IEdFVF9GSUVMRF9TKHNmMlswXSwgMTYsICAwKTsKKwllcGgtPmRlbHRhX24JPSBHRVRfRklFTERfUyhzZjJbMV0sIDE2LCAgOCk7CisJZXBoLT5tXzAJPSAoR0VUX0ZJRUxEX1Moc2YyWzFdLCAgOCwgIDApIDw8IDI0KSB8IFwKKwkgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEX1Uoc2YyWzJdLCAyNCwgIDApOworCWVwaC0+Y191Ywk9IEdFVF9GSUVMRF9TKHNmMlszXSwgMTYsICA4KTsKKwllcGgtPmUJCT0gKEdFVF9GSUVMRF9VKHNmMlszXSwgIDgsICAwKSA8PCAyNCkgfCBcCisJICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRF9VKHNmMls0XSwgMjQsICAwKTsKKwllcGgtPmNfdXMJPSBHRVRfRklFTERfUyhzZjJbNV0sIDE2LCAgOCk7CisJZXBoLT5hX3Bvd2hhbGYJPSAoR0VUX0ZJRUxEX1Uoc2YyWzVdLCAgOCwgIDApIDw8IDI0KSB8IFwKKwkgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEX1Uoc2YyWzZdLCAyNCwgIDApOworCWVwaC0+dF9vZQk9IEdFVF9GSUVMRF9VKHNmMls3XSwgMTYsICA4KTsKKwllcGgtPmZpdF9mbGFnCT0gR0VUX0ZJRUxEX1Uoc2YyWzddLCAgMSwgIDcpOworCisJZXBoLT5jX2ljCT0gR0VUX0ZJRUxEX1Moc2YzWzBdLCAxNiwgIDgpOworCWVwaC0+b21lZ2FfMAk9IChHRVRfRklFTERfUyhzZjNbMF0sICA4LCAgMCkgPDwgMjQpIHwgXAorCSAgICAgICAgICAgICAgICAgICBHRVRfRklFTERfVShzZjNbMV0sIDI0LCAgMCk7CisJZXBoLT5jX2lzCT0gR0VUX0ZJRUxEX1Moc2YzWzJdLCAxNiwgIDgpOworCWVwaC0+aV8wCT0gKEdFVF9GSUVMRF9TKHNmM1syXSwgIDgsICAwKSA8PCAyNCkgfCBcCisJICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRF9VKHNmM1szXSwgMjQsICAwKTsKKwllcGgtPmNfcmMJPSBHRVRfRklFTERfUyhzZjNbNF0sIDE2LCAgOCk7CisJZXBoLT53CQk9IChHRVRfRklFTERfUyhzZjNbNF0sICA4LCAgMCkgPDwgMjQpIHwgXAorCSAgICAgICAgICAgICAgICAgICBHRVRfRklFTERfVShzZjNbNV0sIDI0LCAgMCk7CisJZXBoLT5vbWVnYV9kb3QJPSBHRVRfRklFTERfUyhzZjNbNl0sIDI0LCAgMCk7CisJaW9kZTIJCT0gR0VUX0ZJRUxEX1Uoc2YzWzddLCAgOCwgMTYpOworCWVwaC0+aWRvdAk9IEdFVF9GSUVMRF9TKHNmM1s3XSwgMTQsICAyKTsKKworCWVwaC0+X3JzdmQxCT0gR0VUX0ZJRUxEX1Uoc2YxWzFdLCAyMywgIDApOworCWVwaC0+X3JzdmQyCT0gR0VUX0ZJRUxEX1Uoc2YxWzJdLCAyNCwgIDApOworCWVwaC0+X3JzdmQzCT0gR0VUX0ZJRUxEX1Uoc2YxWzNdLCAyNCwgIDApOworCWVwaC0+X3JzdmQ0CT0gR0VUX0ZJRUxEX1Uoc2YxWzRdLCAxNiwgIDgpOworCWVwaC0+YW9kbwk9IEdFVF9GSUVMRF9VKHNmMls3XSwgIDUsICAyKTsKKworCS8qIENoZWNrICYgY3Jvc3MtdmFsaWRhdGUgaW9kY1s3OjBdLCBpb2RlMSwgaW9kZTIgKi8KKwlpZiAoKGlvZGUxICE9IGlvZGUyKSB8fCAoaW9kZTEgIT0gKGVwaC0+aW9kYyAmIDB4ZmYpKSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFVucGFja3MgR1BTIFN1YmZyYW1lIDQgb3IgNSBBbG1hbmFjIHBhZ2VzIHBheWxvYWQgKDggd29yZHMpCisgKgorICogKG5vIHBhcml0eSBiaXQgY2hlY2tpbmcgaXMgZG9uZSwgb25seSB0aGUgbG93ZXIgMjQgYml0cyBvZiBlYWNoIHdvcmQKKyAqICBhcmUgdXNlZCkKKyAqLworaW50CitncHNfdW5wYWNrX3NmNDVfYWxtYW5hYyh1aW50MzJfdCAqc2YsIHN0cnVjdCBncHNfYWxtYW5hY19zdiAqYWxtKQoreworCWFsbS0+c3ZfaWQgICAgICA9IEdFVF9GSUVMRF9VKHNmWzBdLCAgNiwgMTYpOworCisJYWxtLT5lCQk9IEdFVF9GSUVMRF9VKHNmWzBdLCAxNiwgIDApOworCWFsbS0+dF9vYQk9IEdFVF9GSUVMRF9VKHNmWzFdLCAgOCwgMTYpOworCWFsbS0+a3NpaQk9IEdFVF9GSUVMRF9TKHNmWzFdLCAxNiwgIDApOworCWFsbS0+b21lZ2FfZG90CT0gR0VUX0ZJRUxEX1Moc2ZbMl0sIDE2LCAgOCk7CisJYWxtLT5zdl9oZWFsdGgJPSBHRVRfRklFTERfVShzZlsyXSwgIDgsICAwKTsKKwlhbG0tPmFfcG93aGFsZgk9IEdFVF9GSUVMRF9VKHNmWzNdLCAyNCwgIDApOworCWFsbS0+b21lZ2FfMAk9IEdFVF9GSUVMRF9TKHNmWzRdLCAyNCwgIDApOworCWFsbS0+dwkJPSBHRVRfRklFTERfUyhzZls1XSwgMjQsICAwKTsKKwlhbG0tPm1fMAk9IEdFVF9GSUVMRF9TKHNmWzZdLCAyNCwgIDApOworCWFsbS0+YV9mMAk9IChHRVRfRklFTERfUyhzZls3XSwgOCwgMTYpIDw8IDMpIHwgXAorCSAgICAgICAgICAgICAgICAgICBHRVRfRklFTERfVShzZls3XSwgMywgIDIpOworCWFsbS0+YV9mMQk9IEdFVF9GSUVMRF9TKHNmWzddLCAxMSwgIDUpOworCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2dwcy5oIGIvcnJscC1lcGhlbWVyaXMvZ3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxYjlkNwotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2dwcy5oCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogZ3BzLmgKKyAqCisgKiBIZWFkZXIgdG8gZGVhbCB3aXRoIGxvdyBsZXZlbCBHUFMgZGF0YQorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFN5bHZhaW4gTXVuYXV0IDx0bnRAMjQ2dE50LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgX19HUFNfSF9fCisjZGVmaW5lIF9fR1BTX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworCisjZGVmaW5lIE1BWF9TVgk2NAorCisKKy8qIElvbm9zcGVyaWMgbW9kZWwgZGF0YSAqLworc3RydWN0IGdwc19pb25vc3BoZXJlX21vZGVsIHsKKwkJCS8qICNiaXRzICBTY2FsZSBmYWN0b3IgIEVmZmVjdGl2ZSAgVW5pdHMgICAgICAgICAgICAqLworCQkJLyogICAgICAgICAgIChMU0IpICAgICAgIHJhbmdlICAgICAgICAgICAgICAgICAgICAgICovCisKKwlpbnQgYWxwaGFfMDsJLyogcyA4ICAgICAgIDJeLTMwICAgICAgICAgICAgICAgICBzZWNvbmRzICAgICAgICAgICovCisJaW50IGFscGhhXzE7CS8qIHMgOCAgICAgICAyXi0yNyAgICAgICAgICAgICAgICAgcyAvIHNlbWktY2lyY2xlcyAqLworCWludCBhbHBoYV8yOwkvKiBzIDggICAgICAgMl4tMjQgICAgICAgICAgICAgICAgIHMgLyAoc2VtaS1jaXJjbGVzKV4yICovCisJaW50IGFscGhhXzM7CS8qIHMgOCAgICAgICAyXi0yNCAgICAgICAgICAgICAgICAgcyAvIChzZW1pLWNpcmNsZXMpXjMgKi8KKwlpbnQgYmV0YV8wOwkvKiBzIDggICAgICAgMl4xMSAgICAgICAgICAgICAgICAgIHNlY29uZHMgICAgICAgICAgKi8KKwlpbnQgYmV0YV8xOwkvKiBzIDggICAgICAgMl4xNCAgICAgICAgICAgICAgICAgIHMgLyBzZW1pLWNpcmNsZXMgKi8KKwlpbnQgYmV0YV8yOwkvKiBzIDggICAgICAgMl4xNiAgICAgICAgICAgICAgICAgIHMgLyAoc2VtaS1jaXJjbGVzKV4yICovCisJaW50IGJldGFfMzsJLyogcyA4ICAgICAgIDJeMTYgICAgICAgICAgICAgICAgICBzIC8gKHNlbWktY2lyY2xlcyleMyAqLworfTsKKworCisvKiBVVEMgbW9kZWwgZGF0YSAqLworc3RydWN0IGdwc191dGNfbW9kZWwgeworCQkJLyogI2JpdHMgIFNjYWxlIGZhY3RvciAgRWZmZWN0aXZlICBVbml0cyAgICAgICAgICAgICovCisJCQkvKiAgICAgICAgICAgKExTQikgICAgICAgcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgKi8KKworCWludCBhMDsJCS8qIHMgMzIgICAgICAyXi0zMCAgICAgICAgICAgICAgICAgc2Vjb25kcyAgICAgICAgICAqLworCWludCBhMTsJCS8qIHMgMjQgICAgICAyXi01MCAgICAgICAgICAgICAgICAgc2Vjb25kcyAvIHNlY29uZHMgKi8KKwlpbnQgZGVsdGFfdF9sczsJLyogcyAgOCAgICAgIDEgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzICAgICAgICAgICovCisJaW50IHRfb3Q7CS8qIHUgIDggICAgICAyXjEyICAgICAgIDYwMiwxMTIgICAgc2Vjb25kcyAgICAgICAgICAqLworCWludCB3bl90OwkvKiB1ICA4ICAgICAgMSAgICAgICAgICAgICAgICAgICAgIHdlZWtzICAgICAgICAgICAgKi8KKwlpbnQgd25fbHNmOwkvKiB1ICA4ICAgICAgMSAgICAgICAgICAgICAgICAgICAgIHdlZWtzICAgICAgICAgICAgKi8KKwlpbnQgZG47CQkvKiB1ICA4ICAgICAgMSAgICAgICAgICAgICAgICA3ICAgIGRheXMgICAgICAgICAgICAgKi8KKwlpbnQgZGVsdGFfdF9sc2Y7LyogcyAgOCAgICAgIDEgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzICAgICAgICAgICovCit9OworCisKKy8qIEFsbWFuYWNoIGRhdGEgKi8KK3N0cnVjdCBncHNfYWxtYW5hY19zdiB7CisJaW50IHN2X2lkOworCWludCBzdl9oZWFsdGg7CisKKwkJCS8qICNiaXRzICBTY2FsZSBmYWN0b3IgIEVmZmVjdGl2ZSAgVW5pdHMgICAgICAgICAgICAqLworCQkJLyogICAgICAgICAgIChMU0IpICAgICAgIHJhbmdlICAgICAgICAgICAgICAgICAgICAgICovCisKKwlpbnQgZTsJCS8qIHUgMTYgICAgICAyXi0yMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWludCB0X29hOwkvKiB1ICA4ICAgICAgMl4xMiAgICAgICA2MDIsMTEyICAgIHNlY29uZHMgICAgICAgICAgKi8KKwlpbnQga3NpaTsJLyogcyAxNiAgICAgIDJeLTE5ICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgICAgICovCisJaW50IG9tZWdhX2RvdDsJLyogcyAxNiAgICAgIDJeLTM4ICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgLyBzICovCisJaW50IGFfcG93aGFsZjsJLyogdSAyNCAgICAgIDJeLTExICAgICAgICAgICAgICAgICBtZXRlcnMgICAgICAgICAgICovCisJaW50IG9tZWdhXzA7CS8qIHMgMjQgICAgICAyXi0yMyAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzICAgICAqLworCWludCB3OwkJLyogcyAyNCAgICAgIDJeLTIzICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgICAgICovCisJaW50IG1fMDsJLyogcyAyNCAgICAgIDJeLTIzICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgICAgICovCisJaW50IGFfZjA7CS8qIHMgMTEgICAgICAyXi0yMCAgICAgICAgICAgICAgICAgc2Vjb25kcyAgICAgICAgICAqLworCWludCBhX2YxOwkvKiBzIDExICAgICAgMl4tMzggICAgICAgICAgICAgICAgIHNlY29uZHMgLyBzZWNvbmRzICovCit9OworCitzdHJ1Y3QgZ3BzX2FsbWFuYWMgeworCWludCB3bmE7CisJaW50IG5fc3Y7CisJc3RydWN0IGdwc19hbG1hbmFjX3N2IHN2c1tNQVhfU1ZdOworfTsKKworCisvKiBFcGhlbWVyaXMgZGF0YSAqLworc3RydWN0IGdwc19lcGhlbWVyaXNfc3YgeworCWludCBzdl9pZDsKKworCQkJLyogI2JpdHMgIFNjYWxlIGZhY3RvciAgRWZmZWN0aXZlICBVbml0cyAgICAgICAgICAgICovCisJCQkvKiAgICAgICAgICAgKExTQikgICAgICAgcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgKi8KKworCWludCBjb2RlX29uX2wyOwkvKiB1ICAyICAgICAgMSAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgICAgICAgKi8KKwlpbnQgd2Vla19ubzsJLyogdSAxMCAgICAgIDEgICAgICAgICAgICAgICAgICAgICB3ZWVrICAgICAgICAgICAgICovCisJaW50IGwyX3BfZmxhZzsJLyogdSAgMSAgICAgIDEgICAgICAgICAgICAgICAgICAgICAvICAgICAgICAgICAgICAgICovCisJaW50IHN2X3VyYTsJLyogdSAgNCAgICAgIC8gICAgICAgICAgICAgICAgICAgICAvICAgICAgICAgICAgICAgICovCisJaW50IHN2X2hlYWx0aDsJLyogdSAgNiAgICAgIC8gICAgICAgICAgICAgICAgICAgICAvICAgICAgICAgICAgICAgICovCisJaW50IHRfZ2Q7CS8qIHMgIDggICAgICAyXi0zMSAgICAgICAgICAgICAgICAgc2Vjb25kcyAgICAgICAgICAqLworCWludCBpb2RjOwkvKiB1IDEwICAgICAgLyAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgICAgICAgKi8KKwlpbnQgdF9vYzsJLyogdSAxNiAgICAgIDJeNCAgICAgICAgNjA0LDc4NCAgICBzZWNvbmRzICAgICAgICAgICovCisJaW50IGFfZjI7CS8qIHMgIDggICAgICAyXi01NSAgICAgICAgICAgICAgICAgc2VjIC8gc2VjXjIgICAgICAqLworCWludCBhX2YxOwkvKiBzIDE2ICAgICAgMl4tNDMgICAgICAgICAgICAgICAgIHNlYyAvIHNlYyAgICAgICAgKi8KKwlpbnQgYV9mMDsJLyogcyAyMiAgICAgIDJeLTMxICAgICAgICAgICAgICAgICBzZWNvbmRzICAgICAgICAgICovCisKKwlpbnQgY19yczsJLyogcyAxNiAgICAgIDJeLTUgICAgICAgICAgICAgICAgICBtZXRlcnMgICAgICAgICAgICovCisJaW50IGRlbHRhX247CS8qIHMgMTYgICAgICAyXi00MyAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzIC8gcyAqLworCWludCBtXzA7CS8qIHMgMzIgICAgICAyXi0zMSAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzICAgICAqLworCWludCBjX3VjOwkvKiBzIDE2ICAgICAgMl4tMjkgICAgICAgICAgICAgICAgIHJhZGlhbnMgICAgICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgZTsJLyogdSAzMiAgICAgIDJeLTMzICAgICAgMC4wMyAgICAgICAvICAgICAgICAgICAgICAgICovCisJaW50IGNfdXM7CS8qIHMgMTYgICAgICAyXi0yOSAgICAgICAgICAgICAgICAgcmFkaWFucyAgICAgICAgICAqLworCXVuc2lnbmVkIGludCBhX3Bvd2hhbGY7IC8qIHUgMzIgIDJeLTE5ICAgICAgICAgICAgIG1ldGVyc14oMS8yKSAgICAgKi8KKwlpbnQgdF9vZTsJLyogdSAxNiAgICAgIDJeNCAgICAgICAgNjA0LDc4NCAgICBzZWNvbmRzICAgICAgICAgICovCisJaW50IGZpdF9mbGFnOwkvKiB1ICAxICAgICAgLyAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgICAgICAgKi8KKworCWludCBjX2ljOwkvKiBzIDE2ICAgICAgMl4tMjkgICAgICAgICAgICAgICAgIHJhZGlhbnMgICAgICAgICAgKi8KKwlpbnQgb21lZ2FfMDsJLyogcyAzMiAgICAgIDJeLTMxICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgICAgICovCisJaW50IGNfaXM7CS8qIHMgMTYgICAgICAyXi0yOSAgICAgICAgICAgICAgICAgcmFkaWFucyAgICAgICAgICAqLworCWludCBpXzA7CS8qIHMgMzIgICAgICAyXi0zMSAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzICAgICAqLworCWludCBjX3JjOwkvKiBzIDE2ICAgICAgMl4tNSAgICAgICAgICAgICAgICAgIG1ldGVycyAgICAgICAgICAgKi8KKwlpbnQgdzsJCS8qIHMgMzIgICAgICAyXi0zMSAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzICAgICAqLworCWludCBvbWVnYV9kb3Q7CS8qIHMgMjQgICAgICAyXi00MyAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzIC8gcyAqLworCWludCBpZG90OwkvKiBzIDE0ICAgICAgMl4tNDMgICAgICAgICAgICAgICAgIHNlbWktY2lyY2xlcyAvIHMgKi8KKworCWludCBfcnN2ZDE7CS8qIDIzIGJpdHMgKi8KKwlpbnQgX3JzdmQyOwkvKiAyNCBiaXRzICovCisJaW50IF9yc3ZkMzsJLyogMjQgYml0cyAqLworCWludCBfcnN2ZDQ7CS8qIDE2IGJpdHMgKi8KKwlpbnQgYW9kbzsJLyogOCBiaXRzICBOb3Qgc3VyZSBpdCBuZWVkcyB0byBiZSBoZXJlIC4uLiAqLworfTsKKworc3RydWN0IGdwc19lcGhlbWVyaXMgeworCWludCBuX3N2OworCXN0cnVjdCBncHNfZXBoZW1lcmlzX3N2IHN2c1tNQVhfU1ZdOworfTsKKworCisvKiBSZWZlcmVuY2UgcG9zaXRpb24gKi8KK3N0cnVjdCBncHNfcmVmX3BvcyB7CS8qIFdTRzg0IGVsbGlwc29pZCAqLworCWRvdWJsZSBsYXRpdHVkZTsJLyogZGVnICovCisJZG91YmxlIGxvbmdpdHVkZTsJLyogZGVnICovCisJZG91YmxlIGFsdGl0dWRlOwkvKiBtIGFib3ZlIGVsbGlwc29pZCAqLworfTsKKworCisvKiBSZWZlcmVuY2UgdGltZSAqLworc3RydWN0IGdwc19yZWZfdGltZSB7CisJaW50IHduOwkJCS8qIEdQUyB3ZWVrIG51bWJlciAqLworCWRvdWJsZSB0b3c7CQkvKiBpbiBzZWNvbmRzICovCit9OworCisKKy8qIEFsbCBhc3Npc3QgZGF0YSAqLworI2RlZmluZSBHUFNfRklFTERfSU9OT1NQSEVSRQkoMTw8MCkKKyNkZWZpbmUgR1BTX0ZJRUxEX1VUQwkJKDE8PDEpCisjZGVmaW5lIEdQU19GSUVMRF9BTE1BTkFDCSgxPDwyKQorI2RlZmluZSBHUFNfRklFTERfRVBIRU1FUklTCSgxPDwzKQorI2RlZmluZSBHUFNfRklFTERfUkVGUE9TCSgxPDw0KQorI2RlZmluZSBHUFNfRklFTERfUkVGVElNRQkoMTw8NSkKKworc3RydWN0IGdwc19hc3Npc3RfZGF0YSB7CisJaW50IGZpZWxkczsKKwlzdHJ1Y3QgZ3BzX2lvbm9zcGhlcmVfbW9kZWwJaW9ub3NwaGVyZTsKKwlzdHJ1Y3QgZ3BzX3V0Y19tb2RlbAkJdXRjOworCXN0cnVjdCBncHNfYWxtYW5hYwkJYWxtYW5hYzsKKwlzdHJ1Y3QgZ3BzX2VwaGVtZXJpcwkJZXBoZW1lcmlzOworCXN0cnVjdCBncHNfcmVmX3BvcwkJcmVmX3BvczsKKwlzdHJ1Y3QgZ3BzX3JlZl90aW1lCQlyZWZfdGltZTsKK307CisKKworLyogR1BTIFN1YmZyYW1lIHV0aWxpdHkgbWV0aG9kcyAoc2VlIGdwcy5jIGZvciBkZXRhaWxzKSAqLworaW50IGdwc191bnBhY2tfc2YxMjModWludDMyX3QgKnNmLCBzdHJ1Y3QgZ3BzX2VwaGVtZXJpc19zdiAqZXBoKTsKK2ludCBncHNfdW5wYWNrX3NmNDVfYWxtYW5hYyh1aW50MzJfdCAqc2YsIHN0cnVjdCBncHNfYWxtYW5hY19zdiAqYWxtKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19HUFNfSF9fICovCisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL21haW4uYyBiL3JybHAtZXBoZW1lcmlzL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjAyNWEyCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvbWFpbi5jCkBAIC0wLDAgKzEsOTkgQEAKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSAiZ3BzLmgiCisjaW5jbHVkZSAidWJ4LmgiCisjaW5jbHVkZSAidWJ4LXBhcnNlLmgiCisjaW5jbHVkZSAicnJscC5oIgorCitzdGF0aWMgaW50Citkb191YnhfcmVhZChzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHMsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWludCBydiwgZmQsIGk7CisJc3RydWN0IHN0YXQgc3Q7CisJdm9pZCAqYnVmOworCisJLyogTG9hZCBmaWxlICovCisJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIC0xOworCisJcnYgPSBmc3RhdChmZCwgJnN0KTsKKwlpZiAocnYgPCAwKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWJ1ZiA9IG1hbGxvYyhzdC5zdF9zaXplKTsKKwlpZiAoIWJ1ZikgeworCQljbG9zZShmZCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlydiA9IHJlYWQoZmQsIGJ1Ziwgc3Quc3Rfc2l6ZSk7CisJaWYgKHJ2ICE9IHN0LnN0X3NpemUpIHsKKwkJZnJlZShidWYpOworCQljbG9zZShmZCk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBQYXJzZSBlYWNoIG1lc3NhZ2UgKi8KKwlmb3IgKGk9MDsgaTxzdC5zdF9zaXplOykgeworCQlpbnQgcnY7CisJCXJ2ID0gdWJ4X21zZ19kaXNwYXRjaCh1YnhfcGFyc2VfZHQsIGJ1ZiArIGksIHN0LnN0X3NpemUgLSBpLCBncHMpOworCQlpZiAocnYgPCAwKQorCQkJaSsrOwkvKiBJbnZhbGlkIG1lc3NhZ2U6IHRyeSBvbmUgYnl0ZSBsYXRlciAqLworCQllbHNlCisJCQlpICs9IHJ2OworCX0KKworCS8qIERvbmUgKi8KKwlmcmVlKGJ1Zik7CisJY2xvc2UoZmQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2RvX3JybHAoc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzKQoreworCXN0cnVjdCBycmxwX2Fzc2lzdF9yZXEgYXI7CisJdm9pZCAqcGR1c1s2NF07CisJaW50IGxlbls2NF07CisJaW50IGksIHJ2OworCisJY2hhciAqdGVzdCA9ICJceDI4XHgwMFx4ODBceDEwXHgwMVx4MzJceDAwXHgxOVx4NEZceDA3XHgxNVx4MDQiOworCisJcnJscF9kZWNvZGVfYXNzaXN0YW5jZV9yZXF1ZXN0KCZhciwgdGVzdCwgMTIpOworCXByaW50ZigiJTA4eCAlMDE2bGx4XG4iLCBhci5yZXFfZWxlbXMsIChsb25nIGxvbmcgdW5zaWduZWQpIGFyLmVwaF9zdnMpOworCisJYXIucmVxX2VsZW1zID0gLTE7CisJYXIuZXBoX3N2cyA9IC0xTEw7CisJcnYgPSBycmxwX2dwc19hc3Npc3RfcGR1cyhncHMsICZhciwgcGR1cywgbGVuLCA2NCk7CisJcHJpbnRmKCIlZFxuIiwgcnYpOworCWZvciAoaT0wOyBpPHJ2OyBpKyspIHsKKwkJcHJpbnRmKCIlcCAlZFxuIiwgcGR1c1tpXSwgbGVuW2ldKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSBncHM7CisJaW50IHJ2OworCisJbWVtc2V0KCZncHMsIDB4MDAsIHNpemVvZihncHMpKTsKKworCXJ2ID0gZG9fdWJ4X3JlYWQoJmdwcywgImRhdGEudWJ4Iik7CisJCisJcnYgPSBkb19ycmxwKCZncHMpOworCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL3JybHAuYyBiL3JybHAtZXBoZW1lcmlzL3JybHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjBjM2FiCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvcnJscC5jCkBAIC0wLDAgKzEsNjQ4IEBACisvKgorICogcnJscC5jCisgKgorICogUlJMUCBpbXBsZW1lbnRhdGlvbgorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFN5bHZhaW4gTXVuYXV0IDx0bnRAMjQ2dE50LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiZ3BzLmgiCisjaW5jbHVkZSAicnJscC5oIgorCisjaW5jbHVkZSA8UERVLmg+CisjaW5jbHVkZSA8R1BTLUFzc2lzdERhdGEuaD4KKyNpbmNsdWRlIDxOYXZpZ2F0aW9uTW9kZWwuaD4KKyNpbmNsdWRlIDxJb25vc3BoZXJpY01vZGVsLmg+CisjaW5jbHVkZSA8VVRDTW9kZWwuaD4KKyNpbmNsdWRlIDxBbG1hbmFjLmg+CisjaW5jbHVkZSA8UmVmTG9jYXRpb24uaD4KKyNpbmNsdWRlIDxSZWZlcmVuY2VUaW1lLmg+CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBSUkxQIEFzc2lzdGFuY2UgcmVxdWVzdCBkZWNvZGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXt7eyAqLworLyogRGVjb2RlIGFuZCB2YWxpZGF0ZSB0aGUgYXNzaXN0YW5jZSBkYXRhIHJlcXVlc3QgbWVzc2FnZXMuCisgKiBTZWUgc2VjdGlvbiAxMC4xMCBvZgorICogIC4gRVRTSSBUUyAxNDkgMDMxIFY4LjEuMCAoMjAwOS0wMSkKKyAqICAuIDNHUFAgVFMgNDkuMDMxIHZlcnNpb24gOC4xLjAgUmVsZWFzZSA4CisgKi8KKworLyogUGFja2VkIHN0cnVjdHVyZSBmcm9tIDQ5LjAzMSBzcGVjIChSR0EgPSBSZXF1ZXN0IEdQUyBBc3Npc3RhbmNlKSAqLworCisjZGVmaW5lIFJSTFBfUkdBMF9BTE1BTkFDCSgxPDwwKQorI2RlZmluZSBSUkxQX1JHQTBfVVRDX01PREVMCSgxPDwxKQorI2RlZmluZSBSUkxQX1JHQTBfSU9OT19NT0RFTAkoMTw8MikKKyNkZWZpbmUgUlJMUF9SR0EwX05BVl9NT0RFTAkoMTw8MykKKyNkZWZpbmUgUlJMUF9SR0EwX0RHUFMJCSgxPDw0KQorI2RlZmluZSBSUkxQX1JHQTBfUkVGX0xPQwkoMTw8NSkKKyNkZWZpbmUgUlJMUF9SR0EwX1JFRl9USU1FCSgxPDw2KQorI2RlZmluZSBSUkxQX1JHQTBfQUNRX0FTU0lTVAkoMTw8NykKKworI2RlZmluZSBSUkxQX1JHQTFfUkVBTFRJTUVfSU5UCSgxPDwwKQorI2RlZmluZSBSUkxQX1JHQTFfRVBIX0VYVAkoMTw8MSkKKyNkZWZpbmUgUlJMUF9SR0ExX0VQSF9FWFRfQ0hFQ0sJKDE8PDIpCisKK3N0cnVjdCBycmxwX3JnYV9oZHIgeworCXVpbnQ4X3QgaXRlbXMwOworCXVpbnQ4X3QgaXRlbXMxOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHJybHBfcmdhX2VwaF9zdiB7CisJdWludDhfdCBzdl9pZDsJCS8qIFs3OjZdIHJlc2VydmVkLCBbNTowXSBzdl9pZCAqLworCXVpbnQ4X3QgaW9kZTsJCS8qIGxhdGVzdCBlcGggaW4gdGhlIE1TIG1lbW9yeSBpbiBob3VycyAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHJybHBfcmdhX2VwaCB7CisJdWludDhfdCB3bl9oaTsJCS8qIFs3OjZdID0gd25bOTo4XSAqLworCXVpbnQ4X3Qgd25fbG87CQkvKiB3bls3OjBdICovCisJdWludDhfdCB0b2U7CQkvKiBsYXRlc3QgZXBoIGluIHRoZSBNUyBtZW1vcnkgaW4gaG91cnMgKi8KKwl1aW50OF90IG5zYXRfdG10b2U7CS8qIFs3OjRdIG5zdGF0LCBbMzowXSBULVRvZSBsaW1pdCAqLworCXN0cnVjdCBycmxwX3JnYV9lcGhfc3Ygc3ZzWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHJybHBfcmdhX2VwaF9leHQgeworCXVpbnQ4X3QgdmFsaWRpdHk7CS8qIGluIDQgaG91cnMgdW5pdHMgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBycmxwX3JnYV9lcGhfZXh0X2NoZWNrIHsKKwkJLyogd2Vla3MgYXJlIGluIGdwcyB3ZWVrIG1vZHVsbyA0ICovCisJdWludDhfdCB3bl9iZWdpbl9lbmQ7CS8qIFs3OjRdIGJlZ2luLCBbMzowXSBlbmQgKi8KKwl1aW50OF90IHRvd19iZWdpbjsKKwl1aW50OF90IHRvd19lbmQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKy8qIFBhcnNpbmcgZnVuY3Rpb24gKi8KKworaW50CitycmxwX2RlY29kZV9hc3Npc3RhbmNlX3JlcXVlc3QoCisJc3RydWN0IHJybHBfYXNzaXN0X3JlcSAqYXIsCisJdm9pZCAqcmVxLCBpbnQgcmVxX2xlbikKK3sKKwlzdHJ1Y3QgcnJscF9yZ2FfaGRyICpoZHIgPSBOVUxMOworCXN0cnVjdCBycmxwX3JnYV9lcGggKmVwaCA9IE5VTEw7CisJc3RydWN0IHJybHBfcmdhX2VwaF9leHQgKmVwaF9leHQgPSBOVUxMOworCXN0cnVjdCBycmxwX3JnYV9lcGhfZXh0X2NoZWNrICplcGhfZXh0X2NoZWNrID0gTlVMTDsKKwlpbnQgcCA9IDA7CisKKwkvKiBSZXNldCAqLworCWFyLT5yZXFfZWxlbXMgPSAwOworCWFyLT5lcGhfc3ZzID0gMDsKKworCS8qIFBhcnNlIG1lc3NhZ2UgKi8KKwloZHIgPSByZXE7CisJcCArPSBzaXplb2Yoc3RydWN0IHJybHBfcmdhX2hkcik7CisJaWYgKHAgPiByZXFfbGVuKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoaGRyLT5pdGVtczAgJiBSUkxQX1JHQTBfTkFWX01PREVMKSB7CisJCWVwaCA9IHJlcSArIHA7CisJCXAgKz0gc2l6ZW9mKHN0cnVjdCBycmxwX3JnYV9lcGgpOworCQlpZiAocCA+IHJlcV9sZW4pCisJCQlyZXR1cm4gLTE7CisJCXAgKz0gKGVwaC0+bnNhdF90bXRvZSA+PiA0KSAqIHNpemVvZihzdHJ1Y3QgcnJscF9yZ2FfZXBoX3N2KTsKKwkJaWYgKHAgPiByZXFfbGVuKQorCQkJcmV0dXJuIC0xOworCX0KKworCWlmIChoZHItPml0ZW1zMSAmIFJSTFBfUkdBMV9FUEhfRVhUKSB7CisJCWVwaF9leHQgPSByZXEgKyBwOworCQlwICs9IHNpemVvZihzdHJ1Y3QgcnJscF9yZ2FfZXBoX2V4dCk7CisJCWlmIChwID4gcmVxX2xlbikKKwkJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoaGRyLT5pdGVtczEgJiBSUkxQX1JHQTFfRVBIX0VYVF9DSEVDSykgeworCQllcGhfZXh0X2NoZWNrID0gcmVxICsgcDsKKwkJcCArPSBzaXplb2Yoc3RydWN0IHJybHBfcmdhX2VwaF9leHRfY2hlY2spOworCQlpZiAocCA+IHJlcV9sZW4pCisJCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHAgIT0gcmVxX2xlbikKKwkJcmV0dXJuIC0yOyAvKiBub3QgYWxsIGJ5dGVzIGNvbnN1bWVkID8/PyAqLworCisJLyogUHJpbnQgYSB3YXJuaW5nIGZvciB1bnN1cHBvcnRlZCByZXF1ZXN0cyAqLworCWlmICgoZXBoX2V4dCAhPSBOVUxMKSB8fAorCSAgICAoZXBoX2V4dF9jaGVjayAhPSBOVUxMKSB8fAorCSAgICAoaGRyLT5pdGVtczAgJiAoUlJMUF9SR0EwX0RHUFMgfCBSUkxQX1JHQTBfQUNRX0FTU0lTVCkpIHx8CisJICAgIChoZHItPml0ZW1zMSAmIFJSTFBfUkdBMV9SRUFMVElNRV9JTlQpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiW3ddIFVuc3VwcG9ydGVkIGFzc2lzdGFuY2UgZGF0YSByZXF1ZXN0ZWQsIGlnbm9yZWQgLi4uXG4iKTsKKwl9CisKKwkvKiBDb3B5IHRoZSByZXF1ZXN0ICovCisJaWYgKGhkci0+aXRlbXMwICYgUlJMUF9SR0EwX0FMTUFOQUMpCisJCWFyLT5yZXFfZWxlbXMgfD0gUlJMUF9BUl9BTE1BTkFDOworCisJaWYgKGhkci0+aXRlbXMwICYgUlJMUF9SR0EwX1VUQ19NT0RFTCkKKwkJYXItPnJlcV9lbGVtcyB8PSBSUkxQX0FSX1VUQ19NT0RFTDsKKworCWlmIChoZHItPml0ZW1zMCAmIFJSTFBfUkdBMF9JT05PX01PREVMKQorCQlhci0+cmVxX2VsZW1zIHw9IFJSTFBfQVJfSU9OT19NT0RFTDsKKworCWlmIChoZHItPml0ZW1zMCAmIFJSTFBfUkdBMF9SRUZfTE9DKQorCQlhci0+cmVxX2VsZW1zIHw9IFJSTFBfQVJfUkVGX0xPQzsKKworCWlmIChoZHItPml0ZW1zMCAmIFJSTFBfUkdBMF9SRUZfVElNRSkKKwkJYXItPnJlcV9lbGVtcyB8PSBSUkxQX0FSX1JFRl9USU1FOworCisJaWYgKGhkci0+aXRlbXMwICYgUlJMUF9SR0EwX05BVl9NT0RFTCkgeworCQlpbnQgaSwgbl9zdnMgPSBlcGgtPm5zYXRfdG10b2UgPj4gNDsKKwkJYXItPnJlcV9lbGVtcyB8PSBSUkxQX0FSX0VQSEVNRVJJUzsKKwkJZm9yIChpPTA7IGk8bl9zdnM7IGkrKykKKwkJCWFyLT5lcGhfc3ZzIHw9ICgxVUxMIDw8IChlcGgtPnN2c1tpXS5zdl9pZCAtIDEpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogfX19ICovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBSUkxQIGVsZW1lbnRzIGZpbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXt7eyAqLworCisJLyogSGVscGVycyAqLworCitzdGF0aWMgdm9pZAorX3RzXzIzXzAzMl9zdG9yZV9sYXRpdHVkZShkb3VibGUgbGF0LCB1aW50OF90ICpiKQoreworCXVpbnQzMl90IHg7CisJeCA9ICh1aW50MzJfdCkgZmxvb3IoZmFicyhsYXQvOTAuMCkgKiAoKGRvdWJsZSkoMTw8MjMpKSk7CisJaWYgKHggPj0gKDE8PDIzKSkKKwkJeCA9ICgxPDwyMykgLSAxOworCWlmIChsYXQgPCAwLjApCisJCXggfD0gKDE8PDIzKTsKKwliWzBdID0gKHggPj4gMTYpICYgMHhmZjsKKwliWzFdID0gKHggPj4gIDgpICYgMHhmZjsKKwliWzJdID0gIHggICAgICAgICYgMHhmZjsKK30KKworc3RhdGljIHZvaWQKK190c18yM18wMzJfc3RvcmVfbG9uZ2l0dWRlKGRvdWJsZSBsb24sIHVpbnQ4X3QgKmIpCit7CisJaW50MzJfdCB4OworCXggPSBmbG9vcigobG9uLzM2MC4wKSAqICgoZG91YmxlKSgxPDwyNCkpKTsKKwlpZiAoeCA+PSAoMTw8MjMpKQorCQl4ID0gMHgwMDdmZmZmZjsKKwllbHNlIGlmICh4IDwgLSgxPDwyMykpCisJCXggPSAweDAwODAwMDAwOworCWJbMF0gPSAoeCA+PiAxNikgJiAweGZmOworCWJbMV0gPSAoeCA+PiAgOCkgJiAweGZmOworCWJbMl0gPSAgeCAgICAgICAgJiAweGZmOworfQorCitzdGF0aWMgdm9pZAorX3RzXzIzXzAzMl9zdG9yZV9hbHRpdHVkZShkb3VibGUgYWx0LCB1aW50OF90ICpiKQoreworCWludCBhbHRfaSA9IChpbnQpZmFicyhhbHQpOworCWJbMF0gPSAoKGFsdF9pID4+IDgpICYgMHg3ZikgfCAoYWx0PDAuMCA/IDB4ODAgOiAweDAwKTsKKwliWzFdID0gYWx0X2kgJiAweGZmOworfQorCisKKwkvKiBGaWxsIG1ldGhvZHMgKi8KKworc3RhdGljIHZvaWQKK19ycmxwX2ZpbGxfbmF2aWdhdGlvbl9tb2RlbF9lbGVtZW50KAorCXN0cnVjdCBOYXZNb2RlbEVsZW1lbnQgKnJybHBfbm1lLAorCXN0cnVjdCBncHNfZXBoZW1lcmlzX3N2ICpncHNfZXBoX3N2KQoreworCXN0cnVjdCBVbmNvbXByZXNzZWRFcGhlbWVyaXMgKnJybHBfZXBoOworCisJcnJscF9ubWUtPnNhdFN0YXR1cy5wcmVzZW50ID0gU2F0U3RhdHVzX1BSX25ld1NhdGVsbGl0ZUFuZE1vZGVsVUM7CisJcnJscF9ubWUtPnNhdGVsbGl0ZUlEID0gZ3BzX2VwaF9zdi0+c3ZfaWQ7CisKKwlycmxwX2VwaCA9ICZycmxwX25tZS0+c2F0U3RhdHVzLmNob2ljZS5uZXdTYXRlbGxpdGVBbmRNb2RlbFVDOworCisJcnJscF9lcGgtPmVwaGVtQ29kZU9uTDIgICA9IGdwc19lcGhfc3YtPmNvZGVfb25fbDI7CisJcnJscF9lcGgtPmVwaGVtVVJBICAgICAgICA9IGdwc19lcGhfc3YtPnN2X3VyYTsKKwlycmxwX2VwaC0+ZXBoZW1TVmhlYWx0aCAgID0gZ3BzX2VwaF9zdi0+c3ZfaGVhbHRoOworCXJybHBfZXBoLT5lcGhlbUlPREMgICAgICAgPSBncHNfZXBoX3N2LT5pb2RjOworCXJybHBfZXBoLT5lcGhlbUwyUGZsYWcgICAgPSBncHNfZXBoX3N2LT5sMl9wX2ZsYWc7CisJcnJscF9lcGgtPmVwaGVtVGdkICAgICAgICA9IGdwc19lcGhfc3YtPnRfZ2Q7CisJcnJscF9lcGgtPmVwaGVtVG9jICAgICAgICA9IGdwc19lcGhfc3YtPnRfb2M7CisJcnJscF9lcGgtPmVwaGVtQUYyICAgICAgICA9IGdwc19lcGhfc3YtPmFfZjI7CisJcnJscF9lcGgtPmVwaGVtQUYxICAgICAgICA9IGdwc19lcGhfc3YtPmFfZjE7CisJcnJscF9lcGgtPmVwaGVtQUYwICAgICAgICA9IGdwc19lcGhfc3YtPmFfZjA7CisJcnJscF9lcGgtPmVwaGVtQ3JzICAgICAgICA9IGdwc19lcGhfc3YtPmNfcnM7CisJcnJscF9lcGgtPmVwaGVtRGVsdGFOICAgICA9IGdwc19lcGhfc3YtPmRlbHRhX247CisJcnJscF9lcGgtPmVwaGVtTTAgICAgICAgICA9IGdwc19lcGhfc3YtPm1fMDsKKwlycmxwX2VwaC0+ZXBoZW1DdWMgICAgICAgID0gZ3BzX2VwaF9zdi0+Y191YzsKKwlycmxwX2VwaC0+ZXBoZW1FICAgICAgICAgID0gZ3BzX2VwaF9zdi0+ZTsKKwlycmxwX2VwaC0+ZXBoZW1DdXMgICAgICAgID0gZ3BzX2VwaF9zdi0+Y191czsKKwlycmxwX2VwaC0+ZXBoZW1BUG93ZXJIYWxmID0gZ3BzX2VwaF9zdi0+YV9wb3doYWxmOworCXJybHBfZXBoLT5lcGhlbVRvZSAgICAgICAgPSBncHNfZXBoX3N2LT50X29lOworCXJybHBfZXBoLT5lcGhlbUZpdEZsYWcgICAgPSBncHNfZXBoX3N2LT5maXRfZmxhZzsKKwlycmxwX2VwaC0+ZXBoZW1BT0RBICAgICAgID0gZ3BzX2VwaF9zdi0+YW9kbzsKKwlycmxwX2VwaC0+ZXBoZW1DaWMgICAgICAgID0gZ3BzX2VwaF9zdi0+Y19pYzsKKwlycmxwX2VwaC0+ZXBoZW1PbWVnYUEwICAgID0gZ3BzX2VwaF9zdi0+b21lZ2FfMDsKKwlycmxwX2VwaC0+ZXBoZW1DaXMgICAgICAgID0gZ3BzX2VwaF9zdi0+Y19pczsKKwlycmxwX2VwaC0+ZXBoZW1JMCAgICAgICAgID0gZ3BzX2VwaF9zdi0+aV8wOworCXJybHBfZXBoLT5lcGhlbUNyYyAgICAgICAgPSBncHNfZXBoX3N2LT5jX3JjOworCXJybHBfZXBoLT5lcGhlbVcgICAgICAgICAgPSBncHNfZXBoX3N2LT53OworCXJybHBfZXBoLT5lcGhlbU9tZWdhQURvdCAgPSBncHNfZXBoX3N2LT5vbWVnYV9kb3Q7CisJcnJscF9lcGgtPmVwaGVtSURvdCAgICAgICA9IGdwc19lcGhfc3YtPmlkb3Q7CisKKwlycmxwX2VwaC0+ZXBoZW1TRjFSc3ZkLnJlc2VydmVkMSA9IGdwc19lcGhfc3YtPl9yc3ZkMTsKKwlycmxwX2VwaC0+ZXBoZW1TRjFSc3ZkLnJlc2VydmVkMiA9IGdwc19lcGhfc3YtPl9yc3ZkMjsKKwlycmxwX2VwaC0+ZXBoZW1TRjFSc3ZkLnJlc2VydmVkMyA9IGdwc19lcGhfc3YtPl9yc3ZkMzsKKwlycmxwX2VwaC0+ZXBoZW1TRjFSc3ZkLnJlc2VydmVkNCA9IGdwc19lcGhfc3YtPl9yc3ZkNDsKK30KKworc3RhdGljIHZvaWQKK19ycmxwX2ZpbGxfYWxtYW5hY19lbGVtZW50KAorCXN0cnVjdCBBbG1hbmFjRWxlbWVudCAqcnJscF9hZSwKKwlzdHJ1Y3QgZ3BzX2FsbWFuYWNfc3YgKmdwc19hbG1fc3YpCit7CisJcnJscF9hZS0+c2F0ZWxsaXRlSUQgPSBncHNfYWxtX3N2LT5zdl9pZDsKKworCXJybHBfYWUtPmFsbWFuYWNFICAgICAgICAgID0gZ3BzX2FsbV9zdi0+ZTsKKwlycmxwX2FlLT5hbGFtYW5hY1RvYSAgICAgICA9IGdwc19hbG1fc3YtPnRfb2E7CisJcnJscF9hZS0+YWxtYW5hY0tzaWkgICAgICAgPSBncHNfYWxtX3N2LT5rc2lpOworCXJybHBfYWUtPmFsbWFuYWNPbWVnYURvdCAgID0gZ3BzX2FsbV9zdi0+b21lZ2FfZG90OworCXJybHBfYWUtPmFsbWFuYWNTVmhlYWx0aCAgID0gZ3BzX2FsbV9zdi0+c3ZfaGVhbHRoOworCXJybHBfYWUtPmFsbWFuYWNBUG93ZXJIYWxmID0gZ3BzX2FsbV9zdi0+YV9wb3doYWxmOworCXJybHBfYWUtPmFsbWFuYWNPbWVnYTAgICAgID0gZ3BzX2FsbV9zdi0+b21lZ2FfMDsKKwlycmxwX2FlLT5hbG1hbmFjVyAgICAgICAgICA9IGdwc19hbG1fc3YtPnc7CisJcnJscF9hZS0+YWxtYW5hY00wICAgICAgICAgPSBncHNfYWxtX3N2LT5tXzA7CisJcnJscF9hZS0+YWxtYW5hY0FGMCAgICAgICAgPSBncHNfYWxtX3N2LT5hX2YwOworCXJybHBfYWUtPmFsbWFuYWNBRjEgICAgICAgID0gZ3BzX2FsbV9zdi0+YV9mMTsKKworfQorCitzdGF0aWMgdm9pZAorX3JybHBfZmlsbF9pb25vc3BoZXJpY19tb2RlbCgKKwlzdHJ1Y3QgSW9ub3NwaGVyaWNNb2RlbCAqcnJscF9pb25vLAorCXN0cnVjdCBncHNfaW9ub3NwaGVyZV9tb2RlbCAqZ3BzX2lvbm8pCit7CisJcnJscF9pb25vLT5hbGZhMCA9IGdwc19pb25vLT5hbHBoYV8wOworCXJybHBfaW9uby0+YWxmYTEgPSBncHNfaW9uby0+YWxwaGFfMTsKKwlycmxwX2lvbm8tPmFsZmEyID0gZ3BzX2lvbm8tPmFscGhhXzI7CisJcnJscF9pb25vLT5hbGZhMyA9IGdwc19pb25vLT5hbHBoYV8zOworCXJybHBfaW9uby0+YmV0YTAgPSBncHNfaW9uby0+YmV0YV8wOworCXJybHBfaW9uby0+YmV0YTEgPSBncHNfaW9uby0+YmV0YV8xOworCXJybHBfaW9uby0+YmV0YTIgPSBncHNfaW9uby0+YmV0YV8yOworCXJybHBfaW9uby0+YmV0YTMgPSBncHNfaW9uby0+YmV0YV8zOworfQorCitzdGF0aWMgdm9pZAorX3JybHBfZmlsbF91dGNfbW9kZWwoCisJc3RydWN0IFVUQ01vZGVsICpycmxwX3V0YywKKwlzdHJ1Y3QgZ3BzX3V0Y19tb2RlbCAqZ3BzX3V0YykKK3sKKwlycmxwX3V0Yy0+dXRjQTEgICAgICAgID0gZ3BzX3V0Yy0+YTE7CisJcnJscF91dGMtPnV0Y0EwICAgICAgICA9IGdwc191dGMtPmEwOworCXJybHBfdXRjLT51dGNUb3QgICAgICAgPSBncHNfdXRjLT50X290OworCXJybHBfdXRjLT51dGNXTnQgICAgICAgPSBncHNfdXRjLT53bl90ICYgMHhmZjsKKwlycmxwX3V0Yy0+dXRjRGVsdGFUbHMgID0gZ3BzX3V0Yy0+ZGVsdGFfdF9sczsKKwlycmxwX3V0Yy0+dXRjV05sc2YgICAgID0gZ3BzX3V0Yy0+d25fbHNmICYgMHhmZjsKKwlycmxwX3V0Yy0+dXRjRE4gICAgICAgID0gZ3BzX3V0Yy0+ZG47CisJcnJscF91dGMtPnV0Y0RlbHRhVGxzZiA9IGdwc191dGMtPmRlbHRhX3RfbHNmOworfQorCisvKiB9fX0gKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFJSTFAgQXNzaXN0YW5jZSBQRFUgR2VuZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0te3t7ICovCisKK3N0cnVjdCBQRFUgKgorX3JybHBfY3JlYXRlX2dwc19hc3Npc3RfcGR1KGludCByZWZudW0sIHN0cnVjdCBHUFNfQXNzaXN0RGF0YSAqKm9fZ3BzX2FkKQoreworCXN0cnVjdCBQRFUgKnBkdTsKKwlzdHJ1Y3QgR1BTX0Fzc2lzdERhdGEgKmdwc19hZDsKKworCXBkdSA9IGNhbGxvYygxLCBzaXplb2YoKnBkdSkpOworCWlmICghcGR1KQorCQlyZXR1cm4gTlVMTDsKKworCWdwc19hZCA9IGNhbGxvYygxLCBzaXplb2YoKmdwc19hZCkpOworCWlmICghZ3BzX2FkKSB7CisJCWZyZWUocGR1KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKG9fZ3BzX2FkKQorCQkqb19ncHNfYWQgPSBncHNfYWQ7CisKKwlwZHUtPnJlZmVyZW5jZU51bWJlciA9IHJlZm51bTsKKwlwZHUtPmNvbXBvbmVudC5wcmVzZW50ID0gUlJMUF9Db21wb25lbnRfUFJfYXNzaXN0YW5jZURhdGE7CisJcGR1LT5jb21wb25lbnQuY2hvaWNlLmFzc2lzdGFuY2VEYXRhLmdwc19Bc3Npc3REYXRhID0gZ3BzX2FkOworCisJcmV0dXJuIHBkdTsKK30KKworc3RhdGljIGludAorX3JybHBfYWRkX2lvbm9zcGhlcmljX21vZGVsKAorCXN0cnVjdCBHUFNfQXNzaXN0RGF0YSAqcnJscF9ncHNfYWQsCisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzX2FkKQoreworCXN0cnVjdCBJb25vc3BoZXJpY01vZGVsICpycmxwX2lvbm87CisKKwlpZiAoIShncHNfYWQtPmZpZWxkcyAmIEdQU19GSUVMRF9JT05PU1BIRVJFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlycmxwX2lvbm8gPSBjYWxsb2MoMSwgc2l6ZW9mKCpycmxwX2lvbm8pKTsKKwlpZiAoIXJybHBfaW9ubykKKwkJcmV0dXJuIC1FTk9NRU07CisJcnJscF9ncHNfYWQtPmNvbnRyb2xIZWFkZXIuaW9ub3NwaGVyaWNNb2RlbCA9IHJybHBfaW9ubzsKKworCV9ycmxwX2ZpbGxfaW9ub3NwaGVyaWNfbW9kZWwocnJscF9pb25vLCAmZ3BzX2FkLT5pb25vc3BoZXJlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitfcnJscF9hZGRfdXRjX21vZGVsKAorCXN0cnVjdCBHUFNfQXNzaXN0RGF0YSAqcnJscF9ncHNfYWQsCisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzX2FkKQoreworCXN0cnVjdCBVVENNb2RlbCAqcnJscF91dGM7CisKKwlpZiAoIShncHNfYWQtPmZpZWxkcyAmIEdQU19GSUVMRF9VVEMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJybHBfdXRjID0gY2FsbG9jKDEsIHNpemVvZigqcnJscF91dGMpKTsKKwlpZiAoIXJybHBfdXRjKQorCQlyZXR1cm4gLUVOT01FTTsKKwlycmxwX2dwc19hZC0+Y29udHJvbEhlYWRlci51dGNNb2RlbCA9IHJybHBfdXRjOworCisJX3JybHBfZmlsbF91dGNfbW9kZWwocnJscF91dGMsICZncHNfYWQtPnV0Yyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorX3JybHBfYWRkX3JlZmVyZW5jZV9sb2NhdGlvbigKKwlzdHJ1Y3QgR1BTX0Fzc2lzdERhdGEgKnJybHBfZ3BzX2FkLAorCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwc19hZCkKK3sKKwlzdHJ1Y3QgUmVmTG9jYXRpb24gKnJybHBfcmVmbG9jOworCXVpbnQ4X3QgKmI7CisKKwlpZiAoIShncHNfYWQtPmZpZWxkcyAmIEdQU19GSUVMRF9SRUZQT1MpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJybHBfcmVmbG9jID0gY2FsbG9jKDEsIHNpemVvZigqcnJscF9yZWZsb2MpKTsKKwlpZiAoIXJybHBfcmVmbG9jKQorCQlyZXR1cm4gLUVOT01FTTsKKwlycmxwX2dwc19hZC0+Y29udHJvbEhlYWRlci5yZWZMb2NhdGlvbiA9IHJybHBfcmVmbG9jOworCisJYiA9IG1hbGxvYyg5KTsKKworCWJbMF0gPSAweDgwOyAvKiBFbGxpcHNvaWQgUG9pbnQgd2l0aCBhbHRpdHVkZSAqLworCV90c18yM18wMzJfc3RvcmVfbGF0aXR1ZGUoZ3BzX2FkLT5yZWZfcG9zLmxhdGl0dWRlLCAmYlsxXSk7CisJX3RzXzIzXzAzMl9zdG9yZV9sb25naXR1ZGUoZ3BzX2FkLT5yZWZfcG9zLmxvbmdpdHVkZSwgJmJbNF0pOworCV90c18yM18wMzJfc3RvcmVfYWx0aXR1ZGUoZ3BzX2FkLT5yZWZfcG9zLmFsdGl0dWRlLCAmYls3XSk7CisKKwlycmxwX3JlZmxvYy0+dGhyZWVETG9jYXRpb24uYnVmID0gYjsKKwlycmxwX3JlZmxvYy0+dGhyZWVETG9jYXRpb24uc2l6ZSA9IDk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorX3JybHBfYWRkX3JlZmVyZW5jZV90aW1lKAorCXN0cnVjdCBHUFNfQXNzaXN0RGF0YSAqcnJscF9ncHNfYWQsCisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzX2FkKQoreworCXN0cnVjdCBSZWZlcmVuY2VUaW1lICpycmxwX3JlZnRpbWU7CisKKwlpZiAoIShncHNfYWQtPmZpZWxkcyAmIEdQU19GSUVMRF9SRUZUSU1FKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlycmxwX3JlZnRpbWUgPSBjYWxsb2MoMSwgc2l6ZW9mKCpycmxwX3JlZnRpbWUpKTsKKwlpZiAoIXJybHBfcmVmdGltZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcnJscF9ncHNfYWQtPmNvbnRyb2xIZWFkZXIucmVmZXJlbmNlVGltZSA9IHJybHBfcmVmdGltZTsKKworCXJybHBfcmVmdGltZS0+Z3BzVGltZS5ncHNXZWVrICAgPSBncHNfYWQtPnJlZl90aW1lLnduICYgMHgzZmY7IC8qIDEwYiAqLworCXJybHBfcmVmdGltZS0+Z3BzVGltZS5ncHNUT1cyM2IgPQorCQkoKGludClmbG9vcihncHNfYWQtPnJlZl90aW1lLnRvdyAvIDAuMDgpKSAmIDB4N2ZmZmZmOyAgLyogMjNiICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorX3JybHBfYWRkX2FsbWFuYWMoCisJc3RydWN0IEdQU19Bc3Npc3REYXRhICpycmxwX2dwc19hZCwKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHNfYWQsIGludCAqc3RhcnQsIGludCBjb3VudCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgQWxtYW5hYyAqcnJscF9hbG07CisJc3RydWN0IGdwc19hbG1hbmFjICpncHNfYWxtID0gJmdwc19hZC0+YWxtYW5hYzsKKworCWlmICghKGdwc19hZC0+ZmllbGRzICYgR1BTX0ZJRUxEX0FMTUFOQUMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJybHBfYWxtID0gY2FsbG9jKDEsIHNpemVvZigqcnJscF9hbG0pKTsKKwlpZiAoIXJybHBfYWxtKQorCQlyZXR1cm4gLUVOT01FTTsKKwlycmxwX2dwc19hZC0+Y29udHJvbEhlYWRlci5hbG1hbmFjID0gcnJscF9hbG07CisKKwlycmxwX2FsbS0+YWxhbWFuYWNXTmEgPSBncHNfYWxtLT53bmE7CisJaWYgKGNvdW50ID09IC0xKQorCQljb3VudCA9IGdwc19hbG0tPm5fc3YgLSAqc3RhcnQ7CisJZm9yIChpPSpzdGFydDsgKGk8KnN0YXJ0K2NvdW50KSAmJiAoaTxncHNfYWxtLT5uX3N2KTsgaSsrKSB7CisJCXN0cnVjdCBBbG1hbmFjRWxlbWVudCAqYWU7CisJCWFlID0gY2FsbG9jKDEsIHNpemVvZigqYWUpKTsKKwkJaWYgKCFhZSkKKwkJCXJldHVybiAtRU5PTUVNOworCQlfcnJscF9maWxsX2FsbWFuYWNfZWxlbWVudChhZSwgJmdwc19hbG0tPnN2c1tpXSk7CisJCUFTTl9TRVFVRU5DRV9BREQoJnJybHBfYWxtLT5hbG1hbmFjTGlzdC5saXN0LCBhZSk7CisJfQorCisJKnN0YXJ0ID0gaTsKKworCXJldHVybiBpIDwgZ3BzX2FsbS0+bl9zdjsKK30KKworc3RhdGljIGludAorX3JybHBfYWRkX2VwaGVtZXJpcygKKwlzdHJ1Y3QgR1BTX0Fzc2lzdERhdGEgKnJybHBfZ3BzX2FkLAorCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwc19hZCwgaW50ICpzdGFydCwgaW50IGNvdW50LCB1aW50NjRfdCBtYXNrKQoreworCWludCBpLCBqOworCXN0cnVjdCBOYXZpZ2F0aW9uTW9kZWwgKnJybHBfbmF2OworCXN0cnVjdCBncHNfZXBoZW1lcmlzICpncHNfZXBoID0gJmdwc19hZC0+ZXBoZW1lcmlzOworCisJaWYgKCEoZ3BzX2FkLT5maWVsZHMgJiBHUFNfRklFTERfRVBIRU1FUklTKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlycmxwX25hdiA9IGNhbGxvYygxLCBzaXplb2YoKnJybHBfbmF2KSk7CisJaWYgKCFycmxwX25hdikKKwkJcmV0dXJuIC1FTk9NRU07CisJcnJscF9ncHNfYWQtPmNvbnRyb2xIZWFkZXIubmF2aWdhdGlvbk1vZGVsID0gcnJscF9uYXY7CisKKwlpZiAoY291bnQgPT0gLTEpCisJCWNvdW50ID0gZ3BzX2VwaC0+bl9zdiAtICpzdGFydDsKKwlmb3IgKGk9KnN0YXJ0LGo9MDsgKGo8Y291bnQpICYmIChpPGdwc19lcGgtPm5fc3YpOyBpKyspIHsKKwkJaWYgKCEobWFzayAmICgxVUxMPDwoZ3BzX2VwaC0+c3ZzW2ldLnN2X2lkLTEpKSkpCisJCQljb250aW51ZTsKKwkJc3RydWN0IE5hdk1vZGVsRWxlbWVudCAqbm1lOworCQlubWUgPSBjYWxsb2MoMSwgc2l6ZW9mKCpubWUpKTsKKwkJaWYgKCFubWUpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJX3JybHBfZmlsbF9uYXZpZ2F0aW9uX21vZGVsX2VsZW1lbnQobm1lLCAmZ3BzX2VwaC0+c3ZzW2ldKTsKKwkJQVNOX1NFUVVFTkNFX0FERCgmcnJscF9uYXYtPm5hdk1vZGVsTGlzdC5saXN0LCBubWUpOworCQlqKys7CisJfQorCisJKnN0YXJ0ID0gaTsKKworCXJldHVybiBpIDwgZ3BzX2VwaC0+bl9zdjsKK30KKworCisjZGVmaW5lIE1BWF9QRFVTIDY0CisKK2ludAorcnJscF9ncHNfYXNzaXN0X3BkdXMoCisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzX2FkLCBzdHJ1Y3QgcnJscF9hc3Npc3RfcmVxICpyZXEsCisJdm9pZCAqKm9fcGR1LCBpbnQgKm9fbGVuLCBpbnQgb19tYXhfcGR1cykKK3sKKwlzdHJ1Y3QgUERVICpsc3RfcGR1W01BWF9QRFVTXTsKKwlpbnQgbHN0X2NudCA9IDA7CisKKwlzdHJ1Y3QgUERVICpycmxwX3BkdSA9IE5VTEw7CisJc3RydWN0IEdQU19Bc3Npc3REYXRhICpycmxwX2dwc19hZCA9IE5VTEw7CisJdWludDMyX3QgcmUgPSByZXEtPnJlcV9lbGVtczsKKwlpbnQgaSwgcnYgPSAwOworCisJLyogSW9ub3NwaGVyaWNNb2RlbCwgVVRDTW9kZWwsIFJlZkxvY2F0aW9uLCBSZWZlcmVuY2VUaW1lICovCisJaWYgKHJlICYgKFJSTFBfQVJfSU9OT19NT0RFTCB8CisJICAgICAgICAgIFJSTFBfQVJfVVRDX01PREVMIHwKKwkgICAgICAgICAgUlJMUF9BUl9SRUZfVElNRSB8CisJICAgICAgICAgIFJSTFBfQVJfUkVGX0xPQykpCisJeworCQlpbnQgcGR1X2hhc19kYXRhID0gMDsKKworCQlycmxwX3BkdSA9IF9ycmxwX2NyZWF0ZV9ncHNfYXNzaXN0X3BkdSgxLCAmcnJscF9ncHNfYWQpOworCQlpZiAoIXJybHBfcGR1KSB7CisJCQlydiA9IC1FTk9NRU07CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJaWYgKHJlICYgUlJMUF9BUl9JT05PX01PREVMKQorCQkJaWYgKCFfcnJscF9hZGRfaW9ub3NwaGVyaWNfbW9kZWwocnJscF9ncHNfYWQsIGdwc19hZCkpCisJCQkJcGR1X2hhc19kYXRhID0gMTsKKworCQlpZiAocmUgJiBSUkxQX0FSX1VUQ19NT0RFTCkKKwkJCWlmICghX3JybHBfYWRkX3V0Y19tb2RlbChycmxwX2dwc19hZCwgZ3BzX2FkKSkKKwkJCQlwZHVfaGFzX2RhdGEgPSAxOworCisJCWlmIChyZSAmIFJSTFBfQVJfUkVGX1RJTUUpCisJCQlpZiAoIV9ycmxwX2FkZF9yZWZlcmVuY2VfdGltZShycmxwX2dwc19hZCwgZ3BzX2FkKSkKKwkJCQlwZHVfaGFzX2RhdGEgPSAxOworCisJCWlmIChyZSAmIFJSTFBfQVJfUkVGX0xPQykKKwkJCWlmICghX3JybHBfYWRkX3JlZmVyZW5jZV9sb2NhdGlvbihycmxwX2dwc19hZCwgZ3BzX2FkKSkKKwkJCQlwZHVfaGFzX2RhdGEgPSAxOworCisJCWlmIChwZHVfaGFzX2RhdGEpIHsKKwkJCWxzdF9wZHVbbHN0X2NudCsrXSA9IHJybHBfcGR1OworCQkJcnJscF9wZHUgPSBOVUxMOworCQl9CisJfQorCisJLyogQWxtYW5hYyAqLworCWlmIChyZSAmIFJSTFBfQVJfQUxNQU5BQykgeworCQlpID0gMDsKKwkJZG8geworCQkJaWYgKCEoZ3BzX2FkLT5maWVsZHMgJiBHUFNfRklFTERfQUxNQU5BQykpCisJCQkJYnJlYWs7CisKKwkJCWlmICghcnJscF9wZHUpIHsKKwkJCQlycmxwX3BkdSA9IF9ycmxwX2NyZWF0ZV9ncHNfYXNzaXN0X3BkdSgxLCAmcnJscF9ncHNfYWQpOworCQkJCWlmICghcnJscF9wZHUpIHsKKwkJCQkJcnYgPSAtRU5PTUVNOworCQkJCQlnb3RvIGVycm9yOworCQkJCX0KKwkJCX0KKworCQkJcnYgPSBfcnJscF9hZGRfYWxtYW5hYyhycmxwX2dwc19hZCwgZ3BzX2FkLCAmaSwgMTApOworCQkJaWYgKHJ2IDwgMCkKKwkJCQlnb3RvIGVycm9yOworCisJCQlsc3RfcGR1W2xzdF9jbnQrK10gPSBycmxwX3BkdTsKKwkJCXJybHBfcGR1ID0gTlVMTDsKKwkJfSB3aGlsZSAocnYpOworCX0KKworCS8qIEVwaGVtZXJpcyAqLworCWlmIChyZSAmIFJSTFBfQVJfRVBIRU1FUklTKSB7CisJCWkgPSAwOworCQlkbyB7CisJCQlpZiAoIShncHNfYWQtPmZpZWxkcyAmIEdQU19GSUVMRF9FUEhFTUVSSVMpKQorCQkJCWJyZWFrOworCisJCQlpZiAoIXJybHBfcGR1KSB7CisJCQkJcnJscF9wZHUgPSBfcnJscF9jcmVhdGVfZ3BzX2Fzc2lzdF9wZHUoMSwgJnJybHBfZ3BzX2FkKTsKKwkJCQlpZiAoIXJybHBfcGR1KSB7CisJCQkJCXJ2ID0gLUVOT01FTTsKKwkJCQkJZ290byBlcnJvcjsKKwkJCQl9CisJCQl9CisKKwkJCXJ2ID0gX3JybHBfYWRkX2VwaGVtZXJpcyhycmxwX2dwc19hZCwgZ3BzX2FkLCAmaSwgMiwgcmVxLT5lcGhfc3ZzKTsKKworCQkJbHN0X3BkdVtsc3RfY250KytdID0gcnJscF9wZHU7CisJCQlycmxwX3BkdSA9IE5VTEw7CisKKwkJfSB3aGlsZSAocnYpOworCX0KKworCS8qIFNlcmlhbGl6ZSAmIFJlbGVhc2UgYWxsIFBEVXMgKi8KKwlmb3IgKGk9MDsgaTxsc3RfY250ICYmIGk8b19tYXhfcGR1czsgaSsrKSB7CisJCS8qIFBzZXVkbyBzZWdtZW50YXRpb24gZmxhZ3MgKi8KKwkJTW9yZUFzc0RhdGFUb0JlU2VudF90ICptYWQgPSBjYWxsb2MoMSwgc2l6ZW9mKCptYWQpKTsKKwkJKm1hZCA9IChpID09IChsc3RfY250LTEpKSA/CisJCQkJTW9yZUFzc0RhdGFUb0JlU2VudF9ub01vcmVNZXNzYWdlcyA6CisJCQkJTW9yZUFzc0RhdGFUb0JlU2VudF9tb3JlTWVzc2FnZXNPblRoZVdheTsKKwkJbHN0X3BkdVtpXS0+Y29tcG9uZW50LmNob2ljZS5hc3Npc3RhbmNlRGF0YS5tb3JlQXNzRGF0YVRvQmVTZW50ID0gbWFkOworCisJCS8qIFNlcmlhbGl6YXRpb24gKi8KKwkJLy8gYXNuX2ZwcmludChzdGRvdXQsICZhc25fREVGX1BEVSwgbHN0X3BkdVtpXSk7CisJCXJ2ID0gdXBlcl9lbmNvZGVfdG9fbmV3X2J1ZmZlcigmYXNuX0RFRl9QRFUsIE5VTEwsIGxzdF9wZHVbaV0sICZvX3BkdVtpXSk7CisJCWlmIChydiA8IDApCisJCQlnb3RvIGVycm9yOworCQlvX2xlbltpXSA9IHJ2OworCX0KKworCXJ2ID0gbHN0X2NudDsKKworCS8qIFJlbGVhc2UgQVNOLjEgb2JqZWN0cyAqLworZXJyb3I6CisJaWYgKHJybHBfcGR1KQorCQlhc25fREVGX1BEVS5mcmVlX3N0cnVjdCgmYXNuX0RFRl9QRFUsICh2b2lkKilycmxwX3BkdSwgMCk7CisKKwlmb3IgKGk9MDsgaTxsc3RfY250OyBpKyspCisJCWFzbl9ERUZfUERVLmZyZWVfc3RydWN0KCZhc25fREVGX1BEVSwgbHN0X3BkdVtpXSwgMCk7CisKKwlyZXR1cm4gcnY7Cit9CisKKy8qIH19fSAqLworCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9ycmxwLmggYi9ycmxwLWVwaGVtZXJpcy9ycmxwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVlNDM0NAotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL3JybHAuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogcnJscC5oCisgKgorICogUlJMUCBIZWFkZXIKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5ICBTeWx2YWluIE11bmF1dCA8dG50QDI0NnROdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIF9fUlJMUF9IX18KKyNkZWZpbmUgX19SUkxQX0hfXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJncHMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIE91ciBpbnRlcm5hbCBzaW1wbGlmaWVkIHN0cnVjdHVyZSBmb3IgcmVxdWVzdHMgKi8KKworI2RlZmluZSBSUkxQX0FSX1JFRl9MT0MJCSgxPDwwKQorI2RlZmluZSBSUkxQX0FSX1JFRl9USU1FCSgxPDwxKQorI2RlZmluZSBSUkxQX0FSX1VUQ19NT0RFTAkoMTw8MikKKyNkZWZpbmUgUlJMUF9BUl9JT05PX01PREVMCSgxPDwzKQorI2RlZmluZSBSUkxQX0FSX0FMTUFOQUMJCSgxPDw0KQorI2RlZmluZSBSUkxQX0FSX0VQSEVNRVJJUwkoMTw8NSkKKworc3RydWN0IHJybHBfYXNzaXN0X3JlcSB7CisJdWludDMyX3QgcmVxX2VsZW1zOworCXVpbnQ2NF90IGVwaF9zdnM7Cit9OworCisKKy8qIE1ldGhvZHMgKi8KK2ludCBycmxwX2RlY29kZV9hc3Npc3RhbmNlX3JlcXVlc3Qoc3RydWN0IHJybHBfYXNzaXN0X3JlcSAqYXIsCisJdm9pZCAqcmVxLCBpbnQgcmVxX2xlbik7CisKK2ludCBycmxwX2dwc19hc3Npc3RfcGR1cygKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHNfYWQsIHN0cnVjdCBycmxwX2Fzc2lzdF9yZXEgKnJlcSwKKwl2b2lkICoqb19wZHUsIGludCAqb19sZW4sIGludCBvX21heF9wZHVzKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19SUkxQX0hfXyAqLworCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy91YngtcGFyc2UuYyBiL3JybHAtZXBoZW1lcmlzL3VieC1wYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZDBmNzAKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy91YngtcGFyc2UuYwpAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIHVieC1wYXJzZS5jCisgKgorICogSW1wbGVtZW50YXRpb24gb2YgcGFyc2luZyBjb2RlIGNvbnZlcnRpbmcgVUJYIG1lc3NhZ2VzIHRvIEdQUyBhc3Npc3QKKyAqIGRhdGEKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5ICBTeWx2YWluIE11bmF1dCA8dG50QDI0NnROdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImdwcy5oIgorI2luY2x1ZGUgInVieC5oIgorI2luY2x1ZGUgInVieC1wYXJzZS5oIgorCisKKy8qIEhlbHBlcnMgKi8KKworc3RhdGljIGludAorZmxvYXRfdG9fZml4ZWRwb2ludChmbG9hdCBmLCBpbnQgc2YpCit7CisJaWYgKHNmIDwgMCkgeworCQl3aGlsZSAoc2YrKyA8IDApCisJCQlmICo9IDIuMGY7CisJfSBlbHNlIHsKKwkJd2hpbGUgKHNmLS0gPiAwKQorCQkJZiAqPSAwLjVmOworCX0KKworCXJldHVybiAoaW50KWY7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Citkb3VibGVfdG9fZml4ZWRwb2ludChkb3VibGUgZCwgaW50IHNmKQoreworCWlmIChzZiA8IDApIHsKKwkJd2hpbGUgKHNmKysgPCAwKQorCQkJZCAqPSAyLjA7CisJfSBlbHNlIHsKKwkJd2hpbGUgKHNmLS0gPiAwKQorCQkJZCAqPSAwLjU7CisJfQorCisJcmV0dXJuIChpbnQpZDsKK30KKworCisvKiBVQlggbWVzc2FnZSBwYXJzaW5nIHRvIGZpbGwgZ3BzIGFzc2lzdCBkYXRhICovCisKK3N0YXRpYyB2b2lkCitfdWJ4X21zZ19wYXJzZV9uYXZfcG9zbGxoKHN0cnVjdCB1YnhfaGRyICpoZHIsIHZvaWQgKnBsLCBpbnQgcGxfbGVuLCB2b2lkICp1ZCkKK3sKKwlzdHJ1Y3QgdWJ4X25hdl9wb3NsbGggKm5hdl9wb3NsbGggPSBwbDsKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHMgPSB1ZDsKKworCS8vcHJpbnRmKCJbLl0gTkFWX1BPU0xMSFxuIik7CisKKwlncHMtPmZpZWxkcyB8PSBHUFNfRklFTERfUkVGUE9TOworCisJZ3BzLT5yZWZfcG9zLmxhdGl0dWRlICA9IChkb3VibGUpKG5hdl9wb3NsbGgtPmxhdCkgKiAxZS03OworCWdwcy0+cmVmX3Bvcy5sb25naXR1ZGUgPSAoZG91YmxlKShuYXZfcG9zbGxoLT5sb24pICogMWUtNzsKKwlncHMtPnJlZl9wb3MuYWx0aXR1ZGUgID0gKGRvdWJsZSkobmF2X3Bvc2xsaC0+aGVpZ2h0KSAqIDFlLTM7Cit9CisKK3N0YXRpYyB2b2lkCitfdWJ4X21zZ19wYXJzZV9haWRfaW5pKHN0cnVjdCB1YnhfaGRyICpoZHIsIHZvaWQgKnBsLCBpbnQgcGxfbGVuLCB2b2lkICp1ZCkKK3sKKwlzdHJ1Y3QgdWJ4X2FpZF9pbmkgKmFpZF9pbmkgPSBwbDsKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHMgPSB1ZDsKKworCS8vcHJpbnRmKCJbLl0gQUlEX0lOSVxuIik7CisKKwkvKiBFeHRyYWN0IGluZm8gZm9yICJSZWZlcmVuY2UgVGltZSIgKi8KKwlncHMtPmZpZWxkcyB8PSBHUFNfRklFTERfUkVGVElNRTsKKworCWdwcy0+cmVmX3RpbWUud24gPSBhaWRfaW5pLT53bjsKKwlncHMtPnJlZl90aW1lLnRvdyA9IChkb3VibGUpYWlkX2luaS0+dG93ICogMWUtMzsKKworCS8vIEZJWE1FOiBXZSBjb3VsZCBleHRyYWN0IHJlZiBwb3NpdGlvbiBhcyB3ZWxsIGJ1dCB3ZSBuZWVkIGl0IGluCisJLy8gICAgICAgIFdHUzg0IGdlb2RldGljIGNvb3JkaW5hdGVzIGFuZCBpdCdzIHByb3ZpZGVkIGFzIGVjZWYsIHNvCisJLy8gICAgICAgIHdlIG5lZWQgYSBsb3Qgb2YgbWF0aCAuLi4KK30KKworc3RhdGljIHZvaWQKK191YnhfbXNnX3BhcnNlX2FpZF9odWkoc3RydWN0IHVieF9oZHIgKmhkciwgdm9pZCAqcGwsIGludCBwbF9sZW4sIHZvaWQgKnVkKQoreworCXN0cnVjdCB1YnhfYWlkX2h1aSAqYWlkX2h1aSA9IHBsOworCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwcyA9IHVkOworCisJLy9wcmludGYoIlsuXSBBSURfSFVJXG4iKTsKKworCWlmIChhaWRfaHVpLT5mbGFncyAmIDB4MikgeyAvKiBVVEMgcGFyYW1ldGVycyB2YWxpZCAqLworCQlzdHJ1Y3QgZ3BzX3V0Y19tb2RlbCAqdXRjID0gJmdwcy0+dXRjOworCisJCWdwcy0+ZmllbGRzIHw9IEdQU19GSUVMRF9VVEM7CisKKwkJdXRjLT5hMCAgICAgICAgICA9IGRvdWJsZV90b19maXhlZHBvaW50KGFpZF9odWktPnV0Y19hMCwgLTMwKTsKKwkJdXRjLT5hMSAgICAgICAgICA9IGRvdWJsZV90b19maXhlZHBvaW50KGFpZF9odWktPnV0Y19hMSwgLTUwKTsKKwkJdXRjLT5kZWx0YV90X2xzICA9IGFpZF9odWktPnV0Y19sczsKKwkJdXRjLT50X290ICAgICAgICA9IGFpZF9odWktPnV0Y190b3QgPj4gMTI7CisJCXV0Yy0+d25fdCAgICAgICAgPSBhaWRfaHVpLT51dGNfd250OworCQl1dGMtPnduX2xzZiAgICAgID0gYWlkX2h1aS0+dXRjX3duZjsKKwkJdXRjLT5kbiAgICAgICAgICA9IGFpZF9odWktPnV0Y19kbjsKKwkJdXRjLT5kZWx0YV90X2xzZiA9IGFpZF9odWktPnV0Y19sc2Y7CisJfQorCisJaWYgKGFpZF9odWktPmZsYWdzICYgMHgwNCkgeyAvKiBLbG9idWNoYXIgcGFyYW1ldGVycyB2YWxpZCAqLworCQlzdHJ1Y3QgZ3BzX2lvbm9zcGhlcmVfbW9kZWwgKmlvbm8gPSAmZ3BzLT5pb25vc3BoZXJlOworCisJCWdwcy0+ZmllbGRzIHw9IEdQU19GSUVMRF9JT05PU1BIRVJFOworCisJCWlvbm8tPmFscGhhXzAgPSBmbG9hdF90b19maXhlZHBvaW50KGFpZF9odWktPmtsb2JfYTAsIC0zMCk7CisJCWlvbm8tPmFscGhhXzEgPSBmbG9hdF90b19maXhlZHBvaW50KGFpZF9odWktPmtsb2JfYTEsIC0yNyk7CisJCWlvbm8tPmFscGhhXzIgPSBmbG9hdF90b19maXhlZHBvaW50KGFpZF9odWktPmtsb2JfYTIsIC0yNCk7CisJCWlvbm8tPmFscGhhXzMgPSBmbG9hdF90b19maXhlZHBvaW50KGFpZF9odWktPmtsb2JfYTMsIC0yNCk7CisJCWlvbm8tPmJldGFfMCA9IGZsb2F0X3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+a2xvYl9iMCwgMTEpOworCQlpb25vLT5iZXRhXzEgPSBmbG9hdF90b19maXhlZHBvaW50KGFpZF9odWktPmtsb2JfYjEsIDE0KTsKKwkJaW9uby0+YmV0YV8yID0gZmxvYXRfdG9fZml4ZWRwb2ludChhaWRfaHVpLT5rbG9iX2IyLCAxNik7CisJCWlvbm8tPmJldGFfMyA9IGZsb2F0X3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+a2xvYl9iMywgMTYpOworCX0KK30KKworc3RhdGljIHZvaWQKK191YnhfbXNnX3BhcnNlX2FpZF9hbG0oc3RydWN0IHVieF9oZHIgKmhkciwgdm9pZCAqcGwsIGludCBwbF9sZW4sIHZvaWQgKnVkKQoreworCXN0cnVjdCB1YnhfYWlkX2FsbSAqYWlkX2FsbSA9IHBsOworCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwcyA9IHVkOworCisJLy9wcmludGYoIlsuXSBBSURfQUxNICVkIC0gJWRcbiIsIGFpZF9hbG0tPnN2X2lkLCBhaWRfYWxtLT5ncHNfd2Vlayk7CisKKwlpZiAoYWlkX2FsbS0+Z3BzX3dlZWspIHsKKwkJZ3BzLT5maWVsZHMgfD0gR1BTX0ZJRUxEX0FMTUFOQUM7CisJCWdwcy0+YWxtYW5hYy53bmEgPSBhaWRfYWxtLT5ncHNfd2VlayAmIDB4ZmY7CisJCWdwc191bnBhY2tfc2Y0NV9hbG1hbmFjKGFpZF9hbG0tPmFsbV93b3JkcywgJmdwcy0+YWxtYW5hYy5zdnNbZ3BzLT5hbG1hbmFjLm5fc3YrK10pOworCX0KK30KKworc3RhdGljIHZvaWQKK191YnhfbXNnX3BhcnNlX2FpZF9lcGgoc3RydWN0IHVieF9oZHIgKmhkciwgdm9pZCAqcGwsIGludCBwbF9sZW4sIHZvaWQgKnVkKQoreworCXN0cnVjdCB1YnhfYWlkX2VwaCAqYWlkX2VwaCA9IHBsOworCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwcyA9IHVkOworCisJLy9wcmludGYoIlsuXSBBSURfRVBIICVkIC0gJXNcbiIsIGFpZF9lcGgtPnN2X2lkLCBhaWRfZXBoLT5wcmVzZW50ID8gInByZXNlbnQiIDogIm5vdCBwcmVzZW50Iik7CisKKwlpZiAoYWlkX2VwaC0+cHJlc2VudCkgeworCQlpbnQgaSA9IGdwcy0+ZXBoZW1lcmlzLm5fc3YrKzsKKwkJZ3BzLT5maWVsZHMgfD0gR1BTX0ZJRUxEX0VQSEVNRVJJUzsKKwkJZ3BzLT5lcGhlbWVyaXMuc3ZzW2ldLnN2X2lkID0gYWlkX2VwaC0+c3ZfaWQ7CisJCWdwc191bnBhY2tfc2YxMjMoYWlkX2VwaC0+ZXBoX3dvcmRzLCAmZ3BzLT5lcGhlbWVyaXMuc3ZzW2ldKTsKKwl9Cit9CisKKworLyogRGlzcGF0Y2ggdGFibGUgKi8KK3N0cnVjdCB1YnhfZGlzcGF0Y2hfZW50cnkgdWJ4X3BhcnNlX2R0W10gPSB7CisJVUJYX0RJU1BBVENIKE5BViwgUE9TTExILCBfdWJ4X21zZ19wYXJzZV9uYXZfcG9zbGxoKSwKKwlVQlhfRElTUEFUQ0goQUlELCBJTkksIF91YnhfbXNnX3BhcnNlX2FpZF9pbmkpLAorCVVCWF9ESVNQQVRDSChBSUQsIEhVSSwgX3VieF9tc2dfcGFyc2VfYWlkX2h1aSksCisJVUJYX0RJU1BBVENIKEFJRCwgQUxNLCBfdWJ4X21zZ19wYXJzZV9haWRfYWxtKSwKKwlVQlhfRElTUEFUQ0goQUlELCBFUEgsIF91YnhfbXNnX3BhcnNlX2FpZF9lcGgpLAorfTsKKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvdWJ4LXBhcnNlLmggYi9ycmxwLWVwaGVtZXJpcy91YngtcGFyc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjE0NzVkCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvdWJ4LXBhcnNlLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIHVieC1wYXJzZS5oCisgKgorICogSGVhZGVyIGZvciBwYXJzaW5nIGNvZGUgY29udmVydGluZyBVQlggbWVzc2FnZXMgdG8gR1BTIGFzc2lzdCBkYXRhCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSAgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBfX1VCWF9QQVJTRV9IX18KKyNkZWZpbmUgX19VQlhfUEFSU0VfSF9fCisKKworI2luY2x1ZGUgImdwcy5oIgorI2luY2x1ZGUgInVieC5oIgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBEaXNwYXRjaCB0YWJsZSAqLworZXh0ZXJuIHN0cnVjdCB1YnhfZGlzcGF0Y2hfZW50cnkgdWJ4X3BhcnNlX2R0W107CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fVUJYX1BBUlNFX0hfXyAqLworCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy91YnguYyBiL3JybHAtZXBoZW1lcmlzL3VieC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZGQxZjAKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy91YnguYwpAQCAtMCwwICsxLDgxIEBACisvKgorICogdWJ4LmMKKyAqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBnZW5lcmljIFVCWCBoZWxwZXJzCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSAgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJ1YnguaCIKKworCitzdGF0aWMgdm9pZAordWJ4X2NoZWNrc3VtKHVpbnQ4X3QgKmRhdGEsIGludCBsZW4sIHVpbnQ4X3QgKmNrc3VtKQoreworCWludCBpOworCXVpbnQ4X3QgY2swID0gMCwgY2sxID0gMDsKKwlmb3IgKGk9MDsgaTxsZW47IGkrKykgeworCQljazAgKz0gZGF0YVtpXTsKKwkJY2sxICs9IGNrMDsKKwl9CisJY2tzdW1bMF0gPSBjazA7CisJY2tzdW1bMV0gPSBjazE7Cit9CisKKworc3RhdGljIHVieF9tc2dfaGFuZGxlcl90Cit1YnhfZmluZF9oYW5kbGVyKHN0cnVjdCB1YnhfZGlzcGF0Y2hfZW50cnkgKmR0LCB1aW50OF90IG1zZ19jbGFzcywgdWludDhfdCBtc2dfaWQpCit7CisJd2hpbGUgKGR0LT5oYW5kbGVyKSB7CisJCWlmICgoZHQtPm1zZ19jbGFzcyA9PSBtc2dfY2xhc3MpICYmIChkdC0+bXNnX2lkID09IG1zZ19pZCkpCisJCQlyZXR1cm4gZHQtPmhhbmRsZXI7CisJCWR0Kys7CisJfQorCXJldHVybiBOVUxMOworfQorCisKK2ludAordWJ4X21zZ19kaXNwYXRjaChzdHJ1Y3QgdWJ4X2Rpc3BhdGNoX2VudHJ5ICpkdCwKKyAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLCBpbnQgbGVuLCB2b2lkICp1c2VyZGF0YSkKK3sKKwlzdHJ1Y3QgdWJ4X2hkciAqaGRyID0gbXNnOworCXVpbnQ4X3QgY2tzdW1bMl0sICpja3N1bV9wdHI7CisJdWJ4X21zZ19oYW5kbGVyX3QgaDsKKworCWlmICgoaGRyLT5zeW5jWzBdICE9IFVCWF9TWU5DMCkgfHwgKGhkci0+c3luY1sxXSAhPSBVQlhfU1lOQzEpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiWyFdIEludmFsaWQgc3luYyBieXRlc1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwl1YnhfY2hlY2tzdW0obXNnICsgMiwgc2l6ZW9mKHN0cnVjdCB1YnhfaGRyKSArIGhkci0+cGF5bG9hZF9sZW4gLSAyLCBja3N1bSk7CisJY2tzdW1fcHRyID0gbXNnICsgKHNpemVvZihzdHJ1Y3QgdWJ4X2hkcikgKyBoZHItPnBheWxvYWRfbGVuKTsKKwlpZiAoKGNrc3VtX3B0clswXSAhPSBja3N1bVswXSkgfHwgKGNrc3VtX3B0clsxXSAhPSBja3N1bVsxXSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJbIV0gSW52YWxpZCBjaGVja3N1bVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwloID0gdWJ4X2ZpbmRfaGFuZGxlcihkdCwgaGRyLT5tc2dfY2xhc3MsIGhkci0+bXNnX2lkKTsKKwlpZiAoaCkKKwkJaChoZHIsIG1zZyArIHNpemVvZihzdHJ1Y3QgdWJ4X2hkciksIGhkci0+cGF5bG9hZF9sZW4sIHVzZXJkYXRhKTsKKworCXJldHVybiBzaXplb2Yoc3RydWN0IHVieF9oZHIpICsgaGRyLT5wYXlsb2FkX2xlbiArIDI7Cit9CisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL3VieC5oIGIvcnJscC1lcGhlbWVyaXMvdWJ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI2NDM4NgotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL3VieC5oCkBAIC0wLDAgKzEsMjMyIEBACisvKgorICogdWJ4LmgKKyAqCisgKiBIZWFkZXIgZm9yIFVCWCByZWxhdGVkIHN0dWZmCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSAgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBfX1VCWF9IX18KKyNkZWZpbmUgX19VQlhfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiBDb25zdGFudHMgdXNlZCBpbiBVQlggKi8KKworCS8qIFN5bmMgYnl0ZXMgKHR3byBmaXJzdCBieXRlcyBvZiBlYWNoIG1lc3NhZ2UpICovCisjZGVmaW5lIFVCWF9TWU5DMAkJMHhiNQorI2RlZmluZSBVQlhfU1lOQzEJCTB4NjIKKworCS8qIFVCWCBtZXNzYWdlcyBjbGFzc2VzICovCisjZGVmaW5lIFVCWF9DTEFTU19OQVYJCTB4MDEKKyNkZWZpbmUgVUJYX0NMQVNTX1JYTQkJMHgwMgorI2RlZmluZSBVQlhfQ0xBU1NfSU5GCQkweDA0CisjZGVmaW5lIFVCWF9DTEFTU19BQ0sJCTB4MDUKKyNkZWZpbmUgVUJYX0NMQVNTX0NGRwkJMHgwNgorI2RlZmluZSBVQlhfQ0xBU1NfVVBECQkweDA5CisjZGVmaW5lIFVCWF9DTEFTU19NT04JCTB4MGEKKyNkZWZpbmUgVUJYX0NMQVNTX0FJRAkJMHgwYgorI2RlZmluZSBVQlhfQ0xBU1NfVElNCQkweDBkCisKKwkvKiBVQlggbWVzc2FnZXMgdHlwZSBJRCAoYnkgY2xhc3MpICovCisjZGVmaW5lIFVCWF9OQVZfUE9TRUNFRgkJMHgwMQorI2RlZmluZSBVQlhfTkFWX1BPU0xMSAkJMHgwMgorI2RlZmluZSBVQlhfTkFWX1NUQVRVUwkJMHgwMworI2RlZmluZSBVQlhfTkFWX0RPUAkJMHgwNAorI2RlZmluZSBVQlhfTkFWX1NPTAkJMHgwNgorI2RlZmluZSBVQlhfTkFWX1BPU1VUTQkJMHgwOAorI2RlZmluZSBVQlhfTkFWX1ZFTEVDRUYJCTB4MTEKKyNkZWZpbmUgVUJYX05BVl9WRUxORUQJCTB4MTIKKyNkZWZpbmUgVUJYX05BVl9USU1FR1BTCQkweDIwCisjZGVmaW5lIFVCWF9OQVZfVElNRVVUQwkJMHgyMQorI2RlZmluZSBVQlhfTkFWX0NMT0NLCQkweDIyCisjZGVmaW5lIFVCWF9OQVZfU1ZJTkZPCQkweDMwCisjZGVmaW5lIFVCWF9OQVZfREdQUwkJMHgzMQorI2RlZmluZSBVQlhfTkFWX1NCQVMJCTB4MzIKKyNkZWZpbmUgVUJYX05BVl9FS0ZTVEFUVVMJMHg0MAorCisjZGVmaW5lIFVCWF9SWE1fUkFXCQkweDEwCisjZGVmaW5lIFVCWF9SWE1fU0ZSQgkJMHgxMQorI2RlZmluZSBVQlhfUlhNX1NWU0kJCTB4MjAKKyNkZWZpbmUgVUJYX1JYTV9TVlNJX0dQUwkweDIwCisjZGVmaW5lIFVCWF9SWE1fQUxNCQkweDMwCisjZGVmaW5lIFVCWF9SWE1fRVBICQkweDMxCisjZGVmaW5lIFVCWF9SWE1fUE9TUkVRCQkweDQwCisKKyNkZWZpbmUgVUJYX0lORl9FUlJPUgkJMHgwMAorI2RlZmluZSBVQlhfSU5GX1dBUk5JTkcJCTB4MDEKKyNkZWZpbmUgVUJYX0lORl9OT1RJQ0UJCTB4MDIKKyNkZWZpbmUgVUJYX0lORl9URVNUCQkweDAzCisjZGVmaW5lIFVCWF9JTkZfREVCVUcJCTB4MDQKKyNkZWZpbmUgVUJYX0lORl9VU0VSCQkweDA3CisKKyNkZWZpbmUgVUJYX0FDS19OQUsJCTB4MDAKKyNkZWZpbmUgVUJYX0FDS19BQ0sJCTB4MDEKKworI2RlZmluZSBVQlhfQ0ZHX1BSVAkJMHgwMAorI2RlZmluZSBVQlhfQ0ZHX1VTQgkJMHgxYgorI2RlZmluZSBVQlhfQ0ZHX01TRwkJMHgwMQorI2RlZmluZSBVQlhfQ0ZHX05NRUEJCTB4MTcKKyNkZWZpbmUgVUJYX0NGR19SQVRFCQkweDA4CisjZGVmaW5lIFVCWF9DRkdfQ0ZHCQkweDA5CisjZGVmaW5lIFVCWF9DRkdfVFAJCTB4MDcKKyNkZWZpbmUgVUJYX0NGR19OQVYyCQkweDFhCisjZGVmaW5lIFVCWF9DRkdfREFUCQkweDA2CisjZGVmaW5lIFVCWF9DRkdfSU5GCQkweDAyCisjZGVmaW5lIFVCWF9DRkdfUlNUCQkweDA0CisjZGVmaW5lIFVCWF9DRkdfUlhNCQkweDExCisjZGVmaW5lIFVCWF9DRkdfQU5UCQkweDEzCisjZGVmaW5lIFVCWF9DRkdfRlhOCQkweDBlCisjZGVmaW5lIFVCWF9DRkdfU0JBUwkJMHgxNgorI2RlZmluZSBVQlhfQ0ZHX0xJQwkJMHg4MAorI2RlZmluZSBVQlhfQ0ZHX1RNCQkweDEwCisjZGVmaW5lIFVCWF9DRkdfVE0yCQkweDE5CisjZGVmaW5lIFVCWF9DRkdfVE1PREUJCTB4MWQKKyNkZWZpbmUgVUJYX0NGR19FS0YJCTB4MTIKKworI2RlZmluZSBVQlhfVVBEX0RPV05MCQkweDAxCisjZGVmaW5lIFVCWF9VUERfVVBMT0FECQkweDAyCisjZGVmaW5lIFVCWF9VUERfRVhFQwkJMHgwMworI2RlZmluZSBVQlhfVVBEX01FTUNQWQkJMHgwNAorCisjZGVmaW5lIFVCWF9NT05fU0NIRAkJMHgwMQorI2RlZmluZSBVQlhfTU9OX0lPCQkweDAyCisjZGVmaW5lIFVCWF9NT05fSVBDCQkweDAzCisjZGVmaW5lIFVCWF9NT05fVkVSCQkweDA0CisjZGVmaW5lIFVCWF9NT05fRVhDRVBUCQkweDA1CisjZGVmaW5lIFVCWF9NT05fTVNHUFAJCTB4MDYKKyNkZWZpbmUgVUJYX01PTl9SWEJVRgkJMHgwNworI2RlZmluZSBVQlhfTU9OX1RYQlVGCQkweDA4CisjZGVmaW5lIFVCWF9NT05fSFcJCTB4MDkKKyNkZWZpbmUgVUJYX01PTl9VU0IJCTB4MGEKKworI2RlZmluZSBVQlhfQUlEX1JFUQkJMHgwMAorI2RlZmluZSBVQlhfQUlEX0lOSQkJMHgwMQorI2RlZmluZSBVQlhfQUlEX0hVSQkJMHgwMgorI2RlZmluZSBVQlhfQUlEX0RBVEEJCTB4MTAKKyNkZWZpbmUgVUJYX0FJRF9BTE0JCTB4MzAKKyNkZWZpbmUgVUJYX0FJRF9FUEgJCTB4MzEKKworI2RlZmluZSBVQlhfVElNX1RQCQkweDAxCisjZGVmaW5lIFVCWF9USU1fVE0JCTB4MDIKKyNkZWZpbmUgVUJYX1RJTV9UTTIJCTB4MDMKKyNkZWZpbmUgVUJYX1RJTV9TVklOCQkweDA0CisKKworLyogSGVhZGVyICovCitzdHJ1Y3QgdWJ4X2hkciB7CisgICAgICAgIHVpbnQ4X3QgIHN5bmNbMl07CisgICAgICAgIHVpbnQ4X3QgIG1zZ19jbGFzczsKKyAgICAgICAgdWludDhfdCAgbXNnX2lkOworICAgICAgICB1aW50MTZfdCBwYXlsb2FkX2xlbjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworLyogUGF5bG9hZCBmb3JtYXRzIChzb21lIG9mIHRoZW0pICovCitzdHJ1Y3QgdWJ4X25hdl9wb3NsbGggeworCXVpbnQzMl90IGl0b3c7CisJaW50MzJfdCAgbG9uOwkvKiBzY2FsaW5nIDFlLTcgKi8KKwlpbnQzMl90ICBsYXQ7CS8qIHNjYWxpbmcgMWUtNyAqLworCWludDMyX3QgIGhlaWdodDsvKiBtbSAqLworCWludDMyX3QgIGhzbDsJLyogbW0gKi8KKwl1aW50MzJfdCBoYWNjOwkvKiBtbSAqLworCXVpbnQzMl90IHZhY2M7CS8qIG1tICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgdWJ4X2FpZF9pbmkgeworCWludDMyX3QgIHg7CisJaW50MzJfdCAgeTsKKwlpbnQzMl90ICB6OworCXVpbnQzMl90IHBvc2FjYzsKKwl1aW50MTZfdCB0bV9jZmc7CisJdWludDE2X3Qgd247CisJdWludDMyX3QgdG93OworCWludDMyX3QgIHRvd19uczsKKwl1aW50MzJfdCB0YWNjX21zOworCXVpbnQzMl90IHRhY2NfbnM7CisJaW50MzJfdCAgY2xrZDsKKwl1aW50MzJfdCBjbGtkYWNjOworCXVpbnQzMl90IGZsYWdzOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHVieF9haWRfaHVpIHsKKwl1aW50MzJfdCBoZWFsdGg7CisJZG91YmxlICAgdXRjX2ExOworCWRvdWJsZSAgIHV0Y19hMDsKKwlpbnQzMl90ICB1dGNfdG90OworCWludDE2X3QgIHV0Y193bnQ7CisJaW50MTZfdCAgdXRjX2xzOworCWludDE2X3QgIHV0Y193bmY7CisJaW50MTZfdCAgdXRjX2RuOworCWludDE2X3QgIHV0Y19sc2Y7CisJaW50MTZfdCAgdXRjX3NwYXJlOworCWZsb2F0ICAgIGtsb2JfYTA7CisJZmxvYXQgICAga2xvYl9hMTsKKwlmbG9hdCAgICBrbG9iX2EyOworCWZsb2F0ICAgIGtsb2JfYTM7CisJZmxvYXQgICAga2xvYl9iMDsKKwlmbG9hdCAgICBrbG9iX2IxOworCWZsb2F0ICAgIGtsb2JfYjI7CisJZmxvYXQgICAga2xvYl9iMzsKKwl1aW50MzJfdCBmbGFnczsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCB1YnhfYWlkX2FsbSB7CisJdWludDMyX3Qgc3ZfaWQ7CisJdWludDMyX3QgZ3BzX3dlZWs7CisJdWludDMyX3QgYWxtX3dvcmRzWzhdOwkvKiBQcmVzZW50IG9ubHkgaWYgJ2dwc193ZWVrJyAhPSAwICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgdWJ4X2FpZF9lcGggeworCXVpbnQzMl90IHN2X2lkOworCXVpbnQzMl90IHByZXNlbnQ7CisJdWludDMyX3QgZXBoX3dvcmRzWzI0XTsJLyogUHJlc2VudCBvbmx5IGlmICdwcmVzZW50JyAhPSAwICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKy8qIE1lc3NhZ2UgaGFuZGxlciAqLwordHlwZWRlZiB2b2lkICgqdWJ4X21zZ19oYW5kbGVyX3QpKAorCXN0cnVjdCB1YnhfaGRyICpoZHIsIHZvaWQgKnBheWxvYWQsIGludCBwYXlsb2FkX2xlbiwgdm9pZCAqdXNlcmRhdGEpOworCitzdHJ1Y3QgdWJ4X2Rpc3BhdGNoX2VudHJ5IHsKKwl1aW50OF90IG1zZ19jbGFzczsKKwl1aW50OF90IG1zZ19pZDsKKwl1YnhfbXNnX2hhbmRsZXJfdCBoYW5kbGVyOworfTsKKworI2RlZmluZSBVQlhfRElTUEFUQ0goa2xzLGlkLGhkbCkgewkJXAorCS5tc2dfY2xhc3MgPSBVQlhfQ0xBU1NfICMjIGtscyAsCVwKKwkubXNnX2lkID0gVUJYXyAjIyBrbHMgIyMgXyAjIyBpZCwJXAorCS5oYW5kbGVyID0gKGhkbCksCQkJXAorfQorCisKKy8qIE1ldGhvZHMgKi8KK2ludCB1YnhfbXNnX2Rpc3BhdGNoKHN0cnVjdCB1YnhfZGlzcGF0Y2hfZW50cnkgKmR0LAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLCBpbnQgbGVuLCB2b2lkICp1c2VyZGF0YSk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fVUJYX0hfXyAqLworCmRpZmYgLS1naXQgYS93aXJlc2hhcmsvYWJpc19vbWwucGF0Y2ggYi93aXJlc2hhcmsvYWJpc19vbWwucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU0NTc1MwotLS0gL2Rldi9udWxsCisrKyBiL3dpcmVzaGFyay9hYmlzX29tbC5wYXRjaApAQCAtMCwwICsxLDIyNDAgQEAKK0Zyb20gNjFhNGQ1NTQwYTc4NjBlN2VkZGM2N2IzZGIwZjJmODAzNTdmMWRhMCBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KK0RhdGU6IE1vbiwgMTkgQXByIDIwMTAgMTM6MjM6NTEgKzA4MDAKK1N1YmplY3Q6IFtQQVRDSCAxLzJdIEFkZCB0aGUgQWJpcyBPTUwgcGF0Y2guCisKKy0tLQorIGVwYW4vZGlzc2VjdG9ycy9NYWtlZmlsZS5jb21tb24gICAgICAgfCAgICAxICsKKyBlcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWdzbV9hYmlzX29tbC5jIHwgMTQwMiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKyBlcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWdzbV9hYmlzX29tbC5oIHwgIDc5OCArKysrKysrKysrKysrKysrKysrCisgMyBmaWxlcyBjaGFuZ2VkLCAyMjAxIGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGVwYW4vZGlzc2VjdG9ycy9wYWNrZXQtZ3NtX2FiaXNfb21sLmMKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1nc21fYWJpc19vbWwuaAorCitkaWZmIC0tZ2l0IGEvZXBhbi9kaXNzZWN0b3JzL01ha2VmaWxlLmNvbW1vbiBiL2VwYW4vZGlzc2VjdG9ycy9NYWtlZmlsZS5jb21tb24KK2luZGV4IDQ5NzNjM2IuLjY1ZTZkMDEgMTAwNjQ0CistLS0gYS9lcGFuL2Rpc3NlY3RvcnMvTWFrZWZpbGUuY29tbW9uCisrKysgYi9lcGFuL2Rpc3NlY3RvcnMvTWFrZWZpbGUuY29tbW9uCitAQCAtNDgzLDYgKzQ4Myw3IEBAIERJU1NFQ1RPUl9TUkMgPSBcCisgCXBhY2tldC1nc21fYV9nbS5jCQlcCisgCXBhY2tldC1nc21fYV9ycC5jCQlcCisgCXBhY2tldC1nc21fYV9yci5jCVwKKysJcGFja2V0LWdzbV9hYmlzX29tbC5jCVwKKyAJcGFja2V0LWdzbV9pcGEuYwlcCisgCXBhY2tldC1nc21fYnNzbGFwLmMJCVwKKyAJcGFja2V0LWdzbV9ic3NtYXBfbGUuYwlcCitkaWZmIC0tZ2l0IGEvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1nc21fYWJpc19vbWwuYyBiL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtZ3NtX2FiaXNfb21sLmMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5kYzUzNDk2CistLS0gL2Rldi9udWxsCisrKysgYi9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWdzbV9hYmlzX29tbC5jCitAQCAtMCwwICsxLDE0MDIgQEAKKysvKiBwYWNrZXQtYWJpc19vbWwuYworKyAqIFJvdXRpbmVzIGZvciBwYWNrZXQgZGlzc2VjdGlvbiBvZiBHU00gQS1iaXMgb3ZlciBJUCAoM0dQUCBUUyAxMi4yMSkKKysgKiBDb3B5cmlnaHQgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorKyAqIENvcHlyaWdodCAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKysgKiBiYXNlZCBvbiBBLWJpcyBPTUwgY29kZSBpbiBPcGVuQlNDCisrICoKKysgKiAkSWQkCisrICoKKysgKiBXaXJlc2hhcmsgLSBOZXR3b3JrIHRyYWZmaWMgYW5hbHl6ZXIKKysgKiBCeSBHZXJhbGQgQ29tYnMgPGdlcmFsZEB3aXJlc2hhcmsub3JnPgorKyAqIENvcHlyaWdodCAxOTk4IEdlcmFsZCBDb21icworKyAqCisrICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisrICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKysgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKysgKgorKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisrICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrICoKKysgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKysgKi8KKysKKysjaWZkZWYgSEFWRV9DT05GSUdfSAorKyMgaW5jbHVkZSAiY29uZmlnLmgiCisrI2VuZGlmCisrCisrI2luY2x1ZGUgPGdsaWIuaD4KKysKKysjaW5jbHVkZSA8ZXBhbi9wYWNrZXQuaD4KKysjaW5jbHVkZSA8ZXBhbi9lbWVtLmg+CisrI2luY2x1ZGUgPGVwYW4vbGFwZF9zYXBpLmg+CisrI2luY2x1ZGUgPGVwYW4vcHJlZnMuaD4KKysKKysjaW5jbHVkZSAicGFja2V0LWdzbV9hYmlzX29tbC5oIgorKyNpbmNsdWRlICJwYWNrZXQtZ3NtX2FfY29tbW9uLmgiCisrCisrLyogaW5pdGlhbGl6ZSB0aGUgcHJvdG9jb2wgYW5kIHJlZ2lzdGVyZWQgZmllbGRzICovCisrc3RhdGljIGludCBwcm90b19hYmlzX29tbCA9IC0xOworKworKy8qIE9NTCBoZWFkZXIgKi8KKytzdGF0aWMgaW50IGhmX29tbF9tc2dfZGlzYyA9IC0xOworK3N0YXRpYyBpbnQgaGZfb21sX3BsYWNlbWVudCA9IC0xOworK3N0YXRpYyBpbnQgaGZfb21sX3NlcXVlbmNlID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfbGVuZ3RoID0gLTE7CisrLyogRk9NIGhlYWRlciAqLworK3N0YXRpYyBpbnQgaGZfb21sX2ZvbV9tc2d0eXBlID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfZm9tX29iamNsYXNzID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfZm9tX2luc3RfYnRzID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfZm9tX2luc3RfdHJ4ID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfZm9tX2luc3RfdHMgPSAtMTsKKytzdGF0aWMgaW50IGhmX29tbF9mb21fYXR0cl90YWcgPSAtMTsKKytzdGF0aWMgaW50IGhmX29tbF9mb21fYXR0cl9sZW4gPSAtMTsKKytzdGF0aWMgaW50IGhmX29tbF9mb21fYXR0cl92YWwgPSAtMTsKKysvKiBGT00gYXR0cmlidXRlcyAqLworK3N0YXRpYyBpbnQgaGZfYXR0cl9hZG1fc3RhdGUgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfYXJmY24gPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfb3Blcl9zdGF0ZSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9hdmFpbF9zdGF0ZSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9ldmVudF90eXBlID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX3NldmVyaXR5ID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2JjY2hfYXJmY24gPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfYnNpYyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl90ZXN0X25vID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX3RzYyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl90ZWkgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfYWNoX2J0c3AgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfYWNoX3RzbG90ID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2FjaF9zc2xvdCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9nc21fdGltZSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9jaGFuX2NvbWIgPSAtMTsKKysvKiBJcGFjY2VzcyAqLworK3N0YXRpYyBpbnQgaGZfb21sX2lwYV90cmVzX2F0dHJfdGFnID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfaXBhX3RyZXNfYXR0cl9sZW4gPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3Rlc3RfcmVzID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9yeGxldiA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfYl9yeGxldiA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfYXJmY24gPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX2ZfcXVhbCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfZl9lcnIgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX3J4cXVhbCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfZnJhbWVfb2ZmcyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfZnJhbWVucl9vZmZzID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9ic2ljID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9jZWxsX2lkID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9zaTIgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX3NpMmJpcyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfc2kydGVyID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9jaGFuX2Rlc2MgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3JzbF9pcCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfcnNsX3BvcnQgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3ByaW1fb21sX2lwID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9wcmltX29tbF9wb3J0ID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9sb2NhdGlvbl9uYW1lID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV91bml0X2lkID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV91bml0X25hbWUgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX252X2ZsYWdzID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9udl9tYXNrID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9uc2xfc3BvcnQgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX25zbF9kYWRkciA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfbnNsX2Rwb3J0ID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9uc2VpID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9uc3ZjaSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfYnZjaSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfcmFjID0gLTE7CisrCisrLyogaW5pdGlhbGl6ZSB0aGUgc3VidHJlZSBwb2ludGVycyAqLworK3N0YXRpYyBpbnQgZXR0X29tbCA9IC0xOworK3N0YXRpYyBpbnQgZXR0X29tbF9mb20gPSAtMTsKKytzdGF0aWMgaW50IGV0dF9vbWxfZm9tX2F0dCA9IC0xOworKworKy8qIERlY29kZSB0aGluZ3MgYXMgbmFub0JUUyB0cmFjZXMgKi8KKytzdGF0aWMgZ2Jvb2xlYW4gZ2xvYmFsX29tbF91c2VfbmFub19idHMgPSBUUlVFOworKworK3N0YXRpYyBwcm90b190cmVlICp0b3BfdHJlZTsKKysKKysvKiBUUyAxMi4yMSBDaGFwdGVyIDguMSAvIFRTIDA4LjU5ICovCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfbXNnX2Rpc2NfdmFsc1tdID0geworKwl7IEFCSVNfT01fTURJU0NfRk9NLAkiRm9ybWF0dGVkIE8mTSIgfSwKKysJeyBBQklTX09NX01ESVNDX01NSSwJIk1NSSBUcmFuc2ZlciIgfSwKKysJeyBBQklTX09NX01ESVNDX1RSQVUsCSJUUkFVIE8mTSIgfSwKKysJeyBBQklTX09NX01ESVNDX01BTlVGLAkiTWFudWZhY3R1cmVyIHNwZWNpZmljIiB9LAorK307CisrCisrLyogVFMgMTIuMjEgQ2hhcHRlciA4LjEuMSAqLworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX3BsYWNlbWVudF92YWxzW10gPSB7CisrCXsgQUJJU19PTV9QTEFDRU1FTlRfT05MWSwJIk9ubHkiIH0sCisrCXsgQUJJU19PTV9QTEFDRU1FTlRfRklSU1QsCSJGaXJzdCIgfSwKKysJeyBBQklTX09NX1BMQUNFTUVOVF9NSURETEUsCSJNaWRkbGUiIH0sCisrCXsgQUJJU19PTV9QTEFDRU1FTlRfTEFTVCwJIkxhc3QiIH0sCisrfTsKKysKKysvKiBUUyAxMi4yMSBDaGFwdGVyIDkuMiAqLworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX2ZvbV9tc2d0eXBlX3ZhbHNbXSA9IHsKKysJeyBOTV9NVF9MT0FEX0lOSVQsCQkiU29mdHdhcmUgTG9hZCBJbml0IiB9LAorKwl7IE5NX01UX0xPQURfSU5JVF9BQ0ssCQkiU29mdHdhcmUgTG9hZCBJbml0IEFDSyIgfSwKKysJeyBOTV9NVF9MT0FEX0lOSVRfTkFDSywJCSJTb2Z0d2FyZSBMb2FkIEluaXQgTkFDSyIgfSwKKysJeyBOTV9NVF9MT0FEX1NFRywJCSJTb2Z0d2FyZSBMb2FkIFNlZ21lbnQiIH0sCisrCXsgTk1fTVRfTE9BRF9TRUdfQUNLLAkJIlNvZnR3YXJlIExvYWQgU2VnbWVudCBBQ0siIH0sCisrCXsgTk1fTVRfTE9BRF9FTkQsCQkiU29mdHdhcmUgTG9hZCBFbmQiIH0sCisrCXsgTk1fTVRfTE9BRF9FTkRfQUNLLAkJIlNvZnR3YXJlIExvYWQgRW5kIEFDSyIgfSwKKysJeyBOTV9NVF9MT0FEX0VORF9OQUNLLAkJIlNvZnR3YXJlIExvYWQgRW5kIE5BQ0siIH0sCisrCXsgTk1fTVRfU1dfQUNUX1JFUSwJCSJTb2Z0d2FyZSBBY3RpdmF0ZSBSZXF1ZXN0IiB9LAorKwl7IE5NX01UX1NXX0FDVF9SRVFfQUNLLAkJIlNvZnR3YXJlIEFjdGl2YXRlIFJlcXVlc3QgQUNLIiB9LAorKwl7IE5NX01UX1NXX0FDVF9SRVFfTkFDSywJIlNvZnR3YXJlIEFjdGl2YXRlIFJlcXVlc3QgTkFDSyIgfSwKKysJeyBOTV9NVF9BQ1RJVkFURV9TVywJCSJBY3RpdmF0ZSBTb2Z0d2FyZSIgfSwKKysJeyBOTV9NVF9BQ1RJVkFURV9TV19BQ0ssCSJBY3RpdmF0ZSBTb2Z0d2FyZSBBQ0siIH0sCisrCXsgTk1fTVRfQUNUSVZBVEVfU1dfTkFDSywJIkFjdGl2YXRlIFNvZnR3YXJlIE5BQ0siIH0sCisrCXsgTk1fTVRfU1dfQUNUSVZBVEVEX1JFUCwJIlNvZnR3YXJlIEFjdGl2YXRlZCBSZXBvcnQiIH0sCisrCXsgTk1fTVRfRVNUQUJMSVNIX1RFSSwJCSJFc3RhYmxpc2ggVEVJIiB9LAorKwl7IE5NX01UX0VTVEFCTElTSF9URUlfQUNLLAkiRXN0YWJsaXNoIFRFSSBBQ0siIH0sCisrCXsgTk1fTVRfRVNUQUJMSVNIX1RFSV9OQUNLLAkiRXN0YWJsaXNoIFRFSSBOQUNLIiB9LAorKwl7IE5NX01UX0NPTk5fVEVSUl9TSUdOLAkJIkNvbm5lY3QgVGVycmVzdHJpYWwgU2lnbmFsbGluZyIgfSwKKysJeyBOTV9NVF9DT05OX1RFUlJfU0lHTl9BQ0ssCSJDb25uZWN0IFRlcnJlc3RyaWFsIFNpZ25hbGxpbmcgQUNLIiB9LAorKwl7IE5NX01UX0NPTk5fVEVSUl9TSUdOX05BQ0ssCSJDb25uZWN0IFRlcnJlc3RyaWFsIFNpZ25hbGxpbmcgTkFDSyIgfSwKKysJeyBOTV9NVF9ESVNDX1RFUlJfU0lHTiwJCSJEaXNjb25uZWN0IFRlcnJlc3RyaWFsIFNpZ25hbGxpbmciIH0sCisrCXsgTk1fTVRfRElTQ19URVJSX1NJR05fQUNLLAkiRGlzY29ubmVjdCBUZXJyZXN0cmlhbCBTaWduYWxsaW5nIEFDSyIgfSwKKysJeyBOTV9NVF9ESVNDX1RFUlJfU0lHTl9OQUNLLAkiRGlzY29ubmVjdCBUZXJyZXN0cmlhbCBTaWduYWxsaW5nIE5BQ0siIH0sCisrCXsgTk1fTVRfQ09OTl9URVJSX1RSQUYsCQkiQ29ubmVjdCBUZXJyZXN0cmlhbCBUcmFmZmljIiB9LAorKwl7IE5NX01UX0NPTk5fVEVSUl9UUkFGX0FDSywJIkNvbm5lY3QgVGVycmVzdHJpYWwgVHJhZmZpYyBBQ0siIH0sCisrCXsgTk1fTVRfQ09OTl9URVJSX1RSQUZfTkFDSywJIkNvbm5lY3QgVGVycmVzdHJpYWwgVHJhZmZpYyBOQUNLIiB9LAorKwl7IE5NX01UX0RJU0NfVEVSUl9UUkFGLAkJIkRpc2Nvbm5lY3QgVGVycmVzdHJpYWwgVHJhZmZpYyIgfSwKKysJeyBOTV9NVF9ESVNDX1RFUlJfVFJBRl9BQ0ssCSJEaXNjb25uZWN0IFRlcnJlc3RyaWFsIFRyYWZmaWMgQUNLIiB9LAorKwl7IE5NX01UX0RJU0NfVEVSUl9UUkFGX05BQ0ssCSJEaXNjb25uZWN0IFRlcnJlc3RyaWFsIFRyYWZmaWMgTkFDSyIgfSwKKysJeyBOTV9NVF9DT05OX01EUk9QX0xJTkssCSJDb25uZWN0IE11bHRpLURyb3AgTGluayIgfSwKKysJeyBOTV9NVF9DT05OX01EUk9QX0xJTktfQUNLLAkiQ29ubmVjdCBNdWx0aS1Ecm9wIExpbmsgQUNLIiB9LAorKwl7IE5NX01UX0NPTk5fTURST1BfTElOS19OQUNLLAkiQ29ubmVjdCBNdWx0aS1Ecm9wIExpbmsgTkFDSyIgfSwKKysJeyBOTV9NVF9ESVNDX01EUk9QX0xJTkssCSJEaXNjb25uZWN0IE11bHRpLURyb3AgTGluayIgfSwKKysJeyBOTV9NVF9ESVNDX01EUk9QX0xJTktfQUNLLAkiRGlzY29ubmVjdCBNdWx0aS1Ecm9wIExpbmsgQUNLIiB9LAorKwl7IE5NX01UX0RJU0NfTURST1BfTElOS19OQUNLLAkiRGlzY29ubmVjdCBNdWx0aS1Ecm9wIExpbmsgTkFDSyIgfSwKKysJeyBOTV9NVF9TRVRfQlRTX0FUVFIsCQkiU2V0IEJUUyBBdHRyaWJ1dGVzIiB9LAorKwl7IE5NX01UX1NFVF9CVFNfQVRUUl9BQ0ssCSJTZXQgQlRTIEF0dHJpYnV0ZXMgQUNLIiB9LAorKwl7IE5NX01UX1NFVF9CVFNfQVRUUl9OQUNLLAkiU2V0IEJUUyBBdHRyaWJ1dGVzIE5BQ0siIH0sCisrCXsgTk1fTVRfU0VUX1JBRElPX0FUVFIsCQkiU2V0IFJhZGlvIENhcnJpZXIgQXR0cmlidXRlcyIgfSwKKysJeyBOTV9NVF9TRVRfUkFESU9fQVRUUl9BQ0ssCSJTZXQgUmFkaW8gQ2FycmllciBBdHRyaWJ1dGVzIEFDSyIgfSwKKysJeyBOTV9NVF9TRVRfUkFESU9fQVRUUl9OQUNLLAkiU2V0IFJhZGlvIENhcnJpZXIgQXR0cmlidXRlcyBOQUNLIiB9LAorKwl7IE5NX01UX1NFVF9DSEFOX0FUVFIsCQkiU2V0IENoYW5uZWwgQXR0cmlidXRlcyIgfSwKKysJeyBOTV9NVF9TRVRfQ0hBTl9BVFRSX0FDSywJIlNldCBDaGFubmVsIEF0dHJpYnV0ZXMgQUNLIiB9LAorKwl7IE5NX01UX1NFVF9DSEFOX0FUVFJfTkFDSywJIlNldCBDaGFubmVsIEF0dHJpYnV0ZXMgTkFDSyIgfSwKKysJeyBOTV9NVF9QRVJGX1RFU1QsCQkiUGVyZm9ybSBUZXN0IiB9LAorKwl7IE5NX01UX1BFUkZfVEVTVF9BQ0ssCQkiUGVyZm9ybSBUZXN0IEFDSyIgfSwKKysJeyBOTV9NVF9QRVJGX1RFU1RfTkFDSywJCSJQZXJmb3JtIFRlc3QgTkFDSyIgfSwKKysJeyBOTV9NVF9URVNUX1JFUCwJCSJUZXN0IFJlcG9ydCIgfSwKKysJeyBOTV9NVF9TRU5EX1RFU1RfUkVQLAkJIlNlbmQgVGVzdCBSZXBvcnQiIH0sCisrCXsgTk1fTVRfU0VORF9URVNUX1JFUF9BQ0ssCSJTZW5kIFRlc3QgUmVwb3J0IEFDSyIgfSwKKysJeyBOTV9NVF9TRU5EX1RFU1RfUkVQX05BQ0ssCSJTZW5kIFRlc3QgUmVwb3J0IE5BQ0siIH0sCisrCXsgTk1fTVRfU1RPUF9URVNULAkJIlN0b3AgVGVzdCIgfSwKKysJeyBOTV9NVF9TVE9QX1RFU1RfQUNLLAkJIlN0b3AgVGVzdCBBQ0siIH0sCisrCXsgTk1fTVRfU1RPUF9URVNUX05BQ0ssCQkiU3RvcCBUZXN0IE5BQ0siIH0sCisrCXsgTk1fTVRfU1RBVEVDSEdfRVZFTlRfUkVQLAkiU3RhdGUgQ2hhbmdlZCBFdmVudCBSZXBvcnQiIH0sCisrCXsgTk1fTVRfRkFJTFVSRV9FVkVOVF9SRVAsCSJGYWlsdXJlIEV2ZW50IFJlcG9ydCIgfSwKKysJeyBOTV9NVF9TVE9QX0VWRU5UX1JFUCwJCSJTdG9wIFNlbmRpbmcgRXZlbnQgUmVwb3J0cyIgfSwKKysJeyBOTV9NVF9TVE9QX0VWRU5UX1JFUF9BQ0ssCSJTdG9wIFNlbmRpbmcgRXZlbnQgUmVwb3J0cyBBQ0siIH0sCisrCXsgTk1fTVRfU1RPUF9FVkVOVF9SRVBfTkFDSywJIlN0b3AgU2VuZGluZyBFdmVudCBSZXBvcnRzIE5BQ0siIH0sCisrCXsgTk1fTVRfUkVTVF9FVkVOVF9SRVAsCQkiUmVzdGFydCBTZW5kaW5nIEV2ZW50IFJlcG9ydHMiIH0sCisrCXsgTk1fTVRfUkVTVF9FVkVOVF9SRVBfQUNLLAkiUmVzdGFydCBTZW5kaW5nIEV2ZW50IFJlcG9ydHMgQUNLIiB9LAorKwl7IE5NX01UX1JFU1RfRVZFTlRfUkVQX05BQ0ssCSJSZXN0YXJ0IFNlbmRpbmcgRXZlbnQgUmVwb3J0cyBOQUNLIiB9LAorKwl7IE5NX01UX0NIR19BRE1fU1RBVEUsCQkiQ2hhbmdlIEFkbWluaXN0cmF0aXZlIFN0YXRlIiB9LAorKwl7IE5NX01UX0NIR19BRE1fU1RBVEVfQUNLLAkiQ2hhbmdlIEFkbWluaXN0cmF0aXZlIFN0YXRlIEFDSyIgfSwKKysJeyBOTV9NVF9DSEdfQURNX1NUQVRFX05BQ0ssCSJDaGFuZ2UgQWRtaW5pc3RyYXRpdmUgU3RhdGUgTkFDSyIgfSwKKysJeyBOTV9NVF9DSEdfQURNX1NUQVRFX1JFUSwJIkNoYW5nZSBBZG1pbmlzdHJhdGl2ZSBTdGF0ZSBSZXF1ZXN0IiB9LAorKwl7IE5NX01UX0NIR19BRE1fU1RBVEVfUkVRX0FDSywJIkNoYW5nZSBBZG1pbmlzdHJhdGl2ZSBTdGF0ZSBSZXF1ZXN0IEFDSyIgfSwKKysJeyBOTV9NVF9DSEdfQURNX1NUQVRFX1JFUV9OQUNLLAkiQ2hhbmdlIEFkbWluaXN0cmF0aXZlIFN0YXRlIFJlcXVlc3QgTkFDSyIgfSwKKysJeyBOTV9NVF9SRVBfT1VUU1RfQUxBUk1TLAkiUmVwb3J0IE91dHN0YW5kaW5nIEFsYXJtcyIgfSwKKysJeyBOTV9NVF9SRVBfT1VUU1RfQUxBUk1TX0FDSywJIlJlcG9ydCBPdXRzdGFuZGluZyBBbGFybXMgQUNLIiB9LAorKwl7IE5NX01UX1JFUF9PVVRTVF9BTEFSTVNfTkFDSywJIlJlcG9ydCBPdXRzdGFuZGluZyBBbGFybXMgTkFDSyIgfSwKKysJeyBOTV9NVF9DSEFOR0VPVkVSLAkJIkNoYW5nZW92ZXIiIH0sCisrCXsgTk1fTVRfQ0hBTkdFT1ZFUl9BQ0ssCQkiQ2hhbmdlb3ZlciBBQ0siIH0sCisrCXsgTk1fTVRfQ0hBTkdFT1ZFUl9OQUNLLAkiQ2hhbmdlb3ZlciBOQUNLIiB9LAorKwl7IE5NX01UX09QU1RBUlQsCQkiT3BzdGFydCIgfSwKKysJeyBOTV9NVF9PUFNUQVJUX0FDSywJCSJPcHN0YXJ0IEFDSyIgfSwKKysJeyBOTV9NVF9PUFNUQVJUX05BQ0ssCQkiT3BzdGFydCBOQUNLIiB9LAorKwl7IE5NX01UX1JFSU5JVCwJCQkiUmVpbml0aWFsaXplIiB9LAorKwl7IE5NX01UX1JFSU5JVF9BQ0ssCQkiUmVpbml0aWFsaXplIEFDSyIgfSwKKysJeyBOTV9NVF9SRUlOSVRfTkFDSywJCSJSZWluaXRpYWxpemUgTkFDSyIgfSwKKysJeyBOTV9NVF9TRVRfU0lURV9PVVQsCQkiU2V0IFNpdGUgT3V0cHV0cyIgfSwKKysJeyBOTV9NVF9TRVRfU0lURV9PVVRfQUNLLAkiU2V0IFNpdGUgT3V0cHV0cyBBQ0siIH0sCisrCXsgTk1fTVRfU0VUX1NJVEVfT1VUX05BQ0ssCSJTZXQgU2l0ZSBPdXRwdXRzIE5BQ0siIH0sCisrCXsgTk1fTVRfQ0hHX0hXX0NPTkYsCQkiQ2hhbmdlIEhXIENvbmZpZ3VyYXRpb24iIH0sCisrCXsgTk1fTVRfQ0hHX0hXX0NPTkZfQUNLLAkiQ2hhbmdlIEhXIENvbmZpZ3VyYXRpb24gQUNLIiB9LAorKwl7IE5NX01UX0NIR19IV19DT05GX05BQ0ssCSJDaGFuZ2UgSFcgQ29uZmlndXJhdGlvbiBOQUNLIiB9LAorKwl7IE5NX01UX01FQVNfUkVTX1JFUSwJCSJNZWFzdXJlbWVudCBSZXN1bHQgUmVxdWVzdCIgfSwKKysJeyBOTV9NVF9NRUFTX1JFU19SRVNQLAkJIk1lYXN1cmVtZW50IFJlc3VsdCBSZXNwb25zZSIgfSwKKysJeyBOTV9NVF9TVE9QX01FQVMsCQkiU3RvcCBNZWFzdXJlbWVudCIgfSwKKysJeyBOTV9NVF9TVEFSVF9NRUFTLAkJIlN0YXJ0IE1lYXN1cmVtZW50IiB9LAorKwl7IE5NX01UX0dFVF9BVFRSLAkJIkdldCBBdHRyaWJ1dGVzIiB9LAorKwl7IE5NX01UX0dFVF9BVFRSX1JFU1AsCQkiR2V0IEF0dHJpYnV0ZXMgUmVzcG9uc2UiIH0sCisrCXsgTk1fTVRfR0VUX0FUVFJfTkFDSywJCSJHZXQgQXR0cmlidXRlcyBOQUNLIiB9LAorKwl7IE5NX01UX1NFVF9BTEFSTV9USFJFUywJIlNldCBBbGFybSBUaHJlc2hvbGQiIH0sCisrCXsgTk1fTVRfU0VUX0FMQVJNX1RIUkVTX0FDSywJIlNldCBBbGFybSBUaHJlc2hvbGQgQUNLIiB9LAorKwl7IE5NX01UX1NFVF9BTEFSTV9USFJFU19OQUNLLAkiU2V0IEFsYXJtIFRocmVzaG9sZCBOQUNLIiB9LAorKwkvKiBwcm9wcmlldGFyeSwgbm90IGluIHRoZSBzdGFuZGFyZCAqLworKwl7IE5NX01UX0lQQUNDX1JFU1RBUlQsCQkiSVBBIFJlc3RhcnQiIH0sCisrCXsgTk1fTVRfSVBBQ0NfUkVTVEFSVF9BQ0ssCSJJUEEgUmVzdGFydCBBQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfUlNMX0NPTk5FQ1QsCSJJUEEgUlNMIENvbm5lY3QiIH0sCisrCXsgTk1fTVRfSVBBQ0NfUlNMX0NPTk5FQ1RfQUNLLAkiSVBBIFJTTCBDb25uZWN0IEFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVF9OQUNLLAkiSVBBIFJTTCBDb25uZWN0IE5BQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfUlNMX0RJU0NPTk5FQ1QsCSJJUEEgUlNMIERpc2Nvbm5lY3QiIH0sCisrCXsgTk1fTVRfSVBBQ0NfUlNMX0RJU0NPTk5FQ1RfQUNLLCAiSVBBIFJTTCBEaXNjb25uZWN0IEFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19SU0xfRElTQ09OTkVDVF9OQUNLLCAiSVBBIFJTTCBEaXNjb25uZWN0IE5BQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfQ09OTl9UUkFGLAkiSVBBIENvbm5lY3QgVHJhZmZpYyIgfSwKKysJeyBOTV9NVF9JUEFDQ19DT05OX1RSQUZfQUNLLAkiSVBBIENvbm5lY3QgVHJhZmZpYyBBQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfQ09OTl9UUkFGX05BQ0ssCSJJUEEgQ29ubmVjdCBUcmFmZmljIE5BQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfRElTQ19UUkFGLAkiSVBBIERpc2Nvbm5lY3QgVHJhZmZpYyIgfSwKKysJeyBOTV9NVF9JUEFDQ19ESVNDX1RSQUZfQUNLLAkiSVBBIERpc2Nvbm5lY3QgVHJhZmZpYyBBQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfRElTQ19UUkFGX05BQ0ssCSJJUEEgRGlzY29ubmVjdCBUcmFmZmljIE5BQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfREVGX0JPT1RfU1csCSJJUEEgRGVmYXVsdCBCb290IFNvZnR3YXJlIiB9LAorKwl7IE5NX01UX0lQQUNDX0RFRl9CT09UX1NXX0FDSywJIklQQSBEZWZhdWx0IEJvb3QgU29mdHdhcmUgQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX0RFRl9CT09UX1NXX05BQ0ssCSJJUEEgRGVmYXVsdCBCb290IFNvZnR3YXJlIE5BQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfU0VUX05WQVRUUiwJIklQQSBTZXQgTlZSQU0gQXR0cmlidXRlcyIgfSwKKysJeyBOTV9NVF9JUEFDQ19TRVRfTlZBVFRSX0FDSywJIklQQSBTZXQgTlZSQU0gQXR0cmlidXRlcyBBQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfU0VUX05WQVRUUl9OQUNLLAkiSVBBIFNldCBOVlJBTSBBdHRyaWJ1dGVzIE5BQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfR0VUX05WQVRUUiwJIklQQSBHZXQgTlZSQU0gQXR0cmlidXRlcyIgfSwKKysJeyBOTV9NVF9JUEFDQ19HRVRfTlZBVFRSX0FDSywJIklQQSBHZXQgTlZSQU0gQXR0cmlidXRlcyBBQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfR0VUX05WQVRUUl9OQUNLLAkiSVBBIEdldCBOVlJBTSBBdHRyaWJ1dGVzIE5BQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfU0VUX0FUVFIsCQkiSVBBIFNldCBBdHRyaWJ1dGVzIiB9LAorKwl7IE5NX01UX0lQQUNDX1NFVF9BVFRSX0FDSywJIklQQSBTZXQgQXR0cmlidXRlcyBBQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfU0VUX0FUVFJfTkFDSywJIklQQSBTZXQgQXR0cmlidXRlcyBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX0FUVFJfQ0hHX0VWVCwJIklQQSBBdHRyaWJ1dGUgQ2hhbmdlIEV2ZW50IiB9LAorKwl7IE5NX01UX0lQQUNDX1NXX0RFQUNULAkJIklQQSBTb2Z0d2FyZSBEZWFjdGl2YXRlIiB9LAorKwl7IE5NX01UX0lQQUNDX1NXX0RFQUNUX0FDSywJIklQQSBTb2Z0d2FyZSBEZWFjdGl2YXRlIEFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19TV19ERUFDVF9OQUNLLAkiSVBBIFNvZnR3YXJlIERlYWN0aXZhdGUgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19NRUFTX1JFU19SRVFfTkFDSywiSVBBIE1lYXN1cmVtZW50IFJlc3VsdCBSZXF1ZXN0IE5BQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfU1RBUlRfTUVBU19OQUNLLAkiSVBBIFN0YXJ0IE1lYXN1cmVtZW50IE5BQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfU1RPUF9NRUFTX05BQ0ssCSJJUEEgU3RvcCBNZWFzdXJlbWVudCBOQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfUkVTRVRfUkVTT1VSQ0UsCSJTSUUgUmVzZXQgUmVzb3VyY2UiIH0sCisrCXsgTk1fTVRfQlMxMV9CRUdJTl9EQl9UWCwJIlNJRSBCZWdpbiBEYXRhYmFzZSBUcmFuc21pc3Npb24iIH0sCisrCXsgTk1fTVRfQlMxMV9CRUdJTl9EQl9UWF9BQ0ssCSJTSUUgQmVnaW4gRGF0YWJhc2UgVHJhbnNtaXNzaW9uIEFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0JFR0lOX0RCX1RYX05BQ0ssCSJTSUUgQmVnaW4gRGF0YWJhc2UgVHJhbnNtaXNzaW9uIE5BQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9FTkRfREJfVFgsCQkiU0lFIEVuZCBEYXRhYmFzZSBUcmFuc21pc3Npb24iIH0sCisrCXsgTk1fTVRfQlMxMV9FTkRfREJfVFhfQUNLLAkiU0lFIEVuZCBEYXRhYmFzZSBUcmFuc21pc3Npb24gQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfRU5EX0RCX1RYX05BQ0ssCSJTSUUgRW5kIERhdGFiYXNlIFRyYW5zbWlzc2lvbiBOQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfQ1JFQVRFX09CSiwJIlNJRSBDcmVhdGUgT2JqZWN0IiB9LAorKwl7IE5NX01UX0JTMTFfQ1JFQVRFX09CSl9BQ0ssCSJTSUUgQ3JlYXRlIE9iamVjdCBBQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9DUkVBVEVfT0JKX05BQ0ssCSJTSUUgQ3JlYXRlIE9iamVjdCBOQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfREVMRVRFX09CSiwJIlNJRSBEZWxldGUgT2JqZWN0IiB9LAorKwl7IE5NX01UX0JTMTFfREVMRVRFX09CSl9BQ0ssCSJTSUUgRGVsZXRlIE9iamVjdCBBQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9ERUxFVEVfT0JKX05BQ0ssCSJTSUUgRGVsZXRlIE9iamVjdCBOQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfR0VUX1NUQVRFLAkJIlNJRSBHZXQgU3RhdGUiIH0sCisrCXsgTk1fTVRfQlMxMV9HRVRfU1RBVEVfQUNLLAkiU0lFIEdldCBTdGF0ZSBBQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9MTVRfTE9HT04sCQkiU0lFIExNVCBMb2dvbiIgfSwKKysJeyBOTV9NVF9CUzExX0xNVF9MT0dPTl9BQ0ssCSJTSUUgTE1UIExvZ29uIEFDSyIgfSwKKysJeyBOTV9NVF9CUzExX1JFU1RBUlQsCQkiU0lFIFJlc3RhcnQiIH0sCisrCXsgTk1fTVRfQlMxMV9SRVNUQVJUX0FDSywJIlNJRSBSZXN0YXJ0IEFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0RJU0NPTk5FQ1QsCSJTSUUgRGlzY29ubmVjdCBCVFMiIH0sCisrCXsgTk1fTVRfQlMxMV9ESVNDT05ORUNUX0FDSywJIlNJRSBEaXNjb25uZWN0IEJUUyBBQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9MTVRfTE9HT0ZGLAkiU0lFIExNVCBMb2dvZmYiIH0sCisrCXsgTk1fTVRfQlMxMV9MTVRfTE9HT0ZGX0FDSywJIlNJRSBMTVQgTG9nb2ZmIEFDSyIgfSwKKysJeyBOTV9NVF9CUzExX1JFQ09OTkVDVCwJCSJTSUUgUmVjb25uZWN0IEJUUyIgfSwKKysJeyBOTV9NVF9CUzExX1JFQ09OTkVDVF9BQ0ssCSJTSUUgUmVjb25uZWN0IEJUUyBBQ0siIH0sCisrfTsKKysKKysvKiBUUyAxMi4yMSBTZWN0aW9uIDkuMjogT2JqZWN0IENsYXNzICovCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfZm9tX29iamNsYXNzX3ZhbHNbXSA9IHsKKysJeyBOTV9PQ19TSVRFX01BTkFHRVIsCQkiQlRTIFNpdGUgTWFuYWdlciIgfSwKKysJeyBOTV9PQ19CVFMsCQkJIkJUUyIgfSwKKysJeyBOTV9PQ19SQURJT19DQVJSSUVSLAkJIlJhZGlvIENhcnJpZXIiIH0sCisrCXsgTk1fT0NfQ0hBTk5FTCwJCSJSYWRpbyBDaGFubmVsIiB9LAorKwl7IE5NX09DX0JBU0VCX1RSQU5TQywJCSJCYXNlYmFuZCBUcmFuc2NlaXZlciIgfSwKKysJLyogcHJvcHJpZXRhcnksIHZlbmRvciBzcGVjaWZpYyAqLworKwl7IE5NX09DX0JTMTFfQURKQywJCSJTSUUgQWRqYWNlbmQgQ2hhbm5lbCIgfSwKKysJeyBOTV9PQ19CUzExX0hBTkRPVkVSLAkJIlNJRSBIYW5kb3ZlciIgfSwKKysJeyBOTV9PQ19CUzExX1BXUl9DVFJMLAkJIlNJRSBQb3dlciBDb250cm9sIiB9LAorKwl7IE5NX09DX0JTMTFfQlRTRSwJCSJTSUUgQlRTRSIgfSwKKysJeyBOTV9PQ19CUzExX1JBQ0ssCQkiU0lFIFJhY2siIH0sCisrCXsgTk1fT0NfQlMxMSwJCQkiU0lFIFNpZW1lbnNIVyIgfSwKKysJeyBOTV9PQ19CUzExX1RFU1QsCQkiU0lFIFRlc3QiIH0sCisrCXsgTk1fT0NfQlMxMV9FTlZBQlRTRSwJCSJTSUUgRW52YUJUU0UiIH0sCisrCXsgTk1fT0NfQlMxMV9CUE9SVCwJCSJTSUUgQlBvcnQiIH0sCisrCXsgTk1fT0NfR1BSU19OU0UsCQkiR1BSUyBOU0UiIH0sCisrCXsgTk1fT0NfR1BSU19DRUxMLAkJIkdQUlMgQ2VsbCIgfSwKKysJeyBOTV9PQ19HUFJTX05TVkMwLAkJIkdQUlMgTlNWQzAiIH0sCisrCXsgTk1fT0NfR1BSU19OU1ZDMSwJCSJHUFJTIE5TVkMxIiB9LAorKwl7IE5NX09DX05VTEwsCQkJIk5VTEwiIH0sCisrfTsKKysKKysvKiBUUyAxMi4yMSBTZWN0aW9uIDkuNDogQXR0cmlidXRlcyAqLworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX2ZvbV9hdHRyX3ZhbHNbXSA9IHsKKysJeyBOTV9BVFRfQUJJU19DSEFOTkVMLAkJIkEtYmlzIENoYW5uZWwiIH0sCisrCXsgTk1fQVRUX0FERF9JTkZPLAkJIkFkZGl0aW9uYWwgSW5mb3JtYXRpb24iIH0sCisrCXsgTk1fQVRUX0FERF9URVhULAkJIkFkZGl0aW9uYWwgVGV4dCIgfSwKKysJeyBOTV9BVFRfQURNX1NUQVRFLAkJIkFkbWluaXN0cmF0aXZlIFN0YXRlIiB9LAorKwl7IE5NX0FUVF9BUkZDTl9MSVNULAkJIkFSRkNOIExpc3QiIH0sCisrCXsgTk1fQVRUX0FVVE9OX1JFUE9SVCwJCSJBdXRvbm9tb3VzbHkgUmVwb3J0IiB9LAorKwl7IE5NX0FUVF9BVkFJTF9TVEFUVVMsCQkiQXZhaWxhYmlsaXR5IFN0YXR1cyIgfSwKKysJeyBOTV9BVFRfQkNDSF9BUkZDTiwJCSJCQ0NIIEFSRkNOIiB9LAorKwl7IE5NX0FUVF9CU0lDLAkJCSJCU0lDIiB9LAorKwl7IE5NX0FUVF9CVFNfQUlSX1RJTUVSLAkJIkJUUyBBaXIgVGltZXIiIH0sCisrCXsgTk1fQVRUX0NDQ0hfTF9JX1AsCQkiQ0NDSCBMb2FkIEluZGljYXRpb24gUGVyaW9kIiB9LAorKwl7IE5NX0FUVF9DQ0NIX0xfVCwJCSJDQ0NIIExvYWQgVGhyZXNob2xkIiB9LAorKwl7IE5NX0FUVF9DSEFOX0NPTUIsCQkiQ2hhbm5lbCBDb21iaW5hdGlvbiIgfSwKKysJeyBOTV9BVFRfQ09OTl9GQUlMX0NSSVQsCSJDb25uZWN0aW9uIEZhaWwgQ3JpdGVyaW9uIiB9LAorKwl7IE5NX0FUVF9ERVNULAkJCSJEZXN0aW5hdGlvbiIgfSwKKysJeyBOTV9BVFRfRVZFTlRfVFlQRSwJCSJFdmVudCBUeXBlIiB9LAorKwl7IE5NX0FUVF9GSUxFX0lELAkJIkZpbGUgSUQiIH0sCisrCXsgTk1fQVRUX0ZJTEVfVkVSU0lPTiwJCSJGaWxlIFZlcnNpb24iIH0sCisrCXsgTk1fQVRUX0dTTV9USU1FLAkJIkdTTSBUaW1lIiB9LAorKwl7IE5NX0FUVF9IU04sCQkJIkhTTiIgfSwKKysJeyBOTV9BVFRfSFdfQ09ORklHLAkJIkhXIENvbmZpZ3VyYXRpb24iIH0sCisrCXsgTk1fQVRUX0hXX0RFU0MsCQkiSFcgRGVzY3JpcHRpb24iIH0sCisrCXsgTk1fQVRUX0lOVEFWRV9QQVJBTSwJCSJJbnRhdmUgUGFyYW1ldGVyIiB9LAorKwl7IE5NX0FUVF9JTlRFUkZfQk9VTkQsCQkiSW50ZXJmZXJlbmNlIEJvdW5kYXJpZXMiIH0sCisrCXsgTk1fQVRUX0xJU1RfUkVRX0FUVFIsCQkiTGlzdCBvZiByZXF1aXJlZCBBdHRyaWJ1dGVzIiB9LAorKwl7IE5NX0FUVF9NQUlPLAkJCSJNQUlPIiB9LAorKwl7IE5NX0FUVF9NQU5VRl9TVEFURSwJCSJNYW51ZmFjdHVyZXIgRGVwZW5kZW50IFN0YXRlIiB9LAorKwl7IE5NX0FUVF9NQU5VRl9USFJFU0gsCQkiTWFudWZhY3R1cmVyIERlcGVuZGVudCBUaHJlc2hvbGRzIiB9LAorKwl7IE5NX0FUVF9NQU5VRl9JRCwJCSJNYW51ZmFjdHVyZXIgSWQiIH0sCisrCXsgTk1fQVRUX01BWF9UQSwJCSJNYXhpbXVtIFRpbWluZyBBZHZhbmNlIiB9LAorKwl7IE5NX0FUVF9NRFJPUF9MSU5LLAkJIk11bHRpLWRyb3AgQlNDIExpbmsiIH0sCisrCXsgTk1fQVRUX01EUk9QX05FWFQsCQkiTXVsdGktZHJvcCBuZXh0IEJUUyBMaW5rIiB9LAorKwl7IE5NX0FUVF9OQUNLX0NBVVNFUywJCSJOQUNLIENhdXNlcyIgfSwKKysJeyBOTV9BVFRfTlkxLAkJCSJOeTEiIH0sCisrCXsgTk1fQVRUX09QRVJfU1RBVEUsCQkiT3BlcmF0aW9uYWwgU3RhdGUiIH0sCisrCXsgTk1fQVRUX09WRVJMX1BFUklPRCwJCSJPdmVybG9hZCBQZXJpb2QiIH0sCisrCXsgTk1fQVRUX1BIWVNfQ09ORiwJCSJQaHlzaWNhbCBDb25maWciIH0sCisrCXsgTk1fQVRUX1BPV0VSX0NMQVNTLAkJIlBvd2VyIENsYXNzIiB9LAorKwl7IE5NX0FUVF9QT1dFUl9USFJFU0gsCQkiUG93ZXIgT3V0cHV0IFRocmVzaG9sZHMiIH0sCisrCXsgTk1fQVRUX1BST0JfQ0FVU0UsCQkiUHJvYmFibGUgQ2F1c2UiIH0sCisrCXsgTk1fQVRUX1JBQ0hfQl9USFJFU0gsCQkiUkFDSCBCdXN5IFRocmVzaG9sZCIgfSwKKysJeyBOTV9BVFRfTERBVkdfU0xPVFMsCQkiUkFDSCBMb2FkIEF2ZXJhZ2luZyBTbG90cyIgfSwKKysJeyBOTV9BVFRfUkFEX1NVQkMsCQkiUmFkaW8gU3ViIENoYW5uZWwiIH0sCisrCXsgTk1fQVRUX1JGX01BWFBPV1JfUiwJCSJSRiBNYXggUG93ZXIgUmVkdWN0aW9uIiB9LAorKwl7IE5NX0FUVF9TSVRFX0lOUFVUUywJCSJTaXRlIElucHV0cyIgfSwKKysJeyBOTV9BVFRfU0lURV9PVVRQVVRTLAkJIlNpdGUgT3V0cHV0cyIgfSwKKysJeyBOTV9BVFRfU09VUkNFLAkJIlNvdXJjZSIgfSwKKysJeyBOTV9BVFRfU1BFQ19QUk9CLAkJIlNwZWNpZmljIFByb2JsZW1zIiB9LAorKwl7IE5NX0FUVF9TVEFSVF9USU1FLAkJIlN0YXJ0aW5nIFRpbWUiIH0sCisrCXsgTk1fQVRUX1QyMDAsCQkJIlQyMDAiIH0sCisrCXsgTk1fQVRUX1RFSSwJCQkiVEVJIiB9LAorKwl7IE5NX0FUVF9URVNUX0RVUiwJCSJUZXN0IER1cmF0aW9uIiB9LAorKwl7IE5NX0FUVF9URVNUX05PLAkJIlRlc3QgTm8iIH0sCisrCXsgTk1fQVRUX1RFU1RfUkVQT1JULAkJIlRlc3QgUmVwb3J0IEluZm8iIH0sCisrCXsgTk1fQVRUX1ZTV1JfVEhSRVNILAkJIlZTV1IgVGhyZXNob2xkcyAiIH0sCisrCXsgTk1fQVRUX1dJTkRPV19TSVpFLAkJIldpbmRvdyBTaXplIiB9LAorKwl7IE5NX0FUVF9CUzExX1JTU0lfT0ZGUywJIlNJRSBSU1NJIE9mZnNldCIgfSwKKysJeyBOTV9BVFRfQlMxMV9UWFBXUiwJCSJTSUUgVFggUG93ZXIiIH0sCisrCXsgTk1fQVRUX0JTMTFfRElWRVJTSVRZLAkiU0lFIERpdmVyc2l0eSIgfSwKKysJeyBOTV9BVFRfVFNDLAkJCSJUcmFpbmluZyBTZXF1ZW5jZSBDb2RlIiB9LAorKwl7IE5NX0FUVF9TV19DT05GSUcsCQkiU1cgQ29uZmlndXJhdGlvbiIgfSwKKysJeyBOTV9BVFRfU1dfREVTQ1IsCQkiU1cgRGVzY3JpcHRpb24iIH0sCisrCXsgTk1fQVRUX1NFVkVSSVRZLAkJIlBlcmNlaXZlZCBTZXZlcml0eSIgfSwKKysJeyBOTV9BVFRfR0VUX0FSSSwJCSJHZXQgQVJJIiB9LAorKwl7IE5NX0FUVF9IV19DT05GX0NIRywJCSJIVyBDb25maWd1cmF0aW9uIENoYW5nZSIgfSwKKysJeyBOTV9BVFRfT1VUU1RfQUxBUk0sCQkiT3V0c3RhbmRpbmcgQWxhcm0iIH0sCisrCXsgTk1fQVRUX0ZJTEVfREFUQSwJCSJGaWxlIERhdGEiIH0sCisrCXsgTk1fQVRUX01FQVNfUkVTLAkJIk1lYXN1cmVtZW50IFJlc3VsdCIgfSwKKysJeyBOTV9BVFRfTUVBU19UWVBFLAkJIk1lYXN1cmVtZW50IFR5cGUiIH0sCisrCXsgTk1fQVRUX0JTMTFfRVNOX0ZXX0NPREVfTk8sCSJTSUUgRVNOIEZXIENvZGUgTnVtYmVyIiB9LAorKwl7IE5NX0FUVF9CUzExX0VTTl9IV19DT0RFX05PLAkiU0lFIEVTTiBIVyBDb2RlIE51bWJlciIgfSwKKysJeyBOTV9BVFRfQlMxMV9FU05fUENCX1NFUklBTCwJIlNJRSBFU04gUENCIFNlcmlhbCBOdW1iZXIiIH0sCisrCXsgTk1fQVRUX0JTMTFfRVhDRVNTSVZFX0RJU1RBTkNFLCAiU0lFIEV4Y2Vzc2l2ZSBEaXN0YW5jZSIgfSwKKysJeyBOTV9BVFRfQlMxMV9BTExfVEVTVF9DQVRHLAkiU0lFIEFsbCBUZXN0IENhdGVnb3JpZXMiIH0sCisrCXsgTk1fQVRUX0JTMTFfQlRTTFNfSE9QUElORywJIlNJRSBCVFMgTFMgSG9wcGluZyIgfSwKKysJeyBOTV9BVFRfQlMxMV9DRUxMX0FMTE9DX05SLAkiU0lFIENlbGwgQWxsb2NhdGlvbiBOdW1iZXIiIH0sCisrCXsgTk1fQVRUX0JTMTFfQ0VMTF9HTE9CQUxfSUQsCSJTSUUgQ2VsbCBHbG9iYWwgSUQiIH0sCisrCXsgTk1fQVRUX0JTMTFfRU5BX0lOVEVSRl9DTEFTUywJIlNJRSBFbmFibGUgSW50ZXJmZXJlbmNlIENsYXNzIiB9LAorKwkvKiBGSVhNRSAqLworKwl7IE5NX0FUVF9CUzExX0VOQV9NU19QV1JfQ1RSTCwJIlNJRSBFbmFibGUgTVMgUG93ZXIgQ29udHJvbCIgfSwKKysJeyBOTV9BVFRfQlMxMV9FTkFfUFdSX0JER1RfSE8sCSJTSUUgRW5hYmxlIFBvd2VyIEJ1ZGdldCBITyIgfSwKKysJeyBOTV9BVFRfQlMxMV9FTkFfUlhMRVZfSE8sCSJTSUUgRW5hYmxlIFJ4TGV2ZWwgSE8iIH0sCisrCXsgTk1fQVRUX0JTMTFfRU5BX1JYUVVBTF9ITywJIlNJRSBFbmFibGUgUnhRdWFsIEhPIiB9LAorKwl7IE5NX0FUVF9CUzExX0ZBQ0NIX1FVQUwsCSJTSUUgRkFDQ0ggUXVhbGl0eSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfRFNUX0lQLAkJIklQQSBEZXN0aW5hdGlvbiBJUCBBZGRyZXNzIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19EU1RfSVBfUE9SVCwJIklQQSBEZXN0aW9uYXRpb24gSVAgUG9ydCIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfU1NSQywJCSJJUEEgUlRQIFNTUkMiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1JUUF9QQVlMRF9UWVBFLAkiSVBBIFJUUCBQYXlsb2FkIFR5cGUiIH0sCisrCXsgTk1fQVRUX0lQQUNDX0JBU0VCX0lELAkiSVBBIEJhc2ViYW5kIElkZW50aWZpZXIiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1NUUkVBTV9JRCwJIklQQSBTdHJlYW0gSWRlbnRpZmllciIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfTlZfRkxBR1MsCSJJUEEgTlZSQU0gRmxhZ3MiIH0sCisrCXsgTk1fQVRUX0lQQUNDX0ZSRVFfQ1RSTCwJIklQQSBGcmVxdWVuY3kgQ29udHJvbCIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfUFJJTV9PTUxfQ0ZHLAkiSVBBIFByaW1hcnkgT01MIENvbmZpZyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfU0VDX09NTF9DRkcsCSJJUEEgU2Vjb25kYXJ5IE9NTCBDb25maWciIH0sCisrCXsgTk1fQVRUX0lQQUNDX0lQX0lGX0NGRywJIklQQSBJUCBJbnRlcmZhY2UgQ29uZmlnIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19JUF9HV19DRkcsCSJJUEEgSVAgR2F0ZXdheSBDb25maWciIH0sCisrCXsgTk1fQVRUX0lQQUNDX0lOX1NFUlZfVElNRSwJIklQQSBJbiBTZXJ2aWNlIFRpbWUiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1RSWF9CVFNfQVNTLAkiSVBBIFRSWCBCVFMgQXNzaWdubWVudCIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfTE9DQVRJT04sCSJJUEEgQlRTIExvY2F0aW9uIE5hbWUiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1BBR0lOR19DRkcsCSJJUEEgUGFnaW5nIENvbmZpZ3VyYXRpb24iIH0sCisrCXsgTk1fQVRUX0lQQUNDX0ZJTEVfREFUQSwJIklQQSBGaWxlIERhdGEiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1VOSVRfSUQsCQkiSVBBIFVuaXQgSUQiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1BBUkVOVF9VTklUX0lELAkiSVBBIFBhcmVudCBVbml0IElEIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19VTklUX05BTUUsCSJJUEEgVW5pdCBOYW1lIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19TTk1QX0NGRywJIklQQSBTTk1QIENvbmZpZyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfUFJJTV9PTUxfQ0ZHX0xJU1QsICJJUEEgUHJpbWFyeSBPTUwgQ29uZmlnIExpc3QiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1BSSU1fT01MX0ZCX1RPVVQsIklQQSBQcmltYXJ5IE9NTCBGYWxsYmFjayBUaW1lb3V0IiB9LAorKwl7IE5NX0FUVF9JUEFDQ19DVVJfU1dfQ0ZHLAkiSVBBIEN1cnJlbnQgU29mdHdhcmUgQ29uZmlnIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19USU1JTkdfQlVTLAkiSVBBIFRpbWluZyBCdXMiIH0sCisrCXsgTk1fQVRUX0lQQUNDX0NHSSwJCSJJUEEgQ0dJIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19SQUMsCQkiSVBBIFJBQyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfT0JKX1ZFUlNJT04sCSJJUEEgT2JqZWN0IFZlcnNpb24iIH0sCisrCXsgTk1fQVRUX0lQQUNDX0dQUlNfUEFHSU5HX0NGRywJIklQQSBHUFJTIFBhZ2luZyBDb25maWd1cmF0aW9uIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19OU0VJLAkJIklQQSBOU0VJIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19CVkNJLAkJIklQQSBCVkNJIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19OU1ZDSSwJCSJJUEEgTlNWQ0kiIH0sCisrCXsgTk1fQVRUX0lQQUNDX05TX0NGRywJCSJJUEEgTlMgQ29uZmlndXJhdGlvbiIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfQlNTR1BfQ0ZHLAkiSVBBIEJTU0dQIENvbmZpZ3VyYXRpb24iIH0sCisrCXsgTk1fQVRUX0lQQUNDX05TX0xJTktfQ0ZHLAkiSVBBIE5TIExpbmsgQ29uZmlndXJhdGlvbiIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfUkxDX0NGRywJCSJJUEEgUkxDIENvbmZpZ3VyYXRpb24iIH0sCisrCXsgTk1fQVRUX0lQQUNDX0FMTV9USFJFU0hfTElTVCwJIklQQSBBbGFybSBUaHJlc2hvbGQgTGlzdCIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfTU9OSVRfVkFMX0xJU1QsCSJJUEEgTW9uaXRvcmVkIFZhbHVlIExpc3QiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1RJQl9DT05UUk9MLAkiSVBBIFRpbWluZyBJbnRlcmZhY2UgQnVzIENvbnRyb2wiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1NVUFBfRkVBVFVSRVMsCSJJUEEgU3VwcG9ydGVkIEZlYXR1cmVzIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19DT0RJTkdfU0NIRU1FUywJIklQQSBDb2RpbmcgU2NoZW1lcyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfUkxDX0NGR18yLAkiSVBBIFJMQyBDb25maWd1cmF0aW9uIDIiIH0sCisrCXsgTk1fQVRUX0lQQUNDX0hFQVJUQl9UT1VULAkiSVBBIEhlYXJ0YmVhdCBUaW1lb3V0IiB9LAorKwl7IE5NX0FUVF9JUEFDQ19VUFRJTUUsCQkiSVBBIFVwdGltZSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfUkxDX0NGR18zLAkiSVBBIFJMQyBDb25maWd1cmF0aW9uIDMiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1NTTF9DRkcsCQkiSVBBIFNTTCBDb25maWd1cmF0aW9uIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19TRUNfUE9TU0lCTEUsCSJJUEEgU2VjdXJpdHkgUG9zc2libGUiIH0sCisrCXsgTk1fQVRUX0lQQUNDX0lNTF9TU0xfU1RBVEUsCSJJUEEgSU1MIFNTTCBTdGF0ZSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfUkVWT0NfREFURSwJIklQQSBSZXZvY2F0aW9uIERhdGUiIH0sCisrCS8qIEZJWE1FOiBNb3JlIFNJRSAqLworK307CisrCisrLyogU2VjdGlvbiA5LjQuNDogQWRtaW5pc3RyYXRpdmUgU3RhdGUgKi8KKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9hZG1fc3RhdGVfdmFsc1tdID0geworKwl7IE5NX1NUQVRFX0xPQ0tFRCwJCSJMb2NrZWQiIH0sCisrCXsgTk1fU1RBVEVfVU5MT0NLRUQsCQkiVW5sb2NrZWQiIH0sCisrCXsgTk1fU1RBVEVfU0hVVERPV04sCQkiU2h1dGRvd24iIH0sCisrCXsgTk1fU1RBVEVfTlVMTCwJCSJOdWxsIiB9LAorK307CisrCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfb3Blcl9zdGF0ZV92YWxzW10gPSB7CisrCXsgMSwJIkRpc2FibGVkIiB9LAorKwl7IDIsCSJFbmFibGVkIiB9LAorKwl7IDB4ZmYsCSJOVUxMIiB9LAorK307CisrCisrLyogU2VjdGlvbiA5LjQuNyBBdmFpbGFiaWxpdHkgU3RhdHVzICovCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfYXZhaWxfc3RhdGVfdmFsc1tdID0geworKwl7IDAsCSJJbiB0ZXN0IiB9LAorKwl7IDEsCSJGYWlsZWQiIH0sCisrCXsgMiwJIlBvd2VyIG9mZiIgfSwKKysJeyAzLAkiT2ZmIGxpbmUiIH0sCisrCXsgNSwJIkRlcGVuZGVuY3kiIH0sCisrCXsgNiwJIkRlZ3JhZGVkIiB9LAorKwl7IDcsIAkiTm90IGluc3RhbGxlZCIgfSwKKysJeyAweGZmLAkiT0siIH0sCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNC4xMzogQ2hhbm5lbCBDb21iaW5hdGlvbiAqLworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX2NoYW5fY29tYl92YWxzW10gPSB7CisrCXsgTk1fQ0hBTkNfVENIRnVsbCwJCSJUQ0gvRiIgfSwKKysJeyBOTV9DSEFOQ19UQ0hIYWxmLAkJIlRDSC9IIiB9LAorKwl7IE5NX0NIQU5DX1RDSEhhbGYyLAkJIlRDSC9IIDIiIH0sCisrCXsgTk1fQ0hBTkNfU0RDQ0gsCQkiU0RDQ0giIH0sCisrCXsgTk1fQ0hBTkNfbWFpbkJDQ0gsCQkiTWFpbiBCQ0NIIiB9LAorKwl7IE5NX0NIQU5DX0JDQ0hDb21iLAkJIkNvbWJpbmVkIEJDQ0giIH0sCisrCXsgTk1fQ0hBTkNfQkNDSCwJCSJCQ0NIIiB9LAorKwl7IE5NX0NIQU5DX0JDQ0hfQ0JDSCwJCSJCQ0NIK0NCQ0giIH0sCisrCXsgTk1fQ0hBTkNfU0RDQ0hfQ0JDSCwJCSJTRENDSCtDQkNIIiB9LAorK307CisrCisrLyogU2VjdGlvbiA5LjQuMTY6IEV2ZW50IFR5cGUgKi8KKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9ldmVudF90eXBlX3ZhbHNbXSA9IHsKKysJeyBOTV9FVlRfQ09NTV9GQUlMLAkJIkNvbW11bmljYXRpb24gRmFpbHVyZSIgfSwKKysJeyBOTV9FVlRfUU9TX0ZBSUwsCQkiUW9TIEZhaWx1cmUiIH0sCisrCXsgTk1fRVZUX1BST0NfRkFJTCwJCSJQcm9jZXNzb3IgRmFpbHVyZSIgfSwKKysJeyBOTV9FVlRfRVFVSVBfRkFJTCwJCSJFcXVpcG1lbnQgRmFpbHVyZSIgfSwKKysJeyBOTV9FVlRfRU5WX0ZBSUwsCQkiRW52aXJvbm1lbnQgRmFpbHVyZSIgfSwKKyt9OworKworKy8qIFNlY3Rpb24gOS40LjYzOiBQZXJjZWl2ZWQgU2V2ZXJpdHkgKi8KKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9zZXZlcml0eV92YWxzW10gPSB7CisrCXsgTk1fU0VWRVJfQ0VBU0VELAkJIkNlYXNlZCIgfSwKKysJeyBOTV9TRVZFUl9DUklUSUNBTCwJCSJDcml0aWNhbCIgfSwKKysJeyBOTV9TRVZFUl9NQUpPUiwJCSJNYWpvciIgfSwKKysJeyBOTV9TRVZFUl9NSU5PUiwJCSJNaW5vciIgfSwKKysJeyBOTV9TRVZFUl9XQVJOSU5HLAkJIldhcm5pbmciIH0sCisrCXsgTk1fU0VWRVJfSU5ERVRFUk1JTkFURSwJIkluZGV0ZXJtaW5hdGUiIH0sCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNC4zNjogTkFDSyBDYXVzZXMgKi8KKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9uYWNrX2NhdXNlW10gPSB7CisrCXsgTk1fTkFDS19JTkNPUlJfU1RSVUNULAkiSW5jb3JyZWN0IG1lc3NhZ2Ugc3RydWN0dXJlIiB9LAorKwl7IE5NX05BQ0tfTVNHVFlQRV9JTlZBTCwJIkludmFsaWQgbWVzc2FnZSB0eXBlIHZhbHVlIiB9LAorKwl7IE5NX05BQ0tfT0JKQ0xBU1NfSU5WQUwsCSJJbnZhbGlkIE9iamVjdCBjbGFzcyB2YWx1ZSIgfSwKKysJeyBOTV9OQUNLX09CSkNMQVNTX05PVFNVUFAsCSJPYmplY3QgQ2xhc3Mgbm90IHN1cHBvcnRlZCIgfSwKKysJeyBOTV9OQUNLX0JUU05SX1VOS04sCQkiQlRTIE51bWJlciB1bmtub3duIiB9LAorKwl7IE5NX05BQ0tfVFJYTlJfVU5LTiwJCSJUUlggTnVtYmVyIHVua25vd24iIH0sCisrCXsgTk1fTkFDS19PQkpJTlNUX1VOS04sCQkiT2JqZWN0IEluc3RhbmNlIHVua25vd24iIH0sCisrCXsgTk1fTkFDS19BVFRSSURfSU5WQUwsCQkiSW52YWxpZCBBdHRyaWJ1dGUgSUQgdmFsdWUiIH0sCisrCXsgTk1fTkFDS19BVFRSSURfTk9UU1VQUCwJIkF0dHJpYnV0ZSBJRCBub3Qgc3VwcG9ydGVkIiB9LAorKwl7IE5NX05BQ0tfUEFSQU1fUkFOR0UsCQkiUGFyYW1ldGVyIHZhbHVlIG91dCBvZiByYW5nZSIgfSwKKysJeyBOTV9OQUNLX0FUVFJMSVNUX0lOQ09OU0lTVEVOVCwgIkluY29uc2lzdGVuY3kgaW4gQXR0cmlidXRlIGxpc3QiIH0sCisrCXsgTk1fTkFDS19TUEVDX0lNUExfTk9UU1VQUCwJIlNwZWNpZmllZCBJbXBsZW1lbnRhdGlvbiBub3Qgc3VwcG9ydGVkIiB9LAorKwl7IE5NX05BQ0tfQ0FOVF9QRVJGT1JNLAkJIk1lc3NhZ2UgY2Fubm90IGJlIHBlcmZvcm1lZCIgfSwKKysJeyBOTV9OQUNLX1JFU19OT1RJTVBMLAkJIlJlc291cmNlIG5vdCBpbXBsZW1lbnRlZCIgfSwKKysJeyBOTV9OQUNLX1JFU19OT1RBVkFJTCwJCSJSZXNvdXJjZSBub3QgYXZhaWxhYmxlIiB9LAorKwl7IE5NX05BQ0tfRlJFUV9OT1RBVkFJTCwJIkZyZXF1ZW5jeSBub3QgYXZhaWxhYmxlIiB9LAorKwl7IE5NX05BQ0tfVEVTVF9OT1RTVVBQLAkJIlRlc3Qgbm90IHN1cHBvcnRlZCIgfSwKKysJeyBOTV9OQUNLX0NBUEFDSVRZX1JFU1RSLAkiQ2FwYWNpdHkgcmVzdHJpY3Rpb25zIiB9LAorKwl7IE5NX05BQ0tfUEhZU0NGR19OT1RQRVJGT1JNLAkiUGh5cyBjb25maWcgY2Fubm90IGJlIHBlcmZvcm1lZCIgfSwKKysJeyBOTV9OQUNLX1RFU1RfTk9USU5JVCwJCSJUZXN0IG5vdCBpbml0aWF0ZWQiIH0sCisrCXsgTk1fTkFDS19QSFlTQ0ZHX05PVFJFU1RPUkUsCSJQaHlzIGNvbmZpZyBjYW5ub3QgYmUgcmVzdG9yZWQiIH0sCisrCXsgTk1fTkFDS19URVNUX05PU1VDSCwJCSJObyBzdWNoIFRlc3QiIH0sCisrCXsgTk1fTkFDS19URVNUX05PU1RPUCwJCSJUZXN0IGNhbm5vdCBiZSBzdG9wcGVkIiB9LAorKwl7IE5NX05BQ0tfTVNHSU5DT05TSVNUX1BIWVNDRkcsCSJNZXNzYWdlIGluY29uc2lzdGVuIHdpdGggcGh5c2ljYWwgY29uZmlnIiB9LAorKwl7IE5NX05BQ0tfRklMRV9JTkNPTVBMRVRFLAkiQ29tcGxldGUgZmlsZSBub3QgcmVjZWl2ZWQiIH0sCisrCXsgTk1fTkFDS19GSUxFX05PVEFWQUlMLAkiRmlsZSBub3QgYXZhaWxhYmxlIGF0IGRlc3RpbmF0aW9uIiB9LAorKwl7IE5NX05BQ0tfRklMRV9OT1RBQ1RJVkFURSwJIkZpbGUgY2Fubm90IGJlIGFjdGl2YXRlZCIgfSwKKysJeyBOTV9OQUNLX1JFUV9OT1RfR1JBTlQsCSJSZXF1ZXN0IG5vdCBncmFudGVkIiB9LAorKwl7IE5NX05BQ0tfV0FJVCwJCQkiV2FpdCIgfSwKKysJeyBOTV9OQUNLX05PVEhfUkVQT1JUX0VYSVNULAkiTm90aGluZyByZXBvcnRhYmxlIGV4aXN0aW5nIiB9LAorKwl7IE5NX05BQ0tfTUVBU19OT1RTVVBQLAkJIk1lYXN1cmVtZW50IG5vdCBzdXBwb3J0ZWQiIH0sCisrCXsgTk1fTkFDS19NRUFTX05PVFNUQVJULAkiTWVhc3VyZW1lbnQgbm90IHN0YXJ0ZWQiIH0sCisrCXsgMHhmZiwJCQkJIk5VTEwiIH0sCisrfTsKKysKKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF90ZXN0X25vX3ZhbHNbXSA9IHsKKysJeyBOTV9JUEFDQ19URVNUTk9fUkxPT1BfQU5ULAkiUmFkaW8gTG9vcCB0ZXN0IHZpYSBhbnRlbm5hIiB9LAorKwl7IE5NX0lQQUNDX1RFU1ROT19STE9PUF9YQ1ZSLAkiUmFkaW8gTG9vcCB0ZXN0IHZpYSB0cmFuc2NlaXZlciIgfSwKKysJeyBOTV9JUEFDQ19URVNUTk9fRlVOQ19PQkosCSJCVFMgRnVuY3Rpb25hbCBvYmplY3Qgc2VsZiB0ZXN0IiB9LAorKwl7IE5NX0lQQUNDX1RFU1ROT19DSEFOX1VTQUdFLAkiQ2hhbm5lbCBVc2FnZSIgfSwKKysJeyBOTV9JUEFDQ19URVNUTk9fQkNDSF9DSEFOX1VTQUdFLCAiQkNDSCBDaGFubmVsIFVzYWdlIiB9LAorKwl7IE5NX0lQQUNDX1RFU1ROT19GUkVRX1NZTkMsCSJGcmVxdWVuY3kgU3luY2hyb25pemF0aW9uIiB9LAorKwl7IE5NX0lQQUNDX1RFU1ROT19CQ0NIX0lORk8sCSJCQ0NIIEluZm9ybWF0aW9uIiB9LAorKwl7IE5NX0lQQUNDX1RFU1ROT19UWF9CRUFDT04sCSJUcmFuc21pdCBCZWFjb24iIH0sCisrCXsgTk1fSVBBQ0NfVEVTVE5PX1NZU0lORk9fTU9OSVRPUiwgIlN5c0luZm8gTW9uaXRvciIgfSwKKysJeyBOTV9JUEFDQ19URVNUTk9fQkNDQ0hfTU9OSVRPUiwgIkJDQ0ggJiBDQ0NIIE1vbml0b3IiIH0sCisrfTsKKysKKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIGlwYWNjX3Rlc3RfcmVzX3ZhbHNbXSA9IHsKKysJeyBOTV9JUEFDQ19URVNUUkVTX1NVQ0NFU1MsCSJTdWNjZXNzIiB9LAorKwl7IE5NX0lQQUNDX1RFU1RSRVNfVElNRU9VVCwJIlRpbWVvdXQiIH0sCisrCXsgTk1fSVBBQ0NfVEVTVFJFU19OT19DSEFOUywJIk5vIHN1aXRhYmxlIGNoYW5uZWxzIGF2YWlsYWJsZSIgfSwKKysJeyBOTV9JUEFDQ19URVNUUkVTX1BBUlRJQUwsCSJQYXJ0aWFsIiB9LAorKwl7IE5NX0lQQUNDX1RFU1RSRVNfU1RPUFBFRCwJIlN0b3BwZWQiIH0sCisrfTsKKysKKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIGlwYWNjX3Rlc3RyZXNfaWVfdmFsc1tdID0geworKwl7IE5NX0lQQUNDX1RSX0lFX0ZSRVFfRVJSX0xJU1QsCSJGcmVxdWVuY3kgRXJyb3IgTGlzdCIgfSwKKysJeyBOTV9JUEFDQ19UUl9JRV9DSEFOX1VTQUdFLAkiQ2hhbm5lbCBVc2FnZSIgfSwKKysJeyBOTV9JUEFDQ19UUl9JRV9CQ0NIX0lORk8sCSJCQ0NIIEluZm9ybWF0aW9uIiB9LAorKwl7IE5NX0lQQUNDX1RSX0lFX1JFU1VMVF9ERVRBSUxTLCJSZXN1bHQgRGV0YWlscyIgfSwKKysJeyBOTV9JUEFDQ19UUl9JRV9GUkVRX0VSUiwJIkZyZXF1ZW5jeSBFcnJvciIgfSwKKyt9OworKworK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGx2X2RlZiAqCisrZmluZF90bHZfdGFnKGd1aW50OCB0YWcpCisreworKwljb25zdCBzdHJ1Y3QgdGx2X2RlZiAqc3BlY2lmaWM7CisrCisrCWlmIChnbG9iYWxfb21sX3VzZV9uYW5vX2J0cykKKysJCXNwZWNpZmljID0gJm5tX2F0dF90bHZkZWZfaXBhLmRlZlt0YWddOworKwllbHNlCisrCQlzcGVjaWZpYyA9ICZubV9hdHRfdGx2ZGV2X2JzMTEuZGVmW3RhZ107CisrCisrCWlmIChzcGVjaWZpYy0+dHlwZSAhPSBUTFZfVFlQRV9GSVhFRCkKKysJCXJldHVybiBzcGVjaWZpYzsKKysKKysJcmV0dXJuICZubV9hdHRfdGx2ZGVmX2Jhc2UuZGVmW3RhZ107CisrfQorKworKy8qIFBhcnNlIHRoZSBpcC5hY2Nlc3Mgc3BlY2lmaWMgQkNDSCBJbmZvcm1hdGlvbiBJRSBlbWJlZGRlZCBpbnRvIHRoZSBUZXN0CisrICogUmVwb3J0IElFICovCisrc3RhdGljIGdpbnQKKytpcGFjY190cl9pZV9iY2NoKHR2YnVmZl90ICp0dmIsIHByb3RvX3RyZWUgKmF0dF90cmVlLCBpbnQgb2Zmc2V0KQorK3sKKysJZ3VpbnQxNiBiaW5mb190eXBlLCB0bXA7CisrCisrCWJpbmZvX3R5cGUgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KTsKKysJb2Zmc2V0ICs9IDI7CisrCisrCXRtcCA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQpOworKworKwkvKiBGSVhNRTogdGhlcmUgYXJlIHN0aWxsIHNvbWUgYnVncyByZW1haW5pbmcgaGVyZSAqLworKwlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9hcmZjbiwKKysJCQkgICAgdHZiLCBvZmZzZXQsIDIsIFRSVUUpOworKworKwlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9mX3F1YWwsCisrCQkJICAgIHR2Yiwgb2Zmc2V0LCAyLCBUUlVFKTsKKysJb2Zmc2V0ICs9IDI7CisrCisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX2JfcnhsZXYsCisrCQkJICAgIHR2Yiwgb2Zmc2V0KyssIDEsIFRSVUUpOworKworKwlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9yeHF1YWwsCisrCQkJICAgIHR2Yiwgb2Zmc2V0KyssIDEsIFRSVUUpOworKworKwlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9mX2VyciwKKysJCQkgICAgdHZiLCBvZmZzZXQsIDIsIFRSVUUpOworKwlvZmZzZXQgKz0gMjsKKysKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfZnJhbWVfb2ZmcywKKysJCQkgICAgdHZiLCBvZmZzZXQsIDIsIFRSVUUpOworKwlvZmZzZXQgKz0gMjsKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfZnJhbWVucl9vZmZzLAorKwkJCSAgICB0dmIsIG9mZnNldCwgNCwgVFJVRSk7CisrCW9mZnNldCArPSA0OworKworKwlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9ic2ljLAorKwkJCSAgICB0dmIsIG9mZnNldCsrLCAxLCBUUlVFKTsKKysKKysJZGVfbGFpKHR2YiwgYXR0X3RyZWUsIG9mZnNldCwgNSwgTlVMTCwgMCk7CisrCW9mZnNldCArPSA1OworKworKwlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9jZWxsX2lkLAorKwkJCSAgICB0dmIsIG9mZnNldCwgMiwgVFJVRSk7CisrCW9mZnNldCArPSAyOworKworKwlpZiAoYmluZm9fdHlwZSAmIDB4ODAwMCkgeworKwkJLyogU3lzdGVtIEluZm9ybWF0aW9uIDIgKi8KKysJCS8qIEZJWE1FOiBQYXJzZSAwNC4xOCBOZWlnaGJvdXIgQ2VsbCBEZXNjcmlwdGlvbiAqLworKwkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfc2kyLAorKwkJCQkgICAgdHZiLCBvZmZzZXQsIDE2LCBUUlVFKTsKKysJCW9mZnNldCArPSAxNjsKKysJfQorKwlpZiAoYmluZm9fdHlwZSAmIDB4MDAwMSkgeworKwkJLyogU3lzdGVtIEluZm9ybWF0aW9uIDJiaXMgKi8KKysJCS8qIEZJWE1FOiBQYXJzZSAwNC4xOCBOZWlnaGJvdXIgQ2VsbCBEZXNjcmlwdGlvbiAqLworKwkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfc2kyYmlzLAorKwkJCQkgICAgdHZiLCBvZmZzZXQsIDE2LCBUUlVFKTsKKysJCW9mZnNldCArPSAxNjsKKysJfQorKwlpZiAoYmluZm9fdHlwZSAmIDB4MDAwMikgeworKwkJLyogU3lzdGVtIEluZm9ybWF0aW9uIDJ0ZXIgKi8KKysJCS8qIEZJWE1FOiBQYXJzZSAwNC4xOCBOZWlnaGJvdXIgQ2VsbCBEZXNjcmlwdGlvbiAqLworKwkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfc2kydGVyLAorKwkJCQkgICAgdHZiLCBvZmZzZXQsIDE2LCBUUlVFKTsKKysJCW9mZnNldCArPSAxNjsKKysJfQorKwlpZiAoYmluZm9fdHlwZSAmIDB4MDAwNCkgeworKwkJLyogRklYTUU6IFBhcnNlIDA0LjE4IENlbGwgQ2hhbm5lbCBEZXNjcmlwdGlvbiAqLworKwkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfY2hhbl9kZXNjLAorKwkJCQkgICAgdHZiLCBvZmZzZXQsIDE2LCBUUlVFKTsKKysJCW9mZnNldCArPSAxNjsKKysJfQorKworKwlyZXR1cm4gb2Zmc2V0OworK30KKysKKysvKiBQYXJzZSB0aGUgaXAuYWNjZXNzIHNwZWNpZmljIENoYW5uZWwgVXNhZ2UgSUUgZW1iZWRkZWQgaW50byB0aGUgVGVzdAorKyAqIFJlcG9ydCBJRSAqLworK3N0YXRpYyBnaW50CisraXBhY2NfdHJfaWVfY2hhbl91c2FnZSh0dmJ1ZmZfdCAqdHZiLCBwcm90b190cmVlICphdHRfdHJlZSwgaW50IG9mZnNldCkKKyt7CisrCXdoaWxlICh0dmJfcmVwb3J0ZWRfbGVuZ3RoX3JlbWFpbmluZyh0dmIsIG9mZnNldCkgIT0gMCkgeworKwkJZ3VpbnQxNiByZXN1bHQ7CisrCisrCQlyZXN1bHQgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KTsKKysJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX2FyZmNuLAorKwkJCQkgICAgdHZiLCBvZmZzZXQsIDIsIHJlc3VsdCk7CisrCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9yeGxldiwKKysJCQkJICAgIHR2Yiwgb2Zmc2V0LCAyLCByZXN1bHQpOworKwkJb2Zmc2V0ICs9IDI7CisrCX0KKysJcmV0dXJuIG9mZnNldDsKKyt9CisrCisrLyogUGFyc2UgdGhlIGlwLmFjY2VzcyBzcGVjaWZpYyBmb3JtYXQgb2YgdGhlIHN0YW5kYXJkIHRlc3QgcmVwb3J0IElFICovCisrc3RhdGljIGdpbnQKKytkaXNzZWN0X2lwYWNjX3Rlc3RfcmVwKHByb3RvX3RyZWUgKnRyZWUsIHR2YnVmZl90ICp0dmIpCisreworKwlnaW50IG9mZnNldCA9IDA7CisrCisrCXByb3RvX3RyZWVfYWRkX2l0ZW0odHJlZSwgaGZfYXR0cl9pcGFfdGVzdF9yZXMsIHR2Yiwgb2Zmc2V0KyssCisrCQkJICAgIDEsIEZBTFNFKTsKKysKKysJd2hpbGUgKHR2Yl9yZXBvcnRlZF9sZW5ndGhfcmVtYWluaW5nKHR2Yiwgb2Zmc2V0KSAhPSAwKSB7CisrCQlndWludDggaWU7CisrCQlndWludDE2IGxlbjsKKysJCXByb3RvX2l0ZW0gKnRpOworKwkJcHJvdG9fdHJlZSAqYXR0X3RyZWU7CisrCisrCQlpZSA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KTsKKysJCWxlbiA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQrMSk7CisrCQl0aSA9IHByb3RvX3RyZWVfYWRkX2l0ZW0odHJlZSwgaGZfb21sX2lwYV90cmVzX2F0dHJfdGFnLCB0dmIsCisrCQkJCQkgb2Zmc2V0KyssIDEsIEZBTFNFKTsKKysJCWF0dF90cmVlID0gcHJvdG9faXRlbV9hZGRfc3VidHJlZSh0aSwgZXR0X29tbF9mb21fYXR0KTsKKysJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX29tbF9pcGFfdHJlc19hdHRyX2xlbiwgdHZiLAorKwkJCQkgICAgb2Zmc2V0LCAyLCBsZW4pOworKwkJb2Zmc2V0ICs9IDI7CisrCisrCQlzd2l0Y2ggKGllKSB7CisrCQljYXNlIE5NX0lQQUNDX1RSX0lFX0NIQU5fVVNBR0U6CisrCQkJb2Zmc2V0ID0gaXBhY2NfdHJfaWVfY2hhbl91c2FnZSh0dmIsCisrCQkJCQkJIAlhdHRfdHJlZSwgb2Zmc2V0KTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fSVBBQ0NfVFJfSUVfQkNDSF9JTkZPOgorKwkJCW9mZnNldCA9IGlwYWNjX3RyX2llX2JjY2godHZiLAorKwkJCQkJCSAgYXR0X3RyZWUsIG9mZnNldCk7CisrCQkJYnJlYWs7CisrCQlkZWZhdWx0OgorKwkJCWJyZWFrOworKwkJfQorKwl9CisrCXJldHVybiBvZmZzZXQ7CisrfQorKworKy8qIERpc3NlY3QgT01MIEZPTSBBdHRyaWJ1dGVzIGFmdGVyIE9NTCArIEZPTSBoZWFkZXIgKi8KKytzdGF0aWMgZ2ludAorK2Rpc3NlY3Rfb21sX2F0dHJzKHR2YnVmZl90ICp0dmIsIGludCBiYXNlX29mZnMsIHBhY2tldF9pbmZvICpwaW5mbywKKysJCSAgcHJvdG9fdHJlZSAqdHJlZSkKKyt7CisrCWludCBvZmZzZXQgPSBiYXNlX29mZnM7CisrCisrCXdoaWxlICh0dmJfcmVwb3J0ZWRfbGVuZ3RoX3JlbWFpbmluZyh0dmIsIG9mZnNldCkgIT0gMCkgeworKwkJZ3VpbnQgaTsKKysJCWd1aW50OCB0YWcsIHZhbDg7CisrCQlndWludDE2IHZhbDE2OworKwkJZ3VpbnQzMiB2YWwzMjsKKysJCXVuc2lnbmVkIGludCBsZW4sIGxlbl9sZW4sIGhsZW47CisrCQljb25zdCBzdHJ1Y3QgdGx2X2RlZiAqdGRlZjsKKysJCXByb3RvX2l0ZW0gKnRpOworKwkJcHJvdG9fdHJlZSAqYXR0X3RyZWU7CisrCQl0dmJ1ZmZfdCAqc3ViX3R2YjsKKysKKysJCXRhZyA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KTsKKysJCXRkZWYgPSBmaW5kX3Rsdl90YWcodGFnKTsKKysKKysJCXN3aXRjaCAodGRlZi0+dHlwZSkgeworKwkJY2FzZSBUTFZfVFlQRV9GSVhFRDoKKysJCQlobGVuID0gMTsKKysJCQlsZW5fbGVuID0gMDsKKysJCQlsZW4gPSB0ZGVmLT5maXhlZF9sZW47CisrCQkJYnJlYWs7CisrCQljYXNlIFRMVl9UWVBFX1Q6CisrCQkJaGxlbiA9IDE7CisrCQkJbGVuX2xlbiA9IDA7CisrCQkJbGVuID0gMDsKKysJCQlicmVhazsKKysJCWNhc2UgVExWX1RZUEVfVFY6CisrCQkJaGxlbiA9IDE7CisrCQkJbGVuX2xlbiA9IDA7CisrCQkJbGVuID0gMTsKKysJCQlicmVhazsKKysJCWNhc2UgVExWX1RZUEVfVExWOgorKwkJCWhsZW4gPSAyOworKwkJCWxlbl9sZW4gPSAxOworKwkJCWxlbiA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzEpOworKwkJCWJyZWFrOworKwkJY2FzZSBUTFZfVFlQRV9UTDE2VjoKKysJCQlobGVuID0gMzsKKysJCQlsZW5fbGVuID0gMjsKKysJCQlsZW4gPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCsxKSA8PCA4IHwKKysJCQkJCQl0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCsyKTsKKysJCQlicmVhazsKKysJCWRlZmF1bHQ6CisrCQkJaGxlbiA9IGxlbl9sZW4gPSBsZW4gPSAwOworKwkJCURJU1NFQ1RPUl9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKysJCQlicmVhazsKKysJCX0KKysKKysJCXRpID0gcHJvdG9fdHJlZV9hZGRfaXRlbSh0cmVlLCBoZl9vbWxfZm9tX2F0dHJfdGFnLCB0dmIsCisrCQkJCQkgb2Zmc2V0LCAxLCBGQUxTRSk7CisrCQlhdHRfdHJlZSA9IHByb3RvX2l0ZW1fYWRkX3N1YnRyZWUodGksIGV0dF9vbWxfZm9tX2F0dCk7CisrCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9vbWxfZm9tX2F0dHJfbGVuLCB0dmIsCisrCQkJCSAgICBvZmZzZXQrMSwgbGVuX2xlbiwgbGVuKTsKKysJCW9mZnNldCArPSBobGVuOworKworKwkJc3ViX3R2YiA9IHR2Yl9uZXdfc3Vic2V0KHR2Yiwgb2Zmc2V0LCBsZW4sIGxlbik7CisrCisrCQlzd2l0Y2ggKHRhZykgeworKwkJLyogcGFyc2Ugb25seSB0aGUgbW9zdCBjb21tb24gSUUgZm9yIG5vdyAqLworKwkJY2FzZSBOTV9BVFRfQUJJU19DSEFOTkVMOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfYWNoX2J0c3AsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIDEsIFRSVUUpOworKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfYWNoX3RzbG90LCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0KzEsIDEsIFRSVUUpOworKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfYWNoX3NzbG90LCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0KzIsIDEsIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfQURNX1NUQVRFOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfYWRtX3N0YXRlLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQl2YWw4ID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOworKwkJCWNvbF9hcHBlbmRfZnN0cihwaW5mby0+Y2luZm8sIENPTF9JTkZPLCAiJXMgIiwKKysJCQkJCXZhbF90b19zdHIodmFsOCwgb21sX2FkbV9zdGF0ZV92YWxzLAorKwkJCQkJCSAgICIlMDJ4IikpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfQVJGQ05fTElTVDoKKysJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHsKKysJCQkJdmFsMTYgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0ICsgaSk7CisrCQkJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX2F0dHJfYXJmY24sCisrCQkJCQkJICAgIHR2Yiwgb2Zmc2V0ICsgaSwgMiwgdmFsMTYpOworKwkJCX0KKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0FWQUlMX1NUQVRVUzoKKysJCQkvKiBBdmFpbGFiaWxpdHkgc3RhdHVzIGNhbiBoYXZlIGxlbmd0aCAwICovCisrCQkJaWYgKGxlbikgeworKwkJCQl2YWw4ID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOworKwkJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLAorKwkJCQkJCSAgICBoZl9hdHRyX2F2YWlsX3N0YXRlLCB0dmIsCisrCQkJCQkgICAgCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCX0gZWxzZQorKwkJCQl2YWw4ID0gMHhmZjsKKysJCQljb2xfYXBwZW5kX2ZzdHIocGluZm8tPmNpbmZvLCBDT0xfSU5GTywgIiVzICIsCisrCQkJCQl2YWxfdG9fc3RyKHZhbDgsIG9tbF9hdmFpbF9zdGF0ZV92YWxzLAorKwkJCQkJCSAgICIlMDJ4IikpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfQkNDSF9BUkZDTjoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2JjY2hfYXJmY24sIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9CU0lDOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfYnNpYywgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0NIQU5fQ09NQjoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2NoYW5fY29tYiwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0VWRU5UX1RZUEU6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9ldmVudF90eXBlLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfR1NNX1RJTUU6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9nc21fdGltZSwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX09QRVJfU1RBVEU6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9vcGVyX3N0YXRlLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQl2YWw4ID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOworKwkJCWNvbF9hcHBlbmRfZnN0cihwaW5mby0+Y2luZm8sIENPTF9JTkZPLCAiJXMgIiwKKysJCQkJCXZhbF90b19zdHIodmFsOCwgb21sX29wZXJfc3RhdGVfdmFscywKKysJCQkJCQkgICAiJTAyeCIpKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX1RFSToKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX3RlaSwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX1RTQzoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX3RzYywgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX1NFVkVSSVRZOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfc2V2ZXJpdHksIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9URVNUX1JFUE9SVDoKKysJCQlkaXNzZWN0X2lwYWNjX3Rlc3RfcmVwKGF0dF90cmVlLCBzdWJfdHZiKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX1RFU1RfTk86CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl90ZXN0X25vLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCXZhbDggPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCk7CisrCQkJY29sX2FwcGVuZF9mc3RyKHBpbmZvLT5jaW5mbywgQ09MX0lORk8sICIlcyAiLAorKwkJCQkJdmFsX3RvX3N0cih2YWw4LCBvbWxfdGVzdF9ub192YWxzLAorKwkJCQkJCSAgICIlMDJ4IikpOworKwkJCWJyZWFrOworKworKwkJLyogcHJvcHJpZXRhcnkgaXAuYWNjZXNzIGV4dGVuc2lvbnMgKi8KKysJCWNhc2UgTk1fQVRUX0lQQUNDX0RTVF9JUDoKKysJCQl2YWwzMiA9IHR2Yl9nZXRfbnRvaGwodHZiLCBvZmZzZXQpOworKwkJCXByb3RvX3RyZWVfYWRkX2lwdjQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3JzbF9pcCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCB2YWwzMik7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19EU1RfSVBfUE9SVDoKKysJCQl2YWwxNiA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQpOworKwkJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3JzbF9wb3J0LCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIHZhbDE2KTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0lQQUNDX0xPQ0FUSU9OOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX2xvY2F0aW9uX25hbWUsCisrCQkJCQkgICAgdHZiLCBvZmZzZXQsIGxlbiwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19VTklUX0lEOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3VuaXRfaWQsCisrCQkJCQkgICAgdHZiLCBvZmZzZXQsIGxlbiwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19VTklUX05BTUU6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdW5pdF9uYW1lLAorKwkJCQkJICAgIHR2Yiwgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfSVBBQ0NfUFJJTV9PTUxfQ0ZHX0xJU1Q6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfcHJpbV9vbWxfaXAsCisrCQkJCQkgICAgdHZiLCBvZmZzZXQrMSwgNCwgVFJVRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfcHJpbV9vbWxfcG9ydCwKKysJCQkJCSAgICB0dmIsIG9mZnNldCsxKzQsIDIsIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfSVBBQ0NfTlZfRkxBR1M6CisrCQkJeworKwkJCQlndWludCBmbGFncywgbWFzazsKKysJCQkJZmxhZ3MgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCk7CisrCQkJCW1hc2sgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCsxKTsKKysJCQkJZmxhZ3MgfD0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrMikgPDwgODsKKysJCQkJbWFzayB8PSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCszKSA8PCA4OworKwkJCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9hdHRyX2lwYV9udl9mbGFncywKKysJCQkJCQkgICAgdHZiLCBvZmZzZXQsIDMsIGZsYWdzKTsKKysJCQkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfbnZfbWFzaywKKysJCQkJCQkgICAgdHZiLCBvZmZzZXQrMSwgMywgbWFzayk7CisrCQkJfQorKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfSVBBQ0NfUkFDOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3JhYywKKysJCQkJCSAgICB0dmIsIG9mZnNldCwgMSwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19OU0VJOgorKwkJCXZhbDE2ID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCk7CisrCQkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfbnNlaSwKKysJCQkJCSAgIHR2Yiwgb2Zmc2V0LCAyLCB2YWwxNik7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19OU1ZDSToKKysJCQl2YWwxNiA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQpOworKwkJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX25zdmNpLAorKwkJCQkJICAgdHZiLCBvZmZzZXQsIDIsIHZhbDE2KTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0lQQUNDX0JWQ0k6CisrCQkJdmFsMTYgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KTsKKysJCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9hdHRyX2lwYV9idmNpLAorKwkJCQkJICAgdHZiLCBvZmZzZXQsIDIsIHZhbDE2KTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0lQQUNDX05TX0xJTktfQ0ZHOgorKwkJCXZhbDE2ID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCk7CisrCQkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfbnNsX3Nwb3J0LAorKwkJCQkJICAgdHZiLCBvZmZzZXQsIDIsIHZhbDE2KTsKKysJCQl2YWwzMiA9IHR2Yl9nZXRfaXB2NCh0dmIsIG9mZnNldCsyKTsKKysJCQlwcm90b190cmVlX2FkZF9pcHY0KGF0dF90cmVlLCBoZl9hdHRyX2lwYV9uc2xfZGFkZHIsCisrCQkJCQkgICB0dmIsIG9mZnNldCsyLCA0LCB2YWwzMik7CisrCQkJdmFsMTYgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KzYpOworKwkJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX25zbF9kcG9ydCwKKysJCQkJCSAgIHR2Yiwgb2Zmc2V0KzYsIDIsIHZhbDE2KTsKKysJCQlicmVhazsKKysJCWRlZmF1bHQ6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfb21sX2ZvbV9hdHRyX3ZhbCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQl9CisrCQlvZmZzZXQgKz0gbGVuOworKwl9CisrCXJldHVybiBvZmZzZXQ7CisrfQorKworK3N0YXRpYyBpbnQKKytkaXNzZWN0X29tbF9mb20odHZidWZmX3QgKnR2YiwgcGFja2V0X2luZm8gKnBpbmZvLCBwcm90b190cmVlICp0cmVlLAorKwkJaW50IG9mZnNldCwgcHJvdG9faXRlbSAqdG9wX3RpKQorK3sKKysJZ3VpbnQ4IG1zZ190eXBlLCBvYmpfY2xhc3MsIGJ0c19uciwgdHJ4X25yLCB0c19ucjsKKysJcHJvdG9faXRlbSAqdGk7CisrCXByb3RvX3RyZWUgKmZvbV90cmVlOworKworKwltc2dfdHlwZSA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KTsKKysJb2JqX2NsYXNzID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrMSk7CisrCWJ0c19uciA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzIpOworKwl0cnhfbnIgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCszKTsKKysJdHNfbnIgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCs0KTsKKysJcHJvdG9faXRlbV9hcHBlbmRfdGV4dCh0b3BfdGksICIsICVzKCUwMngsJTAyeCwlMDJ4KSAlcyAiLAorKwkJCXZhbF90b19zdHIob2JqX2NsYXNzLCBvbWxfZm9tX29iamNsYXNzX3ZhbHMsICIlMDJ4IiksCisrCQkJYnRzX25yLCB0cnhfbnIsIHRzX25yLAorKwkJCXZhbF90b19zdHIobXNnX3R5cGUsIG9tbF9mb21fbXNndHlwZV92YWxzLAorKwkJCQkgICAidW5rbm93biAweCV4IikpOworKwljb2xfYXBwZW5kX2ZzdHIocGluZm8tPmNpbmZvLCBDT0xfSU5GTywgIiVzKCUwMngsJTAyeCwlMDJ4KSAlcyAiLAorKwkJCXZhbF90b19zdHIob2JqX2NsYXNzLCBvbWxfZm9tX29iamNsYXNzX3ZhbHMsICIlMDJ4IiksCisrCQkJYnRzX25yLCB0cnhfbnIsIHRzX25yLAorKwkJCXZhbF90b19zdHIobXNnX3R5cGUsIG9tbF9mb21fbXNndHlwZV92YWxzLAorKwkJCQkgICAidW5rbm93biAweCV4IikpOworKwl0aSA9IHByb3RvX3RyZWVfYWRkX2l0ZW0odHJlZSwgaGZfb21sX2ZvbV9tc2d0eXBlLCB0dmIsIG9mZnNldCsrLCAxLCBGQUxTRSk7CisrCWZvbV90cmVlID0gcHJvdG9faXRlbV9hZGRfc3VidHJlZSh0aSwgZXR0X29tbF9mb20pOworKwlwcm90b190cmVlX2FkZF9pdGVtKGZvbV90cmVlLCBoZl9vbWxfZm9tX29iamNsYXNzLCB0dmIsIG9mZnNldCsrLCAxLCBGQUxTRSk7CisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oZm9tX3RyZWUsIGhmX29tbF9mb21faW5zdF9idHMsIHR2Yiwgb2Zmc2V0KyssIDEsIEZBTFNFKTsKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShmb21fdHJlZSwgaGZfb21sX2ZvbV9pbnN0X3RyeCwgdHZiLCBvZmZzZXQrKywgMSwgRkFMU0UpOworKwlwcm90b190cmVlX2FkZF9pdGVtKGZvbV90cmVlLCBoZl9vbWxfZm9tX2luc3RfdHMsIHR2Yiwgb2Zmc2V0KyssIDEsIEZBTFNFKTsKKysKKysKKysJLyogZGlzc2VjdCB0aGUgVExWIG9iamVjdHMgaW4gdGhlIG1lc3NhZ2UgYm9keSAqLworKwlvZmZzZXQgPSBkaXNzZWN0X29tbF9hdHRycyh0dmIsIG9mZnNldCwgcGluZm8sIGZvbV90cmVlKTsKKysKKysJcmV0dXJuIG9mZnNldDsKKyt9CisrCisrc3RhdGljIGNvbnN0IGd1aW50OCBpcGFjY2Vzc19tYWdpY1tdID0gImNvbS5pcGFjY2VzcyI7CisrCisrc3RhdGljIGludAorK2Rpc3NlY3Rfb21sX21hbnVmKHR2YnVmZl90ICp0dmIsIHBhY2tldF9pbmZvICpwaW5mbywgcHJvdG9fdHJlZSAqdHJlZSwKKysJCSAgaW50IG9mZnNldCwgcHJvdG9faXRlbSAqdG9wX3RpKQorK3sKKysJaWYgKHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KSAhPSAweDBkIHx8CisrCSAgICB0dmJfbWVtZXFsKHR2Yiwgb2Zmc2V0KzEsIGlwYWNjZXNzX21hZ2ljLCBzaXplb2YoaXBhY2Nlc3NfbWFnaWMpKSkKKysJCXJldHVybiBvZmZzZXQ7CisrCisrCW9mZnNldCArPSBzaXplb2YoaXBhY2Nlc3NfbWFnaWMpICsgMTsKKysKKysJcmV0dXJuIGRpc3NlY3Rfb21sX2ZvbSh0dmIsIHBpbmZvLCB0cmVlLCBvZmZzZXQsIHRvcF90aSk7CisrfQorKworK3N0YXRpYyB2b2lkCisrZGlzc2VjdF9hYmlzX29tbCh0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8sIHByb3RvX3RyZWUgKnRyZWUpCisreworKwlwcm90b19pdGVtICp0aTsKKysJcHJvdG9fdHJlZSAqb21sX3RyZWU7CisrCisrCWludCBvZmZzZXQgPSAwOworKworKwljb2xfc2V0X3N0cihwaW5mby0+Y2luZm8sIENPTF9QUk9UT0NPTCwgIk9NTCIpOworKworKwl0b3BfdHJlZSA9IHRyZWU7CisrCWlmICh0cmVlKSB7CisrCQl1X2ludDhfdCBtc2dfZGlzYyA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KTsKKysKKysJCXRpID0gcHJvdG9fdHJlZV9hZGRfaXRlbSh0cmVlLCBwcm90b19hYmlzX29tbCwgdHZiLCAwLCAtMSwgRkFMU0UpOworKwkJb21sX3RyZWUgPSBwcm90b19pdGVtX2FkZF9zdWJ0cmVlKHRpLCBldHRfb21sKTsKKysKKysJCXByb3RvX3RyZWVfYWRkX2l0ZW0ob21sX3RyZWUsIGhmX29tbF9tc2dfZGlzYywgdHZiLCBvZmZzZXQrKywKKysJCQkJICAgIDEsIFRSVUUpOworKwkJcHJvdG9fdHJlZV9hZGRfaXRlbShvbWxfdHJlZSwgaGZfb21sX3BsYWNlbWVudCwgdHZiLCBvZmZzZXQrKywKKysJCQkJICAgIDEsIFRSVUUpOworKwkJcHJvdG9fdHJlZV9hZGRfaXRlbShvbWxfdHJlZSwgaGZfb21sX3NlcXVlbmNlLCB0dmIsIG9mZnNldCsrLAorKwkJCQkgICAgMSwgVFJVRSk7CisrCQlwcm90b190cmVlX2FkZF9pdGVtKG9tbF90cmVlLCBoZl9vbWxfbGVuZ3RoLCB0dmIsIG9mZnNldCsrLAorKwkJCQkgICAgMSwgVFJVRSk7CisrCisrCQlzd2l0Y2ggKG1zZ19kaXNjKSB7CisrCQljYXNlIEFCSVNfT01fTURJU0NfRk9NOgorKwkJCW9mZnNldCA9IGRpc3NlY3Rfb21sX2ZvbSh0dmIsIHBpbmZvLCBvbWxfdHJlZSwKKysJCQkJCQkgb2Zmc2V0LCB0aSk7CisrCQkJYnJlYWs7CisrCQljYXNlIEFCSVNfT01fTURJU0NfTUFOVUY6CisrCQkJb2Zmc2V0ID0gZGlzc2VjdF9vbWxfbWFudWYodHZiLCBwaW5mbywgb21sX3RyZWUsCQkJCQkJCSAgICAgICBvZmZzZXQsIHRpKTsKKysJCQlicmVhazsKKysJCWNhc2UgQUJJU19PTV9NRElTQ19NTUk6CisrCQljYXNlIEFCSVNfT01fTURJU0NfVFJBVToKKysJCWRlZmF1bHQ6CisrCQkJYnJlYWs7CisrCQl9CisrCX0KKyt9CisrCisrdm9pZAorK3Byb3RvX3JlZ19oYW5kb2ZmX2FiaXNfb21sKHZvaWQpOworKworK3ZvaWQKKytwcm90b19yZWdpc3Rlcl9hYmlzX29tbCh2b2lkKQorK3sKKysJc3RhdGljIGhmX3JlZ2lzdGVyX2luZm8gaGZbXSA9IHsKKysJCXsgJmhmX29tbF9tc2dfZGlzYywKKysJCQl7ICJNZXNzYWdlIERpc2NyaW1pbmF0b3IiLCAib21sLm1zZ19kc2MiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKG9tbF9tc2dfZGlzY192YWxzKSwgMCwKKysJCQkgICJHU00gMTIuMjEgTWVzc2FnZSBEaXNjcmltaW5hdG9yIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX29tbF9wbGFjZW1lbnQsCisrCQkJeyAiUGxhY2VtZW50IEluZGljYXRvciIsICJvbWwucGxhY2VtZW50IiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfcGxhY2VtZW50X3ZhbHMpLCAwLAorKwkJCSAgIkdTTSAxMi4yMSBQbGFjZW1lbnQgSW5kaWNhdG9yIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX29tbF9zZXF1ZW5jZSwKKysJCQl7ICJTZXF1ZW5jZSBOdW1iZXIiLCAib21sLnNlcXVlbmNlIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgTlVMTCwgMCwKKysJCQkgICJTZXF1ZW5jZSBOdW1iZXIgKGlmIG11bHRpLXBhcnQgbXNnKSIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfbGVuZ3RoLAorKwkJCXsgIkxlbmd0aCBJbmRpY2F0b3IiLCAib21sLmxlbmd0aCIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICAiVG90YWwgbGVuZ3RoIG9mIHBheWxvYWQiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfb21sX2ZvbV9tc2d0eXBlLAorKwkJCXsgIkZPTSBNZXNzYWdlIFR5cGUiLCAib21sLmZvbS5tc2dfdHlwZSIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMob21sX2ZvbV9tc2d0eXBlX3ZhbHMpLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX29tbF9mb21fb2JqY2xhc3MsCisrCQkJeyAiRk9NIE9iamVjdCBDbGFzcyIsICJvbWwuZm9tLm9ial9jbGFzcyIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMob21sX2ZvbV9vYmpjbGFzc192YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfZm9tX2luc3RfYnRzLAorKwkJCXsgIkZPTSBPYmplY3QgSW5zdGFuY2UgQlRTIiwgIm9tbC5mb20ub2JqX2luc3QuYnRzIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfZm9tX2luc3RfdHJ4LAorKwkJCXsgIkZPTSBPYmplY3QgSW5zdGFuY2UgVFJYIiwgIm9tbC5mb20ub2JqX2luc3QudHJ4IiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfZm9tX2luc3RfdHMsCisrCQkJeyAiRk9NIE9iamVjdCBJbnN0YW5jZSBUUyIsICJvbWwuZm9tLm9ial9pbnN0LnRzIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfZm9tX2F0dHJfdGFnLAorKwkJCXsgIkZPTSBBdHRyaWJ1dGUgSUQiLCAib21sLmZvbS5hdHRyX2lkIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfZm9tX2F0dHJfdmFscyksIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfb21sX2ZvbV9hdHRyX2xlbiwKKysJCQl7ICJGT00gQXR0cmlidXRlIExlbmd0aCIsICJvbWwuZm9tLmF0dHJfbGVuIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfb21sX2ZvbV9hdHRyX3ZhbCwKKysJCQl7ICJGT00gQXR0cmlidXRlIFZhbHVlIiwgIm9tbC5mb20uYXR0cl92YWwiLAorKwkJCSAgRlRfQllURVMsIEJBU0VfTk9ORSwgTlVMTCwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCisrCisrCisrCQkvKiBPTUwgQXR0cmlidXRlcyAqLworKwkJeyAmaGZfYXR0cl9hZG1fc3RhdGUsCisrCQkJeyAiQWRtaW5pc3RyYXRpdmUgU3RhdGUiLCAib21sLmZvbS5hdHRyLmFkbV9zdGF0ZSIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMob21sX2FkbV9zdGF0ZV92YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2FyZmNuLAorKwkJCXsgIkFSRkNOIiwgIm9tbC5mb20uYXR0ci5hcmZjbiIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9vcGVyX3N0YXRlLAorKwkJCXsgIk9wZXJhdGlvbmFsIFN0YXRlIiwgIm9tbC5mb20uYXR0ci5vcGVyX3N0YXRlIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfb3Blcl9zdGF0ZV92YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2F2YWlsX3N0YXRlLAorKwkJCXsgIkF2YWlsYWJpbGl0eSBTdGF0dXMiLCAib21sLmZvbS5hdHRyLmF2YWlsX3N0YXRlIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfYXZhaWxfc3RhdGVfdmFscyksIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9ldmVudF90eXBlLAorKwkJCXsgIkV2ZW50IFR5cGUiLCAib21sLmZvbS5hdHRyLmV2ZW50X3R5cGUiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKG9tbF9ldmVudF90eXBlX3ZhbHMpLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfc2V2ZXJpdHksCisrCQkJeyAiU2V2ZXJpdHkiLCAib21sLmZvbS5hdHRyLnNldmVyaXR5IiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfc2V2ZXJpdHlfdmFscyksIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9iY2NoX2FyZmNuLAorKwkJCXsgIkJDQ0ggQVJGQ04iLCAib21sLmZvbS5hdHRyLmJjY2hfYXJmY24iLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgICJBUkZDTiBvZiB0aGUgQkNDSCIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2JzaWMsCisrCQkJeyAiQlNJQyIsICJvbWwuZm9tLmF0dHIuYnNpYyIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfSEVYLCBOVUxMLCAwLAorKwkJCSAgIkJhc2UgU3RhdGlvbiBJZGVudGl0eSBDZG9lIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfdGVzdF9ubywKKysJCQl7ICJUZXN0IE51bWJlciIsICJvbWwuZm9tLmF0dHIudGVzdF9ubyIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMob21sX3Rlc3Rfbm9fdmFscyksIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl90c2MsCisrCQkJeyAiVFNDIiwgIm9tbC5mb20uYXR0ci50c2MiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBOVUxMLCAwLAorKwkJCSAgIlRyYWluaW5nIFNlcXVlbmNlIENvZGUiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl90ZWksCisrCQkJeyAiVEVJIiwgIm9tbC5mb20uYXR0ci50ZWkiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfYWNoX2J0c3AsCisrCQkJeyAiQlRTIEUxIFBvcnQiLCAib21sLmZvbS5hdHRyLmFiaXNfY2guYnRzX3BvcnQiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfYWNoX3RzbG90LAorKwkJCXsgIkUxIFRpbWVzbG90IiwgIm9tbC5mb20uYXR0ci5hYmlzX2NoLnRpbWVzbG90IiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2FjaF9zc2xvdCwKKysJCQl7ICJFMSBTdWJzbG90IiwgIm9tbC5mb20uYXR0ci5hYmlzX2NoLnN1YnNsb3QiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfZ3NtX3RpbWUsCisrCQkJeyAiR1NNIFRpbWUiLCAib21sLmZvbS5hdHRyLmdzbV90aW1lIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICAiR1NNIFRpbWUiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9jaGFuX2NvbWIsCisrCQkJeyAiQ2hhbm5lbCBDb21iaW5hdGlvbiIsICJvbWwuZm9tLmF0dHIuY2hhbl9jb21iIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfY2hhbl9jb21iX3ZhbHMpLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCS8qIElQIEFjY2VzcyAqLworKwkJeyAmaGZfb21sX2lwYV90cmVzX2F0dHJfdGFnLAorKwkJCXsgIklQQSBUZXN0IFJlc3VsdCBFbWJlZGRlZCBJRSIsCisrCQkJCQkJIm9tbC5mb20udGVzdHJlcC5pcGFfdGFnIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhpcGFjY190ZXN0cmVzX2llX3ZhbHMpLCAwLAorKwkJCSAgIkluZm9ybWF0aW9uIEVsZW1lbnQgZW1iZWRkZWQgaW50byB0aGUgVGVzdCBSZXN1bHQgIgorKwkJCSAgIm9mIGlwLmFjY2VzcyBCVFMiLCBIRklMTCB9LAorKwkJfSwKKysJCXsgJmhmX29tbF9pcGFfdHJlc19hdHRyX2xlbiwKKysJCQl7ICJJUEEgVGVzdCBSZXN1bHQgRW1iZWRkZWQgSUUgTGVuZ3RoIiwKKysJCQkJCQkib21sLmZvbS50ZXN0cmVwLmlwYV9sZW4iLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgICJMZW5ndGggb2YgaXAuYWNjZXNzIFRlc3QgUmVzdWx0IEVtYmVkZGVkIElFIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3Rlc3RfcmVzLAorKwkJCXsgIklQQSBUZXN0IFJlc3VsdCIsICJvbWwuZm9tLnRlc3RyZXAucmVzdWx0IiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgVkFMUyhpcGFjY190ZXN0X3Jlc192YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9yeGxldiwKKysJCQl7ICJSeCBMZXZlbCIsICJvbWwuZm9tLnRlc3RyZXAuaXBhX3J4bGV2IiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDB4ZmMwMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX2JfcnhsZXYsCisrCQkJeyAiUnggTGV2ZWwiLCAib21sLmZvbS50ZXN0cmVwLmlwYV9yeGxldl9iIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX2FyZmNuLAorKwkJCXsgIkFSRkNOIiwgIm9tbC5mb20udGVzdHJlcC5pcGFfYXJmY24iLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMHgwM2ZmLCAiQVJGQ04iLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfZl9xdWFsLAorKwkJCXsgIkZyZXF1ZW5jeSBRdWFsaXR5IiwgIm9tbC5mb20udGVzdHJlcC5pcGEuZnJlcV9xdWFsIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMHhmYywgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX2ZfZXJyLAorKwkJCXsgIkZyZXF1ZW5jeSBFcnJvciIsICJvbWwuZm9tLnRlc3RyZXAuaXBhLmZyZXFfZXJyIiwKKysJCQkgIEZUX0lOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX3J4cXVhbCwKKysJCQl7ICJSeCBRdWFsaXR5IiwgIm9tbC5mb20udGVzdHJlcC5pcGEucnhfcXVhbCIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIE5VTEwsIDB4NywgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX2ZyYW1lX29mZnMsCisrCQkJeyAiRnJhbWUgT2Zmc2V0IiwgIm9tbC5mb20udGVzdHJlcC5pcGEuZnJhbWVfb2Zmc2V0IiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9mcmFtZW5yX29mZnMsCisrCQkJeyAiRnJhbWUgTnVtYmVyIE9mZnNldCIsCisrCQkJCQkib21sLmZvbS50ZXN0cmVwLmlwYS5mcmFtZW5yX29mZnNldCIsCisrCQkJICBGVF9VSU5UMzIsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfYnNpYywKKysJCQl7ICJCU0lDIiwgIm9tbC5mb20udGVzdHJlcC5pcGEuYnNpYyIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIE5VTEwsIDB4M2YsCisrCQkJICAiQmFzZSBTdGF0aW9uIElkZW50aXR5IENvZGUiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfY2VsbF9pZCwKKysJCQl7ICJDZWxsIElEIiwgIm9tbC5mb20udGVzdHJlcC5pcGEuY2VsbF9pZCIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfSEVYLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfcnNsX2lwLAorKwkJCXsgIkJTQyBSU0wgSVAgQWRkcmVzcyIsICJvbWwuZm9tLmF0dHIuaXBhLnJzbF9pcCIsCisrCQkJICBGVF9JUHY0LCBCQVNFX05PTkUsIE5VTEwsIDAsCisrCQkJICAiSVAgQWRkcmVzcyB0byB3aGljaCB0aGUgQlRTIGVzdGFibGlzaGVzICIKKysJCQkgICJ0aGUgUlNMIGxpbmsiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfcnNsX3BvcnQsCisrCQkJeyAiQlNDIFJTTCBUQ1AgUG9ydCIsICJvbWwuZm9tLmF0dHIuaXBhLnJzbF9wb3J0IiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICAiUG9ydCBudW1iZXIgdG8gd2hpY2ggdGhlIEJTVCBlc3RhYmxpc2hlcyAiCisrCQkJICAidGhlIFJTTCBsaW5rIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3ByaW1fb21sX2lwLAorKwkJCXsgIlByaW1hcnkgT01MIElQIEFkZHJlc3MiLAorKwkJCQkJIm9tbC5mb20uYXR0ci5pcGEucHJpbV9vbWxfaXAiLAorKwkJCSAgRlRfSVB2NCwgQkFTRV9OT05FLCBOVUxMLCAwLAorKwkJCSAgIklQIEFkZHJlc3Mgb2YgdGhlIEJTQyBmb3IgdGhlIHByaW1hcnkgT01MIGxpbmsiLAorKwkJCSAgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3ByaW1fb21sX3BvcnQsCisrCQkJeyAiUHJpbWFyeSBPTUwgVENQIFBvcnQiLAorKwkJCQkJIm9tbC5mb20uYXR0ci5pcGEucHJpbV9vbWxfcG9ydCIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgIlRDUCBQb3J0IG9mIHRoZSBCU0MgZm9yIHRoZSBwcmltYXJseSBPTUwgbGluayIsCisrCQkJICBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfbG9jYXRpb25fbmFtZSwKKysJCQl7ICJMb2NhdGlvbiBOYW1lIiwgIm9tbC5mb20uYXR0ci5pcGEubG9jX25hbWUiLAorKwkJCSAgRlRfU1RSSU5HLCBCQVNFX05PTkUsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV91bml0X25hbWUsCisrCQkJeyAiVW5pdCBOYW1lIiwgIm9tbC5mb20uYXR0ci5pcGEudW5pdF9uYW1lIiwKKysJCQkgIEZUX1NUUklORywgQkFTRV9OT05FLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdW5pdF9pZCwKKysJCQl7ICJVbml0IElEIiwgIm9tbC5mb20uYXR0ci5pcGEudW5pdF9pZCIsCisrCQkJICBGVF9TVFJJTkcsIEJBU0VfTk9ORSwgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX252X2ZsYWdzLAorKwkJCXsgIk5WUkFNIENvbmZpZyBGbGFncyIsICJvbWwuZm9tLmF0dHIuaXBhLm52X2ZsYWdzIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9IRVgsIE5VTEwsIDB4ZmZmZiwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX252X21hc2ssCisrCQkJeyAiTlZSQU0gQ29uZmlnIE1hc2siLCAib21sLmZvbS5hdHRyLmlwYS5udl9tYXNrIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9IRVgsIE5VTEwsIDB4ZmZmZiwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX3NpMiwKKysJCQl7ICJTeXN0ZW0gSW5mb3JtYXRpb24gMiIsICJvbWwuZm9tLmF0dHIuaXBhLnNpMiIsCisrCQkJICBGVF9CWVRFUywgQkFTRV9OT05FLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfc2kyYmlzLAorKwkJCXsgIlN5c3RlbSBJbmZvcm1hdGlvbiAyYmlzIiwgIm9tbC5mb20uYXR0ci5pcGEuc2kyYmlzIiwKKysJCQkgIEZUX0JZVEVTLCBCQVNFX05PTkUsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9zaTJ0ZXIsCisrCQkJeyAiU3lzdGVtIEluZm9ybWF0aW9uIDJ0ZXIiLCAib21sLmZvbS5hdHRyLmlwYS5zaTJ0ZXIiLAorKwkJCSAgRlRfQllURVMsIEJBU0VfTk9ORSwgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX2NoYW5fZGVzYywKKysJCQl7ICJDZWxsIENoYW5uZWwgRGVzY3JpcHRpb24iLAorKwkJCQkJCSJvbWwuZm9tLmF0dHIuaXBhLmNoYW5fZGVzYyIsCisrCQkJICBGVF9CWVRFUywgQkFTRV9OT05FLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfbnNsX3Nwb3J0LAorKwkJCXsgIk5TIExpbmsgSVAgU291cmNlIFBvcnQiLAorKwkJCQkJCSJvbWwuZm9tLmF0dHIuaXBhLm5zbF9zcG9ydCIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfbnNsX2RhZGRyLAorKwkJCXsgIk5TIExpbmsgSVAgRGVzdGluYXRpb24gQWRkciIsCisrCQkJCQkJIm9tbC5mb20uYXR0ci5pcGEubnNsX2RhZGRyIiwKKysJCQkgIEZUX0lQdjQsIEJBU0VfTk9ORSwgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX25zbF9kcG9ydCwKKysJCQl7ICJOUyBMaW5rIElQIERlc3RpbmF0aW9uIFBvcnQiLAorKwkJCQkJCSJvbWwuZm9tLmF0dHIuaXBhLm5zbF9kcG9ydCIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfbnNlaSwKKysJCQl7ICJOU0VJIiwgIm9tbC5mb20uYXR0ci5pcGEubnNlaSIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfbnN2Y2ksCisrCQkJeyAiTlNWQ0kiLCAib21sLmZvbS5hdHRyLmlwYS5uc3ZjaSIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfYnZjaSwKKysJCQl7ICJCVkNJIiwgIm9tbC5mb20uYXR0ci5pcGEuYnZjaSIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfcmFjLAorKwkJCXsgIlJBQyIsICJvbWwuZm9tLmF0dHIuaXBhLnJhYyIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIE5VTEwsIDAsCisrCQkJICAiUm91dGluZyBBcmVhIENvZGUiLCBIRklMTCB9CisrCQl9LAorKwl9OworKwlzdGF0aWMgZ2ludCAqZXR0W10gPSB7CisrCQkmZXR0X29tbCwKKysJCSZldHRfb21sX2ZvbSwKKysJCSZldHRfb21sX2ZvbV9hdHQsCisrCX07CisrCisrCW1vZHVsZV90ICpvbWxfbW9kdWxlOworKworKwlwcm90b19hYmlzX29tbCA9IHByb3RvX3JlZ2lzdGVyX3Byb3RvY29sKCJHU00gQS1iaXMgT01MIiwgIk9NTCIsCisrCQkJCQkJICJnc21fYWJpc19vbWwiKTsKKysKKysJcHJvdG9fcmVnaXN0ZXJfZmllbGRfYXJyYXkocHJvdG9fYWJpc19vbWwsIGhmLCBhcnJheV9sZW5ndGgoaGYpKTsKKysKKysJcHJvdG9fcmVnaXN0ZXJfc3VidHJlZV9hcnJheShldHQsIGFycmF5X2xlbmd0aChldHQpKTsKKysKKysJcmVnaXN0ZXJfZGlzc2VjdG9yKCJnc21fYWJpc19vbWwiLCBkaXNzZWN0X2FiaXNfb21sLCBwcm90b19hYmlzX29tbCk7CisrCisrCisrCW9tbF9tb2R1bGUgPSBwcmVmc19yZWdpc3Rlcl9wcm90b2NvbChwcm90b19hYmlzX29tbCwgcHJvdG9fcmVnX2hhbmRvZmZfYWJpc19vbWwpOworKwlwcmVmc19yZWdpc3Rlcl9ib29sX3ByZWZlcmVuY2Uob21sX21vZHVsZSwgInVzZV9pcGFjY2Vzc19vbWwiLAorKwkJICAgICJVc2UgbmFub0JUUyBkZWZpbml0aW9ucyIsCisrCQkgICAgIlVzZSBpcGFjY2VzcyBuYW5vQlRTIHNwZWNpZmljIGRlZmluaXRpb25zIGZvciBPTUwiLAorKwkJICAgICZnbG9iYWxfb21sX3VzZV9uYW5vX2J0cyk7CisrfQorKworK3ZvaWQKKytwcm90b19yZWdfaGFuZG9mZl9hYmlzX29tbCh2b2lkKQorK3sKKysJZGlzc2VjdG9yX2hhbmRsZV90IGFiaXNfb21sX2hhbmRsZTsKKysKKysJYWJpc19vbWxfaGFuZGxlID0gY3JlYXRlX2Rpc3NlY3Rvcl9oYW5kbGUoZGlzc2VjdF9hYmlzX29tbCwgcHJvdG9fYWJpc19vbWwpOworKwlkaXNzZWN0b3JfYWRkKCJsYXBkLmdzbS5zYXBpIiwgTEFQRF9HU01fU0FQSV9PTV9QUk9DLCBhYmlzX29tbF9oYW5kbGUpOworK30KK2RpZmYgLS1naXQgYS9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWdzbV9hYmlzX29tbC5oIGIvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1nc21fYWJpc19vbWwuaAorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjk4YWViMjQKKy0tLSAvZGV2L251bGwKKysrKyBiL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtZ3NtX2FiaXNfb21sLmgKK0BAIC0wLDAgKzEsNzk4IEBACisrLyogR1NNIE5ldHdvcmsgTWFuYWdlbWVudCBtZXNzYWdlcyBvbiB0aGUgQS1iaXMgaW50ZXJmYWNlCisrICogM0dQUCBUUyAxMi4yMSB2ZXJzaW9uIDguMC4wIFJlbGVhc2UgMTk5OSAvIEVUU0kgVFMgMTAwIDYyMyBWOC4wLjAgKi8KKysKKysvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisrICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorKyAqCisrICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKysgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisrICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKysgKgorKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisrICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrICoKKysgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisrICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKysgKgorKyAqLworKworKyNpZm5kZWYgX19QQUNLRVRfQUJJU19PTUxfSF9fCisrI2RlZmluZSBfX1BBQ0tFVF9BQklTX09NTF9IX18KKysKKysjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisrCisrLyogRnJvbSBvcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9hYmlzX25tLmggKi8KKysKKysvKiBnZW5lcmljIGhlYWRlciBpbiBmcm9udCBvZiBldmVyeSBPTUwgbWVzc2FnZSBhY2NvcmRpbmcgdG8gVFMgMDguNTkgKi8KKytzdHJ1Y3QgYWJpc19vbV9oZHIgeworKwlndWludDgJbWRpc2M7CisrCWd1aW50OAlwbGFjZW1lbnQ7CisrCWd1aW50OAlzZXF1ZW5jZTsKKysJZ3VpbnQ4CWxlbmd0aDsKKysJZ3VpbnQ4CWRhdGFbMF07CisrfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisrCisrI2RlZmluZSBBQklTX09NX01ESVNDX0ZPTQkJMHg4MAorKyNkZWZpbmUgQUJJU19PTV9NRElTQ19NTUkJCTB4NDAKKysjZGVmaW5lIEFCSVNfT01fTURJU0NfVFJBVQkJMHgyMAorKyNkZWZpbmUgQUJJU19PTV9NRElTQ19NQU5VRgkJMHgxMAorKyNkZWZpbmUgQUJJU19PTV9QTEFDRU1FTlRfT05MWQkJMHg4MAorKyNkZWZpbmUgQUJJU19PTV9QTEFDRU1FTlRfRklSU1QgCTB4NDAKKysjZGVmaW5lIEFCSVNfT01fUExBQ0VNRU5UX01JRERMRQkweDIwCisrI2RlZmluZSBBQklTX09NX1BMQUNFTUVOVF9MQVNUCQkweDEwCisrCisrc3RydWN0IGFiaXNfb21fb2JqX2luc3QgeworKwlndWludDgJYnRzX25yOworKwlndWludDgJdHJ4X25yOworKwlndWludDgJdHNfbnI7CisrfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisrCisrc3RydWN0IGFiaXNfb21fZm9tX2hkciB7CisrCWd1aW50OAltc2dfdHlwZTsKKysJZ3VpbnQ4CW9ial9jbGFzczsKKysJc3RydWN0IGFiaXNfb21fb2JqX2luc3QJb2JqX2luc3Q7CisrCWd1aW50OAlkYXRhWzBdOworK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworKworKyNkZWZpbmUgQUJJU19PTV9GT01fSERSX1NJWkUJKHNpemVvZihzdHJ1Y3QgYWJpc19vbV9oZHIpICsgc2l6ZW9mKHN0cnVjdCBhYmlzX29tX2ZvbV9oZHIpKQorKworKy8qIFNlY3Rpb24gOS4xOiBNZXNzYWdlIFR5cGVzICovCisrZW51bSBhYmlzX25tX21zZ3R5cGUgeworKwkvKiBTVyBEb3dubG9hZCBNYW5hZ2VtZW50IE1lc3NhZ2VzICovCisrCU5NX01UX0xPQURfSU5JVAkJCT0gMHgwMSwKKysJTk1fTVRfTE9BRF9JTklUX0FDSywKKysJTk1fTVRfTE9BRF9JTklUX05BQ0ssCisrCU5NX01UX0xPQURfU0VHLAorKwlOTV9NVF9MT0FEX1NFR19BQ0ssCisrCU5NX01UX0xPQURfQUJPUlQsCisrCU5NX01UX0xPQURfRU5ELAorKwlOTV9NVF9MT0FEX0VORF9BQ0ssCisrCU5NX01UX0xPQURfRU5EX05BQ0ssCisrCU5NX01UX1NXX0FDVF9SRVEsCQkvKiBCVFMtPkJTQyAqLworKwlOTV9NVF9TV19BQ1RfUkVRX0FDSywKKysJTk1fTVRfU1dfQUNUX1JFUV9OQUNLLAorKwlOTV9NVF9BQ1RJVkFURV9TVywJCS8qIEJTQy0+QlRTICovCisrCU5NX01UX0FDVElWQVRFX1NXX0FDSywKKysJTk1fTVRfQUNUSVZBVEVfU1dfTkFDSywKKysJTk1fTVRfU1dfQUNUSVZBVEVEX1JFUCwJCS8qIDB4MTAgKi8KKysJLyogQS1iaXMgSW50ZXJmYWNlIE1hbmFnZW1lbnQgTWVzc2FnZXMgKi8KKysJTk1fTVRfRVNUQUJMSVNIX1RFSQkJPSAweDIxLAorKwlOTV9NVF9FU1RBQkxJU0hfVEVJX0FDSywKKysJTk1fTVRfRVNUQUJMSVNIX1RFSV9OQUNLLAorKwlOTV9NVF9DT05OX1RFUlJfU0lHTiwKKysJTk1fTVRfQ09OTl9URVJSX1NJR05fQUNLLAorKwlOTV9NVF9DT05OX1RFUlJfU0lHTl9OQUNLLAorKwlOTV9NVF9ESVNDX1RFUlJfU0lHTiwKKysJTk1fTVRfRElTQ19URVJSX1NJR05fQUNLLAorKwlOTV9NVF9ESVNDX1RFUlJfU0lHTl9OQUNLLAorKwlOTV9NVF9DT05OX1RFUlJfVFJBRiwKKysJTk1fTVRfQ09OTl9URVJSX1RSQUZfQUNLLAorKwlOTV9NVF9DT05OX1RFUlJfVFJBRl9OQUNLLAorKwlOTV9NVF9ESVNDX1RFUlJfVFJBRiwKKysJTk1fTVRfRElTQ19URVJSX1RSQUZfQUNLLAorKwlOTV9NVF9ESVNDX1RFUlJfVFJBRl9OQUNLLAorKwkvKiBUcmFuc21pc3Npb24gTWFuYWdlbWVudCBNZXNzYWdlcyAqLworKwlOTV9NVF9DT05OX01EUk9QX0xJTksJCT0gMHgzMSwKKysJTk1fTVRfQ09OTl9NRFJPUF9MSU5LX0FDSywKKysJTk1fTVRfQ09OTl9NRFJPUF9MSU5LX05BQ0ssCisrCU5NX01UX0RJU0NfTURST1BfTElOSywKKysJTk1fTVRfRElTQ19NRFJPUF9MSU5LX0FDSywKKysJTk1fTVRfRElTQ19NRFJPUF9MSU5LX05BQ0ssCisrCS8qIEFpciBJbnRlcmZhY2UgTWFuYWdlbWVudCBNZXNzYWdlcyAqLworKwlOTV9NVF9TRVRfQlRTX0FUVFIJCT0gMHg0MSwKKysJTk1fTVRfU0VUX0JUU19BVFRSX0FDSywKKysJTk1fTVRfU0VUX0JUU19BVFRSX05BQ0ssCisrCU5NX01UX1NFVF9SQURJT19BVFRSLAorKwlOTV9NVF9TRVRfUkFESU9fQVRUUl9BQ0ssCisrCU5NX01UX1NFVF9SQURJT19BVFRSX05BQ0ssCisrCU5NX01UX1NFVF9DSEFOX0FUVFIsCisrCU5NX01UX1NFVF9DSEFOX0FUVFJfQUNLLAorKwlOTV9NVF9TRVRfQ0hBTl9BVFRSX05BQ0ssCisrCS8qIFRlc3QgTWFuYWdlbWVudCBNZXNzYWdlcyAqLworKwlOTV9NVF9QRVJGX1RFU1QJCQk9IDB4NTEsCisrCU5NX01UX1BFUkZfVEVTVF9BQ0ssCisrCU5NX01UX1BFUkZfVEVTVF9OQUNLLAorKwlOTV9NVF9URVNUX1JFUCwKKysJTk1fTVRfU0VORF9URVNUX1JFUCwKKysJTk1fTVRfU0VORF9URVNUX1JFUF9BQ0ssCisrCU5NX01UX1NFTkRfVEVTVF9SRVBfTkFDSywKKysJTk1fTVRfU1RPUF9URVNULAorKwlOTV9NVF9TVE9QX1RFU1RfQUNLLAorKwlOTV9NVF9TVE9QX1RFU1RfTkFDSywKKysJLyogU3RhdGUgTWFuYWdlbWVudCBhbmQgRXZlbnQgUmVwb3J0IE1lc3NhZ2VzICovCisrCU5NX01UX1NUQVRFQ0hHX0VWRU5UX1JFUAk9IDB4NjEsCisrCU5NX01UX0ZBSUxVUkVfRVZFTlRfUkVQLAorKwlOTV9NVF9TVE9QX0VWRU5UX1JFUCwKKysJTk1fTVRfU1RPUF9FVkVOVF9SRVBfQUNLLAorKwlOTV9NVF9TVE9QX0VWRU5UX1JFUF9OQUNLLAorKwlOTV9NVF9SRVNUX0VWRU5UX1JFUCwKKysJTk1fTVRfUkVTVF9FVkVOVF9SRVBfQUNLLAorKwlOTV9NVF9SRVNUX0VWRU5UX1JFUF9OQUNLLAorKwlOTV9NVF9DSEdfQURNX1NUQVRFLAorKwlOTV9NVF9DSEdfQURNX1NUQVRFX0FDSywKKysJTk1fTVRfQ0hHX0FETV9TVEFURV9OQUNLLAorKwlOTV9NVF9DSEdfQURNX1NUQVRFX1JFUSwKKysJTk1fTVRfQ0hHX0FETV9TVEFURV9SRVFfQUNLLAorKwlOTV9NVF9DSEdfQURNX1NUQVRFX1JFUV9OQUNLLAorKwlOTV9NVF9SRVBfT1VUU1RfQUxBUk1TCQk9IDB4OTMsCisrCU5NX01UX1JFUF9PVVRTVF9BTEFSTVNfQUNLLAorKwlOTV9NVF9SRVBfT1VUU1RfQUxBUk1TX05BQ0ssCisrCS8qIEVxdWlwbWVudCBNYW5hZ2VtZW50IE1lc3NhZ2VzICovCisrCU5NX01UX0NIQU5HRU9WRVIJCT0gMHg3MSwKKysJTk1fTVRfQ0hBTkdFT1ZFUl9BQ0ssCisrCU5NX01UX0NIQU5HRU9WRVJfTkFDSywKKysJTk1fTVRfT1BTVEFSVCwKKysJTk1fTVRfT1BTVEFSVF9BQ0ssCisrCU5NX01UX09QU1RBUlRfTkFDSywKKysJTk1fTVRfUkVJTklULAorKwlOTV9NVF9SRUlOSVRfQUNLLAorKwlOTV9NVF9SRUlOSVRfTkFDSywKKysJTk1fTVRfU0VUX1NJVEVfT1VULAkJLyogQlMxMTogZ2V0IGFsYXJtID8hPyAqLworKwlOTV9NVF9TRVRfU0lURV9PVVRfQUNLLAorKwlOTV9NVF9TRVRfU0lURV9PVVRfTkFDSywKKysJTk1fTVRfQ0hHX0hXX0NPTkYJCT0gMHg5MCwKKysJTk1fTVRfQ0hHX0hXX0NPTkZfQUNLLAorKwlOTV9NVF9DSEdfSFdfQ09ORl9OQUNLLAorKwkvKiBNZWFzdXJlbWVudCBNYW5hZ2VtZW50IE1lc3NhZ2VzICovCisrCU5NX01UX01FQVNfUkVTX1JFUQkJPSAweDhhLAorKwlOTV9NVF9NRUFTX1JFU19SRVNQLAorKwlOTV9NVF9TVE9QX01FQVMsCisrCU5NX01UX1NUQVJUX01FQVMsCisrCS8qIE90aGVyIE1lc3NhZ2VzICovCisrCU5NX01UX0dFVF9BVFRSCQkJPSAweDgxLAorKwlOTV9NVF9HRVRfQVRUUl9SRVNQLAorKwlOTV9NVF9HRVRfQVRUUl9OQUNLLAorKwlOTV9NVF9TRVRfQUxBUk1fVEhSRVMsCisrCU5NX01UX1NFVF9BTEFSTV9USFJFU19BQ0ssCisrCU5NX01UX1NFVF9BTEFSTV9USFJFU19OQUNLLAorKworKwlOTV9NVF9JUEFDQ19SRVNUQVJUCQk9IDB4ODcsCisrCU5NX01UX0lQQUNDX1JFU1RBUlRfQUNLLAorK307CisrCisrZW51bSBhYmlzX25tX21zZ3R5cGVfYnMxMSB7CisrCU5NX01UX0JTMTFfUkVTRVRfUkVTT1VSQ0UJPSAweDc0LAorKworKwlOTV9NVF9CUzExX0JFR0lOX0RCX1RYCQk9IDB4YTMsCisrCU5NX01UX0JTMTFfQkVHSU5fREJfVFhfQUNLLAorKwlOTV9NVF9CUzExX0JFR0lOX0RCX1RYX05BQ0ssCisrCU5NX01UX0JTMTFfRU5EX0RCX1RYCQk9IDB4YTYsCisrCU5NX01UX0JTMTFfRU5EX0RCX1RYX0FDSywKKysJTk1fTVRfQlMxMV9FTkRfREJfVFhfTkFDSywKKysJTk1fTVRfQlMxMV9DUkVBVEVfT0JKCQk9IDB4YTksCisrCU5NX01UX0JTMTFfQ1JFQVRFX09CSl9BQ0ssCisrCU5NX01UX0JTMTFfQ1JFQVRFX09CSl9OQUNLLAorKwlOTV9NVF9CUzExX0RFTEVURV9PQkoJCT0gMHhhYywKKysJTk1fTVRfQlMxMV9ERUxFVEVfT0JKX0FDSywKKysJTk1fTVRfQlMxMV9ERUxFVEVfT0JKX05BQ0ssCisrCisrCU5NX01UX0JTMTFfU0VUX0FUVFIJCT0gMHhkMCwKKysJTk1fTVRfQlMxMV9TRVRfQVRUUl9BQ0ssCisrCU5NX01UX0JTMTFfU0VUX0FUVFJfTkFDSywKKysJTk1fTVRfQlMxMV9MTVRfU0VTU0lPTgkJPSAweGRjLAorKworKwlOTV9NVF9CUzExX0dFVF9TVEFURQkJPSAweGUzLAorKwlOTV9NVF9CUzExX0dFVF9TVEFURV9BQ0ssCisrCU5NX01UX0JTMTFfTE1UX0xPR09OCQk9IDB4ZTUsCisrCU5NX01UX0JTMTFfTE1UX0xPR09OX0FDSywKKysJTk1fTVRfQlMxMV9SRVNUQVJUCQk9IDB4ZTcsCisrCU5NX01UX0JTMTFfUkVTVEFSVF9BQ0ssCisrCU5NX01UX0JTMTFfRElTQ09OTkVDVAkJPSAweGU5LAorKwlOTV9NVF9CUzExX0RJU0NPTk5FQ1RfQUNLLAorKwlOTV9NVF9CUzExX0xNVF9MT0dPRkYJCT0gMHhlYywKKysJTk1fTVRfQlMxMV9MTVRfTE9HT0ZGX0FDSywKKysJTk1fTVRfQlMxMV9SRUNPTk5FQ1QJCT0gMHhmMSwKKysJTk1fTVRfQlMxMV9SRUNPTk5FQ1RfQUNLLAorK307CisrCisrZW51bSBhYmlzX25tX21zZ3R5cGVfaXBhY2MgeworKwlOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVAkJPSAweGUwLAorKwlOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVF9BQ0ssCisrCU5NX01UX0lQQUNDX1JTTF9DT05ORUNUX05BQ0ssCisrCU5NX01UX0lQQUNDX1JTTF9ESVNDT05ORUNUCT0gMHhlMywKKysJTk1fTVRfSVBBQ0NfUlNMX0RJU0NPTk5FQ1RfQUNLLAorKwlOTV9NVF9JUEFDQ19SU0xfRElTQ09OTkVDVF9OQUNLLAorKwlOTV9NVF9JUEFDQ19DT05OX1RSQUYJCT0gMHhlNiwKKysJTk1fTVRfSVBBQ0NfQ09OTl9UUkFGX0FDSywKKysJTk1fTVRfSVBBQ0NfQ09OTl9UUkFGX05BQ0ssCisrCU5NX01UX0lQQUNDX0RJU0NfVFJBRgkJPSAweGU5LAorKwlOTV9NVF9JUEFDQ19ESVNDX1RSQUZfQUNLLAorKwlOTV9NVF9JUEFDQ19ESVNDX1RSQUZfTkFDSywKKysJTk1fTVRfSVBBQ0NfREVGX0JPT1RfU1cJCT0gMHhlYywKKysJTk1fTVRfSVBBQ0NfREVGX0JPT1RfU1dfQUNLLAorKwlOTV9NVF9JUEFDQ19ERUZfQk9PVF9TV19OQUNLLAorKwlOTV9NVF9JUEFDQ19TRVRfTlZBVFRSCQk9IDB4ZWYsCisrCU5NX01UX0lQQUNDX1NFVF9OVkFUVFJfQUNLLAorKwlOTV9NVF9JUEFDQ19TRVRfTlZBVFRSX05BQ0ssCisrCU5NX01UX0lQQUNDX0dFVF9OVkFUVFIJCT0gMHhmMiwKKysJTk1fTVRfSVBBQ0NfR0VUX05WQVRUUl9BQ0ssCisrCU5NX01UX0lQQUNDX0dFVF9OVkFUVFJfTkFDSywKKysJTk1fTVRfSVBBQ0NfU0VUX0FUVFIJCT0gMHhmNSwKKysJTk1fTVRfSVBBQ0NfU0VUX0FUVFJfQUNLLAorKwlOTV9NVF9JUEFDQ19TRVRfQVRUUl9OQUNLLAorKwlOTV9NVF9JUEFDQ19BVFRSX0NIR19FVlQJPSAweGY4LAorKwlOTV9NVF9JUEFDQ19TV19ERUFDVAkJPSAweGY5LAorKwlOTV9NVF9JUEFDQ19TV19ERUFDVF9BQ0ssCisrCU5NX01UX0lQQUNDX1NXX0RFQUNUX05BQ0ssCisrCU5NX01UX0lQQUNDX01FQVNfUkVTX1JFUV9OQUNLCT0gMHhmYywKKysJTk1fTVRfSVBBQ0NfU1RBUlRfTUVBU19OQUNLLAorKwlOTV9NVF9JUEFDQ19TVE9QX01FQVNfTkFDSywKKyt9OworKworK2VudW0gYWJpc19ubV9iczExX2NlbGxfYWxsb2MgeworKwlOTV9CUzExX0NBTlJfR1NNCT0gMHgwMCwKKysJTk1fQlMxMV9DQU5SX0RDUzE4MDAJPSAweDAxLAorK307CisrCisrLyogU2VjdGlvbiA5LjI6IE9iamVjdCBDbGFzcyAqLworK2VudW0gYWJpc19ubV9vYmpfY2xhc3MgeworKwlOTV9PQ19TSVRFX01BTkFHRVIJCT0gMHgwMCwKKysJTk1fT0NfQlRTLAorKwlOTV9PQ19SQURJT19DQVJSSUVSLAorKwlOTV9PQ19DSEFOTkVMLAorKwlOTV9PQ19CQVNFQl9UUkFOU0MsCisrCS8qIFJGVTogMDUtRkUgKi8KKysJTk1fT0NfQlMxMV9BREpDCQkJPSAweGEwLAorKwlOTV9PQ19CUzExX0hBTkRPVkVSCQk9IDB4YTEsCisrCU5NX09DX0JTMTFfUFdSX0NUUkwJCT0gMHhhMiwKKysJTk1fT0NfQlMxMV9CVFNFCQkJPSAweGEzLAkJLyogTE1UPyAqLworKwlOTV9PQ19CUzExX1JBQ0sJCQk9IDB4YTQsCisrCU5NX09DX0JTMTEJCQk9IDB4YTUsCQkvKiAwMTogQUxDTyAqLworKwlOTV9PQ19CUzExX1RFU1QJCQk9IDB4YTYsCisrCU5NX09DX0JTMTFfRU5WQUJUU0UJCT0gMHhhOCwKKysJTk1fT0NfQlMxMV9CUE9SVAkJPSAweGE5LAorKworKwlOTV9PQ19HUFJTX05TRQkJCT0gMHhmMCwKKysJTk1fT0NfR1BSU19DRUxMCQkJPSAweGYxLAorKwlOTV9PQ19HUFJTX05TVkMwCQk9IDB4ZjIsCisrCU5NX09DX0dQUlNfTlNWQzEJCT0gMHhmMywKKysKKysJTk1fT0NfTlVMTAkJCT0gMHhmZiwKKyt9OworKworKy8qIFNlY3Rpb24gOS40OiBBdHRyaWJ1dGVzICovCisrZW51bSBhYmlzX25tX2F0dHIgeworKwlOTV9BVFRfQUJJU19DSEFOTkVMCT0gMHgwMSwKKysJTk1fQVRUX0FERF9JTkZPLAorKwlOTV9BVFRfQUREX1RFWFQsCisrCU5NX0FUVF9BRE1fU1RBVEUsCisrCU5NX0FUVF9BUkZDTl9MSVNULAorKwlOTV9BVFRfQVVUT05fUkVQT1JULAorKwlOTV9BVFRfQVZBSUxfU1RBVFVTLAorKwlOTV9BVFRfQkNDSF9BUkZDTiwKKysJTk1fQVRUX0JTSUMsCisrCU5NX0FUVF9CVFNfQUlSX1RJTUVSLAorKwlOTV9BVFRfQ0NDSF9MX0lfUCwKKysJTk1fQVRUX0NDQ0hfTF9ULAorKwlOTV9BVFRfQ0hBTl9DT01CLAorKwlOTV9BVFRfQ09OTl9GQUlMX0NSSVQsCisrCU5NX0FUVF9ERVNULAorKwkvKiByZXMgKi8KKysJTk1fQVRUX0VWRU5UX1RZUEUJPSAweDExLCAvKiBCUzExOiBmaWxlIGRhdGEgPyE/ICovCisrCU5NX0FUVF9GSUxFX0lELAorKwlOTV9BVFRfRklMRV9WRVJTSU9OLAorKwlOTV9BVFRfR1NNX1RJTUUsCisrCU5NX0FUVF9IU04sCisrCU5NX0FUVF9IV19DT05GSUcsCisrCU5NX0FUVF9IV19ERVNDLAorKwlOTV9BVFRfSU5UQVZFX1BBUkFNLAorKwlOTV9BVFRfSU5URVJGX0JPVU5ELAorKwlOTV9BVFRfTElTVF9SRVFfQVRUUiwKKysJTk1fQVRUX01BSU8sCisrCU5NX0FUVF9NQU5VRl9TVEFURSwKKysJTk1fQVRUX01BTlVGX1RIUkVTSCwKKysJTk1fQVRUX01BTlVGX0lELAorKwlOTV9BVFRfTUFYX1RBLAorKwlOTV9BVFRfTURST1BfTElOSywJLyogMHgyMCAqLworKwlOTV9BVFRfTURST1BfTkVYVCwKKysJTk1fQVRUX05BQ0tfQ0FVU0VTLAorKwlOTV9BVFRfTlkxLAorKwlOTV9BVFRfT1BFUl9TVEFURSwKKysJTk1fQVRUX09WRVJMX1BFUklPRCwKKysJTk1fQVRUX1BIWVNfQ09ORiwKKysJTk1fQVRUX1BPV0VSX0NMQVNTLAorKwlOTV9BVFRfUE9XRVJfVEhSRVNILAorKwlOTV9BVFRfUFJPQl9DQVVTRSwKKysJTk1fQVRUX1JBQ0hfQl9USFJFU0gsCisrCU5NX0FUVF9MREFWR19TTE9UUywKKysJTk1fQVRUX1JBRF9TVUJDLAorKwlOTV9BVFRfUkZfTUFYUE9XUl9SLAorKwlOTV9BVFRfU0lURV9JTlBVVFMsCisrCU5NX0FUVF9TSVRFX09VVFBVVFMsCisrCU5NX0FUVF9TT1VSQ0UsCQkvKiAweDMwICovCisrCU5NX0FUVF9TUEVDX1BST0IsCisrCU5NX0FUVF9TVEFSVF9USU1FLAorKwlOTV9BVFRfVDIwMCwKKysJTk1fQVRUX1RFSSwKKysJTk1fQVRUX1RFU1RfRFVSLAorKwlOTV9BVFRfVEVTVF9OTywKKysJTk1fQVRUX1RFU1RfUkVQT1JULAorKwlOTV9BVFRfVlNXUl9USFJFU0gsCisrCU5NX0FUVF9XSU5ET1dfU0laRSwKKysJLyogUmVzICAqLworKwlOTV9BVFRfQlMxMV9SU1NJX09GRlMJPSAweDNkLAorKwlOTV9BVFRfQlMxMV9UWFBXUgk9IDB4M2UsCisrCU5NX0FUVF9CUzExX0RJVkVSU0lUWQk9IDB4M2YsCisrCS8qIFJlcyAgKi8KKysJTk1fQVRUX1RTQwkJPSAweDQwLAorKwlOTV9BVFRfU1dfQ09ORklHLAorKwlOTV9BVFRfU1dfREVTQ1IsCisrCU5NX0FUVF9TRVZFUklUWSwKKysJTk1fQVRUX0dFVF9BUkksCisrCU5NX0FUVF9IV19DT05GX0NIRywKKysJTk1fQVRUX09VVFNUX0FMQVJNLAorKwlOTV9BVFRfRklMRV9EQVRBLAorKwlOTV9BVFRfTUVBU19SRVMsCisrCU5NX0FUVF9NRUFTX1RZUEUsCisrCisrCU5NX0FUVF9CUzExX0VTTl9GV19DT0RFX05PCT0gMHg0YywKKysJTk1fQVRUX0JTMTFfRVNOX0hXX0NPREVfTk8JPSAweDRmLAorKworKwlOTV9BVFRfQlMxMV9FU05fUENCX1NFUklBTAk9IDB4NTUsCisrCU5NX0FUVF9CUzExX0VYQ0VTU0lWRV9ESVNUQU5DRQk9IDB4NTgsCisrCisrCU5NX0FUVF9CUzExX0FMTF9URVNUX0NBVEcJPSAweDYwLAorKwlOTV9BVFRfQlMxMV9CVFNMU19IT1BQSU5HLAorKwlOTV9BVFRfQlMxMV9DRUxMX0FMTE9DX05SLAorKwlOTV9BVFRfQlMxMV9DRUxMX0dMT0JBTF9JRCwKKysJTk1fQVRUX0JTMTFfRU5BX0lOVEVSRl9DTEFTUwk9IDB4NjYsCisrCU5NX0FUVF9CUzExX0VOQV9JTlRfSU5URUNfSEFORE8JPSAweDY3LAorKwlOTV9BVFRfQlMxMV9FTkFfSU5UX0lOVFJDX0hBTkRPCT0gMHg2OCwKKysJTk1fQVRUX0JTMTFfRU5BX01TX1BXUl9DVFJMCT0gMHg2OSwKKysJTk1fQVRUX0JTMTFfRU5BX1BXUl9CREdUX0hPCT0gMHg2YSwKKysJTk1fQVRUX0JTMTFfRU5BX1BXUl9DVFJMX1JMRlcJPSAweDZiLAorKwlOTV9BVFRfQlMxMV9FTkFfUlhMRVZfSE8JPSAweDZjLAorKwlOTV9BVFRfQlMxMV9FTkFfUlhRVUFMX0hPCT0gMHg2ZCwKKysJTk1fQVRUX0JTMTFfRkFDQ0hfUVVBTAkJPSAweDZlLAorKworKwlOTV9BVFRfSVBBQ0NfRFNUX0lQCQk9IDB4ODAsCisrCU5NX0FUVF9JUEFDQ19EU1RfSVBfUE9SVAk9IDB4ODEsCisrCU5NX0FUVF9JUEFDQ19TU1JDCQk9IDB4ODIsCQkvKiBSVFAgU3luYyBTb3VyY2UgKi8KKysJTk1fQVRUX0lQQUNDX1JUUF9QQVlMRF9UWVBFCT0gMHg4MywKKysJTk1fQVRUX0lQQUNDX0JBU0VCX0lECQk9IDB4ODQsCisrCU5NX0FUVF9JUEFDQ19TVFJFQU1fSUQJCT0gMHg4NSwKKysJTk1fQVRUX0lQQUNDX05WX0ZMQUdTCQk9IDB4ODYsCisrCU5NX0FUVF9JUEFDQ19GUkVRX0NUUkwJCT0gMHg4NywKKysJTk1fQVRUX0lQQUNDX1BSSU1fT01MX0NGRwk9IDB4ODgsCisrCU5NX0FUVF9JUEFDQ19TRUNfT01MX0NGRwk9IDB4ODksCisrCU5NX0FUVF9JUEFDQ19JUF9JRl9DRkcJCT0gMHg4YSwJCS8qIElQIGludGVyZmFjZSAqLworKwlOTV9BVFRfSVBBQ0NfSVBfR1dfQ0ZHCQk9IDB4OGIsCQkvKiBJUCBnYXRld2F5ICovCisrCU5NX0FUVF9JUEFDQ19JTl9TRVJWX1RJTUUJPSAweDhjLAorKwlOTV9BVFRfSVBBQ0NfVFJYX0JUU19BU1MJPSAweDhkLAorKwlOTV9BVFRfSVBBQ0NfTE9DQVRJT04JCT0gMHg4ZSwJCS8qIHN0cmluZyBkZXNjcmliaW5nIGxvY2F0aW9uICovCisrCU5NX0FUVF9JUEFDQ19QQUdJTkdfQ0ZHCQk9IDB4OGYsCisrCU5NX0FUVF9JUEFDQ19GSUxFX0RBVEEJCT0gMHg5MCwKKysJTk1fQVRUX0lQQUNDX1VOSVRfSUQJCT0gMHg5MSwJCS8qIFNpdGUvQlRTL1RSWCAqLworKwlOTV9BVFRfSVBBQ0NfUEFSRU5UX1VOSVRfSUQJPSAweDkyLAorKwlOTV9BVFRfSVBBQ0NfVU5JVF9OQU1FCQk9IDB4OTMsCQkvKiBkZWZhdWx0OiBuYnRzLTxtYWMtYXMtc3RyaW5nPiAqLworKwlOTV9BVFRfSVBBQ0NfU05NUF9DRkcJCT0gMHg5NCwKKysJTk1fQVRUX0lQQUNDX1BSSU1fT01MX0NGR19MSVNUCT0gMHg5NSwKKysJTk1fQVRUX0lQQUNDX1BSSU1fT01MX0ZCX1RPVVQJPSAweDk2LAkJLyogZmFsbGJhY2sgdGltZW91dCAqLworKwlOTV9BVFRfSVBBQ0NfQ1VSX1NXX0NGRwkJPSAweDk3LAorKwlOTV9BVFRfSVBBQ0NfVElNSU5HX0JVUwkJPSAweDk4LAorKwlOTV9BVFRfSVBBQ0NfQ0dJCQk9IDB4OTksCQkvKiBDZWxsIEdsb2JhbCBJRCAqLworKwlOTV9BVFRfSVBBQ0NfUkFDCQk9IDB4OWEsCisrCU5NX0FUVF9JUEFDQ19PQkpfVkVSU0lPTgk9IDB4OWIsCisrCU5NX0FUVF9JUEFDQ19HUFJTX1BBR0lOR19DRkcJPSAweDljLAorKwlOTV9BVFRfSVBBQ0NfTlNFSQkJPSAweDlkLAorKwlOTV9BVFRfSVBBQ0NfQlZDSQkJPSAweDllLAorKwlOTV9BVFRfSVBBQ0NfTlNWQ0kJCT0gMHg5ZiwKKysJTk1fQVRUX0lQQUNDX05TX0NGRwkJPSAweGEwLAorKwlOTV9BVFRfSVBBQ0NfQlNTR1BfQ0ZHCQk9IDB4YTEsCisrCU5NX0FUVF9JUEFDQ19OU19MSU5LX0NGRwk9IDB4YTIsCisrCU5NX0FUVF9JUEFDQ19STENfQ0ZHCQk9IDB4YTMsCisrCU5NX0FUVF9JUEFDQ19BTE1fVEhSRVNIX0xJU1QJPSAweGE0LAorKwlOTV9BVFRfSVBBQ0NfTU9OSVRfVkFMX0xJU1QJPSAweGE1LAorKwlOTV9BVFRfSVBBQ0NfVElCX0NPTlRST0wJPSAweGE2LAorKwlOTV9BVFRfSVBBQ0NfU1VQUF9GRUFUVVJFUwk9IDB4YTcsCisrCU5NX0FUVF9JUEFDQ19DT0RJTkdfU0NIRU1FUwk9IDB4YTgsCisrCU5NX0FUVF9JUEFDQ19STENfQ0ZHXzIJCT0gMHhhOSwKKysJTk1fQVRUX0lQQUNDX0hFQVJUQl9UT1VUCT0gMHhhYSwKKysJTk1fQVRUX0lQQUNDX1VQVElNRQkJPSAweGFiLAorKwlOTV9BVFRfSVBBQ0NfUkxDX0NGR18zCQk9IDB4YWMsCisrCU5NX0FUVF9JUEFDQ19TU0xfQ0ZHCQk9IDB4YWQsCisrCU5NX0FUVF9JUEFDQ19TRUNfUE9TU0lCTEUJPSAweGFlLAorKwlOTV9BVFRfSVBBQ0NfSU1MX1NTTF9TVEFURQk9IDB4YWYsCisrCU5NX0FUVF9JUEFDQ19SRVZPQ19EQVRFCQk9IDB4YjAsCisrCisrCisrCU5NX0FUVF9CUzExX1JGX1JFU19JTkRfUEVSCT0gMHg4ZiwKKysKKysJTk1fQVRUX0JTMTFfUlhfTEVWX01JTl9DRUxMCT0gMHg5MCwKKysJTk1fQVRUX0JTMTFfQUJJU19FWFRfVElNRQk9IDB4OTEsCisrCU5NX0FUVF9CUzExX1RJTUVSX0hPX1JFUVVFU1QJPSAweDkyLAorKwlOTV9BVFRfQlMxMV9USU1FUl9OQ0VMTAkJPSAweDkzLAorKwlOTV9BVFRfQlMxMV9UU1lOQwkJPSAweDk0LAorKwlOTV9BVFRfQlMxMV9UVFJBVQkJPSAweDk1LAorKwlOTV9BVFRfQlMxMV9FTVJHX0NGR19NRU1CRVIJPSAweDliLAorKwlOTV9BVFRfQlMxMV9UUlhfQVJFQQkJPSAweDlmLAorKworKwlOTV9BVFRfQlMxMV9CQ0NIX1JFQ09ORgkJPSAweGQ3LAorKwlOTV9BVFRfQlMxMV9CSVRfRVJSX1RIRVNICT0gMHhhMCwKKysJTk1fQVRUX0JTMTFfQk9PVF9TV19WRVJTCT0gMHhhMSwKKysJTk1fQVRUX0JTMTFfQ0NMS19BQ0NVUkFDWQk9IDB4YTMsCisrCU5NX0FUVF9CUzExX0NDTEtfVFlQRQkJPSAweGE0LAorKwlOTV9BVFRfQlMxMV9JTlBfSU1QRURBTkNFCT0gMHhhYSwKKysJTk1fQVRUX0JTMTFfTDFfUFJPVF9UWVBFCT0gMHhhYiwKKysJTk1fQVRUX0JTMTFfTElORV9DRkcJCT0gMHhhYywKKysJTk1fQVRUX0JTMTFfTElfUE9SVF8xCQk9IDB4YWQsCisrCU5NX0FUVF9CUzExX0xJX1BPUlRfMgkJPSAweGFlLAorKworKwlOTV9BVFRfQlMxMV9MMV9SRU1fQUxNX1RZUEUJPSAweGIwLAorKwlOTV9BVFRfQlMxMV9TV19MT0FEX0lOVEVOREVECT0gMHhiYiwKKysJTk1fQVRUX0JTMTFfU1dfTE9BRF9TQUZFVFkJPSAweGJjLAorKwlOTV9BVFRfQlMxMV9TV19MT0FEX1NUT1JFRAk9IDB4YmQsCisrCisrCU5NX0FUVF9CUzExX1ZFTkRPUl9OQU1FCQk9IDB4YzEsCisrCU5NX0FUVF9CUzExX0hPUFBJTkdfTU9ERQk9IDB4YzUsCisrCU5NX0FUVF9CUzExX0xNVF9MT0dPTl9TRVNTSU9OCT0gMHhjNiwKKysJTk1fQVRUX0JTMTFfTE1UX0xPR0lOX1RJTUUJPSAweGM3LAorKwlOTV9BVFRfQlMxMV9MTVRfVVNFUl9BQ0NfTEVWCT0gMHhjOCwKKysJTk1fQVRUX0JTMTFfTE1UX1VTRVJfTkFNRQk9IDB4YzksCisrCisrCU5NX0FUVF9CUzExX0wxX0NPTlRST0xfVFMJPSAweGQ4LAorKwlOTV9BVFRfQlMxMV9SQURJT19NRUFTX0dSQU4JPSAweGRjLAkvKiBpbiBTQUNDSCBtdWx0aWZyYW1lcyAqLworKwlOTV9BVFRfQlMxMV9SQURJT19NRUFTX1JFUAk9IDB4ZGQsCisrCisrCU5NX0FUVF9CUzExX1NIX0xBUERfSU5UX1RJTUVSCT0gMHhlOCwKKysKKysJTk1fQVRUX0JTMTFfQlRTX1NUQVRFCQk9IDB4ZjAsCisrCU5NX0FUVF9CUzExX0UxX1NUQVRFCQk9IDB4ZjEsCisrCU5NX0FUVF9CUzExX1BMTAkJCT0gMHhmMiwKKysJTk1fQVRUX0JTMTFfUlhfT0ZGU0VUCQk9IDB4ZjMsCisrCU5NX0FUVF9CUzExX0FOVF9UWVBFCQk9IDB4ZjQsCisrCU5NX0FUVF9CUzExX1BMTF9NT0RFCQk9IDB4ZmMsCisrCU5NX0FUVF9CUzExX1BBU1NXT1JECQk9IDB4ZmQsCisrfTsKKysjZGVmaW5lIE5NX0FUVF9CUzExX0ZJTEVfREFUQQlOTV9BVFRfRVZFTlRfVFlQRQorKworKy8qIFNlY3Rpb24gOS40LjQ6IEFkbWluaXN0cmF0aXZlIFN0YXRlICovCisrZW51bSBhYmlzX25tX2FkbV9zdGF0ZSB7CisrCU5NX1NUQVRFX0xPQ0tFRAkJPSAweDAxLAorKwlOTV9TVEFURV9VTkxPQ0tFRAk9IDB4MDIsCisrCU5NX1NUQVRFX1NIVVRET1dOCT0gMHgwMywKKysJTk1fU1RBVEVfTlVMTAkJPSAweGZmLAorK307CisrCisrLyogU2VjdGlvbiA5LjQuMTM6IENoYW5uZWwgQ29tYmluYXRpb24gKi8KKytlbnVtIGFiaXNfbm1fY2hhbl9jb21iIHsKKysJTk1fQ0hBTkNfVENIRnVsbAk9IDB4MDAsCisrCU5NX0NIQU5DX1RDSEhhbGYJPSAweDAxLAorKwlOTV9DSEFOQ19UQ0hIYWxmMgk9IDB4MDIsCisrCU5NX0NIQU5DX1NEQ0NICQk9IDB4MDMsCisrCU5NX0NIQU5DX21haW5CQ0NICT0gMHgwNCwKKysJTk1fQ0hBTkNfQkNDSENvbWIJPSAweDA1LAorKwlOTV9DSEFOQ19CQ0NICQk9IDB4MDYsCisrCU5NX0NIQU5DX0JDQ0hfQ0JDSAk9IDB4MDcsCisrCU5NX0NIQU5DX1NEQ0NIX0NCQ0gJPSAweDA4LAorK307CisrCisrLyogU2VjdGlvbiA5LjQuMTY6IEV2ZW50IFR5cGUgKi8KKytlbnVtIGFiaXNfbm1fZXZlbnRfdHlwZSB7CisrCU5NX0VWVF9DT01NX0ZBSUwJPSAweDAwLAorKwlOTV9FVlRfUU9TX0ZBSUwJCT0gMHgwMSwKKysJTk1fRVZUX1BST0NfRkFJTAk9IDB4MDIsCisrCU5NX0VWVF9FUVVJUF9GQUlMCT0gMHgwMywKKysJTk1fRVZUX0VOVl9GQUlMCQk9IDB4MDQsCisrfTsKKysKKysvKiBTZWN0aW9uOiA5LjQuNjM6IFBlcmNlaXZlZCBTZXZlcml0eSAqLworK2VudW0gYWJpc19ubV9zZXZlcml0eSB7CisrCU5NX1NFVkVSX0NFQVNFRAkJPSAweDAwLAorKwlOTV9TRVZFUl9DUklUSUNBTAk9IDB4MDEsCisrCU5NX1NFVkVSX01BSk9SCQk9IDB4MDIsCisrCU5NX1NFVkVSX01JTk9SCQk9IDB4MDMsCisrCU5NX1NFVkVSX1dBUk5JTkcJPSAweDA0LAorKwlOTV9TRVZFUl9JTkRFVEVSTUlOQVRFCT0gMHgwNSwKKyt9OworKworKy8qIFNlY3Rpb24gOS40LjQzOiBQcm9iYWJsZSBDYXVzZSBUeXBlICovCisrZW51bSBhYmlzX25tX3BjYXVzZV90eXBlIHsKKysJTk1fUENBVVNFX1RfWDcyMQk9IDB4MDEsCisrCU5NX1BDQVVTRV9UX0dTTQkJPSAweDAyLAorKwlOTV9QQ0FVU0VfVF9NQU5VRgk9IDB4MDMsCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNC4zNjogTkFDSyBDYXVzZXMgKi8KKytlbnVtIGFiaXNfbm1fbmFja19jYXVzZSB7CisrCS8qIEdlbmVyYWwgTmFjayBDYXVzZXMgKi8KKysJTk1fTkFDS19JTkNPUlJfU1RSVUNUCQk9IDB4MDEsCisrCU5NX05BQ0tfTVNHVFlQRV9JTlZBTAkJPSAweDAyLAorKwlOTV9OQUNLX09CSkNMQVNTX0lOVkFMCQk9IDB4MDUsCisrCU5NX05BQ0tfT0JKQ0xBU1NfTk9UU1VQUAk9IDB4MDYsCisrCU5NX05BQ0tfQlRTTlJfVU5LTgkJPSAweDA3LAorKwlOTV9OQUNLX1RSWE5SX1VOS04JCT0gMHgwOCwKKysJTk1fTkFDS19PQkpJTlNUX1VOS04JCT0gMHgwOSwKKysJTk1fTkFDS19BVFRSSURfSU5WQUwJCT0gMHgwYywKKysJTk1fTkFDS19BVFRSSURfTk9UU1VQUAkJPSAweDBkLAorKwlOTV9OQUNLX1BBUkFNX1JBTkdFCQk9IDB4MGUsCisrCU5NX05BQ0tfQVRUUkxJU1RfSU5DT05TSVNURU5UCT0gMHgwZiwKKysJTk1fTkFDS19TUEVDX0lNUExfTk9UU1VQUAk9IDB4MTAsCisrCU5NX05BQ0tfQ0FOVF9QRVJGT1JNCQk9IDB4MTEsCisrCS8qIFNwZWNpZmljIE5hY2sgQ2F1c2VzICovCisrCU5NX05BQ0tfUkVTX05PVElNUEwJCT0gMHgxOSwKKysJTk1fTkFDS19SRVNfTk9UQVZBSUwJCT0gMHgxYSwKKysJTk1fTkFDS19GUkVRX05PVEFWQUlMCQk9IDB4MWIsCisrCU5NX05BQ0tfVEVTVF9OT1RTVVBQCQk9IDB4MWMsCisrCU5NX05BQ0tfQ0FQQUNJVFlfUkVTVFIJCT0gMHgxZCwKKysJTk1fTkFDS19QSFlTQ0ZHX05PVFBFUkZPUk0JPSAweDFlLAorKwlOTV9OQUNLX1RFU1RfTk9USU5JVAkJPSAweDFmLAorKwlOTV9OQUNLX1BIWVNDRkdfTk9UUkVTVE9SRQk9IDB4MjAsCisrCU5NX05BQ0tfVEVTVF9OT1NVQ0gJCT0gMHgyMSwKKysJTk1fTkFDS19URVNUX05PU1RPUAkJPSAweDIyLAorKwlOTV9OQUNLX01TR0lOQ09OU0lTVF9QSFlTQ0ZHCT0gMHgyMywKKysJTk1fTkFDS19GSUxFX0lOQ09NUExFVEUJCT0gMHgyNSwKKysJTk1fTkFDS19GSUxFX05PVEFWQUlMCQk9IDB4MjYsCisrCU5NX05BQ0tfRklMRV9OT1RBQ1RJVkFURQk9IDB4MjcsCisrCU5NX05BQ0tfUkVRX05PVF9HUkFOVAkJPSAweDI4LAorKwlOTV9OQUNLX1dBSVQJCQk9IDB4MjksCisrCU5NX05BQ0tfTk9USF9SRVBPUlRfRVhJU1QJPSAweDJhLAorKwlOTV9OQUNLX01FQVNfTk9UU1VQUAkJPSAweDJiLAorKwlOTV9OQUNLX01FQVNfTk9UU1RBUlQJCT0gMHgyYywKKyt9OworKworKy8qIFNlY3Rpb24gOS40LjEgKi8KKytzdHJ1Y3QgYWJpc19ubV9jaGFubmVsIHsKKysJZ3VpbnQ4CWF0dHJpYjsKKysJZ3VpbnQ4CWJ0c19wb3J0OworKwlndWludDgJdGltZXNsb3Q7CisrCWd1aW50OAlzdWJzbG90OworK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworKworKy8qIFNpZW1lbnMgQlMtMTEgc3BlY2lmaWMgb2JqZWN0cyBpbiB0aGUgU2llbmVtc0hXICgweEE1KSBvYmplY3QgY2xhc3MgKi8KKytlbnVtIGFiaXNfYnMxMV9vYmp0eXBlIHsKKysJQlMxMV9PQkpfQUxDTwkJPSAweDAxLAorKwlCUzExX09CSl9CQlNJRwkJPSAweDAyLAkvKiBvYmpfY2xhc3M6IDAsMSAqLworKwlCUzExX09CSl9UUlgxCQk9IDB4MDMsCS8qIG9ubHkgREVBQ1RJVkFURSBUUlgxICovCisrCUJTMTFfT0JKX0NDTEsJCT0gMHgwNCwKKysJQlMxMV9PQkpfR1BTVQkJPSAweDA2LAorKwlCUzExX09CSl9MSQkJPSAweDA3LAorKwlCUzExX09CSl9QQQkJPSAweDA5LAkvKiBvYmpfY2xhc3M6IDAsIDEqLworK307CisrCisrZW51bSBhYmlzX2JzMTFfdHJ4X3Bvd2VyIHsKKysJQlMxMV9UUlhfUE9XRVJfR1NNXzJXCT0gMHgwNiwKKysJQlMxMV9UUlhfUE9XRVJfR1NNXzI1MG1XPSAweDA3LAorKwlCUzExX1RSWF9QT1dFUl9HU01fODBtVwk9IDB4MDgsCisrCUJTMTFfVFJYX1BPV0VSX0dTTV8zMG1XCT0gMHgwOSwKKysJQlMxMV9UUlhfUE9XRVJfRENTXzNXCT0gMHgwYSwKKysJQlMxMV9UUlhfUE9XRVJfRENTXzFXNgk9IDB4MGIsCisrCUJTMTFfVFJYX1BPV0VSX0RDU181MDBtVz0gMHgwYywKKysJQlMxMV9UUlhfUE9XRVJfRENTXzE2MG1XPSAweDBkLAorK307CisrCisrZW51bSBhYmlzX2JzMTFfbGlfcGxsX21vZGUgeworKwlCUzExX0xJX1BMTF9MT0NLRUQJPSAyLAorKwlCUzExX0xJX1BMTF9TVEFOREFMT05FCT0gMywKKyt9OworKworK2VudW0gYWJpc19iczExX3BoYXNlIHsKKysJQlMxMV9TVEFURV9TT0ZUV0FSRV9SUUQJCT0gMHgwMSwKKysJQlMxMV9TVEFURV9MT0FEX1NNVV9JTlRFTkRFRAk9IDB4MTEsCisrCUJTMTFfU1RBVEVfTE9BRF9TTVVfU0FGRVRZCT0gMHgyMSwKKysJQlMxMV9TVEFURV9MT0FEX0ZBSUxFRAkJPSAweDMxLAorKwlCUzExX1NUQVRFX0xPQURfRElBR05PU1RJQwk9IDB4NDEsCisrCUJTMTFfU1RBVEVfV0FSTV9VUAkJPSAweDUxLAorKwlCUzExX1NUQVRFX1dBUk1fVVBfMgkJPSAweDUyLAorKwlCUzExX1NUQVRFX1dBSVRfTUlOX0NGRwkJPSAweDYyLAorKwlCUzExX1NUQVRFX01BSU5URU5BTkNFCQk9IDB4NzIsCisrCUJTMTFfU1RBVEVfTE9BRF9NQkNDVQkJPSAweDkyLAorKwlCUzExX1NUQVRFX1dBSVRfTUlOX0NGR18yCT0gMHhBMiwKKysJQlMxMV9TVEFURV9OT1JNQUwJCT0gMHgwMywKKysJQlMxMV9TVEFURV9BQklTX0xPQUQJCT0gMHgxMywKKyt9OworKworKy8qIEZyb20gb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdGx2LmggKi8KKytlbnVtIHRsdl90eXBlIHsKKysJVExWX1RZUEVfRklYRUQsCisrCVRMVl9UWVBFX1QsCisrCVRMVl9UWVBFX1RWLAorKwlUTFZfVFlQRV9UTFYsCisrCVRMVl9UWVBFX1RMMTZWLAorK307CisrCisrc3RydWN0IHRsdl9kZWYgeworKwllbnVtIHRsdl90eXBlIHR5cGU7CisrCXVfaW50OF90IGZpeGVkX2xlbjsKKyt9OworKworK3N0cnVjdCB0bHZfZGVmaW5pdGlvbiB7CisrCXN0cnVjdCB0bHZfZGVmIGRlZlsweGZmXTsKKyt9OworKworK2VudW0gYWJpc19ubV9pcGFjY190ZXN0X25vIHsKKysJTk1fSVBBQ0NfVEVTVE5PX1JMT09QX0FOVAk9IDB4MDEsCisrCU5NX0lQQUNDX1RFU1ROT19STE9PUF9YQ1ZSCT0gMHgwMiwKKysJTk1fSVBBQ0NfVEVTVE5PX0ZVTkNfT0JKCT0gMHgwMywKKysJTk1fSVBBQ0NfVEVTVE5PX0NIQU5fVVNBR0UJPSAweDQwLAorKwlOTV9JUEFDQ19URVNUTk9fQkNDSF9DSEFOX1VTQUdFCT0gMHg0MSwKKysJTk1fSVBBQ0NfVEVTVE5PX0ZSRVFfU1lOQwk9IDB4NDIsCisrCU5NX0lQQUNDX1RFU1ROT19CQ0NIX0lORk8JPSAweDQzLAorKwlOTV9JUEFDQ19URVNUTk9fVFhfQkVBQ09OCT0gMHg0NCwKKysJTk1fSVBBQ0NfVEVTVE5PX1NZU0lORk9fTU9OSVRPUgk9IDB4NDUsCisrCU5NX0lQQUNDX1RFU1ROT19CQ0NDSF9NT05JVE9SCT0gMHg0NiwKKyt9OworKworKy8qIGZpcnN0IGJ5dGUgYWZ0ZXIgbGVuZ3RoIGluc2lkZSBOTV9BVFRfVEVTVF9SRVBPUlQgKi8KKytlbnVtIGFiaXNfbm1faXBhY2NfdGVzdF9yZXMgeworKwlOTV9JUEFDQ19URVNUUkVTX1NVQ0NFU1MJPSAwLAorKwlOTV9JUEFDQ19URVNUUkVTX1RJTUVPVVQJPSAxLAorKwlOTV9JUEFDQ19URVNUUkVTX05PX0NIQU5TCT0gMiwKKysJTk1fSVBBQ0NfVEVTVFJFU19QQVJUSUFMCT0gMywKKysJTk1fSVBBQ0NfVEVTVFJFU19TVE9QUEVECT0gNCwKKyt9OworKworKy8qIGludGVybmFsIElFIGluc2lkZSBOTV9BVFRfVEVTVF9SRVBPUlQgKi8KKytlbnVtIGFiaXNfbm1faXBhY2NfdGVzdHJlc19pZSB7CisrCU5NX0lQQUNDX1RSX0lFX0ZSRVFfRVJSX0xJU1QJPSAzLAorKwlOTV9JUEFDQ19UUl9JRV9DSEFOX1VTQUdFCT0gNCwKKysJTk1fSVBBQ0NfVFJfSUVfQkNDSF9JTkZPCT0gNiwKKysJTk1fSVBBQ0NfVFJfSUVfUkVTVUxUX0RFVEFJTFMJPSA4LAorKwlOTV9JUEFDQ19UUl9JRV9GUkVRX0VSUgkJPSAxOCwKKyt9OworKworKy8qIEZyb20gb3BlbmJzYy9zcmMvYWJpc19ubS5jICovCisrc3RhdGljIGNvbnN0IHN0cnVjdCB0bHZfZGVmaW5pdGlvbiBubV9hdHRfdGx2ZGVmX2Jhc2UgPSB7CisrCS5kZWYgPSB7CisrCQlbTk1fQVRUX0FCSVNfQ0hBTk5FTF0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMyB9LAorKwkJW05NX0FUVF9BRERfSU5GT10gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9BRERfVEVYVF0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9BRE1fU1RBVEVdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfQVJGQ05fTElTVF09CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0FVVE9OX1JFUE9SVF0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9BVkFJTF9TVEFUVVNdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfQkNDSF9BUkZDTl0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW05NX0FUVF9CU0lDXSA9CQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9CVFNfQUlSX1RJTUVSXSA9CXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfQ0NDSF9MX0lfUF0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9DQ0NIX0xfVF0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9DSEFOX0NPTUJdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfQ09OTl9GQUlMX0NSSVRdID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9ERVNUXSA9CQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9FVkVOVF9UWVBFXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0ZJTEVfSURdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfRklMRV9WRVJTSU9OXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0dTTV9USU1FXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbTk1fQVRUX0hTTl0gPQkJCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfSFdfQ09ORklHXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0hXX0RFU0NdID0JCXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0lOVEFWRV9QQVJBTV0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9JTlRFUkZfQk9VTkRdID0JCXsgVExWX1RZUEVfRklYRUQsIDYgfSwKKysJCVtOTV9BVFRfTElTVF9SRVFfQVRUUl0gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX01BSU9dID0JCQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX01BTlVGX1NUQVRFXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX01BTlVGX1RIUkVTSF0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9NQU5VRl9JRF0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9NQVhfVEFdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfTURST1BfTElOS10gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW05NX0FUVF9NRFJPUF9ORVhUXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbTk1fQVRUX05BQ0tfQ0FVU0VTXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX05ZMV0gPQkJCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfT1BFUl9TVEFURV0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9PVkVSTF9QRVJJT0RdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfUEhZU19DT05GXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX1BPV0VSX0NMQVNTXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX1BPV0VSX1RIUkVTSF0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMyB9LAorKwkJW05NX0FUVF9QUk9CX0NBVVNFXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAzIH0sCisrCQlbTk1fQVRUX1JBQ0hfQl9USFJFU0hdID0JeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9MREFWR19TTE9UU10gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW05NX0FUVF9SQURfU1VCQ10gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9SRl9NQVhQT1dSX1JdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfU0lURV9JTlBVVFNdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfU0lURV9PVVRQVVRTXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX1NPVVJDRV0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9TUEVDX1BST0JdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfU1RBUlRfVElNRV0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW05NX0FUVF9UMjAwXSA9CQkJeyBUTFZfVFlQRV9GSVhFRCwgNyB9LAorKwkJW05NX0FUVF9URUldID0JCQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX1RFU1RfRFVSXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbTk1fQVRUX1RFU1RfTk9dID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfVEVTVF9SRVBPUlRdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfVlNXUl9USFJFU0hdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtOTV9BVFRfV0lORE9XX1NJWkVdID0gCQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX1RTQ10gPQkJCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfU1dfQ09ORklHXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX1NFVkVSSVRZXSA9IAkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9HRVRfQVJJXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0hXX0NPTkZfQ0hHXSA9IAkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9PVVRTVF9BTEFSTV0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9GSUxFX0RBVEFdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfTUVBU19SRVNdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysKKysJfSwKKyt9OworKworKy8qIEJTMTEgc3BlY2lmaWNzICovCisrc3RhdGljIGNvbnN0IHN0cnVjdCB0bHZfZGVmaW5pdGlvbiBubV9hdHRfdGx2ZGV2X2JzMTEgPSB7CisrCS5kZWYgPSB7CisrCQkvKiBhIGRpZmZlcmVuY2UuLiAqLworKwkJW05NX0FUVF9IV19ERVNDXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfRVNOX0ZXX0NPREVfTk9dID0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9FU05fSFdfQ09ERV9OT10gPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0VTTl9QQ0JfU0VSSUFMXSA9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfQk9PVF9TV19WRVJTXSA9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbMHhkNV0gPQkJCXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbMHhhOF0gPQkJCXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfUEFTU1dPUkRdID0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9UWFBXUl0gPQkJeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9SU1NJX09GRlNdID0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9MSU5FX0NGR10gPSAJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0wxX1BST1RfVFlQRV0gPQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfQklUX0VSUl9USEVTSF0gPQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbTk1fQVRUX0JTMTFfRElWRVJTSVRZXSA9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfTE1UX0xPR09OX1NFU1NJT05dPXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfTE1UX0xPR0lOX1RJTUVdID0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9MTVRfVVNFUl9BQ0NfTEVWXSA9eyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9MTVRfVVNFUl9OQU1FXSA9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfQlRTX1NUQVRFXQk9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfRTFfU1RBVEVdCT0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9QTExfTU9ERV0JPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX1BMTF0JPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0NDTEtfQUNDVVJBQ1ldID0JeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0NDTEtfVFlQRV0gPQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbMHg5NV0gPQkJCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJfSwKKyt9OworKworKy8qIGlwLmFjY2VzcyBzcGVjaWZpY3MgKi8KKytzdGF0aWMgY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uIG5tX2F0dF90bHZkZWZfaXBhID0geworKwkuZGVmID0geworKwkJW05NX0FUVF9JUEFDQ19EU1RfSVBdID0JCXsgVExWX1RZUEVfRklYRUQsIDQgfSwKKysJCVtOTV9BVFRfSVBBQ0NfRFNUX0lQX1BPUlRdID0JeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW05NX0FUVF9JUEFDQ19QUklNX09NTF9DRkddID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19OVl9GTEFHU10gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX0ZSRVFfQ1RSTF0gPQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbTk1fQVRUX0lQQUNDX1NFQ19PTUxfQ0ZHXSA9CXsgVExWX1RZUEVfRklYRUQsIDYgfSwKKysJCVtOTV9BVFRfSVBBQ0NfSVBfSUZfQ0ZHXSA9CXsgVExWX1RZUEVfRklYRUQsIDggfSwKKysJCVtOTV9BVFRfSVBBQ0NfSVBfR1dfQ0ZHXSA9CXsgVExWX1RZUEVfRklYRUQsIDEyIH0sCisrCQlbTk1fQVRUX0lQQUNDX0xPQ0FUSU9OXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfVU5JVF9JRF0gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX1VOSVRfTkFNRV0gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX1NOTVBfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfQUxNX1RIUkVTSF9MSVNUXT0geyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19DVVJfU1dfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfU1RSRUFNX0lEXSA9CXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfUkFDXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX09CSl9WRVJTSU9OXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfR1BSU19QQUdJTkdfQ0ZHXSA9eyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19OU0VJXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX0JWQ0ldID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfTlNWQ0ldID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfTlNfQ0ZHXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX0JTU0dQX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX05TX0xJTktfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfUkxDX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX1NVUFBfRkVBVFVSRVNdID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19DT0RJTkdfU0NIRU1FU10gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX1JMQ19DRkdfMl0gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX1JMQ19DRkdfM10gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX0ZJTEVfREFUQV0gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX0NHSV0gPSAJCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJfSwKKyt9OworKworKyNlbmRpZiAvKiBfTk1fSCAqLworLS0gCisxLjcuMC4xCisKZGlmZiAtLWdpdCBhL3dpcmVzaGFyay9sdWNlbnQtaG5iLnBhdGNoIGIvd2lyZXNoYXJrL2x1Y2VudC1obmIucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM4NTE5NQotLS0gL2Rldi9udWxsCisrKyBiL3dpcmVzaGFyay9sdWNlbnQtaG5iLnBhdGNoCkBAIC0wLDAgKzEsMTIwIEBACitJbmRleDogd2lyZXNoYXJrL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtbHVjZW50X2huYi5jCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0gL2Rldi9udWxsCisrKysgd2lyZXNoYXJrL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtbHVjZW50X2huYi5jCitAQCAtMCwwICsxLDEwMyBAQAorKy8qIHBhY2tldC1sdWNlbnRfaG5iLmMKKysgKiBSb3V0aW5lcyBmb3IgcGFja2V0IGRpc3NlY3Rpb24gb2YgQWxjYXRlbC9MdWNlbnQgSG9tZU5vZGVCCisrICogQ29weXJpZ2h0IDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKysgKgorKyAqIFRoaXMgcHJvdG9jb2wgZGVjb2RlciBpcyBiYXNlZCBlbnRpcmVseSBvbiByZXZlcnNlIGVuZ2luZWVyaW5nLCBpLmUuCisrICogb24gZWR1Y2F0ZWQgZ3Vlc3Nlcy4KKysgKgorKyAqICRJZDogcGFja2V0LWx1Y2VudF9obmIuYyAyOTI1NCAyMDA5LTA3LTMxIDE5OjE5OjI1WiBnZXJhbGQgJAorKyAqCisrICogV2lyZXNoYXJrIC0gTmV0d29yayB0cmFmZmljIGFuYWx5emVyCisrICogQnkgR2VyYWxkIENvbWJzIDxnZXJhbGRAd2lyZXNoYXJrLm9yZz4KKysgKiBDb3B5cmlnaHQgMTk5OCBHZXJhbGQgQ29tYnMKKysgKgorKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKysgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisrICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisrICoKKysgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKysgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKysgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKyAqCisrICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKysgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisrICovCisrCisrI2lmZGVmIEhBVkVfQ09ORklHX0gKKysjIGluY2x1ZGUgImNvbmZpZy5oIgorKyNlbmRpZgorKworKyNkZWZpbmUgTEhOQl9TQ1RQX1BQSV9NTQkxCisrI2RlZmluZSBMSE5CX1NDVFBfUFBJX0dNTQk2CisrCisrI2RlZmluZSBMSE5CX1NDVFBfUE9SVAkJNjAwNQorKworKyNpbmNsdWRlIDxnbGliLmg+CisrCisrI2luY2x1ZGUgPGVwYW4vcGFja2V0Lmg+CisrCisrLyogSW5pdGlhbGl6ZSB0aGUgcHJvdG9jb2wgYW5kIHJlZ2lzdGVyZWQgZmllbGRzICovCisrc3RhdGljIGludCBwcm90b19saG5iID0gLTE7CisrCisrc3RhdGljIGludCBoZl9saG5iX2xlbmd0aCA9IC0xOworKworKy8qIEluaXRpYWxpemUgdGhlIHN1YnRyZWUgcG9pbnRlcnMgKi8KKytzdGF0aWMgZ2ludCBldHRfbGhuYiA9IC0xOworKworK3N0YXRpYyBkaXNzZWN0b3JfaGFuZGxlX3QgcmFuYXBfaGFuZGxlOworKworKy8qIENvZGUgdG8gYWN0dWFsbHkgZGlzc2VjdCB0aGUgcGFja2V0cyAqLworK3N0YXRpYyB2b2lkCisrZGlzc2VjdF9saG5iKHR2YnVmZl90ICp0dmIsIHBhY2tldF9pbmZvICpwaW5mbywgcHJvdG9fdHJlZSAqdHJlZSkKKyt7CisrCisrCWludCBvZmZzZXQgPSAwOworKwl1X2ludDE2X3QgbGVuOworKwl0dmJ1ZmZfdCAqbmV4dF90dmI7CisrCisrCWNvbF9zZXRfc3RyKHBpbmZvLT5jaW5mbywgQ09MX1BST1RPQ09MLCAiTEhOQiIpOworKwljb2xfY2xlYXIocGluZm8tPmNpbmZvLCBDT0xfSU5GTyk7CisrCisrCXByb3RvX3RyZWVfYWRkX2l0ZW0odHJlZSwgaGZfbGhuYl9sZW5ndGgsIHR2Yiwgb2Zmc2V0KzIsIDIsIEZBTFNFKTsKKysJbGVuID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCsyKTsKKysJbmV4dF90dmIgPSB0dmJfbmV3X3N1YnNldCh0dmIsIG9mZnNldCsyKzYsIGxlbi00LCAtMSk7CisrCisrCWNhbGxfZGlzc2VjdG9yKHJhbmFwX2hhbmRsZSwgbmV4dF90dmIsIHBpbmZvLCB0cmVlKTsKKyt9CisrCisrdm9pZCBwcm90b19yZWdpc3Rlcl9sdWNlbnRfaG5iKHZvaWQpCisreworKwlzdGF0aWMgaGZfcmVnaXN0ZXJfaW5mbyBoZltdID0geworKwkJeyZoZl9saG5iX2xlbmd0aCwKKysJCSB7Ikxlbmd0aCIsICJsaG5iLmxlbiIsCisrCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDB4MCwgTlVMTCwgSEZJTEx9CisrCQkgfSwKKysJfTsKKysKKysJc3RhdGljIGdpbnQgKmV0dFtdID0geworKwkJJmV0dF9saG5iLAorKwl9OworKworKwlwcm90b19saG5iID0KKysJICAgIHByb3RvX3JlZ2lzdGVyX3Byb3RvY29sKCJBbGNhdGVsL0x1Y2VudCBIb21lTm9kZUIiLAorKwkJCQkgICAgIkx1Y2VudCBITkIiLCAibGhuYiIpOworKworKwlwcm90b19yZWdpc3Rlcl9maWVsZF9hcnJheShwcm90b19saG5iLCBoZiwgYXJyYXlfbGVuZ3RoKGhmKSk7CisrCXByb3RvX3JlZ2lzdGVyX3N1YnRyZWVfYXJyYXkoZXR0LCBhcnJheV9sZW5ndGgoZXR0KSk7CisrfQorKworK3ZvaWQgcHJvdG9fcmVnX2hhbmRvZmZfbHVjZW50X2huYih2b2lkKQorK3sKKysJZGlzc2VjdG9yX2hhbmRsZV90IGxobmJfaGFuZGxlOworKworKwlyYW5hcF9oYW5kbGUgPSBmaW5kX2Rpc3NlY3RvcigicmFuYXAiKTsKKysKKysJbGhuYl9oYW5kbGUgPSBjcmVhdGVfZGlzc2VjdG9yX2hhbmRsZShkaXNzZWN0X2xobmIsIHByb3RvX2xobmIpOworKworKwlkaXNzZWN0b3JfYWRkKCJzY3RwLnBwaSIsIExITkJfU0NUUF9QUElfTU0sIGxobmJfaGFuZGxlKTsKKysJZGlzc2VjdG9yX2FkZCgic2N0cC5wcGkiLCBMSE5CX1NDVFBfUFBJX0dNTSwgbGhuYl9oYW5kbGUpOworKwlkaXNzZWN0b3JfYWRkKCJzY3RwLnBvcnQiLCBMSE5CX1NDVFBfUE9SVCwgbGhuYl9oYW5kbGUpOworK30KK0luZGV4OiB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL01ha2VmaWxlLmNvbW1vbgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tIHdpcmVzaGFyay5vcmlnL2VwYW4vZGlzc2VjdG9ycy9NYWtlZmlsZS5jb21tb24KKysrKyB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL01ha2VmaWxlLmNvbW1vbgorQEAgLTYwNSw2ICs2MDUsNyBAQAorIAlwYWNrZXQtbG9vcC5jCQlcCisgCXBhY2tldC1scGQuYwkJXAorIAlwYWNrZXQtbHNjLmMJCVwKKysJcGFja2V0LWx1Y2VudF9obmIuYwlcCisgCXBhY2tldC1sd2FwcC5jCQlcCisgCXBhY2tldC1sd3Jlcy5jCQlcCisgCXBhY2tldC1tMnBhLmMJCVwKZGlmZiAtLWdpdCBhL3dpcmVzaGFyay9yc2wtaXBhY2Nlc3MucGF0Y2ggYi93aXJlc2hhcmsvcnNsLWlwYWNjZXNzLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MjIwYjgKLS0tIC9kZXYvbnVsbAorKysgYi93aXJlc2hhcmsvcnNsLWlwYWNjZXNzLnBhdGNoCkBAIC0wLDAgKzEsNjY0IEBACitGcm9tIDhmMzVkNjIzNjQxZGJiYTkwZTYxODY2MDRjMTFlODkyYmY1MTVlY2MgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CitEYXRlOiBNb24sIDE5IEFwciAyMDEwIDEzOjMyOjU4ICswODAwCitTdWJqZWN0OiBbUEFUQ0ggMi8yXSBSU0wgcGF0Y2gKKworLS0tCisgZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1yc2wuYyB8ICA1MjIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystCisgMSBmaWxlcyBjaGFuZ2VkLCA1MTUgaW5zZXJ0aW9ucygrKSwgNyBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtcnNsLmMgYi9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LXJzbC5jCitpbmRleCBiMTBhNjcxLi5hNDU1Y2YzIDEwMDY0NAorLS0tIGEvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1yc2wuYworKysrIGIvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1yc2wuYworQEAgLTIsNiArMiw3IEBACisgICogUm91dGluZXMgZm9yIFJhZGlvIFNpZ25hbGxpbmcgTGluayAoUlNMKSBkaXNzZWN0aW9uLgorICAqCisgICogQ29weXJpZ2h0IDIwMDcsIEFuZGVycyBCcm9tYW4gPGFuZGVycy5icm9tYW5AZXJpY3Nzb24uY29tPgorKyAqIENvcHlyaWdodCAyMDA5LCBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICAqCisgICogJElkJAorICAqCitAQCAtNDIsNiArNDMsOCBAQAorICNpbmNsdWRlIDxlcGFuL2xhcGRfc2FwaS5oPgorIAorICNpbmNsdWRlICJwYWNrZXQtZ3NtX2FfY29tbW9uLmgiCisrI2luY2x1ZGUgInBhY2tldC1ydHAuaCIKKysjaW5jbHVkZSAicGFja2V0LXJ0Y3AuaCIKKyAKKyAvKiBJbml0aWFsaXplIHRoZSBwcm90b2NvbCBhbmQgcmVnaXN0ZXJlZCBmaWVsZHMgKi8KKyBzdGF0aWMgaW50IHByb3RvX3JzbAkJPSAtMTsKK0BAIC0xMTUsNiArMTE4LDI0IEBAIHN0YXRpYyBpbnQgaGZfcnNsX2VtbHBwX3ByaW8JCT0gLTE7Cisgc3RhdGljIGludCBoZl9yc2xfcnRkCQkJCT0gLTE7Cisgc3RhdGljIGludCBoZl9yc2xfZGVsYXlfaW5kCQkJPSAtMTsKKyBzdGF0aWMgaW50IGhmX3JzbF90Zm8JCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9zcGVlY2hfbW9kZV9zCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9zcGVlY2hfbW9kZV9tCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9jb25uX3N0YXQJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2Nvbm5faWQJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX3J0cF9wYXlsb2FkCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9ydHBfY3NkX2ZtdF9kCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9ydHBfY3NkX2ZtdF9pcgkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9sb2NhbF9wb3J0CQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9yZW1vdGVfcG9ydAkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfbG9jYWxfaXAJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX3JlbW90ZV9pcAkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfY3N0YXRfdHhfcGt0cwkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfY3N0YXRfdHhfb2N0cwkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfY3N0YXRfcnhfcGt0cwkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfY3N0YXRfcnhfb2N0cwkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfY3N0YXRfbG9zdF9wa3RzCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2NzdGF0X2lhX2ppdHRlcgkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9jc3RhdF9hdmdfdHhfZGx5CQk9IC0xOworIAorIC8qIEluaXRpYWxpemUgdGhlIHN1YnRyZWUgcG9pbnRlcnMgKi8KKyBzdGF0aWMgaW50IGV0dF9yc2wgPSAtMTsKK0BAIC0xNzIsNiArMTkzLDE1IEBAIHN0YXRpYyBpbnQgZXR0X2llX2NhdXNlID0gLTE7Cisgc3RhdGljIGludCBldHRfaWVfbWVhc19yZXNfbm8gPSAtMTsKKyBzdGF0aWMgaW50IGV0dF9pZV9tZXNzYWdlX2lkID0gLTE7Cisgc3RhdGljIGludCBldHRfaWVfc3lzX2luZm9fdHlwZSA9IC0xOworK3N0YXRpYyBpbnQgZXR0X2llX3NwZWVjaF9tb2RlID0gLTE7Cisrc3RhdGljIGludCBldHRfaWVfY29ubl9zdGF0ID0gLTE7Cisrc3RhdGljIGludCBldHRfaWVfY29ubl9pZCA9IC0xOworK3N0YXRpYyBpbnQgZXR0X2llX3JlbW90ZV9pcCA9IC0xOworK3N0YXRpYyBpbnQgZXR0X2llX3JlbW90ZV9wb3J0ID0gLTE7Cisrc3RhdGljIGludCBldHRfaWVfbG9jYWxfcG9ydCA9IC0xOworK3N0YXRpYyBpbnQgZXR0X2llX2xvY2FsX2lwID0gLTE7Cisrc3RhdGljIGludCBldHRfaWVfcnRwX3BheWxvYWQgPSAtMTsKKysKKyAKKyBwcm90b190cmVlICp0b3BfdHJlZTsKKyBkaXNzZWN0b3JfaGFuZGxlX3QgZ3NtX2FfY2NjaF9oYW5kbGU7CitAQCAtMjA3LDggKzIzNywxMSBAQCBzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9tc2dfZGlzY192YWxzW10gPSB7CisgCXsgIDB4MDYsCQkiQ29tbW9uIENoYW5uZWwgTWFuYWdlbWVudCBtZXNzYWdlcyIgfSwKKyAJeyAgMHgwOCwJCSJUUlggTWFuYWdlbWVudCBtZXNzYWdlcyIgfSwKKyAJeyAgMHgxNiwJCSJMb2NhdGlvbiBTZXJ2aWNlcyBtZXNzYWdlcyIgfSwKKysJeyAgMHgzZiwJCSJpcC5hY2Nlc3MgVmVuZG9yIFNwZWNpZmljIG1lc3NhZ2VzIiB9LAorIAl7IDAsCQkJTlVMTCB9CisgfTsKKysjZGVmaW5lIFJTTF9NU0dESVNDX0lQQUNDRVNTCTB4M2YKKysKKyAvKgorICAqIDkuMiBNRVNTQUdFIFRZUEUKKyAgKi8KK0BAIC0yNzUsNiArMzA4LDQ5IEBAIHN0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgcnNsX21zZ19kaXNjX3ZhbHNbXSA9IHsKKyAJLyogCTAgMSAtIC0gLSAtIC0gLSBMb2NhdGlvbiBTZXJ2aWNlcyBtZXNzYWdlczogKi8KKyAjZGVmaW5lIFJTTF9NU0dfTE9DX0lORgkJCQkJNjUJLyogOC43LjEgKi8KKyAKKysvKiBWZW5kb3ItU3BlY2lmaWMgbWVzc2FnZXMgb2YgaXAuYWNjZXNzIG5hbm9CVFMuIFRoZXJlIGlzIG5vIHB1YmxpYyBkb2N1bWVudGF0aW9uCisrICogYWJvdXQgdGhvc2UgZXh0ZW5zaW9ucywgYWxsIGluZm9ybWF0aW9uIGluIHRoaXMgZGlzc2VjdG9yIGlzIGJhc2VkIG9uIGxhd2Z1bAorKyAqIHByb3RvY29sIHJldmVyc2UgZW5naW5lcmluZyBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPiAqLworKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfTUVBU19QUF9ERUYJMHg2MAorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfSE9fQ0FORF9JTlEJMHg2MQorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfSE9fQ0FORF9SRVNQCTB4NjIKKysKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUCTB4NDgKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUX0FDSwkweDQ5CisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0FDVF9OQUNLCTB4NGEKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfREVBQ1QJMHg0YgorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfUERDSF9ERUFDVF9BQ0sgMHg0YworKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfUERDSF9ERUFDVF9OQUNLIDB4NGQKKysKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX0NSQ1gJCTB4NzAKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX0NSQ1hfQUNLCTB4NzEKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX0NSQ1hfTkFDSwkweDcyCisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19NRENYCQkweDczCisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19NRENYX0FDSwkweDc0CisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19NRENYX05BQ0sJMHg3NQorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfRExDWF9JTkQJMHg3NgorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfRExDWAkJMHg3NworKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfRExDWF9BQ0sJMHg3OAorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfRExDWF9OQUNLCTB4NzkKKysKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1NSVFBfQ09ORklHCQkweGUwCisrI2RlZmluZSBSU0xfSUVfSVBBQ19QUk9YWV9VRFAJCTB4ZTEKKysjZGVmaW5lIFJTTF9JRV9JUEFDX0JTQ01QTF9UT1VUCQkweGUyCisrI2RlZmluZSBSU0xfSUVfSVBBQ19SRU1PVEVfSVAJCTB4ZjAKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1JFTU9URV9QT1JUCQkweGYxCisrI2RlZmluZSBSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRAkJMHhmMgorKyNkZWZpbmUgUlNMX0lFX0lQQUNfTE9DQUxfUE9SVAkJMHhmMworKyNkZWZpbmUgUlNMX0lFX0lQQUNfU1BFRUNIX01PREUJCTB4ZjQKKysjZGVmaW5lIFJTTF9JRV9JUEFDX0xPQ0FMX0lQCQkweGY1CisrI2RlZmluZSBSU0xfSUVfSVBBQ19DT05OX1NUQVQJCTB4ZjYKKysjZGVmaW5lIFJTTF9JRV9JUEFDX0hPX0NfUEFSTVMJCTB4ZjcKKysjZGVmaW5lIFJTTF9JRV9JUEFDX0NPTk5fSUQJCTB4ZjgKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1JUUF9DU0RfRk1UCQkweGY5CisrI2RlZmluZSBSU0xfSUVfSVBBQ19SVFBfSklUX0JVRgkJMHhmYQorKyNkZWZpbmUgUlNMX0lFX0lQQUNfUlRQX0NPTVBSCQkweGZiCisrI2RlZmluZSBSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRDIJMHhmYworKyNkZWZpbmUgUlNMX0lFX0lQQUNfUlRQX01QTEVYCQkweGZkCisrI2RlZmluZSBSU0xfSUVfSVBBQ19SVFBfTVBMRVhfSUQJMHhmZQorIAorIHN0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgcnNsX21zZ190eXBlX3ZhbHNbXSA9IHsKKyAJICAvKiAJMCAwIDAgMCAtIC0gLSAtIFJhZGlvIExpbmsgTGF5ZXIgTWFuYWdlbWVudCBtZXNzYWdlczogKi8KK0BAIC0zMzcsNiArNDEzLDI2IEBAIHN0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgcnNsX21zZ190eXBlX3ZhbHNbXSA9IHsKKyAJeyAgMHgzZiwJIlRGTyBNT0RpZmljYXRpb24gUkVRdWVzdCIgfSwJCQkJCS8qIDguNC4zMSAqLworIAkvKiAJMCAxIC0gLSAtIC0gLSAtIExvY2F0aW9uIFNlcnZpY2VzIG1lc3NhZ2VzOiAqLworIAl7ICAweDQxLAkiTG9jYXRpb24gSW5mb3JtYXRpb24iIH0sCQkJCQkJLyogOC43LjEgKi8KKysJLyogaXAuYWNjZXNzICovCisrCXsgIDB4NDgsCSJpcC5hY2Nlc3MgUERDSCBBQ1RJVkFUSU9OIiB9LAorKwl7ICAweDQ5LAkiaXAuYWNjZXNzIFBEQ0ggQUNUSVZBVElPTiBBQ0siIH0sCisrCXsgIDB4NGEsCSJpcC5hY2Nlc3MgUERDSCBBQ1RJVkFUSU9OIE5BQ0siIH0sCisrCXsgIDB4NGIsCSJpcC5hY2Nlc3MgUERDSCBERUFDVElWQVRJT04iIH0sCisrCXsgIDB4NGMsCSJpcC5hY2Nlc3MgUERDSCBERUFDVElWQVRJT04gQUNLIiB9LAorKwl7ICAweDRkLAkiaXAuYWNjZXNzIFBEQ0ggREVBQ1RJVkFUSU9OIE5BQ0siIH0sCisrCXsgIDB4NjAsCSJpcC5hY2Nlc3MgTUVBU3VyZW1lbnQgUFJFUFJPQ2Vzc2luZyBEZUZhdUxUIiB9LAorKwl7ICAweDYxLAkiaXAuYWNjZXNzIEhBTkRPb3ZlciBDQU5EaWRhdGUgRU5RdWlyeSIgfSwKKysJeyAgMHg2MiwJImlwLmFjY2VzcyBIQU5ET292ZXIgQ0FORGlkYXRlIFJFU1BvbnNlIiB9LAorKwl7ICAweDcwLAkiaXAuYWNjZXNzIENSQ1giIH0sCisrCXsgIDB4NzEsCSJpcC5hY2Nlc3MgQ1JDWCBBQ0siIH0sCisrCXsgIDB4NzIsCSJpcC5hY2Nlc3MgQ1JDWCBOQUNLIiB9LAorKwl7ICAweDczLAkiaXAuYWNjZXNzIE1EQ1giIH0sCisrCXsgIDB4NzQsCSJpcC5hY2Nlc3MgTURDWCBBQ0siIH0sCisrCXsgIDB4NzUsCSJpcC5hY2Nlc3MgTURDWCBOQUNLIiB9LAorKwl7ICAweDc2LAkiaXAuYWNjZXNzIERMQ1ggSU5EaWNhdGlvbiIgfSwKKysJeyAgMHg3NywJImlwLmFjY2VzcyBETENYIiB9LAorKwl7ICAweDc4LAkiaXAuYWNjZXNzIERMQ1ggQUNLIiB9LAorKwl7ICAweDc5LAkiaXAuYWNjZXNzIERMQ1ggTkFDSyIgfSwKKyAJeyAwLAkJTlVMTCB9CisgfTsKKyAKK0BAIC0zNzAsMTAgKzQ2NiwxMCBAQCBzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9tc2dfdHlwZV92YWxzW10gPSB7CisgI2RlZmluZSBSU0xfSUVfTUVTU0FHRV9JRAkJMjgKKyAKKyAjZGVmaW5lIFJTTF9JRV9TWVNfSU5GT19UWVBFCTMwCistCistCistCistCisrI2RlZmluZSBSU0xfSUVfTVNfUE9XRVJfUEFSQU0JCTMxCisrI2RlZmluZSBSU0xfSUVfQlNfUE9XRVJfUEFSQU0JCTMyCisrI2RlZmluZSBSU0xfSUVfUFJFUFJPQ19QQVJBTQkJMzMKKysjZGVmaW5lIFJTTF9JRV9QUkVQUk9DX01FQVMJCTM0CisgI2RlZmluZSBSU0xfSUVfRlVMTF9JTU1fQVNTX0lORgkJCTM1CisgI2RlZmluZSBSU0xfSUVfU01TQ0JfSU5GCQkJCTM2CisgI2RlZmluZSBSU0xfSUVfRlVMTF9NU19USU1JTkdfT0ZGU0VUCTM3CitAQCAtNDc2LDYgKzU3MiwyNCBAQCBzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9pZV90eXBlX3ZhbHNbXSA9IHsKKyAJCQlOb3QgdXNlZAorIAorIAkqLworKwl7IDB4ZTAsCQkiU1JUUCBDb25maWd1cmF0aW9uIiB9LAorKwl7IDB4ZTEsCQkiQlNDIFByb3h5IFVEUCBQb3J0IiB9LAorKwl7IDB4ZTIsCQkiQlNDIE11bHRpcGxleCBUaW1lb3V0IiB9LAorKwl7IDB4ZjAsCQkiUmVtb3RlIElQIEFkZHJlc3MiIH0sCisrCXsgMHhmMSwJCSJSZW1vdGUgUlRQIFBvcnQiIH0sCisrCXsgMHhmMiwJCSJSVFAgUGF5bG9hZCBUeXBlIiB9LAorKwl7IDB4ZjMsCQkiTG9jYWwgUlRQIFBvcnQiIH0sCisrCXsgMHhmNCwJCSJTcGVlY2ggTW9kZSIgfSwKKysJeyAweGY1LAkJIkxvY2FsIElQIEFkZHJlc3MiIH0sCisrCXsgMHhmNiwJCSJDb25uZWN0aW9uIFN0YXRpc3RpY3MiIH0sCisrCXsgMHhmNywJCSJIYW5kb3ZlciBDIFBhcmFtZXRlcnMiIH0sCisrCXsgMHhmOCwJCSJDb25uZWN0aW9uIElkZW50aWZpZXIiIH0sCisrCXsgMHhmOSwJCSJSVFAgQ1NEIEZvcm1hdCIgfSwKKysJeyAweGZhLAkJIlJUUCBKaXR0ZXIgQnVmZmVyIiB9LAorKwl7IDB4ZmIsCQkiUlRQIENvbXByZXNzaW9uIiB9LAorKwl7IDB4ZmMsCQkiUlRQIFBheWxvYWQgVHlwZSAyIiB9LAorKwl7IDB4ZmQsCQkiUlRQIE11bHRpcGxleCIgfSwKKysJeyAweGZlLAkJIlJUUCBNdWx0aXBsZXggSWRlbnRpZmllciIgfSwKKyAJeyAwLAkJCU5VTEwgfQorIH07CisgCitAQCAtNTEyLDYgKzYyNiw5NiBAQCBzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9jaF9ub19DYml0c192YWxzW10gPSB7CisgCXsgMCwJCQlOVUxMIH0KKyB9OworIAorKy8qIEZyb20gb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdGx2LmggKi8KKytlbnVtIHRsdl90eXBlIHsKKysJVExWX1RZUEVfRklYRUQsCisrCVRMVl9UWVBFX1QsCisrCVRMVl9UWVBFX1RWLAorKwlUTFZfVFlQRV9UTFYsCisrCVRMVl9UWVBFX1RMMTZWLAorK307CisrCisrc3RydWN0IHRsdl9kZWYgeworKwllbnVtIHRsdl90eXBlIHR5cGU7CisrCXVfaW50OF90IGZpeGVkX2xlbjsKKyt9OworKworK3N0cnVjdCB0bHZfZGVmaW5pdGlvbiB7CisrCXN0cnVjdCB0bHZfZGVmIGRlZlsweGZmXTsKKyt9OworKworK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGx2X2RlZmluaXRpb24gcnNsX2F0dF90bHZkZWYgPSB7CisrCS5kZWYgPSB7CisrCQlbUlNMX0lFX0NIX05PXQkJCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9MSU5LX0lEXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX0FDVF9UWVBFXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX0JTX1BPV10JCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfQ0hfSURdCQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9DSF9NT0RFXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9FTkNfSU5GXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9GUkFNRV9OT10JCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW1JTTF9JRV9IT19SRUZdCQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX0wxX0lORl0JCQk9IHsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtSU0xfSUVfTDNfSU5GXQkJCT0geyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW1JTTF9JRV9NU19JRF0JCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX01TX1BPV10JCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfUEFHSU5HX0dSUF0JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9QQUdJTkdfTE9BRF0JCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW1JTTF9JRV9QSFlfQ1RYXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9BQ0NFU1NfREVMQVldCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfUkFDSF9MT0FEXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9SRVFfUkVGXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCAzIH0sCisrCQlbUlNMX0lFX1JFTF9NT0RFXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1JFU09VUkNFX0lORl0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfUkxNX0NBVVNFXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9TVEFSVElOR19USU1FXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbUlNMX0lFX1RJTUlOR19BRFZdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfVVBMSU5LX01FQVNdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0NBVVNFXQkJCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfTUVBU19SRVNfTk9dCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfTUVTU0FHRV9JRF0JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9TWVNfSU5GT19UWVBFXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX01TX1BPV0VSX1BBUkFNXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9CU19QT1dFUl9QQVJBTV0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfUFJFUFJPQ19QQVJBTV0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfUFJFUFJPQ19NRUFTXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJLy9bUlNMX0lFX0lNTV9BU1NfSU5GT10JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCS8vW1JTTF9JRV9TTVNDQl9JTkZPXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCAyMyB9LAorKwkJLy9bUlNMX0lFX01TX1RJTUlOR19PRkZTRVRdCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9FUlJfTVNHXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9GVUxMX0JDQ0hfSU5GXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9DSF9ORUVERURdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfQ0JfQ01EX1RZUEVdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfU01TQ0JfTUVTU10JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfRlVMTF9JTU1fQVNTX0lORl0JPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJLy9bUlNMX0lFX1NBQ0NIX0lORk9dCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0NCQ0hfTE9BRF9JTkZdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfU01TQ0JfQ0hfSU5EXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX0dSUF9DQUxMX1JFRl0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfQ0hfREVTQ10JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfTkNIX0RSWF9JTkZdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0NNRF9JTkRdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0VNTFBQX1BSSU9dCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfVUlDXQkJCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfTUFJTl9DSF9SRUZdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfTVVMVElSQVRFX0NPTkZdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX01VTFRJUkFURV9DTlRSTF0JPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1NVUF9DT0RFQ19UWVBFU10JPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9DT0RFQ19DT05GXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9SVERdCQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1RGT19TVEFUVVNdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfTExQX0FQRFVdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0lQQUNfUkVNT1RFX0lQXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCA0IH0sCisrCQlbUlNMX0lFX0lQQUNfUkVNT1RFX1BPUlRdCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW1JTTF9JRV9JUEFDX0xPQ0FMX0lQXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCA0IH0sCisrCQlbUlNMX0lFX0lQQUNfQ09OTl9TVEFUXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9JUEFDX0xPQ0FMX1BPUlRdCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW1JTTF9JRV9JUEFDX1NQRUVDSF9NT0RFXQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfSVBBQ19DT05OX0lEXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbUlNMX0lFX0lQQUNfUlRQX1BBWUxPQUQyXQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJfSwKKyt9OworKworIC8qIDkuMy4xIENoYW5uZWwgbnVtYmVyCQkJOS4zLjEJTSBUViAyICovCisgc3RhdGljIGludAorIGRpc3NlY3RfcnNsX2llX2NoX25vKHR2YnVmZl90ICp0dmIsIHBhY2tldF9pbmZvICpwaW5mbyBfVV8sIHByb3RvX3RyZWUgKnRyZWUsIGludCBvZmZzZXQsIGdib29sZWFuIGlzX21hbmRhdG9yeSkKK0BAIC0yMDQyLDcgKzIyNDYsNiBAQCBkaXNzZWN0X3JzbF9pZV9lcnJfbXNnKHR2YnVmZl90ICp0dmIsIHBhY2tldF9pbmZvICpwaW5mbywgcHJvdG9fdHJlZSAqdHJlZSwgaW50CisgCXByb3RvX2l0ZW1fc2V0X2xlbih0aSwgbGVuZ3RoKzIpOworIAorIAlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9pZV9sZW5ndGgsIHR2Yiwgb2Zmc2V0LCAxLCBGQUxTRSk7CistCW9mZnNldCsrOworIAorIAkvKiBSZWNlaXZlZCBNZXNzYWdlICovCisgCW9mZnNldCA9IGRpc3NjdF9yc2xfbXNnKHR2YiwgcGluZm8sIGllX3RyZWUsIG9mZnNldCk7CitAQCAtMjkwNywxMiArMzExMCwxODQgQEAgZGlzc2VjdF9yc2xfaWVfdGZvX3RyYW5zcF9jb250KHR2YnVmZl90ICp0dmIsIHBhY2tldF9pbmZvICpwaW5mbyBfVV8sIHByb3RvX3RyZWUKKyB9CisgCisgc3RhdGljIGludAorK2Rpc3NjdF9yc2xfaXBhY2Nlc3NfbXNnKHR2YnVmZl90ICp0dmIsIHBhY2tldF9pbmZvICpwaW5mbywgcHJvdG9fdHJlZSAqdHJlZSwJCQkJICAgIGludCBvZmZzZXQpCisreworKwlndWludDggbXNnX3R5cGU7CisrCWd1aW50MzIgbG9jYWxfYWRkciA9IDA7CisrCWd1aW50MTYgbG9jYWxfcG9ydCA9IDA7CisrCWFkZHJlc3Mgc3JjX2FkZHI7CisrCisrCW1zZ190eXBlID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpJjB4N2Y7CisrCW9mZnNldCsrOworKworKyNpZiAwCisrCXN3aXRjaCAobXNnX3R5cGUpIHsKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19DUkNYOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0NSQ1hfQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0NSQ1hfTkFDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19NRENYOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX01EQ1hfQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX01EQ1hfTkFDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19ETENYX0lORDoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19ETENYOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0RMQ1hfQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0RMQ1hfTkFDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0FDVDoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0FDVF9BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9BQ1RfTkFDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0RFQUNUOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfREVBQ1RfQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfREVBQ1RfTkFDSzoKKysJCS8qIENoYW5uZWwgbnVtYmVyCQkJOS4zLjEJTSBUViAyCQkqLworKwkJb2Zmc2V0ID0gZGlzc2VjdF9yc2xfaWVfY2hfbm8odHZiLCBwaW5mbywgdHJlZSwgb2Zmc2V0LCBUUlVFKTsKKysJCWJyZWFrOworKwl9CisrI2VuZGlmCisrCS8qIHBhcnNlIFRMViBhdHRyaWJ1dGVzICovCisrCXdoaWxlICh0dmJfcmVwb3J0ZWRfbGVuZ3RoX3JlbWFpbmluZyh0dmIsIG9mZnNldCkgIT0gMCkgeworKwkJZ3VpbnQ4IHRhZzsKKysJCXVuc2lnbmVkIGludCBsZW4sIGhsZW4sIGxlbl9sZW47CisrCQljb25zdCBzdHJ1Y3QgdGx2X2RlZiAqdGRlZjsKKysJCXByb3RvX2l0ZW0gKnRpOworKwkJcHJvdG9fdHJlZSAqaWVfdHJlZTsKKysKKysJCXRhZyA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KTsKKysJCXRkZWYgPSAmcnNsX2F0dF90bHZkZWYuZGVmW3RhZ107CisrCisrCQlzd2l0Y2ggKHRkZWYtPnR5cGUpIHsKKysJCWNhc2UgVExWX1RZUEVfRklYRUQ6CisrCQkJaGxlbiA9IDE7CisrCQkJbGVuX2xlbiA9IDA7CisrCQkJbGVuID0gdGRlZi0+Zml4ZWRfbGVuOworKwkJCWJyZWFrOworKwkJY2FzZSBUTFZfVFlQRV9UOgorKwkJCWhsZW4gPSAxOworKwkJCWxlbl9sZW4gPSAwOworKwkJCWxlbiA9IDA7CisrCQkJYnJlYWs7CisrCQljYXNlIFRMVl9UWVBFX1RWOgorKwkJCWhsZW4gPSAxOworKwkJCWxlbl9sZW4gPSAwOworKwkJCWxlbiA9IDE7CisrCQkJYnJlYWs7CisrCQljYXNlIFRMVl9UWVBFX1RMVjoKKysJCQlobGVuID0gMjsKKysJCQlsZW5fbGVuID0gMTsKKysJCQlsZW4gPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCsxKTsKKysJCQlicmVhazsKKysJCWNhc2UgVExWX1RZUEVfVEwxNlY6CisrCQkJaGxlbiA9IDM7CisrCQkJbGVuX2xlbiA9IDI7CisrCQkJbGVuID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrMSkgPDwgOCB8CisrCQkJCQl0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCsyKTsKKysJCQlicmVhazsKKysJCWRlZmF1bHQ6CisrCQkJaGxlbiA9IGxlbl9sZW4gPSBsZW4gPSAwOworKwkJCURJU1NFQ1RPUl9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKysJCQlicmVhazsKKysJCX0KKysKKysJCXRpID0gcHJvdG9fdHJlZV9hZGRfaXRlbSh0cmVlLCBoZl9yc2xfaWVfaWQsIHR2Yiwgb2Zmc2V0LCAxLCBGQUxTRSk7CisrCQlpZV90cmVlID0gcHJvdG9faXRlbV9hZGRfc3VidHJlZSh0aSwgZXR0X2llX2xvY2FsX3BvcnQpOworKwkJb2Zmc2V0ICs9IGhsZW47CisrCisrCQlzd2l0Y2ggKHRhZykgeworKwkJY2FzZSBSU0xfSUVfQ0hfTk86CisrCQkJZGlzc2VjdF9yc2xfaWVfY2hfbm8odHZiLCBwaW5mbywgaWVfdHJlZSwgb2Zmc2V0LCBGQUxTRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIFJTTF9JRV9GUkFNRV9OTzoKKysJCQlkaXNzZWN0X3JzbF9pZV9mcmFtZV9ubyh0dmIsIHBpbmZvLCBpZV90cmVlLCBvZmZzZXQsIEZBTFNFKTsKKysJCQlicmVhazsKKysJCWNhc2UgUlNMX0lFX01TX1BPVzoKKysJCQlkaXNzZWN0X3JzbF9pZV9tc19wb3codHZiLCBwaW5mbywgaWVfdHJlZSwgb2Zmc2V0LCBGQUxTRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIFJTTF9JRV9JUEFDX1JFTU9URV9JUDoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9yZW1vdGVfaXAsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCWJyZWFrOworKwkJY2FzZSBSU0xfSUVfSVBBQ19SRU1PVEVfUE9SVDoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9yZW1vdGVfcG9ydCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIFJTTF9JRV9JUEFDX0xPQ0FMX0lQOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX2xvY2FsX2lwLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQlsb2NhbF9hZGRyID0gdHZiX2dldF9pcHY0KHR2Yiwgb2Zmc2V0KTsKKysJCQlicmVhazsKKysJCWNhc2UgUlNMX0lFX0lQQUNfTE9DQUxfUE9SVDoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9sb2NhbF9wb3J0LCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQlsb2NhbF9wb3J0ID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCk7CisrCQkJYnJlYWs7CisrCQljYXNlIFJTTF9JRV9JUEFDX1NQRUVDSF9NT0RFOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX3NwZWVjaF9tb2RlX3MsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX3NwZWVjaF9tb2RlX20sIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCWJyZWFrOworKwkJY2FzZSBSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRDoKKysJCWNhc2UgUlNMX0lFX0lQQUNfUlRQX1BBWUxPQUQyOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX3J0cF9wYXlsb2FkLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQlicmVhazsKKysJCWNhc2UgUlNMX0lFX0lQQUNfUlRQX0NTRF9GTVQ6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfcnRwX2NzZF9mbXRfZCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfcnRwX2NzZF9mbXRfaXIsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCWJyZWFrOworKwkJY2FzZSBSU0xfSUVfSVBBQ19DT05OX0lEOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX2Nvbm5faWQsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCWJyZWFrOworKwkJY2FzZSBSU0xfSUVfSVBBQ19DT05OX1NUQVQ6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfY3N0YXRfdHhfcGt0cywgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgNCwgRkFMU0UpOworKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX2NzdGF0X3R4X29jdHMsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQrNCwgNCwgRkFMU0UpOworKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX2NzdGF0X3J4X3BrdHMsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQrOCwgNCwgRkFMU0UpOworKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX2NzdGF0X3J4X29jdHMsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQrMTIsIDQsIEZBTFNFKTsKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9jc3RhdF9sb3N0X3BrdHMsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQrMTYsIDQsIEZBTFNFKTsKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9jc3RhdF9pYV9qaXR0ZXIsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQrMjAsIDQsIEZBTFNFKTsKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9jc3RhdF9hdmdfdHhfZGx5LCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0KzI0LCA0LCBGQUxTRSk7CisrCQkJYnJlYWs7CisrCQl9CisrCQlvZmZzZXQgKz0gbGVuOworKwl9CisrCisrCXN3aXRjaCAobXNnX3R5cGUpIHsKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19DUkNYX0FDSzoKKysJCS8qIE5vdGlmeSB0aGUgUlRQIGFuZCBSVENQIGRpc3NlY3RvcnMgYWJvdXQgYSBuZXcgUlRQIHN0cmVhbSAqLworKwkJc3JjX2FkZHIudHlwZSA9IEFUX0lQdjQ7CisrCQlzcmNfYWRkci5sZW4gPSA0OworKwkJc3JjX2FkZHIuZGF0YSA9IChndWludDggKikmbG9jYWxfYWRkcjsKKysJCXJ0cF9hZGRfYWRkcmVzcyhwaW5mbywgJnNyY19hZGRyLCBsb2NhbF9wb3J0LCAwLAorKwkJCQkiR1NNIEEtYmlzL0lQIiwgcGluZm8tPmZkLT5udW0sIDAsIE5VTEwpOworKwkJcnRjcF9hZGRfYWRkcmVzcyhwaW5mbywgJnNyY19hZGRyLCBsb2NhbF9wb3J0KzEsIDAsCisrCQkJCSAiR1NNIEEtYmlzL0lQIiwgcGluZm8tPmZkLT5udW0pOworKwkJYnJlYWs7CisrCX0KKysJcmV0dXJuIG9mZnNldDsKKyt9CisrCisrc3RhdGljIGludAorIGRpc3NjdF9yc2xfbXNnKHR2YnVmZl90ICp0dmIsIHBhY2tldF9pbmZvICpwaW5mbywgcHJvdG9fdHJlZSAqdHJlZSwgaW50IG9mZnNldCkKKyB7CistCWd1aW50OAltc2dfdHlwZTsKKysJZ3VpbnQ4CW1zZ19kaXNjLCBtc2dfdHlwZTsKKyAKKysJbXNnX2Rpc2MgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCsrKSA+PiAxOworIAltc2dfdHlwZSA9IHR2Yl9nZXRfZ3VpbnQ4KHR2YixvZmZzZXQpJjB4N2Y7CisgCXByb3RvX3RyZWVfYWRkX2l0ZW0odHJlZSwgaGZfcnNsX21zZ190eXBlLCB0dmIsIG9mZnNldCwgMSwgRkFMU0UpOworKworKwlpZiAobXNnX2Rpc2MgPT0gUlNMX01TR0RJU0NfSVBBQ0NFU1MpIHsKKysJCW9mZnNldCA9IGRpc3NjdF9yc2xfaXBhY2Nlc3NfbXNnKHR2YiwgcGluZm8sIHRyZWUsIG9mZnNldCk7CisrCQlyZXR1cm4gb2Zmc2V0OworKwl9CisgCW9mZnNldCsrOworIAorIAlzd2l0Y2ggKG1zZ190eXBlKXsKK0BAIC0zNDgwLDYgKzM4NTUsMTggQEAgZGlzc2N0X3JzbF9tc2codHZidWZmX3QgKnR2YiwgcGFja2V0X2luZm8gKnBpbmZvLCBwcm90b190cmVlICp0cmVlLCBpbnQgb2Zmc2V0KQorIAkJLyogTExQIEFQRFUgOS4zLjU4IE0gTFYgMi1OICovCisgCQlvZmZzZXQgPSBkaXNzZWN0X3JzbF9pZV9sbHBfYXBkdSh0dmIsIHBpbmZvLCB0cmVlLCBvZmZzZXQsIFRSVUUpOworIAkJYnJlYWs7CisrCS8qIHRoZSBmb2xsb3dpbmcgbWVzc2FnZXMgYXJlIGlwLmFjY2VzcyBzcGVjaWZpYyBidXQgc2VudCB3aXRob3V0CisrCSAqIGlwLmFjY2VzcyBtZW1zc2FnZSBkaXNjcmltaW5hdG9yICovCisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfTUVBU19QUF9ERUY6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfSE9fQ0FORF9JTlE6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfSE9fQ0FORF9SRVNQOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUX0FDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0FDVF9OQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfREVBQ1Q6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9ERUFDVF9BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9ERUFDVF9OQUNLOgorKwkJb2Zmc2V0ID0gZGlzc2N0X3JzbF9pcGFjY2Vzc19tc2codHZiLCBwaW5mbywgdHJlZSwgb2Zmc2V0LTEpOworIAlkZWZhdWx0OgorIAkJYnJlYWs7CisgCX0KK0BAIC0zNDg3LDYgKzM4NzQsNDAgQEAgZGlzc2N0X3JzbF9tc2codHZidWZmX3QgKnR2YiwgcGFja2V0X2luZm8gKnBpbmZvLCBwcm90b190cmVlICp0cmVlLCBpbnQgb2Zmc2V0KQorIAlyZXR1cm4gb2Zmc2V0OworIAorIH0KKysKKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9pcGFjY19zcG1fc192YWxzW10gPSB7CisrCXsgMCwJIkdTTSBGUiBjb2RlYyAoR1NNIHR5cGUgMSwgRlMpIiB9LAorKwl7IDEsCSJHU00gRUZSIGNvZGVjIChHU00gdHlwZSAyLCBGUykiIH0sCisrCXsgMiwgCSJHU00gQU1SL0ZSIGNvZGVjIChHU00gdHlwZSAzLCBGUykiIH0sCisrCXsgMywJIkdTTSBIUiBjb2RlYyAoR1NNIHR5cGUgMSwgSFMpIiB9LAorKwl7IDUsCSJHU00gQU1SL0hSIGNvZGVjIChHU00gdHlwZSAzLCBIUykiIH0sCisrCXsgMHhmLAkiQXMgc3BlY2lmaWVkIGJ5IFJUUCBQYXlsb2FkIFR5cGUgSUUiIH0sCisrCXsgMCwJTlVMTCB9CisrfTsKKysKKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9pcGFjY19zcG1fbV92YWxzW10gPSB7CisrCXsgMCwJIlNlbmQgYW5kIFJlY2VpdmUiIH0sCisrCXsgMSwJIlJlY2VpdmUgT25seSIgfSwKKysJeyAyLAkiU2VuZCBPbmx5IiB9LAorKwl7IDAsIAlOVUxMIH0KKyt9OworKworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgcnNsX2lwYWNjX3J0cF9jc2RfZm10X2RfdmFsc1tdID0geworKwl7IDAsCSJFeHRlcm5hbCBUUkFVIGZvcm1hdCIgfSwKKysJeyAxLAkiTm9uLVRSQVUgUGFja2VkIGZvcm1hdCIgfSwKKysJeyAyLAkiVFJBVSB3aXRoaW4gdGhlIEJUUyIgfSwKKysJeyAzLAkiSVdGLUZyZWUgQlRTLUJUUyBEYXRhIiB9LAorKwl7IDAsIAlOVUxMIH0KKyt9OworKworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgcnNsX2lwYWNjX3J0cF9jc2RfZm10X2lyX3ZhbHNbXSA9IHsKKysJeyAwLAkiOGtiL3MiIH0sCisrCXsgMSwJIjE2a2IvcyIgfSwKKysJeyAyLAkiMzJrYi9zIiB9LAorKwl7IDMsCSI2NGtiL3MiIH0sCisrCXsgMCwJTlVMTCB9CisrfTsKKysKKyBzdGF0aWMgdm9pZAorIGRpc3NlY3RfcnNsKHR2YnVmZl90ICp0dmIsIHBhY2tldF9pbmZvICpwaW5mbywgcHJvdG9fdHJlZSAqdHJlZSkKKyB7CitAQCAtMzUxNCw3ICszOTM1LDYgQEAgZGlzc2VjdF9yc2wodHZidWZmX3QgKnR2YiwgcGFja2V0X2luZm8gKnBpbmZvLCBwcm90b190cmVlICp0cmVlKQorIAkJLyogOS4xIE1lc3NhZ2UgZGlzY3JpbWluYXRvciAqLworIAkJcHJvdG9fdHJlZV9hZGRfaXRlbShyc2xfdHJlZSwgaGZfcnNsX21zZ19kc2MsIHR2Yiwgb2Zmc2V0LCAxLCBGQUxTRSk7CisgCQlwcm90b190cmVlX2FkZF9pdGVtKHJzbF90cmVlLCBoZl9yc2xfVF9iaXQsIHR2Yiwgb2Zmc2V0LCAxLCBGQUxTRSk7CistCQlvZmZzZXQrKzsKKyAKKyAJCW9mZnNldCA9IGRpc3NjdF9yc2xfbXNnKHR2YiwgcGluZm8sIHJzbF90cmVlLCBvZmZzZXQpOworIAorQEAgLTM4ODQsNiArNDMwNCw4NiBAQCB2b2lkIHByb3RvX3JlZ2lzdGVyX3JzbCh2b2lkKQorIAkJCUZUX1VJTlQ4LCBCQVNFX0RFQywgVkFMUyhyc2xfZW1scHBfcHJpb192YWxzKSwgMHgwMywKKyAJCQlOVUxMLCBIRklMTCB9CisgCQl9LAorKwkJeyAmaGZfcnNsX3NwZWVjaF9tb2RlX3MsCisrCQkJeyAiaXAuYWNjZXNzIFNwZWVjaCBNb2RlIFMiLCAicnNsLmlwYWNjLnNwZWVjaF9tb2RlX3MiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKHJzbF9pcGFjY19zcG1fc192YWxzKSwKKysJCQkgIDB4ZiwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9zcGVlY2hfbW9kZV9tLAorKwkJCXsgImlwLmFjY2VzcyBTcGVlY2ggTW9kZSBNIiwgInJzbC5pcGFjYy5zcGVlY2hfbW9kZV9tIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhyc2xfaXBhY2Nfc3BtX21fdmFscyksCisrCQkJICAweGYwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfcnNsX2Nvbm5fc3RhdCwKKysJCQl7ICJpcC5hY2Nlc3MgQ29ubmVjdGlvbiBTdGF0aXN0aWNzIiwicnNsLmlwYWNjLmNvbm5fc3RhdCIsCisrCQkJICBGVF9CWVRFUywgQkFTRV9OT05FLCBOVUxMLCAweDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9yc2xfY29ubl9pZCwKKysJCQl7ICJpcC5hY2Nlc3MgQ29ubmVjdGlvbiBJRCIsCSJyc2wuaXBhY2MuY29ubl9pZCIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAweDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9yc2xfcnRwX3BheWxvYWQsCisrCQkJeyAiaXAuYWNjZXNzIFJUUCBQYXlsb2FkIFR5cGUiLAkicnNsLmlwYWNjLnJ0cF9wYXlsb2FkIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMHgwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfcnNsX3J0cF9jc2RfZm10X2QsCisrCQkJeyAiaXAuYWNjZXNzIFJUUCBDU0QgRm9ybWF0IEQiLCAicnNsLmlwYWNjLnJ0cF9jc2RfZm10X2QiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKHJzbF9pcGFjY19ydHBfY3NkX2ZtdF9kX3ZhbHMpLAorKwkJCSAgMHgwZiwgTlVMTCwgSEZJTEwgfSwKKysJCX0sCisrCQl7ICZoZl9yc2xfcnRwX2NzZF9mbXRfaXIsCisrCQkJeyAiaXAuYWNjZXNzIFJUUCBDU0QgRm9ybWF0IElSIiwgInJzbC5pcGFjYy5ydHBfY3NkX2ZtdF9pciIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMocnNsX2lwYWNjX3J0cF9jc2RfZm10X2lyX3ZhbHMpLAorKwkJCSAgMHhmMCwgTlVMTCwgSEZJTEwgfSwKKysJCX0sCisrCQl7ICZoZl9yc2xfbG9jYWxfcG9ydCwKKysJCQl7ICJpcC5hY2Nlc3MgTG9jYWwgUlRQIFBvcnQiLAkicnNsLmlwYWNjLmxvY2FsX3BvcnQiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMHgwLAorKwkJCSAgImlwLmFjY2VzcyBMb2NhbCBSVFAgUG9ydCIsIEhGSUxMIH0sCisrCQl9LAorKwkJeyAmaGZfcnNsX3JlbW90ZV9wb3J0LAorKwkJCXsgImlwLmFjY2VzcyBSZW1vdGUgUlRQIFBvcnQiLAkicnNsLmlwYWNjLnJlbW90ZV9wb3J0IiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDB4MCwKKysJCQkgICJpcC5hY2Nlc3MgUmVtb3RlIFJUUCBQb3J0IiwgSEZJTEwgfSwKKysJCX0sCisrCQl7ICZoZl9yc2xfbG9jYWxfaXAsCisrCQkJeyAiaXAuYWNjZXNzIExvY2FsIElQIEFkZHJlc3MiLAkicnNsLmlwYWNjLmxvY2FsX2lwIiwKKysJCQkgIEZUX0lQdjQsIEJBU0VfTk9ORSwgTlVMTCwgMHgwLAorKwkJCSAgImlwLmFjY2VzcyBMb2NhbCBJUCBBZGRyZXNzIiwgSEZJTEwgfSwKKysJCX0sCisrCQl7ICZoZl9yc2xfcmVtb3RlX2lwLAorKwkJCXsgImlwLmFjY2VzcyBSZW1vdGUgSVAgQWRkcmVzcyIsICJyc2wuaXBhY2MucmVtb3RlX2lwIiwKKysJCQkgIEZUX0lQdjQsIEJBU0VfTk9ORSwgTlVMTCwgMHgwLAorKwkJCSAgImlwLmFjY2VzcyBSZW1vdGUgSVAgQWRkcmVzcyIsIEhGSUxMIH0sCisrCQl9LAorKwkJeyAmaGZfcnNsX2NzdGF0X3R4X3BrdHMsCisrCQkJeyAiUGFja2V0cyBTZW50IiwgInJzbC5pcGFjYy5jc3RhdC50eF9wa3RzIiwKKysJCQkgIEZUX1VJTlQzMiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9yc2xfY3N0YXRfdHhfb2N0cywKKysJCQl7ICJPY3RldHMgU2VudCIsICJyc2wuaXBhY2MuY3N0YXQudHhfb2N0ZXRzIiwKKysJCQkgIEZUX1VJTlQzMiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9yc2xfY3N0YXRfcnhfcGt0cywKKysJCQl7ICJQYWNrZXRzIFJlY2VpdmVkIiwgInJzbC5pcGFjYy5jc3RhdC5yeF9wa3RzIiwKKysJCQkgIEZUX1VJTlQzMiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9yc2xfY3N0YXRfcnhfb2N0cywKKysJCQl7ICJPY3RldHMgUmVjZWl2ZWQiLCAicnNsLmlwYWNjLmNzdGF0LnJ4X29jdGV0cyIsCisrCQkJICBGVF9VSU5UMzIsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfcnNsX2NzdGF0X2xvc3RfcGt0cywKKysJCQl7ICJQYWNrZXRzIExvc3QiLCAicnNsLmlwYWNjLmNzdGF0Lmxvc3RfcGt0cyIsCisrCQkJICBGVF9VSU5UMzIsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfcnNsX2NzdGF0X2lhX2ppdHRlciwKKysJCQl7ICJJbnRlci1hcnJpdmFsIEppdHRlciIsICJyc2wuaXBhY2MuY3N0YXQuaWFfaml0dGVyIiwKKysJCQkgIEZUX1VJTlQzMiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9yc2xfY3N0YXRfYXZnX3R4X2RseSwKKysJCQl7ICJBdmVyYWdlIFR4IERlbGF5IiwgInJzbC5pcGFjYy5jc3RhdC5hdmdfdHhfZGVsYXkiLAorKwkJCSAgRlRfVUlOVDMyLCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKyAJfTsKKyAJc3RhdGljIGdpbnQgKmV0dFtdID0geworIAkJJmV0dF9yc2wsCitAQCAtMzk0MSw2ICs0NDQxLDE0IEBAIHZvaWQgcHJvdG9fcmVnaXN0ZXJfcnNsKHZvaWQpCisgCQkmZXR0X2llX21lYXNfcmVzX25vLAorIAkJJmV0dF9pZV9tZXNzYWdlX2lkLAorIAkJJmV0dF9pZV9zeXNfaW5mb190eXBlLAorKwkJJmV0dF9pZV9zcGVlY2hfbW9kZSwKKysJCSZldHRfaWVfY29ubl9zdGF0LAorKwkJJmV0dF9pZV9jb25uX2lkLAorKwkJJmV0dF9pZV9yZW1vdGVfaXAsCisrCQkmZXR0X2llX3JlbW90ZV9wb3J0LAorKwkJJmV0dF9pZV9sb2NhbF9wb3J0LAorKwkJJmV0dF9pZV9sb2NhbF9pcCwKKysJCSZldHRfaWVfcnRwX3BheWxvYWQsCisgCX07CisgCisgCS8qIFJlZ2lzdGVyIHRoZSBwcm90b2NvbCBuYW1lIGFuZCBkZXNjcmlwdGlvbiAqLworLS0gCisxLjcuMC4xCisKZGlmZiAtLWdpdCBhL3dpcmVzaGFyay9yc2wtc3lzdGVtX2luZm8ucGF0Y2ggYi93aXJlc2hhcmsvcnNsLXN5c3RlbV9pbmZvLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NDVjNjUKLS0tIC9kZXYvbnVsbAorKysgYi93aXJlc2hhcmsvcnNsLXN5c3RlbV9pbmZvLnBhdGNoCkBAIC0wLDAgKzEsMTMgQEAKK0luZGV4OiB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1yc2wuYworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tIHdpcmVzaGFyay5vcmlnL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtcnNsLmMKKysrKyB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1yc2wuYworQEAgLTIyOTEsNyArMjI5MSw3IEBACisgCisgCXByb3RvX3RyZWVfYWRkX3RleHQoaWVfdHJlZSwgdHZiLG9mZnNldCxsZW5ndGgsIkxheWVyIDMgbWVzc2FnZSIpOworIAluZXh0X3R2YiA9IHR2Yl9uZXdfc3Vic2V0KHR2Yiwgb2Zmc2V0LCBsZW5ndGgsIGxlbmd0aCk7CistCS8qIGNhbGxfZGlzc2VjdG9yKGdzbV9hX2R0YXBfaGFuZGxlLCBuZXh0X3R2YiwgcGluZm8sIHRvcF90cmVlKTsqLworKwljYWxsX2Rpc3NlY3Rvcihnc21fYV9jY2NoX2hhbmRsZSwgbmV4dF90dmIsIHBpbmZvLCB0b3BfdHJlZSk7CisgCisgCW9mZnNldCA9IG9mZnNldCArIGxlbmd0aDsKKyAK