LyoKICAgIDw6Y29weXJpZ2h0LUJSQ006MjAxMzpEVUFML0dQTDpzdGFuZGFyZAogICAgCiAgICAgICBDb3B5cmlnaHQgKGMpIDIwMTMgQnJvYWRjb20gQ29ycG9yYXRpb24KICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKICAgIAogICAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQogICAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAogICAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCiAgICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKICAgIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CiAgICAKICAgICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKICAgICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAogICAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgogICAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAogICAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCiAgICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCiAgICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucwogICAgICAgb2YgdGhlIHNvZnR3YXJlLgogICAgCiAgICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKICAgIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAogICAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKICAgIHdyaXR0ZW4gY29uc2VudC4KICAgIAogICAgOj4gCgoqLwoKI2luY2x1ZGUgImJic2kuaCIKI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KCiNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDMwKQojZWxzZQp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWludHB0cl90OwojZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzMCkKCiNkZWZpbmUgTU9DQV9SRCh4KSAgICAoKCgoc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqKXByaXYtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKS0+dXNlX3NwaSA9PSAwKSA/IFwKICAgICAgICAgICAgICAgICAgICAgICAoKigodm9sYXRpbGUgdWludDMyX3QgKikoKHVuc2lnbmVkIGxvbmcpKHgpKSkpIDogXAogICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3Qpa2VyU3lzQmNtU3BpU2xhdmVSZWFkUmVnMzIoKChzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICopcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpLT5zcGksICh1aW50MzJfdCkoeCkpKSkKCiNkZWZpbmUgTU9DQV9SRDgoeCwgeSkgKCgoKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSktPnVzZV9zcGkgPT0gMCkgPyBcCiAgICAgICAgICAgICAgICAgICAgICAgICgqKHkpID0gKigodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSgodW5zaWduZWQgbG9uZykoeCkpKSkgOiBcCiAgICAgICAgICAgICAgICAgICAgICAgIChrZXJTeXNCY21TcGlTbGF2ZVJlYWQoKChzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICopcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpLT5zcGksICh1bnNpZ25lZCBsb25nKSh4KSwgeSwgMSkpKQoKI2RlZmluZSBNT0NBX1dSKHgseSkgICBkbyB7ICgoKChzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICopcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpLT51c2Vfc3BpID09IDApID8gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKCooKHZvbGF0aWxlIHVpbnQzMl90ICopKCh1bnNpZ25lZCBsb25nKSh4KSkpKSA9ICh5KSA6IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlclN5c0JjbVNwaVNsYXZlV3JpdGVSZWczMigoKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSktPnNwaSwgKHVpbnQzMl90KSh4KSwgKHkpKSk7IH0gd2hpbGUoMCkKCiNkZWZpbmUgTU9DQV9XUjgoeCx5KSAgICBkbyB7ICgoKChzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICopcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpLT51c2Vfc3BpID09IDApID8gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCooKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikoKHVuc2lnbmVkIGxvbmcpKHgpKSkpID0gKHVuc2lnbmVkIGNoYXIpKHkpIDogXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VyU3lzQmNtU3BpU2xhdmVXcml0ZSgoKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSktPnNwaSwgKHVuc2lnbmVkIGxvbmcpKHgpLCAoeSksIDEpKTsgfSB3aGlsZSgwKQoKI2RlZmluZSBNT0NBX1dSMTYoeCx5KSAgIGRvIHsgKCgoKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSktPnVzZV9zcGkgPT0gMCkgPyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKigodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikoKHVuc2lnbmVkIGxvbmcpKHgpKSkpID0gKHVuc2lnbmVkIHNob3J0KSh5KSA6IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlclN5c0JjbVNwaVNsYXZlV3JpdGUoKChzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICopcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpLT5zcGksICh1bnNpZ25lZCBsb25nKSh4KSwgKHkpLCAyKSk7IH0gd2hpbGUoMCkKCiNkZWZpbmUgTU9DQV9XUl9CTE9DSyhhZGRyLCBzcmMsIGxlbikgZG8geyBrZXJTeXNCY21TcGlTbGF2ZVdyaXRlQnVmKCgoc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqKXByaXYtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKS0+c3BpLCBhZGRyLCBzcmMsIGxlbiwgNCk7IH0gd2hpbGUoMCkKI2RlZmluZSBNT0NBX1JEX0JMT0NLKGFkZHIsIGRzdCwgbGVuKSBkbyB7IGtlclN5c0JjbVNwaVNsYXZlUmVhZEJ1ZigoKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSktPnNwaSwgYWRkciwgZHN0LCBsZW4sIDQpOyB9IHdoaWxlKDApCgoKI2RlZmluZSBJMkNfUkQoeCkJCU1PQ0FfUkQoeCkKI2RlZmluZSBJMkNfV1IoeCwgeSkJCU1PQ0FfV1IoeCwgeSkKCiNkZWZpbmUgTU9DQV9CUENNX05VTSAgICAgICAgIDUKI2RlZmluZSBNT0NBX0JQQ01fWk9ORVNfTlVNICAgOAoKdHlwZWRlZiBlbnVtIF9QTUJfQ09NTUFORF9FXwp7CiAgIFBNQl9DT01NQU5EX0FMTF9PRkYgPSAwLAogICBQTUJfQ09NTUFORF9BTExfT04sCgogICBQTUJfQ09NTUFORF9MQVNUCn0gUE1CX0NPTU1BTkRfRTsKCnN0YXRpYyB1aW50MzJfdCB6b25lX29mZl9iaXRtYXNrW01PQ0FfQlBDTV9OVU1dID0geyAweEZGLCAweDAzLCAweDMwLCAweDAwLCAweDAwIH07CnN0YXRpYyB1aW50MzJfdCB6b25lX29uX2JpdG1hc2tbTU9DQV9CUENNX05VTV0gID0geyAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGIH07CgpzdGF0aWMgdm9pZCBib2d1c19yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKewp9CgpzdGF0aWMgc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSBtb2NhX2xhbl9kYXRhID0gewoJLm1hY2FkZHJfaGkgPQkJMHgwMDAwMDEwMiwKCS5tYWNhZGRyX2xvID0JCTB4MDMwNDAwMDAsCgoJLmJjbTM0NTBfaTJjX2Jhc2UgPSAgMHgxMDQwNjIwMCwKCS5iY20zNDUwX2kyY19hZGRyID0gIDB4NzAsCgkuc3BpX2Jhc2UgPQkweDEwNjAwMDAwLAoJLmh3X3JldiAgPSAgICAgSFdSRVZfTU9DQV8yMF9HRU4yMiwKCS5yZl9iYW5kID0gICAgIE1PQ0FfQkFORF9FWFRfRCwKCS5jaGlwX2lkID0gICAgIDAsCgkudXNlX2RtYSAgICAgICAgICAgPSAwLAoJLnVzZV9zcGkgICAgICAgICAgID0gMSwKCS5kZXZJZCAgICAgICAgICAgID0gTU9DQV9ERVZJQ0VfSURfVU5SRUdJU1RFUkVELCAvLyBGaWxsZWQgaW4gZHluYW1pY2FsbHkKI2lmZGVmIENPTkZJR19TTVAKCS5zbXBfcHJvY2Vzc29yX2lkID0gMSwKI2VuZGlmCn07CgpzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtb2NhX2xhbl9wbGF0X2RldiA9IHsKCS5uYW1lID0gImJtb2NhIiwKCS5pZCA9IDAsCgkubnVtX3Jlc291cmNlcyA9IDAsCgkucmVzb3VyY2UgPSBOVUxMLAoJLmRldiA9IHsKCQkucGxhdGZvcm1fZGF0YSA9ICZtb2NhX2xhbl9kYXRhLAoJCS5yZWxlYXNlID0gYm9ndXNfcmVsZWFzZSwKCX0sCn07CgpzdGF0aWMgc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSBtb2NhX3dhbl9kYXRhID0gewoJLm1hY2FkZHJfaGkgICAgICAgPSAweDAwMDAwMTAyLAoJLm1hY2FkZHJfbG8gICAgICAgPSAweDAzMDQwMDAwLAoKCS5iY20zNDUwX2kyY19iYXNlID0gIDB4MTA0MDYyMDAsCgkuYmNtMzQ1MF9pMmNfYWRkciA9ICAweDcwLAoJLnNwaV9iYXNlID0JMHgxMDYwMDAwMCwKCS5od19yZXYgID0gSFdSRVZfTU9DQV8yMF9HRU4yMiwKCS5jaGlwX2lkID0gMCwKCQoJLnJmX2JhbmQgPSBNT0NBX0JBTkRfRVhUX0QsCgoJLnVzZV9kbWEgICAgICAgICAgID0gMCwKCS51c2Vfc3BpICAgICAgICAgICA9IDEsCgkuZGV2SWQgICAgICAgICAgICA9IE1PQ0FfREVWSUNFX0lEX1VOUkVHSVNURVJFRCwgLy8gRmlsbGVkIGluIGR5bmFtaWNhbGx5CgojaWZkZWYgQ09ORklHX1NNUAoJLnNtcF9wcm9jZXNzb3JfaWQgPSAxLAojZW5kaWYKfTsKCnN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1vY2Ffd2FuX3BsYXRfZGV2ID0gewoJLm5hbWUgICAgICAgICAgPSAiYm1vY2EiLAoJLmlkICAgICAgICAgICAgPSAxLAoJLm51bV9yZXNvdXJjZXMgPSAwLAoJLnJlc291cmNlICAgICAgPSBOVUxMLAoJLmRldiAgICAgICAgICAgPSB7CgkJLnBsYXRmb3JtX2RhdGEgPSAmbW9jYV93YW5fZGF0YSwKCQkucmVsZWFzZSAgICAgICA9IGJvZ3VzX3JlbGVhc2UsCgl9LAp9OwoKc3RhdGljIHZvaWQgbW9jYV9lbmFibGVfaXJxKHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdikKewoJa2VyU3lzTW9jYUhvc3RJbnRyRW5hYmxlKCgoc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqKXByaXYtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKS0+c3BpKTsKfQoKc3RhdGljIHZvaWQgbW9jYV9kaXNhYmxlX2lycShzdHJ1Y3QgbW9jYV9wcml2X2RhdGEgKnByaXYpCnsKCWtlclN5c01vY2FIb3N0SW50ckRpc2FibGUoKChzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICopcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpLT5zcGkpOwp9CgpzdGF0aWMgdm9pZCBtb2NhX3BtYl9idXN5X3dhaXQoc3RydWN0IG1vY2FfcHJpdl9kYXRhICpwcml2KQp7CgkjaWYgMAoJdWludDMyX3QgZGF0YTsKCgkvKiBQb3NzaWJsZSB0aW1lIHNhdmVyOiBUaGUgcmVnaXN0ZXIgYWNjZXNzIHRpbWUgb3ZlciBTUEkgbWF5IAoJICAgYWx3YXlzIGJlIGVub3VnaCB0byBndWFyYW50ZWUgdGhhdCB0aGUgd3JpdGUgd2lsbCBjb21wbGV0ZSAKCSAgIGluIHRpbWUgd2l0aG91dCBoYXZpbmcgdG8gY2hlY2sgdGhlIHN0YXR1cy4gKi8KCWRvCgl7CgkJZGF0YSA9IE1PQ0FfUkQocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPnBtYl9tYXN0ZXJfc3RhdHVzKTsKCX0gd2hpbGUgKGRhdGEgJiAweDEpOwoJI2VuZGlmCn0KCnN0YXRpYyB2b2lkIG1vY2FfcG1iX2NvbnRyb2woc3RydWN0IG1vY2FfcHJpdl9kYXRhICpwcml2LCBQTUJfQ09NTUFORF9FIGNtZCkKewoJaW50IGksIGo7Cgl1aW50MzJfdCAqIHBfem9uZV9jb250cm9sOwoJdWludDMyX3QgZGF0YTsKCglzd2l0Y2ggKGNtZCkKCXsKCQljYXNlIFBNQl9DT01NQU5EX0FMTF9PRkY6CgkJCS8vIFR1cm4gb2ZmIHpvbmUgY29tbWFuZAoJCQlNT0NBX1dSKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5wbWJfbWFzdGVyX3dkYXRhX29mZnNldCwgMHhBMDApOwoJCQlwX3pvbmVfY29udHJvbCA9ICZ6b25lX29mZl9iaXRtYXNrWzBdOwoJCQlicmVhazsKCQljYXNlIFBNQl9DT01NQU5EX0FMTF9PTjoKCQkJLy8gVHVybiBvbiB6b25lIGNvbW1hbmQKCQkJTU9DQV9XUihwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+cG1iX21hc3Rlcl93ZGF0YV9vZmZzZXQsIDB4QzAwKTsKCQkJcF96b25lX2NvbnRyb2wgPSAmem9uZV9vbl9iaXRtYXNrWzBdOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaWxsZWdhbCBjbWQ6ICUwOHhcbiIsCgkJCQlfX0ZVTkNUSU9OX18sIGNtZCk7CgkJCXJldHVybjsKCX0KCglmb3IgKGkgPSAwOyBpIDwgTU9DQV9CUENNX05VTTsgaSsrKQoJewoJCWZvciAoaiA9IDA7IGogPCBNT0NBX0JQQ01fWk9ORVNfTlVNOyBqKyspCgkJewoJCQlpZiAoKnBfem9uZV9jb250cm9sICYgKDEgPDwgaikpCgkJCXsKCQkJCS8vIHpvbmUgYWRkcmVzcyBpbiBicGNtcwoJCQkJZGF0YSA9ICgweDEgPDwgMjApICsgMTYgKyAoaSAqIDQwOTYpICsgKGogKiA0KTsKCQkJCU1PQ0FfV1IocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPnBtYl9tYXN0ZXJfY21kX29mZnNldCwgZGF0YSk7CgkJCQltb2NhX3BtYl9idXN5X3dhaXQocHJpdik7CgkJCX0KCQl9CgkJcF96b25lX2NvbnRyb2wrKzsKCX0KCn0KCnN0YXRpYyB2b2lkIG1vY2FfcG1iX2dpdmVfZndfY250cmwoc3RydWN0IG1vY2FfcHJpdl9kYXRhICpwcml2KQp7CgkvKiBQYXNzIGNvbnRyb2wgb3ZlciB0aGUgbWVtb3JpZXMgdG8gdGhlIEZXICovCglNT0NBX1dSKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5wbWJfbWFzdGVyX3dkYXRhX29mZnNldCwgMHgxKTsKCU1PQ0FfV1IocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPnBtYl9tYXN0ZXJfY21kX29mZnNldCwgMHgxMDAwMDIpOwoJbW9jYV9wbWJfYnVzeV93YWl0KHByaXYpOwp9CgpzdGF0aWMgdm9pZCBtb2NhX2h3X3Jlc2V0KHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdikKewovLwl1bnNpZ25lZCBsb25nIGZsYWdzOwovLyAgIHVpbnQzMl90IGNoaXBpZDsKCgkvKiBkaXNhYmxlIGFuZCBjbGVhciBhbGwgaW50ZXJydXB0cyAqLwoJTU9DQV9XUihwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+bDJfbWFza19zZXRfb2Zmc2V0LCAweGZmZmZmZmZmKTsKCU1PQ0FfUkQocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPmwyX21hc2tfc2V0X29mZnNldCk7CgoJLyogYXNzZXJ0IHJlc2V0cyAqLwoKCS8qIHJlc2V0IENQVSBmaXJzdCwgYm90aCBDUFVzIGZvciBNb0NBIDIwIEhXICovCglpZiAocHJpdi0+aHdfcmV2ID09IEhXUkVWX01PQ0FfMjBfR0VOMjIpCgkJTU9DQV9TRVQocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPnN3X3Jlc2V0X29mZnNldCwgNSk7CgllbHNlCgkJTU9DQV9TRVQocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPnN3X3Jlc2V0X29mZnNldCwgMSk7CgoJTU9DQV9SRChwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+c3dfcmVzZXRfb2Zmc2V0KTsKCgl1ZGVsYXkoMjApOwoKCS8qIHJlc2V0IGV2ZXJ5dGhpbmcgZWxzZSBleGNlcHQgY2xvY2tzICovCglNT0NBX1NFVChwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+c3dfcmVzZXRfb2Zmc2V0LCB+KCgxIDw8IDMpIHwgKDEgPDwgNykpKTsKCU1PQ0FfUkQocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPnN3X3Jlc2V0X29mZnNldCk7CgoJdWRlbGF5KDIwKTsKCgkvKiBkaXNhYmxlIGNsb2NrcyAqLwoJTU9DQV9TRVQocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPnN3X3Jlc2V0X29mZnNldCwgfigxIDw8IDMpKTsKCU1PQ0FfUkQocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPnN3X3Jlc2V0X29mZnNldCk7CgoJTU9DQV9XUihwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+bDJfY2xlYXJfb2Zmc2V0LCAweGZmZmZmZmZmKTsKCU1PQ0FfUkQocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPmwyX2NsZWFyX29mZnNldCk7CgoJLyogUG93ZXIgZG93biBhbGwgem9uZXMgKi8KCW1vY2FfcG1iX2NvbnRyb2wocHJpdiwgUE1CX0NPTU1BTkRfQUxMX09GRik7CgoJLyogUG93ZXIgZG93biBhbGwgU1lTX0NUUkwgbWVtb3JpZXMgKi8KCU1PQ0FfV1IoMHgxMDEwMDA2OCwgMSk7ICAgLy8gQ0xLR0VOX1BMTF9TWVMxX1BMTF9QV1JETgoJTU9DQV9TRVQoMHgxMDEwMDAwYywgMSk7ICAvLyBDTEtHRU5fUExMX1NZUzBfUExMX0NIQU5ORUxfQ1RSTF9DSF8zCgp9CgpzdGF0aWMgdW5zaWduZWQgaW50IG1vY2FfZ2V0X3BoeV9mcmVxKHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdikKewoJdW5zaWduZWQgaW50IHggPSBNT0NBX1JEKDB4MTAxMDAwNDQpOyAvLyBDTEtHRU5fUExMX1NZUzFfUExMX0NIQU5ORUxfQ1RSTF9DSF8yCgoJeCA9ICh4ID4+IDEpICYgMHhGRjsgLy8gR2V0IHRoZSBNRElWX0NIMiBmaWVsZAoKCXJldHVybiggeCA/IDI0MDAgLyB4IDogMCk7Cn0KCi8qIGNhbGxlZCBhbnkgdGltZSB3ZSBzdGFydC9yZXN0YXJ0L3N0b3AgTW9DQSAqLwpzdGF0aWMgdm9pZCBtb2NhX2h3X2luaXQoc3RydWN0IG1vY2FfcHJpdl9kYXRhICpwcml2LCBpbnQgYWN0aW9uKQp7Cgl1MzIgbWFzazsKCXUzMiB0ZW1wOwoJdTMyIGRhdGE7Cgl1MzIgY291bnQgPSAwOwoJc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqIHBNb2NhRGF0YSA9IChzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICopcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CgoJaWYgKGFjdGlvbiA9PSBNT0NBX0VOQUJMRSAmJiAhcHJpdi0+ZW5hYmxlZCkgewoJCWNsa19lbmFibGUocHJpdi0+Y2xrKTsKCgkJTU9DQV9XUigweDEwNDA0MzE4LCAweGZmZmZmZmZkKTsgLy8gU1VOX1RPUF9DVFJMX1NXX0lOSVRfMF9TRVQKCQl1ZGVsYXkoMjApOwoJCU1PQ0FfV1IoMHgxMDQwNDMxYywgMHhmZmZmZmZmZik7IC8vIFNVTl9UT1BfQ1RSTF9TV19JTklUXzBfQ0xFQVIgLS0+IERvIHRoaXMgYXQgc3RhcnQgb2Ygc2VxdWVuY2UKCQl1ZGVsYXkoMjApOwogICAKCQlwcml2LT5lbmFibGVkID0gMTsKCX0KCgkvKiBjbG9jayBub3QgZW5hYmxlZCwgcmVnaXN0ZXIgYWNjZXNzZXMgd2lsbCBmYWlsIHdpdGggYnVzIGVycm9yICovCglpZiAoIXByaXYtPmVuYWJsZWQpCgkJcmV0dXJuOwoKCW1vY2FfaHdfcmVzZXQocHJpdik7Cgl1ZGVsYXkoMSk7CgoJTU9DQV9XUigweDEwODAwMDAwLCAweDAzKTsgICAgICAgLy8gRU1VWF9DTlRSTAoJTU9DQV9XUigweDEwODAwMDBjLCAweDExKTsgICAgICAgLy8gUkdNSUlfMF9DTlRSTAoJTU9DQV9XUigweDEwODAwMDE0LCAweGMwKTsgICAgICAgLy8gUkdNSUlfMF9SWF9DTEtfREVMQVlfQ05UUkwKCglNT0NBX1dSKDB4MTA0MDQwYTQsIDB4MDEpOyAgICAgICAvLyBHRU5FUkFMX0NUUkxfTk9fU0NBTl8wCglNT0NBX1dSKDB4MTA0MDQxMDAsIDB4MTExMTAwMTEpOyAvLyBQSU5fTVVYX0NUUkxfMAoJTU9DQV9XUigweDEwNDA0MTA0LCAweDExMTExMTExKTsgLy8gUElOX01VWF9DVFJMXzEKCglpZiAoYWN0aW9uID09IE1PQ0FfRU5BQkxFKSB7CgoJCS8qIFBvd2VyIHVwIGFsbCB6b25lcyAqLwoJCW1vY2FfcG1iX2NvbnRyb2wocHJpdiwgUE1CX0NPTU1BTkRfQUxMX09OKTsKCQltb2NhX3BtYl9naXZlX2Z3X2NudHJsKHByaXYpOwoKCQlNT0NBX1VOU0VUKDB4MTAxMDAwMGMsIDEpOyAgLy8gQ0xLR0VOX1BMTF9TWVMwX1BMTF9DSEFOTkVMX0NUUkxfQ0hfMyAKCgkJTU9DQV9XUigweDEwMTAwMDZDLCAxKTsgIC8vIENMS0dFTl9QTExfU1lTMV9QTExfUkVTRVQgCgkJTU9DQV9XUigweDEwMTAwMDY4LCAwKTsgIC8vIENMS0dFTl9QTExfU1lTMV9QTExfUFdSRE4gCgkJZGF0YSA9IDA7CgkJd2hpbGUgKChkYXRhICYgMHgxKSA9PSAwKQoJCXsKCQkJLyogVGhpcyB0eXBpY2FsbHkgaXMgb25seSByZWFkIG9uY2UgKi8KCQkJZGF0YSA9IE1PQ0FfUkQoMHgxMDEwMDA2MCk7IC8vIENMS0dFTl9QTExfU1lTMV9QTExfTE9DS19TVEFUVVMKCgkJCWlmIChjb3VudCsrID4gMTApCgkJCQlicmVhazsKCQl9CgkJTU9DQV9XUigweDEwMTAwMDZDLCAwKTsgIC8vIENMS0dFTl9QTExfU1lTMV9QTExfUkVTRVQgCgoJCWlmIChwcml2LT5ib25kZWRfbW9kZSkgewoJCQlNT0NBX1VOU0VUKDB4MTAxMDAwNDgsIDEpOyAgLy8gQ0xLR0VOX1BMTF9TWVMxX1BMTF9DSEFOTkVMX0NUUkxfQ0hfMyAKCQkJTU9DQV9VTlNFVCgweDEwMTAwMDUwLCAxKTsgIC8vIENMS0dFTl9QTExfU1lTMV9QTExfQ0hBTk5FTF9DVFJMX0NIXzUgCgkJfSBlbHNlIHsKCQkJTU9DQV9TRVQoMHgxMDEwMDA0OCwgMSk7ICAvLyBDTEtHRU5fUExMX1NZUzFfUExMX0NIQU5ORUxfQ1RSTF9DSF8zIAoJCQlNT0NBX1NFVCgweDEwMTAwMDUwLCAxKTsgIC8vIENMS0dFTl9QTExfU1lTMV9QTExfQ0hBTk5FTF9DVFJMX0NIXzUgCgkJfQoJCXVkZWxheSgxKTsKCgkJLyogZGVhc3NlcnQgbW9jYV9zeXNfcmVzZXQsIHN5c3RlbSBjbG9jaywgcGh5MCBhbmQgcGh5MCBjbG9jayAqLwoJCW1hc2sgPSAoMSA8PCAxKSB8ICgxIDw8IDcpIHwgKDEgPDwgNCkgfCAoMSA8PCA4KTsKCgkJLyogZGVhc3NlcnQgcGh5MSBhbmQgcGh5MSBjbG9jayBpbiBib25kZWQgbW9kZSAqLwoJCWlmIChwcml2LT5ib25kZWRfbW9kZSkKCQkJbWFzayB8PSAoMSA8PCA1KSB8ICgxIDw8IDkpOwoKCQlNT0NBX1VOU0VUKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5zd19yZXNldF9vZmZzZXQsIG1hc2spOwoJCU1PQ0FfUkQocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPnN3X3Jlc2V0X29mZnNldCk7CgoKCQkvKiBDaGVjayBmb3IgNjgwMi82ODAzIEEwIGNoaXAgb25seSB3aXRoIFh0YWwgbW9kICovCgkJaWYgKChwTW9jYURhdGEtPmNoaXBfaWQgJiAweEZGRkVGRkZGKSA9PSAweDY4MDIwMEEwKQoJCXsKCQkJZGF0YSA9IE1PQ0FfUkQoMHgxMDQwNDAxYyk7CgkJCWlmICgoZGF0YSAmIDB4NykgPT0gMHgyKSB7CgkJCQkvKiAyNU1IeiAqLwoJCQkJcHJpbnRrKCJNb0NBIHJ1bm5pbmcgd2l0aCAyNU1IeiBYVEFMXG4iKTsKCQkJCU1PQ0FfV1IocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPmhvc3QybW9jYV9tbXBfb3V0Ym94XzBfb2Zmc2V0LCAxKTsKCQkJfSBlbHNlIHsKCQkJCXByaW50aygiTW9DQSA9PSA1ME1IeiBYVEFMXG4iKTsKCQkJCS8qIDUwTUh6IGNsb2NrIGNoYW5nZSBvbmx5ICovCgkJCQlNT0NBX1dSKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5ob3N0Mm1vY2FfbW1wX291dGJveF8wX29mZnNldCwgMCk7CgkJCQkvL05vdGU6IFRoZSByZS1jb25maWd1cmF0aW9uIGlzIGluIE5ESVZfSU5ULCBub3QgUERJVi4KCQkJCS8vYENMS0dFTl9SRUdfU1RBUlQgKyBgQ0xLR0VOX1BMTF9TWVMxX1BMTF9ESVYgKDMyJ2gxMDEwMDA1OCkgWzA5OjAwXSA9IDEwkmQ0OAoJCQkJdGVtcCA9IE1PQ0FfUkQoMHgxMDEwMDA1OCk7CgkJCQl0ZW1wID0gKHRlbXAgJiAweEZGRkZGQzAwKSArIDQ4OwoJCQkJTU9DQV9XUigweDEwMTAwMDU4LCB0ZW1wKTsKCgkJCQkvL2BDTEtHRU5fUkVHX1NUQVJUICsgYENMS0dFTl9QTExfU1lTMF9QTExfRElWICgzMidoMTAxMDAwMTgpIFswOTowMF0gPSAxMJJkNDAKCQkJCXRlbXAgPSBNT0NBX1JEKDB4MTAxMDAwMTgpOwoJCQkJdGVtcCA9ICh0ZW1wICYgMHhGRkZGRkMwMCkgKyA0MDsKCQkJCU1PQ0FfV1IoMHgxMDEwMDAxOCwgdGVtcCk7CgoJCQkJLy9gQ0xLR0VOX1JFR19TVEFSVCArIGBDTEtHRU5fUExMX1NZUzFfUExMX0NIQU5ORUxfQ1RSTF9DSF80ICgzMidoMTAxMDAwNEMpIFswODowMV0gPSA4kmQ0OAoJCQkJdGVtcCA9IE1PQ0FfUkQoMHgxMDEwMDA0Yyk7CgkJCQl0ZW1wID0gKHRlbXAgJiAweEZGRkZGRTAxKSArICg0OCA8PCAxKTsKCQkJCU1PQ0FfV1IoMHgxMDEwMDA0YywgdGVtcCk7CgoJCQkJLy9gQ0xLR0VOX1JFR19TVEFSVCArIGBDTEtHRU5fUExMX1NZUzFfUExMX0NIQU5ORUxfQ1RSTF9DSF81ICgzMidoMTAxMDAwNTApIFswODowMV0gPSA4kmQ0OAoJCQkJdGVtcCA9IE1PQ0FfUkQoMHgxMDEwMDA1MCk7CgkJCQl0ZW1wID0gKHRlbXAgJiAweEZGRkZGRTAxKSArICg0OCA8PCAxKTsKCQkJCU1PQ0FfV1IoMHgxMDEwMDA1MCwgdGVtcCk7CgoJCQkJLy8gVGhlbiBSZXN0YXJ0IHRoZSBQTEwuCgoJCQkJLy9gQ0xLR0VOX1JFR19TVEFSVCArIGBDTEtHRU5fUExMX1NZUzBfUExMX1JFU0VUICgzMidoMTAxMDAwMkMpIFswXSA9IDGSYjEKCQkJCU1PQ0FfU0VUKDB4MTAxMDAwMmMsIDEpOwoJCQkJLy9gQ0xLR0VOX1JFR19TVEFSVCArIGBDTEtHRU5fUExMX1NZUzFfUExMX1JFU0VUICgzMidoMTAxMDAwNkMpIFswXSA9IDGSYjEKCQkJCU1PQ0FfU0VUKDB4MTAxMDAwNmMsIDEpOwoKCQkJCXVkZWxheSgxKTsKCgkJCQkvL2BDTEtHRU5fUkVHX1NUQVJUICsgYENMS0dFTl9QTExfU1lTMF9QTExfUkVTRVQgKDMyJ2gxMDEwMDAyQykgWzBdID0gMZJiMAoJCQkJTU9DQV9VTlNFVCgweDEwMTAwMDJjLCAxKTsKCQkJCS8vYENMS0dFTl9SRUdfU1RBUlQgKyBgQ0xLR0VOX1BMTF9TWVMxX1BMTF9SRVNFVCAoMzInaDEwMTAwMDZDKSBbMF0gPSAxkmIwCgkJCQlNT0NBX1VOU0VUKDB4MTAxMDAwNmMsIDEpOwoJCQl9CgkJfQoKCQkvLyBDTEtHRU5fUExMX1NZUzFfUExMX1NTQ19NT0RFX0NPTlRST0xfSElHSAoJCWRhdGEgPSBNT0NBX1JEKDB4MTAxMDAwNzApOwoJCWRhdGEgPSAoZGF0YSAmIDB4RkZGRjAwMDApIHwgMHg3ZGQ7CgkJTU9DQV9XUigweDEwMTAwMDcwLCBkYXRhKTsKCgkJLy8gQ0xLR0VOX1BMTF9TWVMxX1BMTF9TU0NfTU9ERV9DT05UUk9MX0xPVwoJCWRhdGEgPSBNT0NBX1JEKDB4MTAxMDAwNzQpOwoJCWRhdGEgPSAoZGF0YSAmIDB4ZmZjMDAwMDApIHwgMHgzZDcxOwoJCU1PQ0FfV1IoMHgxMDEwMDA3NCwgZGF0YSk7CgoJCS8vIENMS0dFTl9QTExfU1lTMV9QTExfU1NDX01PREVfQ09OVFJPTF9MT1cKCQlNT0NBX1NFVCgweDEwMTAwMDc0LCAoMSA8PCAyMikpOwoJCQoJCXByaW50aygiU2V0IFBMTCBTU0MgbW9kZVxuIik7Cgl9CgoKCWlmIChwcml2LT5od19yZXYgPD0gSFdSRVZfTU9DQV8yMF9HRU4yMSkgewoJLyogY2xlYXIganVuayBvdXQgb2YgR1AwL0dQMSAqLwoJCU1PQ0FfV1IocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPmdwMF9vZmZzZXQsIDB4ZmZmZmZmZmYpOwoJCU1PQ0FfV1IocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPmdwMV9vZmZzZXQsIDB4MCk7CgkJLyogc2V0IHVwIGFjdGl2aXR5IExFRCBmb3IgNTAlIGR1dHkgY3ljbGUgKi8KCQlNT0NBX1dSKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5sZWRfY3RybF9vZmZzZXQsCgkJCTB4NDAwMDQwMDApOwoJfQoKCS8qIGVuYWJsZSBETUEgY29tcGxldGlvbiBpbnRlcnJ1cHRzICovCgltYXNrID0gTTJIX1JFUSB8IE0ySF9SRVNQIHwgTTJIX0FTU0VSVCB8IE0ySF9XRFRfQ1BVMSB8CgkJTTJIX05FWFRDSFVOSyB8IE0ySF9ETUE7CgoJaWYgKHByaXYtPmh3X3JldiA+PSBIV1JFVl9NT0NBXzIwX0dFTjIxKQoJCW1hc2sgfD0gTTJIX1dEVF9DUFUwIHwgTTJIX05FWFRDSFVOS19DUFUwIHwKCQkJTTJIX1JFUV9DUFUwIHwgTTJIX1JFU1BfQ1BVMCB8IE0ySF9BU1NFUlRfQ1BVMDsKCglNT0NBX1dSKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5yaW5nYmVsbF9vZmZzZXQsIDApOwoJTU9DQV9XUihwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+bDJfbWFza19jbGVhcl9vZmZzZXQsIG1hc2spOwoJTU9DQV9SRChwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+bDJfbWFza19jbGVhcl9vZmZzZXQpOwoKCgkvKiBTZXQgcGlubXV4aW5nIGZvciBNb0NBIGludGVycnVwdCBhbmQgZmxvdyBjb250cm9sICovCglNT0NBX1VOU0VUKDB4MTA0MDQxMTAsIDB4RjAwMDAwRkYpOwoJTU9DQV9TRVQoMHgxMDQwNDExMCwgMHgxMDAwMDAyMik7CiAKCU1PQ0FfV1IoMHgxMDBiMDMxOCwgMik7CgoJaWYgKGFjdGlvbiA9PSBNT0NBX0RJU0FCTEUgJiYgcHJpdi0+ZW5hYmxlZCkgewoJCXByaXYtPmVuYWJsZWQgPSAwOwoJCWNsa19kaXNhYmxlKHByaXYtPmNsayk7Cgl9Cn0KCnN0YXRpYyB2b2lkIG1vY2FfcmluZ2JlbGwoc3RydWN0IG1vY2FfcHJpdl9kYXRhICpwcml2LCB1aW50MzJfdCBtYXNrKQp7CglNT0NBX1dSKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5yaW5nYmVsbF9vZmZzZXQsIG1hc2spOwp9CgpzdGF0aWMgdWludDMyX3QgbW9jYV9zdGFydF9taXBzKHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdiwgdW5zaWduZWQgaW50IGNwdSkKewoJaWYgKHByaXYtPmh3X3JldiA9PSBIV1JFVl9NT0NBXzIwX0dFTjIyKSB7CgkJaWYgKGNwdSA9PSAxKQoJCQlNT0NBX1VOU0VUKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5zd19yZXNldF9vZmZzZXQsCgkJCQkoMSA8PCAwKSk7CgkJZWxzZSB7CgkJCW1vY2FfbW1wX2luaXQocHJpdiwgMSk7CgkJCU1PQ0FfVU5TRVQocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPnN3X3Jlc2V0X29mZnNldCwKCQkJCSgxIDw8IDIpKTsKCQl9Cgl9IGVsc2UKCQlNT0NBX1VOU0VUKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5zd19yZXNldF9vZmZzZXQsICgxIDw8IDApKTsKCU1PQ0FfUkQocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPnN3X3Jlc2V0X29mZnNldCk7CgoJcmV0dXJuKDApOwp9CgpzdGF0aWMgdm9pZCBtb2NhX20ybV94ZmVyKHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdiwKCXVpbnQzMl90IGRzdCwgdWludDMyX3Qgc3JjLCB1aW50MzJfdCBjdGwpCnsKCXVpbnQzMl90IHN0YXR1czsKCglNT0NBX1dSKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5tMm1fc3JjX29mZnNldCwgc3JjKTsKCU1PQ0FfV1IocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPm0ybV9kc3Rfb2Zmc2V0LCBkc3QpOwoJTU9DQV9XUihwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+bTJtX3N0YXR1c19vZmZzZXQsIDApOwoJTU9DQV9SRChwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+bTJtX3N0YXR1c19vZmZzZXQpOwoJTU9DQV9XUihwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+bTJtX2NtZF9vZmZzZXQsIGN0bCk7CgoJZG8gewoJCXN0YXR1cyA9IE1PQ0FfUkQocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPm0ybV9zdGF0dXNfb2Zmc2V0KTsKCX0gd2hpbGUoc3RhdHVzID09IDApOwoKfQoKc3RhdGljIHZvaWQgbW9jYV93cml0ZV9tZW0oc3RydWN0IG1vY2FfcHJpdl9kYXRhICpwcml2LAoJdWludDMyX3QgZHN0X29mZnNldCwgdm9pZCAqc3JjLCB1bnNpZ25lZCBpbnQgbGVuKQp7CglzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICpwZCA9IHByaXYtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwoKCWlmKChkc3Rfb2Zmc2V0ID49IHByaXYtPnJlZ3MtPmNudGxfbWVtX29mZnNldCtwcml2LT5yZWdzLT5jbnRsX21lbV9zaXplKSB8fAoJCSgoZHN0X29mZnNldCArIGxlbikgPiBwcml2LT5yZWdzLT5jbnRsX21lbV9vZmZzZXQrcHJpdi0+cmVncy0+Y250bF9tZW1fc2l6ZSkpIHsKCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY29weSBwYXN0IGVuZCBvZiBjbnRsIG1lbW9yeTogJTA4eFxuIiwKCQkJX19GVU5DVElPTl9fLCBkc3Rfb2Zmc2V0KTsKCQlyZXR1cm47Cgl9CgoJaWYgKCAxID09IHBkLT51c2VfZG1hICkKCXsKCQlkbWFfYWRkcl90IHBhOwoKCQlwYSA9IGRtYV9tYXBfc2luZ2xlKCZwcml2LT5wZGV2LT5kZXYsIHNyYywgbGVuLCBETUFfVE9fREVWSUNFKTsKCQltdXRleF9sb2NrKCZwcml2LT5jb3B5X211dGV4KTsKCQltb2NhX20ybV94ZmVyKHByaXYsIGRzdF9vZmZzZXQgKyBwcml2LT5yZWdzLT5kYXRhX21lbV9vZmZzZXQsICh1aW50MzJfdClwYSwgbGVuIHwgTTJNX1dSSVRFKTsKCQltdXRleF91bmxvY2soJnByaXYtPmNvcHlfbXV0ZXgpOwoJCWRtYV91bm1hcF9zaW5nbGUoJnByaXYtPnBkZXYtPmRldiwgcGEsIGxlbiwgRE1BX1RPX0RFVklDRSk7Cgl9CgllbHNlCgl7CgkJdWludHB0cl90IGFkZHIgPSAodWludHB0cl90KXByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5kYXRhX21lbV9vZmZzZXQgKyBkc3Rfb2Zmc2V0OwoJCXVpbnQzMl90ICpkYXRhID0gc3JjOwoJCWludCBpOwoKCQltdXRleF9sb2NrKCZwcml2LT5jb3B5X211dGV4KTsKCQlpZiAoKChzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICopcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpLT51c2Vfc3BpID09IDEpCgkJewoJCQlzcmMgPSBkYXRhOwoJCQlNT0NBX1dSX0JMT0NLKGFkZHIsIHNyYywgbGVuKTsKCQl9CgkJZWxzZQoJCXsKCQkJZm9yKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQsIGFkZHIgKz0gNCwgZGF0YSsrKQoJCQkJTU9DQV9XUihhZGRyLCAqZGF0YSk7CgkJCU1PQ0FfUkQoYWRkciAtIDQpOwkvKiBmbHVzaCB3cml0ZSAqLwoJCX0KCgkJbXV0ZXhfdW5sb2NrKCZwcml2LT5jb3B5X211dGV4KTsKCX0KfQoKc3RhdGljIHZvaWQgbW9jYV9yZWFkX21lbShzdHJ1Y3QgbW9jYV9wcml2X2RhdGEgKnByaXYsCgl2b2lkICpkc3QsIHVpbnQzMl90IHNyY19vZmZzZXQsIHVuc2lnbmVkIGludCBsZW4pCnsKCXN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKnBkID0gcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAgICAKCWlmKChzcmNfb2Zmc2V0ID49IHByaXYtPnJlZ3MtPmNudGxfbWVtX29mZnNldCtwcml2LT5yZWdzLT5jbnRsX21lbV9zaXplKSB8fAoJCSgoc3JjX29mZnNldCArIGxlbikgPiBwcml2LT5yZWdzLT5jbnRsX21lbV9vZmZzZXQrcHJpdi0+cmVncy0+Y250bF9tZW1fc2l6ZSkpIHsKCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY29weSBwYXN0IGVuZCBvZiBjbnRsIG1lbW9yeTogJTA4eFxuIiwKCQkJX19GVU5DVElPTl9fLCBzcmNfb2Zmc2V0KTsKCQlyZXR1cm47Cgl9CgoJaWYgKCAxID09IHBkLT51c2VfZG1hICkKCXsKCQlkbWFfYWRkcl90IHBhOwoKCQlwYSA9IGRtYV9tYXBfc2luZ2xlKCZwcml2LT5wZGV2LT5kZXYsIGRzdCwgbGVuLCBETUFfRlJPTV9ERVZJQ0UpOwoJCW11dGV4X2xvY2soJnByaXYtPmNvcHlfbXV0ZXgpOwoJCW1vY2FfbTJtX3hmZXIocHJpdiwgKHVpbnQzMl90KXBhLCBzcmNfb2Zmc2V0ICsgcHJpdi0+cmVncy0+ZGF0YV9tZW1fb2Zmc2V0LCBsZW4gfCBNMk1fUkVBRCk7CgkJbXV0ZXhfdW5sb2NrKCZwcml2LT5jb3B5X211dGV4KTsKCQlkbWFfdW5tYXBfc2luZ2xlKCZwcml2LT5wZGV2LT5kZXYsIHBhLCBsZW4sIERNQV9GUk9NX0RFVklDRSk7Cgl9CgllbHNlCgl7CgkJdWludHB0cl90IGFkZHIgPSBwcml2LT5yZWdzLT5kYXRhX21lbV9vZmZzZXQgKyBzcmNfb2Zmc2V0OwoJCXVpbnQzMl90ICpkYXRhID0gZHN0OwoJCWludCBpOwoKCQltdXRleF9sb2NrKCZwcml2LT5jb3B5X211dGV4KTsKCQlpZiAoKChzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICopcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpLT51c2Vfc3BpID09IDEpCgkJewoJCQlNT0NBX1JEX0JMT0NLKCh1aW50cHRyX3QpcHJpdi0+YmFzZSArIGFkZHIsIGRzdCwgbGVuKTsKCQl9CgkJZWxzZQoJCXsKCQkJZm9yKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQsIGFkZHIgKz0gNCwgZGF0YSsrKQoJIAkJCSpkYXRhID0gTU9DQV9SRCgodWludHB0cl90KXByaXYtPmJhc2UgKyBhZGRyKTsKCQl9CgkJbXV0ZXhfdW5sb2NrKCZwcml2LT5jb3B5X211dGV4KTsKCX0KfQoKc3RhdGljIHZvaWQgbW9jYV93cml0ZV9zZyhzdHJ1Y3QgbW9jYV9wcml2X2RhdGEgKnByaXYsCgl1aW50MzJfdCBkc3Rfb2Zmc2V0LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVudHMpCnsKCWludCBqOwoJdWludHB0cl90IGFkZHIgPSBwcml2LT5yZWdzLT5kYXRhX21lbV9vZmZzZXQgKyBkc3Rfb2Zmc2V0OwoJc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqcGQgPSBwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKCglkbWFfbWFwX3NnKCZwcml2LT5wZGV2LT5kZXYsIHNnLCBuZW50cywgRE1BX1RPX0RFVklDRSk7CgoJbXV0ZXhfbG9jaygmcHJpdi0+Y29weV9tdXRleCk7Cglmb3IoaiA9IDA7IGogPCBuZW50czsgaisrKQoJewoJCWlmICggMSA9PSBwZC0+dXNlX2RtYSApCgkJewoJCSAgICAvLyBwcmludGsoIlhYWCBjb3B5aW5nIHBhZ2UgJWQsIFBBICUwOHhcbiIsIGosIChpbnQpc2dbal0uZG1hX2FkZHJlc3MpOwoJCQltb2NhX20ybV94ZmVyKHByaXYsIGFkZHIsICh1aW50MzJfdClzZ1tqXS5kbWFfYWRkcmVzcywgCgkJCQlzZ1tqXS5sZW5ndGggfCBNMk1fV1JJVEUpOwoKCQkJYWRkciArPSBzZ1tqXS5sZW5ndGg7CgkJfQoJCWVsc2UKCQl7CgkJCXVuc2lnbmVkIGxvbmcgKmRhdGEgPSAodm9pZCAqKXBoeXNfdG9fdmlydChzZ1tqXS5kbWFfYWRkcmVzcyk7CiAgICAgICAgIC8vcHJpbnRrKCIlczogV3JpdGluZyAweCVseCB0byBhZGRyIDB4JTA4bHggKGxlbiA9ICVkKVxuIiwgX19GVU5DVElPTl9fLCAqZGF0YSwgKCh1bnNpZ25lZCBsb25nKXByaXYtPmJhc2UpICsgYWRkciwgc2dbal0ubGVuZ3RoKTsKCQkJTU9DQV9XUl9CTE9DSygoKHVuc2lnbmVkIGxvbmcpcHJpdi0+YmFzZSkgKyBhZGRyLCBkYXRhLCBzZ1tqXS5sZW5ndGgpOwoJCQlhZGRyICs9IHNnW2pdLmxlbmd0aDsKCQl9Cgl9CgltdXRleF91bmxvY2soJnByaXYtPmNvcHlfbXV0ZXgpOwoKCWRtYV91bm1hcF9zZygmcHJpdi0+cGRldi0+ZGV2LCBzZywgbmVudHMsIERNQV9UT19ERVZJQ0UpOwp9CgovKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCB0ZXN0ZWQgKi8KI2lmIDAKc3RhdGljIHZvaWQgbW9jYV9yZWFkX3NnKHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdiwKCXVpbnQzMl90IHNyY19vZmZzZXQsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cykKewoJaW50IGo7Cgl1aW50cHRyX3QgYWRkciA9IHByaXYtPmRhdGFfbWVtX29mZnNldCArIHNyY19vZmZzZXQ7CgoJZG1hX21hcF9zZygmcHJpdi0+cGRldi0+ZGV2LCBzZywgbmVudHMsIERNQV9GUk9NX0RFVklDRSk7CgoJbXV0ZXhfbG9jaygmcHJpdi0+Y29weV9tdXRleCk7Cglmb3IoaiA9IDA7IGogPCBuZW50czsgaisrKSB7CiNpZiAwIC8vVVNFX0RNQQoJCSBwcmludGsoIlhYWCBjb3B5aW5nIHBhZ2UgJWQsIFBBICUwOHhcbiIsIGosIChpbnQpc2dbal0uZG1hX2FkZHJlc3MpOwoJCW1vY2FfbTJtX3hmZXIocHJpdiwgYWRkciwgKHVpbnQzMl90KXNnW2pdLmRtYV9hZGRyZXNzLAoJCQlzZ1tqXS5sZW5ndGggfCBNMk1fUkVBRCk7CgoJCWFkZHIgKz0gc2dbal0ubGVuZ3RoOwojZWxzZQoJCXVpbnQzMl90ICpkYXRhID0gKHZvaWQgKilwaHlzX3RvX3ZpcnQoc2dbal0uZG1hX2FkZHJlc3MpOwoJCXVuc2lnbmVkIGludCBsZW4gPSBzZ1tqXS5sZW5ndGg7CgkJaW50IGk7CgoJCWZvcihpID0gMDsgaSA8IGxlbjsgaSArPSA0LCBhZGRyICs9IDQsIGRhdGErKykgewoJCQkqZGF0YSA9IGNwdV90b19iZTMyKAoJCQkJTU9DQV9SRCgodWludHB0cl90KXByaXYtPmJhc2UgKyBhZGRyKSk7CgkJCS8vcHJpbnRrKCJNb0NBIFJFQUQ6IEFEIDB4JXggID0gMHgleCAoMHgleClcbiIsIChwcml2LT5iYXNlICsgYWRkciksIE1PQ0FfUkQoKHVpbnRwdHJfdClwcml2LT5iYXNlICsgYWRkciksICpkYXRhKTsKCQkgfQojZW5kaWYKCX0KCW11dGV4X3VubG9jaygmcHJpdi0+Y29weV9tdXRleCk7CgoJZG1hX3VubWFwX3NnKCZwcml2LT5wZGV2LT5kZXYsIHNnLCBuZW50cywgRE1BX0ZST01fREVWSUNFKTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIG1vY2FfcmVhZF9tYWNfYWRkcihzdHJ1Y3QgbW9jYV9wcml2X2RhdGEgKnByaXYsIHVpbnQzMl90ICogaGksIHVpbnQzMl90ICogbG8pCnsKCXN0cnVjdCBuZXRfZGV2aWNlICogcGRldiA7CgljaGFyCQkJCQkgbW9jYU5hbWVbN10gOwoKCWlmIChwcml2ID09IE5VTEwpCgkJc3ByaW50ZiAobW9jYU5hbWUsICJtb2NhJXUiLCAwKSA7CgllbHNlCgkJc3ByaW50ZiAobW9jYU5hbWUsICJtb2NhJXUiLCAoKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSktPmRldklkKSA7CgojaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDI5KQoJcGRldiA9IGRldl9nZXRfYnlfbmFtZSAoICZpbml0X25ldCwgbW9jYU5hbWUgKSA7CiNlbHNlCglwZGV2ID0gZGV2X2dldF9ieV9uYW1lICggbW9jYU5hbWUgKSA7CiNlbmRpZgoKCWlmICgocGRldiAhPSBOVUxMKSAmJiAobG8gIT0gTlVMTCkgJiYgKGhpICE9IE5VTEwpKSB7CgkJbWFjX3RvX3UzMihoaSwgbG8sIHBkZXYtPmRldl9hZGRyKTsKCX0KfQoKCiNpZiBkZWZpbmVkKERTTF9NT0NBKQoKLyoKICogVGhpcyBoZWxwZXIgZnVuY3Rpb24gd2FzIGFkZGVkIHRvIGFsbG93IHRoZSBlbmV0IGRyaXZlciB0byBjb21waWxlIGluCiAqIGNvbnN1bWVyIGVudmlyb25tZW50IGZvciA2OHh4IHByb2ZpbGVzLgogKi8Kdm9pZCBtb2NhX2dldF9mY19iaXRzKHZvaWQgKiBhcmcsIHVuc2lnbmVkIGxvbmcgKm1vY2FfZmNfcmVnKQp7CglzdHJ1Y3QgbW9jYV9wcml2X2RhdGEgKiAgICAgcHJpdjsKCXN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKiBwTW9jYURhdGE7Cgl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgZmxhZ3M7CgoJaWYgKGFyZyA9PSBOVUxMKSB7CgkJcmV0dXJuOwoJfQoKCXByaXYgPSAoc3RydWN0IG1vY2FfcHJpdl9kYXRhICopIGFyZzsKCXBNb2NhRGF0YSA9IChzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICopcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CgoJKm1vY2FfZmNfcmVnID0gMDsKCWlmIChwcml2ICE9IE5VTEwpCgl7CgkJLyogV2UgY2FuJ3QgcmVhZCBtb2NhIGNvcmUgcmVncyB1bmxlc3MgdGhlIGNvcmUncyBjbG9ja3MgYXJlIG9uLiAqLwoJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5jbG9ja19sb2NrLCBmbGFncyk7CgkJaWYgKHByaXYtPnJ1bm5pbmcpIHsKCQkJKm1vY2FfZmNfcmVnID0gTU9DQV9SRChwcml2LT5iYXNlK3ByaXYtPnJlZ3MtPnNpZGViYW5kX2dtaWlfZmNfb2Zmc2V0KTsKCQl9CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+Y2xvY2tfbG9jaywgZmxhZ3MpOwoJfQp9CgojZW5kaWYgLyogRFNMX01PQ0EgKi8KCnN0YXRpYyBpbnQgX19kZXZpbml0IGJtb2NhX3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKSB7CgkvLyBUT0RPKGFwZW53YXJyKTogbWF0Y2ggb25lIHNwaSBkZXZpY2UgdG8gb25lIG1vY2EgZGV2aWNlIHN0cnVjdC4KCS8vIEkgaGFwcGVuIHRvIGtub3cgdGhhdCByaWdodCBub3cgdGhlIHN5c3RlbSBvbmx5IHJlZ2lzdGVycyBvbmUgb2YKCS8vIG1vY2FfbGFuIG9yIG1vY2Ffd2FuLCBuZXZlciBib3RoLCBhbmQgdGhlcmUgaXMgbmV2ZXIgbW9yZSB0aGFuCgkvLyBvbmUgbW9jYSBjaGlwIHByZXNlbnQgb24gb3VyIHN5c3RlbXMsIHNvIHRoaXMgaXMgb2theSBmb3Igbm93LgoJdWludDMyX3QgdmFsID0ga2VyU3lzQmNtU3BpU2xhdmVSZWFkUmVnMzIoc3BpLCAweDEwNDA0MDAwKTsKCXByX2luZm8oImJtb2NhX3NwaV9wcm9iZSBidXM9JWQgY2hpcF9zZWxlY3Q9JWQ6IGlkPSUwOHggJXNcbiIsCgkJc3BpLT5tYXN0ZXItPmJ1c19udW0sIHNwaS0+Y2hpcF9zZWxlY3QsIHZhbCwKCQl2YWwgIT0gMCA/ICJ5ZXMiIDogIm5vIik7CglpZiAodmFsID09IDApIHJldHVybiAtRU5PREVWOwoJbW9jYV9sYW5fZGF0YS5zcGkgPSBzcGk7Cgltb2NhX3dhbl9kYXRhLnNwaSA9IHNwaTsKCXJldHVybiAwOyAvLyBzdWNjZXNzCn0KCnN0YXRpYyBpbnQgX19kZXZleGl0IGJtb2NhX3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkgewoJcHJfaW5mbygiYm1vY2Ffc3BpX3JlbW92ZVxuIik7CglpZiAobW9jYV9sYW5fZGF0YS5zcGkgPT0gc3BpKSBtb2NhX2xhbl9kYXRhLnNwaSA9IE5VTEw7CglpZiAobW9jYV93YW5fZGF0YS5zcGkgPT0gc3BpKSBtb2NhX3dhbl9kYXRhLnNwaSA9IE5VTEw7CglyZXR1cm4gMDsgLy8gc3VjY2Vzcwp9CgpzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYm1vY2Ffc3BpX2RyaXZlciA9IHsKICAuZHJpdmVyID0gewogICAgLm5hbWUgPSAiYm1vY2EiLAogICAgLm93bmVyID0gVEhJU19NT0RVTEUsCiAgfSwKICAucHJvYmUgPSBibW9jYV9zcGlfcHJvYmUsCiAgLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGJtb2NhX3NwaV9yZW1vdmUpLAp9OwoKLy9leHRlcm4gdm9pZCBiY21lbmV0X3JlZ2lzdGVyX21vY2FfZmNfYml0c19jYih2b2lkIGNiKHZvaWQgKiwgdW5zaWduZWQgbG9uZyAqKSwgaW50IGlzV2FuLCB2b2lkICogYXJnKTsKCnN0YXRpYyBpbnQgIGh3X3NwZWNpZmljX2luaXQoIHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdiApCnsKI2lmZGVmIERTTF9NT0NBCglzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICpwTW9jYURhdGE7CgoJcE1vY2FEYXRhID0gKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKCgkvKiBmaWxsIGluIHRoZSBod19yZXYgZmllbGQgKi8KCXBNb2NhRGF0YS0+Y2hpcF9pZCA9IE1PQ0FfUkQoMHgxMDQwNDAwNCkgKyAweEEwOwogICAgICAgIHByX2luZm8oInJlYWQgbW9jYSBjaGlwIGlkOiAlMDh4XG4iLCBwTW9jYURhdGEtPmNoaXBfaWQpOwoKCXBNb2NhRGF0YS0+aHdfcmV2ID0gSFdSRVZfTU9DQV8yMF9HRU4yMjsKCgkvKiBQb3dlciBkb3duIGFsbCBMRUFQIG1lbW9yaWVzICovCglNT0NBX1dSKDB4MTAxMDAwZTQsIDB4Nik7IC8vIENMS0dFTl9MRUFQX1RPUF9JTlNUX0RBVEEgICAKCU1PQ0FfV1IoMHgxMDEwMDBlOCwgMHg2KTsgLy8gQ0xLR0VOX0xFQVBfVE9QX0lOU1RfSEFCIAoJTU9DQV9XUigweDEwMTAwMGVjLCAweDYpOyAvLyBDTEtHRU5fTEVBUF9UT1BfSU5TVF9QUk9HMAoJTU9DQV9XUigweDEwMTAwMGYwLCAweDYpOyAvLyBDTEtHRU5fTEVBUF9UT1BfSU5TVF9QUk9HMSAgIAoJTU9DQV9XUigweDEwMTAwMGY0LCAweDYpOyAvLyBDTEtHRU5fTEVBUF9UT1BfSU5TVF9QUk9HMiAgCglNT0NBX1dSKDB4MTAxMDAwZjgsIDB4Nik7IC8vIENMS0dFTl9MRUFQX1RPUF9JTlNUX1JPTQoJTU9DQV9XUigweDEwMTAwMGZjLCAweDYpOyAvLyBDTEtHRU5fTEVBUF9UT1BfSU5TVF9TSEFSRUQgIAoJTU9DQV9XUigweDEwMTAwMTY0LCAweDMpOyAvLyBDTEtHRU5fU1lTX0NUUkxfSU5TVF9QT1dFUl9TV0lUQ0hfTUVNT1JZIAoKLy8JYmNtZW5ldF9yZWdpc3Rlcl9tb2NhX2ZjX2JpdHNfY2IoCi8vCQltb2NhX2dldF9mY19iaXRzLCBwTW9jYURhdGEtPnVzZV9zcGkgPyAxIDogMCwgKHZvaWQgKilwcml2KTsKI2VuZGlmCgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgbW9jYV9wbGF0Zm9ybV9kZXZfcmVnaXN0ZXIodm9pZCkKewoJc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqcE1vY2FEYXRhOwoJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcFBsYXRmb3JtRGV2OwoJQlBfTU9DQV9JTkZPIG1vY2FJbmZvW0JQX01PQ0FfTUFYX05VTV07CglpbnQgbW9jYUNoaXBOdW0gPSBCUF9NT0NBX01BWF9OVU07CglpbnQgaTsKCWludCByZXQgPSAwOyAgIAoKCUJwR2V0TW9jYUluZm8obW9jYUluZm8sICZtb2NhQ2hpcE51bSk7CgoJcmV0ID0gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYm1vY2Ffc3BpX2RyaXZlcik7CglpZiAocmV0IDwgMCkgcmV0dXJuIHJldDsKCglmb3IgKGkgPSAwOyBpIDwgbW9jYUNoaXBOdW07IGkrKykgewoJCXN3aXRjaCAobW9jYUluZm9baV0udHlwZSkgewoJCQljYXNlIEJQX01PQ0FfVFlQRV9XQU46CgkJCQlwTW9jYURhdGEgPSAmbW9jYV93YW5fZGF0YTsKCQkJCXBQbGF0Zm9ybURldiA9ICZtb2NhX3dhbl9wbGF0X2RldjsKCQkJCWJyZWFrOwoKCQkJY2FzZSBCUF9NT0NBX1RZUEVfTEFOOgoJCQkJcE1vY2FEYXRhID0gJm1vY2FfbGFuX2RhdGE7CgkJCQlwUGxhdGZvcm1EZXYgPSAmbW9jYV9sYW5fcGxhdF9kZXY7CgkJCQlicmVhazsKCgkJCWRlZmF1bHQ6CgkJCQlwcmludGsoS0VSTl9FUlIgImJtb2NhOiB1bnJlY29nbml6ZWQgTW9DQSB0eXBlICVkXG4iLAoJCQkJCW1vY2FJbmZvW2ldLnR5cGUpOwoJCQkJcmV0dXJuKC0xKTsKCQkJCWJyZWFrOwoJCX0KCgkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKHBQbGF0Zm9ybURldik7CgkJaWYgKHJldCA8IDApIHsKCQkJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZibW9jYV9zcGlfZHJpdmVyKTsKCQkJcmV0dXJuKHJldCk7CgkJfQoJCWVsc2UgewoJCQlwTW9jYURhdGEtPmRldklkID0gaTsKCgkJCS8qIE1hcCB0aGUgYm9hcmQgcGFyYW1zIFJGIEJhbmQgdG8gdGhlIGJtb2NhLmggdmFsdWUgKi8KCQkJc3dpdGNoIChtb2NhSW5mb1tpXS5yZkJhbmQpCgkJCXsKCQkJCWNhc2UgQlBfTU9DQV9SRl9CQU5EX0RfTE9XOgoJCQkJCXBNb2NhRGF0YS0+cmZfYmFuZCA9IE1PQ0FfQkFORF9EX0xPVzsKCQkJCQlicmVhazsKCQkJCWNhc2UgQlBfTU9DQV9SRl9CQU5EX0RfSElHSDoKCQkJCQlwTW9jYURhdGEtPnJmX2JhbmQgPSBNT0NBX0JBTkRfRF9ISUdIOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBCUF9NT0NBX1JGX0JBTkRfRVhUX0Q6CgkJCQkJcE1vY2FEYXRhLT5yZl9iYW5kID0gTU9DQV9CQU5EX0VYVF9EOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBCUF9NT0NBX1JGX0JBTkRfRToKCQkJCQlwTW9jYURhdGEtPnJmX2JhbmQgPSBNT0NBX0JBTkRfRTsKCQkJCQlicmVhazsKCQkJCWNhc2UgQlBfTU9DQV9SRl9CQU5EX0Y6ICAgIAoJCQkJCXBNb2NhRGF0YS0+cmZfYmFuZCA9IE1PQ0FfQkFORF9GOwoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQkvKiBEbyBub3RoaW5nICovCgkJCQkJYnJlYWs7CgkJCX0KCQkJcHJpbnRrKEtFUk5fSU5GTyAiYm1vY2E6IEZvdW5kIE1vQ0EgZGV2aWNlICVkLyVkICBSRiBCYW5kICVkXG4iLAoJCQkJaSwgbW9jYUNoaXBOdW0sIG1vY2FJbmZvW2ldLnJmQmFuZCk7CgkJfQoJfQoKCXJldHVybihyZXQpOwp9CgpzdGF0aWMgdm9pZCBtb2NhX3BsYXRmb3JtX2Rldl91bnJlZ2lzdGVyKHZvaWQpCnsKCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYm1vY2Ffc3BpX2RyaXZlcik7CgoJaWYgKG1vY2FfbGFuX2RhdGEuZGV2SWQgIT0gTU9DQV9ERVZJQ0VfSURfVU5SRUdJU1RFUkVEKQoJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKCZtb2NhX2xhbl9wbGF0X2Rldik7CgoJaWYgKG1vY2Ffd2FuX2RhdGEuZGV2SWQgIT0gTU9DQV9ERVZJQ0VfSURfVU5SRUdJU1RFUkVEKQoJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKCZtb2NhX3dhbl9wbGF0X2Rldik7Cn0KCnN0YXRpYyB2b2lkIG1vY2FfMzQ1MF93cml0ZShzdHJ1Y3QgbW9jYV9wcml2X2RhdGEgKnByaXYsIHU4IGFkZHIsIHUzMiBkYXRhKQp7CgkvKiBjb21tZW50IG91dCBmb3Igbm93LiBXZSBkb24ndCB1c2UgaTJjIG9uIHRoZSA2MzI2OEJIUiBib2FyZCAqLwojaWZkZWYgTU9DQV8zNDUwX1VTRV9JMkMKCWlmICgoKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSktPnVzZV9zcGkgPT0gMCkKCQliY20zNDUwX3dyaXRlX3JlZyhhZGRyLCBkYXRhKTsKCWVsc2UKI2VuZGlmCgkJbW9jYV8zNDUwX3dyaXRlX2kyYyhwcml2LCBhZGRyLCBkYXRhKTsKfQoKc3RhdGljIHUzMiBtb2NhXzM0NTBfcmVhZChzdHJ1Y3QgbW9jYV9wcml2X2RhdGEgKnByaXYsIHU4IGFkZHIpCnsKCS8qIGNvbW1lbnQgb3V0IGZvciBub3cuIFdlIGRvbid0IHVzZSBpMmMgb24gdGhlIDYzMjY4QkhSIGJvYXJkICovCiNpZmRlZiBNT0NBXzM0NTBfVVNFX0kyQwoJaWYgKCgoc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqKXByaXYtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKS0+dXNlX3NwaSA9PSAwKQoJCXJldHVybihiY20zNDUwX3JlYWRfcmVnKGFkZHIpKTsKCWVsc2UKI2VuZGlmCgkJcmV0dXJuKG1vY2FfMzQ1MF9yZWFkX2kyYyhwcml2LCBhZGRyKSk7Cn0KCi8qCiAqIFBNIFNUVUJTCiAqLwoKc3RydWN0IGNsayAqY2xrX2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmlkKQp7CglyZXR1cm4gTlVMTDsKfQoKaW50IGNsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKQp7CgoJcmV0dXJuIDA7Cn0KCnZvaWQgY2xrX2Rpc2FibGUoc3RydWN0IGNsayAqY2xrKQp7Cn0KCnZvaWQgY2xrX3B1dChzdHJ1Y3QgY2xrICpjbGspCnsKfQoKaW50IGNsa19zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKewoJcmV0dXJuIDA7Cn0KCg==