ZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9ocDMwMC9NYWtlZmlsZSBiL2FyY2gvbTY4ay9ocDMwMC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWI2MzE3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tNjhrL2hwMzAwL01ha2VmaWxlCkBAIC0wLDAgKzEsNSBAQAorIworIyBNYWtlZmlsZSBmb3IgTGludXggYXJjaC9tNjhrL2hwMzAwIHNvdXJjZSBkaXJlY3RvcnkKKyMKKworb2JqLXkJCTo9IGtzeW1zLm8gY29uZmlnLm8gaW50cy5vIHRpbWUubyByZWJvb3QubwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2hwMzAwL1JFQURNRS5ocDMwMCBiL2FyY2gvbTY4ay9ocDMwMC9SRUFETUUuaHAzMDAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcwNzNmYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbTY4ay9ocDMwMC9SRUFETUUuaHAzMDAKQEAgLTAsMCArMSwxNCBAQAorSFAzMDAgbm90ZXMKKy0tLS0tLS0tLS0tCisKK1RoZSBMaW51eC9IUCB3ZWIgcGFnZSBpcyBhdCA8aHR0cDovL3d3dy50YXplbmRhLmRlbW9uLmNvLnVrL3BoaWwvbGludXgtaHAvPgorCitDdXJyZW50bHkgb25seSA5MDAwLzM0MCBtYWNoaW5lcyBoYXZlIGJlZW4gdGVzdGVkLiAgQW55IGFtb3VudCBvZiBSQU0gc2hvdWxkCit3b3JrIG5vdyBidXQgSSd2ZSBvbmx5IHRyaWVkIDE2TUIgYW5kIDEyTUIuCisKK1RoZSBzZXJpYWwgY29uc29sZSBpcyBwcm9iYWJseSBicm9rZW4gYXQgdGhlIG1vbWVudCBidXQgdGhlIFRvcGNhdC9ISUwga2V5Ym9hcmQKK2NvbWJpbmF0aW9uIHNlZW1zIHRvIHdvcmsgZm9yIG1lLiAgWW91ciBtaWxlYWdlIG1heSB2YXJ5LgorCitUaGUgTEFOQ0UgZHJpdmVyIHdvcmtzIGFmdGVyIGEgZmFzaGlvbiBidXQgb25seSBpZiB5b3UgcmVzZXQgdGhlIGNoaXAgYmVmb3JlCitldmVyeSBwYWNrZXQuICBUaGlzIGRvZXNuJ3QgbWFrZSBmb3IgdmVyeSBzcGVlZHkgb3BlcmF0aW9uLgorCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaHAzMDAvY29uZmlnLmMgYi9hcmNoL202OGsvaHAzMDAvY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBiODU0ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbTY4ay9ocDMwMC9jb25maWcuYwpAQCAtMCwwICsxLDI3OSBAQAorLyoKKyAqICBsaW51eC9hcmNoL202OGsvaHAzMDAvY29uZmlnLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4IFBoaWxpcCBCbHVuZGVsbCA8cGhpbGJAZ251Lm9yZz4KKyAqCisgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBIUDMwMC1zcGVjaWZpYyBpbml0aWFsaXNhdGlvbiBjb2RlLiAgSXQgZ2V0cworICogIGNhbGxlZCBieSBzZXR1cC5jLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorCisjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vYmxpbmtlbi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkYigpIGFuZCB3cml0ZWIoKSAqLworI2luY2x1ZGUgPGFzbS9ocDMwMGh3Lmg+CisjaW5jbHVkZSA8YXNtL3J0Yy5oPgorCisjaW5jbHVkZSAiaW50cy5oIgorI2luY2x1ZGUgInRpbWUuaCIKKwordW5zaWduZWQgbG9uZyBocDMwMF9tb2RlbDsKK3Vuc2lnbmVkIGxvbmcgaHAzMDBfdWFydF9zY29kZSA9IC0xOwordW5zaWduZWQgY2hhciBsZWRzdGF0ZTsKKworc3RhdGljIGNoYXIgc19ocDMzMFtdIF9faW5pdGRhdGEgPSAiMzMwIjsKK3N0YXRpYyBjaGFyIHNfaHAzNDBbXSBfX2luaXRkYXRhID0gIjM0MCI7CitzdGF0aWMgY2hhciBzX2hwMzQ1W10gX19pbml0ZGF0YSA9ICIzNDUiOworc3RhdGljIGNoYXIgc19ocDM2MFtdIF9faW5pdGRhdGEgPSAiMzYwIjsKK3N0YXRpYyBjaGFyIHNfaHAzNzBbXSBfX2luaXRkYXRhID0gIjM3MCI7CitzdGF0aWMgY2hhciBzX2hwMzc1W10gX19pbml0ZGF0YSA9ICIzNzUiOworc3RhdGljIGNoYXIgc19ocDM4MFtdIF9faW5pdGRhdGEgPSAiMzgwIjsKK3N0YXRpYyBjaGFyIHNfaHAzODVbXSBfX2luaXRkYXRhID0gIjM4NSI7CitzdGF0aWMgY2hhciBzX2hwNDAwW10gX19pbml0ZGF0YSA9ICI0MDAiOworc3RhdGljIGNoYXIgc19ocDQyNXRbXSBfX2luaXRkYXRhID0gIjQyNXQiOworc3RhdGljIGNoYXIgc19ocDQyNXNbXSBfX2luaXRkYXRhID0gIjQyNXMiOworc3RhdGljIGNoYXIgc19ocDQyNWVbXSBfX2luaXRkYXRhID0gIjQyNWUiOworc3RhdGljIGNoYXIgc19ocDQzM3RbXSBfX2luaXRkYXRhID0gIjQzM3QiOworc3RhdGljIGNoYXIgc19ocDQzM3NbXSBfX2luaXRkYXRhID0gIjQzM3MiOworc3RhdGljIGNoYXIgKmhwMzAwX21vZGVsc1tdIF9faW5pdGRhdGEgPSB7CisJW0hQXzMyMF0JPSBOVUxMLAorCVtIUF8zMzBdCT0gc19ocDMzMCwKKwlbSFBfMzQwXQk9IHNfaHAzNDAsCisJW0hQXzM0NV0JPSBzX2hwMzQ1LAorCVtIUF8zNTBdCT0gTlVMTCwKKwlbSFBfMzYwXQk9IHNfaHAzNjAsCisJW0hQXzM3MF0JPSBzX2hwMzcwLAorCVtIUF8zNzVdCT0gc19ocDM3NSwKKwlbSFBfMzgwXQk9IHNfaHAzODAsCisJW0hQXzM4NV0JPSBzX2hwMzg1LAorCVtIUF80MDBdCT0gc19ocDQwMCwKKwlbSFBfNDI1VF0JPSBzX2hwNDI1dCwKKwlbSFBfNDI1U10JPSBzX2hwNDI1cywKKwlbSFBfNDI1RV0JPSBzX2hwNDI1ZSwKKwlbSFBfNDMzVF0JPSBzX2hwNDMzdCwKKwlbSFBfNDMzU10JPSBzX2hwNDMzcywKK307CisKK3N0YXRpYyBjaGFyIGhwMzAwX21vZGVsX25hbWVbMTNdID0gIkhQOTAwMC8iOworCitleHRlcm4gdm9pZCBocDMwMF9yZXNldCh2b2lkKTsKK2V4dGVybiBpcnFyZXR1cm5fdCAoKmhwMzAwX2RlZmF1bHRfaGFuZGxlcltdKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CitleHRlcm4gaW50IHNob3dfaHAzMDBfaW50ZXJydXB0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKiwgdm9pZCAqKTsKKyNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRQorZXh0ZXJuIGludCBocDMwMF9zZXR1cF9zZXJpYWxfY29uc29sZSh2b2lkKSBfX2luaXQ7CisjZW5kaWYKKworaW50IF9faW5pdCBocDMwMF9wYXJzZV9ib290aW5mbyhjb25zdCBzdHJ1Y3QgYmlfcmVjb3JkICpyZWNvcmQpCit7CisJaW50IHVua25vd24gPSAwOworCWNvbnN0IHVuc2lnbmVkIGxvbmcgKmRhdGEgPSByZWNvcmQtPmRhdGE7CisKKwlzd2l0Y2ggKHJlY29yZC0+dGFnKSB7CisJY2FzZSBCSV9IUDMwMF9NT0RFTDoKKwkJaHAzMDBfbW9kZWwgPSAqZGF0YTsKKwkJYnJlYWs7CisKKwljYXNlIEJJX0hQMzAwX1VBUlRfU0NPREU6CisJCWhwMzAwX3VhcnRfc2NvZGUgPSAqZGF0YTsKKwkJYnJlYWs7CisKKwljYXNlIEJJX0hQMzAwX1VBUlRfQUREUjoKKwkJLyogc2VyaWFsIHBvcnQgYWRkcmVzczogaWdub3JlZCBoZXJlICovCisJCWJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisJCXVua25vd24gPSAxOworCX0KKworCXJldHVybiB1bmtub3duOworfQorCisjaWZkZWYgQ09ORklHX0hFQVJUQkVBVAorc3RhdGljIHZvaWQgaHAzMDBfcHVsc2UoaW50IHgpCit7CisJaWYgKHgpCisJCWJsaW5rZW5fbGVkcygweDEwLCAwKTsKKwllbHNlCisJCWJsaW5rZW5fbGVkcygwLCAweDEwKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBocDMwMF9nZXRfbW9kZWwoY2hhciAqbW9kZWwpCit7CisJc3RyY3B5KG1vZGVsLCBocDMwMF9tb2RlbF9uYW1lKTsKK30KKworI2RlZmluZSBSVENCQVNFCQkJMHhmMDQyMDAwMAorI2RlZmluZSBSVENfREFUQQkJMHgxCisjZGVmaW5lIFJUQ19DTUQJCQkweDMKKworI2RlZmluZQlSVENfQlVTWQkJMHgwMgorI2RlZmluZQlSVENfREFUQV9SRFkJCTB4MDEKKworI2RlZmluZSBydGNfYnVzeSgpCQkoaW5fOChSVENCQVNFICsgUlRDX0NNRCkgJiBSVENfQlVTWSkKKyNkZWZpbmUgcnRjX2RhdGFfYXZhaWxhYmxlKCkJKGluXzgoUlRDQkFTRSArIFJUQ19DTUQpICYgUlRDX0RBVEFfUkRZKQorI2RlZmluZSBydGNfc3RhdHVzKCkJCShpbl84KFJUQ0JBU0UgKyBSVENfQ01EKSkKKyNkZWZpbmUgcnRjX2NvbW1hbmQoeCkJCW91dF84KFJUQ0JBU0UgKyBSVENfQ01ELCAoeCkpCisjZGVmaW5lIHJ0Y19yZWFkX2RhdGEoKQkJKGluXzgoUlRDQkFTRSArIFJUQ19EQVRBKSkKKyNkZWZpbmUgcnRjX3dyaXRlX2RhdGEoeCkJb3V0XzgoUlRDQkFTRSArIFJUQ19EQVRBLCAoeCkpCisKKyNkZWZpbmUgUlRDX1NFVFJFRwkweGUwCisjZGVmaW5lIFJUQ19XUklURVJFRwkweGMyCisjZGVmaW5lIFJUQ19SRUFEUkVHCTB4YzMKKworI2RlZmluZSBSVENfUkVHX1NFQzIJMAorI2RlZmluZSBSVENfUkVHX1NFQzEJMQorI2RlZmluZSBSVENfUkVHX01JTjIJMgorI2RlZmluZSBSVENfUkVHX01JTjEJMworI2RlZmluZSBSVENfUkVHX0hPVVIyCTQKKyNkZWZpbmUgUlRDX1JFR19IT1VSMQk1CisjZGVmaW5lIFJUQ19SRUdfV0RBWQk2CisjZGVmaW5lIFJUQ19SRUdfREFZMgk3CisjZGVmaW5lIFJUQ19SRUdfREFZMQk4CisjZGVmaW5lIFJUQ19SRUdfTU9OMgk5CisjZGVmaW5lIFJUQ19SRUdfTU9OMQkxMAorI2RlZmluZSBSVENfUkVHX1lFQVIyCTExCisjZGVmaW5lIFJUQ19SRUdfWUVBUjEJMTIKKworI2RlZmluZSBSVENfSE9VUjFfMjRITU9ERSAweDgKKworI2RlZmluZSBSVENfU1RBVF9NQVNLCTB4ZjAKKyNkZWZpbmUgUlRDX1NUQVRfUkRZCTB4NDAKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIGhwMzAwX3J0Y19yZWFkKHVuc2lnbmVkIGNoYXIgcmVnKQoreworCXVuc2lnbmVkIGNoYXIgcywgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwl3aGlsZSAocnRjX2J1c3koKSk7CisJcnRjX2NvbW1hbmQoUlRDX1NFVFJFRyk7CisJd2hpbGUgKHJ0Y19idXN5KCkpOworCXJ0Y193cml0ZV9kYXRhKHJlZyk7CisJd2hpbGUgKHJ0Y19idXN5KCkpOworCXJ0Y19jb21tYW5kKFJUQ19SRUFEUkVHKTsKKworCWRvIHsKKwkJd2hpbGUgKCFydGNfZGF0YV9hdmFpbGFibGUoKSk7CisJCXMgPSBydGNfc3RhdHVzKCk7CisJCXJldCA9IHJ0Y19yZWFkX2RhdGEoKTsKKwl9IHdoaWxlICgocyAmIFJUQ19TVEFUX01BU0spICE9IFJUQ19TVEFUX1JEWSk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgaHAzMDBfcnRjX3dyaXRlKHVuc2lnbmVkIGNoYXIgcmVnLAorCQkJCQkgICAgdW5zaWduZWQgY2hhciB2YWwpCit7CisJdW5zaWduZWQgY2hhciBzLCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCXdoaWxlIChydGNfYnVzeSgpKTsKKwlydGNfY29tbWFuZChSVENfU0VUUkVHKTsKKwl3aGlsZSAocnRjX2J1c3koKSk7CisJcnRjX3dyaXRlX2RhdGEoKHZhbCA8PCA0KSB8IHJlZyk7CisJd2hpbGUgKHJ0Y19idXN5KCkpOworCXJ0Y19jb21tYW5kKFJUQ19XUklURVJFRyk7CisJd2hpbGUgKHJ0Y19idXN5KCkpOworCXJ0Y19jb21tYW5kKFJUQ19SRUFEUkVHKTsKKworCWRvIHsKKwkJd2hpbGUgKCFydGNfZGF0YV9hdmFpbGFibGUoKSk7CisJCXMgPSBydGNfc3RhdHVzKCk7CisJCXJldCA9IHJ0Y19yZWFkX2RhdGEoKTsKKwl9IHdoaWxlICgocyAmIFJUQ19TVEFUX01BU0spICE9IFJUQ19TVEFUX1JEWSk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGhwMzAwX2h3Y2xrKGludCBvcCwgc3RydWN0IHJ0Y190aW1lICp0KQoreworCWlmICghb3ApIHsgLyogcmVhZCAqLworCQl0LT50bV9zZWMgID0gaHAzMDBfcnRjX3JlYWQoUlRDX1JFR19TRUMxKSAqIDEwICsKKwkJCWhwMzAwX3J0Y19yZWFkKFJUQ19SRUdfU0VDMik7CisJCXQtPnRtX21pbiAgPSBocDMwMF9ydGNfcmVhZChSVENfUkVHX01JTjEpICogMTAgKworCQkJaHAzMDBfcnRjX3JlYWQoUlRDX1JFR19NSU4yKTsKKwkJdC0+dG1faG91ciA9IChocDMwMF9ydGNfcmVhZChSVENfUkVHX0hPVVIxKSAmIDMpICogMTAgKworCQkJaHAzMDBfcnRjX3JlYWQoUlRDX1JFR19IT1VSMik7CisJCXQtPnRtX3dkYXkgPSAtMTsKKwkJdC0+dG1fbWRheSA9IGhwMzAwX3J0Y19yZWFkKFJUQ19SRUdfREFZMSkgKiAxMCArCisJCQlocDMwMF9ydGNfcmVhZChSVENfUkVHX0RBWTIpOworCQl0LT50bV9tb24gID0gaHAzMDBfcnRjX3JlYWQoUlRDX1JFR19NT04xKSAqIDEwICsKKwkJCWhwMzAwX3J0Y19yZWFkKFJUQ19SRUdfTU9OMikgLSAxOworCQl0LT50bV95ZWFyID0gaHAzMDBfcnRjX3JlYWQoUlRDX1JFR19ZRUFSMSkgKiAxMCArCisJCQlocDMwMF9ydGNfcmVhZChSVENfUkVHX1lFQVIyKTsKKwkJaWYgKHQtPnRtX3llYXIgPD0gNjkpCisJCQl0LT50bV95ZWFyICs9IDEwMDsKKwl9IGVsc2UgeworCQlocDMwMF9ydGNfd3JpdGUoUlRDX1JFR19TRUMxLCB0LT50bV9zZWMgLyAxMCk7CisJCWhwMzAwX3J0Y193cml0ZShSVENfUkVHX1NFQzIsIHQtPnRtX3NlYyAlIDEwKTsKKwkJaHAzMDBfcnRjX3dyaXRlKFJUQ19SRUdfTUlOMSwgdC0+dG1fbWluIC8gMTApOworCQlocDMwMF9ydGNfd3JpdGUoUlRDX1JFR19NSU4yLCB0LT50bV9taW4gJSAxMCk7CisJCWhwMzAwX3J0Y193cml0ZShSVENfUkVHX0hPVVIxLAorCQkJCSgodC0+dG1faG91ciAvIDEwKSAmIDMpIHwgUlRDX0hPVVIxXzI0SE1PREUpOworCQlocDMwMF9ydGNfd3JpdGUoUlRDX1JFR19IT1VSMiwgdC0+dG1faG91ciAlIDEwKTsKKwkJaHAzMDBfcnRjX3dyaXRlKFJUQ19SRUdfREFZMSwgdC0+dG1fbWRheSAvIDEwKTsKKwkJaHAzMDBfcnRjX3dyaXRlKFJUQ19SRUdfREFZMiwgdC0+dG1fbWRheSAlIDEwKTsKKwkJaHAzMDBfcnRjX3dyaXRlKFJUQ19SRUdfTU9OMSwgKHQtPnRtX21vbiArIDEpIC8gMTApOworCQlocDMwMF9ydGNfd3JpdGUoUlRDX1JFR19NT04yLCAodC0+dG1fbW9uICsgMSkgJSAxMCk7CisJCWlmICh0LT50bV95ZWFyID49IDEwMCkKKwkJCXQtPnRtX3llYXIgLT0gMTAwOworCQlocDMwMF9ydGNfd3JpdGUoUlRDX1JFR19ZRUFSMSwgdC0+dG1feWVhciAvIDEwKTsKKwkJaHAzMDBfcnRjX3dyaXRlKFJUQ19SRUdfWUVBUjIsIHQtPnRtX3llYXIgJSAxMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaHAzMDBfZ2V0X3NzKHZvaWQpCit7CisJcmV0dXJuIGhwMzAwX3J0Y19yZWFkKFJUQ19SRUdfU0VDMSkgKiAxMCArCisJCWhwMzAwX3J0Y19yZWFkKFJUQ19SRUdfU0VDMik7Cit9CisKK3ZvaWQgX19pbml0IGNvbmZpZ19ocDMwMCh2b2lkKQoreworCW1hY2hfc2NoZWRfaW5pdCAgICAgID0gaHAzMDBfc2NoZWRfaW5pdDsKKwltYWNoX2luaXRfSVJRICAgICAgICA9IGhwMzAwX2luaXRfSVJROworCW1hY2hfcmVxdWVzdF9pcnEgICAgID0gaHAzMDBfcmVxdWVzdF9pcnE7CisJbWFjaF9mcmVlX2lycSAgICAgICAgPSBocDMwMF9mcmVlX2lycTsKKwltYWNoX2dldF9tb2RlbCAgICAgICA9IGhwMzAwX2dldF9tb2RlbDsKKwltYWNoX2dldF9pcnFfbGlzdCAgICA9IHNob3dfaHAzMDBfaW50ZXJydXB0czsKKwltYWNoX2dldHRpbWVvZmZzZXQgICA9IGhwMzAwX2dldHRpbWVvZmZzZXQ7CisJbWFjaF9kZWZhdWx0X2hhbmRsZXIgPSAmaHAzMDBfZGVmYXVsdF9oYW5kbGVyOworCW1hY2hfaHdjbGsJICAgICA9IGhwMzAwX2h3Y2xrOworCW1hY2hfZ2V0X3NzCSAgICAgPSBocDMwMF9nZXRfc3M7CisJbWFjaF9yZXNldCAgICAgICAgICAgPSBocDMwMF9yZXNldDsKKyNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCisJbWFjaF9oZWFydGJlYXQgICAgICAgPSBocDMwMF9wdWxzZTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19EVU1NWV9DT05TT0xFCisJY29uc3dpdGNocAkgICAgID0gJmR1bW15X2NvbjsKKyNlbmRpZgorCW1hY2hfbWF4X2RtYV9hZGRyZXNzID0gMHhmZmZmZmZmZjsKKworCWlmIChocDMwMF9tb2RlbCA+PSBIUF8zMzAgJiYgaHAzMDBfbW9kZWwgPD0gSFBfNDMzUyAmJiBocDMwMF9tb2RlbCAhPSBIUF8zNTApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRGV0ZWN0ZWQgSFA5MDAwIG1vZGVsICVzXG4iLCBocDMwMF9tb2RlbHNbaHAzMDBfbW9kZWwtSFBfMzIwXSk7CisJCXN0cmNhdChocDMwMF9tb2RlbF9uYW1lLCBocDMwMF9tb2RlbHNbaHAzMDBfbW9kZWwtSFBfMzIwXSk7CisJfQorCWVsc2UgeworCQlwYW5pYygiVW5rbm93biBIUDkwMDAgTW9kZWwiKTsKKwl9CisjaWZkZWYgQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEUKKwlocDMwMF9zZXR1cF9zZXJpYWxfY29uc29sZSgpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9hcmNoL202OGsvaHAzMDAvaHAzMDBtYXAubWFwIGIvYXJjaC9tNjhrL2hwMzAwL2hwMzAwbWFwLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjQ1ZjBhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tNjhrL2hwMzAwL2hwMzAwbWFwLm1hcApAQCAtMCwwICsxLDI1MiBAQAorIyBIUDMwMCBrZXJuZWwga2V5bWFwLiBUaGlzIHVzZXMgNyBtb2RpZmllciBjb21iaW5hdGlvbnMuCitrZXltYXBzIDAtMiw0LTUsOCwxMgorIyBDaGFuZ2UgdGhlIGFib3ZlIGxpbmUgaW50bworIwlrZXltYXBzIDAtMiw0LTYsOCwxMgorIyBpbiBjYXNlIHlvdSB3YW50IHRoZSBlbnRyaWVzCisjCWFsdGdyICAgY29udHJvbCBrZXljb2RlICA4MyA9IEJvb3QKKyMJYWx0Z3IgICBjb250cm9sIGtleWNvZGUgMTExID0gQm9vdAorIyBiZWxvdy4KKyMKKyMgSW4gZmFjdCBBbHRHciBpcyB1c2VkIHZlcnkgbGl0dGxlLCBhbmQgb25lIG1vcmUga2V5bWFwIGNhbgorIyBiZSBzYXZlZCBieSBtYXBwaW5nIEFsdEdyIHRvIEFsdCAoYW5kIGFkYXB0aW5nIGEgZmV3IGVudHJpZXMpOgorIyBrZXljb2RlIDEwMCA9IEFsdAorIwora2V5Y29kZSAgIDEgPQora2V5Y29kZSAgIDIgPSBBbHQKK2tleWNvZGUgICAzID0gQWx0CitrZXljb2RlICAgNCA9IFNoaWZ0CitrZXljb2RlICAgNSA9IFNoaWZ0CitrZXljb2RlICAgNiA9IENvbnRyb2wKK2tleWNvZGUgICA3ID0KK2tleWNvZGUgICA4ID0KK2tleWNvZGUgICA5ID0KK2tleWNvZGUgIDEwID0KK2tleWNvZGUgIDExID0KK2tleWNvZGUgIDEyID0KK2tleWNvZGUgIDEzID0KK2tleWNvZGUgIDE0ID0KK2tleWNvZGUgIDE1ID0KK2tleWNvZGUgIDE2ID0KK2tleWNvZGUgIDE3ID0KK2tleWNvZGUgIDE4ID0KK2tleWNvZGUgIDE5ID0KK2tleWNvZGUgIDIwID0KK2tleWNvZGUgIDIxID0KK2tleWNvZGUgIDIyID0KK2tleWNvZGUgIDIzID0KK2tleWNvZGUgIDI0ID0gYgora2V5Y29kZSAgMjUgPSB2CitrZXljb2RlICAyNiA9IGMKK2tleWNvZGUgIDI3ID0geAora2V5Y29kZSAgMjggPSB6CitrZXljb2RlICAyOSA9CitrZXljb2RlICAzMCA9CitrZXljb2RlICAzMSA9IEVzY2FwZQkJRGVsZXRlCitrZXljb2RlICAzMiA9CitrZXljb2RlICAzMyA9CitrZXljb2RlICAzNCA9CitrZXljb2RlICAzNSA9CitrZXljb2RlICAzNiA9CitrZXljb2RlICAzNyA9CitrZXljb2RlICAzOCA9CitrZXljb2RlICAzOSA9CitrZXljb2RlICA0MCA9IGgKK2tleWNvZGUgIDQxID0gZwora2V5Y29kZSAgNDIgPSBmCitrZXljb2RlICA0MyA9IGQKK2tleWNvZGUgIDQ0ID0gcwora2V5Y29kZSAgNDUgPSBhCitrZXljb2RlICA0NiA9CitrZXljb2RlICA0NyA9IENhcHNfTG9jawora2V5Y29kZSAgNDggPSB1CitrZXljb2RlICA0OSA9IHkKK2tleWNvZGUgIDUwID0gdAora2V5Y29kZSAgNTEgPSByCitrZXljb2RlICA1MiA9IGUKK2tleWNvZGUgIDUzID0gdwora2V5Y29kZSAgNTQgPSBxCitrZXljb2RlICA1NSA9IFRhYgkJVGFiCisJYWx0ICAgICBrZXljb2RlICAgIDU1ID0gTWV0YV9UYWIKK2tleWNvZGUgIDU2ID0gc2V2ZW4JCWFtcGVyc2FuZAora2V5Y29kZSAgNTcgPSBzaXgJCWFzY2lpY2lyY3VtCitrZXljb2RlICA1OCA9IGZpdmUJCXBlcmNlbnQKK2tleWNvZGUgIDU5ID0gZm91cgkJZG9sbGFyCitrZXljb2RlICA2MCA9IHRocmVlCQludW1iZXJzaWduCitrZXljb2RlICA2MSA9IHR3bwkJYXQJCWF0CitrZXljb2RlICA2MiA9IG9uZQkJZXhjbGFtCQlleGNsYW0KK2tleWNvZGUgIDYzID0gZ3JhdmUJCWFzY2lpdGlsZGUKKwljb250cm9sIGtleWNvZGUgICAgNjMgPSBudWwKKwlhbHQgICAgIGtleWNvZGUgICAgNjMgPSBNZXRhX2dyYXZlCitrZXljb2RlICA2NCA9CitrZXljb2RlICA2NSA9CitrZXljb2RlICA2NiA9CitrZXljb2RlICA2NyA9CitrZXljb2RlICA2OCA9CitrZXljb2RlICA2OSA9CitrZXljb2RlICA3MCA9CitrZXljb2RlICA3MSA9CitrZXljb2RlICA3MiA9CitrZXljb2RlICA3MyA9IEY0CisJY29udHJvbCBrZXljb2RlCSAgIDczID0gQ29uc29sZV80CitrZXljb2RlICA3NCA9IEYzCisJY29udHJvbCBrZXljb2RlCSAgIDc0ID0gQ29uc29sZV8zCitrZXljb2RlICA3NSA9IEYyCisJY29udHJvbCBrZXljb2RlCSAgIDc1ID0gQ29uc29sZV8yCitrZXljb2RlICA3NiA9IEYxCisJY29udHJvbCBrZXljb2RlCSAgIDc2ID0gQ29uc29sZV8xCitrZXljb2RlICA3NyA9CitrZXljb2RlICA3OCA9CitrZXljb2RlICA3OSA9CitrZXljb2RlICA4MCA9CitrZXljb2RlICA4MSA9IEY1CisJY29udHJvbCBrZXljb2RlCSAgIDgxID0gQ29uc29sZV81CitrZXljb2RlICA4MiA9IEY2CisJY29udHJvbCBrZXljb2RlCSAgIDgyID0gQ29uc29sZV82CitrZXljb2RlICA4MyA9IEY3CisJY29udHJvbCBrZXljb2RlCSAgIDgzID0gQ29uc29sZV83CitrZXljb2RlICA4NCA9IEY4CisJY29udHJvbCBrZXljb2RlCSAgIDg0ID0gQ29uc29sZV84CitrZXljb2RlICA4NSA9CitrZXljb2RlICA4NiA9CitrZXljb2RlICA4NyA9CitrZXljb2RlICA4OCA9IGVpZ2h0CQlhc3Rlcmlzawlhc3Rlcmlzawora2V5Y29kZSAgODkgPSBuaW5lCQlwYXJlbmxlZnQJYnJhY2tldGxlZnQKK2tleWNvZGUgIDkwID0gemVybwkJcGFyZW5yaWdodAlicmFja2V0cmlnaHQKK2tleWNvZGUgIDkxID0gbWludXMJCXVuZGVyc2NvcmUKK2tleWNvZGUgIDkyID0gZXF1YWwJCXBsdXMKK2tleWNvZGUgIDkzID0gQmFja1NwYWNlCitrZXljb2RlICA5NCA9CitrZXljb2RlICA5NSA9CitrZXljb2RlICA5NiA9IGkKK2tleWNvZGUgIDk3ID0gbwora2V5Y29kZSAgOTggPSBwCitrZXljb2RlICA5OSA9IGJyYWNrZXRsZWZ0CWJyYWNlbGVmdAora2V5Y29kZSAxMDAgPSBicmFja2V0cmlnaHQJYnJhY2VyaWdodAora2V5Y29kZSAxMDEgPSBiYWNrc2xhc2gJCWJhcgorCWNvbnRyb2wga2V5Y29kZSAgIDEwMSA9IENvbnRyb2xfYmFja3NsYXNoCisJYWx0ICAgICBrZXljb2RlICAgMTAxID0gTWV0YV9iYWNrc2xhc2gKK2tleWNvZGUgMTAyID0KK2tleWNvZGUgMTAzID0KK2tleWNvZGUgMTA0ID0gagora2V5Y29kZSAxMDUgPSBrCitrZXljb2RlIDEwNiA9IGwKK2tleWNvZGUgMTA3ID0gc2VtaWNvbG9uCQljb2xvbgorCWFsdCAgICAga2V5Y29kZSAgIDEwNyA9IE1ldGFfc2VtaWNvbG9uCitrZXljb2RlIDEwOCA9IGFwb3N0cm9waGUJcXVvdGVkYmwKKwljb250cm9sIGtleWNvZGUgICAxMDggPSBDb250cm9sX2cKKwlhbHQgICAgIGtleWNvZGUgICAxMDggPSBNZXRhX2Fwb3N0cm9waGUKK2tleWNvZGUgMTA5ID0gUmV0dXJuCitrZXljb2RlIDExMCA9CitrZXljb2RlIDExMSA9CitrZXljb2RlIDExMiA9IG0KK2tleWNvZGUgMTEzID0gY29tbWEJCWxlc3MKK2tleWNvZGUgMTE0ID0gcGVyaW9kCQlncmVhdGVyCitrZXljb2RlIDExNSA9IHNsYXNoCQlxdWVzdGlvbgora2V5Y29kZSAxMTYgPQora2V5Y29kZSAxMTcgPQora2V5Y29kZSAxMTggPQora2V5Y29kZSAxMTkgPQora2V5Y29kZSAxMjAgPSBuCitrZXljb2RlIDEyMSA9IHNwYWNlCQlzcGFjZQora2V5Y29kZSAxMjIgPQora2V5Y29kZSAxMjMgPQora2V5Y29kZSAxMjQgPSBMZWZ0CitrZXljb2RlIDEyNSA9IERvd24KK2tleWNvZGUgMTI2ID0gVXAKK2tleWNvZGUgMTI3ID0gUmlnaHQKK3N0cmluZyBGMSA9ICJcMDMzW1tBIgorc3RyaW5nIEYyID0gIlwwMzNbW0IiCitzdHJpbmcgRjMgPSAiXDAzM1tbQyIKK3N0cmluZyBGNCA9ICJcMDMzW1tEIgorc3RyaW5nIEY1ID0gIlwwMzNbW0UiCitzdHJpbmcgRjYgPSAiXDAzM1sxN34iCitzdHJpbmcgRjcgPSAiXDAzM1sxOH4iCitzdHJpbmcgRjggPSAiXDAzM1sxOX4iCitzdHJpbmcgRjkgPSAiXDAzM1syMH4iCitzdHJpbmcgRjEwID0gIlwwMzNbMjF+Igorc3RyaW5nIEYxMSA9ICJcMDMzWzIzfiIKK3N0cmluZyBGMTIgPSAiXDAzM1syNH4iCitzdHJpbmcgRjEzID0gIlwwMzNbMjV+Igorc3RyaW5nIEYxNCA9ICJcMDMzWzI2fiIKK3N0cmluZyBGMTUgPSAiXDAzM1syOH4iCitzdHJpbmcgRjE2ID0gIlwwMzNbMjl+Igorc3RyaW5nIEYxNyA9ICJcMDMzWzMxfiIKK3N0cmluZyBGMTggPSAiXDAzM1szMn4iCitzdHJpbmcgRjE5ID0gIlwwMzNbMzN+Igorc3RyaW5nIEYyMCA9ICJcMDMzWzM0fiIKK3N0cmluZyBGaW5kID0gIlwwMzNbMX4iCitzdHJpbmcgSW5zZXJ0ID0gIlwwMzNbMn4iCitzdHJpbmcgUmVtb3ZlID0gIlwwMzNbM34iCitzdHJpbmcgU2VsZWN0ID0gIlwwMzNbNH4iCitzdHJpbmcgUHJpb3IgPSAiXDAzM1s1fiIKK3N0cmluZyBOZXh0ID0gIlwwMzNbNn4iCitzdHJpbmcgTWFjcm8gPSAiXDAzM1tNIgorc3RyaW5nIFBhdXNlID0gIlwwMzNbUCIKK2NvbXBvc2UgJ2AnICdBJyB0byAnwCcKK2NvbXBvc2UgJ2AnICdhJyB0byAn4CcKK2NvbXBvc2UgJ1wnJyAnQScgdG8gJ8EnCitjb21wb3NlICdcJycgJ2EnIHRvICfhJworY29tcG9zZSAnXicgJ0EnIHRvICfCJworY29tcG9zZSAnXicgJ2EnIHRvICfiJworY29tcG9zZSAnficgJ0EnIHRvICfDJworY29tcG9zZSAnficgJ2EnIHRvICfjJworY29tcG9zZSAnIicgJ0EnIHRvICfEJworY29tcG9zZSAnIicgJ2EnIHRvICfkJworY29tcG9zZSAnTycgJ0EnIHRvICfFJworY29tcG9zZSAnbycgJ2EnIHRvICflJworY29tcG9zZSAnMCcgJ0EnIHRvICfFJworY29tcG9zZSAnMCcgJ2EnIHRvICflJworY29tcG9zZSAnQScgJ0EnIHRvICfFJworY29tcG9zZSAnYScgJ2EnIHRvICflJworY29tcG9zZSAnQScgJ0UnIHRvICfGJworY29tcG9zZSAnYScgJ2UnIHRvICfmJworY29tcG9zZSAnLCcgJ0MnIHRvICfHJworY29tcG9zZSAnLCcgJ2MnIHRvICfnJworY29tcG9zZSAnYCcgJ0UnIHRvICfIJworY29tcG9zZSAnYCcgJ2UnIHRvICfoJworY29tcG9zZSAnXCcnICdFJyB0byAnyScKK2NvbXBvc2UgJ1wnJyAnZScgdG8gJ+knCitjb21wb3NlICdeJyAnRScgdG8gJ8onCitjb21wb3NlICdeJyAnZScgdG8gJ+onCitjb21wb3NlICciJyAnRScgdG8gJ8snCitjb21wb3NlICciJyAnZScgdG8gJ+snCitjb21wb3NlICdgJyAnSScgdG8gJ8wnCitjb21wb3NlICdgJyAnaScgdG8gJ+wnCitjb21wb3NlICdcJycgJ0knIHRvICfNJworY29tcG9zZSAnXCcnICdpJyB0byAn7ScKK2NvbXBvc2UgJ14nICdJJyB0byAnzicKK2NvbXBvc2UgJ14nICdpJyB0byAn7icKK2NvbXBvc2UgJyInICdJJyB0byAnzycKK2NvbXBvc2UgJyInICdpJyB0byAn7ycKK2NvbXBvc2UgJy0nICdEJyB0byAn0CcKK2NvbXBvc2UgJy0nICdkJyB0byAn8CcKK2NvbXBvc2UgJ34nICdOJyB0byAn0ScKK2NvbXBvc2UgJ34nICduJyB0byAn8ScKK2NvbXBvc2UgJ2AnICdPJyB0byAn0icKK2NvbXBvc2UgJ2AnICdvJyB0byAn8icKK2NvbXBvc2UgJ1wnJyAnTycgdG8gJ9MnCitjb21wb3NlICdcJycgJ28nIHRvICfzJworY29tcG9zZSAnXicgJ08nIHRvICfUJworY29tcG9zZSAnXicgJ28nIHRvICf0JworY29tcG9zZSAnficgJ08nIHRvICfVJworY29tcG9zZSAnficgJ28nIHRvICf1JworY29tcG9zZSAnIicgJ08nIHRvICfWJworY29tcG9zZSAnIicgJ28nIHRvICf2JworY29tcG9zZSAnLycgJ08nIHRvICfYJworY29tcG9zZSAnLycgJ28nIHRvICf4JworY29tcG9zZSAnYCcgJ1UnIHRvICfZJworY29tcG9zZSAnYCcgJ3UnIHRvICf5JworY29tcG9zZSAnXCcnICdVJyB0byAn2icKK2NvbXBvc2UgJ1wnJyAndScgdG8gJ/onCitjb21wb3NlICdeJyAnVScgdG8gJ9snCitjb21wb3NlICdeJyAndScgdG8gJ/snCitjb21wb3NlICciJyAnVScgdG8gJ9wnCitjb21wb3NlICciJyAndScgdG8gJ/wnCitjb21wb3NlICdcJycgJ1knIHRvICfdJworY29tcG9zZSAnXCcnICd5JyB0byAn/ScKK2NvbXBvc2UgJ1QnICdIJyB0byAn3icKK2NvbXBvc2UgJ3QnICdoJyB0byAn/icKK2NvbXBvc2UgJ3MnICdzJyB0byAn3ycKK2NvbXBvc2UgJyInICd5JyB0byAn/ycKK2NvbXBvc2UgJ3MnICd6JyB0byAn3ycKK2NvbXBvc2UgJ2knICdqJyB0byAn/ycKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9ocDMwMC9pbnRzLmMgYi9hcmNoL202OGsvaHAzMDAvaW50cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNWJiNDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL202OGsvaHAzMDAvaW50cy5jCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogIGxpbnV4L2FyY2gvbTY4ay9ocDMwMC9pbnRzLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4IFBoaWxpcCBCbHVuZGVsbCA8cGhpbGJAZ251Lm9yZz4KKyAqCisgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBIUDMwMC1zcGVjaWZpYyBpbnRlcnJ1cHQgaGFuZGxpbmcuCisgKiAgV2Ugb25seSB1c2UgdGhlIGF1dG92ZWN0b3IgaW50ZXJydXB0cywgYW5kIHRoZXJlZm9yZSB3ZSBuZWVkIHRvCisgKiAgbWFpbnRhaW4gbGlzdHMgb2YgZGV2aWNlcyBzaGFyaW5nIGVhY2ggaXBsLgorICogIFtpcGwgbGlzdCBjb2RlIGFkZGVkIGJ5IFBldGVyIE1heWRlbGwgPHBtYXlkZWxsQGNoaWFyay5ncmVlbmVuZC5vcmcudWs+IDA2LzE5OThdCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdHJhcHMuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSAiaW50cy5oIgorCisvKiBFYWNoIGlwbCBoYXMgYSBsaW5rZWQgbGlzdCBvZiBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lcy4KKyAqIFNlcnZpY2Ugcm91dGluZXMgYXJlIGFkZGVkIHZpYSBocDMwMF9yZXF1ZXN0X2lycSgpIGFuZCByZW1vdmVkCisgKiB2aWEgaHAzMDBfZnJlZV9pcnEoKS4gVGhlIGRldmljZSBkcml2ZXIgc2hvdWxkIHNldCBJUlFfRkxHX0ZBU1QKKyAqIGlmIGl0IG5lZWRzIHRvIGJlIHNlcnZpY2VkIGVhcmx5IChlZyBGSUZPbGVzcyBVQVJUcyk7IHRoaXMgd2lsbAorICogY2F1c2UgaXQgdG8gYmUgYWRkZWQgYXQgdGhlIGZyb250IG9mIHRoZSBxdWV1ZSByYXRoZXIgdGhhbgorICogdGhlIGJhY2suCisgKiBDdXJyZW50bHkgSVJRX0ZMR19TTE9XIGFuZCBmbGFncz0wIGFyZSB0cmVhdGVkIGlkZW50aWNhbGx5OyBpZgorICogd2UgbmVlZGVkIHRocmVlIGxldmVscyBvZiBwcmlvcml0eSB3ZSBjb3VsZCBkaXN0aW5ndWlzaCB0aGVtCisgKiBidXQgdGhpcyBzdHJpa2VzIG1lIGFzIG1pbGRseSB1Z2x5Li4uCisgKi8KKworLyogd2Ugc3RhcnQgd2l0aCBubyBlbnRyaWVzIGluIGFueSBsaXN0ICovCitzdGF0aWMgaXJxX25vZGVfdCAqaHAzMDBfaXJxX2xpc3RbSFAzMDBfTlVNX0lSUVNdOworCitzdGF0aWMgc3BpbmxvY2tfdCBpcnFsaXN0X2xvY2s7CisKKy8qIFRoaXMgaGFuZGxlciByZWNlaXZlcyBhbGwgaW50ZXJydXB0cywgZGlzcGF0Y2hpbmcgdGhlbSB0byB0aGUgcmVnaXN0ZXJlZCBoYW5kbGVycyAqLworc3RhdGljIGlycXJldHVybl90IGhwMzAwX2ludF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwKQoreworICAgICAgICBpcnFfbm9kZV90ICp0OworICAgICAgICAvKiBXZSBqdXN0IGdpdmUgZXZlcnkgaGFuZGxlciBvbiB0aGUgY2hhaW4gYW4gb3Bwb3J0dW5pdHkgdG8gaGFuZGxlCisgICAgICAgICAqIHRoZSBpbnRlcnJ1cHQsIGluIHByaW9yaXR5IG9yZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgZm9yKHQgPSBocDMwMF9pcnFfbGlzdFtpcnFdOyB0OyB0PXQtPm5leHQpCisgICAgICAgICAgICAgICAgdC0+aGFuZGxlcihpcnEsIHQtPmRldl9pZCwgZnApOworICAgICAgICAvKiBXZSBjb3VsZCBwdXQgaW4gc29tZSBhY2NvdW50aW5nIHJvdXRpbmVzLCBjaGVja3MgZm9yIHN0cmF5IGludGVycnVwdHMsCisgICAgICAgICAqIGV0YywgaW4gaGVyZS4gTm90ZSB0aGF0IGN1cnJlbnRseSB3ZSBjYW4ndCB0ZWxsIHdoZXRoZXIgb3Igbm90CisgICAgICAgICAqIGEgaGFuZGxlciBoYW5kbGVzIHRoZSBpbnRlcnJ1cHQsIHRob3VnaC4KKyAgICAgICAgICovCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaHAzMDBfYmFkaW50KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwKQoreworCW51bV9zcHVyaW91cyArPSAxOworCXJldHVybiBJUlFfTk9ORTsKK30KKworaXJxcmV0dXJuX3QgKCpocDMwMF9kZWZhdWx0X2hhbmRsZXJbU1lTX0lSUVNdKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKikgPSB7CisJWzBdID0gaHAzMDBfYmFkaW50LAorCVsxXSA9IGhwMzAwX2ludF9oYW5kbGVyLAorCVsyXSA9IGhwMzAwX2ludF9oYW5kbGVyLAorCVszXSA9IGhwMzAwX2ludF9oYW5kbGVyLAorCVs0XSA9IGhwMzAwX2ludF9oYW5kbGVyLAorCVs1XSA9IGhwMzAwX2ludF9oYW5kbGVyLAorCVs2XSA9IGhwMzAwX2ludF9oYW5kbGVyLAorCVs3XSA9IGhwMzAwX2ludF9oYW5kbGVyCit9OworCisvKiBkZXZfaWQgaGFkIGJldHRlciBiZSB1bmlxdWUgdG8gZWFjaCBoYW5kbGVyIGJlY2F1c2UgaXQncyB0aGUgb25seSB3YXkgd2UgaGF2ZQorICogdG8gZGlzdGluZ3Vpc2ggaGFuZGxlcnMgd2hlbiByZW1vdmluZyB0aGVtLi4uCisgKgorICogSXQgd291bGQgYmUgcHJldHR5IGVhc3kgdG8gc3VwcG9ydCBJUlFfRkxHX0xPQ0sgKGhhbmRsZXIgaXMgbm90IHJlcGxhY2FibGUpCisgKiBhbmQgSVJRX0ZMR19SRVBMQUNFIChoYW5kbGVyIHJlcGxhY2VzIGV4aXN0aW5nIG9uZSB3aXRoIHRoaXMgZGV2X2lkKQorICogaWYgd2Ugd2FudGVkIHRvLiBJUlFfRkxHX0ZBU1QgaXMgbmVlZGVkIGZvciBkZXZpY2VzIHdoZXJlIGludGVycnVwdCBsYXRlbmN5CisgKiBtYXR0ZXJzIChlZyB0aGUgZHJlYWRlZCBGSUZPbGVzcyBVQVJULi4uKQorICovCitpbnQgaHAzMDBfcmVxdWVzdF9pcnEodW5zaWduZWQgaW50IGlycSwKKyAgICAgICAgICAgICAgICAgICAgICBpcnFyZXR1cm5fdCAoKmhhbmRsZXIpIChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCAqZGV2X2lkKQoreworICAgICAgICBpcnFfbm9kZV90ICp0LCAqbiA9IG5ld19pcnFfbm9kZSgpOworCisgICAgICAgIGlmICghbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9vcHMsIG5vIGZyZWUgbm9kZXMgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpcnFsaXN0X2xvY2ssIGZsYWdzKTsKKworICAgICAgICBpZiAoIWhwMzAwX2lycV9saXN0W2lycV0pIHsKKyAgICAgICAgICAgICAgICAvKiBubyBsaXN0IHlldCAqLworICAgICAgICAgICAgICAgIGhwMzAwX2lycV9saXN0W2lycV0gPSBuOworICAgICAgICAgICAgICAgIG4tPm5leHQgPSBOVUxMOworICAgICAgICB9IGVsc2UgaWYgKGZsYWdzICYgSVJRX0ZMR19GQVNUKSB7CisgICAgICAgICAgICAgICAgLyogaW5zZXJ0IGF0IGhlYWQgb2YgbGlzdCAqLworICAgICAgICAgICAgICAgIG4tPm5leHQgPSBocDMwMF9pcnFfbGlzdFtpcnFdOworICAgICAgICAgICAgICAgIGhwMzAwX2lycV9saXN0W2lycV0gPSBuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIGluc2VydCBhdCBlbmQgb2YgbGlzdCAqLworICAgICAgICAgICAgICAgIGZvcih0ID0gaHAzMDBfaXJxX2xpc3RbaXJxXTsgdC0+bmV4dDsgdCA9IHQtPm5leHQpCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBkbyBub3RoaW5nICovOworICAgICAgICAgICAgICAgIG4tPm5leHQgPSBOVUxMOworICAgICAgICAgICAgICAgIHQtPm5leHQgPSBuOworICAgICAgICB9CisKKyAgICAgICAgLyogRmlsbCBpbiBuIGFwcHJvcHJpYXRlbHkgKi8KKyAgICAgICAgbi0+aGFuZGxlciA9IGhhbmRsZXI7CisgICAgICAgIG4tPmZsYWdzID0gZmxhZ3M7CisgICAgICAgIG4tPmRldl9pZCA9IGRldl9pZDsKKyAgICAgICAgbi0+ZGV2bmFtZSA9IGRldm5hbWU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxbGlzdF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaHAzMDBfZnJlZV9pcnEodW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworICAgICAgICBpcnFfbm9kZV90ICp0OworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZpcnFsaXN0X2xvY2ssIGZsYWdzKTsKKworICAgICAgICB0ID0gaHAzMDBfaXJxX2xpc3RbaXJxXTsKKyAgICAgICAgaWYgKCF0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gaGFuZGxlcnMgYXQgYWxsIGZvciB0aGF0IElSUSAqLworICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJocDMwMF9mcmVlX2lycTogYXR0ZW1wdCB0byByZW1vdmUgbm9uZXhpc3RlbnQgaGFuZGxlciBmb3IgSVJRICVkXG4iLCBpcnEpOworICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycWxpc3RfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAodC0+ZGV2X2lkID09IGRldl9pZCkKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVtb3ZpbmcgZmlyc3QgaGFuZGxlciBvbiBjaGFpbiAqLworICAgICAgICAgICAgICAgIHQtPmZsYWdzID0gSVJRX0ZMR19TVEQ7ICAgICAgICAgICAvKiB3ZSBwcm9iYWJseSBkb24ndCByZWFsbHkgbmVlZCB0aGVzZSAqLworICAgICAgICAgICAgICAgIHQtPmRldl9pZCA9IE5VTEw7CisgICAgICAgICAgICAgICAgdC0+ZGV2bmFtZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgdC0+aGFuZGxlciA9IE5VTEw7ICAgICAgICAgICAgICAgIC8qIGZyZWVzIHRoaXMgaXJxX25vZGVfdCAqLworICAgICAgICAgICAgICAgIGhwMzAwX2lycV9saXN0W2lycV0gPSB0LT5uZXh0OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFsaXN0X2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLyogT0ssIG11c3QgYmUgcmVtb3ZpbmcgZnJvbSBtaWRkbGUgb2YgdGhlIGNoYWluICovCisKKyAgICAgICAgZm9yICh0ID0gaHAzMDBfaXJxX2xpc3RbaXJxXTsgdC0+bmV4dCAmJiB0LT5uZXh0LT5kZXZfaWQgIT0gZGV2X2lkOyB0ID0gdC0+bmV4dCkKKyAgICAgICAgICAgICAgICAvKiBkbyBub3RoaW5nICovOworICAgICAgICBpZiAoIXQtPm5leHQpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImhwMzAwX2ZyZWVfaXJxOiBhdHRlbXB0IHRvIHJlbW92ZSBub25leGlzdGVudCBoYW5kbGVyIGZvciBJUlEgJWRcbiIsIGlycSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycWxpc3RfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLyogcmVtb3ZlIHRoZSBlbnRyeSBhZnRlciB0OiAqLworICAgICAgICB0LT5uZXh0LT5mbGFncyA9IElSUV9GTEdfU1REOworICAgICAgICB0LT5uZXh0LT5kZXZfaWQgPSBOVUxMOworCXQtPm5leHQtPmRldm5hbWUgPSBOVUxMOworCXQtPm5leHQtPmhhbmRsZXIgPSBOVUxMOworICAgICAgICB0LT5uZXh0ID0gdC0+bmV4dC0+bmV4dDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycWxpc3RfbG9jaywgZmxhZ3MpOworfQorCitpbnQgc2hvd19ocDMwMF9pbnRlcnJ1cHRzKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdikKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZCBfX2luaXQgaHAzMDBfaW5pdF9JUlEodm9pZCkKK3sKKwlzcGluX2xvY2tfaW5pdCgmaXJxbGlzdF9sb2NrKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9ocDMwMC9pbnRzLmggYi9hcmNoL202OGsvaHAzMDAvaW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZmFiZTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL202OGsvaHAzMDAvaW50cy5oCkBAIC0wLDAgKzEsOSBAQAorZXh0ZXJuIHZvaWQgaHAzMDBfaW5pdF9JUlEodm9pZCk7CitleHRlcm4gdm9pZCAoKmhwMzAwX2hhbmRsZXJzWzhdKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CitleHRlcm4gdm9pZCBocDMwMF9mcmVlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICpkZXZfaWQpOworZXh0ZXJuIGludCBocDMwMF9yZXF1ZXN0X2lycSh1bnNpZ25lZCBpbnQgaXJxLAorCQlpcnFyZXR1cm5fdCAoKmhhbmRsZXIpIChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksCisJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldl9pZCk7CisKKy8qIG51bWJlciBvZiBpbnRlcnJ1cHRzLCBpbmNsdWRlcyAwICh3aGF0J3MgdGhhdD8pICovCisjZGVmaW5lIEhQMzAwX05VTV9JUlFTIDgKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9ocDMwMC9rc3ltcy5jIGIvYXJjaC9tNjhrL2hwMzAwL2tzeW1zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIwMjgzMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbTY4ay9ocDMwMC9rc3ltcy5jCkBAIC0wLDAgKzEsOSBAQAorLyoKKyAqICBsaW51eC9hcmNoL202OGsvaHAzMDAva3N5bXMuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTggUGhpbGlwIEJsdW5kZWxsIDxwaGlsYkBnbnUub3JnPgorICoKKyAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEhQMzAwLXNwZWNpZmljIGtlcm5lbCBzeW1ib2xzLiAgTm9uZSB5ZXQuIDotKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9ocDMwMC9yZWJvb3QuUyBiL2FyY2gvbTY4ay9ocDMwMC9yZWJvb3QuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmViODUyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tNjhrL2hwMzAwL3JlYm9vdC5TCkBAIC0wLDAgKzEsMTYgQEAKKy8qCisgKiAgbGludXgvYXJjaC9tNjhrL2hwMzAwL3JlYm9vdC5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5OCBQaGlsaXAgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+CisgKgorICogIERvIHRoZSBkaXJ0eSB3b3JrIG9mIHJlYm9vdGluZyB0aGUgbWFjaGluZS4gIEJhc2ljYWxseSB3ZSBuZWVkIHRvIHVuZG8gYWxsIHRoZQorICogIGdvb2Qgc3R1ZmYgdGhhdCBoZWFkLlMgZGlkIHdoZW4gd2Ugc3RhcnRlZCB1cC4gIFRoZSBjYWNoZXMgYW5kIE1NVSBtdXN0IGJlCisgKiAgZGlzYWJsZWQgYW5kIHRoZW4gd2UganVtcCBiYWNrIHRvIHRoZSBQUk9NLiAgVGhpcyBpcyBhIGJpdCBncnVlc29tZSBidXQgd2UgcHV0CisgKiAgYSBicmF2ZSBmYWNlIG9uIGl0LgorICovCisKKy8qIFhYWCBEb2Vzbid0IHdvcmsgeWV0LiAgTm90IHN1cmUgd2h5IGFuZCBjYW4ndCBiZSBib3RoZXJlZCB0byBmaXggaXQgYXQgdGhlIG1vbWVudC4gKi8KKworCS5nbG9ibAlocDMwMF9yZXNldAoraHAzMDBfcmVzZXQ6CisJam1wCWhwMzAwX3Jlc2V0CmRpZmYgLS1naXQgYS9hcmNoL202OGsvaHAzMDAvdGltZS5jIGIvYXJjaC9tNjhrL2hwMzAwL3RpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGE1YjFiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tNjhrL2hwMzAwL3RpbWUuYwpAQCAtMCwwICsxLDc4IEBACisvKgorICogIGxpbnV4L2FyY2gvbTY4ay9ocDMwMC90aW1lLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4IFBoaWxpcCBCbHVuZGVsbCA8cGhpbGJAZ251Lm9yZz4KKyAqCisgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBIUDMwMC1zcGVjaWZpYyB0aW1lIGhhbmRsaW5nIGNvZGUuCisgKi8KKworI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS90cmFwcy5oPgorI2luY2x1ZGUgPGFzbS9ibGlua2VuLmg+CisjaW5jbHVkZSAiaW50cy5oIgorCisvKiBDbG9jayBoYXJkd2FyZSBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIENMT0NLQkFTRQkweGYwNWY4MDAwCisKKyNkZWZpbmUJQ0xLQ1IxCQkweDEKKyNkZWZpbmUJQ0xLQ1IyCQkweDMKKyNkZWZpbmUJQ0xLQ1IzCQlDTEtDUjEKKyNkZWZpbmUJQ0xLU1IJCUNMS0NSMgorI2RlZmluZQlDTEtNU0IxCQkweDUKKyNkZWZpbmUJQ0xLTVNCMgkJMHg5CisjZGVmaW5lCUNMS01TQjMJCTB4RAorCisvKiBUaGlzIGlzIGZvciBtYWNoaW5lcyB3aGljaCBnZW5lcmF0ZSB0aGUgZXhhY3QgY2xvY2suICovCisjZGVmaW5lIFVTRUNTX1BFUl9KSUZGWSAoMTAwMDAwMC9IWikKKworI2RlZmluZSBJTlRWQUwgKCgxMDAwMCAvIDQpIC0gMSkKKworc3RhdGljIGlycXJldHVybl90IGhwMzAwX3RpY2soaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwlpcnFyZXR1cm5fdCAoKnZlY3RvcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopID0gZGV2X2lkOworCWluXzgoQ0xPQ0tCQVNFICsgQ0xLU1IpOworCWFzbSB2b2xhdGlsZSAoIm1vdnB3ICUxQCg1KSwlMCIgOiAiPWQiICh0bXApIDogImEiIChDTE9DS0JBU0UpKTsKKwkvKiBUdXJuIG9mZiB0aGUgbmV0d29yayBhbmQgU0NTSSBsZWRzICovCisJYmxpbmtlbl9sZWRzKDAsIDB4ZTApOworCXJldHVybiB2ZWN0b3IoaXJxLCBOVUxMLCByZWdzKTsKK30KKwordW5zaWduZWQgbG9uZyBocDMwMF9nZXR0aW1lb2Zmc2V0KHZvaWQpCit7CisgIC8qIFJlYWQgY3VycmVudCB0aW1lciAxIHZhbHVlICovCisgIHVuc2lnbmVkIGNoYXIgbHNiLCBtc2IxLCBtc2IyOworICB1bnNpZ25lZCBzaG9ydCB0aWNrczsKKworICBtc2IxID0gaW5fOChDTE9DS0JBU0UgKyA1KTsKKyAgbHNiID0gaW5fOChDTE9DS0JBU0UgKyA3KTsKKyAgbXNiMiA9IGluXzgoQ0xPQ0tCQVNFICsgNSk7CisgIGlmIChtc2IxICE9IG1zYjIpCisgICAgLyogQSBjYXJyeSBoYXBwZW5lZCB3aGlsZSB3ZSB3ZXJlIHJlYWRpbmcuICBSZWFkIGl0IGFnYWluICovCisgICAgbHNiID0gaW5fOChDTE9DS0JBU0UgKyA3KTsKKyAgdGlja3MgPSBJTlRWQUwgLSAoKG1zYjIgPDwgOCkgfCBsc2IpOworICByZXR1cm4gKFVTRUNTX1BFUl9KSUZGWSAqIHRpY2tzKSAvIElOVFZBTDsKK30KKwordm9pZCBfX2luaXQgaHAzMDBfc2NoZWRfaW5pdChpcnFyZXR1cm5fdCAoKnZlY3RvcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopKQoreworICBvdXRfOChDTE9DS0JBU0UgKyBDTEtDUjIsIDB4MSk7CQkvKiBzZWxlY3QgQ1IxICovCisgIG91dF84KENMT0NLQkFTRSArIENMS0NSMSwgMHgxKTsJCS8qIHJlc2V0ICovCisKKyAgYXNtIHZvbGF0aWxlKCIgbW92cHcgJTAsJTFAKDUpIiA6IDogImQiIChJTlRWQUwpLCAiYSIgKENMT0NLQkFTRSkpOworCisgIGNwdV9yZXF1ZXN0X2lycSg2LCBocDMwMF90aWNrLCBJUlFfRkxHX1NURCwgInRpbWVyIHRpY2siLCB2ZWN0b3IpOworCisgIG91dF84KENMT0NLQkFTRSArIENMS0NSMiwgMHgxKTsJCS8qIHNlbGVjdCBDUjEgKi8KKyAgb3V0XzgoQ0xPQ0tCQVNFICsgQ0xLQ1IxLCAweDQwKTsJCS8qIGVuYWJsZSBpcnEgKi8KK30KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9ocDMwMC90aW1lLmggYi9hcmNoL202OGsvaHAzMDAvdGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZjk5ODcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL202OGsvaHAzMDAvdGltZS5oCkBAIC0wLDAgKzEsNCBAQAorZXh0ZXJuIHZvaWQgaHAzMDBfc2NoZWRfaW5pdChpcnFyZXR1cm5fdCAoKnZlY3RvcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGhwMzAwX2dldHRpbWVvZmZzZXQgKHZvaWQpOworCisK