LyoKICogIGFzdXNfYWNwaS5jIC0gQXN1cyBMYXB0b3AgQUNQSSBFeHRyYXMKICoKICoKICogIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IEp1bGllbiBMZXJvdWdlLCAyMDAzLTIwMDYgS2Fyb2wgS296aW1vcgogKgogKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICoKICoKICogIFRoZSBkZXZlbG9wbWVudCBwYWdlIGZvciB0aGlzIGRyaXZlciBpcyBsb2NhdGVkIGF0CiAqICBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2FjcGk0YXN1cy8KICoKICogIENyZWRpdHM6CiAqICBQb250dXMgRnVjaHMgICAtIEhlbHBlciBmdW5jdGlvbnMsIGNsZWFudXAKICogIEpvaGFubiBXaWVzbmVyIC0gU21hbGwgY29tcGlsZSBmaXhlcwogKiAgSm9obiBCZWxtb250ZSAgLSBBQ1BJIGNvZGUgZm9yIFRvc2hpYmEgbGFwdG9wIHdhcyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuCiAqICDJcmljIEJ1cmdoYXJkICAtIExFRCBkaXNwbGF5IHN1cHBvcnQgZm9yIFcxTgogKgogKi8KCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CiNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgoKI2RlZmluZSBBU1VTX0FDUElfVkVSU0lPTiAiMC4zMCIKCiNkZWZpbmUgUFJPQ19BU1VTICAgICAgICJhc3VzIgkvL3RoZSBkaXJlY3RvcnkKI2RlZmluZSBQUk9DX01MRUQgICAgICAgIm1sZWQiCiNkZWZpbmUgUFJPQ19XTEVEICAgICAgICJ3bGVkIgojZGVmaW5lIFBST0NfVExFRCAgICAgICAidGxlZCIKI2RlZmluZSBQUk9DX0JUICAgICAgICAgImJsdWV0b290aCIKI2RlZmluZSBQUk9DX0xFREQgICAgICAgImxlZGQiCiNkZWZpbmUgUFJPQ19JTkZPICAgICAgICJpbmZvIgojZGVmaW5lIFBST0NfTENEICAgICAgICAibGNkIgojZGVmaW5lIFBST0NfQlJOICAgICAgICAiYnJuIgojZGVmaW5lIFBST0NfRElTUCAgICAgICAiZGlzcCIKCiNkZWZpbmUgQUNQSV9IT1RLX05BTUUgICAgICAgICAgIkFzdXMgTGFwdG9wIEFDUEkgRXh0cmFzIERyaXZlciIKI2RlZmluZSBBQ1BJX0hPVEtfQ0xBU1MgICAgICAgICAiaG90a2V5IgojZGVmaW5lIEFDUElfSE9US19ERVZJQ0VfTkFNRSAgICJIb3RrZXkiCiNkZWZpbmUgQUNQSV9IT1RLX0hJRCAgICAgICAgICAgIkFUSzAxMDAiCgovKgogKiBTb21lIGV2ZW50cyB3ZSB1c2UsIHNhbWUgZm9yIGFsbCBBc3VzCiAqLwojZGVmaW5lIEJSX1VQICAgICAgIDB4MTAKI2RlZmluZSBCUl9ET1dOICAgICAweDIwCgovKgogKiBGbGFncyBmb3IgaG90ayBzdGF0dXMKICovCiNkZWZpbmUgTUxFRF9PTiAgICAgMHgwMQkvL21haWwgTEVECiNkZWZpbmUgV0xFRF9PTiAgICAgMHgwMgkvL3dpcmVsZXNzIExFRAojZGVmaW5lIFRMRURfT04gICAgIDB4MDQJLy90b3VjaHBhZCBMRUQKI2RlZmluZSBCVF9PTiAgICAgICAweDA4CS8vaW50ZXJuYWwgQmx1ZXRvb3RoCgpNT0RVTEVfQVVUSE9SKCJKdWxpZW4gTGVyb3VnZSwgS2Fyb2wgS296aW1vciIpOwpNT0RVTEVfREVTQ1JJUFRJT04oQUNQSV9IT1RLX05BTUUpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7CgpzdGF0aWMgdWlkX3QgYXN1c191aWQ7CnN0YXRpYyBnaWRfdCBhc3VzX2dpZDsKbW9kdWxlX3BhcmFtKGFzdXNfdWlkLCB1aW50LCAwKTsKTU9EVUxFX1BBUk1fREVTQyhhc3VzX3VpZCwgIlVJRCBmb3IgZW50cmllcyBpbiAvcHJvYy9hY3BpL2FzdXMuXG4iKTsKbW9kdWxlX3BhcmFtKGFzdXNfZ2lkLCB1aW50LCAwKTsKTU9EVUxFX1BBUk1fREVTQyhhc3VzX2dpZCwgIkdJRCBmb3IgZW50cmllcyBpbiAvcHJvYy9hY3BpL2FzdXMuXG4iKTsKCi8qIEZvciBlYWNoIG1vZGVsLCBhbGwgZmVhdHVyZXMgaW1wbGVtZW50ZWQsIAogKiB0aG9zZSBtYXJrZWQgd2l0aCBSIGFyZSByZWxhdGl2ZSB0byBIT1RLLCBBIGZvciBhYnNvbHV0ZSAqLwpzdHJ1Y3QgbW9kZWxfZGF0YSB7CgljaGFyICpuYW1lOwkJLy9uYW1lIG9mIHRoZSBsYXB0b3BfX19fX19fX19fX19fX19fQQoJY2hhciAqbXRfbWxlZDsJCS8vbWV0aG9kIHRvIGhhbmRsZSBtbGVkX19fX19fX19fX19fX1IKCWNoYXIgKm1sZWRfc3RhdHVzOwkvL25vZGUgdG8gaGFuZGxlIG1sZWQgcmVhZGluZ19fX19fX19BCgljaGFyICptdF93bGVkOwkJLy9tZXRob2QgdG8gaGFuZGxlIHdsZWRfX19fX19fX19fX19fUgoJY2hhciAqd2xlZF9zdGF0dXM7CS8vbm9kZSB0byBoYW5kbGUgd2xlZCByZWFkaW5nX19fX19fX0EKCWNoYXIgKm10X3RsZWQ7CQkvL21ldGhvZCB0byBoYW5kbGUgdGxlZF9fX19fX19fX19fX19SCgljaGFyICp0bGVkX3N0YXR1czsJLy9ub2RlIHRvIGhhbmRsZSB0bGVkIHJlYWRpbmdfX19fX19fQQoJY2hhciAqbXRfbGVkZDsJCS8vbWV0aG9kIHRvIGhhbmRsZSBMRUQgZGlzcGxheV9fX19fX1IKCWNoYXIgKm10X2J0X3N3aXRjaDsJLy9tZXRob2QgdG8gc3dpdGNoIEJsdWV0b290aCBvbi9vZmZfUgoJY2hhciAqYnRfc3RhdHVzOwkvL25vIG1vZGVsIGN1cnJlbnRseSBzdXBwb3J0cyB0aGlzX18/CgljaGFyICptdF9sY2Rfc3dpdGNoOwkvL21ldGhvZCB0byB0dXJuIExDRCBvbi9vZmZfX19fX19fX19BCgljaGFyICpsY2Rfc3RhdHVzOwkvL25vZGUgdG8gcmVhZCBMQ0QgcGFuZWwgc3RhdGVfX19fX19BCgljaGFyICpicmlnaHRuZXNzX3VwOwkvL21ldGhvZCB0byBzZXQgYnJpZ2h0bmVzcyB1cF9fX19fX19BCgljaGFyICpicmlnaHRuZXNzX2Rvd247CS8vZ3Vlc3Mgd2hhdCA/X19fX19fX19fX19fX19fX19fX19fX0EKCWNoYXIgKmJyaWdodG5lc3Nfc2V0OwkvL21ldGhvZCB0byBzZXQgYWJzb2x1dGUgYnJpZ2h0bmVzc19SCgljaGFyICpicmlnaHRuZXNzX2dldDsJLy9tZXRob2QgdG8gZ2V0IGFic29sdXRlIGJyaWdodG5lc3NfUgoJY2hhciAqYnJpZ2h0bmVzc19zdGF0dXM7CS8vbm9kZSB0byBnZXQgYnJpZ2h0bmVzc19fX19fX19fX19fX0EKCWNoYXIgKmRpc3BsYXlfc2V0OwkvL21ldGhvZCB0byBzZXQgdmlkZW8gb3V0cHV0X19fX19fX19SCgljaGFyICpkaXNwbGF5X2dldDsJLy9tZXRob2QgdG8gZ2V0IHZpZGVvIG91dHB1dF9fX19fX19fUgp9OwoKLyoKICogVGhpcyBpcyB0aGUgbWFpbiBzdHJ1Y3R1cmUsIHdlIGNhbiB1c2UgaXQgdG8gc3RvcmUgYW55dGhpbmcgaW50ZXJlc3RpbmcKICogYWJvdXQgdGhlIGhvdGsgZGV2aWNlCiAqLwpzdHJ1Y3QgYXN1c19ob3RrIHsKCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlOwkvL3RoZSBkZXZpY2Ugd2UgYXJlIGluCglhY3BpX2hhbmRsZSBoYW5kbGU7CS8vdGhlIGhhbmRsZSBvZiB0aGUgaG90ayBkZXZpY2UKCWNoYXIgc3RhdHVzOwkJLy9zdGF0dXMgb2YgdGhlIGhvdGssIGZvciBMRURzLCAuLi4KCXUzMiBsZWRkX3N0YXR1czsJLy9zdGF0dXMgb2YgdGhlIExFRCBkaXNwbGF5CglzdHJ1Y3QgbW9kZWxfZGF0YSAqbWV0aG9kczsJLy9tZXRob2RzIGF2YWlsYWJsZSBvbiB0aGUgbGFwdG9wCgl1OCBicmlnaHRuZXNzOwkJLy9icmlnaHRuZXNzIGxldmVsCgllbnVtIHsKCQlBMXggPSAwLAkvL0ExMzQwRCwgQTEzMDBGCgkJQTJ4LAkJLy9BMjUwMEgKCQlBNEcsCQkvL0E0NzAwRwoJCUQxeCwJCS8vRDEKCQlMMkQsCQkvL0wyMDAwRAoJCUwzQywJCS8vTDM4MDBDCgkJTDNELAkJLy9MMzQwMEQKCQlMM0gsCQkvL0wzSCwgTDIwMDBFLCBMNUQKCQlMNFIsCQkvL0w0NTAwUgoJCUw1eCwJCS8vTDU4MDBDIAoJCUw4TCwJCS8vTDg0MDBMCgkJTTFBLAkJLy9NMTMwMEEKCQlNMkUsCQkvL00yNDAwRSwgTDQ0MDBMCgkJTTZOLAkJLy9NNjgwME4sIFczNDAwTgoJCU02UiwJCS8vTTY3MDBSLCBBMzAwMEcKCQlQMzAsCQkvL1NhbXN1bmcgUDMwCgkJUzF4LAkJLy9TMTMwMEEsIGJ1dCBhbHNvIEwxNDAwQiBhbmQgTTI0MDBBIChMODRGKQoJCVMyeCwJCS8vUzIwMCAoSjEgcmVwb3J0ZWQpLCBWaWN0b3IgTVAtWFA3MjEwCgkJVzFOLAkJLy9XMTAwME4KCQlXNUEsCQkvL1c1QQoJCXh4TiwJCS8vTTI0MDBOLCBNMzcwME4sIE01MjAwTiwgTTY4MDBOLCBTMTMwME4sIFM1MjAwTgoJCS8vKENlbnRyaW5vKQoJCUVORF9NT0RFTAoJfSBtb2RlbDsJCS8vTW9kZWxzIGN1cnJlbnRseSBzdXBwb3J0ZWQKCXUxNiBldmVudF9jb3VudFsxMjhdOwkvL2NvdW50IGZvciBlYWNoIGV2ZW50IFRPRE8gbWFrZSB0aGlzIGJldHRlcgp9OwoKLyogSGVyZSB3ZSBnbyAqLwojZGVmaW5lIEExeF9QUkVGSVggIlxcX1NCLlBDSTAuSVNBLkVDMC4iCiNkZWZpbmUgTDNDX1BSRUZJWCAiXFxfU0IuUENJMC5QWDQwLkVDRDAuIgojZGVmaW5lIE0xQV9QUkVGSVggIlxcX1NCLlBDSTAuUFg0MC5FQzAuIgojZGVmaW5lIFAzMF9QUkVGSVggIlxcX1NCLlBDSTAuTFBDQi5FQzAuIgojZGVmaW5lIFMxeF9QUkVGSVggIlxcX1NCLlBDSTAuUFg0MC4iCiNkZWZpbmUgUzJ4X1BSRUZJWCBBMXhfUFJFRklYCiNkZWZpbmUgeHhOX1BSRUZJWCAiXFxfU0IuUENJMC5TQlJHLkVDMC4iCgpzdGF0aWMgc3RydWN0IG1vZGVsX2RhdGEgbW9kZWxfY29uZltFTkRfTU9ERUxdID0gewoJLyoKCSAqIFRPRE8gSSBoYXZlIHNlZW4gYSBTV0JYIGFuZCBBSUJYIG1ldGhvZCBvbiBzb21lIG1vZGVscywgbGlrZSBMMTQwMEIsCgkgKiBpdCBzZWVtcyB0byBiZSBhIGtpbmQgb2Ygc3dpdGNoLCBidXQgd2hhdCBmb3IgPwoJICovCgoJewoJIC5uYW1lID0gIkExeCIsCgkgLm10X21sZWQgPSAiTUxFRCIsCgkgLm1sZWRfc3RhdHVzID0gIlxcTUFJTCIsCgkgLm10X2xjZF9zd2l0Y2ggPSBBMXhfUFJFRklYICJfUTEwIiwKCSAubGNkX3N0YXR1cyA9ICJcXEJLTEkiLAoJIC5icmlnaHRuZXNzX3VwID0gQTF4X1BSRUZJWCAiX1EwRSIsCgkgLmJyaWdodG5lc3NfZG93biA9IEExeF9QUkVGSVggIl9RMEYifSwKCgl7CgkgLm5hbWUgPSAiQTJ4IiwKCSAubXRfbWxlZCA9ICJNTEVEIiwKCSAubXRfd2xlZCA9ICJXTEVEIiwKCSAud2xlZF9zdGF0dXMgPSAiXFxTRzY2IiwKCSAubXRfbGNkX3N3aXRjaCA9ICJcXFExMCIsCgkgLmxjZF9zdGF0dXMgPSAiXFxCQU9GIiwKCSAuYnJpZ2h0bmVzc19zZXQgPSAiU1BMViIsCgkgLmJyaWdodG5lc3NfZ2V0ID0gIkdQTFYiLAoJIC5kaXNwbGF5X3NldCA9ICJTRFNQIiwKCSAuZGlzcGxheV9nZXQgPSAiXFxJTkZCIn0sCgoJewoJIC5uYW1lID0gIkE0RyIsCgkgLm10X21sZWQgPSAiTUxFRCIsCi8qIFdMRUQgcHJlc2VudCwgYnV0IG5vdCBjb250cm9sbGVkIGJ5IEFDUEkgKi8KCSAubXRfbGNkX3N3aXRjaCA9IHh4Tl9QUkVGSVggIl9RMTAiLAoJIC5icmlnaHRuZXNzX3NldCA9ICJTUExWIiwKCSAuYnJpZ2h0bmVzc19nZXQgPSAiR1BMViIsCgkgLmRpc3BsYXlfc2V0ID0gIlNEU1AiLAoJIC5kaXNwbGF5X2dldCA9ICJcXEFEVkcifSwKCgl7CgkgLm5hbWUgPSAiRDF4IiwKCSAubXRfbWxlZCA9ICJNTEVEIiwKCSAubXRfbGNkX3N3aXRjaCA9ICJcXFEwRCIsCgkgLmxjZF9zdGF0dXMgPSAiXFxHUDExIiwKCSAuYnJpZ2h0bmVzc191cCA9ICJcXFEwQyIsCgkgLmJyaWdodG5lc3NfZG93biA9ICJcXFEwQiIsCgkgLmJyaWdodG5lc3Nfc3RhdHVzID0gIlxcQkxWTCIsCgkgLmRpc3BsYXlfc2V0ID0gIlNEU1AiLAoJIC5kaXNwbGF5X2dldCA9ICJcXElORkIifSwKCgl7CgkgLm5hbWUgPSAiTDJEIiwKCSAubXRfbWxlZCA9ICJNTEVEIiwKCSAubWxlZF9zdGF0dXMgPSAiXFxTR1A2IiwKCSAubXRfd2xlZCA9ICJXTEVEIiwKCSAud2xlZF9zdGF0dXMgPSAiXFxSQ1AzIiwKCSAubXRfbGNkX3N3aXRjaCA9ICJcXFExMCIsCgkgLmxjZF9zdGF0dXMgPSAiXFxTR1AwIiwKCSAuYnJpZ2h0bmVzc191cCA9ICJcXFEwRSIsCgkgLmJyaWdodG5lc3NfZG93biA9ICJcXFEwRiIsCgkgLmRpc3BsYXlfc2V0ID0gIlNEU1AiLAoJIC5kaXNwbGF5X2dldCA9ICJcXElORkIifSwKCgl7CgkgLm5hbWUgPSAiTDNDIiwKCSAubXRfbWxlZCA9ICJNTEVEIiwKCSAubXRfd2xlZCA9ICJXTEVEIiwKCSAubXRfbGNkX3N3aXRjaCA9IEwzQ19QUkVGSVggIl9RMTAiLAoJIC5sY2Rfc3RhdHVzID0gIlxcR0wzMiIsCgkgLmJyaWdodG5lc3Nfc2V0ID0gIlNQTFYiLAoJIC5icmlnaHRuZXNzX2dldCA9ICJHUExWIiwKCSAuZGlzcGxheV9zZXQgPSAiU0RTUCIsCgkgLmRpc3BsYXlfZ2V0ID0gIlxcX1NCLlBDSTAuUENJMS5WR0FDLk5NQVAifSwKCgl7CgkgLm5hbWUgPSAiTDNEIiwKCSAubXRfbWxlZCA9ICJNTEVEIiwKCSAubWxlZF9zdGF0dXMgPSAiXFxNQUxEIiwKCSAubXRfd2xlZCA9ICJXTEVEIiwKCSAubXRfbGNkX3N3aXRjaCA9ICJcXFExMCIsCgkgLmxjZF9zdGF0dXMgPSAiXFxCS0xHIiwKCSAuYnJpZ2h0bmVzc19zZXQgPSAiU1BMViIsCgkgLmJyaWdodG5lc3NfZ2V0ID0gIkdQTFYiLAoJIC5kaXNwbGF5X3NldCA9ICJTRFNQIiwKCSAuZGlzcGxheV9nZXQgPSAiXFxJTkZCIn0sCgoJewoJIC5uYW1lID0gIkwzSCIsCgkgLm10X21sZWQgPSAiTUxFRCIsCgkgLm10X3dsZWQgPSAiV0xFRCIsCgkgLm10X2xjZF9zd2l0Y2ggPSAiRUhLIiwKCSAubGNkX3N0YXR1cyA9ICJcXF9TQi5QQ0kwLlBNLlBCQyIsCgkgLmJyaWdodG5lc3Nfc2V0ID0gIlNQTFYiLAoJIC5icmlnaHRuZXNzX2dldCA9ICJHUExWIiwKCSAuZGlzcGxheV9zZXQgPSAiU0RTUCIsCgkgLmRpc3BsYXlfZ2V0ID0gIlxcSU5GQiJ9LAoKCXsKCSAubmFtZSA9ICJMNFIiLAoJIC5tdF9tbGVkID0gIk1MRUQiLAoJIC5tdF93bGVkID0gIldMRUQiLAoJIC53bGVkX3N0YXR1cyA9ICJcXF9TQi5QQ0kwLlNCUkcuU0cxMyIsCgkgLm10X2xjZF9zd2l0Y2ggPSB4eE5fUFJFRklYICJfUTEwIiwKCSAubGNkX3N0YXR1cyA9ICJcXF9TQi5QQ0kwLlNCU00uU0VPNCIsCgkgLmJyaWdodG5lc3Nfc2V0ID0gIlNQTFYiLAoJIC5icmlnaHRuZXNzX2dldCA9ICJHUExWIiwKCSAuZGlzcGxheV9zZXQgPSAiU0RTUCIsCgkgLmRpc3BsYXlfZ2V0ID0gIlxcX1NCLlBDSTAuUDBQMS5WR0EuR0VURCJ9LAoKCXsKCSAubmFtZSA9ICJMNXgiLAoJIC5tdF9tbGVkID0gIk1MRUQiLAovKiBXTEVEIHByZXNlbnQsIGJ1dCBub3QgY29udHJvbGxlZCBieSBBQ1BJICovCgkgLm10X3RsZWQgPSAiVExFRCIsCgkgLm10X2xjZF9zd2l0Y2ggPSAiXFxRMEQiLAoJIC5sY2Rfc3RhdHVzID0gIlxcQkFPRiIsCgkgLmJyaWdodG5lc3Nfc2V0ID0gIlNQTFYiLAoJIC5icmlnaHRuZXNzX2dldCA9ICJHUExWIiwKCSAuZGlzcGxheV9zZXQgPSAiU0RTUCIsCgkgLmRpc3BsYXlfZ2V0ID0gIlxcSU5GQiJ9LAoKCXsKCSAubmFtZSA9ICJMOEwiCi8qIE5vIGZlYXR1cmVzLCBidXQgYXQgbGVhc3Qgc3VwcG9ydCB0aGUgaG90a2V5cyAqLwoJIH0sCgoJewoJIC5uYW1lID0gIk0xQSIsCgkgLm10X21sZWQgPSAiTUxFRCIsCgkgLm10X2xjZF9zd2l0Y2ggPSBNMUFfUFJFRklYICJRMTAiLAoJIC5sY2Rfc3RhdHVzID0gIlxcUE5PRiIsCgkgLmJyaWdodG5lc3NfdXAgPSBNMUFfUFJFRklYICJRMEUiLAoJIC5icmlnaHRuZXNzX2Rvd24gPSBNMUFfUFJFRklYICJRMEYiLAoJIC5icmlnaHRuZXNzX3N0YXR1cyA9ICJcXEJSSVQiLAoJIC5kaXNwbGF5X3NldCA9ICJTRFNQIiwKCSAuZGlzcGxheV9nZXQgPSAiXFxJTkZCIn0sCgoJewoJIC5uYW1lID0gIk0yRSIsCgkgLm10X21sZWQgPSAiTUxFRCIsCgkgLm10X3dsZWQgPSAiV0xFRCIsCgkgLm10X2xjZF9zd2l0Y2ggPSAiXFxRMTAiLAoJIC5sY2Rfc3RhdHVzID0gIlxcR1AwNiIsCgkgLmJyaWdodG5lc3Nfc2V0ID0gIlNQTFYiLAoJIC5icmlnaHRuZXNzX2dldCA9ICJHUExWIiwKCSAuZGlzcGxheV9zZXQgPSAiU0RTUCIsCgkgLmRpc3BsYXlfZ2V0ID0gIlxcSU5GQiJ9LAoKCXsKCSAubmFtZSA9ICJNNk4iLAoJIC5tdF9tbGVkID0gIk1MRUQiLAoJIC5tdF93bGVkID0gIldMRUQiLAoJIC53bGVkX3N0YXR1cyA9ICJcXF9TQi5QQ0kwLlNCUkcuU0cxMyIsCgkgLm10X2xjZF9zd2l0Y2ggPSB4eE5fUFJFRklYICJfUTEwIiwKCSAubGNkX3N0YXR1cyA9ICJcXF9TQi5CS0xUIiwKCSAuYnJpZ2h0bmVzc19zZXQgPSAiU1BMViIsCgkgLmJyaWdodG5lc3NfZ2V0ID0gIkdQTFYiLAoJIC5kaXNwbGF5X3NldCA9ICJTRFNQIiwKCSAuZGlzcGxheV9nZXQgPSAiXFxTU1RFIn0sCgoJewoJIC5uYW1lID0gIk02UiIsCgkgLm10X21sZWQgPSAiTUxFRCIsCgkgLm10X3dsZWQgPSAiV0xFRCIsCgkgLm10X2xjZF9zd2l0Y2ggPSB4eE5fUFJFRklYICJfUTEwIiwKCSAubGNkX3N0YXR1cyA9ICJcXF9TQi5QQ0kwLlNCU00uU0VPNCIsCgkgLmJyaWdodG5lc3Nfc2V0ID0gIlNQTFYiLAoJIC5icmlnaHRuZXNzX2dldCA9ICJHUExWIiwKCSAuZGlzcGxheV9zZXQgPSAiU0RTUCIsCgkgLmRpc3BsYXlfZ2V0ID0gIlxcX1NCLlBDSTAuUDBQMS5WR0EuR0VURCJ9LAoKCXsKCSAubmFtZSA9ICJQMzAiLAoJIC5tdF93bGVkID0gIldMRUQiLAoJIC5tdF9sY2Rfc3dpdGNoID0gUDMwX1BSRUZJWCAiX1EwRSIsCgkgLmxjZF9zdGF0dXMgPSAiXFxCS0xUIiwKCSAuYnJpZ2h0bmVzc191cCA9IFAzMF9QUkVGSVggIl9RNjgiLAoJIC5icmlnaHRuZXNzX2Rvd24gPSBQMzBfUFJFRklYICJfUTY5IiwKCSAuYnJpZ2h0bmVzc19nZXQgPSAiR1BMViIsCgkgLmRpc3BsYXlfc2V0ID0gIlNEU1AiLAoJIC5kaXNwbGF5X2dldCA9ICJcXEROWFQifSwKCgl7CgkgLm5hbWUgPSAiUzF4IiwKCSAubXRfbWxlZCA9ICJNTEVEIiwKCSAubWxlZF9zdGF0dXMgPSAiXFxFTUxFIiwKCSAubXRfd2xlZCA9ICJXTEVEIiwKCSAubXRfbGNkX3N3aXRjaCA9IFMxeF9QUkVGSVggIlExMCIsCgkgLmxjZF9zdGF0dXMgPSAiXFxQTk9GIiwKCSAuYnJpZ2h0bmVzc19zZXQgPSAiU1BMViIsCgkgLmJyaWdodG5lc3NfZ2V0ID0gIkdQTFYifSwKCgl7CgkgLm5hbWUgPSAiUzJ4IiwKCSAubXRfbWxlZCA9ICJNTEVEIiwKCSAubWxlZF9zdGF0dXMgPSAiXFxNQUlMIiwKCSAubXRfbGNkX3N3aXRjaCA9IFMyeF9QUkVGSVggIl9RMTAiLAoJIC5sY2Rfc3RhdHVzID0gIlxcQktMSSIsCgkgLmJyaWdodG5lc3NfdXAgPSBTMnhfUFJFRklYICJfUTBCIiwKCSAuYnJpZ2h0bmVzc19kb3duID0gUzJ4X1BSRUZJWCAiX1EwQSJ9LAoKCXsKCSAubmFtZSA9ICJXMU4iLAoJIC5tdF9tbGVkID0gIk1MRUQiLAoJIC5tdF93bGVkID0gIldMRUQiLAoJIC5tdF9sZWRkID0gIlNMQ00iLAoJIC5tdF9sY2Rfc3dpdGNoID0geHhOX1BSRUZJWCAiX1ExMCIsCgkgLmxjZF9zdGF0dXMgPSAiXFxCS0xUIiwKCSAuYnJpZ2h0bmVzc19zZXQgPSAiU1BMViIsCgkgLmJyaWdodG5lc3NfZ2V0ID0gIkdQTFYiLAoJIC5kaXNwbGF5X3NldCA9ICJTRFNQIiwKCSAuZGlzcGxheV9nZXQgPSAiXFxBRFZHIn0sCgoJewoJIC5uYW1lID0gIlc1QSIsCgkgLm10X2J0X3N3aXRjaCA9ICJCTEVEIiwKCSAubXRfd2xlZCA9ICJXTEVEIiwKCSAubXRfbGNkX3N3aXRjaCA9IHh4Tl9QUkVGSVggIl9RMTAiLAoJIC5icmlnaHRuZXNzX3NldCA9ICJTUExWIiwKCSAuYnJpZ2h0bmVzc19nZXQgPSAiR1BMViIsCgkgLmRpc3BsYXlfc2V0ID0gIlNEU1AiLAoJIC5kaXNwbGF5X2dldCA9ICJcXEFEVkcifSwKCgl7CgkgLm5hbWUgPSAieHhOIiwKCSAubXRfbWxlZCA9ICJNTEVEIiwKLyogV0xFRCBwcmVzZW50LCBidXQgbm90IGNvbnRyb2xsZWQgYnkgQUNQSSAqLwoJIC5tdF9sY2Rfc3dpdGNoID0geHhOX1BSRUZJWCAiX1ExMCIsCgkgLmxjZF9zdGF0dXMgPSAiXFxCS0xUIiwKCSAuYnJpZ2h0bmVzc19zZXQgPSAiU1BMViIsCgkgLmJyaWdodG5lc3NfZ2V0ID0gIkdQTFYiLAoJIC5kaXNwbGF5X3NldCA9ICJTRFNQIiwKCSAuZGlzcGxheV9nZXQgPSAiXFxBRFZHIn0KfTsKCi8qIHByb2NkaXIgd2UgdXNlICovCnN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmFzdXNfcHJvY19kaXI7CgovKgogKiBUaGlzIGhlYWRlciBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbGxvdyBwcm9wZXIgY29uZmlndXJhdGlvbiBnaXZlbiBtb2RlbCwKICogcmV2aXNpb24gbnVtYmVyICwgLi4uIHRoaXMgaW5mbyBjYW5ub3QgZ28gaW4gc3RydWN0IGFzdXNfaG90ayBiZWNhdXNlIGl0IGlzCiAqIGF2YWlsYWJsZSBiZWZvcmUgdGhlIGhvdGsKICovCnN0YXRpYyBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmFzdXNfaW5mbzsKCi8qIFRoZSBhY3R1YWwgZGV2aWNlIHRoZSBkcml2ZXIgYmluZHMgdG8gKi8Kc3RhdGljIHN0cnVjdCBhc3VzX2hvdGsgKmhvdGs7CgovKgogKiBUaGUgaG90a2V5IGRyaXZlciBkZWNsYXJhdGlvbgogKi8Kc3RhdGljIGludCBhc3VzX2hvdGtfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKc3RhdGljIGludCBhc3VzX2hvdGtfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CnN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYXN1c19ob3RrX2RyaXZlciA9IHsKCS5uYW1lID0gQUNQSV9IT1RLX05BTUUsCgkuY2xhc3MgPSBBQ1BJX0hPVEtfQ0xBU1MsCgkuaWRzID0gQUNQSV9IT1RLX0hJRCwKCS5vcHMgPSB7CgkJLmFkZCA9IGFzdXNfaG90a19hZGQsCgkJLnJlbW92ZSA9IGFzdXNfaG90a19yZW1vdmUsCgkJfSwKfTsKCi8qIAogKiBUaGlzIGZ1bmN0aW9uIGV2YWx1YXRlcyBhbiBBQ1BJIG1ldGhvZCwgZ2l2ZW4gYW4gaW50IGFzIHBhcmFtZXRlciwgdGhlCiAqIG1ldGhvZCBpcyBzZWFyY2hlZCB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBoYW5kbGUsIGNhbiBiZSBOVUxMLiBUaGUgb3V0cHV0CiAqIG9mIHRoZSBtZXRob2QgaXMgd3JpdHRlbiBpcyBvdXRwdXQsIHdoaWNoIGNhbiBhbHNvIGJlIE5VTEwKICoKICogcmV0dXJucyAxIGlmIHdyaXRlIGlzIHN1Y2Nlc3NmdWwsIDAgZWxzZS4gCiAqLwpzdGF0aWMgaW50IHdyaXRlX2FjcGlfaW50KGFjcGlfaGFuZGxlIGhhbmRsZSwgY29uc3QgY2hhciAqbWV0aG9kLCBpbnQgdmFsLAoJCQkgIHN0cnVjdCBhY3BpX2J1ZmZlciAqb3V0cHV0KQp7CglzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBwYXJhbXM7CS8vbGlzdCBvZiBpbnB1dCBwYXJhbWV0ZXJzIChhbiBpbnQgaGVyZSkKCXVuaW9uIGFjcGlfb2JqZWN0IGluX29iajsJLy90aGUgb25seSBwYXJhbSB3ZSB1c2UKCWFjcGlfc3RhdHVzIHN0YXR1czsKCglwYXJhbXMuY291bnQgPSAxOwoJcGFyYW1zLnBvaW50ZXIgPSAmaW5fb2JqOwoJaW5fb2JqLnR5cGUgPSBBQ1BJX1RZUEVfSU5URUdFUjsKCWluX29iai5pbnRlZ2VyLnZhbHVlID0gdmFsOwoKCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgKGNoYXIgKiltZXRob2QsICZwYXJhbXMsIG91dHB1dCk7CglyZXR1cm4gKHN0YXR1cyA9PSBBRV9PSyk7Cn0KCnN0YXRpYyBpbnQgcmVhZF9hY3BpX2ludChhY3BpX2hhbmRsZSBoYW5kbGUsIGNvbnN0IGNoYXIgKm1ldGhvZCwgaW50ICp2YWwpCnsKCXN0cnVjdCBhY3BpX2J1ZmZlciBvdXRwdXQ7Cgl1bmlvbiBhY3BpX29iamVjdCBvdXRfb2JqOwoJYWNwaV9zdGF0dXMgc3RhdHVzOwoKCW91dHB1dC5sZW5ndGggPSBzaXplb2Yob3V0X29iaik7CglvdXRwdXQucG9pbnRlciA9ICZvdXRfb2JqOwoKCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgKGNoYXIgKiltZXRob2QsIE5VTEwsICZvdXRwdXQpOwoJKnZhbCA9IG91dF9vYmouaW50ZWdlci52YWx1ZTsKCXJldHVybiAoc3RhdHVzID09IEFFX09LKSAmJiAob3V0X29iai50eXBlID09IEFDUElfVFlQRV9JTlRFR0VSKTsKfQoKLyoKICogV2Ugd3JpdGUgb3VyIGluZm8gaW4gcGFnZSwgd2UgYmVnaW4gYXQgb2Zmc2V0IG9mZiBhbmQgY2Fubm90IHdyaXRlIG1vcmUKICogdGhhbiBjb3VudCBieXRlcy4gV2Ugc2V0IGVvZiB0byAxIGlmIHdlIGhhbmRsZSB0aG9zZSAyIHZhbHVlcy4gV2UgcmV0dXJuIHRoZQogKiBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBpbiBwYWdlCiAqLwpzdGF0aWMgaW50CnByb2NfcmVhZF9pbmZvKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLAoJICAgICAgIHZvaWQgKmRhdGEpCnsKCWludCBsZW4gPSAwOwoJaW50IHRlbXA7CgljaGFyIGJ1ZlsxNl07CQkvL2Vub3VnaCBmb3IgYWxsIGluZm8KCS8qCgkgKiBXZSB1c2UgdGhlIGVhc3kgd2F5LCB3ZSBkb24ndCBjYXJlIG9mIG9mZiBhbmQgY291bnQsIHNvIHdlIGRvbid0IHNldCBlb2YKCSAqIHRvIDEKCSAqLwoKCWxlbiArPSBzcHJpbnRmKHBhZ2UsIEFDUElfSE9US19OQU1FICIgIiBBU1VTX0FDUElfVkVSU0lPTiAiXG4iKTsKCWxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJNb2RlbCByZWZlcmVuY2UgICAgOiAlc1xuIiwKCQkgICAgICAgaG90ay0+bWV0aG9kcy0+bmFtZSk7CgkvKiAKCSAqIFRoZSBTRlVOIG1ldGhvZCBwcm9iYWJseSBhbGxvd3MgdGhlIG9yaWdpbmFsIGRyaXZlciB0byBnZXQgdGhlIGxpc3QgCgkgKiBvZiBmZWF0dXJlcyBzdXBwb3J0ZWQgYnkgYSBnaXZlbiBtb2RlbC4gRm9yIG5vdywgMHgwMTAwIG9yIDB4MDgwMCAKCSAqIGJpdCBzaWduaWZpZXMgdGhhdCB0aGUgbGFwdG9wIGlzIGVxdWlwcGVkIHdpdGggYSBXaS1GaSBNaW5pUENJIGNhcmQuCgkgKiBUaGUgc2lnbmlmaWNhbmNlIG9mIG90aGVycyBpcyB5ZXQgdG8gYmUgZm91bmQuCgkgKi8KCWlmIChyZWFkX2FjcGlfaW50KGhvdGstPmhhbmRsZSwgIlNGVU4iLCAmdGVtcCkpCgkJbGVuICs9CgkJICAgIHNwcmludGYocGFnZSArIGxlbiwgIlNGVU4gdmFsdWUgICAgICAgICA6IDB4JTA0eFxuIiwgdGVtcCk7CgkvKgoJICogQW5vdGhlciB2YWx1ZSBmb3IgdXNlcnNwYWNlOiB0aGUgQVNZTSBtZXRob2QgcmV0dXJucyAweDAyIGZvcgoJICogYmF0dGVyeSBsb3cgYW5kIDB4MDQgZm9yIGJhdHRlcnkgY3JpdGljYWwsIGl0cyByZWFkaW5ncyB0ZW5kIHRvIGJlCgkgKiBtb3JlIGFjY3VyYXRlIHRoYW4gdGhvc2UgcHJvdmlkZWQgYnkgX0JTVC4gCgkgKiBOb3RlOiBzaW5jZSBub3QgYWxsIHRoZSBsYXB0b3BzIHByb3ZpZGUgdGhpcyBtZXRob2QsIGVycm9ycyBhcmUKCSAqIHNpbGVudGx5IGlnbm9yZWQuCgkgKi8KCWlmIChyZWFkX2FjcGlfaW50KGhvdGstPmhhbmRsZSwgIkFTWU0iLCAmdGVtcCkpCgkJbGVuICs9CgkJICAgIHNwcmludGYocGFnZSArIGxlbiwgIkFTWU0gdmFsdWUgICAgICAgICA6IDB4JTA0eFxuIiwgdGVtcCk7CglpZiAoYXN1c19pbmZvKSB7CgkJc25wcmludGYoYnVmLCAxNiwgIiVkIiwgYXN1c19pbmZvLT5sZW5ndGgpOwoJCWxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJEU0RUIGxlbmd0aCAgICAgICAgOiAlc1xuIiwgYnVmKTsKCQlzbnByaW50ZihidWYsIDE2LCAiJWQiLCBhc3VzX2luZm8tPmNoZWNrc3VtKTsKCQlsZW4gKz0gc3ByaW50ZihwYWdlICsgbGVuLCAiRFNEVCBjaGVja3N1bSAgICAgIDogJXNcbiIsIGJ1Zik7CgkJc25wcmludGYoYnVmLCAxNiwgIiVkIiwgYXN1c19pbmZvLT5yZXZpc2lvbik7CgkJbGVuICs9IHNwcmludGYocGFnZSArIGxlbiwgIkRTRFQgcmV2aXNpb24gICAgICA6ICVzXG4iLCBidWYpOwoJCXNucHJpbnRmKGJ1ZiwgNywgIiVzIiwgYXN1c19pbmZvLT5vZW1faWQpOwoJCWxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJPRU0gaWQgICAgICAgICAgICAgOiAlc1xuIiwgYnVmKTsKCQlzbnByaW50ZihidWYsIDksICIlcyIsIGFzdXNfaW5mby0+b2VtX3RhYmxlX2lkKTsKCQlsZW4gKz0gc3ByaW50ZihwYWdlICsgbGVuLCAiT0VNIHRhYmxlIGlkICAgICAgIDogJXNcbiIsIGJ1Zik7CgkJc25wcmludGYoYnVmLCAxNiwgIiV4IiwgYXN1c19pbmZvLT5vZW1fcmV2aXNpb24pOwoJCWxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJPRU0gcmV2aXNpb24gICAgICAgOiAweCVzXG4iLCBidWYpOwoJCXNucHJpbnRmKGJ1ZiwgNSwgIiVzIiwgYXN1c19pbmZvLT5hc2xfY29tcGlsZXJfaWQpOwoJCWxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJBU0wgY29tcCB2ZW5kb3IgaWQgOiAlc1xuIiwgYnVmKTsKCQlzbnByaW50ZihidWYsIDE2LCAiJXgiLCBhc3VzX2luZm8tPmFzbF9jb21waWxlcl9yZXZpc2lvbik7CgkJbGVuICs9IHNwcmludGYocGFnZSArIGxlbiwgIkFTTCBjb21wIHJldmlzaW9uICA6IDB4JXNcbiIsIGJ1Zik7Cgl9CgoJcmV0dXJuIGxlbjsKfQoKLyoKICogL3Byb2MgaGFuZGxlcnMKICogV2Ugd3JpdGUgb3VyIGluZm8gaW4gcGFnZSwgd2UgYmVnaW4gYXQgb2Zmc2V0IG9mZiBhbmQgY2Fubm90IHdyaXRlIG1vcmUKICogdGhhbiBjb3VudCBieXRlcy4gV2Ugc2V0IGVvZiB0byAxIGlmIHdlIGhhbmRsZSB0aG9zZSAyIHZhbHVlcy4gV2UgcmV0dXJuIHRoZQogKiBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBpbiBwYWdlCiAqLwoKLyogR2VuZXJpYyBMRUQgZnVuY3Rpb25zICovCnN0YXRpYyBpbnQgcmVhZF9sZWQoY29uc3QgY2hhciAqbGVkbmFtZSwgaW50IGxlZG1hc2spCnsKCWlmIChsZWRuYW1lKSB7CgkJaW50IGxlZF9zdGF0dXM7CgoJCWlmIChyZWFkX2FjcGlfaW50KE5VTEwsIGxlZG5hbWUsICZsZWRfc3RhdHVzKSkKCQkJcmV0dXJuIGxlZF9zdGF0dXM7CgkJZWxzZQoJCQlwcmludGsoS0VSTl9XQVJOSU5HICJBc3VzIEFDUEk6IEVycm9yIHJlYWRpbmcgTEVEICIKCQkJICAgICAgICJzdGF0dXNcbiIpOwoJfQoJcmV0dXJuIChob3RrLT5zdGF0dXMgJiBsZWRtYXNrKSA/IDEgOiAwOwp9CgpzdGF0aWMgaW50IHBhcnNlX2FyZyhjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZiwgdW5zaWduZWQgbG9uZyBjb3VudCwgaW50ICp2YWwpCnsKCWNoYXIgc1szMl07CglpZiAoIWNvdW50KQoJCXJldHVybiAwOwoJaWYgKGNvdW50ID4gMzEpCgkJcmV0dXJuIC1FSU5WQUw7CglpZiAoY29weV9mcm9tX3VzZXIocywgYnVmLCBjb3VudCkpCgkJcmV0dXJuIC1FRkFVTFQ7CglzW2NvdW50XSA9IDA7CglpZiAoc3NjYW5mKHMsICIlaSIsIHZhbCkgIT0gMSkKCQlyZXR1cm4gLUVJTlZBTDsKCXJldHVybiBjb3VudDsKfQoKLyogRklYTUU6IGtpbGwgZXh0cmFuZW91cyBhcmdzIHNvIGl0IGNhbiBiZSBjYWxsZWQgaW5kZXBlbmRlbnRseSAqLwpzdGF0aWMgaW50CndyaXRlX2xlZChjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwgdW5zaWduZWQgbG9uZyBjb3VudCwKCSAgY2hhciAqbGVkbmFtZSwgaW50IGxlZG1hc2ssIGludCBpbnZlcnQpCnsKCWludCB2YWx1ZTsKCWludCBsZWRfb3V0ID0gMDsKCgljb3VudCA9IHBhcnNlX2FyZyhidWZmZXIsIGNvdW50LCAmdmFsdWUpOwoJaWYgKGNvdW50ID4gMCkKCQlsZWRfb3V0ID0gdmFsdWUgPyAxIDogMDsKCglob3RrLT5zdGF0dXMgPQoJICAgIChsZWRfb3V0KSA/IChob3RrLT5zdGF0dXMgfCBsZWRtYXNrKSA6IChob3RrLT5zdGF0dXMgJiB+bGVkbWFzayk7CgoJaWYgKGludmVydCkJCS8qIGludmVydCB0YXJnZXQgdmFsdWUgKi8KCQlsZWRfb3V0ID0gIWxlZF9vdXQgJiAweDE7CgoJaWYgKCF3cml0ZV9hY3BpX2ludChob3RrLT5oYW5kbGUsIGxlZG5hbWUsIGxlZF9vdXQsIE5VTEwpKQoJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFzdXMgQUNQSTogTEVEICglcykgd3JpdGUgZmFpbGVkXG4iLAoJCSAgICAgICBsZWRuYW1lKTsKCglyZXR1cm4gY291bnQ7Cn0KCi8qCiAqIFByb2MgaGFuZGxlcnMgZm9yIE1MRUQKICovCnN0YXRpYyBpbnQKcHJvY19yZWFkX21sZWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsCgkgICAgICAgdm9pZCAqZGF0YSkKewoJcmV0dXJuIHNwcmludGYocGFnZSwgIiVkXG4iLAoJCSAgICAgICByZWFkX2xlZChob3RrLT5tZXRob2RzLT5tbGVkX3N0YXR1cywgTUxFRF9PTikpOwp9CgpzdGF0aWMgaW50CnByb2Nfd3JpdGVfbWxlZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCgkJdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKewoJcmV0dXJuIHdyaXRlX2xlZChidWZmZXIsIGNvdW50LCBob3RrLT5tZXRob2RzLT5tdF9tbGVkLCBNTEVEX09OLCAxKTsKfQoKLyoKICogUHJvYyBoYW5kbGVycyBmb3IgTEVEIGRpc3BsYXkKICovCnN0YXRpYyBpbnQKcHJvY19yZWFkX2xlZGQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsCgkgICAgICAgdm9pZCAqZGF0YSkKewoJcmV0dXJuIHNwcmludGYocGFnZSwgIjB4JTA4eFxuIiwgaG90ay0+bGVkZF9zdGF0dXMpOwp9CgpzdGF0aWMgaW50CnByb2Nfd3JpdGVfbGVkZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCgkJdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKewoJaW50IHZhbHVlOwoKCWNvdW50ID0gcGFyc2VfYXJnKGJ1ZmZlciwgY291bnQsICZ2YWx1ZSk7CglpZiAoY291bnQgPiAwKSB7CgkJaWYgKCF3cml0ZV9hY3BpX2ludAoJCSAgICAoaG90ay0+aGFuZGxlLCBob3RrLT5tZXRob2RzLT5tdF9sZWRkLCB2YWx1ZSwgTlVMTCkpCgkJCXByaW50ayhLRVJOX1dBUk5JTkcKCQkJICAgICAgICJBc3VzIEFDUEk6IExFRCBkaXNwbGF5IHdyaXRlIGZhaWxlZFxuIik7CgkJZWxzZQoJCQlob3RrLT5sZWRkX3N0YXR1cyA9ICh1MzIpIHZhbHVlOwoJfSBlbHNlIGlmIChjb3VudCA8IDApCgkJcHJpbnRrKEtFUk5fV0FSTklORyAiQXN1cyBBQ1BJOiBFcnJvciByZWFkaW5nIHVzZXIgaW5wdXRcbiIpOwoKCXJldHVybiBjb3VudDsKfQoKLyoKICogUHJvYyBoYW5kbGVycyBmb3IgV0xFRAogKi8Kc3RhdGljIGludApwcm9jX3JlYWRfd2xlZChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwKCSAgICAgICB2b2lkICpkYXRhKQp7CglyZXR1cm4gc3ByaW50ZihwYWdlLCAiJWRcbiIsCgkJICAgICAgIHJlYWRfbGVkKGhvdGstPm1ldGhvZHMtPndsZWRfc3RhdHVzLCBXTEVEX09OKSk7Cn0KCnN0YXRpYyBpbnQKcHJvY193cml0ZV93bGVkKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKCQl1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQp7CglyZXR1cm4gd3JpdGVfbGVkKGJ1ZmZlciwgY291bnQsIGhvdGstPm1ldGhvZHMtPm10X3dsZWQsIFdMRURfT04sIDApOwp9CgovKgogKiBQcm9jIGhhbmRsZXJzIGZvciBCbHVldG9vdGgKICovCnN0YXRpYyBpbnQKcHJvY19yZWFkX2JsdWV0b290aChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwKCQkgICAgdm9pZCAqZGF0YSkKewoJcmV0dXJuIHNwcmludGYocGFnZSwgIiVkXG4iLCByZWFkX2xlZChob3RrLT5tZXRob2RzLT5idF9zdGF0dXMsIEJUX09OKSk7Cn0KCnN0YXRpYyBpbnQKcHJvY193cml0ZV9ibHVldG9vdGgoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAoJCSAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKewoJLyogTm90ZTogbXRfYnRfc3dpdGNoIGNvbnRyb2xzIGJvdGggaW50ZXJuYWwgQmx1ZXRvb3RoIGFkYXB0ZXIncyAKCSAgIHByZXNlbmNlIGFuZCBpdHMgTEVEICovCglyZXR1cm4gd3JpdGVfbGVkKGJ1ZmZlciwgY291bnQsIGhvdGstPm1ldGhvZHMtPm10X2J0X3N3aXRjaCwgQlRfT04sIDApOwp9CgovKgogKiBQcm9jIGhhbmRsZXJzIGZvciBUTEVECiAqLwpzdGF0aWMgaW50CnByb2NfcmVhZF90bGVkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLAoJICAgICAgIHZvaWQgKmRhdGEpCnsKCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlZFxuIiwKCQkgICAgICAgcmVhZF9sZWQoaG90ay0+bWV0aG9kcy0+dGxlZF9zdGF0dXMsIFRMRURfT04pKTsKfQoKc3RhdGljIGludApwcm9jX3dyaXRlX3RsZWQoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAoJCXVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCnsKCXJldHVybiB3cml0ZV9sZWQoYnVmZmVyLCBjb3VudCwgaG90ay0+bWV0aG9kcy0+bXRfdGxlZCwgVExFRF9PTiwgMCk7Cn0KCnN0YXRpYyBpbnQgZ2V0X2xjZF9zdGF0ZSh2b2lkKQp7CglpbnQgbGNkID0gMDsKCglpZiAoaG90ay0+bW9kZWwgIT0gTDNIKSB7CgkJLyogV2UgZG9uJ3QgaGF2ZSB0byBjaGVjayBhbnl0aGluZyBpZiB3ZSBhcmUgaGVyZSAqLwoJCWlmICghcmVhZF9hY3BpX2ludChOVUxMLCBob3RrLT5tZXRob2RzLT5sY2Rfc3RhdHVzLCAmbGNkKSkKCQkJcHJpbnRrKEtFUk5fV0FSTklORwoJCQkgICAgICAgIkFzdXMgQUNQSTogRXJyb3IgcmVhZGluZyBMQ0Qgc3RhdHVzXG4iKTsKCgkJaWYgKGhvdGstPm1vZGVsID09IEwyRCkKCQkJbGNkID0gfmxjZDsKCX0gZWxzZSB7CQkvKiBMM0ggYW5kIHRoZSBsaWtlIGhhdmUgdG8gYmUgaGFuZGxlZCBkaWZmZXJlbnRseSAqLwoJCWFjcGlfc3RhdHVzIHN0YXR1cyA9IDA7CgkJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgaW5wdXQ7CgkJdW5pb24gYWNwaV9vYmplY3QgbXRfcGFyYW1zWzJdOwoJCXN0cnVjdCBhY3BpX2J1ZmZlciBvdXRwdXQ7CgkJdW5pb24gYWNwaV9vYmplY3Qgb3V0X29iajsKCgkJaW5wdXQuY291bnQgPSAyOwoJCWlucHV0LnBvaW50ZXIgPSBtdF9wYXJhbXM7CgkJLyogTm90ZTogdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHBhcnRseSBndWVzc2VkIHVwLCBidXQgCgkJICAgb3RoZXJ3aXNlIHRoZXkgc2VlbSB0byB3b3JrICovCgkJbXRfcGFyYW1zWzBdLnR5cGUgPSBBQ1BJX1RZUEVfSU5URUdFUjsKCQltdF9wYXJhbXNbMF0uaW50ZWdlci52YWx1ZSA9IDB4MDI7CgkJbXRfcGFyYW1zWzFdLnR5cGUgPSBBQ1BJX1RZUEVfSU5URUdFUjsKCQltdF9wYXJhbXNbMV0uaW50ZWdlci52YWx1ZSA9IDB4MDI7CgoJCW91dHB1dC5sZW5ndGggPSBzaXplb2Yob3V0X29iaik7CgkJb3V0cHV0LnBvaW50ZXIgPSAmb3V0X29iajsKCgkJc3RhdHVzID0KCQkgICAgYWNwaV9ldmFsdWF0ZV9vYmplY3QoTlVMTCwgaG90ay0+bWV0aG9kcy0+bGNkX3N0YXR1cywKCQkJCQkgJmlucHV0LCAmb3V0cHV0KTsKCQlpZiAoc3RhdHVzICE9IEFFX09LKQoJCQlyZXR1cm4gLTE7CgkJaWYgKG91dF9vYmoudHlwZSA9PSBBQ1BJX1RZUEVfSU5URUdFUikKCQkJLyogVGhhdCdzIHdoYXQgdGhlIEFNTCBjb2RlIGRvZXMgKi8KCQkJbGNkID0gb3V0X29iai5pbnRlZ2VyLnZhbHVlID4+IDg7Cgl9CgoJcmV0dXJuIChsY2QgJiAxKTsKfQoKc3RhdGljIGludCBzZXRfbGNkX3N0YXRlKGludCB2YWx1ZSkKewoJaW50IGxjZCA9IDA7CglhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOwoKCWxjZCA9IHZhbHVlID8gMSA6IDA7CglpZiAobGNkICE9IGdldF9sY2Rfc3RhdGUoKSkgewoJCS8qIHN3aXRjaCAqLwoJCWlmIChob3RrLT5tb2RlbCAhPSBMM0gpIHsKCQkJc3RhdHVzID0KCQkJICAgIGFjcGlfZXZhbHVhdGVfb2JqZWN0KE5VTEwsCgkJCQkJCSBob3RrLT5tZXRob2RzLT5tdF9sY2Rfc3dpdGNoLAoJCQkJCQkgTlVMTCwgTlVMTCk7CgkJfSBlbHNlIHsJLyogTDNIIGFuZCB0aGUgbGlrZSBoYXZlIHRvIGJlIGhhbmRsZWQgZGlmZmVyZW50bHkgKi8KCQkJaWYgKCF3cml0ZV9hY3BpX2ludAoJCQkgICAgKGhvdGstPmhhbmRsZSwgaG90ay0+bWV0aG9kcy0+bXRfbGNkX3N3aXRjaCwgMHgwNywKCQkJICAgICBOVUxMKSkKCQkJCXN0YXR1cyA9IEFFX0VSUk9SOwoJCQkvKiBMM0gncyBBTUwgZXhlY3V0ZXMgRUhLICgweDA3KSB1cG9uIEZuK0Y3IGtleXByZXNzLCAKCQkJICAgdGhlIGV4YWN0IGJlaGF2aW91ciBpcyBzaW11bGF0ZWQgaGVyZSAqLwoJCX0KCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCgkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFzdXMgQUNQSTogRXJyb3Igc3dpdGNoaW5nIExDRFxuIik7Cgl9CglyZXR1cm4gMDsKCn0KCnN0YXRpYyBpbnQKcHJvY19yZWFkX2xjZChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwKCSAgICAgIHZvaWQgKmRhdGEpCnsKCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlZFxuIiwgZ2V0X2xjZF9zdGF0ZSgpKTsKfQoKc3RhdGljIGludApwcm9jX3dyaXRlX2xjZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCgkgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKewoJaW50IHZhbHVlOwoKCWNvdW50ID0gcGFyc2VfYXJnKGJ1ZmZlciwgY291bnQsICZ2YWx1ZSk7CglpZiAoY291bnQgPiAwKQoJCXNldF9sY2Rfc3RhdGUodmFsdWUpOwoJcmV0dXJuIGNvdW50Owp9CgpzdGF0aWMgaW50IHJlYWRfYnJpZ2h0bmVzcyh2b2lkKQp7CglpbnQgdmFsdWU7CgoJaWYgKGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3NfZ2V0KSB7CS8qIFNQTFYvR1BMViBsYXB0b3AgKi8KCQlpZiAoIXJlYWRfYWNwaV9pbnQoaG90ay0+aGFuZGxlLCBob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX2dldCwKCQkJCSAgICZ2YWx1ZSkpCgkJCXByaW50ayhLRVJOX1dBUk5JTkcKCQkJICAgICAgICJBc3VzIEFDUEk6IEVycm9yIHJlYWRpbmcgYnJpZ2h0bmVzc1xuIik7Cgl9IGVsc2UgaWYgKGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3Nfc3RhdHVzKSB7CS8qIEZvciBEMSBmb3IgZXhhbXBsZSAqLwoJCWlmICghcmVhZF9hY3BpX2ludChOVUxMLCBob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX3N0YXR1cywKCQkJCSAgICZ2YWx1ZSkpCgkJCXByaW50ayhLRVJOX1dBUk5JTkcKCQkJICAgICAgICJBc3VzIEFDUEk6IEVycm9yIHJlYWRpbmcgYnJpZ2h0bmVzc1xuIik7Cgl9IGVsc2UJCQkvKiBObyBHUExWIG1ldGhvZCAqLwoJCXZhbHVlID0gaG90ay0+YnJpZ2h0bmVzczsKCXJldHVybiB2YWx1ZTsKfQoKLyoKICogQ2hhbmdlIHRoZSBicmlnaHRuZXNzIGxldmVsCiAqLwpzdGF0aWMgdm9pZCBzZXRfYnJpZ2h0bmVzcyhpbnQgdmFsdWUpCnsKCWFjcGlfc3RhdHVzIHN0YXR1cyA9IDA7CgoJLyogU1BMViBsYXB0b3AgKi8KCWlmIChob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX3NldCkgewoJCWlmICghd3JpdGVfYWNwaV9pbnQoaG90ay0+aGFuZGxlLCBob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX3NldCwKCQkJCSAgICB2YWx1ZSwgTlVMTCkpCgkJCXByaW50ayhLRVJOX1dBUk5JTkcKCQkJICAgICAgICJBc3VzIEFDUEk6IEVycm9yIGNoYW5naW5nIGJyaWdodG5lc3NcbiIpOwoJCXJldHVybjsKCX0KCgkvKiBObyBTUExWIG1ldGhvZCBpZiB3ZSBhcmUgaGVyZSwgYWN0IGFzIGFwcHJvcHJpYXRlICovCgl2YWx1ZSAtPSByZWFkX2JyaWdodG5lc3MoKTsKCXdoaWxlICh2YWx1ZSAhPSAwKSB7CgkJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoTlVMTCwgKHZhbHVlID4gMCkgPwoJCQkJCSAgICAgIGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3NfdXAgOgoJCQkJCSAgICAgIGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3NfZG93biwKCQkJCQkgICAgICBOVUxMLCBOVUxMKTsKCQkodmFsdWUgPiAwKSA/IHZhbHVlLS0gOiB2YWx1ZSsrOwoJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKCQkJcHJpbnRrKEtFUk5fV0FSTklORwoJCQkgICAgICAgIkFzdXMgQUNQSTogRXJyb3IgY2hhbmdpbmcgYnJpZ2h0bmVzc1xuIik7Cgl9CglyZXR1cm47Cn0KCnN0YXRpYyBpbnQKcHJvY19yZWFkX2JybihjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwKCSAgICAgIHZvaWQgKmRhdGEpCnsKCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlZFxuIiwgcmVhZF9icmlnaHRuZXNzKCkpOwp9CgpzdGF0aWMgaW50CnByb2Nfd3JpdGVfYnJuKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKCSAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQp7CglpbnQgdmFsdWU7CgoJY291bnQgPSBwYXJzZV9hcmcoYnVmZmVyLCBjb3VudCwgJnZhbHVlKTsKCWlmIChjb3VudCA+IDApIHsKCQl2YWx1ZSA9ICgwIDwgdmFsdWUpID8gKCgxNSA8IHZhbHVlKSA/IDE1IDogdmFsdWUpIDogMDsKCQkvKiAwIDw9IHZhbHVlIDw9IDE1ICovCgkJc2V0X2JyaWdodG5lc3ModmFsdWUpOwoJfSBlbHNlIGlmIChjb3VudCA8IDApIHsKCQlwcmludGsoS0VSTl9XQVJOSU5HICJBc3VzIEFDUEk6IEVycm9yIHJlYWRpbmcgdXNlciBpbnB1dFxuIik7Cgl9CgoJcmV0dXJuIGNvdW50Owp9CgpzdGF0aWMgdm9pZCBzZXRfZGlzcGxheShpbnQgdmFsdWUpCnsKCS8qIG5vIHNhbml0eSBjaGVjayBuZWVkZWQgZm9yIG5vdyAqLwoJaWYgKCF3cml0ZV9hY3BpX2ludChob3RrLT5oYW5kbGUsIGhvdGstPm1ldGhvZHMtPmRpc3BsYXlfc2V0LAoJCQkgICAgdmFsdWUsIE5VTEwpKQoJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFzdXMgQUNQSTogRXJyb3Igc2V0dGluZyBkaXNwbGF5XG4iKTsKCXJldHVybjsKfQoKLyoKICogTm93LCAqdGhpcyogb25lIGNvdWxkIGJlIG1vcmUgdXNlci1mcmllbmRseSwgYnV0IHNvIGZhciwgbm8tb25lIGhhcyAKICogY29tcGxhaW5lZC4gVGhlIHNpZ25pZmljYW5jZSBvZiBiaXRzIGlzIHRoZSBzYW1lIGFzIGluIHByb2Nfd3JpdGVfZGlzcCgpCiAqLwpzdGF0aWMgaW50CnByb2NfcmVhZF9kaXNwKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLAoJICAgICAgIHZvaWQgKmRhdGEpCnsKCWludCB2YWx1ZSA9IDA7CgoJaWYgKCFyZWFkX2FjcGlfaW50KGhvdGstPmhhbmRsZSwgaG90ay0+bWV0aG9kcy0+ZGlzcGxheV9nZXQsICZ2YWx1ZSkpCgkJcHJpbnRrKEtFUk5fV0FSTklORwoJCSAgICAgICAiQXN1cyBBQ1BJOiBFcnJvciByZWFkaW5nIGRpc3BsYXkgc3RhdHVzXG4iKTsKCXZhbHVlICY9IDB4MDc7CQkvKiBuZWVkZWQgZm9yIHNvbWUgbW9kZWxzLCBzaG91bGRuJ3QgaHVydCBvdGhlcnMgKi8KCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlZFxuIiwgdmFsdWUpOwp9CgovKgogKiBFeHBlcmltZW50YWwgc3VwcG9ydCBmb3IgZGlzcGxheSBzd2l0Y2hpbmcuIEFzIG9mIG5vdzogMSBzaG91bGQgYWN0aXZhdGUgCiAqIHRoZSBMQ0Qgb3V0cHV0LCAyIHNob3VsZCBkbyBmb3IgQ1JULCBhbmQgNCBmb3IgVFYtT3V0LiBBbnkgY29tYmluYXRpb24gCiAqIChiaXR3aXNlKSBvZiB0aGVzZSB3aWxsIHN1ZmZpY2UuIEkgbmV2ZXIgYWN0dWFsbHkgdGVzdGVkIDMgZGlzcGxheXMgaG9va2VkIHVwIAogKiBzaW11bHRhbmVvdXNseSwgc28gYmUgd2FybmVkLiBTZWUgdGhlIGFjcGk0YXN1cyBSRUFETUUgZm9yIG1vcmUgaW5mby4KICovCnN0YXRpYyBpbnQKcHJvY193cml0ZV9kaXNwKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKCQl1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQp7CglpbnQgdmFsdWU7CgoJY291bnQgPSBwYXJzZV9hcmcoYnVmZmVyLCBjb3VudCwgJnZhbHVlKTsKCWlmIChjb3VudCA+IDApCgkJc2V0X2Rpc3BsYXkodmFsdWUpOwoJZWxzZSBpZiAoY291bnQgPCAwKQoJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFzdXMgQUNQSTogRXJyb3IgcmVhZGluZyB1c2VyIGlucHV0XG4iKTsKCglyZXR1cm4gY291bnQ7Cn0KCnR5cGVkZWYgaW50IChwcm9jX3JlYWRmdW5jKSAoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwKCQkJICAgICBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CnR5cGVkZWYgaW50IChwcm9jX3dyaXRlZnVuYykgKHN0cnVjdCBmaWxlICogZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCgkJCSAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpOwoKc3RhdGljIGludAphc3VzX3Byb2NfYWRkKGNoYXIgKm5hbWUsIHByb2Nfd3JpdGVmdW5jICogd3JpdGVmdW5jLAoJCSAgICAgcHJvY19yZWFkZnVuYyAqIHJlYWRmdW5jLCBtb2RlX3QgbW9kZSwKCQkgICAgIHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQp7CglzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2MgPQoJICAgIGNyZWF0ZV9wcm9jX2VudHJ5KG5hbWUsIG1vZGUsIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKCWlmICghcHJvYykgewoJCXByaW50ayhLRVJOX1dBUk5JTkcgIiAgVW5hYmxlIHRvIGNyZWF0ZSAlcyBmcyBlbnRyeVxuIiwgbmFtZSk7CgkJcmV0dXJuIC0xOwoJfQoJcHJvYy0+d3JpdGVfcHJvYyA9IHdyaXRlZnVuYzsKCXByb2MtPnJlYWRfcHJvYyA9IHJlYWRmdW5jOwoJcHJvYy0+ZGF0YSA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKCXByb2MtPm93bmVyID0gVEhJU19NT0RVTEU7Cglwcm9jLT51aWQgPSBhc3VzX3VpZDsKCXByb2MtPmdpZCA9IGFzdXNfZ2lkOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgYXN1c19ob3RrX2FkZF9mcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKewoJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jOwoJbW9kZV90IG1vZGU7CgoJLyoKCSAqIElmIHBhcmFtZXRlciB1aWQgb3IgZ2lkIGlzIG5vdCBjaGFuZ2VkLCBrZWVwIHRoZSBkZWZhdWx0IHNldHRpbmcgZm9yCgkgKiBvdXIgcHJvYyBlbnRyaWVzICgtcnctcnctcnctKSBlbHNlLCBpdCBtZWFucyB3ZSBjYXJlIGFib3V0IHNlY3VyaXR5LAoJICogYW5kIHRoZW4gc2V0IHRvIC1ydy1ydy0tLS0KCSAqLwoKCWlmICgoYXN1c191aWQgPT0gMCkgJiYgKGFzdXNfZ2lkID09IDApKSB7CgkJbW9kZSA9IFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VHTzsKCX0gZWxzZSB7CgkJbW9kZSA9IFNfSUZSRUcgfCBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVdVU1IgfCBTX0lXR1JQOwoJCXByaW50ayhLRVJOX1dBUk5JTkcgIiAgYXN1c191aWQgYW5kIGFzdXNfZ2lkIHBhcmFtZXRlcnMgYXJlICIKCQkgICAgICAgImRlcHJlY2F0ZWQsIHVzZSBjaG93biBhbmQgY2htb2QgaW5zdGVhZCFcbiIpOwoJfQoKCWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpID0gYXN1c19wcm9jX2RpcjsKCWlmICghYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpCgkJcmV0dXJuIC1FTk9ERVY7CgoJcHJvYyA9IGNyZWF0ZV9wcm9jX2VudHJ5KFBST0NfSU5GTywgbW9kZSwgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwoJaWYgKHByb2MpIHsKCQlwcm9jLT5yZWFkX3Byb2MgPSBwcm9jX3JlYWRfaW5mbzsKCQlwcm9jLT5kYXRhID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwoJCXByb2MtPm93bmVyID0gVEhJU19NT0RVTEU7CgkJcHJvYy0+dWlkID0gYXN1c191aWQ7CgkJcHJvYy0+Z2lkID0gYXN1c19naWQ7Cgl9IGVsc2UgewoJCXByaW50ayhLRVJOX1dBUk5JTkcgIiAgVW5hYmxlIHRvIGNyZWF0ZSAiIFBST0NfSU5GTwoJCSAgICAgICAiIGZzIGVudHJ5XG4iKTsKCX0KCglpZiAoaG90ay0+bWV0aG9kcy0+bXRfd2xlZCkgewoJCWFzdXNfcHJvY19hZGQoUFJPQ19XTEVELCAmcHJvY193cml0ZV93bGVkLCAmcHJvY19yZWFkX3dsZWQsCgkJCSAgICAgIG1vZGUsIGRldmljZSk7Cgl9CgoJaWYgKGhvdGstPm1ldGhvZHMtPm10X2xlZGQpIHsKCQlhc3VzX3Byb2NfYWRkKFBST0NfTEVERCwgJnByb2Nfd3JpdGVfbGVkZCwgJnByb2NfcmVhZF9sZWRkLAoJCQkgICAgICBtb2RlLCBkZXZpY2UpOwoJfQoKCWlmIChob3RrLT5tZXRob2RzLT5tdF9tbGVkKSB7CgkJYXN1c19wcm9jX2FkZChQUk9DX01MRUQsICZwcm9jX3dyaXRlX21sZWQsICZwcm9jX3JlYWRfbWxlZCwKCQkJICAgICAgbW9kZSwgZGV2aWNlKTsKCX0KCglpZiAoaG90ay0+bWV0aG9kcy0+bXRfdGxlZCkgewoJCWFzdXNfcHJvY19hZGQoUFJPQ19UTEVELCAmcHJvY193cml0ZV90bGVkLCAmcHJvY19yZWFkX3RsZWQsCgkJCSAgICAgIG1vZGUsIGRldmljZSk7Cgl9CgoJaWYgKGhvdGstPm1ldGhvZHMtPm10X2J0X3N3aXRjaCkgewoJCWFzdXNfcHJvY19hZGQoUFJPQ19CVCwgJnByb2Nfd3JpdGVfYmx1ZXRvb3RoLAoJCQkgICAgICAmcHJvY19yZWFkX2JsdWV0b290aCwgbW9kZSwgZGV2aWNlKTsKCX0KCgkvKiAKCSAqIFdlIG5lZWQgYm90aCByZWFkIG5vZGUgYW5kIHdyaXRlIG1ldGhvZCBhcyBMQ0Qgc3dpdGNoIGlzIGFsc28gYWNjZXNzaWJsZQoJICogZnJvbSBrZXlib2FyZCAKCSAqLwoJaWYgKGhvdGstPm1ldGhvZHMtPm10X2xjZF9zd2l0Y2ggJiYgaG90ay0+bWV0aG9kcy0+bGNkX3N0YXR1cykgewoJCWFzdXNfcHJvY19hZGQoUFJPQ19MQ0QsICZwcm9jX3dyaXRlX2xjZCwgJnByb2NfcmVhZF9sY2QsIG1vZGUsCgkJCSAgICAgIGRldmljZSk7Cgl9CgoJaWYgKChob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX3VwICYmIGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3NfZG93bikgfHwKCSAgICAoaG90ay0+bWV0aG9kcy0+YnJpZ2h0bmVzc19nZXQgJiYgaG90ay0+bWV0aG9kcy0+YnJpZ2h0bmVzc19zZXQpKSB7CgkJYXN1c19wcm9jX2FkZChQUk9DX0JSTiwgJnByb2Nfd3JpdGVfYnJuLCAmcHJvY19yZWFkX2JybiwgbW9kZSwKCQkJICAgICAgZGV2aWNlKTsKCX0KCglpZiAoaG90ay0+bWV0aG9kcy0+ZGlzcGxheV9zZXQpIHsKCQlhc3VzX3Byb2NfYWRkKFBST0NfRElTUCwgJnByb2Nfd3JpdGVfZGlzcCwgJnByb2NfcmVhZF9kaXNwLAoJCQkgICAgICBtb2RlLCBkZXZpY2UpOwoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGFzdXNfaG90a19yZW1vdmVfZnMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCnsKCWlmIChhY3BpX2RldmljZV9kaXIoZGV2aWNlKSkgewoJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfSU5GTywgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwoJCWlmIChob3RrLT5tZXRob2RzLT5tdF93bGVkKQoJCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DX1dMRUQsIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKCQlpZiAoaG90ay0+bWV0aG9kcy0+bXRfbWxlZCkKCQkJcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ19NTEVELCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CgkJaWYgKGhvdGstPm1ldGhvZHMtPm10X3RsZWQpCgkJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfVExFRCwgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwoJCWlmIChob3RrLT5tZXRob2RzLT5tdF9sZWRkKQoJCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DX0xFREQsIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKCQlpZiAoaG90ay0+bWV0aG9kcy0+bXRfYnRfc3dpdGNoKQoJCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DX0JULCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CgkJaWYgKGhvdGstPm1ldGhvZHMtPm10X2xjZF9zd2l0Y2ggJiYgaG90ay0+bWV0aG9kcy0+bGNkX3N0YXR1cykKCQkJcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ19MQ0QsIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKCQlpZiAoKGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3NfdXAKCQkgICAgICYmIGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3NfZG93bikKCQkgICAgfHwgKGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3NfZ2V0CgkJCSYmIGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3Nfc2V0KSkKCQkJcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ19CUk4sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKCQlpZiAoaG90ay0+bWV0aG9kcy0+ZGlzcGxheV9zZXQpCgkJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfRElTUCwgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwoJfQoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIGFzdXNfaG90a19ub3RpZnkoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZXZlbnQsIHZvaWQgKmRhdGEpCnsKCS8qIFRPRE8gRmluZCBhIGJldHRlciB3YXkgdG8gaGFuZGxlIGV2ZW50cyBjb3VudC4gKi8KCWlmICghaG90aykKCQlyZXR1cm47CgoJaWYgKChldmVudCAmIH4oKHUzMikgQlJfVVApKSA8IDE2KSB7CgkJaG90ay0+YnJpZ2h0bmVzcyA9IChldmVudCAmIH4oKHUzMikgQlJfVVApKTsKCX0gZWxzZSBpZiAoKGV2ZW50ICYgfigodTMyKSBCUl9ET1dOKSkgPCAxNikgewoJCWhvdGstPmJyaWdodG5lc3MgPSAoZXZlbnQgJiB+KCh1MzIpIEJSX0RPV04pKTsKCX0KCglhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChob3RrLT5kZXZpY2UsIGV2ZW50LAoJCQkJaG90ay0+ZXZlbnRfY291bnRbZXZlbnQgJSAxMjhdKyspOwoKCXJldHVybjsKfQoKLyoKICogTWF0Y2ggdGhlIG1vZGVsIHN0cmluZyB0byB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgbW9kZWxzLiBSZXR1cm4gRU5EX01PREVMIGlmCiAqIG5vIG1hdGNoIG9yIG1vZGVsIGlzIE5VTEwuCiAqLwpzdGF0aWMgaW50IGFzdXNfbW9kZWxfbWF0Y2goY2hhciAqbW9kZWwpCnsKCWlmIChtb2RlbCA9PSBOVUxMKQoJCXJldHVybiBFTkRfTU9ERUw7CgoJaWYgKHN0cm5jbXAobW9kZWwsICJMM0QiLCAzKSA9PSAwKQoJCXJldHVybiBMM0Q7CgllbHNlIGlmIChzdHJuY21wKG1vZGVsLCAiTDJFIiwgMykgPT0gMCB8fAoJCSBzdHJuY21wKG1vZGVsLCAiTDNIIiwgMykgPT0gMCB8fCBzdHJuY21wKG1vZGVsLCAiTDVEIiwgMykgPT0gMCkKCQlyZXR1cm4gTDNIOwoJZWxzZSBpZiAoc3RybmNtcChtb2RlbCwgIkwzIiwgMikgPT0gMCB8fCBzdHJuY21wKG1vZGVsLCAiTDJCIiwgMykgPT0gMCkKCQlyZXR1cm4gTDNDOwoJZWxzZSBpZiAoc3RybmNtcChtb2RlbCwgIkw4TCIsIDMpID09IDApCgkJcmV0dXJuIEw4TDsKCWVsc2UgaWYgKHN0cm5jbXAobW9kZWwsICJMNFIiLCAzKSA9PSAwKQoJCXJldHVybiBMNFI7CgllbHNlIGlmIChzdHJuY21wKG1vZGVsLCAiTTZOIiwgMykgPT0gMCB8fCBzdHJuY21wKG1vZGVsLCAiVzNOIiwgMykgPT0gMCkKCQlyZXR1cm4gTTZOOwoJZWxzZSBpZiAoc3RybmNtcChtb2RlbCwgIk02UiIsIDMpID09IDAgfHwgc3RybmNtcChtb2RlbCwgIkEzRyIsIDMpID09IDApCgkJcmV0dXJuIE02UjsKCWVsc2UgaWYgKHN0cm5jbXAobW9kZWwsICJNMk4iLCAzKSA9PSAwIHx8CgkJIHN0cm5jbXAobW9kZWwsICJNM04iLCAzKSA9PSAwIHx8CgkJIHN0cm5jbXAobW9kZWwsICJNNU4iLCAzKSA9PSAwIHx8CgkJIHN0cm5jbXAobW9kZWwsICJNNk4iLCAzKSA9PSAwIHx8CgkJIHN0cm5jbXAobW9kZWwsICJTMU4iLCAzKSA9PSAwIHx8CgkJIHN0cm5jbXAobW9kZWwsICJTNU4iLCAzKSA9PSAwIHx8IHN0cm5jbXAobW9kZWwsICJXMU4iLCAzKSA9PSAwKQoJCXJldHVybiB4eE47CgllbHNlIGlmIChzdHJuY21wKG1vZGVsLCAiTTEiLCAyKSA9PSAwKQoJCXJldHVybiBNMUE7CgllbHNlIGlmIChzdHJuY21wKG1vZGVsLCAiTTIiLCAyKSA9PSAwIHx8IHN0cm5jbXAobW9kZWwsICJMNEUiLCAzKSA9PSAwKQoJCXJldHVybiBNMkU7CgllbHNlIGlmIChzdHJuY21wKG1vZGVsLCAiTDIiLCAyKSA9PSAwKQoJCXJldHVybiBMMkQ7CgllbHNlIGlmIChzdHJuY21wKG1vZGVsLCAiTDgiLCAyKSA9PSAwKQoJCXJldHVybiBTMXg7CgllbHNlIGlmIChzdHJuY21wKG1vZGVsLCAiRDEiLCAyKSA9PSAwKQoJCXJldHVybiBEMXg7CgllbHNlIGlmIChzdHJuY21wKG1vZGVsLCAiQTEiLCAyKSA9PSAwKQoJCXJldHVybiBBMXg7CgllbHNlIGlmIChzdHJuY21wKG1vZGVsLCAiQTIiLCAyKSA9PSAwKQoJCXJldHVybiBBMng7CgllbHNlIGlmIChzdHJuY21wKG1vZGVsLCAiSjEiLCAyKSA9PSAwKQoJCXJldHVybiBTMng7CgllbHNlIGlmIChzdHJuY21wKG1vZGVsLCAiTDUiLCAyKSA9PSAwKQoJCXJldHVybiBMNXg7CgllbHNlIGlmIChzdHJuY21wKG1vZGVsLCAiQTRHIiwgMykgPT0gMCkKCQlyZXR1cm4gQTRHOwoJZWxzZSBpZiAoc3RybmNtcChtb2RlbCwgIlcxTiIsIDMpID09IDApCgkJcmV0dXJuIFcxTjsKCWVsc2UgaWYgKHN0cm5jbXAobW9kZWwsICJXNUEiLCAzKSA9PSAwKQoJCXJldHVybiBXNUE7CgllbHNlCgkJcmV0dXJuIEVORF9NT0RFTDsKfQoKLyoKICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGhvdGsgd2l0aCByaWdodCB2YWx1ZXMuIEluIHRoaXMKICogbWV0aG9kLCB3ZSBjYW4gbWFrZSBhbGwgdGhlIGRldGVjdGlvbiB3ZSB3YW50LCBhbmQgbW9kaWZ5IHRoZSBob3RrIHN0cnVjdAogKi8Kc3RhdGljIGludCBhc3VzX2hvdGtfZ2V0X2luZm8odm9pZCkKewoJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKCXN0cnVjdCBhY3BpX2J1ZmZlciBkc2R0ID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OwoJdW5pb24gYWNwaV9vYmplY3QgKm1vZGVsID0gTlVMTDsKCWludCBic3RzX3Jlc3VsdDsKCWNoYXIgKnN0cmluZyA9IE5VTEw7CglhY3BpX3N0YXR1cyBzdGF0dXM7CgoJLyoKCSAqIEdldCBEU0RUIGhlYWRlcnMgZWFybHkgZW5vdWdoIHRvIGFsbG93IGZvciBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiAKCSAqIG1vZGVscywgYnV0IGxhdGUgZW5vdWdoIHRvIGFsbG93IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigpIHRvIGZhaWwgCgkgKiBiZWZvcmUgZG9pbmcgYW55dGhpbmcgQUNQSS1zcGVjaWZpYy4gU2hvdWxkIHdlIGVuY291bnRlciBhIG1hY2hpbmUsCgkgKiB3aGljaCBuZWVkcyBzcGVjaWFsIGhhbmRsaW5nIChpLmUuIGl0cyBob3RrZXkgZGV2aWNlIGhhcyBhIGRpZmZlcmVudAoJICogSElEKSwgdGhpcyBiaXQgd2lsbCBiZSBtb3ZlZC4gQSBnbG9iYWwgdmFyaWFibGUgYXN1c19pbmZvIGNvbnRhaW5zCgkgKiB0aGUgRFNEVCBoZWFkZXIuCgkgKi8KCXN0YXR1cyA9IGFjcGlfZ2V0X3RhYmxlKEFDUElfVEFCTEVfSURfRFNEVCwgMSwgJmRzZHQpOwoJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQoJCXByaW50ayhLRVJOX1dBUk5JTkcgIiAgQ291bGRuJ3QgZ2V0IHRoZSBEU0RUIHRhYmxlIGhlYWRlclxuIik7CgllbHNlCgkJYXN1c19pbmZvID0gKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKWRzZHQucG9pbnRlcjsKCgkvKiBXZSBoYXZlIHRvIHdyaXRlIDAgb24gaW5pdCB0aGlzIGZhciBmb3IgYWxsIEFTVVMgbW9kZWxzICovCglpZiAoIXdyaXRlX2FjcGlfaW50KGhvdGstPmhhbmRsZSwgIklOSVQiLCAwLCAmYnVmZmVyKSkgewoJCXByaW50ayhLRVJOX0VSUiAiICBIb3RrZXkgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCgkvKiBUaGlzIG5lZWRzIHRvIGJlIGNhbGxlZCBmb3Igc29tZSBsYXB0b3BzIHRvIGluaXQgcHJvcGVybHkgKi8KCWlmICghcmVhZF9hY3BpX2ludChob3RrLT5oYW5kbGUsICJCU1RTIiwgJmJzdHNfcmVzdWx0KSkKCQlwcmludGsoS0VSTl9XQVJOSU5HICIgIEVycm9yIGNhbGxpbmcgQlNUU1xuIik7CgllbHNlIGlmIChic3RzX3Jlc3VsdCkKCQlwcmludGsoS0VSTl9OT1RJQ0UgIiAgQlNUUyBjYWxsZWQsIDB4JTAyeCByZXR1cm5lZFxuIiwKCQkgICAgICAgYnN0c19yZXN1bHQpOwoKCS8qCgkgKiBUcnkgdG8gbWF0Y2ggdGhlIG9iamVjdCByZXR1cm5lZCBieSBJTklUIHRvIHRoZSBzcGVjaWZpYyBtb2RlbC4KCSAqIEhhbmRsZSBldmVyeSBwb3NzaWJsZSBvYmplY3QgKG9yIHRoZSBsYWNrIG9mIHRoZXJlb2YpIHRoZSBEU0RUIAoJICogd3JpdGVycyBtaWdodCB0aHJvdyBhdCB1cy4gV2hlbiBpbiB0cm91YmxlLCB3ZSBwYXNzIE5VTEwgdG8gCgkgKiBhc3VzX21vZGVsX21hdGNoKCkgYW5kIHRyeSBzb21ldGhpbmcgY29tcGxldGVseSBkaWZmZXJlbnQuCgkgKi8KCWlmIChidWZmZXIucG9pbnRlcikgewoJCW1vZGVsID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopYnVmZmVyLnBvaW50ZXI7CgkJc3dpdGNoIChtb2RlbC0+dHlwZSkgewoJCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKCQkJc3RyaW5nID0gbW9kZWwtPnN0cmluZy5wb2ludGVyOwoJCQlicmVhazsKCQljYXNlIEFDUElfVFlQRV9CVUZGRVI6CgkJCXN0cmluZyA9IG1vZGVsLT5idWZmZXIucG9pbnRlcjsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJa2ZyZWUobW9kZWwpOwoJCQlicmVhazsKCQl9Cgl9Cglob3RrLT5tb2RlbCA9IGFzdXNfbW9kZWxfbWF0Y2goc3RyaW5nKTsKCWlmIChob3RrLT5tb2RlbCA9PSBFTkRfTU9ERUwpIHsJLyogbWF0Y2ggZmFpbGVkICovCgkJaWYgKGFzdXNfaW5mbyAmJgoJCSAgICBzdHJuY21wKGFzdXNfaW5mby0+b2VtX3RhYmxlX2lkLCAiT0RFTSIsIDQpID09IDApIHsKCQkJaG90ay0+bW9kZWwgPSBQMzA7CgkJCXByaW50ayhLRVJOX05PVElDRQoJCQkgICAgICAgIiAgU2Ftc3VuZyBQMzAgZGV0ZWN0ZWQsIHN1cHBvcnRlZFxuIik7CgkJfSBlbHNlIHsKCQkJaG90ay0+bW9kZWwgPSBNMkU7CgkJCXByaW50ayhLRVJOX05PVElDRSAiICB1bnN1cHBvcnRlZCBtb2RlbCAlcywgdHJ5aW5nICIKCQkJICAgICAgICJkZWZhdWx0IHZhbHVlc1xuIiwgc3RyaW5nKTsKCQkJcHJpbnRrKEtFUk5fTk9USUNFCgkJCSAgICAgICAiICBzZW5kIC9wcm9jL2FjcGkvZHNkdCB0byB0aGUgZGV2ZWxvcGVyc1xuIik7CgkJfQoJCWhvdGstPm1ldGhvZHMgPSAmbW9kZWxfY29uZltob3RrLT5tb2RlbF07CgkJcmV0dXJuIEFFX09LOwoJfQoJaG90ay0+bWV0aG9kcyA9ICZtb2RlbF9jb25mW2hvdGstPm1vZGVsXTsKCXByaW50ayhLRVJOX05PVElDRSAiICAlcyBtb2RlbCBkZXRlY3RlZCwgc3VwcG9ydGVkXG4iLCBzdHJpbmcpOwoKCS8qIFNvcnQgb2YgcGVyLW1vZGVsIGJsYWNrbGlzdCAqLwoJaWYgKHN0cm5jbXAoc3RyaW5nLCAiTDJCIiwgMykgPT0gMCkKCQlob3RrLT5tZXRob2RzLT5sY2Rfc3RhdHVzID0gTlVMTDsKCS8qIEwyQiBpcyBzaW1pbGFyIGVub3VnaCB0byBMM0MgdG8gdXNlIGl0cyBzZXR0aW5ncywgd2l0aCB0aGlzIG9ubHkgCgkgICBleGNlcHRpb24gKi8KCWVsc2UgaWYgKHN0cm5jbXAoc3RyaW5nLCAiQTNHIiwgMykgPT0gMCkKCQlob3RrLT5tZXRob2RzLT5sY2Rfc3RhdHVzID0gIlxcQkxGRyI7CgkvKiBBM0cgaXMgbGlrZSBNNlIgKi8KCWVsc2UgaWYgKHN0cm5jbXAoc3RyaW5nLCAiUzVOIiwgMykgPT0gMCB8fAoJCSBzdHJuY21wKHN0cmluZywgIk01TiIsIDMpID09IDAgfHwKCQkgc3RybmNtcChzdHJpbmcsICJXM04iLCAzKSA9PSAwKQoJCWhvdGstPm1ldGhvZHMtPm10X21sZWQgPSBOVUxMOwoJLyogUzVOLCBNNU4gYW5kIFczTiBoYXZlIG5vIE1MRUQgKi8KCWVsc2UgaWYgKHN0cm5jbXAoc3RyaW5nLCAiTDVEIiwgMykgPT0gMCkKCQlob3RrLT5tZXRob2RzLT5tdF93bGVkID0gTlVMTDsKCS8qIEw1RCdzIFdMRUQgaXMgbm90IGNvbnRyb2xsZWQgYnkgQUNQSSAqLwoJZWxzZSBpZiAoc3RybmNtcChzdHJpbmcsICJNMk4iLCAzKSA9PSAwIHx8CgkJIHN0cm5jbXAoc3RyaW5nLCAiUzFOIiwgMykgPT0gMCkKCQlob3RrLT5tZXRob2RzLT5tdF93bGVkID0gIldMRUQiOwoJLyogTTJOIGFuZCBTMU4gaGF2ZSBhIHVzYWJsZSBXTEVEICovCgllbHNlIGlmIChhc3VzX2luZm8pIHsKCQlpZiAoc3RybmNtcChhc3VzX2luZm8tPm9lbV90YWJsZV9pZCwgIkwxIiwgMikgPT0gMCkKCQkJaG90ay0+bWV0aG9kcy0+bWxlZF9zdGF0dXMgPSBOVUxMOwoJCS8qIFMxMzAwQSByZXBvcnRzIEw4NEYsIGJ1dCBMMTQwMEIgdG9vLCBhY2NvdW50IGZvciB0aGF0ICovCgl9CgoJa2ZyZWUobW9kZWwpOwoKCXJldHVybiBBRV9PSzsKfQoKc3RhdGljIGludCBhc3VzX2hvdGtfY2hlY2sodm9pZCkKewoJaW50IHJlc3VsdCA9IDA7CgoJcmVzdWx0ID0gYWNwaV9idXNfZ2V0X3N0YXR1cyhob3RrLT5kZXZpY2UpOwoJaWYgKHJlc3VsdCkKCQlyZXR1cm4gcmVzdWx0OwoKCWlmIChob3RrLT5kZXZpY2UtPnN0YXR1cy5wcmVzZW50KSB7CgkJcmVzdWx0ID0gYXN1c19ob3RrX2dldF9pbmZvKCk7Cgl9IGVsc2UgewoJCXByaW50ayhLRVJOX0VSUiAiICBIb3RrZXkgZGV2aWNlIG5vdCBwcmVzZW50LCBhYm9ydGluZ1xuIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJcmV0dXJuIHJlc3VsdDsKfQoKc3RhdGljIGludCBhc3VzX2hvdGtfZm91bmQ7CgpzdGF0aWMgaW50IGFzdXNfaG90a19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCnsKCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwoJaW50IHJlc3VsdDsKCglpZiAoIWRldmljZSkKCQlyZXR1cm4gLUVJTlZBTDsKCglwcmludGsoS0VSTl9OT1RJQ0UgIkFzdXMgTGFwdG9wIEFDUEkgRXh0cmFzIHZlcnNpb24gJXNcbiIsCgkgICAgICAgQVNVU19BQ1BJX1ZFUlNJT04pOwoKCWhvdGsgPQoJICAgIChzdHJ1Y3QgYXN1c19ob3RrICopa21hbGxvYyhzaXplb2Yoc3RydWN0IGFzdXNfaG90ayksIEdGUF9LRVJORUwpOwoJaWYgKCFob3RrKQoJCXJldHVybiAtRU5PTUVNOwoJbWVtc2V0KGhvdGssIDAsIHNpemVvZihzdHJ1Y3QgYXN1c19ob3RrKSk7CgoJaG90ay0+aGFuZGxlID0gZGV2aWNlLT5oYW5kbGU7CglzdHJjcHkoYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBBQ1BJX0hPVEtfREVWSUNFX05BTUUpOwoJc3RyY3B5KGFjcGlfZGV2aWNlX2NsYXNzKGRldmljZSksIEFDUElfSE9US19DTEFTUyk7CglhY3BpX2RyaXZlcl9kYXRhKGRldmljZSkgPSBob3RrOwoJaG90ay0+ZGV2aWNlID0gZGV2aWNlOwoKCXJlc3VsdCA9IGFzdXNfaG90a19jaGVjaygpOwoJaWYgKHJlc3VsdCkKCQlnb3RvIGVuZDsKCglyZXN1bHQgPSBhc3VzX2hvdGtfYWRkX2ZzKGRldmljZSk7CglpZiAocmVzdWx0KQoJCWdvdG8gZW5kOwoKCS8qCgkgKiBXZSBpbnN0YWxsIHRoZSBoYW5kbGVyLCBpdCB3aWxsIHJlY2VpdmUgdGhlIGhvdGsgaW4gcGFyYW1ldGVyLCBzbywgd2UKCSAqIGNvdWxkIGFkZCBvdGhlciBkYXRhIHRvIHRoZSBob3RrIHN0cnVjdAoJICovCglzdGF0dXMgPSBhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoaG90ay0+aGFuZGxlLCBBQ1BJX1NZU1RFTV9OT1RJRlksCgkJCQkJICAgICBhc3VzX2hvdGtfbm90aWZ5LCBob3RrKTsKCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKCQlwcmludGsoS0VSTl9FUlIgIiAgRXJyb3IgaW5zdGFsbGluZyBub3RpZnkgaGFuZGxlclxuIik7CgoJLyogRm9yIGxhcHRvcHMgd2l0aG91dCBHUExWOiBpbml0IHRoZSBob3RrLT5icmlnaHRuZXNzIHZhbHVlICovCglpZiAoKCFob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX2dldCkKCSAgICAmJiAoIWhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3Nfc3RhdHVzKQoJICAgICYmIChob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX3VwICYmIGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3NfZG93bikpIHsKCQlzdGF0dXMgPQoJCSAgICBhY3BpX2V2YWx1YXRlX29iamVjdChOVUxMLCBob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX2Rvd24sCgkJCQkJIE5VTEwsIE5VTEwpOwoJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiICBFcnJvciBjaGFuZ2luZyBicmlnaHRuZXNzXG4iKTsKCQllbHNlIHsKCQkJc3RhdHVzID0KCQkJICAgIGFjcGlfZXZhbHVhdGVfb2JqZWN0KE5VTEwsCgkJCQkJCSBob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX3VwLAoJCQkJCQkgTlVMTCwgTlVMTCk7CgkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiAgU3RyYW5nZSwgZXJyb3IgY2hhbmdpbmciCgkJCQkgICAgICAgIiBicmlnaHRuZXNzXG4iKTsKCQl9Cgl9CgoJYXN1c19ob3RrX2ZvdW5kID0gMTsKCgkvKiBMRUQgZGlzcGxheSBpcyBvZmYgYnkgZGVmYXVsdCAqLwoJaG90ay0+bGVkZF9zdGF0dXMgPSAweEZGRjsKCiAgICAgIGVuZDoKCWlmIChyZXN1bHQpIHsKCQlrZnJlZShob3RrKTsKCX0KCglyZXR1cm4gcmVzdWx0Owp9CgpzdGF0aWMgaW50IGFzdXNfaG90a19yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQp7CglhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOwoKCWlmICghZGV2aWNlIHx8ICFhY3BpX2RyaXZlcl9kYXRhKGRldmljZSkpCgkJcmV0dXJuIC1FSU5WQUw7CgoJc3RhdHVzID0gYWNwaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoaG90ay0+aGFuZGxlLCBBQ1BJX1NZU1RFTV9OT1RJRlksCgkJCQkJICAgIGFzdXNfaG90a19ub3RpZnkpOwoJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQoJCXByaW50ayhLRVJOX0VSUiAiQXN1cyBBQ1BJOiBFcnJvciByZW1vdmluZyBub3RpZnkgaGFuZGxlclxuIik7CgoJYXN1c19ob3RrX3JlbW92ZV9mcyhkZXZpY2UpOwoKCWtmcmVlKGhvdGspOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IF9faW5pdCBhc3VzX2FjcGlfaW5pdCh2b2lkKQp7CglpbnQgcmVzdWx0OwoKCWlmIChhY3BpX2Rpc2FibGVkKQoJCXJldHVybiAtRU5PREVWOwoKCWlmICghYWNwaV9zcGVjaWZpY19ob3RrZXlfZW5hYmxlZCkgewoJCXByaW50ayhLRVJOX0VSUiAiVXNpbmcgZ2VuZXJpYyBob3RrZXkgZHJpdmVyXG4iKTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCWFzdXNfcHJvY19kaXIgPSBwcm9jX21rZGlyKFBST0NfQVNVUywgYWNwaV9yb290X2Rpcik7CglpZiAoIWFzdXNfcHJvY19kaXIpIHsKCQlwcmludGsoS0VSTl9FUlIgIkFzdXMgQUNQSTogVW5hYmxlIHRvIGNyZWF0ZSAvcHJvYyBlbnRyeVxuIik7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9Cglhc3VzX3Byb2NfZGlyLT5vd25lciA9IFRISVNfTU9EVUxFOwoKCXJlc3VsdCA9IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmYXN1c19ob3RrX2RyaXZlcik7CglpZiAocmVzdWx0IDwgMCkgewoJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfQVNVUywgYWNwaV9yb290X2Rpcik7CgkJcmV0dXJuIHJlc3VsdDsKCX0KCgkvKgoJICogVGhpcyBpcyBhIGJpdCBvZiBhIGtsdWRnZS4gIFdlIG9ubHkgd2FudCB0aGlzIG1vZHVsZSBsb2FkZWQKCSAqIGZvciBBU1VTIHN5c3RlbXMsIGJ1dCB0aGVyZSdzIGN1cnJlbnRseSBubyB3YXkgdG8gcHJvYmUgdGhlCgkgKiBBQ1BJIG5hbWVzcGFjZSBmb3IgQVNVUyBISURzLiAgU28gd2UganVzdCByZXR1cm4gZmFpbHVyZSBpZgoJICogd2UgZGlkbid0IGZpbmQgb25lLCB3aGljaCB3aWxsIGNhdXNlIHRoZSBtb2R1bGUgdG8gYmUKCSAqIHVubG9hZGVkLgoJICovCglpZiAoIWFzdXNfaG90a19mb3VuZCkgewoJCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZhc3VzX2hvdGtfZHJpdmVyKTsKCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DX0FTVVMsIGFjcGlfcm9vdF9kaXIpOwoJCXJldHVybiByZXN1bHQ7Cgl9CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCBhc3VzX2FjcGlfZXhpdCh2b2lkKQp7CglhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmYXN1c19ob3RrX2RyaXZlcik7CglyZW1vdmVfcHJvY19lbnRyeShQUk9DX0FTVVMsIGFjcGlfcm9vdF9kaXIpOwoKCWtmcmVlKGFzdXNfaW5mbyk7CgoJcmV0dXJuOwp9Cgptb2R1bGVfaW5pdChhc3VzX2FjcGlfaW5pdCk7Cm1vZHVsZV9leGl0KGFzdXNfYWNwaV9leGl0KTsK