LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoKICogICAgICBlczEzNzEuYyAgLS0gIENyZWF0aXZlIEVuc29uaXEgRVMxMzcxLgogKgogKiAgICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDAxLCAyMDAzICBUaG9tYXMgU2FpbGVyICh0LnNhaWxlckBhbHVtbmkuZXRoei5jaCkKICoKICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKgogKiBTcGVjaWFsIHRoYW5rcyB0byBFbnNvbmlxCiAqCiAqICBTdXBwb3J0ZWQgZGV2aWNlczoKICogIC9kZXYvZHNwICAgIHN0YW5kYXJkIC9kZXYvZHNwIGRldmljZSwgKG1vc3RseSkgT1NTIGNvbXBhdGlibGUKICogIC9kZXYvbWl4ZXIgIHN0YW5kYXJkIC9kZXYvbWl4ZXIgZGV2aWNlLCAobW9zdGx5KSBPU1MgY29tcGF0aWJsZQogKiAgL2Rldi9kc3AxICAgYWRkaXRpb25hbCBEQUMsIGxpa2UgL2Rldi9kc3AsIGJ1dCBvdXRwdXRzIHRvIG1peGVyICJTWU5USCIgc2V0dGluZwogKiAgL2Rldi9taWRpICAgc2ltcGxlIE1JREkgVUFSVCBpbnRlcmZhY2UsIG5vIGlvY3RsCiAqCiAqICBOT1RFOiB0aGUgY2FyZCBkb2VzIG5vdCBoYXZlIGFueSBGTS9XYXZldGFibGUgc3ludGhlc2l6ZXIsIGl0IGlzIHN1cHBvc2VkCiAqICB0byBiZSBkb25lIGluIHNvZnR3YXJlLiBUaGF0IGlzIHdoYXQgL2Rldi9kYWMgaXMgZm9yLiBCeSBub3cgKFEyIDE5OTgpCiAqICB0aGVyZSBhcmUgc2V2ZXJhbCBNSURJIHRvIFBDTSAoV0FWKSBwYWNrYWdlcywgb25lIG9mIHRoZW0gaXMgdGltaWRpdHkuCiAqCiAqICBSZXZpc2lvbiBoaXN0b3J5CiAqICAgIDA0LjA2LjE5OTggICAwLjEgICBJbml0aWFsIHJlbGVhc2UKICogICAgICAgICAgICAgICAgICAgICAgIE1peGVyIHN0dWZmIHNob3VsZCBiZSBvdmVyaGF1bGVkOyBlc3BlY2lhbGx5IG9wdGlvbmFsIEFDOTcgbWl4ZXIgYml0cwogKiAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGRldGVjdGVkLiBUaGlzIHJlc3VsdHMgaW4gc3RyYW5nZSBiZWhhdmlvdXIgb2Ygc29tZSBtaXhlcgogKiAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MsIGxpa2UgbWFzdGVyIHZvbHVtZSBhbmQgbWljLgogKiAgICAwOC4wNi4xOTk4ICAgMC4yICAgRmlyc3QgcmVsZWFzZSB1c2luZyBBbGFuIENveCcgc291bmRjb3JlIGluc3RlYWQgb2YgbWlzY2RldmljZQogKiAgICAwMy4wOC4xOTk4ICAgMC4zICAgRG8gbm90IGluY2x1ZGUgbW9kdmVyc2lvbnMuaAogKiAgICAgICAgICAgICAgICAgICAgICAgTm93IG1peGVyIGJlaGF2aW91ciBjYW4gYmFzaWNhbGx5IGJlIHNlbGVjdGVkIGJldHdlZW4KICogICAgICAgICAgICAgICAgICAgICAgICJPU1MgZG9jdW1lbnRlZCIgYW5kICJPU1MgYWN0dWFsIiBiZWhhdmlvdXIKICogICAgMzEuMDguMTk5OCAgIDAuNCAgIEZpeCByZWFscGxheWVyIHByb2JsZW1zIC0gZGFjLmNvdW50IGlzc3VlcwogKiAgICAyNy4xMC4xOTk4ICAgMC41ICAgRml4IGpveXN0aWNrIHN1cHBvcnQKICogICAgICAgICAgICAgICAgICAgICAgIC0tIE9saXZlciBOZXVrdW0gKGMxODhAb3JnLmNoZW1pZS51bmktbXVlbmNoZW4uZGUpCiAqICAgIDEwLjEyLjE5OTggICAwLjYgICBGaXggZHJhaW5fZGFjIHRyeWluZyB0byB3YWl0IG9uIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgRE1BCiAqICAgIDIzLjEyLjE5OTggICAwLjcgICBGaXggYSBmZXcgZl9maWxlICYgRk1PREVfIGJ1Z3MKICogICAgICAgICAgICAgICAgICAgICAgIERvbid0IHdha2UgdXAgYXBwIHVudGlsIHRoZXJlIGFyZSBmcmFnc2l6ZSBieXRlcyB0byByZWFkL3dyaXRlCiAqICAgIDA2LjAxLjE5OTkgICAwLjggICByZW1vdmUgdGhlIHNpbGx5IFNBX0lOVEVSUlVQVCBmbGFnLgogKiAgICAgICAgICAgICAgICAgICAgICAgaG9wZWZ1bGx5IGtpbGxlZCB0aGUgZWdjcyBzZWN0aW9uIHR5cGUgY29uZmxpY3QKICogICAgMTIuMDMuMTk5OSAgIDAuOSAgIGNpbmZvLmJsb2NrcyBzaG91bGQgYmUgcmVzZXQgYWZ0ZXIgR0VUeFBUUiBpb2N0bC4KICogICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVkIGJ5IEpvaGFuIE1hZXMgPGpvbWFAdGVsaW5kdXMuYmU+CiAqICAgIDIyLjAzLjE5OTkgICAwLjEwICByZXR1cm4gRUFHQUlOIGluc3RlYWQgb2YgRUJVU1kgd2hlbiBPX05PTkJMT0NLCiAqICAgICAgICAgICAgICAgICAgICAgICByZWFkL3dyaXRlIGNhbm5vdCBiZSBleGVjdXRlZAogKiAgICAwNy4wNC4xOTk5ICAgMC4xMSAgaW1wbGVtZW50ZWQgdGhlIGZvbGxvd2luZyBpb2N0bCdzOiBTT1VORF9QQ01fUkVBRF9SQVRFLCAKICogICAgICAgICAgICAgICAgICAgICAgIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTLCBTT1VORF9QQ01fUkVBRF9CSVRTOyAKICogICAgICAgICAgICAgICAgICAgICAgIEFscGhhIGZpeGVzIHJlcG9ydGVkIGJ5IFBldGVyIEpvbmVzIDxwam9uZXNAcmVkaGF0LmNvbT4KICogICAgICAgICAgICAgICAgICAgICAgIEFub3RoZXIgQWxwaGEgZml4ICh3YWl0X3NyY19yZWFkeSBpbiBpbml0IHJvdXRpbmUpCiAqICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlZCBieSAiSXZhbiBOLiBLb2tzaGF5c2t5IiA8aW5rQGp1cmFzc2ljLnBhcmsubXN1LnJ1PgogKiAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogam95c3RpY2sgYWRkcmVzcyBoYW5kbGluZyBtaWdodCBzdGlsbCBiZSB3cm9uZyBvbiBhcmNocwogKiAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgdGhhbiBpMzg2CiAqICAgIDE1LjA2LjE5OTkgICAwLjEyICBGaXggYmFkIGFsbG9jYXRpb24gYnVnLgogKiAgICAgICAgICAgICAgICAgICAgICAgVGhhbmtzIHRvIERldGkgRmxpZWdsIDxmbGllZ2xAaW4udHVtLmRlPgogKiAgICAyOC4wNi4xOTk5ICAgMC4xMyAgQWRkIHBjaV9zZXRfbWFzdGVyCiAqICAgIDAzLjA4LjE5OTkgICAwLjE0ICBhZGFwdCB0byBMaW51cycgbmV3IF9fc2V0dXAvX19pbml0Y2FsbAogKiAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQga2VybmVsIGNvbW1hbmQgbGluZSBvcHRpb24gImVzMTM3MT1qb3lzdGlja2FkZHIiCiAqICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVkIENPTkZJR19TT1VORF9FUzEzNzFfSk9ZUE9SVF9CT09UIGtsdWRnZQogKiAgICAxMC4wOC4xOTk5ICAgMC4xNSAgKFJlKWFkZGVkIFMvUERJRiBtb2R1bGUgb3B0aW9uIGZvciBjYXJkcyByZXZpc2lvbiA+PSA0LgogKiAgICAgICAgICAgICAgICAgICAgICAgSW5pdGlhbCB2ZXJzaW9uIGJ5IERhdmUgUGxhdHQgPGRwbGF0dEBzbnVsYnVnLm10dmlldy5jYS51cz4uCiAqICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVfaW5pdC9fX3NldHVwIGZpeGVzCiAqICAgIDA4LjE2LjE5OTkgICAwLjE2ICBKb2UgQ290ZWxsZXNlIDxqb2VjQGVuc29uaXEuY29tPgogKiAgICAgICAgICAgICAgICAgICAgICAgQWRkZWQgZGV0ZWN0aW9uIGZvciBFUzEzNzEgcmV2aXNpb24gSUQgc28gdGhhdCB3ZSBjYW4KICogICAgICAgICAgICAgICAgICAgICAgIGRldGVjdCB0aGUgRVMxMzczIGFuZCBsYXRlciBwYXJ0cy4KICogICAgICAgICAgICAgICAgICAgICAgIGFkZGVkIEFDOTcgI2RlZmluZXMgZm9yIHJlYWRhYmlsaXR5CiAqICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCBhIC9wcm9jIGZpbGUgc3lzdGVtIGZvciBkdW1waW5nIGhhcmR3YXJlIHN0YXRlCiAqICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkIFNSQyBhbmQgQ09ERUMgdy9yIGZ1bmN0aW9ucyB0byBhY2NvbW1vZGF0ZSBidWdzCiAqICAgICAgICAgICAgICAgICAgICAgICBpbiBzb21lIHZlcnNpb25zIG9mIHRoZSBFUzEzN3ggY2hpcHMuCiAqICAgIDMxLjA4LjE5OTkgICAwLjE3ICBhZGQgc3Bpbl9sb2NrX2luaXQKICogICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkIGN1cnJlbnQtPnN0YXRlID0geCB3aXRoIHNldF9jdXJyZW50X3N0YXRlKHgpCiAqICAgIDAzLjA5LjE5OTkgICAwLjE4ICBjaGFuZ2UgcmVhZCBzZW1hbnRpY3MgZm9yIE1JREkgdG8gbWF0Y2gKICogICAgICAgICAgICAgICAgICAgICAgIE9TUyBtb3JlIGNsb3NlbHk7IHJlbW92ZSBwb3NzaWJsZSB3YWtldXAgcmFjZQogKiAgICAyMS4xMC4xOTk5ICAgMC4xOSAgUm91bmQgc2FtcGxpbmcgcmF0ZXMsIHJlcXVlc3RlZCBieQogKiAgICAgICAgICAgICAgICAgICAgICAgS2FzYW1hdHN1IEtlbmljaGkgPHQyOXcwMjY3QGlwLm1lZGlhLmt5b3RvLXUuYWMuanA+CiAqICAgIDI3LjEwLjE5OTkgICAwLjIwICBBZGRlZCBTaWdtYVRlbCAzRCBlbmhhbmNlbWVudCBzdHJpbmcKICogICAgICAgICAgICAgICAgICAgICAgIENvZGVjIElEIHByaW50aW5nIGNoYW5nZXMKICogICAgMjguMTAuMTk5OSAgIDAuMjEgIE1vcmUgd2FpdHF1ZXVlIHJhY2VzIGZpeGVkCiAqICAgICAgICAgICAgICAgICAgICAgICBKb2UgQ290ZWxsZXNlIDxqb2VjQGVuc29uaXEuY29tPgogKiAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlZCBQQ0kgZGV0ZWN0aW9uIHJvdXRpbmUgc28gd2UgY2FuIG1vcmUgZWFzaWx5CiAqICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3QgRVMxMzd4IGNoaXAgYW5kIGRlcml2YXRpdmVzLgogKiAgICAwNS4wMS4yMDAwICAgMC4yMiAgU2hvdWxkIG5vdyB3b3JrIHdpdGggcmV2NyBib2FyZHM7IHBhdGNoIGJ5CiAqICAgICAgICAgICAgICAgICAgICAgICBFcmljIExlbWFyLCBlbGVtYXJAY3Mud2FzaGluZ3Rvbi5lZHUKICogICAgMDguMDEuMjAwMCAgIDAuMjMgIFByZXZlbnQgc29tZSBpb2N0bCdzIGZyb20gcmV0dXJuaW5nIGJhZCBjb3VudCB2YWx1ZXMgb24gdW5kZXJydW4vb3ZlcnJ1bjsKICogICAgICAgICAgICAgICAgICAgICAgIFRpbSBKYW5paydzIEJTRSAoQmVkZXZpbGxlZCBTb3VuZCBFbmdpbmUpIGZvdW5kIHRoaXMKICogICAgMDcuMDIuMjAwMCAgIDAuMjQgIFVzZSBwY2lfYWxsb2NfY29uc2lzdGVudCBhbmQgcGNpX3JlZ2lzdGVyX2RyaXZlcgogKiAgICAwNy4wMi4yMDAwICAgMC4yNSAgVXNlIGFjOTdfY29kZWMKICogICAgMDEuMDMuMjAwMCAgIDAuMjYgIFNQRElGIHBhdGNoIGJ5IE1pa2FlbCBCb3VpbGxvdCA8bWlrYWVsLmJvdWlsbG90QGJpZ2Zvb3QuY29tPgogKiAgICAgICAgICAgICAgICAgICAgICAgVXNlIHBjaV9tb2R1bGVfaW5pdAogKiAgICAyMS4xMS4yMDAwICAgMC4yNyAgSW5pdGlhbGl6ZSBkbWEgYnVmZmVycyBpbiBwb2xsLCBvdGhlcndpc2UgcG9sbCBtYXkgcmV0dXJuIGEgYm9ndXMgbWFzawogKiAgICAxMi4xMi4yMDAwICAgMC4yOCAgTW9yZSBkbWEgYnVmZmVyIGluaXRpYWxpemF0aW9ucywgcGF0Y2ggZnJvbQogKiAgICAgICAgICAgICAgICAgICAgICAgVGplZXJkIE11bGRlciA8dGplZXJkLm11bGRlckBmdWppdHN1LXNpZW1lbnMuY29tPgogKiAgICAwNS4wMS4yMDAxICAgMC4yOSAgSG9wZWZ1bGx5IHVwZGF0ZXMgd2lsbCBub3QgYmUgcmVxdWlyZWQgYW55bW9yZSB3aGVuIENyZWF0aXZlIGJ1bXBzCiAqICAgICAgICAgICAgICAgICAgICAgICB0aGUgQ1Q1ODgwIHJldmlzaW9uLgogKiAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGVkIGJ5IFN0ZXBoYW4gTfxsbGVyIDxzbXVlbGxlckBjaHJvbm94LmRlPgogKiAgICAzMS4wMS4yMDAxICAgMC4zMCAgUmVnaXN0ZXIvVW5yZWdpc3RlciBnYW1lcG9ydAogKiAgICAgICAgICAgICAgICAgICAgICAgRml4IFNFVFRSSUdHRVIgbm9uIE9TUyBBUEkgY29uZm9ybWl0eQogKiAgICAxNC4wNy4yMDAxICAgMC4zMSAgQWRkIGxpc3Qgb2YgbGFwdG9wcyBuZWVkaW5nIGFtcGxpZmllciBjb250cm9sCiAqICAgIDAzLjAxLjIwMDMgICAwLjMyICBvcGVuX21vZGUgZml4ZXMgZnJvbSBHZW9yZyBBY2hlciA8YWNoZXJAaW4udHVtLmRlPgogKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgCiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgojaW5jbHVkZSA8bGludXgvc291bmQuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgojaW5jbHVkZSA8bGludXgvcGNpLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgojaW5jbHVkZSA8bGludXgvYWM5N19jb2RlYy5oPgojaW5jbHVkZSA8bGludXgvZ2FtZXBvcnQuaD4KI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgoKI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL3BhZ2UuaD4KI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CgojaWYgZGVmaW5lZChDT05GSUdfR0FNRVBPUlQpIHx8IChkZWZpbmVkKE1PRFVMRSkgJiYgZGVmaW5lZChDT05GSUdfR0FNRVBPUlRfTU9EVUxFKSkKI2RlZmluZSBTVVBQT1JUX0pPWVNUSUNLCiNlbmRpZgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgojdW5kZWYgT1NTX0RPQ1VNRU5URURfTUlYRVJfU0VNQU5USUNTCiNkZWZpbmUgRVMxMzcxX0RFQlVHCiNkZWZpbmUgREJHKHgpIHt9Ci8qI2RlZmluZSBEQkcoeCkge3h9Ki8KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0VOU09OSVEKI2RlZmluZSBQQ0lfVkVORE9SX0lEX0VOU09OSVEgICAgICAgIDB4MTI3NCAgICAKI2VuZGlmCgojaWZuZGVmIFBDSV9WRU5ET1JfSURfRUNUSVZBCiNkZWZpbmUgUENJX1ZFTkRPUl9JRF9FQ1RJVkEgICAgICAgICAweDExMDIKI2VuZGlmCgojaWZuZGVmIFBDSV9ERVZJQ0VfSURfRU5TT05JUV9FUzEzNzEKI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VOU09OSVFfRVMxMzcxIDB4MTM3MQojZW5kaWYKCiNpZm5kZWYgUENJX0RFVklDRV9JRF9FTlNPTklRX0NUNTg4MAojZGVmaW5lIFBDSV9ERVZJQ0VfSURfRU5TT05JUV9DVDU4ODAgMHg1ODgwCiNlbmRpZgoKI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0VDVElWQV9FVjE5MzgKI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VDVElWQV9FVjE5MzggMHg4OTM4CiNlbmRpZgoKLyogRVMxMzcxIGNoaXAgSUQgKi8KLyogVGhpcyBpcyBhIGxpdHRsZSBjb25mdXNpbmcgYmVjYXVzZSBhbGwgRVMxMzcxIGNvbXBhdGlibGUgY2hpcHMgaGF2ZSB0aGUKICAgc2FtZSBERVZJQ0VfSUQsIHRoZSBvbmx5IHRoaW5nIGRpZmZlcmVudGlhdGluZyB0aGVtIGlzIHRoZSBSRVZfSUQgZmllbGQuCiAgIFRoaXMgaXMgb25seSBzaWduaWZpY2FudCBpZiB5b3Ugd2FudCB0byBlbmFibGUgZmVhdHVyZXMgb24gdGhlIGxhdGVyIHBhcnRzLgogICBZZXMsIEkga25vdyBpdCdzIHN0dXBpZCBhbmQgd2h5IGRpZG4ndCB3ZSB1c2UgdGhlIHN1YiBJRHM/CiovCiNkZWZpbmUgRVMxMzcxUkVWX0VTMTM3M19BICAweDA0CiNkZWZpbmUgRVMxMzcxUkVWX0VTMTM3M19CICAweDA2CiNkZWZpbmUgRVMxMzcxUkVWX0NUNTg4MF9BICAweDA3CiNkZWZpbmUgQ1Q1ODgwUkVWX0NUNTg4MF9DICAweDAyCiNkZWZpbmUgQ1Q1ODgwUkVWX0NUNTg4MF9EICAweDAzCiNkZWZpbmUgRVMxMzcxUkVWX0VTMTM3MV9CICAweDA5CiNkZWZpbmUgRVYxOTM4UkVWX0VWMTkzOF9BICAweDAwCiNkZWZpbmUgRVMxMzcxUkVWX0VTMTM3M184ICAweDA4CgojZGVmaW5lIEVTMTM3MV9NQUdJQyAgKChQQ0lfVkVORE9SX0lEX0VOU09OSVE8PDE2KXxQQ0lfREVWSUNFX0lEX0VOU09OSVFfRVMxMzcxKQoKI2RlZmluZSBFUzEzNzFfRVhURU5UICAgICAgICAgICAgIDB4NDAKI2RlZmluZSBKT1lfRVhURU5UICAgICAgICAgICAgICAgIDgKCiNkZWZpbmUgRVMxMzcxX1JFR19DT05UUk9MICAgICAgICAweDAwCiNkZWZpbmUgRVMxMzcxX1JFR19TVEFUVVMgICAgICAgICAweDA0IC8qIG9uIHRoZSA1ODgwIGl0IGlzIGNvbnRyb2wvc3RhdHVzICovCiNkZWZpbmUgRVMxMzcxX1JFR19VQVJUX0RBVEEgICAgICAweDA4CiNkZWZpbmUgRVMxMzcxX1JFR19VQVJUX1NUQVRVUyAgICAweDA5CiNkZWZpbmUgRVMxMzcxX1JFR19VQVJUX0NPTlRST0wgICAweDA5CiNkZWZpbmUgRVMxMzcxX1JFR19VQVJUX1RFU1QgICAgICAweDBhCiNkZWZpbmUgRVMxMzcxX1JFR19NRU1QQUdFICAgICAgICAweDBjCiNkZWZpbmUgRVMxMzcxX1JFR19TUkNPTlYgICAgICAgICAweDEwCiNkZWZpbmUgRVMxMzcxX1JFR19DT0RFQyAgICAgICAgICAweDE0CiNkZWZpbmUgRVMxMzcxX1JFR19MRUdBQ1kgICAgICAgICAweDE4CiNkZWZpbmUgRVMxMzcxX1JFR19TRVJJQUxfQ09OVFJPTCAweDIwCiNkZWZpbmUgRVMxMzcxX1JFR19EQUMxX1NDT1VOVCAgICAweDI0CiNkZWZpbmUgRVMxMzcxX1JFR19EQUMyX1NDT1VOVCAgICAweDI4CiNkZWZpbmUgRVMxMzcxX1JFR19BRENfU0NPVU5UICAgICAweDJjCgojZGVmaW5lIEVTMTM3MV9SRUdfREFDMV9GUkFNRUFEUiAgMHhjMzAKI2RlZmluZSBFUzEzNzFfUkVHX0RBQzFfRlJBTUVDTlQgIDB4YzM0CiNkZWZpbmUgRVMxMzcxX1JFR19EQUMyX0ZSQU1FQURSICAweGMzOAojZGVmaW5lIEVTMTM3MV9SRUdfREFDMl9GUkFNRUNOVCAgMHhjM2MKI2RlZmluZSBFUzEzNzFfUkVHX0FEQ19GUkFNRUFEUiAgIDB4ZDMwCiNkZWZpbmUgRVMxMzcxX1JFR19BRENfRlJBTUVDTlQgICAweGQzNAoKI2RlZmluZSBFUzEzNzFfRk1UX1U4X01PTk8gICAgIDAKI2RlZmluZSBFUzEzNzFfRk1UX1U4X1NURVJFTyAgIDEKI2RlZmluZSBFUzEzNzFfRk1UX1MxNl9NT05PICAgIDIKI2RlZmluZSBFUzEzNzFfRk1UX1MxNl9TVEVSRU8gIDMKI2RlZmluZSBFUzEzNzFfRk1UX1NURVJFTyAgICAgIDEKI2RlZmluZSBFUzEzNzFfRk1UX1MxNiAgICAgICAgIDIKI2RlZmluZSBFUzEzNzFfRk1UX01BU0sgICAgICAgIDMKCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGVfc2l6ZVtdID0geyAxLCAyLCAyLCA0IH07CnN0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGVfc2hpZnRbXSA9IHsgMCwgMSwgMSwgMiB9OwoKI2RlZmluZSBDVFJMX1JFQ0VOX0IgICAgMHgwODAwMDAwMCAgLyogMSA9IGRvbid0IG1peCBhbmFsb2cgaW4gdG8gZGlnaXRhbCBvdXQgKi8KI2RlZmluZSBDVFJMX1NQRElGRU5fQiAgMHgwNDAwMDAwMAojZGVmaW5lIENUUkxfSk9ZX1NISUZUICAyNAojZGVmaW5lIENUUkxfSk9ZX01BU0sgICAzCiNkZWZpbmUgQ1RSTF9KT1lfMjAwICAgIDB4MDAwMDAwMDAgIC8qIGpveXN0aWNrIGJhc2UgYWRkcmVzcyAqLwojZGVmaW5lIENUUkxfSk9ZXzIwOCAgICAweDAxMDAwMDAwCiNkZWZpbmUgQ1RSTF9KT1lfMjEwICAgIDB4MDIwMDAwMDAKI2RlZmluZSBDVFJMX0pPWV8yMTggICAgMHgwMzAwMDAwMAojZGVmaW5lIENUUkxfR1BJT19JTjAgICAweDAwMTAwMDAwICAvKiBnZW5lcmFsIHB1cnBvc2UgaW5wdXRzL291dHB1dHMgKi8KI2RlZmluZSBDVFJMX0dQSU9fSU4xICAgMHgwMDIwMDAwMAojZGVmaW5lIENUUkxfR1BJT19JTjIgICAweDAwNDAwMDAwCiNkZWZpbmUgQ1RSTF9HUElPX0lOMyAgIDB4MDA4MDAwMDAKI2RlZmluZSBDVFJMX0dQSU9fT1VUMCAgMHgwMDAxMDAwMAojZGVmaW5lIENUUkxfR1BJT19PVVQxICAweDAwMDIwMDAwCiNkZWZpbmUgQ1RSTF9HUElPX09VVDIgIDB4MDAwNDAwMDAKI2RlZmluZSBDVFJMX0dQSU9fT1VUMyAgMHgwMDA4MDAwMAojZGVmaW5lIENUUkxfTVNGTVRTRUwgICAweDAwMDA4MDAwICAvKiBNUEVHIHNlcmlhbCBkYXRhIGZtdDogMCA9IFNvbnksIDEgPSBJMlMgKi8KI2RlZmluZSBDVFJMX1NZTkNSRVMgICAgMHgwMDAwNDAwMCAgLyogQUM5NyB3YXJtIHJlc2V0ICovCiNkZWZpbmUgQ1RSTF9BRENTVE9QICAgIDB4MDAwMDIwMDAgIC8qIHN0b3AgQURDIHRyYW5zZmVycyAqLwojZGVmaW5lIENUUkxfUFdSX0lOVFJNICAweDAwMDAxMDAwICAvKiAxID0gcG93ZXIgbGV2ZWwgaW50cyBlbmFibGVkICovCiNkZWZpbmUgQ1RSTF9NX0NCICAgICAgIDB4MDAwMDA4MDAgIC8qIHJlY29yZGluZyBzb3VyY2U6IDAgPSBBREMsIDEgPSBNUEVHICovCiNkZWZpbmUgQ1RSTF9DQ0JfSU5UUk0gIDB4MDAwMDA0MDAgIC8qIDEgPSBDQ0IgInZvaWNlIiBpbnRzIGVuYWJsZWQgKi8KI2RlZmluZSBDVFJMX1BETEVWMCAgICAgMHgwMDAwMDAwMCAgLyogcG93ZXIgZG93biBsZXZlbCAqLwojZGVmaW5lIENUUkxfUERMRVYxICAgICAweDAwMDAwMTAwCiNkZWZpbmUgQ1RSTF9QRExFVjIgICAgIDB4MDAwMDAyMDAKI2RlZmluZSBDVFJMX1BETEVWMyAgICAgMHgwMDAwMDMwMAojZGVmaW5lIENUUkxfQlJFUSAgICAgICAweDAwMDAwMDgwICAvKiAxID0gdGVzdCBtb2RlIChpbnRlcm5hbCBtZW0gdGVzdCkgKi8KI2RlZmluZSBDVFJMX0RBQzFfRU4gICAgMHgwMDAwMDA0MCAgLyogZW5hYmxlIERBQzEgKi8KI2RlZmluZSBDVFJMX0RBQzJfRU4gICAgMHgwMDAwMDAyMCAgLyogZW5hYmxlIERBQzIgKi8KI2RlZmluZSBDVFJMX0FEQ19FTiAgICAgMHgwMDAwMDAxMCAgLyogZW5hYmxlIEFEQyAqLwojZGVmaW5lIENUUkxfVUFSVF9FTiAgICAweDAwMDAwMDA4ICAvKiBlbmFibGUgTUlESSB1YXJ0ICovCiNkZWZpbmUgQ1RSTF9KWVNUS19FTiAgIDB4MDAwMDAwMDQgIC8qIGVuYWJsZSBKb3lzdGljayBwb3J0ICovCiNkZWZpbmUgQ1RSTF9YVEFMQ0xLRElTIDB4MDAwMDAwMDIgIC8qIDEgPSBkaXNhYmxlIGNyeXN0YWwgY2xvY2sgaW5wdXQgKi8KI2RlZmluZSBDVFJMX1BDSUNMS0RJUyAgMHgwMDAwMDAwMSAgLyogMSA9IGRpc2FibGUgUENJIGNsb2NrIGRpc3RyaWJ1dGlvbiAqLwoKCiNkZWZpbmUgU1RBVF9JTlRSICAgICAgIDB4ODAwMDAwMDAgIC8qIHdpcmVkIG9yIG9mIGFsbCBpbnRlcnJ1cHQgYml0cyAqLwojZGVmaW5lIENTVEFUXzU4ODBfQUM5N19SU1QgMHgyMDAwMDAwMCAvKiBDVDU4ODAgUmVzZXQgYml0ICovCiNkZWZpbmUgU1RBVF9FTl9TUERJRiAgIDB4MDAwNDAwMDAgIC8qIGVuYWJsZSBTL1BESUYgY2lyY3VpdHJ5ICovCiNkZWZpbmUgU1RBVF9UU19TUERJRiAgIDB4MDAwMjAwMDAgIC8qIHRlc3QgUy9QRElGIGNpcmN1aXRyeSAqLwojZGVmaW5lIFNUQVRfVEVTVE1PREUgICAweDAwMDEwMDAwICAvKiB0ZXN0IEFTSUMgKi8KI2RlZmluZSBTVEFUX1NZTkNfRVJSICAgMHgwMDAwMDEwMCAgLyogMSA9IGNvZGVjIHN5bmMgZXJyb3IgKi8KI2RlZmluZSBTVEFUX1ZDICAgICAgICAgMHgwMDAwMDBjMCAgLyogQ0NCIGludCBzb3VyY2UsIDA9REFDMSwgMT1EQUMyLCAyPUFEQywgMz11bmRlZiAqLwojZGVmaW5lIFNUQVRfU0hfVkMgICAgICA2CiNkZWZpbmUgU1RBVF9NUFdSICAgICAgIDB4MDAwMDAwMjAgIC8qIHBvd2VyIGxldmVsIGludGVycnVwdCAqLwojZGVmaW5lIFNUQVRfTUNDQiAgICAgICAweDAwMDAwMDEwICAvKiBDQ0IgaW50IHBlbmRpbmcgKi8KI2RlZmluZSBTVEFUX1VBUlQgICAgICAgMHgwMDAwMDAwOCAgLyogVUFSVCBpbnQgcGVuZGluZyAqLwojZGVmaW5lIFNUQVRfREFDMSAgICAgICAweDAwMDAwMDA0ICAvKiBEQUMxIGludCBwZW5kaW5nICovCiNkZWZpbmUgU1RBVF9EQUMyICAgICAgIDB4MDAwMDAwMDIgIC8qIERBQzIgaW50IHBlbmRpbmcgKi8KI2RlZmluZSBTVEFUX0FEQyAgICAgICAgMHgwMDAwMDAwMSAgLyogQURDIGludCBwZW5kaW5nICovCgojZGVmaW5lIFVTVEFUX1JYSU5UICAgICAweDgwICAgICAgICAvKiBVQVJUIHJ4IGludCBwZW5kaW5nICovCiNkZWZpbmUgVVNUQVRfVFhJTlQgICAgIDB4MDQgICAgICAgIC8qIFVBUlQgdHggaW50IHBlbmRpbmcgKi8KI2RlZmluZSBVU1RBVF9UWFJEWSAgICAgMHgwMiAgICAgICAgLyogVUFSVCB0eCByZWFkeSAqLwojZGVmaW5lIFVTVEFUX1JYUkRZICAgICAweDAxICAgICAgICAvKiBVQVJUIHJ4IHJlYWR5ICovCgojZGVmaW5lIFVDVFJMX1JYSU5URU4gICAweDgwICAgICAgICAvKiAxID0gZW5hYmxlIFJYIGludHMgKi8KI2RlZmluZSBVQ1RSTF9UWElOVEVOICAgMHg2MCAgICAgICAgLyogVFggaW50IGVuYWJsZSBmaWVsZCBtYXNrICovCiNkZWZpbmUgVUNUUkxfRU5BX1RYSU5UIDB4MjAgICAgICAgIC8qIGVuYWJsZSBUWCBpbnQgKi8KI2RlZmluZSBVQ1RSTF9DTlRSTCAgICAgMHgwMyAgICAgICAgLyogY29udHJvbCBmaWVsZCAqLwojZGVmaW5lIFVDVFJMX0NOVFJMX1NXUiAweDAzICAgICAgICAvKiBzb2Z0d2FyZSByZXNldCBjb21tYW5kICovCgovKiBzYW1wbGUgcmF0ZSBjb252ZXJ0ZXIgKi8KI2RlZmluZSBTUkNfT0tTVEFURSAgICAgICAgMQoKI2RlZmluZSBTUkNfUkFNQUREUl9NQVNLICAgMHhmZTAwMDAwMAojZGVmaW5lIFNSQ19SQU1BRERSX1NISUZUICAyNQojZGVmaW5lIFNSQ19EQUMxRlJFRVpFICAgICAoMVVMIDw8IDIxKQojZGVmaW5lIFNSQ19EQUMyRlJFRVpFICAgICAgKDFVTCA8PCAyMCkKI2RlZmluZSBTUkNfQURDRlJFRVpFICAgICAgKDFVTCA8PCAxOSkKCgojZGVmaW5lIFNSQ19XRSAgICAgICAgICAgICAweDAxMDAwMDAwICAvKiByZWFkL3dyaXRlIGNvbnRyb2wgZm9yIFNSQyBSQU0gKi8KI2RlZmluZSBTUkNfQlVTWSAgICAgICAgICAgMHgwMDgwMDAwMCAgLyogU1JDIGJ1c3kgKi8KI2RlZmluZSBTUkNfRElTICAgICAgICAgICAgMHgwMDQwMDAwMCAgLyogMSA9IGRpc2FibGUgU1JDICovCiNkZWZpbmUgU1JDX0REQUMxICAgICAgICAgIDB4MDAyMDAwMDAgIC8qIDEgPSBkaXNhYmxlIGFjY3VtIHVwZGF0ZSBmb3IgREFDMSAqLwojZGVmaW5lIFNSQ19EREFDMiAgICAgICAgICAweDAwMTAwMDAwICAvKiAxID0gZGlzYWJsZSBhY2N1bSB1cGRhdGUgZm9yIERBQzIgKi8KI2RlZmluZSBTUkNfREFEQyAgICAgICAgICAgMHgwMDA4MDAwMCAgLyogMSA9IGRpc2FibGUgYWNjdW0gdXBkYXRlIGZvciBBREMyICovCiNkZWZpbmUgU1JDX0NUTE1BU0sgICAgICAgIDB4MDA3ODAwMDAKI2RlZmluZSBTUkNfUkFNREFUQV9NQVNLICAgMHgwMDAwZmZmZgojZGVmaW5lIFNSQ19SQU1EQVRBX1NISUZUICAwCgojZGVmaW5lIFNSQ1JFR19BREMgICAgICAweDc4CiNkZWZpbmUgU1JDUkVHX0RBQzEgICAgIDB4NzAKI2RlZmluZSBTUkNSRUdfREFDMiAgICAgMHg3NAojZGVmaW5lIFNSQ1JFR19WT0xfQURDICAweDZjCiNkZWZpbmUgU1JDUkVHX1ZPTF9EQUMxIDB4N2MKI2RlZmluZSBTUkNSRUdfVk9MX0RBQzIgMHg3ZQoKI2RlZmluZSBTUkNSRUdfVFJVTkNfTiAgICAgMHgwMAojZGVmaW5lIFNSQ1JFR19JTlRfUkVHUyAgICAweDAxCiNkZWZpbmUgU1JDUkVHX0FDQ1VNX0ZSQUMgIDB4MDIKI2RlZmluZSBTUkNSRUdfVkZSRVFfRlJBQyAgMHgwMwoKI2RlZmluZSBDT0RFQ19QSVJEICAgICAgICAweDAwODAwMDAwICAvKiAwID0gd3JpdGUgQUM5NyByZWdpc3RlciAqLwojZGVmaW5lIENPREVDX1BJQUREX01BU0sgIDB4MDA3ZjAwMDAKI2RlZmluZSBDT0RFQ19QSUFERF9TSElGVCAxNgojZGVmaW5lIENPREVDX1BJREFUX01BU0sgIDB4MDAwMGZmZmYKI2RlZmluZSBDT0RFQ19QSURBVF9TSElGVCAwCgojZGVmaW5lIENPREVDX1JEWSAgICAgICAgIDB4ODAwMDAwMDAgIC8qIEFDOTcgcmVhZCBkYXRhIHZhbGlkICovCiNkZWZpbmUgQ09ERUNfV0lQICAgICAgICAgMHg0MDAwMDAwMCAgLyogQUM5NyB3cml0ZSBpbiBwcm9ncmVzcyAqLwojZGVmaW5lIENPREVDX1BPUkQgICAgICAgIDB4MDA4MDAwMDAgIC8qIDAgPSB3cml0ZSBBQzk3IHJlZ2lzdGVyICovCiNkZWZpbmUgQ09ERUNfUE9BRERfTUFTSyAgMHgwMDdmMDAwMAojZGVmaW5lIENPREVDX1BPQUREX1NISUZUIDE2CiNkZWZpbmUgQ09ERUNfUE9EQVRfTUFTSyAgMHgwMDAwZmZmZgojZGVmaW5lIENPREVDX1BPREFUX1NISUZUIDAKCgojZGVmaW5lIExFR0FDWV9KRkFTVCAgICAgIDB4ODAwMDAwMDAgIC8qIGZhc3Qgam95c3RpY2sgdGltaW5nICovCiNkZWZpbmUgTEVHQUNZX0ZJUlEgICAgICAgMHgwMTAwMDAwMCAgLyogZm9yY2UgSVJRICovCgojZGVmaW5lIFNDVFJMX0RBQ1RFU1QgICAgIDB4MDA0MDAwMDAgIC8qIDEgPSBEQUMgdGVzdCwgdGVzdCB2ZWN0b3IgZ2VuZXJhdGlvbiBwdXJwb3NlcyAqLwojZGVmaW5lIFNDVFJMX1AyRU5ESU5DICAgIDB4MDAzODAwMDAgIC8qICAqLwojZGVmaW5lIFNDVFJMX1NIX1AyRU5ESU5DIDE5CiNkZWZpbmUgU0NUUkxfUDJTVElOQyAgICAgMHgwMDA3MDAwMCAgLyogICovCiNkZWZpbmUgU0NUUkxfU0hfUDJTVElOQyAgMTYKI2RlZmluZSBTQ1RSTF9SMUxPT1BTRUwgICAweDAwMDA4MDAwICAvKiAwID0gbG9vcCBtb2RlICovCiNkZWZpbmUgU0NUUkxfUDJMT09QU0VMICAgMHgwMDAwNDAwMCAgLyogMCA9IGxvb3AgbW9kZSAqLwojZGVmaW5lIFNDVFJMX1AxTE9PUFNFTCAgIDB4MDAwMDIwMDAgIC8qIDAgPSBsb29wIG1vZGUgKi8KI2RlZmluZSBTQ1RSTF9QMlBBVVNFICAgICAweDAwMDAxMDAwICAvKiAxID0gcGF1c2UgbW9kZSAqLwojZGVmaW5lIFNDVFJMX1AxUEFVU0UgICAgIDB4MDAwMDA4MDAgIC8qIDEgPSBwYXVzZSBtb2RlICovCiNkZWZpbmUgU0NUUkxfUjFJTlRFTiAgICAgMHgwMDAwMDQwMCAgLyogZW5hYmxlIGludGVycnVwdCAqLwojZGVmaW5lIFNDVFJMX1AySU5URU4gICAgIDB4MDAwMDAyMDAgIC8qIGVuYWJsZSBpbnRlcnJ1cHQgKi8KI2RlZmluZSBTQ1RSTF9QMUlOVEVOICAgICAweDAwMDAwMTAwICAvKiBlbmFibGUgaW50ZXJydXB0ICovCiNkZWZpbmUgU0NUUkxfUDFTQ1RSTEQgICAgMHgwMDAwMDA4MCAgLyogcmVsb2FkIHNhbXBsZSBjb3VudCByZWdpc3RlciBmb3IgREFDMSAqLwojZGVmaW5lIFNDVFJMX1AyREFDU0VOICAgIDB4MDAwMDAwNDAgIC8qIDEgPSBEQUMyIHBsYXkgYmFjayBsYXN0IHNhbXBsZSB3aGVuIGRpc2FibGVkICovCiNkZWZpbmUgU0NUUkxfUjFTRUIgICAgICAgMHgwMDAwMDAyMCAgLyogMSA9IDE2Yml0ICovCiNkZWZpbmUgU0NUUkxfUjFTTUIgICAgICAgMHgwMDAwMDAxMCAgLyogMSA9IHN0ZXJlbyAqLwojZGVmaW5lIFNDVFJMX1IxRk1UICAgICAgIDB4MDAwMDAwMzAgIC8qIGZvcm1hdCBtYXNrICovCiNkZWZpbmUgU0NUUkxfU0hfUjFGTVQgICAgNAojZGVmaW5lIFNDVFJMX1AyU0VCICAgICAgIDB4MDAwMDAwMDggIC8qIDEgPSAxNmJpdCAqLwojZGVmaW5lIFNDVFJMX1AyU01CICAgICAgIDB4MDAwMDAwMDQgIC8qIDEgPSBzdGVyZW8gKi8KI2RlZmluZSBTQ1RSTF9QMkZNVCAgICAgICAweDAwMDAwMDBjICAvKiBmb3JtYXQgbWFzayAqLwojZGVmaW5lIFNDVFJMX1NIX1AyRk1UICAgIDIKI2RlZmluZSBTQ1RSTF9QMVNFQiAgICAgICAweDAwMDAwMDAyICAvKiAxID0gMTZiaXQgKi8KI2RlZmluZSBTQ1RSTF9QMVNNQiAgICAgICAweDAwMDAwMDAxICAvKiAxID0gc3RlcmVvICovCiNkZWZpbmUgU0NUUkxfUDFGTVQgICAgICAgMHgwMDAwMDAwMyAgLyogZm9ybWF0IG1hc2sgKi8KI2RlZmluZSBTQ1RSTF9TSF9QMUZNVCAgICAwCgoKLyogbWlzYyBzdHVmZiAqLwojZGVmaW5lIFBPTExfQ09VTlQgICAweDEwMDAKI2RlZmluZSBGTU9ERV9EQUMgICAgICAgICA0ICAgICAgICAgICAvKiBzbGlnaHQgbWlzdXNlIG9mIG1vZGVfdCAqLwoKLyogTUlESSBidWZmZXIgc2l6ZXMgKi8KCiNkZWZpbmUgTUlESUlOQlVGICAyNTYKI2RlZmluZSBNSURJT1VUQlVGIDI1NgoKI2RlZmluZSBGTU9ERV9NSURJX1NISUZUIDMKI2RlZmluZSBGTU9ERV9NSURJX1JFQUQgIChGTU9ERV9SRUFEIDw8IEZNT0RFX01JRElfU0hJRlQpCiNkZWZpbmUgRk1PREVfTUlESV9XUklURSAoRk1PREVfV1JJVEUgPDwgRk1PREVfTUlESV9TSElGVCkKCiNkZWZpbmUgRVMxMzcxX01PRFVMRV9OQU1FICJlczEzNzEiCiNkZWZpbmUgUEZYIEVTMTM3MV9NT0RVTEVfTkFNRSAiOiAiCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnN0cnVjdCBlczEzNzFfc3RhdGUgewoJLyogbWFnaWMgKi8KCXVuc2lnbmVkIGludCBtYWdpYzsKCgkvKiBsaXN0IG9mIGVzMTM3MSBkZXZpY2VzICovCglzdHJ1Y3QgbGlzdF9oZWFkIGRldnM7CgoJLyogdGhlIGNvcnJlc3BvbmRpbmcgcGNpX2RldiBzdHJ1Y3R1cmUgKi8KCXN0cnVjdCBwY2lfZGV2ICpkZXY7CgoJLyogc291bmRjb3JlIHN0dWZmICovCglpbnQgZGV2X2F1ZGlvOwoJaW50IGRldl9kYWM7CglpbnQgZGV2X21pZGk7CgkKCS8qIGhhcmR3YXJlIHJlc291cmNlcyAqLwoJdW5zaWduZWQgbG9uZyBpbzsgLyogbG9uZyBmb3IgU1BBUkMgKi8KCXVuc2lnbmVkIGludCBpcnE7CgoJLyogUENJIElEJ3MgKi8KCXUxNiB2ZW5kb3I7Cgl1MTYgZGV2aWNlOwogICAgICAgIHU4IHJldjsgLyogdGhlIGNoaXAgcmV2aXNpb24gKi8KCgkvKiBvcHRpb25zICovCglpbnQgc3BkaWZfdm9sdW1lOyAvKiBTL1BESUYgb3V0cHV0IGlzIGVuYWJsZWQgaWYgIT0gLTEgKi8KCiNpZmRlZiBFUzEzNzFfREVCVUcKICAgICAgICAvKiBkZWJ1ZyAvcHJvYyBlbnRyeSAqLwoJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwczsKI2VuZGlmIC8qIEVTMTM3MV9ERUJVRyAqLwoKCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYzsKCgkvKiB3YXZlIHN0dWZmICovCgl1bnNpZ25lZCBjdHJsOwoJdW5zaWduZWQgc2N0cmw7Cgl1bnNpZ25lZCBkYWMxcmF0ZSwgZGFjMnJhdGUsIGFkY3JhdGU7CgoJc3BpbmxvY2tfdCBsb2NrOwoJc3RydWN0IG11dGV4IG9wZW5fbXV0ZXg7Cgltb2RlX3Qgb3Blbl9tb2RlOwoJd2FpdF9xdWV1ZV9oZWFkX3Qgb3Blbl93YWl0OwoKCXN0cnVjdCBkbWFidWYgewoJCXZvaWQgKnJhd2J1ZjsKCQlkbWFfYWRkcl90IGRtYWFkZHI7CgkJdW5zaWduZWQgYnVmb3JkZXI7CgkJdW5zaWduZWQgbnVtZnJhZzsKCQl1bnNpZ25lZCBmcmFnc2hpZnQ7CgkJdW5zaWduZWQgaHdwdHIsIHN3cHRyOwoJCXVuc2lnbmVkIHRvdGFsX2J5dGVzOwoJCWludCBjb3VudDsKCQl1bnNpZ25lZCBlcnJvcjsgLyogb3Zlci91bmRlcnJ1biAqLwoJCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CgkJLyogcmVkdW5kYW50LCBidXQgbWFrZXMgY2FsY3VsYXRpb25zIGVhc2llciAqLwoJCXVuc2lnbmVkIGZyYWdzaXplOwoJCXVuc2lnbmVkIGRtYXNpemU7CgkJdW5zaWduZWQgZnJhZ3NhbXBsZXM7CgkJLyogT1NTIHN0dWZmICovCgkJdW5zaWduZWQgbWFwcGVkOjE7CgkJdW5zaWduZWQgcmVhZHk6MTsKCQl1bnNpZ25lZCBlbmRjbGVhcmVkOjE7CgkJdW5zaWduZWQgZW5hYmxlZDoxOwoJCXVuc2lnbmVkIG9zc2ZyYWdzaGlmdDsKCQlpbnQgb3NzbWF4ZnJhZ3M7CgkJdW5zaWduZWQgc3ViZGl2aXNpb247Cgl9IGRtYV9kYWMxLCBkbWFfZGFjMiwgZG1hX2FkYzsKCgkvKiBtaWRpIHN0dWZmICovCglzdHJ1Y3QgewoJCXVuc2lnbmVkIGlyZCwgaXdyLCBpY250OwoJCXVuc2lnbmVkIG9yZCwgb3dyLCBvY250OwoJCXdhaXRfcXVldWVfaGVhZF90IGl3YWl0OwoJCXdhaXRfcXVldWVfaGVhZF90IG93YWl0OwoJCXVuc2lnbmVkIGNoYXIgaWJ1ZltNSURJSU5CVUZdOwoJCXVuc2lnbmVkIGNoYXIgb2J1ZltNSURJT1VUQlVGXTsKCX0gbWlkaTsKCiNpZmRlZiBTVVBQT1JUX0pPWVNUSUNLCglzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0OwojZW5kaWYKCglzdHJ1Y3QgbXV0ZXggc2VtOwp9OwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgTElTVF9IRUFEKGRldnMpOwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxkMih1bnNpZ25lZCBpbnQgeCkKewoJdW5zaWduZWQgciA9IDA7CgkKCWlmICh4ID49IDB4MTAwMDApIHsKCQl4ID4+PSAxNjsKCQlyICs9IDE2OwoJfQoJaWYgKHggPj0gMHgxMDApIHsKCQl4ID4+PSA4OwoJCXIgKz0gODsKCX0KCWlmICh4ID49IDB4MTApIHsKCQl4ID4+PSA0OwoJCXIgKz0gNDsKCX0KCWlmICh4ID49IDQpIHsKCQl4ID4+PSAyOwoJCXIgKz0gMjsKCX0KCWlmICh4ID49IDIpCgkJcisrOwoJcmV0dXJuIHI7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIHVuc2lnbmVkIHdhaXRfc3JjX3JlYWR5KHN0cnVjdCBlczEzNzFfc3RhdGUgKnMpCnsKCXVuc2lnbmVkIGludCB0LCByOwoKCWZvciAodCA9IDA7IHQgPCBQT0xMX0NPVU5UOyB0KyspIHsKCQlpZiAoISgociA9IGlubChzLT5pbyArIEVTMTM3MV9SRUdfU1JDT05WKSkgJiBTUkNfQlVTWSkpCgkJCXJldHVybiByOwoJCXVkZWxheSgxKTsKCX0KCXByaW50ayhLRVJOX0RFQlVHIFBGWCAic2FtcGxlIHJhdGUgY29udmVydGVyIHRpbWVvdXQgciA9IDB4JTA4eFxuIiwgcik7CglyZXR1cm4gcjsKfQoKc3RhdGljIHVuc2lnbmVkIHNyY19yZWFkKHN0cnVjdCBlczEzNzFfc3RhdGUgKnMsIHVuc2lnbmVkIHJlZykKewogICAgICAgIHVuc2lnbmVkIGludCB0ZW1wLGksb3JpZzsKCiAgICAgICAgLyogd2FpdCBmb3IgcmVhZHkgKi8KICAgICAgICB0ZW1wID0gd2FpdF9zcmNfcmVhZHkgKHMpOwoKICAgICAgICAvKiB3ZSBjYW4gb25seSBhY2Nlc3MgdGhlIFNSQyBhdCBjZXJ0YWluIHRpbWVzLCBtYWtlIHN1cmUKICAgICAgICAgICB3ZSdyZSBhbGxvd2VkIHRvIGJlZm9yZSB3ZSByZWFkICovCiAgICAgICAgICAgCiAgICAgICAgb3JpZyA9IHRlbXA7CiAgICAgICAgLyogZXhwb3NlIHRoZSBTUkMgc3RhdGUgYml0cyAqLwogICAgICAgIG91dGwgKCAodGVtcCAmIFNSQ19DVExNQVNLKSB8IChyZWcgPDwgU1JDX1JBTUFERFJfU0hJRlQpIHwgMHgxMDAwMFVMLAogICAgICAgICAgICAgICBzLT5pbyArIEVTMTM3MV9SRUdfU1JDT05WKTsKCiAgICAgICAgLyogbm93LCB3YWl0IGZvciBidXN5IGFuZCB0aGUgY29ycmVjdCB0aW1lIHRvIHJlYWQgKi8KICAgICAgICB0ZW1wID0gd2FpdF9zcmNfcmVhZHkgKHMpOwoKICAgICAgICBpZiAoICh0ZW1wICYgMHgwMDg3MDAwMFVMICkgIT0gKCBTUkNfT0tTVEFURSA8PCAxNiApKXsKICAgICAgICAgICAgICAgIC8qIHdhaXQgZm9yIHRoZSByaWdodCBzdGF0ZSAqLwogICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8UE9MTF9DT1VOVDsgaSsrKXsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IGlubCAocy0+aW8gKyBFUzEzNzFfUkVHX1NSQ09OVik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHRlbXAgJiAweDAwODcwMDAwVUwgKSA9PSAoIFNSQ19PS1NUQVRFIDw8IDE2ICkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBoaWRlIHRoZSBzdGF0ZSBiaXRzICovCiAgICAgICAgb3V0bCAoKG9yaWcgJiBTUkNfQ1RMTUFTSykgfCAocmVnIDw8IFNSQ19SQU1BRERSX1NISUZUKSwgcy0+aW8gKyBFUzEzNzFfUkVHX1NSQ09OVik7CiAgICAgICAgcmV0dXJuIHRlbXA7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgCn0KCnN0YXRpYyB2b2lkIHNyY193cml0ZShzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzLCB1bnNpZ25lZCByZWcsIHVuc2lnbmVkIGRhdGEpCnsKICAgICAgCgl1bnNpZ25lZCBpbnQgcjsKCglyID0gd2FpdF9zcmNfcmVhZHkocykgJiAoU1JDX0RJUyB8IFNSQ19EREFDMSB8IFNSQ19EREFDMiB8IFNSQ19EQURDKTsKCXIgfD0gKHJlZyA8PCBTUkNfUkFNQUREUl9TSElGVCkgJiBTUkNfUkFNQUREUl9NQVNLOwoJciB8PSAoZGF0YSA8PCBTUkNfUkFNREFUQV9TSElGVCkgJiBTUkNfUkFNREFUQV9NQVNLOwoJb3V0bChyIHwgU1JDX1dFLCBzLT5pbyArIEVTMTM3MV9SRUdfU1JDT05WKTsKCn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyogbW9zdCBvZiB0aGUgZm9sbG93aW5nIGhlcmUgaXMgYmxhY2sgbWFnaWMgKi8Kc3RhdGljIHZvaWQgc2V0X2FkY19yYXRlKHN0cnVjdCBlczEzNzFfc3RhdGUgKnMsIHVuc2lnbmVkIHJhdGUpCnsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cgl1bnNpZ25lZCBpbnQgbiwgdHJ1bmNtLCBmcmVxOwoKCWlmIChyYXRlID4gNDgwMDApCgkJcmF0ZSA9IDQ4MDAwOwoJaWYgKHJhdGUgPCA0MDAwKQoJCXJhdGUgPSA0MDAwOwoJbiA9IHJhdGUgLyAzMDAwOwoJaWYgKCgxIDw8IG4pICYgKCgxIDw8IDE1KSB8ICgxIDw8IDEzKSB8ICgxIDw8IDExKSB8ICgxIDw8IDkpKSkKCQluLS07Cgl0cnVuY20gPSAoMjEgKiBuIC0gMSkgfCAxOwogICAgICAgIGZyZXEgPSAoKDQ4MDAwVUwgPDwgMTUpIC8gcmF0ZSkgKiBuOwoJcy0+YWRjcmF0ZSA9ICg0ODAwMFVMIDw8IDE1KSAvIChmcmVxIC8gbik7CglzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOwoJaWYgKHJhdGUgPj0gMjQwMDApIHsKCQlpZiAodHJ1bmNtID4gMjM5KQoJCQl0cnVuY20gPSAyMzk7CgkJc3JjX3dyaXRlKHMsIFNSQ1JFR19BREMrU1JDUkVHX1RSVU5DX04sIAoJCQkgICgoKDIzOSAtIHRydW5jbSkgPj4gMSkgPDwgOSkgfCAobiA8PCA0KSk7Cgl9IGVsc2UgewoJCWlmICh0cnVuY20gPiAxMTkpCgkJCXRydW5jbSA9IDExOTsKCQlzcmNfd3JpdGUocywgU1JDUkVHX0FEQytTUkNSRUdfVFJVTkNfTiwgCgkJCSAgMHg4MDAwIHwgKCgoMTE5IC0gdHJ1bmNtKSA+PiAxKSA8PCA5KSB8IChuIDw8IDQpKTsKCX0JCQoJc3JjX3dyaXRlKHMsIFNSQ1JFR19BREMrU1JDUkVHX0lOVF9SRUdTLCAKCQkgIChzcmNfcmVhZChzLCBTUkNSRUdfQURDK1NSQ1JFR19JTlRfUkVHUykgJiAweDAwZmYpIHwKCQkgICgoZnJlcSA+PiA1KSAmIDB4ZmMwMCkpOwoJc3JjX3dyaXRlKHMsIFNSQ1JFR19BREMrU1JDUkVHX1ZGUkVRX0ZSQUMsIGZyZXEgJiAweDdmZmYpOwoJc3JjX3dyaXRlKHMsIFNSQ1JFR19WT0xfQURDLCBuIDw8IDgpOwoJc3JjX3dyaXRlKHMsIFNSQ1JFR19WT0xfQURDKzEsIG4gPDwgOCk7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cn0KCgpzdGF0aWMgdm9pZCBzZXRfZGFjMV9yYXRlKHN0cnVjdCBlczEzNzFfc3RhdGUgKnMsIHVuc2lnbmVkIHJhdGUpCnsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cgl1bnNpZ25lZCBpbnQgZnJlcSwgcjsKCglpZiAocmF0ZSA+IDQ4MDAwKQoJCXJhdGUgPSA0ODAwMDsKCWlmIChyYXRlIDwgNDAwMCkKCQlyYXRlID0gNDAwMDsKICAgICAgICBmcmVxID0gKChyYXRlIDw8IDE1KSArIDE1MDApIC8gMzAwMDsKCXMtPmRhYzFyYXRlID0gKGZyZXEgKiAzMDAwICsgMTYzODQpID4+IDE1OwoJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKCXIgPSAod2FpdF9zcmNfcmVhZHkocykgJiAoU1JDX0RJUyB8IFNSQ19EREFDMiB8IFNSQ19EQURDKSkgfCBTUkNfRERBQzE7CglvdXRsKHIsIHMtPmlvICsgRVMxMzcxX1JFR19TUkNPTlYpOwoJc3JjX3dyaXRlKHMsIFNSQ1JFR19EQUMxK1NSQ1JFR19JTlRfUkVHUywgCgkJICAoc3JjX3JlYWQocywgU1JDUkVHX0RBQzErU1JDUkVHX0lOVF9SRUdTKSAmIDB4MDBmZikgfAoJCSAgKChmcmVxID4+IDUpICYgMHhmYzAwKSk7CglzcmNfd3JpdGUocywgU1JDUkVHX0RBQzErU1JDUkVHX1ZGUkVRX0ZSQUMsIGZyZXEgJiAweDdmZmYpOwoJciA9ICh3YWl0X3NyY19yZWFkeShzKSAmIChTUkNfRElTIHwgU1JDX0REQUMyIHwgU1JDX0RBREMpKTsKCW91dGwociwgcy0+aW8gKyBFUzEzNzFfUkVHX1NSQ09OVik7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cn0KCnN0YXRpYyB2b2lkIHNldF9kYWMyX3JhdGUoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcywgdW5zaWduZWQgcmF0ZSkKewoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXVuc2lnbmVkIGludCBmcmVxLCByOwoKCWlmIChyYXRlID4gNDgwMDApCgkJcmF0ZSA9IDQ4MDAwOwoJaWYgKHJhdGUgPCA0MDAwKQoJCXJhdGUgPSA0MDAwOwogICAgICAgIGZyZXEgPSAoKHJhdGUgPDwgMTUpICsgMTUwMCkgLyAzMDAwOwoJcy0+ZGFjMnJhdGUgPSAoZnJlcSAqIDMwMDAgKyAxNjM4NCkgPj4gMTU7CglzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOwoJciA9ICh3YWl0X3NyY19yZWFkeShzKSAmIChTUkNfRElTIHwgU1JDX0REQUMxIHwgU1JDX0RBREMpKSB8IFNSQ19EREFDMjsKCW91dGwociwgcy0+aW8gKyBFUzEzNzFfUkVHX1NSQ09OVik7CglzcmNfd3JpdGUocywgU1JDUkVHX0RBQzIrU1JDUkVHX0lOVF9SRUdTLCAKCQkgIChzcmNfcmVhZChzLCBTUkNSRUdfREFDMitTUkNSRUdfSU5UX1JFR1MpICYgMHgwMGZmKSB8CgkJICAoKGZyZXEgPj4gNSkgJiAweGZjMDApKTsKCXNyY193cml0ZShzLCBTUkNSRUdfREFDMitTUkNSRUdfVkZSRVFfRlJBQywgZnJlcSAmIDB4N2ZmZik7CglyID0gKHdhaXRfc3JjX3JlYWR5KHMpICYgKFNSQ19ESVMgfCBTUkNfRERBQzEgfCBTUkNfREFEQykpOwoJb3V0bChyLCBzLT5pbyArIEVTMTM3MV9SRUdfU1JDT05WKTsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgdm9pZCBfX2RldmluaXQgc3JjX2luaXQoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcykKewogICAgICAgIHVuc2lnbmVkIGludCBpOwoKICAgICAgICAvKiBiZWZvcmUgd2UgZW5hYmxlIG9yIGRpc2FibGUgdGhlIFNSQyB3ZSBuZWVkCiAgICAgICAgICAgdG8gd2FpdCBmb3IgaXQgdG8gYmVjb21lIHJlYWR5ICovCiAgICAgICAgd2FpdF9zcmNfcmVhZHkocyk7CgogICAgICAgIG91dGwoU1JDX0RJUywgcy0+aW8gKyBFUzEzNzFfUkVHX1NSQ09OVik7CgogICAgICAgIGZvciAoaSA9IDA7IGkgPCAweDgwOyBpKyspCiAgICAgICAgICAgICAgICBzcmNfd3JpdGUocywgaSwgMCk7CgogICAgICAgIHNyY193cml0ZShzLCBTUkNSRUdfREFDMStTUkNSRUdfVFJVTkNfTiwgMTYgPDwgNCk7CiAgICAgICAgc3JjX3dyaXRlKHMsIFNSQ1JFR19EQUMxK1NSQ1JFR19JTlRfUkVHUywgMTYgPDwgMTApOwogICAgICAgIHNyY193cml0ZShzLCBTUkNSRUdfREFDMitTUkNSRUdfVFJVTkNfTiwgMTYgPDwgNCk7CiAgICAgICAgc3JjX3dyaXRlKHMsIFNSQ1JFR19EQUMyK1NSQ1JFR19JTlRfUkVHUywgMTYgPDwgMTApOwogICAgICAgIHNyY193cml0ZShzLCBTUkNSRUdfVk9MX0FEQywgMSA8PCAxMik7CiAgICAgICAgc3JjX3dyaXRlKHMsIFNSQ1JFR19WT0xfQURDKzEsIDEgPDwgMTIpOwogICAgICAgIHNyY193cml0ZShzLCBTUkNSRUdfVk9MX0RBQzEsIDEgPDwgMTIpOwogICAgICAgIHNyY193cml0ZShzLCBTUkNSRUdfVk9MX0RBQzErMSwgMSA8PCAxMik7CiAgICAgICAgc3JjX3dyaXRlKHMsIFNSQ1JFR19WT0xfREFDMiwgMSA8PCAxMik7CiAgICAgICAgc3JjX3dyaXRlKHMsIFNSQ1JFR19WT0xfREFDMisxLCAxIDw8IDEyKTsKICAgICAgICBzZXRfYWRjX3JhdGUocywgMjIwNTApOwogICAgICAgIHNldF9kYWMxX3JhdGUocywgMjIwNTApOwogICAgICAgIHNldF9kYWMyX3JhdGUocywgMjIwNTApOwoKICAgICAgICAvKiBXQVJOSU5HOgogICAgICAgICAqIGVuYWJsaW5nIHRoZSBzYW1wbGUgcmF0ZSBjb252ZXJ0ZXIgd2l0aG91dCBwcm9wZXJseSBwcm9ncmFtbWluZwogICAgICAgICAqIGl0cyBwYXJhbWV0ZXJzIGNhdXNlcyB0aGUgY2hpcCB0byBsb2NrIHVwICh0aGUgU1JDIGJ1c3kgYml0IHdpbGwKICAgICAgICAgKiBiZSBzdHVjayBoaWdoLCBhbmQgSSd2ZSBmb3VuZCBubyB3YXkgdG8gcmVjdGlmeSB0aGlzIG90aGVyIHRoYW4KICAgICAgICAgKiBwb3dlciBjeWNsZSkKICAgICAgICAgKi8KICAgICAgICB3YWl0X3NyY19yZWFkeShzKTsKICAgICAgICBvdXRsKDAsIHMtPmlvK0VTMTM3MV9SRUdfU1JDT05WKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgdm9pZCB3cmNvZGVjKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggYWRkciwgdTE2IGRhdGEpCnsKCXN0cnVjdCBlczEzNzFfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MV9zdGF0ZSAqKWNvZGVjLT5wcml2YXRlX2RhdGE7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJdW5zaWduZWQgdCwgeDsKICAgICAgICAKCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7Cglmb3IgKHQgPSAwOyB0IDwgUE9MTF9DT1VOVDsgdCsrKQoJCWlmICghKGlubChzLT5pbytFUzEzNzFfUkVHX0NPREVDKSAmIENPREVDX1dJUCkpCgkJCWJyZWFrOwoKICAgICAgICAvKiBzYXZlIHRoZSBjdXJyZW50IHN0YXRlIGZvciBsYXRlciAqLwogICAgICAgIHggPSB3YWl0X3NyY19yZWFkeShzKTsKCiAgICAgICAgLyogZW5hYmxlIFNSQyBzdGF0ZSBkYXRhIGluIFNSQyBtdXggKi8KCW91dGwoKHggJiAoU1JDX0RJUyB8IFNSQ19EREFDMSB8IFNSQ19EREFDMiB8IFNSQ19EQURDKSkgfCAweDAwMDEwMDAwLAoJICAgICBzLT5pbytFUzEzNzFfUkVHX1NSQ09OVik7CgogICAgICAgIC8qIHdhaXQgZm9yIG5vdCBidXN5IChzdGF0ZSAwKSBmaXJzdCB0byBhdm9pZAogICAgICAgICAgIHRyYW5zaXRpb24gc3RhdGVzICovCiAgICAgICAgZm9yICh0PTA7IHQ8UE9MTF9DT1VOVDsgdCsrKXsKICAgICAgICAgICAgICAgIGlmKChpbmwocy0+aW8rRVMxMzcxX1JFR19TUkNPTlYpICYgMHgwMDg3MDAwMCkgPT0wICkKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIHVkZWxheSgxKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLyogd2FpdCBmb3IgYSBTQUZFIHRpbWUgdG8gd3JpdGUgYWRkci9kYXRhIGFuZCB0aGVuIGRvIGl0LCBkYW1taXQgKi8KICAgICAgICBmb3IgKHQ9MDsgdDxQT0xMX0NPVU5UOyB0KyspewogICAgICAgICAgICAgICAgaWYoKGlubChzLT5pbytFUzEzNzFfUkVHX1NSQ09OVikgJiAweDAwODcwMDAwKSA9PTB4MDAwMTAwMDApCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB1ZGVsYXkoMSk7CiAgICAgICAgfQoKCW91dGwoKChhZGRyIDw8IENPREVDX1BPQUREX1NISUZUKSAmIENPREVDX1BPQUREX01BU0spIHwKCSAgICAgKChkYXRhIDw8IENPREVDX1BPREFUX1NISUZUKSAmIENPREVDX1BPREFUX01BU0spLCBzLT5pbytFUzEzNzFfUkVHX0NPREVDKTsKCgkvKiByZXN0b3JlIFNSQyByZWcgKi8KCXdhaXRfc3JjX3JlYWR5KHMpOwoJb3V0bCh4LCBzLT5pbytFUzEzNzFfUkVHX1NSQ09OVik7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cn0KCnN0YXRpYyB1MTYgcmRjb2RlYyhzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IGFkZHIpCnsKCXN0cnVjdCBlczEzNzFfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MV9zdGF0ZSAqKWNvZGVjLT5wcml2YXRlX2RhdGE7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJdW5zaWduZWQgdCwgeDsKCglzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOwoJCiAgICAgICAgLyogd2FpdCBmb3IgV0lQIHRvIGdvIGF3YXkgKi8KCWZvciAodCA9IDA7IHQgPCAweDEwMDA7IHQrKykKCQlpZiAoIShpbmwocy0+aW8rRVMxMzcxX1JFR19DT0RFQykgJiBDT0RFQ19XSVApKQoJCQlicmVhazsKCgkvKiBzYXZlIHRoZSBjdXJyZW50IHN0YXRlIGZvciBsYXRlciAqLwoJeCA9ICh3YWl0X3NyY19yZWFkeShzKSAmIChTUkNfRElTIHwgU1JDX0REQUMxIHwgU1JDX0REQUMyIHwgU1JDX0RBREMpKTsKCgkvKiBlbmFibGUgU1JDIHN0YXRlIGRhdGEgaW4gU1JDIG11eCAqLwoJb3V0bCggeCB8IDB4MDAwMTAwMDAsCiAgICAgICAgICAgICAgcy0+aW8rRVMxMzcxX1JFR19TUkNPTlYpOwoKICAgICAgICAvKiB3YWl0IGZvciBub3QgYnVzeSAoc3RhdGUgMCkgZmlyc3QgdG8gYXZvaWQKICAgICAgICAgICB0cmFuc2l0aW9uIHN0YXRlcyAqLwogICAgICAgIGZvciAodD0wOyB0PFBPTExfQ09VTlQ7IHQrKyl7CiAgICAgICAgICAgICAgICBpZigoaW5sKHMtPmlvK0VTMTM3MV9SRUdfU1JDT05WKSAmIDB4MDA4NzAwMDApID09MCApCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB1ZGVsYXkoMSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8qIHdhaXQgZm9yIGEgU0FGRSB0aW1lIHRvIHdyaXRlIGFkZHIvZGF0YSBhbmQgdGhlbiBkbyBpdCwgZGFtbWl0ICovCiAgICAgICAgZm9yICh0PTA7IHQ8UE9MTF9DT1VOVDsgdCsrKXsKICAgICAgICAgICAgICAgIGlmKChpbmwocy0+aW8rRVMxMzcxX1JFR19TUkNPTlYpICYgMHgwMDg3MDAwMCkgPT0weDAwMDEwMDAwKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgdWRlbGF5KDEpOwogICAgICAgIH0KCglvdXRsKCgoYWRkciA8PCBDT0RFQ19QT0FERF9TSElGVCkgJiBDT0RFQ19QT0FERF9NQVNLKSB8IENPREVDX1BPUkQsIHMtPmlvK0VTMTM3MV9SRUdfQ09ERUMpOwoJLyogcmVzdG9yZSBTUkMgcmVnICovCgl3YWl0X3NyY19yZWFkeShzKTsKCW91dGwoeCwgcy0+aW8rRVMxMzcxX1JFR19TUkNPTlYpOwoKICAgICAgICAvKiB3YWl0IGZvciBXSVAgYWdhaW4gKi8KCWZvciAodCA9IDA7IHQgPCAweDEwMDA7IHQrKykKCQlpZiAoIShpbmwocy0+aW8rRVMxMzcxX1JFR19DT0RFQykgJiBDT0RFQ19XSVApKQoJCQlicmVhazsKICAgICAgICAKCS8qIG5vdyB3YWl0IGZvciB0aGUgc3RpbmtpbicgZGF0YSAoUkRZKSAqLwoJZm9yICh0ID0gMDsgdCA8IFBPTExfQ09VTlQ7IHQrKykKCQlpZiAoKHggPSBpbmwocy0+aW8rRVMxMzcxX1JFR19DT0RFQykpICYgQ09ERUNfUkRZKQoJCQlicmVhazsKICAgICAgICAKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKCXJldHVybiAoKHggJiBDT0RFQ19QSURBVF9NQVNLKSA+PiBDT0RFQ19QSURBVF9TSElGVCk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIGlubGluZSB2b2lkIHN0b3BfYWRjKHN0cnVjdCBlczEzNzFfc3RhdGUgKnMpCnsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKCXMtPmN0cmwgJj0gfkNUUkxfQURDX0VOOwoJb3V0bChzLT5jdHJsLCBzLT5pbytFUzEzNzFfUkVHX0NPTlRST0wpOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOwp9CQoKc3RhdGljIGlubGluZSB2b2lkIHN0b3BfZGFjMShzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzKQp7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CglzLT5jdHJsICY9IH5DVFJMX0RBQzFfRU47CglvdXRsKHMtPmN0cmwsIHMtPmlvK0VTMTM3MV9SRUdfQ09OVFJPTCk7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cn0JCgpzdGF0aWMgaW5saW5lIHZvaWQgc3RvcF9kYWMyKHN0cnVjdCBlczEzNzFfc3RhdGUgKnMpCnsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKCXMtPmN0cmwgJj0gfkNUUkxfREFDMl9FTjsKCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcxX1JFR19DT05UUk9MKTsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKfQkKCnN0YXRpYyB2b2lkIHN0YXJ0X2RhYzEoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcykKewoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXVuc2lnbmVkIGZyYWdyZW1haW4sIGZzaGlmdDsKCglzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOwoJaWYgKCEocy0+Y3RybCAmIENUUkxfREFDMV9FTikgJiYgKHMtPmRtYV9kYWMxLm1hcHBlZCB8fCBzLT5kbWFfZGFjMS5jb3VudCA+IDApCgkgICAgJiYgcy0+ZG1hX2RhYzEucmVhZHkpIHsKCQlzLT5jdHJsIHw9IENUUkxfREFDMV9FTjsKCQlzLT5zY3RybCA9IChzLT5zY3RybCAmIH4oU0NUUkxfUDFMT09QU0VMIHwgU0NUUkxfUDFQQVVTRSB8IFNDVFJMX1AxU0NUUkxEKSkgfCBTQ1RSTF9QMUlOVEVOOwoJCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MV9SRUdfU0VSSUFMX0NPTlRST0wpOwoJCWZyYWdyZW1haW4gPSAoKC0gcy0+ZG1hX2RhYzEuaHdwdHIpICYgKHMtPmRtYV9kYWMxLmZyYWdzaXplLTEpKTsKCQlmc2hpZnQgPSBzYW1wbGVfc2hpZnRbKHMtPnNjdHJsICYgU0NUUkxfUDFGTVQpID4+IFNDVFJMX1NIX1AxRk1UXTsKCQlpZiAoZnJhZ3JlbWFpbiA8IDIqZnNoaWZ0KQoJCQlmcmFncmVtYWluID0gcy0+ZG1hX2RhYzEuZnJhZ3NpemU7CgkJb3V0bCgoZnJhZ3JlbWFpbiA+PiBmc2hpZnQpIC0gMSwgcy0+aW8rRVMxMzcxX1JFR19EQUMxX1NDT1VOVCk7CgkJb3V0bChzLT5jdHJsLCBzLT5pbytFUzEzNzFfUkVHX0NPTlRST0wpOwoJCW91dGwoKHMtPmRtYV9kYWMxLmZyYWdzaXplID4+IGZzaGlmdCkgLSAxLCBzLT5pbytFUzEzNzFfUkVHX0RBQzFfU0NPVU5UKTsKCX0KCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKfQkKCnN0YXRpYyB2b2lkIHN0YXJ0X2RhYzIoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcykKewoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXVuc2lnbmVkIGZyYWdyZW1haW4sIGZzaGlmdDsKCglzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOwoJaWYgKCEocy0+Y3RybCAmIENUUkxfREFDMl9FTikgJiYgKHMtPmRtYV9kYWMyLm1hcHBlZCB8fCBzLT5kbWFfZGFjMi5jb3VudCA+IDApCgkgICAgJiYgcy0+ZG1hX2RhYzIucmVhZHkpIHsKCQlzLT5jdHJsIHw9IENUUkxfREFDMl9FTjsKCQlzLT5zY3RybCA9IChzLT5zY3RybCAmIH4oU0NUUkxfUDJMT09QU0VMIHwgU0NUUkxfUDJQQVVTRSB8IFNDVFJMX1AyREFDU0VOIHwgCgkJCQkJIFNDVFJMX1AyRU5ESU5DIHwgU0NUUkxfUDJTVElOQykpIHwgU0NUUkxfUDJJTlRFTiB8CgkJCSgoKHMtPnNjdHJsICYgU0NUUkxfUDJGTVQpID8gMiA6IDEpIDw8IFNDVFJMX1NIX1AyRU5ESU5DKSB8IAoJCQkoMCA8PCBTQ1RSTF9TSF9QMlNUSU5DKTsKCQlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzFfUkVHX1NFUklBTF9DT05UUk9MKTsKCQlmcmFncmVtYWluID0gKCgtIHMtPmRtYV9kYWMyLmh3cHRyKSAmIChzLT5kbWFfZGFjMi5mcmFnc2l6ZS0xKSk7CgkJZnNoaWZ0ID0gc2FtcGxlX3NoaWZ0WyhzLT5zY3RybCAmIFNDVFJMX1AyRk1UKSA+PiBTQ1RSTF9TSF9QMkZNVF07CgkJaWYgKGZyYWdyZW1haW4gPCAyKmZzaGlmdCkKCQkJZnJhZ3JlbWFpbiA9IHMtPmRtYV9kYWMyLmZyYWdzaXplOwoJCW91dGwoKGZyYWdyZW1haW4gPj4gZnNoaWZ0KSAtIDEsIHMtPmlvK0VTMTM3MV9SRUdfREFDMl9TQ09VTlQpOwoJCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcxX1JFR19DT05UUk9MKTsKCQlvdXRsKChzLT5kbWFfZGFjMi5mcmFnc2l6ZSA+PiBmc2hpZnQpIC0gMSwgcy0+aW8rRVMxMzcxX1JFR19EQUMyX1NDT1VOVCk7Cgl9CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cn0JCgpzdGF0aWMgdm9pZCBzdGFydF9hZGMoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcykKewoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXVuc2lnbmVkIGZyYWdyZW1haW4sIGZzaGlmdDsKCglzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOwoJaWYgKCEocy0+Y3RybCAmIENUUkxfQURDX0VOKSAmJiAocy0+ZG1hX2FkYy5tYXBwZWQgfHwgcy0+ZG1hX2FkYy5jb3VudCA8IChzaWduZWQpKHMtPmRtYV9hZGMuZG1hc2l6ZSAtIDIqcy0+ZG1hX2FkYy5mcmFnc2l6ZSkpCgkgICAgJiYgcy0+ZG1hX2FkYy5yZWFkeSkgewoJCXMtPmN0cmwgfD0gQ1RSTF9BRENfRU47CgkJcy0+c2N0cmwgPSAocy0+c2N0cmwgJiB+U0NUUkxfUjFMT09QU0VMKSB8IFNDVFJMX1IxSU5URU47CgkJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcxX1JFR19TRVJJQUxfQ09OVFJPTCk7CgkJZnJhZ3JlbWFpbiA9ICgoLSBzLT5kbWFfYWRjLmh3cHRyKSAmIChzLT5kbWFfYWRjLmZyYWdzaXplLTEpKTsKCQlmc2hpZnQgPSBzYW1wbGVfc2hpZnRbKHMtPnNjdHJsICYgU0NUUkxfUjFGTVQpID4+IFNDVFJMX1NIX1IxRk1UXTsKCQlpZiAoZnJhZ3JlbWFpbiA8IDIqZnNoaWZ0KQoJCQlmcmFncmVtYWluID0gcy0+ZG1hX2FkYy5mcmFnc2l6ZTsKCQlvdXRsKChmcmFncmVtYWluID4+IGZzaGlmdCkgLSAxLCBzLT5pbytFUzEzNzFfUkVHX0FEQ19TQ09VTlQpOwoJCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcxX1JFR19DT05UUk9MKTsKCQlvdXRsKChzLT5kbWFfYWRjLmZyYWdzaXplID4+IGZzaGlmdCkgLSAxLCBzLT5pbytFUzEzNzFfUkVHX0FEQ19TQ09VTlQpOwoJfQoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOwp9CQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgojZGVmaW5lIERNQUJVRl9ERUZBVUxUT1JERVIgKDE3LVBBR0VfU0hJRlQpCiNkZWZpbmUgRE1BQlVGX01JTk9SREVSIDEKCgpzdGF0aWMgaW5saW5lIHZvaWQgZGVhbGxvY19kbWFidWYoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcywgc3RydWN0IGRtYWJ1ZiAqZGIpCnsKCXN0cnVjdCBwYWdlICpwYWdlLCAqcGVuZDsKCglpZiAoZGItPnJhd2J1ZikgewoJCS8qIHVuZG8gbWFya2luZyB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQgKi8KCQlwZW5kID0gdmlydF90b19wYWdlKGRiLT5yYXdidWYgKyAoUEFHRV9TSVpFIDw8IGRiLT5idWZvcmRlcikgLSAxKTsKCQlmb3IgKHBhZ2UgPSB2aXJ0X3RvX3BhZ2UoZGItPnJhd2J1Zik7IHBhZ2UgPD0gcGVuZDsgcGFnZSsrKQoJCQlDbGVhclBhZ2VSZXNlcnZlZChwYWdlKTsKCQlwY2lfZnJlZV9jb25zaXN0ZW50KHMtPmRldiwgUEFHRV9TSVpFIDw8IGRiLT5idWZvcmRlciwgZGItPnJhd2J1ZiwgZGItPmRtYWFkZHIpOwoJfQoJZGItPnJhd2J1ZiA9IE5VTEw7CglkYi0+bWFwcGVkID0gZGItPnJlYWR5ID0gMDsKfQoKc3RhdGljIGludCBwcm9nX2RtYWJ1ZihzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzLCBzdHJ1Y3QgZG1hYnVmICpkYiwgdW5zaWduZWQgcmF0ZSwgdW5zaWduZWQgZm10LCB1bnNpZ25lZCByZWcpCnsKCWludCBvcmRlcjsKCXVuc2lnbmVkIGJ5dGVwZXJzZWM7Cgl1bnNpZ25lZCBidWZzOwoJc3RydWN0IHBhZ2UgKnBhZ2UsICpwZW5kOwoKCWRiLT5od3B0ciA9IGRiLT5zd3B0ciA9IGRiLT50b3RhbF9ieXRlcyA9IGRiLT5jb3VudCA9IGRiLT5lcnJvciA9IGRiLT5lbmRjbGVhcmVkID0gMDsKCWlmICghZGItPnJhd2J1ZikgewoJCWRiLT5yZWFkeSA9IGRiLT5tYXBwZWQgPSAwOwoJCWZvciAob3JkZXIgPSBETUFCVUZfREVGQVVMVE9SREVSOyBvcmRlciA+PSBETUFCVUZfTUlOT1JERVI7IG9yZGVyLS0pCgkJCWlmICgoZGItPnJhd2J1ZiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHMtPmRldiwgUEFHRV9TSVpFIDw8IG9yZGVyLCAmZGItPmRtYWFkZHIpKSkKCQkJCWJyZWFrOwoJCWlmICghZGItPnJhd2J1ZikKCQkJcmV0dXJuIC1FTk9NRU07CgkJZGItPmJ1Zm9yZGVyID0gb3JkZXI7CgkJLyogbm93IG1hcmsgdGhlIHBhZ2VzIGFzIHJlc2VydmVkOyBvdGhlcndpc2UgcmVtYXBfcGZuX3JhbmdlIGRvZXNuJ3QgZG8gd2hhdCB3ZSB3YW50ICovCgkJcGVuZCA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmICsgKFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXIpIC0gMSk7CgkJZm9yIChwYWdlID0gdmlydF90b19wYWdlKGRiLT5yYXdidWYpOyBwYWdlIDw9IHBlbmQ7IHBhZ2UrKykKCQkJU2V0UGFnZVJlc2VydmVkKHBhZ2UpOwoJfQoJZm10ICY9IEVTMTM3MV9GTVRfTUFTSzsKCWJ5dGVwZXJzZWMgPSByYXRlIDw8IHNhbXBsZV9zaGlmdFtmbXRdOwoJYnVmcyA9IFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXI7CglpZiAoZGItPm9zc2ZyYWdzaGlmdCkgewoJCWlmICgoMTAwMCA8PCBkYi0+b3NzZnJhZ3NoaWZ0KSA8IGJ5dGVwZXJzZWMpCgkJCWRiLT5mcmFnc2hpZnQgPSBsZDIoYnl0ZXBlcnNlYy8xMDAwKTsKCQllbHNlCgkJCWRiLT5mcmFnc2hpZnQgPSBkYi0+b3NzZnJhZ3NoaWZ0OwoJfSBlbHNlIHsKCQlkYi0+ZnJhZ3NoaWZ0ID0gbGQyKGJ5dGVwZXJzZWMvMTAwLyhkYi0+c3ViZGl2aXNpb24gPyBkYi0+c3ViZGl2aXNpb24gOiAxKSk7CgkJaWYgKGRiLT5mcmFnc2hpZnQgPCAzKQoJCQlkYi0+ZnJhZ3NoaWZ0ID0gMzsKCX0KCWRiLT5udW1mcmFnID0gYnVmcyA+PiBkYi0+ZnJhZ3NoaWZ0OwoJd2hpbGUgKGRiLT5udW1mcmFnIDwgNCAmJiBkYi0+ZnJhZ3NoaWZ0ID4gMykgewoJCWRiLT5mcmFnc2hpZnQtLTsKCQlkYi0+bnVtZnJhZyA9IGJ1ZnMgPj4gZGItPmZyYWdzaGlmdDsKCX0KCWRiLT5mcmFnc2l6ZSA9IDEgPDwgZGItPmZyYWdzaGlmdDsKCWlmIChkYi0+b3NzbWF4ZnJhZ3MgPj0gNCAmJiBkYi0+b3NzbWF4ZnJhZ3MgPCBkYi0+bnVtZnJhZykKCQlkYi0+bnVtZnJhZyA9IGRiLT5vc3NtYXhmcmFnczsKCWRiLT5mcmFnc2FtcGxlcyA9IGRiLT5mcmFnc2l6ZSA+PiBzYW1wbGVfc2hpZnRbZm10XTsKCWRiLT5kbWFzaXplID0gZGItPm51bWZyYWcgPDwgZGItPmZyYWdzaGlmdDsKCW1lbXNldChkYi0+cmF3YnVmLCAoZm10ICYgRVMxMzcxX0ZNVF9TMTYpID8gMCA6IDB4ODAsIGRiLT5kbWFzaXplKTsKCW91dGwoKHJlZyA+PiA4KSAmIDE1LCBzLT5pbytFUzEzNzFfUkVHX01FTVBBR0UpOwoJb3V0bChkYi0+ZG1hYWRkciwgcy0+aW8rKHJlZyAmIDB4ZmYpKTsKCW91dGwoKGRiLT5kbWFzaXplID4+IDIpLTEsIHMtPmlvKygocmVnICsgNCkgJiAweGZmKSk7CglkYi0+ZW5hYmxlZCA9IDE7CglkYi0+cmVhZHkgPSAxOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IHByb2dfZG1hYnVmX2FkYyhzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzKQp7CglzdG9wX2FkYyhzKTsKCXJldHVybiBwcm9nX2RtYWJ1ZihzLCAmcy0+ZG1hX2FkYywgcy0+YWRjcmF0ZSwgKHMtPnNjdHJsID4+IFNDVFJMX1NIX1IxRk1UKSAmIEVTMTM3MV9GTVRfTUFTSywgCgkJCSAgIEVTMTM3MV9SRUdfQURDX0ZSQU1FQURSKTsKfQoKc3RhdGljIGlubGluZSBpbnQgcHJvZ19kbWFidWZfZGFjMihzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzKQp7CglzdG9wX2RhYzIocyk7CglyZXR1cm4gcHJvZ19kbWFidWYocywgJnMtPmRtYV9kYWMyLCBzLT5kYWMycmF0ZSwgKHMtPnNjdHJsID4+IFNDVFJMX1NIX1AyRk1UKSAmIEVTMTM3MV9GTVRfTUFTSywgCgkJCSAgIEVTMTM3MV9SRUdfREFDMl9GUkFNRUFEUik7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IHByb2dfZG1hYnVmX2RhYzEoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcykKewoJc3RvcF9kYWMxKHMpOwoJcmV0dXJuIHByb2dfZG1hYnVmKHMsICZzLT5kbWFfZGFjMSwgcy0+ZGFjMXJhdGUsIChzLT5zY3RybCA+PiBTQ1RSTF9TSF9QMUZNVCkgJiBFUzEzNzFfRk1UX01BU0ssCgkJCSAgIEVTMTM3MV9SRUdfREFDMV9GUkFNRUFEUik7Cn0KCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0X2h3cHRyKHN0cnVjdCBlczEzNzFfc3RhdGUgKnMsIHN0cnVjdCBkbWFidWYgKmRiLCB1bnNpZ25lZCByZWcpCnsKCXVuc2lnbmVkIGh3cHRyLCBkaWZmOwoKCW91dGwoKHJlZyA+PiA4KSAmIDE1LCBzLT5pbytFUzEzNzFfUkVHX01FTVBBR0UpOwoJaHdwdHIgPSAoaW5sKHMtPmlvKyhyZWcgJiAweGZmKSkgPj4gMTQpICYgMHgzZmZmYzsKCWRpZmYgPSAoZGItPmRtYXNpemUgKyBod3B0ciAtIGRiLT5od3B0cikgJSBkYi0+ZG1hc2l6ZTsKCWRiLT5od3B0ciA9IGh3cHRyOwoJcmV0dXJuIGRpZmY7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9hZHZhbmNlKHZvaWQgKmJ1ZiwgdW5zaWduZWQgYnNpemUsIHVuc2lnbmVkIGJwdHIsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgY2hhciBjKQp7CglpZiAoYnB0ciArIGxlbiA+IGJzaXplKSB7CgkJdW5zaWduZWQgeCA9IGJzaXplIC0gYnB0cjsKCQltZW1zZXQoKChjaGFyICopYnVmKSArIGJwdHIsIGMsIHgpOwoJCWJwdHIgPSAwOwoJCWxlbiAtPSB4OwoJfQoJbWVtc2V0KCgoY2hhciAqKWJ1ZikgKyBicHRyLCBjLCBsZW4pOwp9CgovKiBjYWxsIHdpdGggc3BpbmxvY2sgaGVsZCEgKi8Kc3RhdGljIHZvaWQgZXMxMzcxX3VwZGF0ZV9wdHIoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcykKewoJaW50IGRpZmY7CgoJLyogdXBkYXRlIEFEQyBwb2ludGVyICovCglpZiAocy0+Y3RybCAmIENUUkxfQURDX0VOKSB7CgkJZGlmZiA9IGdldF9od3B0cihzLCAmcy0+ZG1hX2FkYywgRVMxMzcxX1JFR19BRENfRlJBTUVDTlQpOwoJCXMtPmRtYV9hZGMudG90YWxfYnl0ZXMgKz0gZGlmZjsKCQlzLT5kbWFfYWRjLmNvdW50ICs9IGRpZmY7CgkJaWYgKHMtPmRtYV9hZGMuY291bnQgPj0gKHNpZ25lZClzLT5kbWFfYWRjLmZyYWdzaXplKSAKCQkJd2FrZV91cCgmcy0+ZG1hX2FkYy53YWl0KTsKCQlpZiAoIXMtPmRtYV9hZGMubWFwcGVkKSB7CgkJCWlmIChzLT5kbWFfYWRjLmNvdW50ID4gKHNpZ25lZCkocy0+ZG1hX2FkYy5kbWFzaXplIC0gKCgzICogcy0+ZG1hX2FkYy5mcmFnc2l6ZSkgPj4gMSkpKSB7CgkJCQlzLT5jdHJsICY9IH5DVFJMX0FEQ19FTjsKCQkJCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcxX1JFR19DT05UUk9MKTsKCQkJCXMtPmRtYV9hZGMuZXJyb3IrKzsKCQkJfQoJCX0KCX0KCS8qIHVwZGF0ZSBEQUMxIHBvaW50ZXIgKi8KCWlmIChzLT5jdHJsICYgQ1RSTF9EQUMxX0VOKSB7CgkJZGlmZiA9IGdldF9od3B0cihzLCAmcy0+ZG1hX2RhYzEsIEVTMTM3MV9SRUdfREFDMV9GUkFNRUNOVCk7CgkJcy0+ZG1hX2RhYzEudG90YWxfYnl0ZXMgKz0gZGlmZjsKCQlpZiAocy0+ZG1hX2RhYzEubWFwcGVkKSB7CgkJCXMtPmRtYV9kYWMxLmNvdW50ICs9IGRpZmY7CgkJCWlmIChzLT5kbWFfZGFjMS5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9kYWMxLmZyYWdzaXplKQoJCQkJd2FrZV91cCgmcy0+ZG1hX2RhYzEud2FpdCk7CgkJfSBlbHNlIHsKCQkJcy0+ZG1hX2RhYzEuY291bnQgLT0gZGlmZjsKCQkJaWYgKHMtPmRtYV9kYWMxLmNvdW50IDw9IDApIHsKCQkJCXMtPmN0cmwgJj0gfkNUUkxfREFDMV9FTjsKCQkJCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcxX1JFR19DT05UUk9MKTsKCQkJCXMtPmRtYV9kYWMxLmVycm9yKys7CgkJCX0gZWxzZSBpZiAocy0+ZG1hX2RhYzEuY291bnQgPD0gKHNpZ25lZClzLT5kbWFfZGFjMS5mcmFnc2l6ZSAmJiAhcy0+ZG1hX2RhYzEuZW5kY2xlYXJlZCkgewoJCQkJY2xlYXJfYWR2YW5jZShzLT5kbWFfZGFjMS5yYXdidWYsIHMtPmRtYV9kYWMxLmRtYXNpemUsIHMtPmRtYV9kYWMxLnN3cHRyLCAKCQkJCQkgICAgICBzLT5kbWFfZGFjMS5mcmFnc2l6ZSwgKHMtPnNjdHJsICYgU0NUUkxfUDFTRUIpID8gMCA6IDB4ODApOwoJCQkJcy0+ZG1hX2RhYzEuZW5kY2xlYXJlZCA9IDE7CgkJCX0KCQkJaWYgKHMtPmRtYV9kYWMxLmNvdW50ICsgKHNpZ25lZClzLT5kbWFfZGFjMS5mcmFnc2l6ZSA8PSAoc2lnbmVkKXMtPmRtYV9kYWMxLmRtYXNpemUpCgkJCQl3YWtlX3VwKCZzLT5kbWFfZGFjMS53YWl0KTsKCQl9Cgl9CgkvKiB1cGRhdGUgREFDMiBwb2ludGVyICovCglpZiAocy0+Y3RybCAmIENUUkxfREFDMl9FTikgewoJCWRpZmYgPSBnZXRfaHdwdHIocywgJnMtPmRtYV9kYWMyLCBFUzEzNzFfUkVHX0RBQzJfRlJBTUVDTlQpOwoJCXMtPmRtYV9kYWMyLnRvdGFsX2J5dGVzICs9IGRpZmY7CgkJaWYgKHMtPmRtYV9kYWMyLm1hcHBlZCkgewoJCQlzLT5kbWFfZGFjMi5jb3VudCArPSBkaWZmOwoJCQlpZiAocy0+ZG1hX2RhYzIuY291bnQgPj0gKHNpZ25lZClzLT5kbWFfZGFjMi5mcmFnc2l6ZSkKCQkJCXdha2VfdXAoJnMtPmRtYV9kYWMyLndhaXQpOwoJCX0gZWxzZSB7CgkJCXMtPmRtYV9kYWMyLmNvdW50IC09IGRpZmY7CgkJCWlmIChzLT5kbWFfZGFjMi5jb3VudCA8PSAwKSB7CgkJCQlzLT5jdHJsICY9IH5DVFJMX0RBQzJfRU47CgkJCQlvdXRsKHMtPmN0cmwsIHMtPmlvK0VTMTM3MV9SRUdfQ09OVFJPTCk7CgkJCQlzLT5kbWFfZGFjMi5lcnJvcisrOwoJCQl9IGVsc2UgaWYgKHMtPmRtYV9kYWMyLmNvdW50IDw9IChzaWduZWQpcy0+ZG1hX2RhYzIuZnJhZ3NpemUgJiYgIXMtPmRtYV9kYWMyLmVuZGNsZWFyZWQpIHsKCQkJCWNsZWFyX2FkdmFuY2Uocy0+ZG1hX2RhYzIucmF3YnVmLCBzLT5kbWFfZGFjMi5kbWFzaXplLCBzLT5kbWFfZGFjMi5zd3B0ciwgCgkJCQkJICAgICAgcy0+ZG1hX2RhYzIuZnJhZ3NpemUsIChzLT5zY3RybCAmIFNDVFJMX1AyU0VCKSA/IDAgOiAweDgwKTsKCQkJCXMtPmRtYV9kYWMyLmVuZGNsZWFyZWQgPSAxOwoJCQl9CgkJCWlmIChzLT5kbWFfZGFjMi5jb3VudCArIChzaWduZWQpcy0+ZG1hX2RhYzIuZnJhZ3NpemUgPD0gKHNpZ25lZClzLT5kbWFfZGFjMi5kbWFzaXplKQoJCQkJd2FrZV91cCgmcy0+ZG1hX2RhYzIud2FpdCk7CgkJfQoJfQp9CgovKiBob2xkIHNwaW5sb2NrIGZvciB0aGUgZm9sbG93aW5nISAqLwpzdGF0aWMgdm9pZCBlczEzNzFfaGFuZGxlX21pZGkoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcykKewoJdW5zaWduZWQgY2hhciBjaDsKCWludCB3YWtlOwoKCWlmICghKHMtPmN0cmwgJiBDVFJMX1VBUlRfRU4pKQoJCXJldHVybjsKCXdha2UgPSAwOwoJd2hpbGUgKGluYihzLT5pbytFUzEzNzFfUkVHX1VBUlRfU1RBVFVTKSAmIFVTVEFUX1JYUkRZKSB7CgkJY2ggPSBpbmIocy0+aW8rRVMxMzcxX1JFR19VQVJUX0RBVEEpOwoJCWlmIChzLT5taWRpLmljbnQgPCBNSURJSU5CVUYpIHsKCQkJcy0+bWlkaS5pYnVmW3MtPm1pZGkuaXdyXSA9IGNoOwoJCQlzLT5taWRpLml3ciA9IChzLT5taWRpLml3ciArIDEpICUgTUlESUlOQlVGOwoJCQlzLT5taWRpLmljbnQrKzsKCQl9CgkJd2FrZSA9IDE7Cgl9CglpZiAod2FrZSkKCQl3YWtlX3VwKCZzLT5taWRpLml3YWl0KTsKCXdha2UgPSAwOwoJd2hpbGUgKChpbmIocy0+aW8rRVMxMzcxX1JFR19VQVJUX1NUQVRVUykgJiBVU1RBVF9UWFJEWSkgJiYgcy0+bWlkaS5vY250ID4gMCkgewoJCW91dGIocy0+bWlkaS5vYnVmW3MtPm1pZGkub3JkXSwgcy0+aW8rRVMxMzcxX1JFR19VQVJUX0RBVEEpOwoJCXMtPm1pZGkub3JkID0gKHMtPm1pZGkub3JkICsgMSkgJSBNSURJT1VUQlVGOwoJCXMtPm1pZGkub2NudC0tOwoJCWlmIChzLT5taWRpLm9jbnQgPCBNSURJT1VUQlVGLTE2KQoJCQl3YWtlID0gMTsKCX0KCWlmICh3YWtlKQoJCXdha2VfdXAoJnMtPm1pZGkub3dhaXQpOwoJb3V0Yigocy0+bWlkaS5vY250ID4gMCkgPyBVQ1RSTF9SWElOVEVOIHwgVUNUUkxfRU5BX1RYSU5UIDogVUNUUkxfUlhJTlRFTiwgcy0+aW8rRVMxMzcxX1JFR19VQVJUX0NPTlRST0wpOwp9CgpzdGF0aWMgaXJxcmV0dXJuX3QgZXMxMzcxX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCnsKICAgICAgICBzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzFfc3RhdGUgKilkZXZfaWQ7Cgl1bnNpZ25lZCBpbnQgaW50c3JjLCBzY3RsOwoJCgkvKiBmYXN0cGF0aCBvdXQsIHRvIGVhc2UgaW50ZXJydXB0IHNoYXJpbmcgKi8KCWludHNyYyA9IGlubChzLT5pbytFUzEzNzFfUkVHX1NUQVRVUyk7CglpZiAoIShpbnRzcmMgJiAweDgwMDAwMDAwKSkKCQlyZXR1cm4gSVJRX05PTkU7CglzcGluX2xvY2soJnMtPmxvY2spOwoJLyogY2xlYXIgYXVkaW8gaW50ZXJydXB0cyBmaXJzdCAqLwoJc2N0bCA9IHMtPnNjdHJsOwoJaWYgKGludHNyYyAmIFNUQVRfQURDKQoJCXNjdGwgJj0gflNDVFJMX1IxSU5URU47CglpZiAoaW50c3JjICYgU1RBVF9EQUMxKQoJCXNjdGwgJj0gflNDVFJMX1AxSU5URU47CglpZiAoaW50c3JjICYgU1RBVF9EQUMyKQoJCXNjdGwgJj0gflNDVFJMX1AySU5URU47CglvdXRsKHNjdGwsIHMtPmlvK0VTMTM3MV9SRUdfU0VSSUFMX0NPTlRST0wpOwoJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcxX1JFR19TRVJJQUxfQ09OVFJPTCk7CgllczEzNzFfdXBkYXRlX3B0cihzKTsKCWVzMTM3MV9oYW5kbGVfbWlkaShzKTsKCXNwaW5fdW5sb2NrKCZzLT5sb2NrKTsKCXJldHVybiBJUlFfSEFORExFRDsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgY29uc3QgY2hhciBpbnZhbGlkX21hZ2ljW10gPSBLRVJOX0NSSVQgUEZYICJpbnZhbGlkIG1hZ2ljIHZhbHVlXG4iOwoKI2RlZmluZSBWQUxJREFURV9TVEFURShzKSAgICAgICAgICAgICAgICAgICAgICAgICBcCih7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoJaWYgKCEocykgfHwgKHMpLT5tYWdpYyAhPSBFUzEzNzFfTUFHSUMpIHsgXAoJCXByaW50ayhpbnZhbGlkX21hZ2ljKTsgICAgICAgICAgICBcCgkJcmV0dXJuIC1FTlhJTzsgICAgICAgICAgICAgICAgICAgIFwKCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKfSkKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyogQ29udmVyc2lvbiB0YWJsZSBmb3IgUy9QRElGIFBDTSB2b2x1bWUgZW11bGF0aW9uIHRocm91Z2ggdGhlIFNSQyAqLwovKiBkQi1saW5lYXIgdGFibGUgb2YgREFDIHZvbCB2YWx1ZXM7IC0wZEIgdG8gLTQ2LjVkQiB3aXRoIG11dGUgKi8Kc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IERBQ1ZvbFRhYmxlWzEwMV0gPQp7CgkweDEwMDAsIDB4MGYyYSwgMHgwZTYwLCAweDBkYTAsIDB4MGNlYSwgMHgwYzNlLCAweDBiOWEsIDB4MGFmZiwKCTB4MGE2ZCwgMHgwOWUxLCAweDA5NWUsIDB4MDhlMSwgMHgwODZhLCAweDA3ZmEsIDB4MDc4ZiwgMHgwNzJhLAoJMHgwNmNiLCAweDA2NzAsIDB4MDYxYSwgMHgwNWM5LCAweDA1N2IsIDB4MDUzMiwgMHgwNGVkLCAweDA0YWIsCgkweDA0NmQsIDB4MDQzMiwgMHgwM2ZhLCAweDAzYzUsIDB4MDM5MiwgMHgwMzYzLCAweDAzMzUsIDB4MDMwYiwKCTB4MDJlMiwgMHgwMmJjLCAweDAyOTcsIDB4MDI3NSwgMHgwMjU0LCAweDAyMzUsIDB4MDIxNywgMHgwMWZiLAoJMHgwMWUxLCAweDAxYzgsIDB4MDFiMCwgMHgwMTk5LCAweDAxODQsIDB4MDE3MCwgMHgwMTVkLCAweDAxNGIsCgkweDAxMzksIDB4MDEyOSwgMHgwMTE5LCAweDAxMGIsIDB4MDBmZCwgMHgwMGYwLCAweDAwZTMsIDB4MDBkNywKCTB4MDBjYywgMHgwMGMxLCAweDAwYjcsIDB4MDBhZSwgMHgwMGE1LCAweDAwOWMsIDB4MDA5NCwgMHgwMDhjLAoJMHgwMDg1LCAweDAwN2UsIDB4MDA3NywgMHgwMDcxLCAweDAwNmIsIDB4MDA2NiwgMHgwMDYwLCAweDAwNWIsCgkweDAwNTcsIDB4MDA1MiwgMHgwMDRlLCAweDAwNGEsIDB4MDA0NiwgMHgwMDQyLCAweDAwM2YsIDB4MDAzYywKCTB4MDAzOCwgMHgwMDM2LCAweDAwMzMsIDB4MDAzMCwgMHgwMDJlLCAweDAwMmIsIDB4MDAyOSwgMHgwMDI3LAoJMHgwMDI1LCAweDAwMjMsIDB4MDAyMSwgMHgwMDFmLCAweDAwMWUsIDB4MDAxYywgMHgwMDFiLCAweDAwMTksCgkweDAwMTgsIDB4MDAxNywgMHgwMDE2LCAweDAwMTQsIDB4MDAwMAp9OwoKLyoKICogd2hlbiB3ZSBhcmUgaW4gUy9QRElGIG1vZGUsIHdlIHdhbnQgdG8gZGlzYWJsZSBhbnkgYW5hbG9nIG91dHB1dCBzbwogKiB3ZSBmaWx0ZXIgdGhlIG1peGVyIGlvY3RscyAKICovCnN0YXRpYyBpbnQgbWl4ZGV2X2lvY3RsKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCnsKCXN0cnVjdCBlczEzNzFfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MV9zdGF0ZSAqKWNvZGVjLT5wcml2YXRlX2RhdGE7CglpbnQgdmFsOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXVuc2lnbmVkIGludCBsZWZ0LCByaWdodDsKCglWQUxJREFURV9TVEFURShzKTsKCS8qIGZpbHRlciBtaXhlciBpb2N0bHMgdG8gY2F0Y2ggUENNIGFuZCBNQVNURVIgdm9sdW1lIHdoZW4gaW4gUy9QRElGIG1vZGUgKi8KCWlmIChzLT5zcGRpZl92b2x1bWUgPT0gLTEpCgkJcmV0dXJuIGNvZGVjLT5taXhlcl9pb2N0bChjb2RlYywgY21kLCBhcmcpOwoJc3dpdGNoIChjbWQpIHsKCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfVk9MVU1FOgoJCXJldHVybiAwOwoKCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfUENNOiAgIC8qIHVzZSBTUkMgZm9yIFBDTSB2b2x1bWUgKi8KCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZykpCgkJCXJldHVybiAtRUZBVUxUOwoJCXJpZ2h0ID0gKCh2YWwgPj4gOCkgICYgMHhmZik7CgkJbGVmdCA9ICh2YWwgICYgMHhmZik7CgkJaWYgKHJpZ2h0ID4gMTAwKQoJCQlyaWdodCA9IDEwMDsKCQlpZiAobGVmdCA+IDEwMCkKCQkJbGVmdCA9IDEwMDsKCQlzLT5zcGRpZl92b2x1bWUgPSAocmlnaHQgPDwgOCkgfCBsZWZ0OwoJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CgkJc3JjX3dyaXRlKHMsIFNSQ1JFR19WT0xfREFDMiwgREFDVm9sVGFibGVbMTAwIC0gbGVmdF0pOwoJCXNyY193cml0ZShzLCBTUkNSRUdfVk9MX0RBQzIrMSwgREFDVm9sVGFibGVbMTAwIC0gcmlnaHRdKTsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CgkJcmV0dXJuIDA7CgkKCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9QQ006CgkJcmV0dXJuIHB1dF91c2VyKHMtPnNwZGlmX3ZvbHVtZSwgKGludCBfX3VzZXIgKilhcmcpOwoJfQoJcmV0dXJuIGNvZGVjLT5taXhlcl9pb2N0bChjb2RlYywgY21kLCBhcmcpOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qCiAqIEFDOTcgTWl4ZXIgUmVnaXN0ZXIgdG8gQ29ubmVjdGlvbnMgbWFwcGluZyBvZiB0aGUgQ29uY2VydCA5NyBib2FyZAogKgogKiBBQzk3X01BU1RFUl9WT0xfU1RFUkVPICAgTGluZSBPdXQKICogQUM5N19NQVNURVJfVk9MX01PTk8gICAgIFRBRCBPdXRwdXQKICogQUM5N19QQ0JFRVBfVk9MICAgICAgICAgIG5vbmUKICogQUM5N19QSE9ORV9WT0wgICAgICAgICAgIFRBRCBJbnB1dCAobW9ubykKICogQUM5N19NSUNfVk9MICAgICAgICAgICAgIE1JQyBJbnB1dCAobW9ubykKICogQUM5N19MSU5FSU5fVk9MICAgICAgICAgIExpbmUgSW5wdXQgKHN0ZXJlbykKICogQUM5N19DRF9WT0wgICAgICAgICAgICAgIENEIElucHV0IChzdGVyZW8pCiAqIEFDOTdfVklERU9fVk9MICAgICAgICAgICBub25lCiAqIEFDOTdfQVVYX1ZPTCAgICAgICAgICAgICBBdXggSW5wdXQgKHN0ZXJlbykKICogQUM5N19QQ01PVVRfVk9MICAgICAgICAgIFdhdmUgT3V0cHV0IChzdGVyZW8pCiAqLwoKc3RhdGljIGludCBlczEzNzFfb3Blbl9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CglzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwoJc3RydWN0IGVzMTM3MV9zdGF0ZSAqczsKCglmb3IgKGxpc3QgPSBkZXZzLm5leHQ7IDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKCQlpZiAobGlzdCA9PSAmZGV2cykKCQkJcmV0dXJuIC1FTk9ERVY7CgkJcyA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGVzMTM3MV9zdGF0ZSwgZGV2cyk7CgkJaWYgKHMtPmNvZGVjLT5kZXZfbWl4ZXIgPT0gbWlub3IpCgkJCWJyZWFrOwoJfQogICAgICAgCVZBTElEQVRFX1NUQVRFKHMpOwoJZmlsZS0+cHJpdmF0ZV9kYXRhID0gczsKCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKfQoKc3RhdGljIGludCBlczEzNzFfcmVsZWFzZV9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCXN0cnVjdCBlczEzNzFfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKCQoJVkFMSURBVEVfU1RBVEUocyk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBlczEzNzFfaW9jdGxfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKewoJc3RydWN0IGVzMTM3MV9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcxX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOwoJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gcy0+Y29kZWM7CgoJcmV0dXJuIG1peGRldl9pb2N0bChjb2RlYywgY21kLCBhcmcpOwp9CgpzdGF0aWMgLypjb25zdCovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXMxMzcxX21peGVyX2ZvcHMgPSB7Cgkub3duZXIJCT0gVEhJU19NT0RVTEUsCgkubGxzZWVrCQk9IG5vX2xsc2VlaywKCS5pb2N0bAkJPSBlczEzNzFfaW9jdGxfbWl4ZGV2LAoJLm9wZW4JCT0gZXMxMzcxX29wZW5fbWl4ZGV2LAoJLnJlbGVhc2UJPSBlczEzNzFfcmVsZWFzZV9taXhkZXYsCn07CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnN0YXRpYyBpbnQgZHJhaW5fZGFjMShzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzLCBpbnQgbm9uYmxvY2spCnsKCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCWludCBjb3VudCwgdG1vOwoJCglpZiAocy0+ZG1hX2RhYzEubWFwcGVkIHx8ICFzLT5kbWFfZGFjMS5yZWFkeSkKCQlyZXR1cm4gMDsKICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYzEud2FpdCwgJndhaXQpOwogICAgICAgIGZvciAoOzspIHsKCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOwoJCWNvdW50ID0gcy0+ZG1hX2RhYzEuY291bnQ7CiAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CgkJaWYgKGNvdW50IDw9IDApCgkJCWJyZWFrOwoJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBpZiAobm9uYmxvY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMxLndhaXQsICZ3YWl0KTsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKICAgICAgICAgICAgICAgIH0KCQl0bW8gPSAzICogSFogKiAoY291bnQgKyBzLT5kbWFfZGFjMS5mcmFnc2l6ZSkgLyAyIC8gcy0+ZGFjMXJhdGU7CgkJdG1vID4+PSBzYW1wbGVfc2hpZnRbKHMtPnNjdHJsICYgU0NUUkxfUDFGTVQpID4+IFNDVFJMX1NIX1AxRk1UXTsKCQlpZiAoIXNjaGVkdWxlX3RpbWVvdXQodG1vICsgMSkpCgkJCURCRyhwcmludGsoS0VSTl9ERUJVRyBQRlggImRhYzEgZG1hIHRpbWVkIG91dD8/XG4iKTspCiAgICAgICAgfQogICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjMS53YWl0LCAmd2FpdCk7CiAgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKICAgICAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAgICAgICAgICAgICAgICByZXR1cm4gLUVSRVNUQVJUU1lTOwogICAgICAgIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IGRyYWluX2RhYzIoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcywgaW50IG5vbmJsb2NrKQp7CglERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CglpbnQgY291bnQsIHRtbzsKCglpZiAocy0+ZG1hX2RhYzIubWFwcGVkIHx8ICFzLT5kbWFfZGFjMi5yZWFkeSkKCQlyZXR1cm4gMDsKICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYzIud2FpdCwgJndhaXQpOwogICAgICAgIGZvciAoOzspIHsKCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CgkJY291bnQgPSBzLT5kbWFfZGFjMi5jb3VudDsKICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKCQlpZiAoY291bnQgPD0gMCkKCQkJYnJlYWs7CgkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGlmIChub25ibG9jaykgewogICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYzIud2FpdCwgJndhaXQpOwogICAgICAgICAgICAgICAgICAgICAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOwogICAgICAgICAgICAgICAgfQoJCXRtbyA9IDMgKiBIWiAqIChjb3VudCArIHMtPmRtYV9kYWMyLmZyYWdzaXplKSAvIDIgLyBzLT5kYWMycmF0ZTsKCQl0bW8gPj49IHNhbXBsZV9zaGlmdFsocy0+c2N0cmwgJiBTQ1RSTF9QMkZNVCkgPj4gU0NUUkxfU0hfUDJGTVRdOwoJCWlmICghc2NoZWR1bGVfdGltZW91dCh0bW8gKyAxKSkKCQkJREJHKHByaW50ayhLRVJOX0RFQlVHIFBGWCAiZGFjMiBkbWEgdGltZWQgb3V0Pz9cbiIpOykKICAgICAgICB9CiAgICAgICAgcmVtb3ZlX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMyLndhaXQsICZ3YWl0KTsKICAgICAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogICAgICAgIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKICAgICAgICAgICAgICAgIHJldHVybiAtRVJFU1RBUlRTWVM7CiAgICAgICAgcmV0dXJuIDA7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIHNzaXplX3QgZXMxMzcxX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQp7CglzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CglERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKCXNzaXplX3QgcmV0ID0gMDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cgl1bnNpZ25lZCBzd3B0cjsKCWludCBjbnQ7CgoJVkFMSURBVEVfU1RBVEUocyk7CglpZiAocy0+ZG1hX2FkYy5tYXBwZWQpCgkJcmV0dXJuIC1FTlhJTzsKCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmZmVyLCBjb3VudCkpCgkJcmV0dXJuIC1FRkFVTFQ7CgltdXRleF9sb2NrKCZzLT5zZW0pOwoJaWYgKCFzLT5kbWFfYWRjLnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1Zl9hZGMocykpKQoJCWdvdG8gb3V0MjsKCQoJYWRkX3dhaXRfcXVldWUoJnMtPmRtYV9hZGMud2FpdCwgJndhaXQpOwoJd2hpbGUgKGNvdW50ID4gMCkgewoJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CgkJc3dwdHIgPSBzLT5kbWFfYWRjLnN3cHRyOwoJCWNudCA9IHMtPmRtYV9hZGMuZG1hc2l6ZS1zd3B0cjsKCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA8IGNudCkKCQkJY250ID0gcy0+ZG1hX2FkYy5jb3VudDsKCQlpZiAoY250IDw9IDApCgkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CgkJaWYgKGNudCA+IGNvdW50KQoJCQljbnQgPSBjb3VudDsKCQlpZiAoY250IDw9IDApIHsKCQkJaWYgKHMtPmRtYV9hZGMuZW5hYmxlZCkKCQkJCXN0YXJ0X2FkYyhzKTsKCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CgkJCQlpZiAoIXJldCkKCQkJCQlyZXQgPSAtRUFHQUlOOwoJCQkJZ290byBvdXQ7CgkJCX0KCQkJbXV0ZXhfdW5sb2NrKCZzLT5zZW0pOwoJCQlzY2hlZHVsZSgpOwoJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKCQkJCWlmICghcmV0KQoJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKCQkJCWdvdG8gb3V0MjsKCQkJfQoJCQltdXRleF9sb2NrKCZzLT5zZW0pOwoJCQlpZiAocy0+ZG1hX2FkYy5tYXBwZWQpCgkJCXsKCQkJCXJldCA9IC1FTlhJTzsKCQkJCWdvdG8gb3V0OwoJCQl9CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgcy0+ZG1hX2FkYy5yYXdidWYgKyBzd3B0ciwgY250KSkgewoJCQlpZiAoIXJldCkKCQkJCXJldCA9IC1FRkFVTFQ7CgkJCWdvdG8gb3V0OwoJCX0KCQlzd3B0ciA9IChzd3B0ciArIGNudCkgJSBzLT5kbWFfYWRjLmRtYXNpemU7CgkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKCQlzLT5kbWFfYWRjLnN3cHRyID0gc3dwdHI7CgkJcy0+ZG1hX2FkYy5jb3VudCAtPSBjbnQ7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOwoJCWNvdW50IC09IGNudDsKCQlidWZmZXIgKz0gY250OwoJCXJldCArPSBjbnQ7CgkJaWYgKHMtPmRtYV9hZGMuZW5hYmxlZCkKCQkJc3RhcnRfYWRjKHMpOwoJfQpvdXQ6CgltdXRleF91bmxvY2soJnMtPnNlbSk7Cm91dDI6CglyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+ZG1hX2FkYy53YWl0LCAmd2FpdCk7CglzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwoJcmV0dXJuIHJldDsKfQoKc3RhdGljIHNzaXplX3QgZXMxMzcxX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKewoJc3RydWN0IGVzMTM3MV9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcxX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOwoJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Cglzc2l6ZV90IHJldDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cgl1bnNpZ25lZCBzd3B0cjsKCWludCBjbnQ7CgoJVkFMSURBVEVfU1RBVEUocyk7CglpZiAocy0+ZG1hX2RhYzIubWFwcGVkKQoJCXJldHVybiAtRU5YSU87CglpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCgkJcmV0dXJuIC1FRkFVTFQ7CgltdXRleF9sb2NrKCZzLT5zZW0pOwoJaWYgKCFzLT5kbWFfZGFjMi5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWZfZGFjMihzKSkpCgkJZ290byBvdXQzOwoJcmV0ID0gMDsKCWFkZF93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjMi53YWl0LCAmd2FpdCk7Cgl3aGlsZSAoY291bnQgPiAwKSB7CgkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKCQlpZiAocy0+ZG1hX2RhYzIuY291bnQgPCAwKSB7CgkJCXMtPmRtYV9kYWMyLmNvdW50ID0gMDsKCQkJcy0+ZG1hX2RhYzIuc3dwdHIgPSBzLT5kbWFfZGFjMi5od3B0cjsKCQl9CgkJc3dwdHIgPSBzLT5kbWFfZGFjMi5zd3B0cjsKCQljbnQgPSBzLT5kbWFfZGFjMi5kbWFzaXplLXN3cHRyOwoJCWlmIChzLT5kbWFfZGFjMi5jb3VudCArIGNudCA+IHMtPmRtYV9kYWMyLmRtYXNpemUpCgkJCWNudCA9IHMtPmRtYV9kYWMyLmRtYXNpemUgLSBzLT5kbWFfZGFjMi5jb3VudDsKCQlpZiAoY250IDw9IDApCgkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CgkJaWYgKGNudCA+IGNvdW50KQoJCQljbnQgPSBjb3VudDsKCQlpZiAoY250IDw9IDApIHsKCQkJaWYgKHMtPmRtYV9kYWMyLmVuYWJsZWQpCgkJCQlzdGFydF9kYWMyKHMpOwoJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKCQkJCWlmICghcmV0KQoJCQkJCXJldCA9IC1FQUdBSU47CgkJCQlnb3RvIG91dDsKCQkJfQkKCQkJbXV0ZXhfdW5sb2NrKCZzLT5zZW0pOwoJCQlzY2hlZHVsZSgpOwoJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKCQkJCWlmICghcmV0KQoJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKCQkJCWdvdG8gb3V0MjsKCQkJfQoJCQltdXRleF9sb2NrKCZzLT5zZW0pOwoJCQlpZiAocy0+ZG1hX2RhYzIubWFwcGVkKQoJCQl7CgkJCQlyZXQgPSAtRU5YSU87CgkJCQlnb3RvIG91dDsKCQkJfQoJCQljb250aW51ZTsKCQl9CgkJaWYgKGNvcHlfZnJvbV91c2VyKHMtPmRtYV9kYWMyLnJhd2J1ZiArIHN3cHRyLCBidWZmZXIsIGNudCkpIHsKCQkJaWYgKCFyZXQpCgkJCQlyZXQgPSAtRUZBVUxUOwoJCQlnb3RvIG91dDsKCQl9CgkJc3dwdHIgPSAoc3dwdHIgKyBjbnQpICUgcy0+ZG1hX2RhYzIuZG1hc2l6ZTsKCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOwoJCXMtPmRtYV9kYWMyLnN3cHRyID0gc3dwdHI7CgkJcy0+ZG1hX2RhYzIuY291bnQgKz0gY250OwoJCXMtPmRtYV9kYWMyLmVuZGNsZWFyZWQgPSAwOwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKCQljb3VudCAtPSBjbnQ7CgkJYnVmZmVyICs9IGNudDsKCQlyZXQgKz0gY250OwoJCWlmIChzLT5kbWFfZGFjMi5lbmFibGVkKQoJCQlzdGFydF9kYWMyKHMpOwoJfQpvdXQ6CgltdXRleF91bmxvY2soJnMtPnNlbSk7Cm91dDI6CglyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYzIud2FpdCwgJndhaXQpOwpvdXQzOgkKCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CglyZXR1cm4gcmV0Owp9CgovKiBObyBrZXJuZWwgbG9jayAtIHdlIGhhdmUgb3VyIG93biBzcGlubG9jayAqLwpzdGF0aWMgdW5zaWduZWQgaW50IGVzMTM3MV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCnsKCXN0cnVjdCBlczEzNzFfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cgl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CgoJVkFMSURBVEVfU1RBVEUocyk7CglpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKCQlpZiAoIXMtPmRtYV9kYWMyLnJlYWR5ICYmIHByb2dfZG1hYnVmX2RhYzIocykpCgkJCXJldHVybiAwOwoJCXBvbGxfd2FpdChmaWxlLCAmcy0+ZG1hX2RhYzIud2FpdCwgd2FpdCk7Cgl9CglpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewoJCWlmICghcy0+ZG1hX2FkYy5yZWFkeSAmJiBwcm9nX2RtYWJ1Zl9hZGMocykpCgkJCXJldHVybiAwOwoJCXBvbGxfd2FpdChmaWxlLCAmcy0+ZG1hX2FkYy53YWl0LCB3YWl0KTsKCX0KCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CgllczEzNzFfdXBkYXRlX3B0cihzKTsKCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CgkJCWlmIChzLT5kbWFfYWRjLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2FkYy5mcmFnc2l6ZSkKCQkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKCX0KCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewoJCWlmIChzLT5kbWFfZGFjMi5tYXBwZWQpIHsKCQkJaWYgKHMtPmRtYV9kYWMyLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2RhYzIuZnJhZ3NpemUpIAoJCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKCQl9IGVsc2UgewoJCQlpZiAoKHNpZ25lZClzLT5kbWFfZGFjMi5kbWFzaXplID49IHMtPmRtYV9kYWMyLmNvdW50ICsgKHNpZ25lZClzLT5kbWFfZGFjMi5mcmFnc2l6ZSkKCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CgkJfQoJfQoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOwoJcmV0dXJuIG1hc2s7Cn0KCnN0YXRpYyBpbnQgZXMxMzcxX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQp7CglzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CglzdHJ1Y3QgZG1hYnVmICpkYjsKCWludCByZXQgPSAwOwoJdW5zaWduZWQgbG9uZyBzaXplOwoKCVZBTElEQVRFX1NUQVRFKHMpOwoJbG9ja19rZXJuZWwoKTsKCW11dGV4X2xvY2soJnMtPnNlbSk7CgkKCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpIHsKCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2RhYzIocykpICE9IDApIHsKCQkJZ290byBvdXQ7CgkJfQoJCWRiID0gJnMtPmRtYV9kYWMyOwoJfSBlbHNlIGlmICh2bWEtPnZtX2ZsYWdzICYgVk1fUkVBRCkgewoJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfYWRjKHMpKSAhPSAwKSB7CgkJCWdvdG8gb3V0OwoJCX0KCQlkYiA9ICZzLT5kbWFfYWRjOwoJfSBlbHNlIHsKCQlyZXQgPSAtRUlOVkFMOwoJCWdvdG8gb3V0OwoJfQoJaWYgKHZtYS0+dm1fcGdvZmYgIT0gMCkgewoJCXJldCA9IC1FSU5WQUw7CgkJZ290byBvdXQ7Cgl9CglzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OwoJaWYgKHNpemUgPiAoUEFHRV9TSVpFIDw8IGRiLT5idWZvcmRlcikpIHsKCQlyZXQgPSAtRUlOVkFMOwoJCWdvdG8gb3V0OwoJfQoJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCgkJCQl2aXJ0X3RvX3BoeXMoZGItPnJhd2J1ZikgPj4gUEFHRV9TSElGVCwKCQkJCXNpemUsIHZtYS0+dm1fcGFnZV9wcm90KSkgewoJCXJldCA9IC1FQUdBSU47CgkJZ290byBvdXQ7Cgl9CglkYi0+bWFwcGVkID0gMTsKb3V0OgoJbXV0ZXhfdW5sb2NrKCZzLT5zZW0pOwoJdW5sb2NrX2tlcm5lbCgpOwoJcmV0dXJuIHJldDsKfQoKc3RhdGljIGludCBlczEzNzFfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQp7CglzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwogICAgICAgIGF1ZGlvX2J1Zl9pbmZvIGFiaW5mbzsKICAgICAgICBjb3VudF9pbmZvIGNpbmZvOwoJaW50IGNvdW50OwoJaW50IHZhbCwgbWFwcGVkLCByZXQ7Cgl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKCWludCBfX3VzZXIgKnAgPSBhcmdwOwoKCVZBTElEQVRFX1NUQVRFKHMpOwogICAgICAgIG1hcHBlZCA9ICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIHMtPmRtYV9kYWMyLm1hcHBlZCkgfHwKCQkoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpICYmIHMtPmRtYV9hZGMubWFwcGVkKTsKCXN3aXRjaCAoY21kKSB7CgljYXNlIE9TU19HRVRWRVJTSU9OOgoJCXJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCBwKTsKCgljYXNlIFNORENUTF9EU1BfU1lOQzoKCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCgkJCXJldHVybiBkcmFpbl9kYWMyKHMsIDAvKmZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKi8pOwoJCXJldHVybiAwOwoJCQoJY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKCQlyZXR1cm4gMDsKCgljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKCQlyZXR1cm4gcHV0X3VzZXIoRFNQX0NBUF9EVVBMRVggfCBEU1BfQ0FQX1JFQUxUSU1FIHwgRFNQX0NBUF9UUklHR0VSIHwgRFNQX0NBUF9NTUFQLCBwKTsKCQkKICAgICAgICBjYXNlIFNORENUTF9EU1BfUkVTRVQ6CgkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CgkJCXN0b3BfZGFjMihzKTsKCQkJc3luY2hyb25pemVfaXJxKHMtPmlycSk7CgkJCXMtPmRtYV9kYWMyLnN3cHRyID0gcy0+ZG1hX2RhYzIuaHdwdHIgPSBzLT5kbWFfZGFjMi5jb3VudCA9IHMtPmRtYV9kYWMyLnRvdGFsX2J5dGVzID0gMDsKCQl9CgkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKCQkJc3RvcF9hZGMocyk7CgkJCXN5bmNocm9uaXplX2lycShzLT5pcnEpOwoJCQlzLT5kbWFfYWRjLnN3cHRyID0gcy0+ZG1hX2FkYy5od3B0ciA9IHMtPmRtYV9hZGMuY291bnQgPSBzLT5kbWFfYWRjLnRvdGFsX2J5dGVzID0gMDsKCQl9CgkJcmV0dXJuIDA7CgogICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TUEVFRDoKICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcih2YWwsIHApKQoJCQlyZXR1cm4gLUVGQVVMVDsKCQlpZiAodmFsID49IDApIHsKCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKCQkJCXN0b3BfYWRjKHMpOwoJCQkJcy0+ZG1hX2FkYy5yZWFkeSA9IDA7CgkJCQlzZXRfYWRjX3JhdGUocywgdmFsKTsKCQkJfQoJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKCQkJCXN0b3BfZGFjMihzKTsKCQkJCXMtPmRtYV9kYWMyLnJlYWR5ID0gMDsKCQkJCXNldF9kYWMyX3JhdGUocywgdmFsKTsKCQkJfQoJCX0KCQlyZXR1cm4gcHV0X3VzZXIoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gcy0+YWRjcmF0ZSA6IHMtPmRhYzJyYXRlLCBwKTsKCiAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CgkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKCQkJc3RvcF9hZGMocyk7CgkJCXMtPmRtYV9hZGMucmVhZHkgPSAwOwoJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOwoJCQlpZiAodmFsKQoJCQkJcy0+c2N0cmwgfD0gU0NUUkxfUjFTTUI7CgkJCWVsc2UKCQkJCXMtPnNjdHJsICY9IH5TQ1RSTF9SMVNNQjsKCQkJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcxX1JFR19TRVJJQUxfQ09OVFJPTCk7CgkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKCQl9CgkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CgkJCXN0b3BfZGFjMihzKTsKCQkJcy0+ZG1hX2RhYzIucmVhZHkgPSAwOwoJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOwoJCQlpZiAodmFsKQoJCQkJcy0+c2N0cmwgfD0gU0NUUkxfUDJTTUI7CgkJCWVsc2UKCQkJCXMtPnNjdHJsICY9IH5TQ1RSTF9QMlNNQjsKCQkJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcxX1JFR19TRVJJQUxfQ09OVFJPTCk7CgkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKICAgICAgICAgICAgICAgIH0KCQlyZXR1cm4gMDsKCiAgICAgICAgY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgogICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCgkJCXJldHVybiAtRUZBVUxUOwoJCWlmICh2YWwgIT0gMCkgewoJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewoJCQkJc3RvcF9hZGMocyk7CgkJCQlzLT5kbWFfYWRjLnJlYWR5ID0gMDsKCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CgkJCQlpZiAodmFsID49IDIpCgkJCQkJcy0+c2N0cmwgfD0gU0NUUkxfUjFTTUI7CgkJCQllbHNlCgkJCQkJcy0+c2N0cmwgJj0gflNDVFJMX1IxU01COwoJCQkJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcxX1JFR19TRVJJQUxfQ09OVFJPTCk7CgkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CgkJCX0KCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CgkJCQlzdG9wX2RhYzIocyk7CgkJCQlzLT5kbWFfZGFjMi5yZWFkeSA9IDA7CgkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOwoJCQkJaWYgKHZhbCA+PSAyKQoJCQkJCXMtPnNjdHJsIHw9IFNDVFJMX1AyU01COwoJCQkJZWxzZQoJCQkJCXMtPnNjdHJsICY9IH5TQ1RSTF9QMlNNQjsKCQkJCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MV9SRUdfU0VSSUFMX0NPTlRST0wpOwoJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOwoJCQl9CgkJfQoJCXJldHVybiBwdXRfdXNlcigocy0+c2N0cmwgJiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gU0NUUkxfUjFTTUIgOiBTQ1RSTF9QMlNNQikpID8gMiA6IDEsIHApOwoJCQoJY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6IC8qIFJldHVybnMgYSBtYXNrICovCiAgICAgICAgICAgICAgICByZXR1cm4gcHV0X3VzZXIoQUZNVF9TMTZfTEV8QUZNVF9VOCwgcCk7CgkJCgljYXNlIFNORENUTF9EU1BfU0VURk1UOiAvKiBTZWxlY3RzIE9ORSBmbXQqLwoJCWlmIChnZXRfdXNlcih2YWwsIHApKQoJCQlyZXR1cm4gLUVGQVVMVDsKCQlpZiAodmFsICE9IEFGTVRfUVVFUlkpIHsKCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKCQkJCXN0b3BfYWRjKHMpOwoJCQkJcy0+ZG1hX2FkYy5yZWFkeSA9IDA7CgkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOwoJCQkJaWYgKHZhbCA9PSBBRk1UX1MxNl9MRSkKCQkJCQlzLT5zY3RybCB8PSBTQ1RSTF9SMVNFQjsKCQkJCWVsc2UKCQkJCQlzLT5zY3RybCAmPSB+U0NUUkxfUjFTRUI7CgkJCQlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzFfUkVHX1NFUklBTF9DT05UUk9MKTsKCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKCQkJfQoJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKCQkJCXN0b3BfZGFjMihzKTsKCQkJCXMtPmRtYV9kYWMyLnJlYWR5ID0gMDsKCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CgkJCQlpZiAodmFsID09IEFGTVRfUzE2X0xFKQoJCQkJCXMtPnNjdHJsIHw9IFNDVFJMX1AyU0VCOwoJCQkJZWxzZQoJCQkJCXMtPnNjdHJsICY9IH5TQ1RSTF9QMlNFQjsKCQkJCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MV9SRUdfU0VSSUFMX0NPTlRST0wpOwoJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOwoJCQl9CgkJfQoJCXJldHVybiBwdXRfdXNlcigocy0+c2N0cmwgJiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gU0NUUkxfUjFTRUIgOiBTQ1RSTF9QMlNFQikpID8gCgkJCQlBRk1UX1MxNl9MRSA6IEFGTVRfVTgsIHApOwoJCQoJY2FzZSBTTkRDVExfRFNQX1BPU1Q6CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKCiAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVFRSSUdHRVI6CgkJdmFsID0gMDsKCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCAmJiBzLT5jdHJsICYgQ1RSTF9BRENfRU4pIAoJCQl2YWwgfD0gUENNX0VOQUJMRV9JTlBVVDsKCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgJiYgcy0+Y3RybCAmIENUUkxfREFDMl9FTikgCgkJCXZhbCB8PSBQQ01fRU5BQkxFX09VVFBVVDsKCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKCQkKCWNhc2UgU05EQ1RMX0RTUF9TRVRUUklHR0VSOgoJCWlmIChnZXRfdXNlcih2YWwsIHApKQoJCQlyZXR1cm4gLUVGQVVMVDsKCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewoJCQlpZiAodmFsICYgUENNX0VOQUJMRV9JTlBVVCkgewoJCQkJaWYgKCFzLT5kbWFfYWRjLnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1Zl9hZGMocykpKQoJCQkJCXJldHVybiByZXQ7CgkJCQlzLT5kbWFfYWRjLmVuYWJsZWQgPSAxOwoJCQkJc3RhcnRfYWRjKHMpOwoJCQl9IGVsc2UgewoJCQkJcy0+ZG1hX2FkYy5lbmFibGVkID0gMDsKCQkJCXN0b3BfYWRjKHMpOwoJCQl9CgkJfQoJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewoJCQlpZiAodmFsICYgUENNX0VOQUJMRV9PVVRQVVQpIHsKCQkJCWlmICghcy0+ZG1hX2RhYzIucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmX2RhYzIocykpKQoJCQkJCXJldHVybiByZXQ7CgkJCQlzLT5kbWFfZGFjMi5lbmFibGVkID0gMTsKCQkJCXN0YXJ0X2RhYzIocyk7CgkJCX0gZWxzZSB7CgkJCQlzLT5kbWFfZGFjMi5lbmFibGVkID0gMDsKCQkJCXN0b3BfZGFjMihzKTsKCQkJfQoJCX0KCQlyZXR1cm4gMDsKCgljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgoJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKCQkJcmV0dXJuIC1FSU5WQUw7CgkJaWYgKCFzLT5kbWFfZGFjMi5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfZGFjMihzKSkgIT0gMCkKCQkJcmV0dXJuIHZhbDsKCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOwoJCWVzMTM3MV91cGRhdGVfcHRyKHMpOwoJCWFiaW5mby5mcmFnc2l6ZSA9IHMtPmRtYV9kYWMyLmZyYWdzaXplOwoJCWNvdW50ID0gcy0+ZG1hX2RhYzIuY291bnQ7CgkJaWYgKGNvdW50IDwgMCkKCQkJY291bnQgPSAwOwogICAgICAgICAgICAgICAgYWJpbmZvLmJ5dGVzID0gcy0+ZG1hX2RhYzIuZG1hc2l6ZSAtIGNvdW50OwogICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdzdG90YWwgPSBzLT5kbWFfZGFjMi5udW1mcmFnOwogICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBzLT5kbWFfZGFjMi5mcmFnc2hpZnQ7ICAgICAgCgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOwoJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7CgoJY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKCQkJcmV0dXJuIC1FSU5WQUw7CgkJaWYgKCFzLT5kbWFfYWRjLnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9hZGMocykpICE9IDApCgkJCXJldHVybiB2YWw7CgkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKCQllczEzNzFfdXBkYXRlX3B0cihzKTsKCQlhYmluZm8uZnJhZ3NpemUgPSBzLT5kbWFfYWRjLmZyYWdzaXplOwoJCWNvdW50ID0gcy0+ZG1hX2FkYy5jb3VudDsKCQlpZiAoY291bnQgPCAwKQoJCQljb3VudCA9IDA7CiAgICAgICAgICAgICAgICBhYmluZm8uYnl0ZXMgPSBjb3VudDsKICAgICAgICAgICAgICAgIGFiaW5mby5mcmFnc3RvdGFsID0gcy0+ZG1hX2FkYy5udW1mcmFnOwogICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBzLT5kbWFfYWRjLmZyYWdzaGlmdDsgICAgICAKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CgkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLCBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKCQkKICAgICAgICBjYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6CiAgICAgICAgICAgICAgICBmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKCiAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCgkJCXJldHVybiAtRUlOVkFMOwoJCWlmICghcy0+ZG1hX2RhYzIucmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmX2RhYzIocykpICE9IDApCgkJCXJldHVybiB2YWw7CgkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKCQllczEzNzFfdXBkYXRlX3B0cihzKTsKICAgICAgICAgICAgICAgIGNvdW50ID0gcy0+ZG1hX2RhYzIuY291bnQ7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOwoJCWlmIChjb3VudCA8IDApCgkJCWNvdW50ID0gMDsKCQlyZXR1cm4gcHV0X3VzZXIoY291bnQsIHApOwoKICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUSVBUUjoKCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKCQkJcmV0dXJuIC1FSU5WQUw7CgkJaWYgKCFzLT5kbWFfYWRjLnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9hZGMocykpICE9IDApCgkJCXJldHVybiB2YWw7CgkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKCQllczEzNzFfdXBkYXRlX3B0cihzKTsKICAgICAgICAgICAgICAgIGNpbmZvLmJ5dGVzID0gcy0+ZG1hX2FkYy50b3RhbF9ieXRlczsKCQljb3VudCA9IHMtPmRtYV9hZGMuY291bnQ7CgkJaWYgKGNvdW50IDwgMCkKCQkJY291bnQgPSAwOwogICAgICAgICAgICAgICAgY2luZm8uYmxvY2tzID0gY291bnQgPj4gcy0+ZG1hX2FkYy5mcmFnc2hpZnQ7CiAgICAgICAgICAgICAgICBjaW5mby5wdHIgPSBzLT5kbWFfYWRjLmh3cHRyOwoJCWlmIChzLT5kbWFfYWRjLm1hcHBlZCkKCQkJcy0+ZG1hX2FkYy5jb3VudCAmPSBzLT5kbWFfYWRjLmZyYWdzaXplLTE7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOwoJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YoY2luZm8pKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CgkJcmV0dXJuIDA7CgogICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgoJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKCQkJcmV0dXJuIC1FSU5WQUw7CgkJaWYgKCFzLT5kbWFfZGFjMi5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfZGFjMihzKSkgIT0gMCkKCQkJcmV0dXJuIHZhbDsKCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOwoJCWVzMTM3MV91cGRhdGVfcHRyKHMpOwogICAgICAgICAgICAgICAgY2luZm8uYnl0ZXMgPSBzLT5kbWFfZGFjMi50b3RhbF9ieXRlczsKCQljb3VudCA9IHMtPmRtYV9kYWMyLmNvdW50OwoJCWlmIChjb3VudCA8IDApCgkJCWNvdW50ID0gMDsKICAgICAgICAgICAgICAgIGNpbmZvLmJsb2NrcyA9IGNvdW50ID4+IHMtPmRtYV9kYWMyLmZyYWdzaGlmdDsKICAgICAgICAgICAgICAgIGNpbmZvLnB0ciA9IHMtPmRtYV9kYWMyLmh3cHRyOwoJCWlmIChzLT5kbWFfZGFjMi5tYXBwZWQpCgkJCXMtPmRtYV9kYWMyLmNvdW50ICY9IHMtPmRtYV9kYWMyLmZyYWdzaXplLTE7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOwoJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YoY2luZm8pKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CgkJcmV0dXJuIDA7CgogICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgoJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewoJCQlpZiAoKHZhbCA9IHByb2dfZG1hYnVmX2RhYzIocykpKQoJCQkJcmV0dXJuIHZhbDsKCQkJcmV0dXJuIHB1dF91c2VyKHMtPmRtYV9kYWMyLmZyYWdzaXplLCBwKTsKCQl9CgkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1Zl9hZGMocykpKQoJCQlyZXR1cm4gdmFsOwoJCXJldHVybiBwdXRfdXNlcihzLT5kbWFfYWRjLmZyYWdzaXplLCBwKTsKCiAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgogICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCgkJCXJldHVybiAtRUZBVUxUOwoJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CgkJCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOwoJCQlzLT5kbWFfYWRjLm9zc21heGZyYWdzID0gKHZhbCA+PiAxNikgJiAweGZmZmY7CgkJCWlmIChzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA8IDQpCgkJCQlzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA9IDQ7CgkJCWlmIChzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA+IDE1KQoJCQkJcy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPSAxNTsKCQkJaWYgKHMtPmRtYV9hZGMub3NzbWF4ZnJhZ3MgPCA0KQoJCQkJcy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA9IDQ7CgkJfQoJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewoJCQlzLT5kbWFfZGFjMi5vc3NmcmFnc2hpZnQgPSB2YWwgJiAweGZmZmY7CgkJCXMtPmRtYV9kYWMyLm9zc21heGZyYWdzID0gKHZhbCA+PiAxNikgJiAweGZmZmY7CgkJCWlmIChzLT5kbWFfZGFjMi5vc3NmcmFnc2hpZnQgPCA0KQoJCQkJcy0+ZG1hX2RhYzIub3NzZnJhZ3NoaWZ0ID0gNDsKCQkJaWYgKHMtPmRtYV9kYWMyLm9zc2ZyYWdzaGlmdCA+IDE1KQoJCQkJcy0+ZG1hX2RhYzIub3NzZnJhZ3NoaWZ0ID0gMTU7CgkJCWlmIChzLT5kbWFfZGFjMi5vc3NtYXhmcmFncyA8IDQpCgkJCQlzLT5kbWFfZGFjMi5vc3NtYXhmcmFncyA9IDQ7CgkJfQoJCXJldHVybiAwOwoKICAgICAgICBjYXNlIFNORENUTF9EU1BfU1VCRElWSURFOgoJCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCAmJiBzLT5kbWFfYWRjLnN1YmRpdmlzaW9uKSB8fAoJCSAgICAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgJiYgcy0+ZG1hX2RhYzIuc3ViZGl2aXNpb24pKQoJCQlyZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcih2YWwsIHApKQoJCQlyZXR1cm4gLUVGQVVMVDsKCQlpZiAodmFsICE9IDEgJiYgdmFsICE9IDIgJiYgdmFsICE9IDQpCgkJCXJldHVybiAtRUlOVkFMOwoJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQoJCQlzLT5kbWFfYWRjLnN1YmRpdmlzaW9uID0gdmFsOwoJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKCQkJcy0+ZG1hX2RhYzIuc3ViZGl2aXNpb24gPSB2YWw7CgkJcmV0dXJuIDA7CgogICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfUkFURToKCQlyZXR1cm4gcHV0X3VzZXIoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gcy0+YWRjcmF0ZSA6IHMtPmRhYzJyYXRlLCBwKTsKCiAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKCQlyZXR1cm4gcHV0X3VzZXIoKHMtPnNjdHJsICYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/IFNDVFJMX1IxU01CIDogU0NUUkxfUDJTTUIpKSA/IDIgOiAxLCBwKTsKCQkKICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6CgkJcmV0dXJuIHB1dF91c2VyKChzLT5zY3RybCAmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPyBTQ1RSTF9SMVNFQiA6IFNDVFJMX1AyU0VCKSkgPyAxNiA6IDgsIHApOwoKICAgICAgICBjYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6CiAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVFNZTkNSTzoKICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0ZJTFRFUjoKICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwoJCQoJfQoJcmV0dXJuIG1peGRldl9pb2N0bChzLT5jb2RlYywgY21kLCBhcmcpOwp9CgpzdGF0aWMgaW50IGVzMTM3MV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOwoJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKCXN0cnVjdCBlczEzNzFfc3RhdGUgKnM7CgoJZm9yIChsaXN0ID0gZGV2cy5uZXh0OyA7IGxpc3QgPSBsaXN0LT5uZXh0KSB7CgkJaWYgKGxpc3QgPT0gJmRldnMpCgkJCXJldHVybiAtRU5PREVWOwoJCXMgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBlczEzNzFfc3RhdGUsIGRldnMpOwoJCWlmICghKChzLT5kZXZfYXVkaW8gXiBtaW5vcikgJiB+MHhmKSkKCQkJYnJlYWs7Cgl9CiAgICAgICAJVkFMSURBVEVfU1RBVEUocyk7CglmaWxlLT5wcml2YXRlX2RhdGEgPSBzOwoJLyogd2FpdCBmb3IgZGV2aWNlIHRvIGJlY29tZSBmcmVlICovCgltdXRleF9sb2NrKCZzLT5vcGVuX211dGV4KTsKCXdoaWxlIChzLT5vcGVuX21vZGUgJiBmaWxlLT5mX21vZGUpIHsKCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKCQkJbXV0ZXhfdW5sb2NrKCZzLT5vcGVuX211dGV4KTsKCQkJcmV0dXJuIC1FQlVTWTsKCQl9CgkJYWRkX3dhaXRfcXVldWUoJnMtPm9wZW5fd2FpdCwgJndhaXQpOwoJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKCQltdXRleF91bmxvY2soJnMtPm9wZW5fbXV0ZXgpOwoJCXNjaGVkdWxlKCk7CgkJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPm9wZW5fd2FpdCwgJndhaXQpOwoJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CgkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQoJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwoJCW11dGV4X2xvY2soJnMtPm9wZW5fbXV0ZXgpOwoJfQoJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKCQlzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA9IHMtPmRtYV9hZGMub3NzbWF4ZnJhZ3MgPSBzLT5kbWFfYWRjLnN1YmRpdmlzaW9uID0gMDsKCQlzLT5kbWFfYWRjLmVuYWJsZWQgPSAxOwoJCXNldF9hZGNfcmF0ZShzLCA4MDAwKTsKCX0KCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewoJCXMtPmRtYV9kYWMyLm9zc2ZyYWdzaGlmdCA9IHMtPmRtYV9kYWMyLm9zc21heGZyYWdzID0gcy0+ZG1hX2RhYzIuc3ViZGl2aXNpb24gPSAwOwoJCXMtPmRtYV9kYWMyLmVuYWJsZWQgPSAxOwoJCXNldF9kYWMyX3JhdGUocywgODAwMCk7Cgl9CglzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOwoJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKCQlzLT5zY3RybCAmPSB+U0NUUkxfUjFGTVQ7CgkJaWYgKChtaW5vciAmIDB4ZikgPT0gU05EX0RFVl9EU1AxNikKCQkJcy0+c2N0cmwgfD0gRVMxMzcxX0ZNVF9TMTZfTU9OTyA8PCBTQ1RSTF9TSF9SMUZNVDsKCQllbHNlCgkJCXMtPnNjdHJsIHw9IEVTMTM3MV9GTVRfVThfTU9OTyA8PCBTQ1RSTF9TSF9SMUZNVDsKCX0KCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewoJCXMtPnNjdHJsICY9IH5TQ1RSTF9QMkZNVDsKCQlpZiAoKG1pbm9yICYgMHhmKSA9PSBTTkRfREVWX0RTUDE2KQoJCQlzLT5zY3RybCB8PSBFUzEzNzFfRk1UX1MxNl9NT05PIDw8IFNDVFJMX1NIX1AyRk1UOwoJCWVsc2UKCQkJcy0+c2N0cmwgfD0gRVMxMzcxX0ZNVF9VOF9NT05PIDw8IFNDVFJMX1NIX1AyRk1UOwoJfQoJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcxX1JFR19TRVJJQUxfQ09OVFJPTCk7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CglzLT5vcGVuX21vZGUgfD0gZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSk7CgltdXRleF91bmxvY2soJnMtPm9wZW5fbXV0ZXgpOwoJbXV0ZXhfaW5pdCgmcy0+c2VtKTsKCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKfQoKc3RhdGljIGludCBlczEzNzFfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJc3RydWN0IGVzMTM3MV9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcxX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOwoKCVZBTElEQVRFX1NUQVRFKHMpOwoJbG9ja19rZXJuZWwoKTsKCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKCQlkcmFpbl9kYWMyKHMsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKCW11dGV4X2xvY2soJnMtPm9wZW5fbXV0ZXgpOwoJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CgkJc3RvcF9kYWMyKHMpOwoJCWRlYWxsb2NfZG1hYnVmKHMsICZzLT5kbWFfZGFjMik7Cgl9CglpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewoJCXN0b3BfYWRjKHMpOwoJCWRlYWxsb2NfZG1hYnVmKHMsICZzLT5kbWFfYWRjKTsKCX0KCXMtPm9wZW5fbW9kZSAmPSB+KGZpbGUtPmZfbW9kZSAmIChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKSk7CgltdXRleF91bmxvY2soJnMtPm9wZW5fbXV0ZXgpOwoJd2FrZV91cCgmcy0+b3Blbl93YWl0KTsKCXVubG9ja19rZXJuZWwoKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgLypjb25zdCovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXMxMzcxX2F1ZGlvX2ZvcHMgPSB7Cgkub3duZXIJCT0gVEhJU19NT0RVTEUsCgkubGxzZWVrCQk9IG5vX2xsc2VlaywKCS5yZWFkCQk9IGVzMTM3MV9yZWFkLAoJLndyaXRlCQk9IGVzMTM3MV93cml0ZSwKCS5wb2xsCQk9IGVzMTM3MV9wb2xsLAoJLmlvY3RsCQk9IGVzMTM3MV9pb2N0bCwKCS5tbWFwCQk9IGVzMTM3MV9tbWFwLAoJLm9wZW4JCT0gZXMxMzcxX29wZW4sCgkucmVsZWFzZQk9IGVzMTM3MV9yZWxlYXNlLAp9OwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgc3NpemVfdCBlczEzNzFfd3JpdGVfZGFjKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKewoJc3RydWN0IGVzMTM3MV9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcxX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOwoJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Cglzc2l6ZV90IHJldCA9IDA7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJdW5zaWduZWQgc3dwdHI7CglpbnQgY250OwoKCVZBTElEQVRFX1NUQVRFKHMpOwoJaWYgKHMtPmRtYV9kYWMxLm1hcHBlZCkKCQlyZXR1cm4gLUVOWElPOwoJaWYgKCFzLT5kbWFfZGFjMS5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWZfZGFjMShzKSkpCgkJcmV0dXJuIHJldDsKCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkKCQlyZXR1cm4gLUVGQVVMVDsKCWFkZF93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjMS53YWl0LCAmd2FpdCk7Cgl3aGlsZSAoY291bnQgPiAwKSB7CgkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKCQlpZiAocy0+ZG1hX2RhYzEuY291bnQgPCAwKSB7CgkJCXMtPmRtYV9kYWMxLmNvdW50ID0gMDsKCQkJcy0+ZG1hX2RhYzEuc3dwdHIgPSBzLT5kbWFfZGFjMS5od3B0cjsKCQl9CgkJc3dwdHIgPSBzLT5kbWFfZGFjMS5zd3B0cjsKCQljbnQgPSBzLT5kbWFfZGFjMS5kbWFzaXplLXN3cHRyOwoJCWlmIChzLT5kbWFfZGFjMS5jb3VudCArIGNudCA+IHMtPmRtYV9kYWMxLmRtYXNpemUpCgkJCWNudCA9IHMtPmRtYV9kYWMxLmRtYXNpemUgLSBzLT5kbWFfZGFjMS5jb3VudDsKCQlpZiAoY250IDw9IDApCgkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CgkJaWYgKGNudCA+IGNvdW50KQoJCQljbnQgPSBjb3VudDsKCQlpZiAoY250IDw9IDApIHsKCQkJaWYgKHMtPmRtYV9kYWMxLmVuYWJsZWQpCgkJCQlzdGFydF9kYWMxKHMpOwoJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKCQkJCWlmICghcmV0KQoJCQkJCXJldCA9IC1FQUdBSU47CgkJCQlicmVhazsKCQkJfQoJCQlzY2hlZHVsZSgpOwoJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKCQkJCWlmICghcmV0KQoJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKCQkJCWJyZWFrOwoJCQl9CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoY29weV9mcm9tX3VzZXIocy0+ZG1hX2RhYzEucmF3YnVmICsgc3dwdHIsIGJ1ZmZlciwgY250KSkgewoJCQlpZiAoIXJldCkKCQkJCXJldCA9IC1FRkFVTFQ7CgkJCWJyZWFrOwoJCX0KCQlzd3B0ciA9IChzd3B0ciArIGNudCkgJSBzLT5kbWFfZGFjMS5kbWFzaXplOwoJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CgkJcy0+ZG1hX2RhYzEuc3dwdHIgPSBzd3B0cjsKCQlzLT5kbWFfZGFjMS5jb3VudCArPSBjbnQ7CgkJcy0+ZG1hX2RhYzEuZW5kY2xlYXJlZCA9IDA7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOwoJCWNvdW50IC09IGNudDsKCQlidWZmZXIgKz0gY250OwoJCXJldCArPSBjbnQ7CgkJaWYgKHMtPmRtYV9kYWMxLmVuYWJsZWQpCgkJCXN0YXJ0X2RhYzEocyk7Cgl9CglyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYzEud2FpdCwgJndhaXQpOwoJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKCXJldHVybiByZXQ7Cn0KCi8qIE5vIGtlcm5lbCBsb2NrIC0gd2UgaGF2ZSBvdXIgb3duIHNwaW5sb2NrICovCnN0YXRpYyB1bnNpZ25lZCBpbnQgZXMxMzcxX3BvbGxfZGFjKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCnsKCXN0cnVjdCBlczEzNzFfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cgl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CgoJVkFMSURBVEVfU1RBVEUocyk7CglpZiAoIXMtPmRtYV9kYWMxLnJlYWR5ICYmIHByb2dfZG1hYnVmX2RhYzEocykpCgkJcmV0dXJuIDA7Cglwb2xsX3dhaXQoZmlsZSwgJnMtPmRtYV9kYWMxLndhaXQsIHdhaXQpOwoJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKCWVzMTM3MV91cGRhdGVfcHRyKHMpOwoJaWYgKHMtPmRtYV9kYWMxLm1hcHBlZCkgewoJCWlmIChzLT5kbWFfZGFjMS5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9kYWMxLmZyYWdzaXplKQoJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOwoJfSBlbHNlIHsKCQlpZiAoKHNpZ25lZClzLT5kbWFfZGFjMS5kbWFzaXplID49IHMtPmRtYV9kYWMxLmNvdW50ICsgKHNpZ25lZClzLT5kbWFfZGFjMS5mcmFnc2l6ZSkKCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKCX0KCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKCXJldHVybiBtYXNrOwp9CgpzdGF0aWMgaW50IGVzMTM3MV9tbWFwX2RhYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCnsKCXN0cnVjdCBlczEzNzFfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKCWludCByZXQ7Cgl1bnNpZ25lZCBsb25nIHNpemU7CgoJVkFMSURBVEVfU1RBVEUocyk7CglpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpKQoJCXJldHVybiAtRUlOVkFMOwoJbG9ja19rZXJuZWwoKTsKCWlmICgocmV0ID0gcHJvZ19kbWFidWZfZGFjMShzKSkgIT0gMCkKCQlnb3RvIG91dDsKCXJldCA9IC1FSU5WQUw7CglpZiAodm1hLT52bV9wZ29mZiAhPSAwKQoJCWdvdG8gb3V0OwoJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKCWlmIChzaXplID4gKFBBR0VfU0laRSA8PCBzLT5kbWFfZGFjMS5idWZvcmRlcikpCgkJZ290byBvdXQ7CglyZXQgPSAtRUFHQUlOOwoJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCgkJCXZpcnRfdG9fcGh5cyhzLT5kbWFfZGFjMS5yYXdidWYpID4+IFBBR0VfU0hJRlQsCgkJCXNpemUsIHZtYS0+dm1fcGFnZV9wcm90KSkKCQlnb3RvIG91dDsKCXMtPmRtYV9kYWMxLm1hcHBlZCA9IDE7CglyZXQgPSAwOwpvdXQ6Cgl1bmxvY2tfa2VybmVsKCk7CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50IGVzMTM3MV9pb2N0bF9kYWMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQp7CglzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwogICAgICAgIGF1ZGlvX2J1Zl9pbmZvIGFiaW5mbzsKICAgICAgICBjb3VudF9pbmZvIGNpbmZvOwoJaW50IGNvdW50OwoJaW50IHZhbCwgcmV0OwoJaW50IF9fdXNlciAqcCA9IChpbnQgX191c2VyICopYXJnOwoKCVZBTElEQVRFX1NUQVRFKHMpOwoJc3dpdGNoIChjbWQpIHsKCWNhc2UgT1NTX0dFVFZFUlNJT046CgkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIHApOwoKCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgoJCXJldHVybiBkcmFpbl9kYWMxKHMsIDAvKmZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKi8pOwoJCQoJY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKCQlyZXR1cm4gLUVJTlZBTDsKCgljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKCQlyZXR1cm4gcHV0X3VzZXIoRFNQX0NBUF9SRUFMVElNRSB8IERTUF9DQVBfVFJJR0dFUiB8IERTUF9DQVBfTU1BUCwgcCk7CgkJCiAgICAgICAgY2FzZSBTTkRDVExfRFNQX1JFU0VUOgoJCXN0b3BfZGFjMShzKTsKCQlzeW5jaHJvbml6ZV9pcnEocy0+aXJxKTsKCQlzLT5kbWFfZGFjMS5zd3B0ciA9IHMtPmRtYV9kYWMxLmh3cHRyID0gcy0+ZG1hX2RhYzEuY291bnQgPSBzLT5kbWFfZGFjMS50b3RhbF9ieXRlcyA9IDA7CgkJcmV0dXJuIDA7CgogICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TUEVFRDoKICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcih2YWwsIHApKQoJCQlyZXR1cm4gLUVGQVVMVDsKCQlpZiAodmFsID49IDApIHsKCQkJc3RvcF9kYWMxKHMpOwoJCQlzLT5kbWFfZGFjMS5yZWFkeSA9IDA7CgkJCXNldF9kYWMxX3JhdGUocywgdmFsKTsKCQl9CgkJcmV0dXJuIHB1dF91c2VyKHMtPmRhYzFyYXRlLCBwKTsKCiAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CgkJc3RvcF9kYWMxKHMpOwoJCXMtPmRtYV9kYWMxLnJlYWR5ID0gMDsKCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOwoJCWlmICh2YWwpCgkJCXMtPnNjdHJsIHw9IFNDVFJMX1AxU01COwoJCWVsc2UKCQkJcy0+c2N0cmwgJj0gflNDVFJMX1AxU01COwoJCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MV9SRUdfU0VSSUFMX0NPTlRST0wpOwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKCQlyZXR1cm4gMDsKCiAgICAgICAgY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgogICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCgkJCXJldHVybiAtRUZBVUxUOwoJCWlmICh2YWwgIT0gMCkgewoJCQlzdG9wX2RhYzEocyk7CgkJCXMtPmRtYV9kYWMxLnJlYWR5ID0gMDsKCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKCQkJaWYgKHZhbCA+PSAyKQoJCQkJcy0+c2N0cmwgfD0gU0NUUkxfUDFTTUI7CgkJCWVsc2UKCQkJCXMtPnNjdHJsICY9IH5TQ1RSTF9QMVNNQjsKCQkJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcxX1JFR19TRVJJQUxfQ09OVFJPTCk7CgkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKCQl9CgkJcmV0dXJuIHB1dF91c2VyKChzLT5zY3RybCAmIFNDVFJMX1AxU01CKSA/IDIgOiAxLCBwKTsKCQkKICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VURk1UUzogLyogUmV0dXJucyBhIG1hc2sgKi8KICAgICAgICAgICAgICAgIHJldHVybiBwdXRfdXNlcihBRk1UX1MxNl9MRXxBRk1UX1U4LCBwKTsKCQkKICAgICAgICBjYXNlIFNORENUTF9EU1BfU0VURk1UOiAvKiBTZWxlY3RzIE9ORSBmbXQqLwoJCWlmIChnZXRfdXNlcih2YWwsIHApKQoJCQlyZXR1cm4gLUVGQVVMVDsKCQlpZiAodmFsICE9IEFGTVRfUVVFUlkpIHsKCQkJc3RvcF9kYWMxKHMpOwoJCQlzLT5kbWFfZGFjMS5yZWFkeSA9IDA7CgkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CgkJCWlmICh2YWwgPT0gQUZNVF9TMTZfTEUpCgkJCQlzLT5zY3RybCB8PSBTQ1RSTF9QMVNFQjsKCQkJZWxzZQoJCQkJcy0+c2N0cmwgJj0gflNDVFJMX1AxU0VCOwoJCQlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzFfUkVHX1NFUklBTF9DT05UUk9MKTsKCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOwoJCX0KCQlyZXR1cm4gcHV0X3VzZXIoKHMtPnNjdHJsICYgU0NUUkxfUDFTRUIpID8gQUZNVF9TMTZfTEUgOiBBRk1UX1U4LCBwKTsKCiAgICAgICAgY2FzZSBTTkRDVExfRFNQX1BPU1Q6CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKCiAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVFRSSUdHRVI6CgkJcmV0dXJuIHB1dF91c2VyKChzLT5jdHJsICYgQ1RSTF9EQUMxX0VOKSA/IFBDTV9FTkFCTEVfT1VUUFVUIDogMCwgcCk7CgkJCQkJCQoJY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6CgkJaWYgKGdldF91c2VyKHZhbCwgcCkpCgkJCXJldHVybiAtRUZBVUxUOwoJCWlmICh2YWwgJiBQQ01fRU5BQkxFX09VVFBVVCkgewoJCQlpZiAoIXMtPmRtYV9kYWMxLnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMxKHMpKSkKCQkJCXJldHVybiByZXQ7CgkJCXMtPmRtYV9kYWMxLmVuYWJsZWQgPSAxOwoJCQlzdGFydF9kYWMxKHMpOwoJCX0gZWxzZSB7CgkJCXMtPmRtYV9kYWMxLmVuYWJsZWQgPSAwOwoJCQlzdG9wX2RhYzEocyk7CgkJfQoJCXJldHVybiAwOwoKCWNhc2UgU05EQ1RMX0RTUF9HRVRPU1BBQ0U6CgkJaWYgKCFzLT5kbWFfZGFjMS5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfZGFjMShzKSkgIT0gMCkKCQkJcmV0dXJuIHZhbDsKCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOwoJCWVzMTM3MV91cGRhdGVfcHRyKHMpOwoJCWFiaW5mby5mcmFnc2l6ZSA9IHMtPmRtYV9kYWMxLmZyYWdzaXplOwoJCWNvdW50ID0gcy0+ZG1hX2RhYzEuY291bnQ7CgkJaWYgKGNvdW50IDwgMCkKCQkJY291bnQgPSAwOwogICAgICAgICAgICAgICAgYWJpbmZvLmJ5dGVzID0gcy0+ZG1hX2RhYzEuZG1hc2l6ZSAtIGNvdW50OwogICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdzdG90YWwgPSBzLT5kbWFfZGFjMS5udW1mcmFnOwogICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBzLT5kbWFfZGFjMS5mcmFnc2hpZnQ7ICAgICAgCgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOwoJCXJldHVybiBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmYWJpbmZvLCBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKCiAgICAgICAgY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgogICAgICAgICAgICAgICAgZmlsZS0+Zl9mbGFncyB8PSBPX05PTkJMT0NLOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CgogICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRPREVMQVk6CgkJaWYgKCFzLT5kbWFfZGFjMS5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfZGFjMShzKSkgIT0gMCkKCQkJcmV0dXJuIHZhbDsKCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOwoJCWVzMTM3MV91cGRhdGVfcHRyKHMpOwogICAgICAgICAgICAgICAgY291bnQgPSBzLT5kbWFfZGFjMS5jb3VudDsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CgkJaWYgKGNvdW50IDwgMCkKCQkJY291bnQgPSAwOwoJCXJldHVybiBwdXRfdXNlcihjb3VudCwgcCk7CgogICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgoJCWlmICghcy0+ZG1hX2RhYzEucmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmX2RhYzEocykpICE9IDApCgkJCXJldHVybiB2YWw7CgkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKCQllczEzNzFfdXBkYXRlX3B0cihzKTsKICAgICAgICAgICAgICAgIGNpbmZvLmJ5dGVzID0gcy0+ZG1hX2RhYzEudG90YWxfYnl0ZXM7CgkJY291bnQgPSBzLT5kbWFfZGFjMS5jb3VudDsKCQlpZiAoY291bnQgPCAwKQoJCQljb3VudCA9IDA7CiAgICAgICAgICAgICAgICBjaW5mby5ibG9ja3MgPSBjb3VudCA+PiBzLT5kbWFfZGFjMS5mcmFnc2hpZnQ7CiAgICAgICAgICAgICAgICBjaW5mby5wdHIgPSBzLT5kbWFfZGFjMS5od3B0cjsKCQlpZiAocy0+ZG1hX2RhYzEubWFwcGVkKQoJCQlzLT5kbWFfZGFjMS5jb3VudCAmPSBzLT5kbWFfZGFjMS5mcmFnc2l6ZS0xOwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmNpbmZvLCBzaXplb2YoY2luZm8pKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CgkJcmV0dXJuIDA7CgogICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgoJCWlmICgodmFsID0gcHJvZ19kbWFidWZfZGFjMShzKSkpCgkJCXJldHVybiB2YWw7CiAgICAgICAgICAgICAgICByZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2RhYzEuZnJhZ3NpemUsIHApOwoKICAgICAgICBjYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CiAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIodmFsLCBwKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CgkJcy0+ZG1hX2RhYzEub3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOwoJCXMtPmRtYV9kYWMxLm9zc21heGZyYWdzID0gKHZhbCA+PiAxNikgJiAweGZmZmY7CgkJaWYgKHMtPmRtYV9kYWMxLm9zc2ZyYWdzaGlmdCA8IDQpCgkJCXMtPmRtYV9kYWMxLm9zc2ZyYWdzaGlmdCA9IDQ7CgkJaWYgKHMtPmRtYV9kYWMxLm9zc2ZyYWdzaGlmdCA+IDE1KQoJCQlzLT5kbWFfZGFjMS5vc3NmcmFnc2hpZnQgPSAxNTsKCQlpZiAocy0+ZG1hX2RhYzEub3NzbWF4ZnJhZ3MgPCA0KQoJCQlzLT5kbWFfZGFjMS5vc3NtYXhmcmFncyA9IDQ7CgkJcmV0dXJuIDA7CgogICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TVUJESVZJREU6CgkJaWYgKHMtPmRtYV9kYWMxLnN1YmRpdmlzaW9uKQoJCQlyZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcih2YWwsIHApKQoJCQlyZXR1cm4gLUVGQVVMVDsKCQlpZiAodmFsICE9IDEgJiYgdmFsICE9IDIgJiYgdmFsICE9IDQpCgkJCXJldHVybiAtRUlOVkFMOwoJCXMtPmRtYV9kYWMxLnN1YmRpdmlzaW9uID0gdmFsOwoJCXJldHVybiAwOwoKICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CgkJcmV0dXJuIHB1dF91c2VyKHMtPmRhYzFyYXRlLCBwKTsKCiAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKCQlyZXR1cm4gcHV0X3VzZXIoKHMtPnNjdHJsICYgU0NUUkxfUDFTTUIpID8gMiA6IDEsIHApOwoKICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6CgkJcmV0dXJuIHB1dF91c2VyKChzLT5zY3RybCAmIFNDVFJMX1AxU0VCKSA/IDE2IDogOCwgcCk7CgogICAgICAgIGNhc2UgU09VTkRfUENNX1dSSVRFX0ZJTFRFUjoKICAgICAgICBjYXNlIFNORENUTF9EU1BfU0VUU1lOQ1JPOgogICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfRklMVEVSOgogICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CgkJCgl9CglyZXR1cm4gbWl4ZGV2X2lvY3RsKHMtPmNvZGVjLCBjbWQsIGFyZyk7Cn0KCnN0YXRpYyBpbnQgZXMxMzcxX29wZW5fZGFjKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOwoJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKCXN0cnVjdCBlczEzNzFfc3RhdGUgKnM7CgoJZm9yIChsaXN0ID0gZGV2cy5uZXh0OyA7IGxpc3QgPSBsaXN0LT5uZXh0KSB7CgkJaWYgKGxpc3QgPT0gJmRldnMpCgkJCXJldHVybiAtRU5PREVWOwoJCXMgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBlczEzNzFfc3RhdGUsIGRldnMpOwoJCWlmICghKChzLT5kZXZfZGFjIF4gbWlub3IpICYgfjB4ZikpCgkJCWJyZWFrOwoJfQogICAgICAgCVZBTElEQVRFX1NUQVRFKHMpOwogICAgICAgCS8qIHdlIGFsbG93IG9wZW5pbmcgd2l0aCBPX1JEV1IsIG1vc3QgcHJvZ3JhbXMgZG8gaXQgYWx0aG91Z2ggdGhleSB3aWxsIG9ubHkgd3JpdGUgKi8KI2lmIDAKCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQoJCXJldHVybiAtRVBFUk07CiNlbmRpZgoJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQoJCXJldHVybiAtRUlOVkFMOwogICAgICAgCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CgkvKiB3YWl0IGZvciBkZXZpY2UgdG8gYmVjb21lIGZyZWUgKi8KCW11dGV4X2xvY2soJnMtPm9wZW5fbXV0ZXgpOwoJd2hpbGUgKHMtPm9wZW5fbW9kZSAmIEZNT0RFX0RBQykgewoJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewoJCQltdXRleF91bmxvY2soJnMtPm9wZW5fbXV0ZXgpOwoJCQlyZXR1cm4gLUVCVVNZOwoJCX0KCQlhZGRfd2FpdF9xdWV1ZSgmcy0+b3Blbl93YWl0LCAmd2FpdCk7CgkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwoJCW11dGV4X3VubG9jaygmcy0+b3Blbl9tdXRleCk7CgkJc2NoZWR1bGUoKTsKCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+b3Blbl93YWl0LCAmd2FpdCk7CgkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCgkJCXJldHVybiAtRVJFU1RBUlRTWVM7CgkJbXV0ZXhfbG9jaygmcy0+b3Blbl9tdXRleCk7Cgl9CglzLT5kbWFfZGFjMS5vc3NmcmFnc2hpZnQgPSBzLT5kbWFfZGFjMS5vc3NtYXhmcmFncyA9IHMtPmRtYV9kYWMxLnN1YmRpdmlzaW9uID0gMDsKCXMtPmRtYV9kYWMxLmVuYWJsZWQgPSAxOwoJc2V0X2RhYzFfcmF0ZShzLCA4MDAwKTsKCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CglzLT5zY3RybCAmPSB+U0NUUkxfUDFGTVQ7CglpZiAoKG1pbm9yICYgMHhmKSA9PSBTTkRfREVWX0RTUDE2KQoJCXMtPnNjdHJsIHw9IEVTMTM3MV9GTVRfUzE2X01PTk8gPDwgU0NUUkxfU0hfUDFGTVQ7CgllbHNlCgkJcy0+c2N0cmwgfD0gRVMxMzcxX0ZNVF9VOF9NT05PIDw8IFNDVFJMX1NIX1AxRk1UOwoJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcxX1JFR19TRVJJQUxfQ09OVFJPTCk7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CglzLT5vcGVuX21vZGUgfD0gRk1PREVfREFDOwoJbXV0ZXhfdW5sb2NrKCZzLT5vcGVuX211dGV4KTsKCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKfQoKc3RhdGljIGludCBlczEzNzFfcmVsZWFzZV9kYWMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCXN0cnVjdCBlczEzNzFfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKCglWQUxJREFURV9TVEFURShzKTsKCWxvY2tfa2VybmVsKCk7CglkcmFpbl9kYWMxKHMsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKCW11dGV4X2xvY2soJnMtPm9wZW5fbXV0ZXgpOwoJc3RvcF9kYWMxKHMpOwoJZGVhbGxvY19kbWFidWYocywgJnMtPmRtYV9kYWMxKTsKCXMtPm9wZW5fbW9kZSAmPSB+Rk1PREVfREFDOwoJbXV0ZXhfdW5sb2NrKCZzLT5vcGVuX211dGV4KTsKCXdha2VfdXAoJnMtPm9wZW5fd2FpdCk7Cgl1bmxvY2tfa2VybmVsKCk7CglyZXR1cm4gMDsKfQoKc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVzMTM3MV9kYWNfZm9wcyA9IHsKCS5vd25lcgkJPSBUSElTX01PRFVMRSwKCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAoJLndyaXRlCQk9IGVzMTM3MV93cml0ZV9kYWMsCgkucG9sbAkJPSBlczEzNzFfcG9sbF9kYWMsCgkuaW9jdGwJCT0gZXMxMzcxX2lvY3RsX2RhYywKCS5tbWFwCQk9IGVzMTM3MV9tbWFwX2RhYywKCS5vcGVuCQk9IGVzMTM3MV9vcGVuX2RhYywKCS5yZWxlYXNlCT0gZXMxMzcxX3JlbGVhc2VfZGFjLAp9OwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgc3NpemVfdCBlczEzNzFfbWlkaV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKewoJc3RydWN0IGVzMTM3MV9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcxX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOwoJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Cglzc2l6ZV90IHJldDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cgl1bnNpZ25lZCBwdHI7CglpbnQgY250OwoKCVZBTElEQVRFX1NUQVRFKHMpOwoJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKCQlyZXR1cm4gLUVGQVVMVDsKCWlmIChjb3VudCA9PSAwKQoJCXJldHVybiAwOwoJcmV0ID0gMDsKICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmcy0+bWlkaS5pd2FpdCwgJndhaXQpOwoJd2hpbGUgKGNvdW50ID4gMCkgewoJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CgkJcHRyID0gcy0+bWlkaS5pcmQ7CgkJY250ID0gTUlESUlOQlVGIC0gcHRyOwoJCWlmIChzLT5taWRpLmljbnQgPCBjbnQpCgkJCWNudCA9IHMtPm1pZGkuaWNudDsKCQlpZiAoY250IDw9IDApCgkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CgkJaWYgKGNudCA+IGNvdW50KQoJCQljbnQgPSBjb3VudDsKCQlpZiAoY250IDw9IDApIHsKCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CgkJCQlpZiAoIXJldCkKCQkJCQlyZXQgPSAtRUFHQUlOOwoJCQkJYnJlYWs7CgkJCX0KCQkJc2NoZWR1bGUoKTsKCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CgkJCQlpZiAoIXJldCkKCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CgkJCQlicmVhazsKCQkJfQoJCQljb250aW51ZTsKCQl9CgkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIHMtPm1pZGkuaWJ1ZiArIHB0ciwgY250KSkgewoJCQlpZiAoIXJldCkKCQkJCXJldCA9IC1FRkFVTFQ7CgkJCWJyZWFrOwoJCX0KCQlwdHIgPSAocHRyICsgY250KSAlIE1JRElJTkJVRjsKCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOwoJCXMtPm1pZGkuaXJkID0gcHRyOwoJCXMtPm1pZGkuaWNudCAtPSBjbnQ7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOwoJCWNvdW50IC09IGNudDsKCQlidWZmZXIgKz0gY250OwoJCXJldCArPSBjbnQ7CgkJYnJlYWs7Cgl9CglfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CglyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+bWlkaS5pd2FpdCwgJndhaXQpOwoJcmV0dXJuIHJldDsKfQoKc3RhdGljIHNzaXplX3QgZXMxMzcxX21pZGlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQp7CglzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CglERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKCXNzaXplX3QgcmV0OwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXVuc2lnbmVkIHB0cjsKCWludCBjbnQ7CgoJVkFMSURBVEVfU1RBVEUocyk7CglpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCgkJcmV0dXJuIC1FRkFVTFQ7CglpZiAoY291bnQgPT0gMCkKCQlyZXR1cm4gMDsKCXJldCA9IDA7CiAgICAgICAgYWRkX3dhaXRfcXVldWUoJnMtPm1pZGkub3dhaXQsICZ3YWl0KTsKCXdoaWxlIChjb3VudCA+IDApIHsKCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOwoJCXB0ciA9IHMtPm1pZGkub3dyOwoJCWNudCA9IE1JRElPVVRCVUYgLSBwdHI7CgkJaWYgKHMtPm1pZGkub2NudCArIGNudCA+IE1JRElPVVRCVUYpCgkJCWNudCA9IE1JRElPVVRCVUYgLSBzLT5taWRpLm9jbnQ7CgkJaWYgKGNudCA8PSAwKSB7CgkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKCQkJZXMxMzcxX2hhbmRsZV9taWRpKHMpOwoJCX0KCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CgkJaWYgKGNudCA+IGNvdW50KQoJCQljbnQgPSBjb3VudDsKCQlpZiAoY250IDw9IDApIHsKCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CgkJCQlpZiAoIXJldCkKCQkJCQlyZXQgPSAtRUFHQUlOOwoJCQkJYnJlYWs7CgkJCX0KCQkJc2NoZWR1bGUoKTsKCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CgkJCQlpZiAoIXJldCkKCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CgkJCQlicmVhazsKCQkJfQoJCQljb250aW51ZTsKCQl9CgkJaWYgKGNvcHlfZnJvbV91c2VyKHMtPm1pZGkub2J1ZiArIHB0ciwgYnVmZmVyLCBjbnQpKSB7CgkJCWlmICghcmV0KQoJCQkJcmV0ID0gLUVGQVVMVDsKCQkJYnJlYWs7CgkJfQoJCXB0ciA9IChwdHIgKyBjbnQpICUgTUlESU9VVEJVRjsKCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOwoJCXMtPm1pZGkub3dyID0gcHRyOwoJCXMtPm1pZGkub2NudCArPSBjbnQ7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOwoJCWNvdW50IC09IGNudDsKCQlidWZmZXIgKz0gY250OwoJCXJldCArPSBjbnQ7CgkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKCQllczEzNzFfaGFuZGxlX21pZGkocyk7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOwoJfQoJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwoJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPm1pZGkub3dhaXQsICZ3YWl0KTsKCXJldHVybiByZXQ7Cn0KCi8qIE5vIGtlcm5lbCBsb2NrIC0gd2UgaGF2ZSBvdXIgb3duIHNwaW5sb2NrICovCnN0YXRpYyB1bnNpZ25lZCBpbnQgZXMxMzcxX21pZGlfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQp7CglzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJdW5zaWduZWQgaW50IG1hc2sgPSAwOwoKCVZBTElEQVRFX1NUQVRFKHMpOwoJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQoJCXBvbGxfd2FpdChmaWxlLCAmcy0+bWlkaS5vd2FpdCwgd2FpdCk7CglpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKCQlwb2xsX3dhaXQoZmlsZSwgJnMtPm1pZGkuaXdhaXQsIHdhaXQpOwoJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CgkJaWYgKHMtPm1pZGkuaWNudCA+IDApCgkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKCX0KCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewoJCWlmIChzLT5taWRpLm9jbnQgPCBNSURJT1VUQlVGKQoJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOwoJfQoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOwoJcmV0dXJuIG1hc2s7Cn0KCnN0YXRpYyBpbnQgZXMxMzcxX21pZGlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CglzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzOwoKCWZvciAobGlzdCA9IGRldnMubmV4dDsgOyBsaXN0ID0gbGlzdC0+bmV4dCkgewoJCWlmIChsaXN0ID09ICZkZXZzKQoJCQlyZXR1cm4gLUVOT0RFVjsKCQlzID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgZXMxMzcxX3N0YXRlLCBkZXZzKTsKCQlpZiAocy0+ZGV2X21pZGkgPT0gbWlub3IpCgkJCWJyZWFrOwoJfQogICAgICAgCVZBTElEQVRFX1NUQVRFKHMpOwoJZmlsZS0+cHJpdmF0ZV9kYXRhID0gczsKCS8qIHdhaXQgZm9yIGRldmljZSB0byBiZWNvbWUgZnJlZSAqLwoJbXV0ZXhfbG9jaygmcy0+b3Blbl9tdXRleCk7Cgl3aGlsZSAocy0+b3Blbl9tb2RlICYgKGZpbGUtPmZfbW9kZSA8PCBGTU9ERV9NSURJX1NISUZUKSkgewoJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewoJCQltdXRleF91bmxvY2soJnMtPm9wZW5fbXV0ZXgpOwoJCQlyZXR1cm4gLUVCVVNZOwoJCX0KCQlhZGRfd2FpdF9xdWV1ZSgmcy0+b3Blbl93YWl0LCAmd2FpdCk7CgkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwoJCW11dGV4X3VubG9jaygmcy0+b3Blbl9tdXRleCk7CgkJc2NoZWR1bGUoKTsKCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+b3Blbl93YWl0LCAmd2FpdCk7CgkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCgkJCXJldHVybiAtRVJFU1RBUlRTWVM7CgkJbXV0ZXhfbG9jaygmcy0+b3Blbl9tdXRleCk7Cgl9CglzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOwoJaWYgKCEocy0+b3Blbl9tb2RlICYgKEZNT0RFX01JRElfUkVBRCB8IEZNT0RFX01JRElfV1JJVEUpKSkgewoJCXMtPm1pZGkuaXJkID0gcy0+bWlkaS5pd3IgPSBzLT5taWRpLmljbnQgPSAwOwoJCXMtPm1pZGkub3JkID0gcy0+bWlkaS5vd3IgPSBzLT5taWRpLm9jbnQgPSAwOwoJCW91dGIoVUNUUkxfQ05UUkxfU1dSLCBzLT5pbytFUzEzNzFfUkVHX1VBUlRfQ09OVFJPTCk7CgkJb3V0YigwLCBzLT5pbytFUzEzNzFfUkVHX1VBUlRfQ09OVFJPTCk7CgkJb3V0YigwLCBzLT5pbytFUzEzNzFfUkVHX1VBUlRfVEVTVCk7Cgl9CglpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewoJCXMtPm1pZGkuaXJkID0gcy0+bWlkaS5pd3IgPSBzLT5taWRpLmljbnQgPSAwOwoJfQoJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CgkJcy0+bWlkaS5vcmQgPSBzLT5taWRpLm93ciA9IHMtPm1pZGkub2NudCA9IDA7Cgl9CglzLT5jdHJsIHw9IENUUkxfVUFSVF9FTjsKCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcxX1JFR19DT05UUk9MKTsKCWVzMTM3MV9oYW5kbGVfbWlkaShzKTsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKCXMtPm9wZW5fbW9kZSB8PSAoZmlsZS0+Zl9tb2RlIDw8IEZNT0RFX01JRElfU0hJRlQpICYgKEZNT0RFX01JRElfUkVBRCB8IEZNT0RFX01JRElfV1JJVEUpOwoJbXV0ZXhfdW5sb2NrKCZzLT5vcGVuX211dGV4KTsKCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKfQoKc3RhdGljIGludCBlczEzNzFfbWlkaV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CglERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cgl1bnNpZ25lZCBjb3VudCwgdG1vOwoKCVZBTElEQVRFX1NUQVRFKHMpOwoJbG9ja19rZXJuZWwoKTsKCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewoJCWFkZF93YWl0X3F1ZXVlKCZzLT5taWRpLm93YWl0LCAmd2FpdCk7CgkJZm9yICg7OykgewoJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CgkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CgkJCWNvdW50ID0gcy0+bWlkaS5vY250OwoJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CgkJCWlmIChjb3VudCA8PSAwKQoJCQkJYnJlYWs7CgkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKCQkJCWJyZWFrOwoJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCgkJCQlicmVhazsKCQkJdG1vID0gKGNvdW50ICogSFopIC8gMzEwMDsKCQkJaWYgKCFzY2hlZHVsZV90aW1lb3V0KHRtbyA/IDogMSkgJiYgdG1vKQoJCQkJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJtaWRpIHRpbWVkIG91dD8/XG4iKTsKCQl9CgkJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPm1pZGkub3dhaXQsICZ3YWl0KTsKCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwoJfQoJbXV0ZXhfbG9jaygmcy0+b3Blbl9tdXRleCk7CglzLT5vcGVuX21vZGUgJj0gfigoZmlsZS0+Zl9tb2RlIDw8IEZNT0RFX01JRElfU0hJRlQpICYgKEZNT0RFX01JRElfUkVBRHxGTU9ERV9NSURJX1dSSVRFKSk7CglzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOwoJaWYgKCEocy0+b3Blbl9tb2RlICYgKEZNT0RFX01JRElfUkVBRCB8IEZNT0RFX01JRElfV1JJVEUpKSkgewoJCXMtPmN0cmwgJj0gfkNUUkxfVUFSVF9FTjsKCQlvdXRsKHMtPmN0cmwsIHMtPmlvK0VTMTM3MV9SRUdfQ09OVFJPTCk7Cgl9CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CgltdXRleF91bmxvY2soJnMtPm9wZW5fbXV0ZXgpOwoJd2FrZV91cCgmcy0+b3Blbl93YWl0KTsKCXVubG9ja19rZXJuZWwoKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgLypjb25zdCovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXMxMzcxX21pZGlfZm9wcyA9IHsKCS5vd25lcgkJPSBUSElTX01PRFVMRSwKCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAoJLnJlYWQJCT0gZXMxMzcxX21pZGlfcmVhZCwKCS53cml0ZQkJPSBlczEzNzFfbWlkaV93cml0ZSwKCS5wb2xsCQk9IGVzMTM3MV9taWRpX3BvbGwsCgkub3BlbgkJPSBlczEzNzFfbWlkaV9vcGVuLAoJLnJlbGVhc2UJPSBlczEzNzFfbWlkaV9yZWxlYXNlLAp9OwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKgogKiBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLCB3ZSdsbCBjcmVhdGUgYSBwcm9jIGRldmljZSB0aGF0IGR1bXBzIHRoZQogKiBDT0RFQyBjaGlwc3RhdGUKICovCgojaWZkZWYgRVMxMzcxX0RFQlVHCnN0YXRpYyBpbnQgcHJvY19lczEzNzFfZHVtcCAoY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IGZwb3MsIGludCBsZW5ndGgsIGludCAqZW9mLCB2b2lkICpkYXRhKQp7CglzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzOwogICAgICAgIGludCBjbnQsIGxlbiA9IDA7CgoJaWYgKGxpc3RfZW1wdHkoJmRldnMpKQoJCXJldHVybiAwOwoJcyA9IGxpc3RfZW50cnkoZGV2cy5uZXh0LCBzdHJ1Y3QgZXMxMzcxX3N0YXRlLCBkZXZzKTsKICAgICAgICAvKiBwcmludCBvdXQgaGVhZGVyICovCiAgICAgICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiXHRcdENyZWF0aXZlIEVTMTM3eCBEZWJ1ZyBEdW1wLW8tbWF0aWNcbiIpOwoKICAgICAgICAvKiBwcmludCBvdXQgQ09ERUMgc3RhdGUgKi8KICAgICAgICBsZW4gKz0gc3ByaW50ZiAoYnVmICsgbGVuLCAiQUM5NyBDT0RFQyBzdGF0ZVxuIik7Cglmb3IgKGNudD0wOyBjbnQgPD0gMHg3ZTsgY250ID0gY250ICsyKQogICAgICAgICAgICAgICAgbGVuKz0gc3ByaW50ZiAoYnVmICsgbGVuLCAicmVnOjB4JTAyeCAgdmFsOjB4JTA0eFxuIiwgY250LCByZGNvZGVjKHMtPmNvZGVjLCBjbnQpKTsKCiAgICAgICAgaWYgKGZwb3MgPj1sZW4pewogICAgICAgICAgICAgICAgKnN0YXJ0ID0gYnVmOwogICAgICAgICAgICAgICAgKmVvZiA9MTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICAqc3RhcnQgPSBidWYgKyBmcG9zOwogICAgICAgIGlmICgobGVuIC09IGZwb3MpID4gbGVuZ3RoKQogICAgICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKICAgICAgICAqZW9mID0xOwogICAgICAgIHJldHVybiBsZW47Cgp9CiNlbmRpZiAvKiBFUzEzNzFfREVCVUcgKi8KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyogbWF4aW11bSBudW1iZXIgb2YgZGV2aWNlczsgb25seSB1c2VkIGZvciBjb21tYW5kIGxpbmUgcGFyYW1zICovCiNkZWZpbmUgTlJfREVWSUNFIDUKCnN0YXRpYyBpbnQgc3BkaWZbTlJfREVWSUNFXTsKc3RhdGljIGludCBub21peFtOUl9ERVZJQ0VdOwpzdGF0aWMgaW50IGFtcGxpZmllcltOUl9ERVZJQ0VdOwoKc3RhdGljIHVuc2lnbmVkIGludCBkZXZpbmRleDsKCm1vZHVsZV9wYXJhbV9hcnJheShzcGRpZiwgYm9vbCwgTlVMTCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0Moc3BkaWYsICJpZiAxIHRoZSBvdXRwdXQgaXMgaW4gUy9QRElGIGRpZ2l0YWwgbW9kZSIpOwptb2R1bGVfcGFyYW1fYXJyYXkobm9taXgsIGJvb2wsIE5VTEwsIDApOwpNT0RVTEVfUEFSTV9ERVNDKG5vbWl4LCAiaWYgMSBubyBhbmFsb2cgYXVkaW8gaXMgbWl4ZWQgdG8gdGhlIGRpZ2l0YWwgb3V0cHV0Iik7Cm1vZHVsZV9wYXJhbV9hcnJheShhbXBsaWZpZXIsIGJvb2wsIE5VTEwsIDApOwpNT0RVTEVfUEFSTV9ERVNDKGFtcGxpZmllciwgIlNldCB0byAxIGlmIHRoZSBtYWNoaW5lIG5lZWRzIHRoZSBhbXAgY29udHJvbCBlbmFibGluZyAobWFueSBsYXB0b3BzKSIpOwoKTU9EVUxFX0FVVEhPUigiVGhvbWFzIE0uIFNhaWxlciwgc2FpbGVyQGlmZS5lZS5ldGh6LmNoLCBoYjlqbnhAaGI5dy5jaGUuZXUiKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJFUzEzNzEgQXVkaW9QQ0k5NyBEcml2ZXIiKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIHN0cnVjdCBpbml0dm9sIHsKCWludCBtaXhjaDsKCWludCB2b2w7Cn0gaW5pdHZvbFtdIF9fZGV2aW5pdGRhdGEgPSB7Cgl7IFNPVU5EX01JWEVSX1dSSVRFX0xJTkUsIDB4NDA0MCB9LAoJeyBTT1VORF9NSVhFUl9XUklURV9DRCwgMHg0MDQwIH0sCgl7IE1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX1ZJREVPKSwgMHg0MDQwIH0sCgl7IFNPVU5EX01JWEVSX1dSSVRFX0xJTkUxLCAweDQwNDAgfSwKCXsgU09VTkRfTUlYRVJfV1JJVEVfUENNLCAweDQwNDAgfSwKCXsgU09VTkRfTUlYRVJfV1JJVEVfVk9MVU1FLCAweDQwNDAgfSwKCXsgTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfUEhPTkVPVVQpLCAweDQwNDAgfSwKCXsgU09VTkRfTUlYRVJfV1JJVEVfT0dBSU4sIDB4NDA0MCB9LAoJeyBNSVhFUl9XUklURShTT1VORF9NSVhFUl9QSE9ORUlOKSwgMHg0MDQwIH0sCgl7IFNPVU5EX01JWEVSX1dSSVRFX1NQRUFLRVIsIDB4NDA0MCB9LAoJeyBTT1VORF9NSVhFUl9XUklURV9NSUMsIDB4NDA0MCB9LAoJeyBTT1VORF9NSVhFUl9XUklURV9SRUNMRVYsIDB4NDA0MCB9LAoJeyBTT1VORF9NSVhFUl9XUklURV9JR0FJTiwgMHg0MDQwIH0KfTsKCnN0YXRpYyBzdHJ1Y3QKewoJc2hvcnQgc3ZpZCwgc2RpZDsKfSBhbXBsaWZpZXJfbmVlZGVkW10gPSAKewoJeyAweDEwN0IsIDB4MjE1MCB9LAkJLyogR2F0ZXdheSBTb2xvIDIxNTAgKi8KCXsgMHgxM0JELCAweDEwMEMgfSwJCS8qIE1lYml1cyBQQy1NSjEwMFYgKi8KCXsgMHgxMTAyLCAweDU5MzggfSwJCS8qIFRhcmdhIFh0ZW5kZXIgMzAwICovCgl7IDB4MTEwMiwgMHg4OTM4IH0sCQkvKiBJUEMgbm90ZWJvb2sgKi8KCXsgUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9Cn07CgojaWZkZWYgU1VQUE9SVF9KT1lTVElDSwoKc3RhdGljIGludCBfX2RldmluaXQgZXMxMzcxX3JlZ2lzdGVyX2dhbWVwb3J0KHN0cnVjdCBlczEzNzFfc3RhdGUgKnMpCnsKCXN0cnVjdCBnYW1lcG9ydCAqZ3A7CglpbnQgZ3BpbzsKCglmb3IgKGdwaW8gPSAweDIxODsgZ3BpbyA+PSAweDIwMDsgZ3BpbyAtPSAweDA4KQoJCWlmIChyZXF1ZXN0X3JlZ2lvbihncGlvLCBKT1lfRVhURU5ULCAiZXMxMzcxIikpCgkJCWJyZWFrOwoKCWlmIChncGlvIDwgMHgyMDApIHsKCQlwcmludGsoS0VSTl9FUlIgUEZYICJubyBmcmVlIGpveXN0aWNrIGFkZHJlc3MgZm91bmRcbiIpOwoJCXJldHVybiAtRUJVU1k7Cgl9CgoJcy0+Z2FtZXBvcnQgPSBncCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKTsKCWlmICghZ3ApIHsKCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW4gbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOwoJCXJlbGVhc2VfcmVnaW9uKGdwaW8sIEpPWV9FWFRFTlQpOwoJCXJldHVybiAtRU5PTUVNOwoJfQoKCWdhbWVwb3J0X3NldF9uYW1lKGdwLCAiRVNTMTM3MSBHYW1lcG9ydCIpOwoJZ2FtZXBvcnRfc2V0X3BoeXMoZ3AsICJpc2ElMDR4L2dhbWVwb3J0MCIsIGdwaW8pOwoJZ3AtPmRldi5wYXJlbnQgPSAmcy0+ZGV2LT5kZXY7CglncC0+aW8gPSBncGlvOwoKCXMtPmN0cmwgfD0gQ1RSTF9KWVNUS19FTiB8ICgoKGdwaW8gPj4gMykgJiBDVFJMX0pPWV9NQVNLKSA8PCBDVFJMX0pPWV9TSElGVCk7CglvdXRsKHMtPmN0cmwsIHMtPmlvICsgRVMxMzcxX1JFR19DT05UUk9MKTsKCglnYW1lcG9ydF9yZWdpc3Rlcl9wb3J0KGdwKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGlubGluZSB2b2lkIGVzMTM3MV91bnJlZ2lzdGVyX2dhbWVwb3J0KHN0cnVjdCBlczEzNzFfc3RhdGUgKnMpCnsKCWlmIChzLT5nYW1lcG9ydCkgewoJCWludCBncGlvID0gcy0+Z2FtZXBvcnQtPmlvOwoJCWdhbWVwb3J0X3VucmVnaXN0ZXJfcG9ydChzLT5nYW1lcG9ydCk7CgkJcmVsZWFzZV9yZWdpb24oZ3BpbywgSk9ZX0VYVEVOVCk7CgoJfQp9CgojZWxzZQpzdGF0aWMgaW5saW5lIGludCBlczEzNzFfcmVnaXN0ZXJfZ2FtZXBvcnQoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcykgeyByZXR1cm4gLUVOT1NZUzsgfQpzdGF0aWMgaW5saW5lIHZvaWQgZXMxMzcxX3VucmVnaXN0ZXJfZ2FtZXBvcnQoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcykgeyB9CiNlbmRpZiAvKiBTVVBQT1JUX0pPWVNUSUNLICovCgoKc3RhdGljIGludCBfX2RldmluaXQgZXMxMzcxX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lpZCkKewoJc3RydWN0IGVzMTM3MV9zdGF0ZSAqczsKCW1tX3NlZ21lbnRfdCBmczsKCWludCBpLCB2YWwsIHJlcyA9IC0xOwoJaW50IGlkeDsKCXVuc2lnbmVkIGxvbmcgdG1vOwoJc2lnbmVkIGxvbmcgdG1vMjsKCXVuc2lnbmVkIGludCBjc3NyOwoKCWlmICgocmVzPXBjaV9lbmFibGVfZGV2aWNlKHBjaWRldikpKQoJCXJldHVybiByZXM7CgoJaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBjaWRldiwgMCkgJiBJT1JFU09VUkNFX0lPKSkKCQlyZXR1cm4gLUVOT0RFVjsKCWlmIChwY2lkZXYtPmlycSA9PSAwKSAKCQlyZXR1cm4gLUVOT0RFVjsKCWkgPSBwY2lfc2V0X2RtYV9tYXNrKHBjaWRldiwgRE1BXzMyQklUX01BU0spOwoJaWYgKGkpIHsKCQlwcmludGsoS0VSTl9XQVJOSU5HICJlczEzNzE6IGFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDMyYml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKCQlyZXR1cm4gaTsKCX0KCWlmICghKHMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZXMxMzcxX3N0YXRlKSwgR0ZQX0tFUk5FTCkpKSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIm91dCBvZiBtZW1vcnlcbiIpOwoJCXJldHVybiAtRU5PTUVNOwoJfQoJbWVtc2V0KHMsIDAsIHNpemVvZihzdHJ1Y3QgZXMxMzcxX3N0YXRlKSk7CgkKCXMtPmNvZGVjID0gYWM5N19hbGxvY19jb2RlYygpOwoJaWYocy0+Y29kZWMgPT0gTlVMTCkKCQlnb3RvIGVycl9jb2RlYzsKCQkKCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPmRtYV9hZGMud2FpdCk7Cglpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5kbWFfZGFjMS53YWl0KTsKCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPmRtYV9kYWMyLndhaXQpOwoJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+b3Blbl93YWl0KTsKCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPm1pZGkuaXdhaXQpOwoJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+bWlkaS5vd2FpdCk7CgltdXRleF9pbml0KCZzLT5vcGVuX211dGV4KTsKCXNwaW5fbG9ja19pbml0KCZzLT5sb2NrKTsKCXMtPm1hZ2ljID0gRVMxMzcxX01BR0lDOwoJcy0+ZGV2ID0gcGNpZGV2OwoJcy0+aW8gPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAwKTsKCXMtPmlycSA9IHBjaWRldi0+aXJxOwoJcy0+dmVuZG9yID0gcGNpZGV2LT52ZW5kb3I7CglzLT5kZXZpY2UgPSBwY2lkZXYtPmRldmljZTsKCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaWRldiwgUENJX1JFVklTSU9OX0lELCAmcy0+cmV2KTsKCXMtPmNvZGVjLT5wcml2YXRlX2RhdGEgPSBzOwoJcy0+Y29kZWMtPmlkID0gMDsKCXMtPmNvZGVjLT5jb2RlY19yZWFkID0gcmRjb2RlYzsKCXMtPmNvZGVjLT5jb2RlY193cml0ZSA9IHdyY29kZWM7CglwcmludGsoS0VSTl9JTkZPIFBGWCAiZm91bmQgY2hpcCwgdmVuZG9yIGlkIDB4JTA0eCBkZXZpY2UgaWQgMHglMDR4IHJldmlzaW9uIDB4JTAyeFxuIiwKCSAgICAgICBzLT52ZW5kb3IsIHMtPmRldmljZSwgcy0+cmV2KTsKCWlmICghcmVxdWVzdF9yZWdpb24ocy0+aW8sIEVTMTM3MV9FWFRFTlQsICJlczEzNzEiKSkgewoJCXByaW50ayhLRVJOX0VSUiBQRlggImlvIHBvcnRzICUjbHgtJSNseCBpbiB1c2VcbiIsIHMtPmlvLCBzLT5pbytFUzEzNzFfRVhURU5ULTEpOwoJCXJlcyA9IC1FQlVTWTsKCQlnb3RvIGVycl9yZWdpb247Cgl9CglpZiAoKHJlcz1yZXF1ZXN0X2lycShzLT5pcnEsIGVzMTM3MV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELCAiZXMxMzcxIixzKSkpIHsKCQlwcmludGsoS0VSTl9FUlIgUEZYICJpcnEgJXUgaW4gdXNlXG4iLCBzLT5pcnEpOwoJCWdvdG8gZXJyX2lycTsKCX0KCXByaW50ayhLRVJOX0lORk8gUEZYICJmb3VuZCBlczEzNzEgcmV2ICVkIGF0IGlvICUjbHggaXJxICV1XG4iLAoJICAgICAgIHMtPnJldiwgcy0+aW8sIHMtPmlycSk7CgkvKiByZWdpc3RlciBkZXZpY2VzICovCglpZiAoKHJlcz0ocy0+ZGV2X2F1ZGlvID0gcmVnaXN0ZXJfc291bmRfZHNwKCZlczEzNzFfYXVkaW9fZm9wcywtMSkpKTwwKQoJCWdvdG8gZXJyX2RldjE7CglpZiAoKHJlcz0ocy0+Y29kZWMtPmRldl9taXhlciA9IHJlZ2lzdGVyX3NvdW5kX21peGVyKCZlczEzNzFfbWl4ZXJfZm9wcywgLTEpKSkgPCAwKQoJCWdvdG8gZXJyX2RldjI7CglpZiAoKHJlcz0ocy0+ZGV2X2RhYyA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmZXMxMzcxX2RhY19mb3BzLCAtMSkpKSA8IDApCgkJZ290byBlcnJfZGV2MzsKCWlmICgocmVzPShzLT5kZXZfbWlkaSA9IHJlZ2lzdGVyX3NvdW5kX21pZGkoJmVzMTM3MV9taWRpX2ZvcHMsIC0xKSkpPDAgKQoJCWdvdG8gZXJyX2RldjQ7CiNpZmRlZiBFUzEzNzFfREVCVUcKCS8qIGluaXRpYWxpemUgdGhlIGRlYnVnIHByb2MgZGV2aWNlICovCglzLT5wcyA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImVzMTM3MSIsMCxOVUxMLHByb2NfZXMxMzcxX2R1bXAsTlVMTCk7CiNlbmRpZiAvKiBFUzEzNzFfREVCVUcgKi8KCQoJLyogaW5pdGlhbGl6ZSBjb2RlYyByZWdpc3RlcnMgKi8KCXMtPmN0cmwgPSAwOwoKCS8qIENoZWNrIGFtcGxpZmllciByZXF1aXJlbWVudHMgKi8KCQoJaWYgKGFtcGxpZmllcltkZXZpbmRleF0pCgkJcy0+Y3RybCB8PSBDVFJMX0dQSU9fT1VUMDsKCWVsc2UgZm9yKGlkeCA9IDA7IGFtcGxpZmllcl9uZWVkZWRbaWR4XS5zdmlkICE9IFBDSV9BTllfSUQ7IGlkeCsrKQoJewoJCWlmKHBjaWRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSBhbXBsaWZpZXJfbmVlZGVkW2lkeF0uc3ZpZCAmJgoJCSAgIHBjaWRldi0+c3Vic3lzdGVtX2RldmljZSA9PSBhbXBsaWZpZXJfbmVlZGVkW2lkeF0uc2RpZCkKCQl7CiAgICAgICAgICAgICAgICAgICAgCXMtPmN0cmwgfD0gQ1RSTF9HUElPX09VVDA7ICAgLyogdHVybiBpbnRlcm5hbCBhbXBsaWZpZXIgb24gKi8KICAgICAgICAgICAgICAgICAgICAJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkVuYWJsaW5nIGludGVybmFsIGFtcGxpZmllci5cbiIpOwoJCX0KCX0KCglzLT5zY3RybCA9IDA7Cgljc3NyID0gMDsKCXMtPnNwZGlmX3ZvbHVtZSA9IC0xOwoJLyogY2hlY2sgdG8gc2VlIGlmIHMvcGRpZiBtb2RlIGlzIGJlaW5nIHJlcXVlc3RlZCAqLwoJaWYgKHNwZGlmW2RldmluZGV4XSkgewoJCWlmIChzLT5yZXYgPj0gNCkgewoJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiZW5hYmxpbmcgUy9QRElGIG91dHB1dFxuIik7CgkJCXMtPnNwZGlmX3ZvbHVtZSA9IDA7CgkJCWNzc3IgfD0gU1RBVF9FTl9TUERJRjsKCQkJcy0+Y3RybCB8PSBDVFJMX1NQRElGRU5fQjsKCQkJaWYgKG5vbWl4W2RldmluZGV4XSkgLyogZG9uJ3QgbWl4IGFuYWxvZyBpbnB1dHMgdG8gcy9wZGlmIG91dHB1dCAqLwoJCQkJcy0+Y3RybCB8PSBDVFJMX1JFQ0VOX0I7CgkJfSBlbHNlIHsKCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAicmV2aXNpb24gJWQgZG9lcyBub3Qgc3VwcG9ydCBTL1BESUZcbiIsIHMtPnJldik7CgkJfQoJfQoJLyogaW5pdGlhbGl6ZSB0aGUgY2hpcHMgKi8KCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcxX1JFR19DT05UUk9MKTsKCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MV9SRUdfU0VSSUFMX0NPTlRST0wpOwoJb3V0bChMRUdBQ1lfSkZBU1QsIHMtPmlvK0VTMTM3MV9SRUdfTEVHQUNZKTsKCXBjaV9zZXRfbWFzdGVyKHBjaWRldik7ICAvKiBlbmFibGUgYnVzIG1hc3RlcmluZyAqLwoJLyogaWYgd2UgYXJlIGEgNTg4MCB0dXJuIG9uIHRoZSBBQzk3ICovCglpZiAocy0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfRU5TT05JUSAmJgoJICAgICgocy0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfRU5TT05JUV9DVDU4ODAgJiYgcy0+cmV2ID49IENUNTg4MFJFVl9DVDU4ODBfQykgfHwgCgkgICAgIChzLT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9FTlNPTklRX0VTMTM3MSAmJiBzLT5yZXYgPT0gRVMxMzcxUkVWX0NUNTg4MF9BKSB8fCAKCSAgICAgKHMtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0VOU09OSVFfRVMxMzcxICYmIHMtPnJldiA9PSBFUzEzNzFSRVZfRVMxMzczXzgpKSkgeyAKCQljc3NyIHw9IENTVEFUXzU4ODBfQUM5N19SU1Q7CgkJb3V0bChjc3NyLCBzLT5pbytFUzEzNzFfUkVHX1NUQVRVUyk7CgkJLyogbmVlZCB0byBkZWxheSBhcm91bmQgMjBtcyhibGVlY2gpIHRvIGdpdmUKCQkgICBzb21lIENPREVDcyBlbm91Z2ggdGltZSB0byB3YWtldXAgKi8KCQl0bW8gPSBqaWZmaWVzICsgKEhaIC8gNTApICsgMTsKCQlmb3IgKDs7KSB7CgkJCXRtbzIgPSB0bW8gLSBqaWZmaWVzOwoJCQlpZiAodG1vMiA8PSAwKQoJCQkJYnJlYWs7CgkJCXNjaGVkdWxlX3RpbWVvdXQodG1vMik7CgkJfQoJfQoJLyogQUM5NyB3YXJtIHJlc2V0IHRvIHN0YXJ0IHRoZSBiaXRjbGsgKi8KCW91dGwocy0+Y3RybCB8IENUUkxfU1lOQ1JFUywgcy0+aW8rRVMxMzcxX1JFR19DT05UUk9MKTsKCXVkZWxheSgyKTsKCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcxX1JFR19DT05UUk9MKTsKCS8qIGluaXQgdGhlIHNhbXBsZSByYXRlIGNvbnZlcnRlciAqLwoJc3JjX2luaXQocyk7CgkvKiBjb2RlYyBpbml0ICovCglpZiAoIWFjOTdfcHJvYmVfY29kZWMocy0+Y29kZWMpKSB7CgkJcmVzID0gLUVOT0RFVjsKCQlnb3RvIGVycl9ncDsKCX0KCS8qIHNldCBkZWZhdWx0IHZhbHVlcyAqLwoKCWZzID0gZ2V0X2ZzKCk7CglzZXRfZnMoS0VSTkVMX0RTKTsKCXZhbCA9IFNPVU5EX01BU0tfTElORTsKCW1peGRldl9pb2N0bChzLT5jb2RlYywgU09VTkRfTUlYRVJfV1JJVEVfUkVDU1JDLCAodW5zaWduZWQgbG9uZykmdmFsKTsKCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoaW5pdHZvbCkvc2l6ZW9mKGluaXR2b2xbMF0pOyBpKyspIHsKCQl2YWwgPSBpbml0dm9sW2ldLnZvbDsKCQltaXhkZXZfaW9jdGwocy0+Y29kZWMsIGluaXR2b2xbaV0ubWl4Y2gsICh1bnNpZ25lZCBsb25nKSZ2YWwpOwoJfQoJLyogbXV0ZSBtYXN0ZXIgYW5kIFBDTSB3aGVuIGluIFMvUERJRiBtb2RlICovCglpZiAocy0+c3BkaWZfdm9sdW1lICE9IC0xKSB7CgkJdmFsID0gMHgwMDAwOwoJCXMtPmNvZGVjLT5taXhlcl9pb2N0bChzLT5jb2RlYywgU09VTkRfTUlYRVJfV1JJVEVfVk9MVU1FLCAodW5zaWduZWQgbG9uZykmdmFsKTsKCQlzLT5jb2RlYy0+bWl4ZXJfaW9jdGwocy0+Y29kZWMsIFNPVU5EX01JWEVSX1dSSVRFX1BDTSwgKHVuc2lnbmVkIGxvbmcpJnZhbCk7Cgl9CglzZXRfZnMoZnMpOwoJLyogdHVybiBvbiBTL1BESUYgb3V0cHV0IGRyaXZlciBpZiByZXF1ZXN0ZWQgKi8KCW91dGwoY3Nzciwgcy0+aW8rRVMxMzcxX1JFR19TVEFUVVMpOwoKCWVzMTM3MV9yZWdpc3Rlcl9nYW1lcG9ydChzKTsKCgkvKiBzdG9yZSBpdCBpbiB0aGUgZHJpdmVyIGZpZWxkICovCglwY2lfc2V0X2RydmRhdGEocGNpZGV2LCBzKTsKCS8qIHB1dCBpdCBpbnRvIGRyaXZlciBsaXN0ICovCglsaXN0X2FkZF90YWlsKCZzLT5kZXZzLCAmZGV2cyk7CgkvKiBpbmNyZW1lbnQgZGV2aW5kZXggKi8KCWlmIChkZXZpbmRleCA8IE5SX0RFVklDRS0xKQoJCWRldmluZGV4Kys7CglyZXR1cm4gMDsKCiBlcnJfZ3A6CiNpZmRlZiBFUzEzNzFfREVCVUcKCWlmIChzLT5wcykKCQlyZW1vdmVfcHJvY19lbnRyeSgiZXMxMzcxIiwgTlVMTCk7CiNlbmRpZgoJdW5yZWdpc3Rlcl9zb3VuZF9taWRpKHMtPmRldl9taWRpKTsKIGVycl9kZXY0OgoJdW5yZWdpc3Rlcl9zb3VuZF9kc3Aocy0+ZGV2X2RhYyk7CiBlcnJfZGV2MzoKCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIocy0+Y29kZWMtPmRldl9taXhlcik7CiBlcnJfZGV2MjoKCXVucmVnaXN0ZXJfc291bmRfZHNwKHMtPmRldl9hdWRpbyk7CiBlcnJfZGV2MToKCXByaW50ayhLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciBtaXNjIGRldmljZVxuIik7CglmcmVlX2lycShzLT5pcnEsIHMpOwogZXJyX2lycToKCXJlbGVhc2VfcmVnaW9uKHMtPmlvLCBFUzEzNzFfRVhURU5UKTsKIGVycl9yZWdpb246CiBlcnJfY29kZWM6CglhYzk3X3JlbGVhc2VfY29kZWMocy0+Y29kZWMpOwoJa2ZyZWUocyk7CglyZXR1cm4gcmVzOwp9CgpzdGF0aWMgdm9pZCBfX2RldmV4aXQgZXMxMzcxX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQp7CglzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gcGNpX2dldF9kcnZkYXRhKGRldik7CgoJaWYgKCFzKQoJCXJldHVybjsKCWxpc3RfZGVsKCZzLT5kZXZzKTsKI2lmZGVmIEVTMTM3MV9ERUJVRwoJaWYgKHMtPnBzKQoJCXJlbW92ZV9wcm9jX2VudHJ5KCJlczEzNzEiLCBOVUxMKTsKI2VuZGlmIC8qIEVTMTM3MV9ERUJVRyAqLwoJb3V0bCgwLCBzLT5pbytFUzEzNzFfUkVHX0NPTlRST0wpOyAvKiBzd2l0Y2ggZXZlcnl0aGluZyBvZmYgKi8KCW91dGwoMCwgcy0+aW8rRVMxMzcxX1JFR19TRVJJQUxfQ09OVFJPTCk7IC8qIGNsZWFyIHNlcmlhbCBpbnRlcnJ1cHRzICovCglzeW5jaHJvbml6ZV9pcnEocy0+aXJxKTsKCWZyZWVfaXJxKHMtPmlycSwgcyk7CgllczEzNzFfdW5yZWdpc3Rlcl9nYW1lcG9ydChzKTsKCXJlbGVhc2VfcmVnaW9uKHMtPmlvLCBFUzEzNzFfRVhURU5UKTsKCXVucmVnaXN0ZXJfc291bmRfZHNwKHMtPmRldl9hdWRpbyk7Cgl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKHMtPmNvZGVjLT5kZXZfbWl4ZXIpOwoJdW5yZWdpc3Rlcl9zb3VuZF9kc3Aocy0+ZGV2X2RhYyk7Cgl1bnJlZ2lzdGVyX3NvdW5kX21pZGkocy0+ZGV2X21pZGkpOwoJYWM5N19yZWxlYXNlX2NvZGVjKHMtPmNvZGVjKTsKCWtmcmVlKHMpOwoJcGNpX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7Cn0KCnN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpZF90YWJsZVtdID0gewoJeyBQQ0lfVkVORE9SX0lEX0VOU09OSVEsIFBDSV9ERVZJQ0VfSURfRU5TT05JUV9FUzEzNzEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAgfSwKCXsgUENJX1ZFTkRPUl9JRF9FTlNPTklRLCBQQ0lfREVWSUNFX0lEX0VOU09OSVFfQ1Q1ODgwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwIH0sCgl7IFBDSV9WRU5ET1JfSURfRUNUSVZBLCBQQ0lfREVWSUNFX0lEX0VDVElWQV9FVjE5MzgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAgfSwKCXsgMCwgfQp9OwoKTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGlkX3RhYmxlKTsKCnN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBlczEzNzFfZHJpdmVyID0gewoJLm5hbWUJCT0gImVzMTM3MSIsCgkuaWRfdGFibGUJPSBpZF90YWJsZSwKCS5wcm9iZQkJPSBlczEzNzFfcHJvYmUsCgkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGVzMTM3MV9yZW1vdmUpLAp9OwoKc3RhdGljIGludCBfX2luaXQgaW5pdF9lczEzNzEodm9pZCkKewoJcHJpbnRrKEtFUk5fSU5GTyBQRlggInZlcnNpb24gdjAuMzIgdGltZSAiIF9fVElNRV9fICIgIiBfX0RBVEVfXyAiXG4iKTsKCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZlczEzNzFfZHJpdmVyKTsKfQoKc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfZXMxMzcxKHZvaWQpCnsKCXByaW50ayhLRVJOX0lORk8gUEZYICJ1bmxvYWRpbmdcbiIpOwoJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZlczEzNzFfZHJpdmVyKTsKfQoKbW9kdWxlX2luaXQoaW5pdF9lczEzNzEpOwptb2R1bGVfZXhpdChjbGVhbnVwX2VzMTM3MSk7CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCiNpZm5kZWYgTU9EVUxFCgovKiBmb3JtYXQgaXM6IGVzMTM3MT1bc3BkaWYsW25vbWl4LFthbXBsaWZpZXJdXV0gKi8KCnN0YXRpYyBpbnQgX19pbml0IGVzMTM3MV9zZXR1cChjaGFyICpzdHIpCnsKCXN0YXRpYyB1bnNpZ25lZCBfX2luaXRkYXRhIG5yX2RldiA9IDA7CgoJaWYgKG5yX2RldiA+PSBOUl9ERVZJQ0UpCgkJcmV0dXJuIDA7CgoJKHZvaWQpCiAgICAgICAgKChnZXRfb3B0aW9uKCZzdHIsICZzcGRpZltucl9kZXZdKSA9PSAyKQogICAgICAgICAmJiAoZ2V0X29wdGlvbigmc3RyLCAmbm9taXhbbnJfZGV2XSkgPT0gMikKICAgICAgICAgJiYgKGdldF9vcHRpb24oJnN0ciwgJmFtcGxpZmllcltucl9kZXZdKSkpOwoKCW5yX2RldisrOwoJcmV0dXJuIDE7Cn0KCl9fc2V0dXAoImVzMTM3MT0iLCBlczEzNzFfc2V0dXApOwoKI2VuZGlmIC8qIE1PRFVMRSAqLwo=