LyoKICAgIDw6Y29weXJpZ2h0LUJSQ006MjAxMzpEVUFML0dQTDpzdGFuZGFyZAogICAgCiAgICAgICBDb3B5cmlnaHQgKGMpIDIwMTMgQnJvYWRjb20gQ29ycG9yYXRpb24KICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKICAgIAogICAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQogICAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAogICAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCiAgICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKICAgIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CiAgICAKICAgICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKICAgICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAogICAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgogICAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAogICAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCiAgICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCiAgICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucwogICAgICAgb2YgdGhlIHNvZnR3YXJlLgogICAgCiAgICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKICAgIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAogICAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKICAgIHdyaXR0ZW4gY29uc2VudC4KICAgIAogICAgOj4gCgoqLwoKI2luY2x1ZGUgImJic2kuaCIKCiNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDMwKQojZWxzZQp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWludHB0cl90OwojZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzMCkKCiNkZWZpbmUgTU9DQV9SRCh4KSAgICAoKCgoc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqKXByaXYtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKS0+dXNlX3NwaSA9PSAwKSA/IFwKICAgICAgICAgICAgICAgICAgICAgICAoKigodm9sYXRpbGUgdWludDMyX3QgKikoKHVuc2lnbmVkIGxvbmcpKHgpKSkpIDogXAogICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3Qpa2VyU3lzQmNtU3BpU2xhdmVSZWFkUmVnMzIoKChzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICopcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpLT5kZXZJZCwgKHVpbnQzMl90KSh4KSkpKQoKI2RlZmluZSBNT0NBX1JEOCh4LCB5KSAoKCgoc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqKXByaXYtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKS0+dXNlX3NwaSA9PSAwKSA/IFwKICAgICAgICAgICAgICAgICAgICAgICAgKCooeSkgPSAqKCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKCh1bnNpZ25lZCBsb25nKSh4KSkpKSA6IFwKICAgICAgICAgICAgICAgICAgICAgICAgKGtlclN5c0JjbVNwaVNsYXZlUmVhZCgoKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSktPmRldklkLCAodW5zaWduZWQgbG9uZykoeCksIHksIDEpKSkKCiNkZWZpbmUgTU9DQV9XUih4LHkpICAgZG8geyAoKCgoc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqKXByaXYtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKS0+dXNlX3NwaSA9PSAwKSA/IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqKCh2b2xhdGlsZSB1aW50MzJfdCAqKSgodW5zaWduZWQgbG9uZykoeCkpKSkgPSAoeSkgOiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXJTeXNCY21TcGlTbGF2ZVdyaXRlUmVnMzIoKChzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICopcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpLT5kZXZJZCwgKHVpbnQzMl90KSh4KSwgKHkpKSk7IH0gd2hpbGUoMCkKCiNkZWZpbmUgTU9DQV9XUjgoeCx5KSAgICBkbyB7ICgoKChzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICopcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpLT51c2Vfc3BpID09IDApID8gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCooKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikoKHVuc2lnbmVkIGxvbmcpKHgpKSkpID0gKHVuc2lnbmVkIGNoYXIpKHkpIDogXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VyU3lzQmNtU3BpU2xhdmVXcml0ZSgoKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSktPmRldklkLCAodW5zaWduZWQgbG9uZykoeCksICh5KSwgMSkpOyB9IHdoaWxlKDApCgojZGVmaW5lIE1PQ0FfV1IxNih4LHkpICAgZG8geyAoKCgoc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqKXByaXYtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKS0+dXNlX3NwaSA9PSAwKSA/IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqKCh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKSgodW5zaWduZWQgbG9uZykoeCkpKSkgPSAodW5zaWduZWQgc2hvcnQpKHkpIDogXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VyU3lzQmNtU3BpU2xhdmVXcml0ZSgoKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSktPmRldklkLCAodW5zaWduZWQgbG9uZykoeCksICh5KSwgMikpOyB9IHdoaWxlKDApCgojZGVmaW5lIE1PQ0FfV1JfQkxPQ0soYWRkciwgc3JjLCBsZW4pIGRvIHsga2VyU3lzQmNtU3BpU2xhdmVXcml0ZUJ1ZigoKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSktPmRldklkLCBhZGRyLCBzcmMsIGxlbiwgNCk7IH0gd2hpbGUoMCkKI2RlZmluZSBNT0NBX1JEX0JMT0NLKGFkZHIsIGRzdCwgbGVuKSBkbyB7IGtlclN5c0JjbVNwaVNsYXZlUmVhZEJ1ZigoKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSktPmRldklkLCBhZGRyLCBkc3QsIGxlbiwgNCk7IH0gd2hpbGUoMCkKCgojZGVmaW5lIEkyQ19SRCh4KQkJTU9DQV9SRCh4KQojZGVmaW5lIEkyQ19XUih4LCB5KQkJTU9DQV9XUih4LCB5KQoKI2RlZmluZSBNT0NBX0JQQ01fTlVNICAgICAgICAgNQojZGVmaW5lIE1PQ0FfQlBDTV9aT05FU19OVU0gICA4Cgp0eXBlZGVmIGVudW0gX1BNQl9DT01NQU5EX0VfCnsKICAgUE1CX0NPTU1BTkRfQUxMX09GRiA9IDAsCiAgIFBNQl9DT01NQU5EX0FMTF9PTiwKCiAgIFBNQl9DT01NQU5EX0xBU1QKfSBQTUJfQ09NTUFORF9FOwoKc3RhdGljIHVpbnQzMl90IHpvbmVfb2ZmX2JpdG1hc2tbTU9DQV9CUENNX05VTV0gPSB7IDB4RkYsIDB4MDMsIDB4MzAsIDB4MDAsIDB4MDAgfTsKc3RhdGljIHVpbnQzMl90IHpvbmVfb25fYml0bWFza1tNT0NBX0JQQ01fTlVNXSAgPSB7IDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYgfTsKCnN0YXRpYyB2b2lkIGJvZ3VzX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQp7Cn0KCnN0YXRpYyBzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhIG1vY2FfbGFuX2RhdGEgPSB7CgkubWFjYWRkcl9oaSA9CQkweDAwMDAwMTAyLAoJLm1hY2FkZHJfbG8gPQkJMHgwMzA0MDAwMCwKCgkuYmNtMzQ1MF9pMmNfYmFzZSA9ICAweDEwNDA2MjAwLAoJLmJjbTM0NTBfaTJjX2FkZHIgPSAgMHg3MCwKCS5od19yZXYgID0gICAgIEhXUkVWX01PQ0FfMjBfR0VOMjIsCgkucmZfYmFuZCA9ICAgICBNT0NBX0JBTkRfRVhUX0QsCgkuY2hpcF9pZCA9ICAgICAwLAoJLnVzZV9kbWEgICAgICAgICAgID0gMCwKCS51c2Vfc3BpICAgICAgICAgICA9IDEsCgkuZGV2SWQgICAgICAgICAgICA9IE1PQ0FfREVWSUNFX0lEX1VOUkVHSVNURVJFRCwgLy8gRmlsbGVkIGluIGR5bmFtaWNhbGx5CiNpZmRlZiBDT05GSUdfU01QCgkuc21wX3Byb2Nlc3Nvcl9pZCA9IDEsCiNlbmRpZgp9OwoKc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtb2NhX2xhbl9yZXNvdXJjZXNbXSA9IHsKCVswXSA9IHsKCQkuc3RhcnQgPSAweDEwNjAwMDAwLAoJCS5lbmQgPSAgIDB4MTA3ZmZkOTcsCgkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCgl9LAoJWzFdID0geyAvKiBOb3QgdXNlZCBmb3IgNjgwMiwgZGVmaW5lIGZvciBibW9jYSAqLwoJCS5zdGFydCA9IDAsCgkJLmVuZCA9IDAsCgkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCgl9Cn07CgpzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtb2NhX2xhbl9wbGF0X2RldiA9IHsKCS5uYW1lID0gImJtb2NhIiwKCS5pZCA9IDAsCgkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUobW9jYV9sYW5fcmVzb3VyY2VzKSwKCS5yZXNvdXJjZSA9IG1vY2FfbGFuX3Jlc291cmNlcywKCS5kZXYgPSB7CgkJLnBsYXRmb3JtX2RhdGEgPSAmbW9jYV9sYW5fZGF0YSwKCQkucmVsZWFzZSA9IGJvZ3VzX3JlbGVhc2UsCgl9LAp9OwoKc3RhdGljIHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgbW9jYV93YW5fZGF0YSA9IHsKCS5tYWNhZGRyX2hpICAgICAgID0gMHgwMDAwMDEwMiwKCS5tYWNhZGRyX2xvICAgICAgID0gMHgwMzA0MDAwMCwKCgkuYmNtMzQ1MF9pMmNfYmFzZSA9ICAweDEwNDA2MjAwLAoJLmJjbTM0NTBfaTJjX2FkZHIgPSAgMHg3MCwKCS5od19yZXYgID0gSFdSRVZfTU9DQV8yMF9HRU4yMiwKCS5jaGlwX2lkID0gMCwKCQoJLnJmX2JhbmQgPSBNT0NBX0JBTkRfRVhUX0QsCgoJLnVzZV9kbWEgICAgICAgICAgID0gMCwKCS51c2Vfc3BpICAgICAgICAgICA9IDEsCgkuZGV2SWQgICAgICAgICAgICA9IE1PQ0FfREVWSUNFX0lEX1VOUkVHSVNURVJFRCwgLy8gRmlsbGVkIGluIGR5bmFtaWNhbGx5CgojaWZkZWYgQ09ORklHX1NNUAoJLnNtcF9wcm9jZXNzb3JfaWQgPSAxLAojZW5kaWYKfTsKCnN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbW9jYV93YW5fcmVzb3VyY2VzW10gPSB7CglbMF0gPSB7CgkJLnN0YXJ0ID0gMHgxMDYwMDAwMCwKCQkuZW5kID0gICAweDEwN2ZmZDk3LAoJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAoJfSwKCVsxXSA9IHsgLyogTm90IHVzZWQgZm9yIDY4MDIsIGRlZmluZSBmb3IgYm1vY2EgKi8KCQkuc3RhcnQgPSAwLAoJCS5lbmQgPSAwLAoJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAoJfQp9OwoKc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbW9jYV93YW5fcGxhdF9kZXYgPSB7CgkubmFtZSAgICAgICAgICA9ICJibW9jYSIsCgkuaWQgICAgICAgICAgICA9IDEsCgkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUobW9jYV93YW5fcmVzb3VyY2VzKSwKCS5yZXNvdXJjZSAgICAgID0gbW9jYV93YW5fcmVzb3VyY2VzLAoJLmRldiAgICAgICAgICAgPSB7CgkJLnBsYXRmb3JtX2RhdGEgPSAmbW9jYV93YW5fZGF0YSwKCQkucmVsZWFzZSAgICAgICA9IGJvZ3VzX3JlbGVhc2UsCgl9LAp9OwoKc3RhdGljIHZvaWQgbW9jYV9lbmFibGVfaXJxKHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdikKewoJa2VyU3lzTW9jYUhvc3RJbnRyRW5hYmxlKCgoc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqKXByaXYtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKS0+ZGV2SWQpOwp9CgpzdGF0aWMgdm9pZCBtb2NhX2Rpc2FibGVfaXJxKHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdikKewoJa2VyU3lzTW9jYUhvc3RJbnRyRGlzYWJsZSgoKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSktPmRldklkKTsKfQoKc3RhdGljIHZvaWQgbW9jYV9wbWJfYnVzeV93YWl0KHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdikKewoJI2lmIDAKCXVpbnQzMl90IGRhdGE7CgoJLyogUG9zc2libGUgdGltZSBzYXZlcjogVGhlIHJlZ2lzdGVyIGFjY2VzcyB0aW1lIG92ZXIgU1BJIG1heSAKCSAgIGFsd2F5cyBiZSBlbm91Z2ggdG8gZ3VhcmFudGVlIHRoYXQgdGhlIHdyaXRlIHdpbGwgY29tcGxldGUgCgkgICBpbiB0aW1lIHdpdGhvdXQgaGF2aW5nIHRvIGNoZWNrIHRoZSBzdGF0dXMuICovCglkbwoJewoJCWRhdGEgPSBNT0NBX1JEKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5wbWJfbWFzdGVyX3N0YXR1cyk7Cgl9IHdoaWxlIChkYXRhICYgMHgxKTsKCSNlbmRpZgp9CgpzdGF0aWMgdm9pZCBtb2NhX3BtYl9jb250cm9sKHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdiwgUE1CX0NPTU1BTkRfRSBjbWQpCnsKCWludCBpLCBqOwoJdWludDMyX3QgKiBwX3pvbmVfY29udHJvbDsKCXVpbnQzMl90IGRhdGE7CgoJc3dpdGNoIChjbWQpCgl7CgkJY2FzZSBQTUJfQ09NTUFORF9BTExfT0ZGOgoJCQkvLyBUdXJuIG9mZiB6b25lIGNvbW1hbmQKCQkJTU9DQV9XUihwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+cG1iX21hc3Rlcl93ZGF0YV9vZmZzZXQsIDB4QTAwKTsKCQkJcF96b25lX2NvbnRyb2wgPSAmem9uZV9vZmZfYml0bWFza1swXTsKCQkJYnJlYWs7CgkJY2FzZSBQTUJfQ09NTUFORF9BTExfT046CgkJCS8vIFR1cm4gb24gem9uZSBjb21tYW5kCgkJCU1PQ0FfV1IocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPnBtYl9tYXN0ZXJfd2RhdGFfb2Zmc2V0LCAweEMwMCk7CgkJCXBfem9uZV9jb250cm9sID0gJnpvbmVfb25fYml0bWFza1swXTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGlsbGVnYWwgY21kOiAlMDh4XG4iLAoJCQkJX19GVU5DVElPTl9fLCBjbWQpOwoJCQlyZXR1cm47Cgl9CgoJZm9yIChpID0gMDsgaSA8IE1PQ0FfQlBDTV9OVU07IGkrKykKCXsKCQlmb3IgKGogPSAwOyBqIDwgTU9DQV9CUENNX1pPTkVTX05VTTsgaisrKQoJCXsKCQkJaWYgKCpwX3pvbmVfY29udHJvbCAmICgxIDw8IGopKQoJCQl7CgkJCQkvLyB6b25lIGFkZHJlc3MgaW4gYnBjbXMKCQkJCWRhdGEgPSAoMHgxIDw8IDIwKSArIDE2ICsgKGkgKiA0MDk2KSArIChqICogNCk7CgkJCQlNT0NBX1dSKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5wbWJfbWFzdGVyX2NtZF9vZmZzZXQsIGRhdGEpOwoJCQkJbW9jYV9wbWJfYnVzeV93YWl0KHByaXYpOwoJCQl9CgkJfQoJCXBfem9uZV9jb250cm9sKys7Cgl9Cgp9CgpzdGF0aWMgdm9pZCBtb2NhX3BtYl9naXZlX2Z3X2NudHJsKHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdikKewoJLyogUGFzcyBjb250cm9sIG92ZXIgdGhlIG1lbW9yaWVzIHRvIHRoZSBGVyAqLwoJTU9DQV9XUihwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+cG1iX21hc3Rlcl93ZGF0YV9vZmZzZXQsIDB4MSk7CglNT0NBX1dSKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5wbWJfbWFzdGVyX2NtZF9vZmZzZXQsIDB4MTAwMDAyKTsKCW1vY2FfcG1iX2J1c3lfd2FpdChwcml2KTsKfQoKc3RhdGljIHZvaWQgbW9jYV9od19yZXNldChzdHJ1Y3QgbW9jYV9wcml2X2RhdGEgKnByaXYpCnsKLy8JdW5zaWduZWQgbG9uZyBmbGFnczsKLy8gICB1aW50MzJfdCBjaGlwaWQ7CgoJLyogZGlzYWJsZSBhbmQgY2xlYXIgYWxsIGludGVycnVwdHMgKi8KCU1PQ0FfV1IocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPmwyX21hc2tfc2V0X29mZnNldCwgMHhmZmZmZmZmZik7CglNT0NBX1JEKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5sMl9tYXNrX3NldF9vZmZzZXQpOwoKCS8qIGFzc2VydCByZXNldHMgKi8KCgkvKiByZXNldCBDUFUgZmlyc3QsIGJvdGggQ1BVcyBmb3IgTW9DQSAyMCBIVyAqLwoJaWYgKHByaXYtPmh3X3JldiA9PSBIV1JFVl9NT0NBXzIwX0dFTjIyKQoJCU1PQ0FfU0VUKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5zd19yZXNldF9vZmZzZXQsIDUpOwoJZWxzZQoJCU1PQ0FfU0VUKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5zd19yZXNldF9vZmZzZXQsIDEpOwoKCU1PQ0FfUkQocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPnN3X3Jlc2V0X29mZnNldCk7CgoJdWRlbGF5KDIwKTsKCgkvKiByZXNldCBldmVyeXRoaW5nIGVsc2UgZXhjZXB0IGNsb2NrcyAqLwoJTU9DQV9TRVQocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPnN3X3Jlc2V0X29mZnNldCwgfigoMSA8PCAzKSB8ICgxIDw8IDcpKSk7CglNT0NBX1JEKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5zd19yZXNldF9vZmZzZXQpOwoKCXVkZWxheSgyMCk7CgoJLyogZGlzYWJsZSBjbG9ja3MgKi8KCU1PQ0FfU0VUKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5zd19yZXNldF9vZmZzZXQsIH4oMSA8PCAzKSk7CglNT0NBX1JEKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5zd19yZXNldF9vZmZzZXQpOwoKCU1PQ0FfV1IocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPmwyX2NsZWFyX29mZnNldCwgMHhmZmZmZmZmZik7CglNT0NBX1JEKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5sMl9jbGVhcl9vZmZzZXQpOwoKCS8qIFBvd2VyIGRvd24gYWxsIHpvbmVzICovCgltb2NhX3BtYl9jb250cm9sKHByaXYsIFBNQl9DT01NQU5EX0FMTF9PRkYpOwoKCS8qIFBvd2VyIGRvd24gYWxsIFNZU19DVFJMIG1lbW9yaWVzICovCglNT0NBX1dSKDB4MTAxMDAwNjgsIDEpOyAgIC8vIENMS0dFTl9QTExfU1lTMV9QTExfUFdSRE4KCU1PQ0FfU0VUKDB4MTAxMDAwMGMsIDEpOyAgLy8gQ0xLR0VOX1BMTF9TWVMwX1BMTF9DSEFOTkVMX0NUUkxfQ0hfMwoKfQoKc3RhdGljIHVuc2lnbmVkIGludCBtb2NhX2dldF9waHlfZnJlcShzdHJ1Y3QgbW9jYV9wcml2X2RhdGEgKnByaXYpCnsKCXVuc2lnbmVkIGludCB4ID0gTU9DQV9SRCgweDEwMTAwMDQ0KTsgLy8gQ0xLR0VOX1BMTF9TWVMxX1BMTF9DSEFOTkVMX0NUUkxfQ0hfMgoKCXggPSAoeCA+PiAxKSAmIDB4RkY7IC8vIEdldCB0aGUgTURJVl9DSDIgZmllbGQKCglyZXR1cm4oIDI0MDAgLyB4KTsgCn0KCi8qIGNhbGxlZCBhbnkgdGltZSB3ZSBzdGFydC9yZXN0YXJ0L3N0b3AgTW9DQSAqLwpzdGF0aWMgdm9pZCBtb2NhX2h3X2luaXQoc3RydWN0IG1vY2FfcHJpdl9kYXRhICpwcml2LCBpbnQgYWN0aW9uKQp7Cgl1MzIgbWFzazsKCXUzMiB0ZW1wOwoJdTMyIGRhdGE7Cgl1MzIgY291bnQgPSAwOwoJc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqIHBNb2NhRGF0YSA9IChzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICopcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CgoJaWYgKGFjdGlvbiA9PSBNT0NBX0VOQUJMRSAmJiAhcHJpdi0+ZW5hYmxlZCkgewoJCWNsa19lbmFibGUocHJpdi0+Y2xrKTsKCgkJTU9DQV9XUigweDEwNDA0MzFjLCAweGZmZmZmZmZmKTsgLy8gU1VOX1RPUF9DVFJMX1NXX0lOSVRfMF9DTEVBUiAtLT4gRG8gdGhpcyBhdCBzdGFydCBvZiBzZXF1ZW5jZQoJCXVkZWxheSgyMCk7CiAgIAoJCXByaXYtPmVuYWJsZWQgPSAxOwoJfQoKCS8qIGNsb2NrIG5vdCBlbmFibGVkLCByZWdpc3RlciBhY2Nlc3NlcyB3aWxsIGZhaWwgd2l0aCBidXMgZXJyb3IgKi8KCWlmICghcHJpdi0+ZW5hYmxlZCkKCQlyZXR1cm47CgoJbW9jYV9od19yZXNldChwcml2KTsKCXVkZWxheSgxKTsKCglpZiAoYWN0aW9uID09IE1PQ0FfRU5BQkxFKSB7CgoJCS8qIFBvd2VyIHVwIGFsbCB6b25lcyAqLwoJCW1vY2FfcG1iX2NvbnRyb2wocHJpdiwgUE1CX0NPTU1BTkRfQUxMX09OKTsKCQltb2NhX3BtYl9naXZlX2Z3X2NudHJsKHByaXYpOwoKCQlNT0NBX1VOU0VUKDB4MTAxMDAwMGMsIDEpOyAgLy8gQ0xLR0VOX1BMTF9TWVMwX1BMTF9DSEFOTkVMX0NUUkxfQ0hfMyAKCgkJTU9DQV9XUigweDEwMTAwMDZDLCAxKTsgIC8vIENMS0dFTl9QTExfU1lTMV9QTExfUkVTRVQgCgkJTU9DQV9XUigweDEwMTAwMDY4LCAwKTsgIC8vIENMS0dFTl9QTExfU1lTMV9QTExfUFdSRE4gCgkJZGF0YSA9IDA7CgkJd2hpbGUgKChkYXRhICYgMHgxKSA9PSAwKQoJCXsKCQkJLyogVGhpcyB0eXBpY2FsbHkgaXMgb25seSByZWFkIG9uY2UgKi8KCQkJZGF0YSA9IE1PQ0FfUkQoMHgxMDEwMDA2MCk7IC8vIENMS0dFTl9QTExfU1lTMV9QTExfTE9DS19TVEFUVVMKCgkJCWlmIChjb3VudCsrID4gMTApCgkJCQlicmVhazsKCQl9CgkJTU9DQV9XUigweDEwMTAwMDZDLCAwKTsgIC8vIENMS0dFTl9QTExfU1lTMV9QTExfUkVTRVQgCgoJCWlmIChwcml2LT5ib25kZWRfbW9kZSkgewoJCQlNT0NBX1VOU0VUKDB4MTAxMDAwNDgsIDEpOyAgLy8gQ0xLR0VOX1BMTF9TWVMxX1BMTF9DSEFOTkVMX0NUUkxfQ0hfMyAKCQkJTU9DQV9VTlNFVCgweDEwMTAwMDUwLCAxKTsgIC8vIENMS0dFTl9QTExfU1lTMV9QTExfQ0hBTk5FTF9DVFJMX0NIXzUgCgkJfSBlbHNlIHsKCQkJTU9DQV9TRVQoMHgxMDEwMDA0OCwgMSk7ICAvLyBDTEtHRU5fUExMX1NZUzFfUExMX0NIQU5ORUxfQ1RSTF9DSF8zIAoJCQlNT0NBX1NFVCgweDEwMTAwMDUwLCAxKTsgIC8vIENMS0dFTl9QTExfU1lTMV9QTExfQ0hBTk5FTF9DVFJMX0NIXzUgCgkJfQoJCXVkZWxheSgxKTsKCgkJLyogZGVhc3NlcnQgbW9jYV9zeXNfcmVzZXQsIHN5c3RlbSBjbG9jaywgcGh5MCBhbmQgcGh5MCBjbG9jayAqLwoJCW1hc2sgPSAoMSA8PCAxKSB8ICgxIDw8IDcpIHwgKDEgPDwgNCkgfCAoMSA8PCA4KTsKCgkJLyogZGVhc3NlcnQgcGh5MSBhbmQgcGh5MSBjbG9jayBpbiBib25kZWQgbW9kZSAqLwoJCWlmIChwcml2LT5ib25kZWRfbW9kZSkKCQkJbWFzayB8PSAoMSA8PCA1KSB8ICgxIDw8IDkpOwoKCQlNT0NBX1VOU0VUKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5zd19yZXNldF9vZmZzZXQsIG1hc2spOwoJCU1PQ0FfUkQocHJpdi0+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+Y2xvY2tfbG9jaywgZmxhZ3MpOwoJfQp9CgojZW5kaWYgLyogRFNMX01PQ0EgKi8KCgovL2V4dGVybiB2b2lkIGJjbWVuZXRfcmVnaXN0ZXJfbW9jYV9mY19iaXRzX2NiKHZvaWQgY2Iodm9pZCAqLCB1bnNpZ25lZCBsb25nICopLCBpbnQgaXNXYW4sIHZvaWQgKiBhcmcpOwoKc3RhdGljIGludCAgaHdfc3BlY2lmaWNfaW5pdCggc3RydWN0IG1vY2FfcHJpdl9kYXRhICpwcml2ICkKewojaWZkZWYgRFNMX01PQ0EKCXN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKnBNb2NhRGF0YTsKCglwTW9jYURhdGEgPSAoc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqKXByaXYtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwoKCS8qIGZpbGwgaW4gdGhlIGh3X3JldiBmaWVsZCAqLwoJcE1vY2FEYXRhLT5jaGlwX2lkID0gTU9DQV9SRCgweDEwNDA0MDA0KSArIDB4QTA7CgoJcE1vY2FEYXRhLT5od19yZXYgPSBIV1JFVl9NT0NBXzIwX0dFTjIyOwoKCS8qIFBvd2VyIGRvd24gYWxsIExFQVAgbWVtb3JpZXMgKi8KCU1PQ0FfV1IoMHgxMDEwMDBlNCwgMHg2KTsgLy8gQ0xLR0VOX0xFQVBfVE9QX0lOU1RfREFUQSAgIAoJTU9DQV9XUigweDEwMTAwMGU4LCAweDYpOyAvLyBDTEtHRU5fTEVBUF9UT1BfSU5TVF9IQUIgCglNT0NBX1dSKDB4MTAxMDAwZWMsIDB4Nik7IC8vIENMS0dFTl9MRUFQX1RPUF9JTlNUX1BST0cwCglNT0NBX1dSKDB4MTAxMDAwZjAsIDB4Nik7IC8vIENMS0dFTl9MRUFQX1RPUF9JTlNUX1BST0cxICAgCglNT0NBX1dSKDB4MTAxMDAwZjQsIDB4Nik7IC8vIENMS0dFTl9MRUFQX1RPUF9JTlNUX1BST0cyICAKCU1PQ0FfV1IoMHgxMDEwMDBmOCwgMHg2KTsgLy8gQ0xLR0VOX0xFQVBfVE9QX0lOU1RfUk9NCglNT0NBX1dSKDB4MTAxMDAwZmMsIDB4Nik7IC8vIENMS0dFTl9MRUFQX1RPUF9JTlNUX1NIQVJFRCAgCglNT0NBX1dSKDB4MTAxMDAxNjQsIDB4Myk7IC8vIENMS0dFTl9TWVNfQ1RSTF9JTlNUX1BPV0VSX1NXSVRDSF9NRU1PUlkgCgovLwliY21lbmV0X3JlZ2lzdGVyX21vY2FfZmNfYml0c19jYigKLy8JCW1vY2FfZ2V0X2ZjX2JpdHMsIHBNb2NhRGF0YS0+dXNlX3NwaSA/IDEgOiAwLCAodm9pZCAqKXByaXYpOwojZW5kaWYKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBtb2NhX3BsYXRmb3JtX2Rldl9yZWdpc3Rlcih2b2lkKQp7CglzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICpwTW9jYURhdGE7CglzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwUGxhdGZvcm1EZXY7CglCUF9NT0NBX0lORk8gbW9jYUluZm9bQlBfTU9DQV9NQVhfTlVNXTsKCWludCBtb2NhQ2hpcE51bSA9IEJQX01PQ0FfTUFYX05VTTsKCWludCBpOwoJaW50IHJldCA9IDA7ICAgCgoJQnBHZXRNb2NhSW5mbyhtb2NhSW5mbywgJm1vY2FDaGlwTnVtKTsKCglmb3IgKGkgPSAwOyBpIDwgbW9jYUNoaXBOdW07IGkrKykgewoJCXN3aXRjaCAobW9jYUluZm9baV0udHlwZSkgewoJCQljYXNlIEJQX01PQ0FfVFlQRV9XQU46CgkJCQlwTW9jYURhdGEgPSAmbW9jYV93YW5fZGF0YTsKCQkJCXBQbGF0Zm9ybURldiA9ICZtb2NhX3dhbl9wbGF0X2RldjsKCQkJCWJyZWFrOwoKCQkJY2FzZSBCUF9NT0NBX1RZUEVfTEFOOgoJCQkJcE1vY2FEYXRhID0gJm1vY2FfbGFuX2RhdGE7CgkJCQlwUGxhdGZvcm1EZXYgPSAmbW9jYV9sYW5fcGxhdF9kZXY7CgkJCQlicmVhazsKCgkJCWRlZmF1bHQ6CgkJCQlwcmludGsoS0VSTl9FUlIgImJtb2NhOiB1bnJlY29nbml6ZWQgTW9DQSB0eXBlICVkXG4iLAoJCQkJCW1vY2FJbmZvW2ldLnR5cGUpOwoJCQkJcmV0dXJuKC0xKTsKCQkJCWJyZWFrOwoJCX0KCgkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKHBQbGF0Zm9ybURldik7CgkJaWYgKHJldCA8IDApIHsKCQkJcmV0dXJuKHJldCk7CgkJfQoJCWVsc2UgewoJCQlwTW9jYURhdGEtPmRldklkID0gaTsKCgkJCS8qIE1hcCB0aGUgYm9hcmQgcGFyYW1zIFJGIEJhbmQgdG8gdGhlIGJtb2NhLmggdmFsdWUgKi8KCQkJc3dpdGNoIChtb2NhSW5mb1tpXS5yZkJhbmQpCgkJCXsKCQkJCWNhc2UgQlBfTU9DQV9SRl9CQU5EX0RfTE9XOgoJCQkJCXBNb2NhRGF0YS0+cmZfYmFuZCA9IE1PQ0FfQkFORF9EX0xPVzsKCQkJCQlicmVhazsKCQkJCWNhc2UgQlBfTU9DQV9SRl9CQU5EX0RfSElHSDoKCQkJCQlwTW9jYURhdGEtPnJmX2JhbmQgPSBNT0NBX0JBTkRfRF9ISUdIOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBCUF9NT0NBX1JGX0JBTkRfRVhUX0Q6CgkJCQkJcE1vY2FEYXRhLT5yZl9iYW5kID0gTU9DQV9CQU5EX0VYVF9EOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBCUF9NT0NBX1JGX0JBTkRfRToKCQkJCQlwTW9jYURhdGEtPnJmX2JhbmQgPSBNT0NBX0JBTkRfRTsKCQkJCQlicmVhazsKCQkJCWNhc2UgQlBfTU9DQV9SRl9CQU5EX0Y6ICAgIAoJCQkJCXBNb2NhRGF0YS0+cmZfYmFuZCA9IE1PQ0FfQkFORF9GOwoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQkvKiBEbyBub3RoaW5nICovCgkJCQkJYnJlYWs7CgkJCX0KCQkJcHJpbnRrKEtFUk5fSU5GTyAiYm1vY2E6IEZvdW5kIE1vQ0EgZGV2aWNlICVkLyVkICBSRiBCYW5kICVkXG4iLAoJCQkJaSwgbW9jYUNoaXBOdW0sIG1vY2FJbmZvW2ldLnJmQmFuZCk7CgkJfQoJfQoKCXJldHVybihyZXQpOwp9CgpzdGF0aWMgdm9pZCBtb2NhX3BsYXRmb3JtX2Rldl91bnJlZ2lzdGVyKHZvaWQpCnsKCWlmIChtb2NhX2xhbl9kYXRhLmRldklkICE9IE1PQ0FfREVWSUNFX0lEX1VOUkVHSVNURVJFRCkKCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcigmbW9jYV9sYW5fcGxhdF9kZXYpOwoKCWlmIChtb2NhX3dhbl9kYXRhLmRldklkICE9IE1PQ0FfREVWSUNFX0lEX1VOUkVHSVNURVJFRCkKCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcigmbW9jYV93YW5fcGxhdF9kZXYpOwp9CgpzdGF0aWMgdm9pZCBtb2NhXzM0NTBfd3JpdGUoc3RydWN0IG1vY2FfcHJpdl9kYXRhICpwcml2LCB1OCBhZGRyLCB1MzIgZGF0YSkKewoJLyogY29tbWVudCBvdXQgZm9yIG5vdy4gV2UgZG9uJ3QgdXNlIGkyYyBvbiB0aGUgNjMyNjhCSFIgYm9hcmQgKi8KI2lmZGVmIE1PQ0FfMzQ1MF9VU0VfSTJDCglpZiAoKChzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICopcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpLT51c2Vfc3BpID09IDApCgkJYmNtMzQ1MF93cml0ZV9yZWcoYWRkciwgZGF0YSk7CgllbHNlCiNlbmRpZgoJCW1vY2FfMzQ1MF93cml0ZV9pMmMocHJpdiwgYWRkciwgZGF0YSk7Cn0KCnN0YXRpYyB1MzIgbW9jYV8zNDUwX3JlYWQoc3RydWN0IG1vY2FfcHJpdl9kYXRhICpwcml2LCB1OCBhZGRyKQp7CgkvKiBjb21tZW50IG91dCBmb3Igbm93LiBXZSBkb24ndCB1c2UgaTJjIG9uIHRoZSA2MzI2OEJIUiBib2FyZCAqLwojaWZkZWYgTU9DQV8zNDUwX1VTRV9JMkMKCWlmICgoKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSktPnVzZV9zcGkgPT0gMCkKCQlyZXR1cm4oYmNtMzQ1MF9yZWFkX3JlZyhhZGRyKSk7CgllbHNlCiNlbmRpZgoJCXJldHVybihtb2NhXzM0NTBfcmVhZF9pMmMocHJpdiwgYWRkcikpOwp9CgovKgogKiBQTSBTVFVCUwogKi8KCnN0cnVjdCBjbGsgKmNsa19nZXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICppZCkKewoJcmV0dXJuIE5VTEw7Cn0KCmludCBjbGtfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaykKewoKCXJldHVybiAwOwp9Cgp2b2lkIGNsa19kaXNhYmxlKHN0cnVjdCBjbGsgKmNsaykKewp9Cgp2b2lkIGNsa19wdXQoc3RydWN0IGNsayAqY2xrKQp7Cn0KCmludCBjbGtfc2V0X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCnsKCXJldHVybiAwOwp9Cgo=