LyoKICogQUNQSSBTb255IE5vdGVib29rIENvbnRyb2wgRHJpdmVyIChTTkMgYW5kIFNQSUMpCiAqCiAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IFN0ZWxpYW4gUG9wIDxzdGVsaWFuQHBvcGllcy5uZXQ+CiAqIENvcHlyaWdodCAoQykgMjAwNyBNYXR0aWEgRG9uZ2lsaSA8bWFsYXR0aWFAbGludXguaXQ+CiAqCiAqIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGluc3BpcmVkIGZyb20gYXN1c19hY3BpLmMgYW5kIGlibV9hY3BpLmMKICogd2hpY2ggYXJlIGNvcHlyaWdodGVkIGJ5IHRoZWlyIHJlc3BlY3RpdmUgYXV0aG9ycy4KICoKICogVGhlIFNOWTYwMDEgZHJpdmVyIHBhcnQgaXMgYmFzZWQgb24gdGhlIHNvbnlwaSBkcml2ZXIgd2hpY2ggaW5jbHVkZXMKICogbWF0ZXJpYWwgZnJvbToKICoKICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgU3RlbGlhbiBQb3AgPHN0ZWxpYW5AcG9waWVzLm5ldD4KICoKICogQ29weXJpZ2h0IChDKSAyMDA1IE5hcmF5YW5hbiBSIFMgPG5hcnNAa2FkYW1iYS5vcmc+CiAqCiAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIEFsY/R2ZSA8d3d3LmFsY292ZS5jb20+CiAqCiAqIENvcHlyaWdodCAoQykgMjAwMSBNaWNoYWVsIEFzaGxleSA8bS5hc2hsZXlAdW5zdy5lZHUuYXU+CiAqCiAqIENvcHlyaWdodCAoQykgMjAwMSBKdW5pY2hpIE1vcml0YSA8anVuMW1AbWFycy5kdGkubmUuanA+CiAqCiAqIENvcHlyaWdodCAoQykgMjAwMCBUYWtheWEgS2luam8gPHQta2luam9AdGM0LnNvLW5ldC5uZS5qcD4KICoKICogQ29weXJpZ2h0IChDKSAyMDAwIEFuZHJldyBUcmlkZ2VsbCA8dHJpZGdlQHZhbGludXguY29tPgogKgogKiBFYXJsaWVyIHdvcmsgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBQYXVsIGBSdXN0eScgUnVzc2VsbCBhbmQgUGF1bCBNYWNrZXJyYXMuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKgogKi8KCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgojaW5jbHVkZSA8bGludXgvZXJyLmg+CiNpbmNsdWRlIDxsaW51eC9kbWkuaD4KI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgojaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CiNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CiNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgojaW5jbHVkZSA8bGludXgvc29ueXBpLmg+CiNpbmNsdWRlIDxsaW51eC9zb255LWxhcHRvcC5oPgojaWZkZWYgQ09ORklHX1NPTllfTEFQVE9QX09MRAojaW5jbHVkZSA8bGludXgvcG9sbC5oPgojaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgojZW5kaWYKCiNkZWZpbmUgRFJWX1BGWAkJCSJzb255LWxhcHRvcDogIgojZGVmaW5lIGRwcmludGsobXNnLi4uKQkJZG8gewkJCVwKCWlmIChkZWJ1ZykgcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfUEZYICBtc2cpOwlcCn0gd2hpbGUgKDApCgojZGVmaW5lIFNPTllfTEFQVE9QX0RSSVZFUl9WRVJTSU9OCSIwLjUiCgojZGVmaW5lIFNPTllfTkNfQ0xBU1MJCSJzb255LW5jIgojZGVmaW5lIFNPTllfTkNfSElECQkiU05ZNTAwMSIKI2RlZmluZSBTT05ZX05DX0RSSVZFUl9OQU1FCSJTb255IE5vdGVib29rIENvbnRyb2wgRHJpdmVyIgoKI2RlZmluZSBTT05ZX1BJQ19DTEFTUwkJInNvbnktcGljIgojZGVmaW5lIFNPTllfUElDX0hJRAkJIlNOWTYwMDEiCiNkZWZpbmUgU09OWV9QSUNfRFJJVkVSX05BTUUJIlNvbnkgUHJvZ3JhbW1hYmxlIElPIENvbnRyb2wgRHJpdmVyIgoKTU9EVUxFX0FVVEhPUigiU3RlbGlhbiBQb3AsIE1hdHRpYSBEb25naWxpIik7Ck1PRFVMRV9ERVNDUklQVElPTigiU29ueSBsYXB0b3AgZXh0cmFzIGRyaXZlciAoU1BJQyBhbmQgU05DIEFDUEkgZGV2aWNlKSIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7Ck1PRFVMRV9WRVJTSU9OKFNPTllfTEFQVE9QX0RSSVZFUl9WRVJTSU9OKTsKCnN0YXRpYyBpbnQgZGVidWc7Cm1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgInNldCB0aGlzIHRvIDEgKGFuZCBSVEZNKSBpZiB5b3Ugd2FudCB0byBoZWxwICIKCQkgInRoZSBkZXZlbG9wbWVudCBvZiB0aGlzIGRyaXZlciIpOwoKc3RhdGljIGludCBub19zcGljOwkJLyogPSAwICovCm1vZHVsZV9wYXJhbShub19zcGljLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKG5vX3NwaWMsCgkJICJzZXQgdGhpcyBpZiB5b3UgZG9uJ3Qgd2FudCB0byBlbmFibGUgdGhlIFNQSUMgZGV2aWNlIik7CgpzdGF0aWMgaW50IGNvbXBhdDsJCS8qID0gMCAqLwptb2R1bGVfcGFyYW0oY29tcGF0LCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGNvbXBhdCwKCQkgInNldCB0aGlzIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG1vZGUiKTsKCnN0YXRpYyB1bnNpZ25lZCBsb25nIG1hc2sgPSAweGZmZmZmZmZmOwptb2R1bGVfcGFyYW0obWFzaywgdWxvbmcsIDA2NDQpOwpNT0RVTEVfUEFSTV9ERVNDKG1hc2ssCgkJICJzZXQgdGhpcyB0byB0aGUgbWFzayBvZiBldmVudCB5b3Ugd2FudCB0byBlbmFibGUgKHNlZSBkb2MpIik7CgpzdGF0aWMgaW50IGNhbWVyYTsJCS8qID0gMCAqLwptb2R1bGVfcGFyYW0oY2FtZXJhLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGNhbWVyYSwKCQkgInNldCB0aGlzIHRvIDEgdG8gZW5hYmxlIE1vdGlvbiBFeWUgY2FtZXJhIGNvbnRyb2xzICIKCQkgIihvbmx5IHVzZSBpdCBpZiB5b3UgaGF2ZSBhIEMxVkUgb3IgQzFWTiBtb2RlbCkiKTsKCiNpZmRlZiBDT05GSUdfU09OWV9MQVBUT1BfT0xECnN0YXRpYyBpbnQgbWlub3IgPSAtMTsKbW9kdWxlX3BhcmFtKG1pbm9yLCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKG1pbm9yLAoJCSAibWlub3IgbnVtYmVyIG9mIHRoZSBtaXNjIGRldmljZSBmb3IgdGhlIFNQSUMgY29tcGF0aWJpbGl0eSBjb2RlLCAiCgkJICJkZWZhdWx0IGlzIC0xIChhdXRvbWF0aWMpIik7CiNlbmRpZgoKLyoqKioqKioqKioqIElucHV0IERldmljZXMgKioqKioqKioqKiovCgojZGVmaW5lIFNPTllfTEFQVE9QX0JVRl9TSVpFCTEyOApzdHJ1Y3Qgc29ueV9sYXB0b3BfaW5wdXRfcyB7CglhdG9taWNfdAkJdXNlcnM7CglzdHJ1Y3QgaW5wdXRfZGV2CSpqb2dfZGV2OwoJc3RydWN0IGlucHV0X2Rldgkqa2V5X2RldjsKCXN0cnVjdCBrZmlmbwkJKmZpZm87CglzcGlubG9ja190CQlmaWZvX2xvY2s7CglzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdAkqd3E7Cn07CnN0YXRpYyBzdHJ1Y3Qgc29ueV9sYXB0b3BfaW5wdXRfcyBzb255X2xhcHRvcF9pbnB1dCA9IHsKCS51c2VycyA9IEFUT01JQ19JTklUKDApLAp9OwoKc3RydWN0IHNvbnlfbGFwdG9wX2tleXByZXNzIHsKCXN0cnVjdCBpbnB1dF9kZXYgKmRldjsKCWludCBrZXk7Cn07CgovKiBDb3JyZXNwb25kYW5jZSB0YWJsZSBiZXR3ZWVuIHNvbnlwaSBldmVudHMgYW5kIGlucHV0IGxheWVyIGV2ZW50cyAqLwpzdGF0aWMgc3RydWN0IHsKCWludCBzb255cGlldjsKCWludCBpbnB1dGV2Owp9IHNvbnlfbGFwdG9wX2lucHV0a2V5c1tdID0gewoJeyBTT05ZUElfRVZFTlRfQ0FQVFVSRV9QUkVTU0VELAkgCUtFWV9DQU1FUkEgfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX09OTFksIAkJS0VZX0ZOIH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9FU0MsIAkJS0VZX0ZOX0VTQyB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjEsIAkJS0VZX0ZOX0YxIH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9GMiwgCQlLRVlfRk5fRjIgfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0YzLCAJCUtFWV9GTl9GMyB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjQsIAkJS0VZX0ZOX0Y0IH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9GNSwgCQlLRVlfRk5fRjUgfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0Y2LCAJCUtFWV9GTl9GNiB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjcsIAkJS0VZX0ZOX0Y3IH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9GOCwgCQlLRVlfRk5fRjggfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0Y5LAkJS0VZX0ZOX0Y5IH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9GMTAsCQlLRVlfRk5fRjEwIH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9GMTEsIAkJS0VZX0ZOX0YxMSB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjEyLAkJS0VZX0ZOX0YxMiB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfMSwgCQlLRVlfRk5fMSB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfMiwgCQlLRVlfRk5fMiB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRCwJCQlLRVlfRk5fRCB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRSwJCQlLRVlfRk5fRSB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRiwJCQlLRVlfRk5fRiB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfUywJCQlLRVlfRk5fUyB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfQiwJCQlLRVlfRk5fQiB9LAoJeyBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX1BSRVNTRUQsIAlLRVlfQkxVRSB9LAoJeyBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX09OLCAJCUtFWV9CTFVFIH0sCgl7IFNPTllQSV9FVkVOVF9QS0VZX1AxLCAJCUtFWV9QUk9HMSB9LAoJeyBTT05ZUElfRVZFTlRfUEtFWV9QMiwgCQlLRVlfUFJPRzIgfSwKCXsgU09OWVBJX0VWRU5UX1BLRVlfUDMsIAkJS0VZX1BST0czIH0sCgl7IFNPTllQSV9FVkVOVF9CQUNLX1BSRVNTRUQsIAkJS0VZX0JBQ0sgfSwKCXsgU09OWVBJX0VWRU5UX0hFTFBfUFJFU1NFRCwgCQlLRVlfSEVMUCB9LAoJeyBTT05ZUElfRVZFTlRfWk9PTV9QUkVTU0VELCAJCUtFWV9aT09NIH0sCgl7IFNPTllQSV9FVkVOVF9USFVNQlBIUkFTRV9QUkVTU0VELCAJQlROX1RIVU1CIH0sCgl7IDAsIDAgfSwKfTsKCi8qIHJlbGVhc2UgYnV0dG9ucyBhZnRlciBhIHNob3J0IGRlbGF5IGlmIHByZXNzZWQgKi8Kc3RhdGljIHZvaWQgZG9fc29ueV9sYXB0b3BfcmVsZWFzZV9rZXkoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQp7CglzdHJ1Y3Qgc29ueV9sYXB0b3Bfa2V5cHJlc3Mga3A7CgoJd2hpbGUgKGtmaWZvX2dldChzb255X2xhcHRvcF9pbnB1dC5maWZvLCAodW5zaWduZWQgY2hhciAqKSZrcCwKCQkJIHNpemVvZihrcCkpID09IHNpemVvZihrcCkpIHsKCQltc2xlZXAoMTApOwoJCWlucHV0X3JlcG9ydF9rZXkoa3AuZGV2LCBrcC5rZXksIDApOwoJCWlucHV0X3N5bmMoa3AuZGV2KTsKCX0KfQpzdGF0aWMgREVDTEFSRV9XT1JLKHNvbnlfbGFwdG9wX3JlbGVhc2Vfa2V5X3dvcmssCgkJZG9fc29ueV9sYXB0b3BfcmVsZWFzZV9rZXkpOwoKLyogZm9yd2FyZCBldmVudCB0byB0aGUgaW5wdXQgc3Vic3l0ZW0gKi8Kc3RhdGljIHZvaWQgc29ueV9sYXB0b3BfcmVwb3J0X2lucHV0X2V2ZW50KHU4IGV2ZW50KQp7CglzdHJ1Y3QgaW5wdXRfZGV2ICpqb2dfZGV2ID0gc29ueV9sYXB0b3BfaW5wdXQuam9nX2RldjsKCXN0cnVjdCBpbnB1dF9kZXYgKmtleV9kZXYgPSBzb255X2xhcHRvcF9pbnB1dC5rZXlfZGV2OwoJc3RydWN0IHNvbnlfbGFwdG9wX2tleXByZXNzIGtwID0geyBOVUxMIH07CglpbnQgaTsKCglpZiAoZXZlbnQgPT0gU09OWVBJX0VWRU5UX0ZOS0VZX1JFTEVBU0VEKSB7CgkJLyogTm90aGluZywgbm90IGFsbCBWQUlPcyBnZW5lcmF0ZSB0aGlzIGV2ZW50ICovCgkJcmV0dXJuOwoJfQoKCS8qIHJlcG9ydCBldmVudHMgKi8KCXN3aXRjaCAoZXZlbnQpIHsKCS8qIGpvZ19kZXYgZXZlbnRzICovCgljYXNlIFNPTllQSV9FVkVOVF9KT0dESUFMX1VQOgoJY2FzZSBTT05ZUElfRVZFTlRfSk9HRElBTF9VUF9QUkVTU0VEOgoJCWlucHV0X3JlcG9ydF9yZWwoam9nX2RldiwgUkVMX1dIRUVMLCAxKTsKCQlpbnB1dF9zeW5jKGpvZ19kZXYpOwoJCXJldHVybjsKCgljYXNlIFNPTllQSV9FVkVOVF9KT0dESUFMX0RPV046CgljYXNlIFNPTllQSV9FVkVOVF9KT0dESUFMX0RPV05fUFJFU1NFRDoKCQlpbnB1dF9yZXBvcnRfcmVsKGpvZ19kZXYsIFJFTF9XSEVFTCwgLTEpOwoJCWlucHV0X3N5bmMoam9nX2Rldik7CgkJcmV0dXJuOwoKCS8qIGtleV9kZXYgZXZlbnRzICovCgljYXNlIFNPTllQSV9FVkVOVF9KT0dESUFMX1BSRVNTRUQ6CgkJa3Aua2V5ID0gQlROX01JRERMRTsKCQlrcC5kZXYgPSBqb2dfZGV2OwoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJZm9yIChpID0gMDsgc29ueV9sYXB0b3BfaW5wdXRrZXlzW2ldLnNvbnlwaWV2OyBpKyspCgkJCWlmIChldmVudCA9PSBzb255X2xhcHRvcF9pbnB1dGtleXNbaV0uc29ueXBpZXYpIHsKCQkJCWtwLmRldiA9IGtleV9kZXY7CgkJCQlrcC5rZXkgPSBzb255X2xhcHRvcF9pbnB1dGtleXNbaV0uaW5wdXRldjsKCQkJCWJyZWFrOwoJCQl9CgkJYnJlYWs7Cgl9CgoJaWYgKGtwLmRldikgewoJCWlucHV0X3JlcG9ydF9rZXkoa3AuZGV2LCBrcC5rZXksIDEpOwoJCWlucHV0X3N5bmMoa3AuZGV2KTsKCQlrZmlmb19wdXQoc29ueV9sYXB0b3BfaW5wdXQuZmlmbywKCQkJICAodW5zaWduZWQgY2hhciAqKSZrcCwgc2l6ZW9mKGtwKSk7CgoJCWlmICghd29ya19wZW5kaW5nKCZzb255X2xhcHRvcF9yZWxlYXNlX2tleV93b3JrKSkKCQkJcXVldWVfd29yayhzb255X2xhcHRvcF9pbnB1dC53cSwKCQkJCQkmc29ueV9sYXB0b3BfcmVsZWFzZV9rZXlfd29yayk7Cgl9IGVsc2UKCQlkcHJpbnRrKCJ1bmtub3duIGlucHV0IGV2ZW50ICUuMnhcbiIsIGV2ZW50KTsKfQoKc3RhdGljIGludCBzb255X2xhcHRvcF9zZXR1cF9pbnB1dCh2b2lkKQp7CglzdHJ1Y3QgaW5wdXRfZGV2ICpqb2dfZGV2OwoJc3RydWN0IGlucHV0X2RldiAqa2V5X2RldjsKCWludCBpOwoJaW50IGVycm9yOwoKCS8qIGRvbid0IHJ1biBhZ2FpbiBpZiBhbHJlYWR5IGluaXRpYWxpemVkICovCglpZiAoYXRvbWljX2FkZF9yZXR1cm4oMSwgJnNvbnlfbGFwdG9wX2lucHV0LnVzZXJzKSA+IDEpCgkJcmV0dXJuIDA7CgoJLyoga2ZpZm8gKi8KCXNwaW5fbG9ja19pbml0KCZzb255X2xhcHRvcF9pbnB1dC5maWZvX2xvY2spOwoJc29ueV9sYXB0b3BfaW5wdXQuZmlmbyA9CgkJa2ZpZm9fYWxsb2MoU09OWV9MQVBUT1BfQlVGX1NJWkUsIEdGUF9LRVJORUwsCgkJCSAgICAmc29ueV9sYXB0b3BfaW5wdXQuZmlmb19sb2NrKTsKCWlmIChJU19FUlIoc29ueV9sYXB0b3BfaW5wdXQuZmlmbykpIHsKCQlwcmludGsoS0VSTl9FUlIgRFJWX1BGWCAia2ZpZm9fYWxsb2MgZmFpbGVkXG4iKTsKCQllcnJvciA9IFBUUl9FUlIoc29ueV9sYXB0b3BfaW5wdXQuZmlmbyk7CgkJZ290byBlcnJfZGVjX3VzZXJzOwoJfQoKCS8qIGluaXQgd29ya3F1ZXVlICovCglzb255X2xhcHRvcF9pbnB1dC53cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJzb255LWxhcHRvcCIpOwoJaWYgKCFzb255X2xhcHRvcF9pbnB1dC53cSkgewoJCXByaW50ayhLRVJOX0VSUiBEUlZfUEZYCgkJCQkiVW5hYmUgdG8gY3JlYXRlIHdvcmtxdWV1ZS5cbiIpOwoJCWVycm9yID0gLUVOWElPOwoJCWdvdG8gZXJyX2ZyZWVfa2ZpZm87Cgl9CgoJLyogaW5wdXQga2V5cyAqLwoJa2V5X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwoJaWYgKCFrZXlfZGV2KSB7CgkJZXJyb3IgPSAtRU5PTUVNOwoJCWdvdG8gZXJyX2Rlc3Ryb3lfd3E7Cgl9CgoJa2V5X2Rldi0+bmFtZSA9ICJTb255IFZhaW8gS2V5cyI7CglrZXlfZGV2LT5pZC5idXN0eXBlID0gQlVTX0lTQTsKCWtleV9kZXYtPmlkLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfU09OWTsKCgkvKiBJbml0aWFsaXplIHRoZSBJbnB1dCBEcml2ZXJzOiBzcGVjaWFsIGtleXMgKi8KCWtleV9kZXYtPmV2Yml0WzBdID0gQklUKEVWX0tFWSk7Cglmb3IgKGkgPSAwOyBzb255X2xhcHRvcF9pbnB1dGtleXNbaV0uc29ueXBpZXY7IGkrKykKCQlpZiAoc29ueV9sYXB0b3BfaW5wdXRrZXlzW2ldLmlucHV0ZXYpCgkJCXNldF9iaXQoc29ueV9sYXB0b3BfaW5wdXRrZXlzW2ldLmlucHV0ZXYsCgkJCQkJa2V5X2Rldi0+a2V5Yml0KTsKCgllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShrZXlfZGV2KTsKCWlmIChlcnJvcikKCQlnb3RvIGVycl9mcmVlX2tleWRldjsKCglzb255X2xhcHRvcF9pbnB1dC5rZXlfZGV2ID0ga2V5X2RldjsKCgkvKiBqb2dkaWFsICovCglqb2dfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CglpZiAoIWpvZ19kZXYpIHsKCQllcnJvciA9IC1FTk9NRU07CgkJZ290byBlcnJfdW5yZWdpc3Rlcl9rZXlkZXY7Cgl9CgoJam9nX2Rldi0+bmFtZSA9ICJTb255IFZhaW8gSm9nZGlhbCI7Cglqb2dfZGV2LT5pZC5idXN0eXBlID0gQlVTX0lTQTsKCWpvZ19kZXYtPmlkLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfU09OWTsKCglqb2dfZGV2LT5ldmJpdFswXSA9IEJJVChFVl9LRVkpIHwgQklUKEVWX1JFTCk7Cglqb2dfZGV2LT5rZXliaXRbTE9ORyhCVE5fTU9VU0UpXSA9IEJJVChCVE5fTUlERExFKTsKCWpvZ19kZXYtPnJlbGJpdFswXSA9IEJJVChSRUxfV0hFRUwpOwoKCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGpvZ19kZXYpOwoJaWYgKGVycm9yKQoJCWdvdG8gZXJyX2ZyZWVfam9nZGV2OwoKCXNvbnlfbGFwdG9wX2lucHV0LmpvZ19kZXYgPSBqb2dfZGV2OwoKCXJldHVybiAwOwoKZXJyX2ZyZWVfam9nZGV2OgoJaW5wdXRfZnJlZV9kZXZpY2Uoam9nX2Rldik7CgplcnJfdW5yZWdpc3Rlcl9rZXlkZXY6CglpbnB1dF91bnJlZ2lzdGVyX2RldmljZShrZXlfZGV2KTsKCS8qIHRvIGF2b2lkIGtyZWYgdW5kZXJmbG93IGJlbG93IGF0IGlucHV0X2ZyZWVfZGV2aWNlICovCglrZXlfZGV2ID0gTlVMTDsKCmVycl9mcmVlX2tleWRldjoKCWlucHV0X2ZyZWVfZGV2aWNlKGtleV9kZXYpOwoKZXJyX2Rlc3Ryb3lfd3E6CglkZXN0cm95X3dvcmtxdWV1ZShzb255X2xhcHRvcF9pbnB1dC53cSk7CgplcnJfZnJlZV9rZmlmbzoKCWtmaWZvX2ZyZWUoc29ueV9sYXB0b3BfaW5wdXQuZmlmbyk7CgplcnJfZGVjX3VzZXJzOgoJYXRvbWljX2RlYygmc29ueV9sYXB0b3BfaW5wdXQudXNlcnMpOwoJcmV0dXJuIGVycm9yOwp9CgpzdGF0aWMgdm9pZCBzb255X2xhcHRvcF9yZW1vdmVfaW5wdXQodm9pZCkKewoJLyogY2xlYW51cCBvbmx5IGFmdGVyIHRoZSBsYXN0IHVzZXIgaGFzIGdvbmUgKi8KCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmc29ueV9sYXB0b3BfaW5wdXQudXNlcnMpKQoJCXJldHVybjsKCgkvKiBmbHVzaCB3b3JrcXVldWUgZmlyc3QgKi8KCWZsdXNoX3dvcmtxdWV1ZShzb255X2xhcHRvcF9pbnB1dC53cSk7CgoJLyogZGVzdHJveSBpbnB1dCBkZXZzICovCglpbnB1dF91bnJlZ2lzdGVyX2RldmljZShzb255X2xhcHRvcF9pbnB1dC5rZXlfZGV2KTsKCXNvbnlfbGFwdG9wX2lucHV0LmtleV9kZXYgPSBOVUxMOwoKCWlmIChzb255X2xhcHRvcF9pbnB1dC5qb2dfZGV2KSB7CgkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2Uoc29ueV9sYXB0b3BfaW5wdXQuam9nX2Rldik7CgkJc29ueV9sYXB0b3BfaW5wdXQuam9nX2RldiA9IE5VTEw7Cgl9CgoJZGVzdHJveV93b3JrcXVldWUoc29ueV9sYXB0b3BfaW5wdXQud3EpOwoJa2ZpZm9fZnJlZShzb255X2xhcHRvcF9pbnB1dC5maWZvKTsKfQoKLyoqKioqKioqKioqIFBsYXRmb3JtIERldmljZSAqKioqKioqKioqKi8KCnN0YXRpYyBhdG9taWNfdCBzb255X3BmX3VzZXJzID0gQVRPTUlDX0lOSVQoMCk7CnN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNvbnlfcGZfZHJpdmVyID0gewoJLmRyaXZlciA9IHsKCQkgICAubmFtZSA9ICJzb255LWxhcHRvcCIsCgkJICAgLm93bmVyID0gVEhJU19NT0RVTEUsCgkJICAgfQp9OwpzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc29ueV9wZl9kZXZpY2U7CgpzdGF0aWMgaW50IHNvbnlfcGZfYWRkKHZvaWQpCnsKCWludCByZXQgPSAwOwoKCS8qIGRvbid0IHJ1biBhZ2FpbiBpZiBhbHJlYWR5IGluaXRpYWxpemVkICovCglpZiAoYXRvbWljX2FkZF9yZXR1cm4oMSwgJnNvbnlfcGZfdXNlcnMpID4gMSkKCQlyZXR1cm4gMDsKCglyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNvbnlfcGZfZHJpdmVyKTsKCWlmIChyZXQpCgkJZ290byBvdXQ7CgoJc29ueV9wZl9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInNvbnktbGFwdG9wIiwgLTEpOwoJaWYgKCFzb255X3BmX2RldmljZSkgewoJCXJldCA9IC1FTk9NRU07CgkJZ290byBvdXRfcGxhdGZvcm1fcmVnaXN0ZXJlZDsKCX0KCglyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHNvbnlfcGZfZGV2aWNlKTsKCWlmIChyZXQpCgkJZ290byBvdXRfcGxhdGZvcm1fYWxsb2NlZDsKCglyZXR1cm4gMDsKCiAgICAgIG91dF9wbGF0Zm9ybV9hbGxvY2VkOgoJcGxhdGZvcm1fZGV2aWNlX3B1dChzb255X3BmX2RldmljZSk7Cglzb255X3BmX2RldmljZSA9IE5VTEw7CiAgICAgIG91dF9wbGF0Zm9ybV9yZWdpc3RlcmVkOgoJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNvbnlfcGZfZHJpdmVyKTsKICAgICAgb3V0OgoJYXRvbWljX2RlYygmc29ueV9wZl91c2Vycyk7CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgdm9pZCBzb255X3BmX3JlbW92ZSh2b2lkKQp7CgkvKiBkZXJlZ2lzdGVyIG9ubHkgYWZ0ZXIgdGhlIGxhc3QgdXNlciBoYXMgZ29uZSAqLwoJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZzb255X3BmX3VzZXJzKSkKCQlyZXR1cm47CgoJcGxhdGZvcm1fZGV2aWNlX2RlbChzb255X3BmX2RldmljZSk7CglwbGF0Zm9ybV9kZXZpY2VfcHV0KHNvbnlfcGZfZGV2aWNlKTsKCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzb255X3BmX2RyaXZlcik7Cn0KCi8qKioqKioqKioqKiBTTkMgKFNOWTUwMDEpIERldmljZSAqKioqKioqKioqKi8KCi8qIHRoZSBkZXZpY2UgdXNlcyAxLWJhc2VkIHZhbHVlcywgd2hpbGUgdGhlIGJhY2tsaWdodCBzdWJzeXN0ZW0gdXNlcwogICAwLWJhc2VkIHZhbHVlcyAqLwojZGVmaW5lIFNPTllfTUFYX0JSSUdIVE5FU1MJOAoKI2RlZmluZSBTTkNfVkFMSURBVEVfSU4JCTAKI2RlZmluZSBTTkNfVkFMSURBVEVfT1VUCTEKCnN0YXRpYyBzc2l6ZV90IHNvbnlfbmNfc3lzZnNfc2hvdyhzdHJ1Y3QgZGV2aWNlICosIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICosCgkJCSAgICAgIGNoYXIgKik7CnN0YXRpYyBzc2l6ZV90IHNvbnlfbmNfc3lzZnNfc3RvcmUoc3RydWN0IGRldmljZSAqLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqLAoJCQkgICAgICAgY29uc3QgY2hhciAqLCBzaXplX3QpOwpzdGF0aWMgaW50IGJvb2xlYW5fdmFsaWRhdGUoY29uc3QgaW50LCBjb25zdCBpbnQpOwpzdGF0aWMgaW50IGJyaWdodG5lc3NfZGVmYXVsdF92YWxpZGF0ZShjb25zdCBpbnQsIGNvbnN0IGludCk7CgpzdHJ1Y3Qgc29ueV9uY192YWx1ZSB7CgljaGFyICpuYW1lOwkJLyogbmFtZSBvZiB0aGUgZW50cnkgKi8KCWNoYXIgKiphY3BpZ2V0OwkJLyogbmFtZXMgb2YgdGhlIEFDUEkgZ2V0IGZ1bmN0aW9uICovCgljaGFyICoqYWNwaXNldDsJCS8qIG5hbWVzIG9mIHRoZSBBQ1BJIHNldCBmdW5jdGlvbiAqLwoJaW50ICgqdmFsaWRhdGUpKGNvbnN0IGludCwgY29uc3QgaW50KTsJLyogaW5wdXQvb3V0cHV0IHZhbGlkYXRpb24gKi8KCWludCB2YWx1ZTsJCS8qIGN1cnJlbnQgc2V0dGluZyAqLwoJaW50IHZhbGlkOwkJLyogSGFzIGV2ZXIgYmVlbiBzZXQgKi8KCWludCBkZWJ1ZzsJCS8qIGFjdGl2ZSBvbmx5IGluIGRlYnVnIG1vZGUgPyAqLwoJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2YXR0cjsJLyogc3lzZnMgYXRyaWJ1dGUgKi8KfTsKCiNkZWZpbmUgU05DX0hBTkRMRV9OQU1FUyhfbmFtZSwgX3ZhbHVlcy4uLikgXAoJc3RhdGljIGNoYXIgKnNuY18jI19uYW1lW10gPSB7IF92YWx1ZXMsIE5VTEwgfQoKI2RlZmluZSBTTkNfSEFORExFKF9uYW1lLCBfZ2V0dGVycywgX3NldHRlcnMsIF92YWxpZGF0ZSwgX2RlYnVnKSBcCgl7IFwKCQkubmFtZQkJPSBfX3N0cmluZ2lmeShfbmFtZSksIFwKCQkuYWNwaWdldAk9IF9nZXR0ZXJzLCBcCgkJLmFjcGlzZXQJPSBfc2V0dGVycywgXAoJCS52YWxpZGF0ZQk9IF92YWxpZGF0ZSwgXAoJCS5kZWJ1ZwkJPSBfZGVidWcsIFwKCQkuZGV2YXR0cgk9IF9fQVRUUihfbmFtZSwgMCwgc29ueV9uY19zeXNmc19zaG93LCBzb255X25jX3N5c2ZzX3N0b3JlKSwgXAoJfQoKI2RlZmluZSBTTkNfSEFORExFX05VTEwJeyAubmFtZSA9IE5VTEwgfQoKU05DX0hBTkRMRV9OQU1FUyhmbmtleV9nZXQsICJHSEtFIik7CgpTTkNfSEFORExFX05BTUVTKGJyaWdodG5lc3NfZGVmX2dldCwgIkdQQlIiKTsKU05DX0hBTkRMRV9OQU1FUyhicmlnaHRuZXNzX2RlZl9zZXQsICJTUEJSIik7CgpTTkNfSEFORExFX05BTUVTKGNkcG93ZXJfZ2V0LCAiR0NEUCIpOwpTTkNfSEFORExFX05BTUVTKGNkcG93ZXJfc2V0LCAiU0NEUCIsICJDRFBXIik7CgpTTkNfSEFORExFX05BTUVTKGF1ZGlvcG93ZXJfZ2V0LCAiR0FaUCIpOwpTTkNfSEFORExFX05BTUVTKGF1ZGlvcG93ZXJfc2V0LCAiQVpQVyIpOwoKU05DX0hBTkRMRV9OQU1FUyhsYW5wb3dlcl9nZXQsICJHTE5QIik7ClNOQ19IQU5ETEVfTkFNRVMobGFucG93ZXJfc2V0LCAiTE5QVyIpOwoKU05DX0hBTkRMRV9OQU1FUyhQSURfZ2V0LCAiR1BJRCIpOwoKU05DX0hBTkRMRV9OQU1FUyhDVFJfZ2V0LCAiR0NUUiIpOwpTTkNfSEFORExFX05BTUVTKENUUl9zZXQsICJTQ1RSIik7CgpTTkNfSEFORExFX05BTUVTKFBDUl9nZXQsICJHUENSIik7ClNOQ19IQU5ETEVfTkFNRVMoUENSX3NldCwgIlNQQ1IiKTsKClNOQ19IQU5ETEVfTkFNRVMoQ01JX2dldCwgIkdDTUkiKTsKU05DX0hBTkRMRV9OQU1FUyhDTUlfc2V0LCAiU0NNSSIpOwoKc3RhdGljIHN0cnVjdCBzb255X25jX3ZhbHVlIHNvbnlfbmNfdmFsdWVzW10gPSB7CglTTkNfSEFORExFKGJyaWdodG5lc3NfZGVmYXVsdCwgc25jX2JyaWdodG5lc3NfZGVmX2dldCwKCQkJc25jX2JyaWdodG5lc3NfZGVmX3NldCwgYnJpZ2h0bmVzc19kZWZhdWx0X3ZhbGlkYXRlLCAwKSwKCVNOQ19IQU5ETEUoZm5rZXksIHNuY19mbmtleV9nZXQsIE5VTEwsIE5VTEwsIDApLAoJU05DX0hBTkRMRShjZHBvd2VyLCBzbmNfY2Rwb3dlcl9nZXQsIHNuY19jZHBvd2VyX3NldCwgYm9vbGVhbl92YWxpZGF0ZSwgMCksCglTTkNfSEFORExFKGF1ZGlvcG93ZXIsIHNuY19hdWRpb3Bvd2VyX2dldCwgc25jX2F1ZGlvcG93ZXJfc2V0LAoJCQlib29sZWFuX3ZhbGlkYXRlLCAwKSwKCVNOQ19IQU5ETEUobGFucG93ZXIsIHNuY19sYW5wb3dlcl9nZXQsIHNuY19sYW5wb3dlcl9zZXQsCgkJCWJvb2xlYW5fdmFsaWRhdGUsIDEpLAoJLyogdW5rbm93biBtZXRob2RzICovCglTTkNfSEFORExFKFBJRCwgc25jX1BJRF9nZXQsIE5VTEwsIE5VTEwsIDEpLAoJU05DX0hBTkRMRShDVFIsIHNuY19DVFJfZ2V0LCBzbmNfQ1RSX3NldCwgTlVMTCwgMSksCglTTkNfSEFORExFKFBDUiwgc25jX1BDUl9nZXQsIHNuY19QQ1Jfc2V0LCBOVUxMLCAxKSwKCVNOQ19IQU5ETEUoQ01JLCBzbmNfQ01JX2dldCwgc25jX0NNSV9zZXQsIE5VTEwsIDEpLAoJU05DX0hBTkRMRV9OVUxMCn07CgpzdGF0aWMgYWNwaV9oYW5kbGUgc29ueV9uY19hY3BpX2hhbmRsZTsKc3RhdGljIHN0cnVjdCBhY3BpX2RldmljZSAqc29ueV9uY19hY3BpX2RldmljZSA9IE5VTEw7CgovKgogKiBhY3BpX2V2YWx1YXRlX29iamVjdCB3cmFwcGVycwogKi8Kc3RhdGljIGludCBhY3BpX2NhbGxnZXRmdW5jKGFjcGlfaGFuZGxlIGhhbmRsZSwgY2hhciAqbmFtZSwgaW50ICpyZXN1bHQpCnsKCXN0cnVjdCBhY3BpX2J1ZmZlciBvdXRwdXQ7Cgl1bmlvbiBhY3BpX29iamVjdCBvdXRfb2JqOwoJYWNwaV9zdGF0dXMgc3RhdHVzOwoKCW91dHB1dC5sZW5ndGggPSBzaXplb2Yob3V0X29iaik7CglvdXRwdXQucG9pbnRlciA9ICZvdXRfb2JqOwoKCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgbmFtZSwgTlVMTCwgJm91dHB1dCk7CglpZiAoKHN0YXR1cyA9PSBBRV9PSykgJiYgKG91dF9vYmoudHlwZSA9PSBBQ1BJX1RZUEVfSU5URUdFUikpIHsKCQkqcmVzdWx0ID0gb3V0X29iai5pbnRlZ2VyLnZhbHVlOwoJCXJldHVybiAwOwoJfQoKCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX1BGWCAiYWNwaV9jYWxscmVhZGZ1bmMgZmFpbGVkXG4iKTsKCglyZXR1cm4gLTE7Cn0KCnN0YXRpYyBpbnQgYWNwaV9jYWxsc2V0ZnVuYyhhY3BpX2hhbmRsZSBoYW5kbGUsIGNoYXIgKm5hbWUsIGludCB2YWx1ZSwKCQkJICAgIGludCAqcmVzdWx0KQp7CglzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBwYXJhbXM7Cgl1bmlvbiBhY3BpX29iamVjdCBpbl9vYmo7CglzdHJ1Y3QgYWNwaV9idWZmZXIgb3V0cHV0OwoJdW5pb24gYWNwaV9vYmplY3Qgb3V0X29iajsKCWFjcGlfc3RhdHVzIHN0YXR1czsKCglwYXJhbXMuY291bnQgPSAxOwoJcGFyYW1zLnBvaW50ZXIgPSAmaW5fb2JqOwoJaW5fb2JqLnR5cGUgPSBBQ1BJX1RZUEVfSU5URUdFUjsKCWluX29iai5pbnRlZ2VyLnZhbHVlID0gdmFsdWU7CgoJb3V0cHV0Lmxlbmd0aCA9IHNpemVvZihvdXRfb2JqKTsKCW91dHB1dC5wb2ludGVyID0gJm91dF9vYmo7CgoJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCBuYW1lLCAmcGFyYW1zLCAmb3V0cHV0KTsKCWlmIChzdGF0dXMgPT0gQUVfT0spIHsKCQlpZiAocmVzdWx0ICE9IE5VTEwpIHsKCQkJaWYgKG91dF9vYmoudHlwZSAhPSBBQ1BJX1RZUEVfSU5URUdFUikgewoJCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfUEZYICJhY3BpX2V2YWx1YXRlX29iamVjdCBiYWQgIgoJCQkJICAgICAgICJyZXR1cm4gdHlwZVxuIik7CgkJCQlyZXR1cm4gLTE7CgkJCX0KCQkJKnJlc3VsdCA9IG91dF9vYmouaW50ZWdlci52YWx1ZTsKCQl9CgkJcmV0dXJuIDA7Cgl9CgoJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfUEZYICJhY3BpX2V2YWx1YXRlX29iamVjdCBmYWlsZWRcbiIpOwoKCXJldHVybiAtMTsKfQoKLyoKICogc29ueV9uY192YWx1ZXMgaW5wdXQvb3V0cHV0IHZhbGlkYXRlIGZ1bmN0aW9ucwogKi8KCi8qIGJyaWdodG5lc3NfZGVmYXVsdF92YWxpZGF0ZToKICoKICogbWFuaXB1bGF0ZSBpbnB1dCBvdXRwdXQgdmFsdWVzIHRvIGtlZXAgY29uc2lzdGVuY3kgd2l0aCB0aGUKICogYmFja2xpZ2h0IGZyYW1ld29yayBmb3Igd2hpY2ggYnJpZ2h0bmVzcyB2YWx1ZXMgYXJlIDAtYmFzZWQuCiAqLwpzdGF0aWMgaW50IGJyaWdodG5lc3NfZGVmYXVsdF92YWxpZGF0ZShjb25zdCBpbnQgZGlyZWN0aW9uLCBjb25zdCBpbnQgdmFsdWUpCnsKCXN3aXRjaCAoZGlyZWN0aW9uKSB7CgkJY2FzZSBTTkNfVkFMSURBVEVfT1VUOgoJCQlyZXR1cm4gdmFsdWUgLSAxOwoJCWNhc2UgU05DX1ZBTElEQVRFX0lOOgoJCQlpZiAodmFsdWUgPj0gMCAmJiB2YWx1ZSA8IFNPTllfTUFYX0JSSUdIVE5FU1MpCgkJCQlyZXR1cm4gdmFsdWUgKyAxOwoJfQoJcmV0dXJuIC1FSU5WQUw7Cn0KCi8qIGJvb2xlYW5fdmFsaWRhdGU6CiAqCiAqIG9uIGlucHV0IHZhbGlkYXRlIGJvb2xlYW4gdmFsdWVzIDAvMSwgb24gb3V0cHV0IGp1c3QgcGFzcyB0aGUKICogcmVjZWl2ZWQgdmFsdWUuCiAqLwpzdGF0aWMgaW50IGJvb2xlYW5fdmFsaWRhdGUoY29uc3QgaW50IGRpcmVjdGlvbiwgY29uc3QgaW50IHZhbHVlKQp7CglpZiAoZGlyZWN0aW9uID09IFNOQ19WQUxJREFURV9JTikgewoJCWlmICh2YWx1ZSAhPSAwICYmIHZhbHVlICE9IDEpCgkJCXJldHVybiAtRUlOVkFMOwoJfQoJcmV0dXJuIHZhbHVlOwp9CgovKgogKiBTeXNmcyBzaG93L3N0b3JlIGNvbW1vbiB0byBhbGwgc29ueV9uY192YWx1ZXMKICovCnN0YXRpYyBzc2l6ZV90IHNvbnlfbmNfc3lzZnNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAoJCQkgICAgICBjaGFyICpidWZmZXIpCnsKCWludCB2YWx1ZTsKCXN0cnVjdCBzb255X25jX3ZhbHVlICppdGVtID0KCSAgICBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IHNvbnlfbmNfdmFsdWUsIGRldmF0dHIpOwoKCWlmICghKml0ZW0tPmFjcGlnZXQpCgkJcmV0dXJuIC1FSU87CgoJaWYgKGFjcGlfY2FsbGdldGZ1bmMoc29ueV9uY19hY3BpX2hhbmRsZSwgKml0ZW0tPmFjcGlnZXQsICZ2YWx1ZSkgPCAwKQoJCXJldHVybiAtRUlPOwoKCWlmIChpdGVtLT52YWxpZGF0ZSkKCQl2YWx1ZSA9IGl0ZW0tPnZhbGlkYXRlKFNOQ19WQUxJREFURV9PVVQsIHZhbHVlKTsKCglyZXR1cm4gc25wcmludGYoYnVmZmVyLCBQQUdFX1NJWkUsICIlZFxuIiwgdmFsdWUpOwp9CgpzdGF0aWMgc3NpemVfdCBzb255X25jX3N5c2ZzX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAoJCQkgICAgICAgY29uc3QgY2hhciAqYnVmZmVyLCBzaXplX3QgY291bnQpCnsKCWludCB2YWx1ZTsKCXN0cnVjdCBzb255X25jX3ZhbHVlICppdGVtID0KCSAgICBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IHNvbnlfbmNfdmFsdWUsIGRldmF0dHIpOwoKCWlmICghaXRlbS0+YWNwaXNldCkKCQlyZXR1cm4gLUVJTzsKCglpZiAoY291bnQgPiAzMSkKCQlyZXR1cm4gLUVJTlZBTDsKCgl2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZmZlciwgTlVMTCwgMTApOwoKCWlmIChpdGVtLT52YWxpZGF0ZSkKCQl2YWx1ZSA9IGl0ZW0tPnZhbGlkYXRlKFNOQ19WQUxJREFURV9JTiwgdmFsdWUpOwoKCWlmICh2YWx1ZSA8IDApCgkJcmV0dXJuIHZhbHVlOwoKCWlmIChhY3BpX2NhbGxzZXRmdW5jKHNvbnlfbmNfYWNwaV9oYW5kbGUsICppdGVtLT5hY3Bpc2V0LCB2YWx1ZSwgTlVMTCkgPCAwKQoJCXJldHVybiAtRUlPOwoJaXRlbS0+dmFsdWUgPSB2YWx1ZTsKCWl0ZW0tPnZhbGlkID0gMTsKCXJldHVybiBjb3VudDsKfQoKCi8qCiAqIEJhY2tsaWdodCBkZXZpY2UKICovCnN0YXRpYyBpbnQgc29ueV9iYWNrbGlnaHRfdXBkYXRlX3N0YXR1cyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCnsKCXJldHVybiBhY3BpX2NhbGxzZXRmdW5jKHNvbnlfbmNfYWNwaV9oYW5kbGUsICJTQlJUIiwKCQkJCWJkLT5wcm9wcy5icmlnaHRuZXNzICsgMSwgTlVMTCk7Cn0KCnN0YXRpYyBpbnQgc29ueV9iYWNrbGlnaHRfZ2V0X2JyaWdodG5lc3Moc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQp7CglpbnQgdmFsdWU7CgoJaWYgKGFjcGlfY2FsbGdldGZ1bmMoc29ueV9uY19hY3BpX2hhbmRsZSwgIkdCUlQiLCAmdmFsdWUpKQoJCXJldHVybiAwOwoJLyogYnJpZ2h0bmVzcyBsZXZlbHMgYXJlIDEtYmFzZWQsIHdoaWxlIGJhY2tsaWdodCBvbmVzIGFyZSAwLWJhc2VkICovCglyZXR1cm4gdmFsdWUgLSAxOwp9CgpzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKnNvbnlfYmFja2xpZ2h0X2RldmljZTsKc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfb3BzIHNvbnlfYmFja2xpZ2h0X29wcyA9IHsKCS51cGRhdGVfc3RhdHVzID0gc29ueV9iYWNrbGlnaHRfdXBkYXRlX3N0YXR1cywKCS5nZXRfYnJpZ2h0bmVzcyA9IHNvbnlfYmFja2xpZ2h0X2dldF9icmlnaHRuZXNzLAp9OwoKLyoKICogQUNQSSBjYWxsYmFja3MKICovCnN0YXRpYyB2b2lkIHNvbnlfYWNwaV9ub3RpZnkoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZXZlbnQsIHZvaWQgKmRhdGEpCnsKCWRwcmludGsoInNvbnlfYWNwaV9ub3RpZnksIGV2ZW50OiAlZFxuIiwgZXZlbnQpOwoJc29ueV9sYXB0b3BfcmVwb3J0X2lucHV0X2V2ZW50KGV2ZW50KTsKCWFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50KHNvbnlfbmNfYWNwaV9kZXZpY2UsIDEsIGV2ZW50KTsKfQoKc3RhdGljIGFjcGlfc3RhdHVzIHNvbnlfd2Fsa19jYWxsYmFjayhhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBsZXZlbCwKCQkJCSAgICAgIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR1cm5fdmFsdWUpCnsKCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwoJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb3BlcmFuZDsKCglub2RlID0gKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopaGFuZGxlOwoJb3BlcmFuZCA9ICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopbm9kZS0+b2JqZWN0OwoKCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX1BGWCAibWV0aG9kOiBuYW1lOiAlNC40cywgYXJncyAlWFxuIiwgbm9kZS0+bmFtZS5hc2NpaSwKCSAgICAgICAodTMyKSBvcGVyYW5kLT5tZXRob2QucGFyYW1fY291bnQpOwoKCXJldHVybiBBRV9PSzsKfQoKLyoKICogQUNQSSBkZXZpY2UKICovCnN0YXRpYyBpbnQgc29ueV9uY19yZXN1bWUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCnsKCXN0cnVjdCBzb255X25jX3ZhbHVlICppdGVtOwoKCWZvciAoaXRlbSA9IHNvbnlfbmNfdmFsdWVzOyBpdGVtLT5uYW1lOyBpdGVtKyspIHsKCQlpbnQgcmV0OwoKCQlpZiAoIWl0ZW0tPnZhbGlkKQoJCQljb250aW51ZTsKCQlyZXQgPSBhY3BpX2NhbGxzZXRmdW5jKHNvbnlfbmNfYWNwaV9oYW5kbGUsICppdGVtLT5hY3Bpc2V0LAoJCQkJICAgICAgIGl0ZW0tPnZhbHVlLCBOVUxMKTsKCQlpZiAocmV0IDwgMCkgewoJCQlwcmludGsoIiVzOiAlZFxuIiwgX19GVU5DVElPTl9fLCByZXQpOwoJCQlicmVhazsKCQl9Cgl9CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzb255X25jX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKewoJYWNwaV9zdGF0dXMgc3RhdHVzOwoJaW50IHJlc3VsdCA9IDA7CglhY3BpX2hhbmRsZSBoYW5kbGU7CglzdHJ1Y3Qgc29ueV9uY192YWx1ZSAqaXRlbTsKCglwcmludGsoS0VSTl9JTkZPIERSVl9QRlggIiVzIHYlcy5cbiIsCgkJU09OWV9OQ19EUklWRVJfTkFNRSwgU09OWV9MQVBUT1BfRFJJVkVSX1ZFUlNJT04pOwoKCXNvbnlfbmNfYWNwaV9kZXZpY2UgPSBkZXZpY2U7CglzdHJjcHkoYWNwaV9kZXZpY2VfY2xhc3MoZGV2aWNlKSwgInNvbnkvaG90a2V5Iik7CgoJc29ueV9uY19hY3BpX2hhbmRsZSA9IGRldmljZS0+aGFuZGxlOwoKCWlmIChkZWJ1ZykgewoJCXN0YXR1cyA9IGFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX01FVEhPRCwgc29ueV9uY19hY3BpX2hhbmRsZSwKCQkJCQkgICAgIDEsIHNvbnlfd2Fsa19jYWxsYmFjaywgTlVMTCwgTlVMTCk7CgkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CgkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX1BGWCAidW5hYmxlIHRvIHdhbGsgYWNwaSByZXNvdXJjZXNcbiIpOwoJCQlyZXN1bHQgPSAtRU5PREVWOwoJCQlnb3RvIG91dHdhbGs7CgkJfQoJfQoKCS8qIHNldHVwIGlucHV0IGRldmljZXMgYW5kIGhlbHBlciBmaWZvICovCglyZXN1bHQgPSBzb255X2xhcHRvcF9zZXR1cF9pbnB1dCgpOwoJaWYgKHJlc3VsdCkgewoJCXByaW50ayhLRVJOX0VSUiBEUlZfUEZYCgkJCQkiVW5hYmUgdG8gY3JlYXRlIGlucHV0IGRldmljZXMuXG4iKTsKCQlnb3RvIG91dHdhbGs7Cgl9CgoJc3RhdHVzID0gYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKHNvbnlfbmNfYWNwaV9oYW5kbGUsCgkJCQkJICAgICBBQ1BJX0RFVklDRV9OT1RJRlksCgkJCQkJICAgICBzb255X2FjcGlfbm90aWZ5LCBOVUxMKTsKCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewoJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX1BGWCAidW5hYmxlIHRvIGluc3RhbGwgbm90aWZ5IGhhbmRsZXJcbiIpOwoJCXJlc3VsdCA9IC1FTk9ERVY7CgkJZ290byBvdXRpbnB1dDsKCX0KCglpZiAoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShzb255X25jX2FjcGlfaGFuZGxlLCAiR0JSVCIsICZoYW5kbGUpKSkgewoJCXNvbnlfYmFja2xpZ2h0X2RldmljZSA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoInNvbnkiLCBOVUxMLAoJCQkJCQkJCSAgTlVMTCwKCQkJCQkJCQkgICZzb255X2JhY2tsaWdodF9vcHMpOwoKCQlpZiAoSVNfRVJSKHNvbnlfYmFja2xpZ2h0X2RldmljZSkpIHsKCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfUEZYICJ1bmFibGUgdG8gcmVnaXN0ZXIgYmFja2xpZ2h0IGRldmljZVxuIik7CgkJCXNvbnlfYmFja2xpZ2h0X2RldmljZSA9IE5VTEw7CgkJfSBlbHNlIHsKCQkJc29ueV9iYWNrbGlnaHRfZGV2aWNlLT5wcm9wcy5icmlnaHRuZXNzID0KCQkJICAgIHNvbnlfYmFja2xpZ2h0X2dldF9icmlnaHRuZXNzCgkJCSAgICAoc29ueV9iYWNrbGlnaHRfZGV2aWNlKTsKCQkJc29ueV9iYWNrbGlnaHRfZGV2aWNlLT5wcm9wcy5tYXhfYnJpZ2h0bmVzcyA9IAoJCQkgICAgU09OWV9NQVhfQlJJR0hUTkVTUyAtIDE7CgkJfQoKCX0KCglyZXN1bHQgPSBzb255X3BmX2FkZCgpOwoJaWYgKHJlc3VsdCkKCQlnb3RvIG91dGJhY2tsaWdodDsKCgkvKiBjcmVhdGUgc29ueV9wZiBzeXNmcyBhdHRyaWJ1dGVzIHJlbGF0ZWQgdG8gdGhlIFNOQyBkZXZpY2UgKi8KCWZvciAoaXRlbSA9IHNvbnlfbmNfdmFsdWVzOyBpdGVtLT5uYW1lOyArK2l0ZW0pIHsKCgkJaWYgKCFkZWJ1ZyAmJiBpdGVtLT5kZWJ1ZykKCQkJY29udGludWU7CgoJCS8qIGZpbmQgdGhlIGF2YWlsYWJsZSBhY3BpZ2V0IGFzIGRlc2NyaWJlZCBpbiB0aGUgRFNEVCAqLwoJCWZvciAoOyBpdGVtLT5hY3BpZ2V0ICYmICppdGVtLT5hY3BpZ2V0OyArK2l0ZW0tPmFjcGlnZXQpIHsKCQkJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoc29ueV9uY19hY3BpX2hhbmRsZSwKCQkJCQkJCSAqaXRlbS0+YWNwaWdldCwKCQkJCQkJCSAmaGFuZGxlKSkpIHsKCQkJCWRwcmludGsoIkZvdW5kICVzIGdldHRlcjogJXNcbiIsCgkJCQkJCWl0ZW0tPm5hbWUsICppdGVtLT5hY3BpZ2V0KTsKCQkJCWl0ZW0tPmRldmF0dHIuYXR0ci5tb2RlIHw9IFNfSVJVR087CgkJCQlicmVhazsKCQkJfQoJCX0KCgkJLyogZmluZCB0aGUgYXZhaWxhYmxlIGFjcGlzZXQgYXMgZGVzY3JpYmVkIGluIHRoZSBEU0RUICovCgkJZm9yICg7IGl0ZW0tPmFjcGlzZXQgJiYgKml0ZW0tPmFjcGlzZXQ7ICsraXRlbS0+YWNwaXNldCkgewoJCQlpZiAoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShzb255X25jX2FjcGlfaGFuZGxlLAoJCQkJCQkJICppdGVtLT5hY3Bpc2V0LAoJCQkJCQkJICZoYW5kbGUpKSkgewoJCQkJZHByaW50aygiRm91bmQgJXMgc2V0dGVyOiAlc1xuIiwKCQkJCQkJaXRlbS0+bmFtZSwgKml0ZW0tPmFjcGlzZXQpOwoJCQkJaXRlbS0+ZGV2YXR0ci5hdHRyLm1vZGUgfD0gU19JV1VTUjsKCQkJCWJyZWFrOwoJCQl9CgkJfQoKCQlpZiAoaXRlbS0+ZGV2YXR0ci5hdHRyLm1vZGUgIT0gMCkgewoJCQlyZXN1bHQgPQoJCQkgICAgZGV2aWNlX2NyZWF0ZV9maWxlKCZzb255X3BmX2RldmljZS0+ZGV2LAoJCQkJCSAgICAgICAmaXRlbS0+ZGV2YXR0cik7CgkJCWlmIChyZXN1bHQpCgkJCQlnb3RvIG91dF9zeXNmczsKCQl9Cgl9CgoJcmV0dXJuIDA7CgogICAgICBvdXRfc3lzZnM6Cglmb3IgKGl0ZW0gPSBzb255X25jX3ZhbHVlczsgaXRlbS0+bmFtZTsgKytpdGVtKSB7CgkJZGV2aWNlX3JlbW92ZV9maWxlKCZzb255X3BmX2RldmljZS0+ZGV2LCAmaXRlbS0+ZGV2YXR0cik7Cgl9Cglzb255X3BmX3JlbW92ZSgpOwoKICAgICAgb3V0YmFja2xpZ2h0OgoJaWYgKHNvbnlfYmFja2xpZ2h0X2RldmljZSkKCQliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoc29ueV9iYWNrbGlnaHRfZGV2aWNlKTsKCglzdGF0dXMgPSBhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcihzb255X25jX2FjcGlfaGFuZGxlLAoJCQkJCSAgICBBQ1BJX0RFVklDRV9OT1RJRlksCgkJCQkJICAgIHNvbnlfYWNwaV9ub3RpZnkpOwoJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQoJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX1BGWCAidW5hYmxlIHRvIHJlbW92ZSBub3RpZnkgaGFuZGxlclxuIik7CgogICAgICBvdXRpbnB1dDoKCXNvbnlfbGFwdG9wX3JlbW92ZV9pbnB1dCgpOwoKICAgICAgb3V0d2FsazoKCXJldHVybiByZXN1bHQ7Cn0KCnN0YXRpYyBpbnQgc29ueV9uY19yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQp7CglhY3BpX3N0YXR1cyBzdGF0dXM7CglzdHJ1Y3Qgc29ueV9uY192YWx1ZSAqaXRlbTsKCglpZiAoc29ueV9iYWNrbGlnaHRfZGV2aWNlKQoJCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3Rlcihzb255X2JhY2tsaWdodF9kZXZpY2UpOwoKCXNvbnlfbmNfYWNwaV9kZXZpY2UgPSBOVUxMOwoKCXN0YXR1cyA9IGFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKHNvbnlfbmNfYWNwaV9oYW5kbGUsCgkJCQkJICAgIEFDUElfREVWSUNFX05PVElGWSwKCQkJCQkgICAgc29ueV9hY3BpX25vdGlmeSk7CglpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCgkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfUEZYICJ1bmFibGUgdG8gcmVtb3ZlIG5vdGlmeSBoYW5kbGVyXG4iKTsKCglmb3IgKGl0ZW0gPSBzb255X25jX3ZhbHVlczsgaXRlbS0+bmFtZTsgKytpdGVtKSB7CgkJZGV2aWNlX3JlbW92ZV9maWxlKCZzb255X3BmX2RldmljZS0+ZGV2LCAmaXRlbS0+ZGV2YXR0cik7Cgl9CgoJc29ueV9wZl9yZW1vdmUoKTsKCXNvbnlfbGFwdG9wX3JlbW92ZV9pbnB1dCgpOwoJZHByaW50ayhTT05ZX05DX0RSSVZFUl9OQU1FICIgcmVtb3ZlZC5cbiIpOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIHNvbnlfbmNfZHJpdmVyID0gewoJLm5hbWUgPSBTT05ZX05DX0RSSVZFUl9OQU1FLAoJLmNsYXNzID0gU09OWV9OQ19DTEFTUywKCS5pZHMgPSBTT05ZX05DX0hJRCwKCS5vd25lciA9IFRISVNfTU9EVUxFLAoJLm9wcyA9IHsKCQkuYWRkID0gc29ueV9uY19hZGQsCgkJLnJlbW92ZSA9IHNvbnlfbmNfcmVtb3ZlLAoJCS5yZXN1bWUgPSBzb255X25jX3Jlc3VtZSwKCQl9LAp9OwoKLyoqKioqKioqKioqIFNQSUMgKFNOWTYwMDEpIERldmljZSAqKioqKioqKioqKi8KCiNkZWZpbmUgU09OWVBJX0RFVklDRV9UWVBFMQkweDAwMDAwMDAxCiNkZWZpbmUgU09OWVBJX0RFVklDRV9UWVBFMgkweDAwMDAwMDAyCiNkZWZpbmUgU09OWVBJX0RFVklDRV9UWVBFMwkweDAwMDAwMDA0CgojZGVmaW5lIFNPTllfUElDX0VWX01BU0sJMHhmZgoKc3RydWN0IHNvbnlfcGljX2lvcG9ydCB7CglzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pbwlpbzsKCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKfTsKCnN0cnVjdCBzb255X3BpY19pcnEgewoJc3RydWN0IGFjcGlfcmVzb3VyY2VfaXJxCWlycTsKCXN0cnVjdCBsaXN0X2hlYWQJCWxpc3Q7Cn07CgpzdHJ1Y3Qgc29ueV9waWNfZGV2IHsKCWludAkJCW1vZGVsOwoJdTgJCQljYW1lcmFfcG93ZXI7Cgl1OAkJCWJsdWV0b290aF9wb3dlcjsKCXU4CQkJd3dhbl9wb3dlcjsKCXN0cnVjdCBhY3BpX2RldmljZQkqYWNwaV9kZXY7CglzdHJ1Y3Qgc29ueV9waWNfaXJxCSpjdXJfaXJxOwoJc3RydWN0IHNvbnlfcGljX2lvcG9ydAkqY3VyX2lvcG9ydDsKCXN0cnVjdCBsaXN0X2hlYWQJaW50ZXJydXB0czsKCXN0cnVjdCBsaXN0X2hlYWQJaW9wb3J0czsKCXN0cnVjdCBtdXRleAkJbG9jazsKfTsKCnN0YXRpYyBzdHJ1Y3Qgc29ueV9waWNfZGV2IHNwaWNfZGV2ID0gewoJLmludGVycnVwdHMJPSBMSVNUX0hFQURfSU5JVChzcGljX2Rldi5pbnRlcnJ1cHRzKSwKCS5pb3BvcnRzCT0gTElTVF9IRUFEX0lOSVQoc3BpY19kZXYuaW9wb3J0cyksCn07CgovKiBFdmVudCBtYXNrcyAqLwojZGVmaW5lIFNPTllQSV9KT0dHRVJfTUFTSwkJCTB4MDAwMDAwMDEKI2RlZmluZSBTT05ZUElfQ0FQVFVSRV9NQVNLCQkJMHgwMDAwMDAwMgojZGVmaW5lIFNPTllQSV9GTktFWV9NQVNLCQkJMHgwMDAwMDAwNAojZGVmaW5lIFNPTllQSV9CTFVFVE9PVEhfTUFTSwkJCTB4MDAwMDAwMDgKI2RlZmluZSBTT05ZUElfUEtFWV9NQVNLCQkJMHgwMDAwMDAxMAojZGVmaW5lIFNPTllQSV9CQUNLX01BU0sJCQkweDAwMDAwMDIwCiNkZWZpbmUgU09OWVBJX0hFTFBfTUFTSwkJCTB4MDAwMDAwNDAKI2RlZmluZSBTT05ZUElfTElEX01BU0sJCQkJMHgwMDAwMDA4MAojZGVmaW5lIFNPTllQSV9aT09NX01BU0sJCQkweDAwMDAwMTAwCiNkZWZpbmUgU09OWVBJX1RIVU1CUEhSQVNFX01BU0sJCQkweDAwMDAwMjAwCiNkZWZpbmUgU09OWVBJX01FWUVfTUFTSwkJCTB4MDAwMDA0MDAKI2RlZmluZSBTT05ZUElfTUVNT1JZU1RJQ0tfTUFTSwkJCTB4MDAwMDA4MDAKI2RlZmluZSBTT05ZUElfQkFUVEVSWV9NQVNLCQkJMHgwMDAwMTAwMAojZGVmaW5lIFNPTllQSV9XSVJFTEVTU19NQVNLCQkJMHgwMDAwMjAwMAoKc3RydWN0IHNvbnlwaV9ldmVudCB7Cgl1OAlkYXRhOwoJdTgJZXZlbnQ7Cn07CgovKiBUaGUgc2V0IG9mIHBvc3NpYmxlIGJ1dHRvbiByZWxlYXNlIGV2ZW50cyAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfcmVsZWFzZWV2W10gPSB7Cgl7IDB4MDAsIFNPTllQSV9FVkVOVF9BTllCVVRUT05fUkVMRUFTRUQgfSwKCXsgMCwgMCB9Cn07CgovKiBUaGUgc2V0IG9mIHBvc3NpYmxlIGpvZ2dlciBldmVudHMgICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9qb2dnZXJldltdID0gewoJeyAweDFmLCBTT05ZUElfRVZFTlRfSk9HRElBTF9VUCB9LAoJeyAweDAxLCBTT05ZUElfRVZFTlRfSk9HRElBTF9ET1dOIH0sCgl7IDB4NWYsIFNPTllQSV9FVkVOVF9KT0dESUFMX1VQX1BSRVNTRUQgfSwKCXsgMHg0MSwgU09OWVBJX0VWRU5UX0pPR0RJQUxfRE9XTl9QUkVTU0VEIH0sCgl7IDB4MWUsIFNPTllQSV9FVkVOVF9KT0dESUFMX0ZBU1RfVVAgfSwKCXsgMHgwMiwgU09OWVBJX0VWRU5UX0pPR0RJQUxfRkFTVF9ET1dOIH0sCgl7IDB4NWUsIFNPTllQSV9FVkVOVF9KT0dESUFMX0ZBU1RfVVBfUFJFU1NFRCB9LAoJeyAweDQyLCBTT05ZUElfRVZFTlRfSk9HRElBTF9GQVNUX0RPV05fUFJFU1NFRCB9LAoJeyAweDFkLCBTT05ZUElfRVZFTlRfSk9HRElBTF9WRkFTVF9VUCB9LAoJeyAweDAzLCBTT05ZUElfRVZFTlRfSk9HRElBTF9WRkFTVF9ET1dOIH0sCgl7IDB4NWQsIFNPTllQSV9FVkVOVF9KT0dESUFMX1ZGQVNUX1VQX1BSRVNTRUQgfSwKCXsgMHg0MywgU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfRE9XTl9QUkVTU0VEIH0sCgl7IDB4NDAsIFNPTllQSV9FVkVOVF9KT0dESUFMX1BSRVNTRUQgfSwKCXsgMCwgMCB9Cn07CgovKiBUaGUgc2V0IG9mIHBvc3NpYmxlIGNhcHR1cmUgYnV0dG9uIGV2ZW50cyAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfY2FwdHVyZWV2W10gPSB7Cgl7IDB4MDUsIFNPTllQSV9FVkVOVF9DQVBUVVJFX1BBUlRJQUxQUkVTU0VEIH0sCgl7IDB4MDcsIFNPTllQSV9FVkVOVF9DQVBUVVJFX1BSRVNTRUQgfSwKCXsgMHgwMSwgU09OWVBJX0VWRU5UX0NBUFRVUkVfUEFSVElBTFJFTEVBU0VEIH0sCgl7IDAsIDAgfQp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBmbmtleXMgZXZlbnRzICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9mbmtleWV2W10gPSB7Cgl7IDB4MTAsIFNPTllQSV9FVkVOVF9GTktFWV9FU0MgfSwKCXsgMHgxMSwgU09OWVBJX0VWRU5UX0ZOS0VZX0YxIH0sCgl7IDB4MTIsIFNPTllQSV9FVkVOVF9GTktFWV9GMiB9LAoJeyAweDEzLCBTT05ZUElfRVZFTlRfRk5LRVlfRjMgfSwKCXsgMHgxNCwgU09OWVBJX0VWRU5UX0ZOS0VZX0Y0IH0sCgl7IDB4MTUsIFNPTllQSV9FVkVOVF9GTktFWV9GNSB9LAoJeyAweDE2LCBTT05ZUElfRVZFTlRfRk5LRVlfRjYgfSwKCXsgMHgxNywgU09OWVBJX0VWRU5UX0ZOS0VZX0Y3IH0sCgl7IDB4MTgsIFNPTllQSV9FVkVOVF9GTktFWV9GOCB9LAoJeyAweDE5LCBTT05ZUElfRVZFTlRfRk5LRVlfRjkgfSwKCXsgMHgxYSwgU09OWVBJX0VWRU5UX0ZOS0VZX0YxMCB9LAoJeyAweDFiLCBTT05ZUElfRVZFTlRfRk5LRVlfRjExIH0sCgl7IDB4MWMsIFNPTllQSV9FVkVOVF9GTktFWV9GMTIgfSwKCXsgMHgxZiwgU09OWVBJX0VWRU5UX0ZOS0VZX1JFTEVBU0VEIH0sCgl7IDB4MjEsIFNPTllQSV9FVkVOVF9GTktFWV8xIH0sCgl7IDB4MjIsIFNPTllQSV9FVkVOVF9GTktFWV8yIH0sCgl7IDB4MzEsIFNPTllQSV9FVkVOVF9GTktFWV9EIH0sCgl7IDB4MzIsIFNPTllQSV9FVkVOVF9GTktFWV9FIH0sCgl7IDB4MzMsIFNPTllQSV9FVkVOVF9GTktFWV9GIH0sCgl7IDB4MzQsIFNPTllQSV9FVkVOVF9GTktFWV9TIH0sCgl7IDB4MzUsIFNPTllQSV9FVkVOVF9GTktFWV9CIH0sCgl7IDB4MzYsIFNPTllQSV9FVkVOVF9GTktFWV9PTkxZIH0sCgl7IDAsIDAgfQp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBwcm9ncmFtIGtleSBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX3BrZXlldltdID0gewoJeyAweDAxLCBTT05ZUElfRVZFTlRfUEtFWV9QMSB9LAoJeyAweDAyLCBTT05ZUElfRVZFTlRfUEtFWV9QMiB9LAoJeyAweDA0LCBTT05ZUElfRVZFTlRfUEtFWV9QMyB9LAoJeyAweDVjLCBTT05ZUElfRVZFTlRfUEtFWV9QMSB9LAoJeyAwLCAwIH0KfTsKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgYmx1ZXRvb3RoIGV2ZW50cyAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfYmx1ZWV2W10gPSB7Cgl7IDB4NTUsIFNPTllQSV9FVkVOVF9CTFVFVE9PVEhfUFJFU1NFRCB9LAoJeyAweDU5LCBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX09OIH0sCgl7IDB4NWEsIFNPTllQSV9FVkVOVF9CTFVFVE9PVEhfT0ZGIH0sCgl7IDAsIDAgfQp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSB3aXJlbGVzcyBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX3dsZXNzZXZbXSA9IHsKCXsgMHg1OSwgU09OWVBJX0VWRU5UX1dJUkVMRVNTX09OIH0sCgl7IDB4NWEsIFNPTllQSV9FVkVOVF9XSVJFTEVTU19PRkYgfSwKCXsgMCwgMCB9Cn07CgovKiBUaGUgc2V0IG9mIHBvc3NpYmxlIGJhY2sgYnV0dG9uIGV2ZW50cyAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfYmFja2V2W10gPSB7Cgl7IDB4MjAsIFNPTllQSV9FVkVOVF9CQUNLX1BSRVNTRUQgfSwKCXsgMCwgMCB9Cn07CgovKiBUaGUgc2V0IG9mIHBvc3NpYmxlIGhlbHAgYnV0dG9uIGV2ZW50cyAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfaGVscGV2W10gPSB7Cgl7IDB4M2IsIFNPTllQSV9FVkVOVF9IRUxQX1BSRVNTRUQgfSwKCXsgMCwgMCB9Cn07CgoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBsaWQgZXZlbnRzICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9saWRldltdID0gewoJeyAweDUxLCBTT05ZUElfRVZFTlRfTElEX0NMT1NFRCB9LAoJeyAweDUwLCBTT05ZUElfRVZFTlRfTElEX09QRU5FRCB9LAoJeyAwLCAwIH0KfTsKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgem9vbSBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX3pvb21ldltdID0gewoJeyAweDM5LCBTT05ZUElfRVZFTlRfWk9PTV9QUkVTU0VEIH0sCgl7IDAsIDAgfQp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSB0aHVtYnBocmFzZSBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX3RodW1icGhyYXNlZXZbXSA9IHsKCXsgMHgzYSwgU09OWVBJX0VWRU5UX1RIVU1CUEhSQVNFX1BSRVNTRUQgfSwKCXsgMCwgMCB9Cn07CgovKiBUaGUgc2V0IG9mIHBvc3NpYmxlIG1vdGlvbmV5ZSBjYW1lcmEgZXZlbnRzICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9tZXllZXZbXSA9IHsKCXsgMHgwMCwgU09OWVBJX0VWRU5UX01FWUVfRkFDRSB9LAoJeyAweDAxLCBTT05ZUElfRVZFTlRfTUVZRV9PUFBPU0lURSB9LAoJeyAwLCAwIH0KfTsKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgbWVtb3J5c3RpY2sgZXZlbnRzICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9tZW1vcnlzdGlja2V2W10gPSB7Cgl7IDB4NTMsIFNPTllQSV9FVkVOVF9NRU1PUllTVElDS19JTlNFUlQgfSwKCXsgMHg1NCwgU09OWVBJX0VWRU5UX01FTU9SWVNUSUNLX0VKRUNUIH0sCgl7IDAsIDAgfQp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBiYXR0ZXJ5IGV2ZW50cyAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfYmF0dGVyeWV2W10gPSB7Cgl7IDB4MjAsIFNPTllQSV9FVkVOVF9CQVRURVJZX0lOU0VSVCB9LAoJeyAweDMwLCBTT05ZUElfRVZFTlRfQkFUVEVSWV9SRU1PVkUgfSwKCXsgMCwgMCB9Cn07CgpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudHR5cGVzIHsKCWludAkJCW1vZGVsOwoJdTgJCQlkYXRhOwoJdW5zaWduZWQgbG9uZwkJbWFzazsKCXN0cnVjdCBzb255cGlfZXZlbnQgKglldmVudHM7Cn0gc29ueV9waWNfZXZlbnR0eXBlc1tdID0gewoJeyBTT05ZUElfREVWSUNFX1RZUEUxLCAwLCAweGZmZmZmZmZmLCBzb255cGlfcmVsZWFzZWV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfVFlQRTEsIDB4NzAsIFNPTllQSV9NRVlFX01BU0ssIHNvbnlwaV9tZXllZXYgfSwKCXsgU09OWVBJX0RFVklDRV9UWVBFMSwgMHgzMCwgU09OWVBJX0xJRF9NQVNLLCBzb255cGlfbGlkZXYgfSwKCXsgU09OWVBJX0RFVklDRV9UWVBFMSwgMHg2MCwgU09OWVBJX0NBUFRVUkVfTUFTSywgc29ueXBpX2NhcHR1cmVldiB9LAoJeyBTT05ZUElfREVWSUNFX1RZUEUxLCAweDEwLCBTT05ZUElfSk9HR0VSX01BU0ssIHNvbnlwaV9qb2dnZXJldiB9LAoJeyBTT05ZUElfREVWSUNFX1RZUEUxLCAweDIwLCBTT05ZUElfRk5LRVlfTUFTSywgc29ueXBpX2Zua2V5ZXYgfSwKCXsgU09OWVBJX0RFVklDRV9UWVBFMSwgMHgzMCwgU09OWVBJX0JMVUVUT09USF9NQVNLLCBzb255cGlfYmx1ZWV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfVFlQRTEsIDB4NDAsIFNPTllQSV9QS0VZX01BU0ssIHNvbnlwaV9wa2V5ZXYgfSwKCXsgU09OWVBJX0RFVklDRV9UWVBFMSwgMHgzMCwgU09OWVBJX01FTU9SWVNUSUNLX01BU0ssIHNvbnlwaV9tZW1vcnlzdGlja2V2IH0sCgl7IFNPTllQSV9ERVZJQ0VfVFlQRTEsIDB4NDAsIFNPTllQSV9CQVRURVJZX01BU0ssIHNvbnlwaV9iYXR0ZXJ5ZXYgfSwKCgl7IFNPTllQSV9ERVZJQ0VfVFlQRTIsIDAsIDB4ZmZmZmZmZmYsIHNvbnlwaV9yZWxlYXNlZXYgfSwKCXsgU09OWVBJX0RFVklDRV9UWVBFMiwgMHgzOCwgU09OWVBJX0xJRF9NQVNLLCBzb255cGlfbGlkZXYgfSwKCXsgU09OWVBJX0RFVklDRV9UWVBFMiwgMHgxMSwgU09OWVBJX0pPR0dFUl9NQVNLLCBzb255cGlfam9nZ2VyZXYgfSwKCXsgU09OWVBJX0RFVklDRV9UWVBFMiwgMHg2MSwgU09OWVBJX0NBUFRVUkVfTUFTSywgc29ueXBpX2NhcHR1cmVldiB9LAoJeyBTT05ZUElfREVWSUNFX1RZUEUyLCAweDIxLCBTT05ZUElfRk5LRVlfTUFTSywgc29ueXBpX2Zua2V5ZXYgfSwKCXsgU09OWVBJX0RFVklDRV9UWVBFMiwgMHgzMSwgU09OWVBJX0JMVUVUT09USF9NQVNLLCBzb255cGlfYmx1ZWV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfVFlQRTIsIDB4MDgsIFNPTllQSV9QS0VZX01BU0ssIHNvbnlwaV9wa2V5ZXYgfSwKCXsgU09OWVBJX0RFVklDRV9UWVBFMiwgMHgxMSwgU09OWVBJX0JBQ0tfTUFTSywgc29ueXBpX2JhY2tldiB9LAoJeyBTT05ZUElfREVWSUNFX1RZUEUyLCAweDIxLCBTT05ZUElfSEVMUF9NQVNLLCBzb255cGlfaGVscGV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfVFlQRTIsIDB4MjEsIFNPTllQSV9aT09NX01BU0ssIHNvbnlwaV96b29tZXYgfSwKCXsgU09OWVBJX0RFVklDRV9UWVBFMiwgMHgyMCwgU09OWVBJX1RIVU1CUEhSQVNFX01BU0ssIHNvbnlwaV90aHVtYnBocmFzZWV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfVFlQRTIsIDB4MzEsIFNPTllQSV9NRU1PUllTVElDS19NQVNLLCBzb255cGlfbWVtb3J5c3RpY2tldiB9LAoJeyBTT05ZUElfREVWSUNFX1RZUEUyLCAweDQxLCBTT05ZUElfQkFUVEVSWV9NQVNLLCBzb255cGlfYmF0dGVyeWV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfVFlQRTIsIDB4MzEsIFNPTllQSV9QS0VZX01BU0ssIHNvbnlwaV9wa2V5ZXYgfSwKCgl7IFNPTllQSV9ERVZJQ0VfVFlQRTMsIDAsIDB4ZmZmZmZmZmYsIHNvbnlwaV9yZWxlYXNlZXYgfSwKCXsgU09OWVBJX0RFVklDRV9UWVBFMywgMHgyMSwgU09OWVBJX0ZOS0VZX01BU0ssIHNvbnlwaV9mbmtleWV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfVFlQRTMsIDB4MzEsIFNPTllQSV9XSVJFTEVTU19NQVNLLCBzb255cGlfd2xlc3NldiB9LAoJeyBTT05ZUElfREVWSUNFX1RZUEUzLCAweDMxLCBTT05ZUElfTUVNT1JZU1RJQ0tfTUFTSywgc29ueXBpX21lbW9yeXN0aWNrZXYgfSwKCXsgU09OWVBJX0RFVklDRV9UWVBFMywgMHg0MSwgU09OWVBJX0JBVFRFUllfTUFTSywgc29ueXBpX2JhdHRlcnlldiB9LAoJeyBTT05ZUElfREVWSUNFX1RZUEUzLCAweDMxLCBTT05ZUElfUEtFWV9NQVNLLCBzb255cGlfcGtleWV2IH0sCgl7IDAgfQp9OwoKc3RhdGljIGludCBzb255X3BpY19kZXRlY3RfZGV2aWNlX3R5cGUodm9pZCkKewoJc3RydWN0IHBjaV9kZXYgKnBjaWRldjsKCWludCBtb2RlbCA9IDA7CgoJaWYgKChwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAoJCQkJICAgICBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxQUJfMywgTlVMTCkpKQoJCW1vZGVsID0gU09OWVBJX0RFVklDRV9UWVBFMTsKCgllbHNlIGlmICgocGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKCQkJCQkgIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNINl8xLCBOVUxMKSkpCgkJbW9kZWwgPSBTT05ZUElfREVWSUNFX1RZUEUzOwoKCWVsc2UgaWYgKChwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAoJCQkJCSAgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g3XzEsIE5VTEwpKSkKCQltb2RlbCA9IFNPTllQSV9ERVZJQ0VfVFlQRTM7CgoJZWxzZQoJCW1vZGVsID0gU09OWVBJX0RFVklDRV9UWVBFMjsKCglpZiAocGNpZGV2KQoJCXBjaV9kZXZfcHV0KHBjaWRldik7CgoJcHJpbnRrKEtFUk5fSU5GTyBEUlZfUEZYICJkZXRlY3RlZCBUeXBlJWQgbW9kZWxcbiIsCgkJCW1vZGVsID09IFNPTllQSV9ERVZJQ0VfVFlQRTEgPyAxIDoKCQkJbW9kZWwgPT0gU09OWVBJX0RFVklDRV9UWVBFMiA/IDIgOiAzKTsKCXJldHVybiBtb2RlbDsKfQoKI2RlZmluZSBJVEVSQVRJT05TX0xPTkcJCTEwMDAwCiNkZWZpbmUgSVRFUkFUSU9OU19TSE9SVAkxMAojZGVmaW5lIHdhaXRfb25fY29tbWFuZChjb21tYW5kLCBpdGVyYXRpb25zKSB7CQkJCVwKCXVuc2lnbmVkIGludCBuID0gaXRlcmF0aW9uczsJCQkJCVwKCXdoaWxlICgtLW4gJiYgKGNvbW1hbmQpKQkJCQkJXAoJCXVkZWxheSgxKTsJCQkJCQlcCglpZiAoIW4pCQkJCQkJCQlcCgkJZHByaW50aygiY29tbWFuZCBmYWlsZWQgYXQgJXMgOiAlcyAobGluZSAlZClcbiIsCVwKCQkJCV9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsJXAp9CgpzdGF0aWMgdTggc29ueV9waWNfY2FsbDEodTggZGV2KQp7Cgl1OCB2MSwgdjI7CgoJd2FpdF9vbl9jb21tYW5kKGluYl9wKHNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvLm1pbmltdW0gKyA0KSAmIDIsCgkJCUlURVJBVElPTlNfTE9ORyk7CglvdXRiKGRldiwgc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8ubWluaW11bSArIDQpOwoJdjEgPSBpbmJfcChzcGljX2Rldi5jdXJfaW9wb3J0LT5pby5taW5pbXVtICsgNCk7Cgl2MiA9IGluYl9wKHNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvLm1pbmltdW0pOwoJZHByaW50aygic29ueV9waWNfY2FsbDE6IDB4JS40eFxuIiwgKHYyIDw8IDgpIHwgdjEpOwoJcmV0dXJuIHYyOwp9CgpzdGF0aWMgdTggc29ueV9waWNfY2FsbDIodTggZGV2LCB1OCBmbikKewoJdTggdjE7CgoJd2FpdF9vbl9jb21tYW5kKGluYl9wKHNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvLm1pbmltdW0gKyA0KSAmIDIsCgkJCUlURVJBVElPTlNfTE9ORyk7CglvdXRiKGRldiwgc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8ubWluaW11bSArIDQpOwoJd2FpdF9vbl9jb21tYW5kKGluYl9wKHNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvLm1pbmltdW0gKyA0KSAmIDIsCgkJCUlURVJBVElPTlNfTE9ORyk7CglvdXRiKGZuLCBzcGljX2Rldi5jdXJfaW9wb3J0LT5pby5taW5pbXVtKTsKCXYxID0gaW5iX3Aoc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8ubWluaW11bSk7CglkcHJpbnRrKCJzb255X3BpY19jYWxsMjogMHglLjR4XG4iLCB2MSk7CglyZXR1cm4gdjE7Cn0KCnN0YXRpYyB1OCBzb255X3BpY19jYWxsMyh1OCBkZXYsIHU4IGZuLCB1OCB2KQp7Cgl1OCB2MTsKCgl3YWl0X29uX2NvbW1hbmQoaW5iX3Aoc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8ubWluaW11bSArIDQpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKCW91dGIoZGV2LCBzcGljX2Rldi5jdXJfaW9wb3J0LT5pby5taW5pbXVtICsgNCk7Cgl3YWl0X29uX2NvbW1hbmQoaW5iX3Aoc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8ubWluaW11bSArIDQpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKCW91dGIoZm4sIHNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvLm1pbmltdW0pOwoJd2FpdF9vbl9jb21tYW5kKGluYl9wKHNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvLm1pbmltdW0gKyA0KSAmIDIsIElURVJBVElPTlNfTE9ORyk7CglvdXRiKHYsIHNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvLm1pbmltdW0pOwoJdjEgPSBpbmJfcChzcGljX2Rldi5jdXJfaW9wb3J0LT5pby5taW5pbXVtKTsKCWRwcmludGsoInNvbnlfcGljX2NhbGwzOiAweCUuNHhcbiIsIHYxKTsKCXJldHVybiB2MTsKfQoKLyogY2FtZXJhIHRlc3RzIGFuZCBwb3dlcm9uL3Bvd2Vyb2ZmICovCiNkZWZpbmUgU09OWVBJX0NBTUVSQV9QSUNUVVJFCQk1CiNkZWZpbmUgU09OWVBJX0NBTUVSQV9DT05UUk9MCQkweDEwCgojZGVmaW5lIFNPTllQSV9DQU1FUkFfQlJJR0hUTkVTUwkJMAojZGVmaW5lIFNPTllQSV9DQU1FUkFfQ09OVFJBU1QJCQkxCiNkZWZpbmUgU09OWVBJX0NBTUVSQV9IVUUJCQkyCiNkZWZpbmUgU09OWVBJX0NBTUVSQV9DT0xPUgkJCTMKI2RlZmluZSBTT05ZUElfQ0FNRVJBX1NIQVJQTkVTUwkJCTQKCiNkZWZpbmUgU09OWVBJX0NBTUVSQV9FWFBPU1VSRV9NQVNLCQkweEMKI2RlZmluZSBTT05ZUElfQ0FNRVJBX1dISVRFX0JBTEFOQ0VfTUFTSwkweDMKI2RlZmluZSBTT05ZUElfQ0FNRVJBX1BJQ1RVUkVfTU9ERV9NQVNLCQkweDMwCiNkZWZpbmUgU09OWVBJX0NBTUVSQV9NVVRFX01BU0sJCQkweDQwCgovKiB0aGUgcmVzdCBkb24ndCBuZWVkIGEgbG9vcCB1bnRpbCBub3QgMHhmZiAqLwojZGVmaW5lIFNPTllQSV9DQU1FUkFfQUdDCQkJNgojZGVmaW5lIFNPTllQSV9DQU1FUkFfQUdDX01BU0sJCQkweDMwCiNkZWZpbmUgU09OWVBJX0NBTUVSQV9TSFVUVEVSX01BU0sgCQkweDcKCiNkZWZpbmUgU09OWVBJX0NBTUVSQV9TSFVURE9XTl9SRVFVRVNUCQk3CiNkZWZpbmUgU09OWVBJX0NBTUVSQV9DT05UUk9MCQkJMHgxMAoKI2RlZmluZSBTT05ZUElfQ0FNRVJBX1NUQVRVUyAJCQk3CiNkZWZpbmUgU09OWVBJX0NBTUVSQV9TVEFUVVNfUkVBRFkgCQkweDIKI2RlZmluZSBTT05ZUElfQ0FNRVJBX1NUQVRVU19QT1NJVElPTgkJMHg0CgojZGVmaW5lIFNPTllQSV9ESVJFQ1RJT05fQkFDS1dBUkRTIAkJMHg0CgojZGVmaW5lIFNPTllQSV9DQU1FUkFfUkVWSVNJT04gCQkJOAojZGVmaW5lIFNPTllQSV9DQU1FUkFfUk9NVkVSU0lPTiAJCTkKCnN0YXRpYyBpbnQgX19zb255X3BpY19jYW1lcmFfcmVhZHkodm9pZCkKewoJdTggdjsKCgl2ID0gc29ueV9waWNfY2FsbDIoMHg4ZiwgU09OWVBJX0NBTUVSQV9TVEFUVVMpOwoJcmV0dXJuICh2ICE9IDB4ZmYgJiYgKHYgJiBTT05ZUElfQ0FNRVJBX1NUQVRVU19SRUFEWSkpOwp9CgpzdGF0aWMgaW50IF9fc29ueV9waWNfY2FtZXJhX29mZih2b2lkKQp7CglpZiAoIWNhbWVyYSkgewoJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX1BGWCAiY2FtZXJhIGNvbnRyb2wgbm90IGVuYWJsZWRcbiIpOwoJCXJldHVybiAtRU5PREVWOwoJfQoKCXdhaXRfb25fY29tbWFuZChzb255X3BpY19jYWxsMygweDkwLCBTT05ZUElfQ0FNRVJBX1BJQ1RVUkUsCgkJCQlTT05ZUElfQ0FNRVJBX01VVEVfTUFTSyksCgkJCUlURVJBVElPTlNfU0hPUlQpOwoKCWlmIChzcGljX2Rldi5jYW1lcmFfcG93ZXIpIHsKCQlzb255X3BpY19jYWxsMigweDkxLCAwKTsKCQlzcGljX2Rldi5jYW1lcmFfcG93ZXIgPSAwOwoJfQoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgX19zb255X3BpY19jYW1lcmFfb24odm9pZCkKewoJaW50IGksIGosIHg7CgoJaWYgKCFjYW1lcmEpIHsKCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9QRlggImNhbWVyYSBjb250cm9sIG5vdCBlbmFibGVkXG4iKTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCglpZiAoc3BpY19kZXYuY2FtZXJhX3Bvd2VyKQoJCXJldHVybiAwOwoKCWZvciAoaiA9IDU7IGogPiAwOyBqLS0pIHsKCgkJZm9yICh4ID0gMDsgeCA8IDEwMCAmJiBzb255X3BpY19jYWxsMigweDkxLCAweDEpOyB4KyspCgkJCW1zbGVlcCgxMCk7CgkJc29ueV9waWNfY2FsbDEoMHg5Myk7CgoJCWZvciAoaSA9IDQwMDsgaSA+IDA7IGktLSkgewoJCQlpZiAoX19zb255X3BpY19jYW1lcmFfcmVhZHkoKSkKCQkJCWJyZWFrOwoJCQltc2xlZXAoMTApOwoJCX0KCQlpZiAoaSkKCQkJYnJlYWs7Cgl9CgoJaWYgKGogPT0gMCkgewoJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX1BGWCAiZmFpbGVkIHRvIHBvd2VyIG9uIGNhbWVyYVxuIik7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJd2FpdF9vbl9jb21tYW5kKHNvbnlfcGljX2NhbGwzKDB4OTAsIFNPTllQSV9DQU1FUkFfQ09OVFJPTCwKCQkJCTB4NWEpLAoJCQlJVEVSQVRJT05TX1NIT1JUKTsKCglzcGljX2Rldi5jYW1lcmFfcG93ZXIgPSAxOwoJcmV0dXJuIDA7Cn0KCi8qIEV4dGVybmFsIGNhbWVyYSBjb21tYW5kIChleHBvcnRlZCB0byB0aGUgbW90aW9uIGV5ZSB2NGwgZHJpdmVyKSAqLwppbnQgc29ueV9waWNfY2FtZXJhX2NvbW1hbmQoaW50IGNvbW1hbmQsIHU4IHZhbHVlKQp7CglpZiAoIWNhbWVyYSkKCQlyZXR1cm4gLUVJTzsKCgltdXRleF9sb2NrKCZzcGljX2Rldi5sb2NrKTsKCglzd2l0Y2ggKGNvbW1hbmQpIHsKCWNhc2UgU09OWV9QSUNfQ09NTUFORF9TRVRDQU1FUkE6CgkJaWYgKHZhbHVlKQoJCQlfX3NvbnlfcGljX2NhbWVyYV9vbigpOwoJCWVsc2UKCQkJX19zb255X3BpY19jYW1lcmFfb2ZmKCk7CgkJYnJlYWs7CgljYXNlIFNPTllfUElDX0NPTU1BTkRfU0VUQ0FNRVJBQlJJR0hUTkVTUzoKCQl3YWl0X29uX2NvbW1hbmQoc29ueV9waWNfY2FsbDMoMHg5MCwgU09OWVBJX0NBTUVSQV9CUklHSFRORVNTLCB2YWx1ZSksCgkJCQlJVEVSQVRJT05TX1NIT1JUKTsKCQlicmVhazsKCWNhc2UgU09OWV9QSUNfQ09NTUFORF9TRVRDQU1FUkFDT05UUkFTVDoKCQl3YWl0X29uX2NvbW1hbmQoc29ueV9waWNfY2FsbDMoMHg5MCwgU09OWVBJX0NBTUVSQV9DT05UUkFTVCwgdmFsdWUpLAoJCQkJSVRFUkFUSU9OU19TSE9SVCk7CgkJYnJlYWs7CgljYXNlIFNPTllfUElDX0NPTU1BTkRfU0VUQ0FNRVJBSFVFOgoJCXdhaXRfb25fY29tbWFuZChzb255X3BpY19jYWxsMygweDkwLCBTT05ZUElfQ0FNRVJBX0hVRSwgdmFsdWUpLAoJCQkJSVRFUkFUSU9OU19TSE9SVCk7CgkJYnJlYWs7CgljYXNlIFNPTllfUElDX0NPTU1BTkRfU0VUQ0FNRVJBQ09MT1I6CgkJd2FpdF9vbl9jb21tYW5kKHNvbnlfcGljX2NhbGwzKDB4OTAsIFNPTllQSV9DQU1FUkFfQ09MT1IsIHZhbHVlKSwKCQkJCUlURVJBVElPTlNfU0hPUlQpOwoJCWJyZWFrOwoJY2FzZSBTT05ZX1BJQ19DT01NQU5EX1NFVENBTUVSQVNIQVJQTkVTUzoKCQl3YWl0X29uX2NvbW1hbmQoc29ueV9waWNfY2FsbDMoMHg5MCwgU09OWVBJX0NBTUVSQV9TSEFSUE5FU1MsIHZhbHVlKSwKCQkJCUlURVJBVElPTlNfU0hPUlQpOwoJCWJyZWFrOwoJY2FzZSBTT05ZX1BJQ19DT01NQU5EX1NFVENBTUVSQVBJQ1RVUkU6CgkJd2FpdF9vbl9jb21tYW5kKHNvbnlfcGljX2NhbGwzKDB4OTAsIFNPTllQSV9DQU1FUkFfUElDVFVSRSwgdmFsdWUpLAoJCQkJSVRFUkFUSU9OU19TSE9SVCk7CgkJYnJlYWs7CgljYXNlIFNPTllfUElDX0NPTU1BTkRfU0VUQ0FNRVJBQUdDOgoJCXdhaXRfb25fY29tbWFuZChzb255X3BpY19jYWxsMygweDkwLCBTT05ZUElfQ0FNRVJBX0FHQywgdmFsdWUpLAoJCQkJSVRFUkFUSU9OU19TSE9SVCk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXByaW50ayhLRVJOX0VSUiBEUlZfUEZYICJzb255X3BpY19jYW1lcmFfY29tbWFuZCBpbnZhbGlkOiAlZFxuIiwKCQkgICAgICAgY29tbWFuZCk7CgkJYnJlYWs7Cgl9CgltdXRleF91bmxvY2soJnNwaWNfZGV2LmxvY2spOwoJcmV0dXJuIDA7Cn0KRVhQT1JUX1NZTUJPTChzb255X3BpY19jYW1lcmFfY29tbWFuZCk7CgovKiBncHJzL2VkZ2UgbW9kZW0gKFNaNDYwTiBhbmQgU1oyMTBQKSwgdGhhbmtzIHRvIEpvc2h1YSBXaXNlICovCnN0YXRpYyB2b2lkIHNvbnlfcGljX3NldF93d2FucG93ZXIodTggc3RhdGUpCnsKCXN0YXRlID0gISFzdGF0ZTsKCW11dGV4X2xvY2soJnNwaWNfZGV2LmxvY2spOwoJaWYgKHNwaWNfZGV2Lnd3YW5fcG93ZXIgPT0gc3RhdGUpIHsKCQltdXRleF91bmxvY2soJnNwaWNfZGV2LmxvY2spOwoJCXJldHVybjsKCX0KCXNvbnlfcGljX2NhbGwyKDB4QjAsIHN0YXRlKTsKCXNwaWNfZGV2Lnd3YW5fcG93ZXIgPSBzdGF0ZTsKCW11dGV4X3VubG9jaygmc3BpY19kZXYubG9jayk7Cn0KCnN0YXRpYyBzc2l6ZV90IHNvbnlfcGljX3d3YW5wb3dlcl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCgkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCgkJY29uc3QgY2hhciAqYnVmZmVyLCBzaXplX3QgY291bnQpCnsKCXVuc2lnbmVkIGxvbmcgdmFsdWU7CglpZiAoY291bnQgPiAzMSkKCQlyZXR1cm4gLUVJTlZBTDsKCgl2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZmZlciwgTlVMTCwgMTApOwoJc29ueV9waWNfc2V0X3d3YW5wb3dlcih2YWx1ZSk7CgoJcmV0dXJuIGNvdW50Owp9CgpzdGF0aWMgc3NpemVfdCBzb255X3BpY193d2FucG93ZXJfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCgkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZmZlcikKewoJc3NpemVfdCBjb3VudDsKCW11dGV4X2xvY2soJnNwaWNfZGV2LmxvY2spOwoJY291bnQgPSBzbnByaW50ZihidWZmZXIsIFBBR0VfU0laRSwgIiVkXG4iLCBzcGljX2Rldi53d2FuX3Bvd2VyKTsKCW11dGV4X3VubG9jaygmc3BpY19kZXYubG9jayk7CglyZXR1cm4gY291bnQ7Cn0KCi8qIGJsdWV0b290aCBzdWJzeXN0ZW0gcG93ZXIgc3RhdGUgKi8Kc3RhdGljIHZvaWQgX19zb255X3BpY19zZXRfYmx1ZXRvb3RocG93ZXIodTggc3RhdGUpCnsKCXN0YXRlID0gISFzdGF0ZTsKCWlmIChzcGljX2Rldi5ibHVldG9vdGhfcG93ZXIgPT0gc3RhdGUpCgkJcmV0dXJuOwoJc29ueV9waWNfY2FsbDIoMHg5Niwgc3RhdGUpOwoJc29ueV9waWNfY2FsbDEoMHg4Mik7CglzcGljX2Rldi5ibHVldG9vdGhfcG93ZXIgPSBzdGF0ZTsKfQoKc3RhdGljIHNzaXplX3Qgc29ueV9waWNfYmx1ZXRvb3RocG93ZXJfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAoJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAoJCWNvbnN0IGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KQp7Cgl1bnNpZ25lZCBsb25nIHZhbHVlOwoJaWYgKGNvdW50ID4gMzEpCgkJcmV0dXJuIC1FSU5WQUw7CgoJdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWZmZXIsIE5VTEwsIDEwKTsKCW11dGV4X2xvY2soJnNwaWNfZGV2LmxvY2spOwoJX19zb255X3BpY19zZXRfYmx1ZXRvb3RocG93ZXIodmFsdWUpOwoJbXV0ZXhfdW5sb2NrKCZzcGljX2Rldi5sb2NrKTsKCglyZXR1cm4gY291bnQ7Cn0KCnN0YXRpYyBzc2l6ZV90IHNvbnlfcGljX2JsdWV0b290aHBvd2VyX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAoJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWZmZXIpCnsKCXNzaXplX3QgY291bnQgPSAwOwoJbXV0ZXhfbG9jaygmc3BpY19kZXYubG9jayk7Cgljb3VudCA9IHNucHJpbnRmKGJ1ZmZlciwgUEFHRV9TSVpFLCAiJWRcbiIsIHNwaWNfZGV2LmJsdWV0b290aF9wb3dlcik7CgltdXRleF91bmxvY2soJnNwaWNfZGV2LmxvY2spOwoJcmV0dXJuIGNvdW50Owp9CgovKiBmYW4gc3BlZWQgKi8KLyogRkFOMCBpbmZvcm1hdGlvbiAocmV2ZXJzZSBlbmdpbmVlcmVkIGZyb20gQUNQSSB0YWJsZXMpICovCiNkZWZpbmUgU09OWV9QSUNfRkFOMF9TVEFUVVMJMHg5MwpzdGF0aWMgaW50IHNvbnlfcGljX3NldF9mYW5zcGVlZCh1bnNpZ25lZCBsb25nIHZhbHVlKQp7CglyZXR1cm4gZWNfd3JpdGUoU09OWV9QSUNfRkFOMF9TVEFUVVMsIHZhbHVlKTsKfQoKc3RhdGljIGludCBzb255X3BpY19nZXRfZmFuc3BlZWQodTggKnZhbHVlKQp7CglyZXR1cm4gZWNfcmVhZChTT05ZX1BJQ19GQU4wX1NUQVRVUywgdmFsdWUpOwp9CgpzdGF0aWMgc3NpemVfdCBzb255X3BpY19mYW5zcGVlZF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCgkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCgkJY29uc3QgY2hhciAqYnVmZmVyLCBzaXplX3QgY291bnQpCnsKCXVuc2lnbmVkIGxvbmcgdmFsdWU7CglpZiAoY291bnQgPiAzMSkKCQlyZXR1cm4gLUVJTlZBTDsKCgl2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZmZlciwgTlVMTCwgMTApOwoJaWYgKHNvbnlfcGljX3NldF9mYW5zcGVlZCh2YWx1ZSkpCgkJcmV0dXJuIC1FSU87CgoJcmV0dXJuIGNvdW50Owp9CgpzdGF0aWMgc3NpemVfdCBzb255X3BpY19mYW5zcGVlZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmZmVyKQp7Cgl1OCB2YWx1ZSA9IDA7CglpZiAoc29ueV9waWNfZ2V0X2ZhbnNwZWVkKCZ2YWx1ZSkpCgkJcmV0dXJuIC1FSU87CgoJcmV0dXJuIHNucHJpbnRmKGJ1ZmZlciwgUEFHRV9TSVpFLCAiJWRcbiIsIHZhbHVlKTsKfQoKI2RlZmluZSBTUElDX0FUVFIoX25hbWUsIF9tb2RlKQkJCQkJXApzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBzcGljX2F0dHJfIyNfbmFtZSA9IF9fQVRUUihfbmFtZSwJXAoJCV9tb2RlLCBzb255X3BpY18jIyBfbmFtZSAjI19zaG93LAkJXAoJCXNvbnlfcGljXyMjIF9uYW1lICMjX3N0b3JlKQoKc3RhdGljIFNQSUNfQVRUUihibHVldG9vdGhwb3dlciwgMDY0NCk7CnN0YXRpYyBTUElDX0FUVFIod3dhbnBvd2VyLCAwNjQ0KTsKc3RhdGljIFNQSUNfQVRUUihmYW5zcGVlZCwgMDY0NCk7CgpzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqc3BpY19hdHRyaWJ1dGVzW10gPSB7Cgkmc3BpY19hdHRyX2JsdWV0b290aHBvd2VyLmF0dHIsCgkmc3BpY19hdHRyX3d3YW5wb3dlci5hdHRyLAoJJnNwaWNfYXR0cl9mYW5zcGVlZC5hdHRyLAoJTlVMTAp9OwoKc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgc3BpY19hdHRyaWJ1dGVfZ3JvdXAgPSB7CgkuYXR0cnMgPSBzcGljX2F0dHJpYnV0ZXMKfTsKCi8qKioqKioqKiBTT05ZUEkgY29tcGF0aWJpbGl0eSAqKioqKioqKioqLwojaWZkZWYgQ09ORklHX1NPTllfTEFQVE9QX09MRAoKLyogYmF0dGVyeSAvIGJyaWdodG5lc3MgLyB0ZW1wZXJhdHVyZSAgYWRkcmVzc2VzICovCiNkZWZpbmUgU09OWVBJX0JBVF9GTEFHUwkweDgxCiNkZWZpbmUgU09OWVBJX0xDRF9MSUdIVAkweDk2CiNkZWZpbmUgU09OWVBJX0JBVDFfUENUUk0JMHhhMAojZGVmaW5lIFNPTllQSV9CQVQxX0xFRlQJMHhhMgojZGVmaW5lIFNPTllQSV9CQVQxX01BWFJUCTB4YTQKI2RlZmluZSBTT05ZUElfQkFUMl9QQ1RSTQkweGE4CiNkZWZpbmUgU09OWVBJX0JBVDJfTEVGVAkweGFhCiNkZWZpbmUgU09OWVBJX0JBVDJfTUFYUlQJMHhhYwojZGVmaW5lIFNPTllQSV9CQVQxX01BWFRLCTB4YjAKI2RlZmluZSBTT05ZUElfQkFUMV9GVUxMCTB4YjIKI2RlZmluZSBTT05ZUElfQkFUMl9NQVhUSwkweGI4CiNkZWZpbmUgU09OWVBJX0JBVDJfRlVMTAkweGJhCiNkZWZpbmUgU09OWVBJX1RFTVBfU1RBVFVTCTB4QzEKCnN0cnVjdCBzb255cGlfY29tcGF0X3MgewoJc3RydWN0IGZhc3luY19zdHJ1Y3QJKmZpZm9fYXN5bmM7CglzdHJ1Y3Qga2ZpZm8JCSpmaWZvOwoJc3BpbmxvY2tfdAkJZmlmb19sb2NrOwoJd2FpdF9xdWV1ZV9oZWFkX3QJZmlmb19wcm9jX2xpc3Q7CglhdG9taWNfdAkJb3Blbl9jb3VudDsKfTsKc3RhdGljIHN0cnVjdCBzb255cGlfY29tcGF0X3Mgc29ueXBpX2NvbXBhdCA9IHsKCS5vcGVuX2NvdW50ID0gQVRPTUlDX0lOSVQoMCksCn07CgpzdGF0aWMgaW50IHNvbnlwaV9taXNjX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgb24pCnsKCWludCByZXR2YWw7CgoJcmV0dmFsID0gZmFzeW5jX2hlbHBlcihmZCwgZmlscCwgb24sICZzb255cGlfY29tcGF0LmZpZm9fYXN5bmMpOwoJaWYgKHJldHZhbCA8IDApCgkJcmV0dXJuIHJldHZhbDsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHNvbnlwaV9taXNjX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCXNvbnlwaV9taXNjX2Zhc3luYygtMSwgZmlsZSwgMCk7CglhdG9taWNfZGVjKCZzb255cGlfY29tcGF0Lm9wZW5fY291bnQpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc29ueXBpX21pc2Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJLyogRmx1c2ggaW5wdXQgcXVldWUgb24gZmlyc3Qgb3BlbiAqLwoJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZzb255cGlfY29tcGF0Lm9wZW5fY291bnQpID09IDEpCgkJa2ZpZm9fcmVzZXQoc29ueXBpX2NvbXBhdC5maWZvKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgc3NpemVfdCBzb255cGlfbWlzY19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAoJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKewoJc3NpemVfdCByZXQ7Cgl1bnNpZ25lZCBjaGFyIGM7CgoJaWYgKChrZmlmb19sZW4oc29ueXBpX2NvbXBhdC5maWZvKSA9PSAwKSAmJgoJICAgIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykpCgkJcmV0dXJuIC1FQUdBSU47CgoJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHNvbnlwaV9jb21wYXQuZmlmb19wcm9jX2xpc3QsCgkJCQkgICAgICAga2ZpZm9fbGVuKHNvbnlwaV9jb21wYXQuZmlmbykgIT0gMCk7CglpZiAocmV0KQoJCXJldHVybiByZXQ7CgoJd2hpbGUgKHJldCA8IGNvdW50ICYmCgkgICAgICAgKGtmaWZvX2dldChzb255cGlfY29tcGF0LmZpZm8sICZjLCBzaXplb2YoYykpID09IHNpemVvZihjKSkpIHsKCQlpZiAocHV0X3VzZXIoYywgYnVmKyspKQoJCQlyZXR1cm4gLUVGQVVMVDsKCQlyZXQrKzsKCX0KCglpZiAocmV0ID4gMCkgewoJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwoJCWlub2RlLT5pX2F0aW1lID0gY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKCX0KCglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgdW5zaWduZWQgaW50IHNvbnlwaV9taXNjX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCnsKCXBvbGxfd2FpdChmaWxlLCAmc29ueXBpX2NvbXBhdC5maWZvX3Byb2NfbGlzdCwgd2FpdCk7CglpZiAoa2ZpZm9fbGVuKHNvbnlwaV9jb21wYXQuZmlmbykpCgkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBlY19yZWFkMTYodTggYWRkciwgdTE2ICp2YWx1ZSkKewoJdTggdmFsX2xiLCB2YWxfaGI7CglpZiAoZWNfcmVhZChhZGRyLCAmdmFsX2xiKSkKCQlyZXR1cm4gLTE7CglpZiAoZWNfcmVhZChhZGRyICsgMSwgJnZhbF9oYikpCgkJcmV0dXJuIC0xOwoJKnZhbHVlID0gdmFsX2xiIHwgKHZhbF9oYiA8PCA4KTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHNvbnlwaV9taXNjX2lvY3RsKHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBmaWxlICpmcCwKCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKewoJaW50IHJldCA9IDA7Cgl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKCXU4IHZhbDg7Cgl1MTYgdmFsMTY7CglpbnQgdmFsdWU7CgoJbXV0ZXhfbG9jaygmc3BpY19kZXYubG9jayk7Cglzd2l0Y2ggKGNtZCkgewoJY2FzZSBTT05ZUElfSU9DR0JSVDoKCQlpZiAoc29ueV9iYWNrbGlnaHRfZGV2aWNlID09IE5VTEwpIHsKCQkJcmV0ID0gLUVJTzsKCQkJYnJlYWs7CgkJfQoJCWlmIChhY3BpX2NhbGxnZXRmdW5jKHNvbnlfbmNfYWNwaV9oYW5kbGUsICJHQlJUIiwgJnZhbHVlKSkgewoJCQlyZXQgPSAtRUlPOwoJCQlicmVhazsKCQl9CgkJdmFsOCA9ICgodmFsdWUgJiAweGZmKSAtIDEpIDw8IDU7CgkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsOCwgc2l6ZW9mKHZhbDgpKSkKCQkJCXJldCA9IC1FRkFVTFQ7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9JT0NTQlJUOgoJCWlmIChzb255X2JhY2tsaWdodF9kZXZpY2UgPT0gTlVMTCkgewoJCQlyZXQgPSAtRUlPOwoJCQlicmVhazsKCQl9CgkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWw4LCBhcmdwLCBzaXplb2YodmFsOCkpKSB7CgkJCXJldCA9IC1FRkFVTFQ7CgkJCWJyZWFrOwoJCX0KCQlpZiAoYWNwaV9jYWxsc2V0ZnVuYyhzb255X25jX2FjcGlfaGFuZGxlLCAiU0JSVCIsCgkJCQkodmFsOCA+PiA1KSArIDEsIE5VTEwpKSB7CgkJCXJldCA9IC1FSU87CgkJCWJyZWFrOwoJCX0KCQkvKiBzeW5jIHRoZSBiYWNrbGlnaHQgZGV2aWNlIHN0YXR1cyAqLwoJCXNvbnlfYmFja2xpZ2h0X2RldmljZS0+cHJvcHMuYnJpZ2h0bmVzcyA9CgkJICAgIHNvbnlfYmFja2xpZ2h0X2dldF9icmlnaHRuZXNzKHNvbnlfYmFja2xpZ2h0X2RldmljZSk7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9JT0NHQkFUMUNBUDoKCQlpZiAoZWNfcmVhZDE2KFNPTllQSV9CQVQxX0ZVTEwsICZ2YWwxNikpIHsKCQkJcmV0ID0gLUVJTzsKCQkJYnJlYWs7CgkJfQoJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDE2LCBzaXplb2YodmFsMTYpKSkKCQkJcmV0ID0gLUVGQVVMVDsKCQlicmVhazsKCWNhc2UgU09OWVBJX0lPQ0dCQVQxUkVNOgoJCWlmIChlY19yZWFkMTYoU09OWVBJX0JBVDFfTEVGVCwgJnZhbDE2KSkgewoJCQlyZXQgPSAtRUlPOwoJCQlicmVhazsKCQl9CgkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsMTYsIHNpemVvZih2YWwxNikpKQoJCQlyZXQgPSAtRUZBVUxUOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfSU9DR0JBVDJDQVA6CgkJaWYgKGVjX3JlYWQxNihTT05ZUElfQkFUMl9GVUxMLCAmdmFsMTYpKSB7CgkJCXJldCA9IC1FSU87CgkJCWJyZWFrOwoJCX0KCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWwxNiwgc2l6ZW9mKHZhbDE2KSkpCgkJCXJldCA9IC1FRkFVTFQ7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9JT0NHQkFUMlJFTToKCQlpZiAoZWNfcmVhZDE2KFNPTllQSV9CQVQyX0xFRlQsICZ2YWwxNikpIHsKCQkJcmV0ID0gLUVJTzsKCQkJYnJlYWs7CgkJfQoJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDE2LCBzaXplb2YodmFsMTYpKSkKCQkJcmV0ID0gLUVGQVVMVDsKCQlicmVhazsKCWNhc2UgU09OWVBJX0lPQ0dCQVRGTEFHUzoKCQlpZiAoZWNfcmVhZChTT05ZUElfQkFUX0ZMQUdTLCAmdmFsOCkpIHsKCQkJcmV0ID0gLUVJTzsKCQkJYnJlYWs7CgkJfQoJCXZhbDggJj0gMHgwNzsKCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWw4LCBzaXplb2YodmFsOCkpKQoJCQlyZXQgPSAtRUZBVUxUOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfSU9DR0JMVUU6CgkJdmFsOCA9IHNwaWNfZGV2LmJsdWV0b290aF9wb3dlcjsKCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWw4LCBzaXplb2YodmFsOCkpKQoJCQlyZXQgPSAtRUZBVUxUOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfSU9DU0JMVUU6CgkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWw4LCBhcmdwLCBzaXplb2YodmFsOCkpKSB7CgkJCXJldCA9IC1FRkFVTFQ7CgkJCWJyZWFrOwoJCX0KCQlfX3NvbnlfcGljX3NldF9ibHVldG9vdGhwb3dlcih2YWw4KTsKCQlicmVhazsKCS8qIEZBTiBDb250cm9scyAqLwoJY2FzZSBTT05ZUElfSU9DR0ZBTjoKCQlpZiAoc29ueV9waWNfZ2V0X2ZhbnNwZWVkKCZ2YWw4KSkgewoJCQlyZXQgPSAtRUlPOwoJCQlicmVhazsKCQl9CgkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsOCwgc2l6ZW9mKHZhbDgpKSkKCQkJcmV0ID0gLUVGQVVMVDsKCQlicmVhazsKCWNhc2UgU09OWVBJX0lPQ1NGQU46CgkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWw4LCBhcmdwLCBzaXplb2YodmFsOCkpKSB7CgkJCXJldCA9IC1FRkFVTFQ7CgkJCWJyZWFrOwoJCX0KCQlpZiAoc29ueV9waWNfc2V0X2ZhbnNwZWVkKHZhbDgpKQoJCQlyZXQgPSAtRUlPOwoJCWJyZWFrOwoJLyogR0VUIFRlbXBlcmF0dXJlICh1c2VmdWwgdW5kZXIgQVBNKSAqLwoJY2FzZSBTT05ZUElfSU9DR1RFTVA6CgkJaWYgKGVjX3JlYWQoU09OWVBJX1RFTVBfU1RBVFVTLCAmdmFsOCkpIHsKCQkJcmV0ID0gLUVJTzsKCQkJYnJlYWs7CgkJfQoJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDgsIHNpemVvZih2YWw4KSkpCgkJCXJldCA9IC1FRkFVTFQ7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXJldCA9IC1FSU5WQUw7Cgl9CgltdXRleF91bmxvY2soJnNwaWNfZGV2LmxvY2spOwoJcmV0dXJuIHJldDsKfQoKc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc29ueXBpX21pc2NfZm9wcyA9IHsKCS5vd25lcgkJPSBUSElTX01PRFVMRSwKCS5yZWFkCQk9IHNvbnlwaV9taXNjX3JlYWQsCgkucG9sbAkJPSBzb255cGlfbWlzY19wb2xsLAoJLm9wZW4JCT0gc29ueXBpX21pc2Nfb3BlbiwKCS5yZWxlYXNlCT0gc29ueXBpX21pc2NfcmVsZWFzZSwKCS5mYXN5bmMJCT0gc29ueXBpX21pc2NfZmFzeW5jLAoJLmlvY3RsCQk9IHNvbnlwaV9taXNjX2lvY3RsLAp9OwoKc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHNvbnlwaV9taXNjX2RldmljZSA9IHsKCS5taW5vcgkJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCgkubmFtZQkJPSAic29ueXBpIiwKCS5mb3BzCQk9ICZzb255cGlfbWlzY19mb3BzLAp9OwoKc3RhdGljIHZvaWQgc29ueXBpX2NvbXBhdF9yZXBvcnRfZXZlbnQodTggZXZlbnQpCnsKCWtmaWZvX3B1dChzb255cGlfY29tcGF0LmZpZm8sICh1bnNpZ25lZCBjaGFyICopJmV2ZW50LCBzaXplb2YoZXZlbnQpKTsKCWtpbGxfZmFzeW5jKCZzb255cGlfY29tcGF0LmZpZm9fYXN5bmMsIFNJR0lPLCBQT0xMX0lOKTsKCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc29ueXBpX2NvbXBhdC5maWZvX3Byb2NfbGlzdCk7Cn0KCnN0YXRpYyBpbnQgc29ueXBpX2NvbXBhdF9pbml0KHZvaWQpCnsKCWludCBlcnJvcjsKCglzcGluX2xvY2tfaW5pdCgmc29ueXBpX2NvbXBhdC5maWZvX2xvY2spOwoJc29ueXBpX2NvbXBhdC5maWZvID0ga2ZpZm9fYWxsb2MoU09OWV9MQVBUT1BfQlVGX1NJWkUsIEdGUF9LRVJORUwsCgkJCQkJICZzb255cGlfY29tcGF0LmZpZm9fbG9jayk7CglpZiAoSVNfRVJSKHNvbnlwaV9jb21wYXQuZmlmbykpIHsKCQlwcmludGsoS0VSTl9FUlIgRFJWX1BGWCAia2ZpZm9fYWxsb2MgZmFpbGVkXG4iKTsKCQlyZXR1cm4gUFRSX0VSUihzb255cGlfY29tcGF0LmZpZm8pOwoJfQoKCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNvbnlwaV9jb21wYXQuZmlmb19wcm9jX2xpc3QpOwoKCWlmIChtaW5vciAhPSAtMSkKCQlzb255cGlfbWlzY19kZXZpY2UubWlub3IgPSBtaW5vcjsKCWVycm9yID0gbWlzY19yZWdpc3Rlcigmc29ueXBpX21pc2NfZGV2aWNlKTsKCWlmIChlcnJvcikgewoJCXByaW50ayhLRVJOX0VSUiBEUlZfUEZYICJtaXNjX3JlZ2lzdGVyIGZhaWxlZFxuIik7CgkJZ290byBlcnJfZnJlZV9rZmlmbzsKCX0KCWlmIChtaW5vciA9PSAtMSkKCQlwcmludGsoS0VSTl9JTkZPIERSVl9QRlggImRldmljZSBhbGxvY2F0ZWQgbWlub3IgaXMgJWRcbiIsCgkJICAgICAgIHNvbnlwaV9taXNjX2RldmljZS5taW5vcik7CgoJcmV0dXJuIDA7CgplcnJfZnJlZV9rZmlmbzoKCWtmaWZvX2ZyZWUoc29ueXBpX2NvbXBhdC5maWZvKTsKCXJldHVybiBlcnJvcjsKfQoKc3RhdGljIHZvaWQgc29ueXBpX2NvbXBhdF9leGl0KHZvaWQpCnsKCW1pc2NfZGVyZWdpc3Rlcigmc29ueXBpX21pc2NfZGV2aWNlKTsKCWtmaWZvX2ZyZWUoc29ueXBpX2NvbXBhdC5maWZvKTsKfQojZWxzZQpzdGF0aWMgaW50IHNvbnlwaV9jb21wYXRfaW5pdCh2b2lkKSB7IHJldHVybiAwOyB9CnN0YXRpYyB2b2lkIHNvbnlwaV9jb21wYXRfZXhpdCh2b2lkKSB7IH0Kc3RhdGljIHZvaWQgc29ueXBpX2NvbXBhdF9yZXBvcnRfZXZlbnQodTggZXZlbnQpIHsgfQojZW5kaWYgLyogQ09ORklHX1NPTllfTEFQVE9QX09MRCAqLwoKLyoKICogQUNQSSBjYWxsYmFja3MKICovCnN0YXRpYyBhY3BpX3N0YXR1cwpzb255X3BpY19yZWFkX3Bvc3NpYmxlX3Jlc291cmNlKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSwgdm9pZCAqY29udGV4dCkKewoJdTMyIGk7CglzdHJ1Y3Qgc29ueV9waWNfZGV2ICpkZXYgPSAoc3RydWN0IHNvbnlfcGljX2RldiAqKWNvbnRleHQ7CgoJc3dpdGNoIChyZXNvdXJjZS0+dHlwZSkgewoJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfU1RBUlRfREVQRU5ERU5UOgoJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX0RFUEVOREVOVDoKCQlyZXR1cm4gQUVfT0s7CgoJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfSVJROgoJCXsKCQkJc3RydWN0IGFjcGlfcmVzb3VyY2VfaXJxICpwID0gJnJlc291cmNlLT5kYXRhLmlycTsKCQkJc3RydWN0IHNvbnlfcGljX2lycSAqaW50ZXJydXB0ID0gTlVMTDsKCQkJaWYgKCFwIHx8ICFwLT5pbnRlcnJ1cHRfY291bnQpIHsKCQkJCS8qCgkJCQkgKiBJUlEgZGVzY3JpcHRvcnMgbWF5IGhhdmUgbm8gSVJRIyBiaXRzIHNldCwKCQkJCSAqIHBhcnRpY3VsYXJseSB0aG9zZSB0aG9zZSB3LyBfU1RBIGRpc2FibGVkCgkJCQkgKi8KCQkJCWRwcmludGsoIkJsYW5rIElSUSByZXNvdXJjZVxuIik7CgkJCQlyZXR1cm4gQUVfT0s7CgkJCX0KCQkJZm9yIChpID0gMDsgaSA8IHAtPmludGVycnVwdF9jb3VudDsgaSsrKSB7CgkJCQlpZiAoIXAtPmludGVycnVwdHNbaV0pIHsKCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9QRlgKCQkJCQkJCSJJbnZhbGlkIElSUSAlZFxuIiwKCQkJCQkJCXAtPmludGVycnVwdHNbaV0pOwoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQkJaW50ZXJydXB0ID0ga3phbGxvYyhzaXplb2YoKmludGVycnVwdCksCgkJCQkJCUdGUF9LRVJORUwpOwoJCQkJaWYgKCFpbnRlcnJ1cHQpCgkJCQkJcmV0dXJuIEFFX0VSUk9SOwoKCQkJCWxpc3RfYWRkX3RhaWwoJmludGVycnVwdC0+bGlzdCwgJmRldi0+aW50ZXJydXB0cyk7CgkJCQlpbnRlcnJ1cHQtPmlycS50cmlnZ2VyaW5nID0gcC0+dHJpZ2dlcmluZzsKCQkJCWludGVycnVwdC0+aXJxLnBvbGFyaXR5ID0gcC0+cG9sYXJpdHk7CgkJCQlpbnRlcnJ1cHQtPmlycS5zaGFyYWJsZSA9IHAtPnNoYXJhYmxlOwoJCQkJaW50ZXJydXB0LT5pcnEuaW50ZXJydXB0X2NvdW50ID0gMTsKCQkJCWludGVycnVwdC0+aXJxLmludGVycnVwdHNbMF0gPSBwLT5pbnRlcnJ1cHRzW2ldOwoJCQl9CgkJCXJldHVybiBBRV9PSzsKCQl9CgljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9JTzoKCQl7CgkJCXN0cnVjdCBhY3BpX3Jlc291cmNlX2lvICppbyA9ICZyZXNvdXJjZS0+ZGF0YS5pbzsKCQkJc3RydWN0IHNvbnlfcGljX2lvcG9ydCAqaW9wb3J0ID0gTlVMTDsKCQkJaWYgKCFpbykgewoJCQkJZHByaW50aygiQmxhbmsgSU8gcmVzb3VyY2VcbiIpOwoJCQkJcmV0dXJuIEFFX09LOwoJCQl9CgoJCQlpb3BvcnQgPSBremFsbG9jKHNpemVvZigqaW9wb3J0KSwgR0ZQX0tFUk5FTCk7CgkJCWlmICghaW9wb3J0KQoJCQkJcmV0dXJuIEFFX0VSUk9SOwoKCQkJbGlzdF9hZGRfdGFpbCgmaW9wb3J0LT5saXN0LCAmZGV2LT5pb3BvcnRzKTsKCQkJbWVtY3B5KCZpb3BvcnQtPmlvLCBpbywgc2l6ZW9mKCppbykpOwoJCQlyZXR1cm4gQUVfT0s7CgkJfQoJZGVmYXVsdDoKCQlkcHJpbnRrKCJSZXNvdXJjZSAlZCBpc24ndCBhbiBJUlEgbm9yIGFuIElPIHBvcnRcbiIsCgkJCQlyZXNvdXJjZS0+dHlwZSk7CgoJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX1RBRzoKCQlyZXR1cm4gQUVfT0s7Cgl9CglyZXR1cm4gQUVfQ1RSTF9URVJNSU5BVEU7Cn0KCnN0YXRpYyBpbnQgc29ueV9waWNfcG9zc2libGVfcmVzb3VyY2VzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQp7CglpbnQgcmVzdWx0ID0gMDsKCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwoKCWlmICghZGV2aWNlKQoJCXJldHVybiAtRUlOVkFMOwoKCS8qIGdldCBkZXZpY2Ugc3RhdHVzICovCgkvKiBzZWUgYWNwaV9wY2lfbGlua19nZXRfY3VycmVudCBhY3BpX3BjaV9saW5rX2dldF9wb3NzaWJsZSAqLwoJZHByaW50aygiRXZhbHVhdGluZyBfU1RBXG4iKTsKCXJlc3VsdCA9IGFjcGlfYnVzX2dldF9zdGF0dXMoZGV2aWNlKTsKCWlmIChyZXN1bHQpIHsKCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9QRlggIlVuYWJsZSB0byByZWFkIHN0YXR1c1xuIik7CgkJZ290byBlbmQ7Cgl9CgoJaWYgKCFkZXZpY2UtPnN0YXR1cy5lbmFibGVkKQoJCWRwcmludGsoIkRldmljZSBkaXNhYmxlZFxuIik7CgllbHNlCgkJZHByaW50aygiRGV2aWNlIGVuYWJsZWRcbiIpOwoKCS8qCgkgKiBRdWVyeSBhbmQgcGFyc2UgJ21ldGhvZCcKCSAqLwoJZHByaW50aygiRXZhbHVhdGluZyAlc1xuIiwgTUVUSE9EX05BTUVfX1BSUyk7CglzdGF0dXMgPSBhY3BpX3dhbGtfcmVzb3VyY2VzKGRldmljZS0+aGFuZGxlLCBNRVRIT0RfTkFNRV9fUFJTLAoJCQlzb255X3BpY19yZWFkX3Bvc3NpYmxlX3Jlc291cmNlLCAmc3BpY19kZXYpOwoJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfUEZYCgkJCQkiRmFpbHVyZSBldmFsdWF0aW5nICVzXG4iLAoJCQkJTUVUSE9EX05BTUVfX1BSUyk7CgkJcmVzdWx0ID0gLUVOT0RFVjsKCX0KZW5kOgoJcmV0dXJuIHJlc3VsdDsKfQoKLyoKICogIERpc2FibGUgdGhlIHNwaWMgZGV2aWNlIGJ5IGNhbGxpbmcgaXRzIF9ESVMgbWV0aG9kCiAqLwpzdGF0aWMgaW50IHNvbnlfcGljX2Rpc2FibGUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCnsKCWlmIChBQ1BJX0ZBSUxVUkUoYWNwaV9ldmFsdWF0ZV9vYmplY3QoZGV2aWNlLT5oYW5kbGUsICJfRElTIiwgMCwgTlVMTCkpKQoJCXJldHVybiAtRU5YSU87CgoJZHByaW50aygiRGV2aWNlIGRpc2FibGVkXG4iKTsKCXJldHVybiAwOwp9CgoKLyoKICogIEJhc2VkIG9uIGRyaXZlcnMvYWNwaS9wY2lfbGluay5jOmFjcGlfcGNpX2xpbmtfc2V0CiAqCiAqICBDYWxsIF9TUlMgdG8gc2V0IGN1cnJlbnQgcmVzb3VyY2VzCiAqLwpzdGF0aWMgaW50IHNvbnlfcGljX2VuYWJsZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwKCQlzdHJ1Y3Qgc29ueV9waWNfaW9wb3J0ICppb3BvcnQsIHN0cnVjdCBzb255X3BpY19pcnEgKmlycSkKewoJYWNwaV9zdGF0dXMgc3RhdHVzOwoJaW50IHJlc3VsdCA9IDA7CglzdHJ1Y3QgewoJCXN0cnVjdCBhY3BpX3Jlc291cmNlIGlvX3JlczsKCQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSBpcnFfcmVzOwoJCXN0cnVjdCBhY3BpX3Jlc291cmNlIGVuZDsKCX0gKnJlc291cmNlOwoJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgMCwgTlVMTCB9OwoKCWlmICghaW9wb3J0IHx8ICFpcnEpCgkJcmV0dXJuIC1FSU5WQUw7CgoJLyogaW5pdCBhY3BpX2J1ZmZlciAqLwoJcmVzb3VyY2UgPSBremFsbG9jKHNpemVvZigqcmVzb3VyY2UpICsgMSwgR0ZQX0tFUk5FTCk7CglpZiAoIXJlc291cmNlKQoJCXJldHVybiAtRU5PTUVNOwoKCWJ1ZmZlci5sZW5ndGggPSBzaXplb2YoKnJlc291cmNlKSArIDE7CglidWZmZXIucG9pbnRlciA9IHJlc291cmNlOwoKCS8qIHNldHVwIGlvIHJlc291cmNlICovCglyZXNvdXJjZS0+aW9fcmVzLnR5cGUgPSBBQ1BJX1JFU09VUkNFX1RZUEVfSU87CglyZXNvdXJjZS0+aW9fcmVzLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgYWNwaV9yZXNvdXJjZSk7CgltZW1jcHkoJnJlc291cmNlLT5pb19yZXMuZGF0YS5pbywgJmlvcG9ydC0+aW8sCgkJCXNpemVvZihzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pbykpOwoKCS8qIHNldHVwIGlycSByZXNvdXJjZSAqLwoJcmVzb3VyY2UtPmlycV9yZXMudHlwZSA9IEFDUElfUkVTT1VSQ0VfVFlQRV9JUlE7CglyZXNvdXJjZS0+aXJxX3Jlcy5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGFjcGlfcmVzb3VyY2UpOwoJbWVtY3B5KCZyZXNvdXJjZS0+aXJxX3Jlcy5kYXRhLmlycSwgJmlycS0+aXJxLAoJCQlzaXplb2Yoc3RydWN0IGFjcGlfcmVzb3VyY2VfaXJxKSk7CgkvKiB3ZSByZXF1ZXN0ZWQgYSBzaGFyZWQgaXJxICovCglyZXNvdXJjZS0+aXJxX3Jlcy5kYXRhLmlycS5zaGFyYWJsZSA9IEFDUElfU0hBUkVEOwoKCXJlc291cmNlLT5lbmQudHlwZSA9IEFDUElfUkVTT1VSQ0VfVFlQRV9FTkRfVEFHOwoKCS8qIEF0dGVtcHQgdG8gc2V0IHRoZSByZXNvdXJjZSAqLwoJZHByaW50aygiRXZhbHVhdGluZyBfU1JTXG4iKTsKCXN0YXR1cyA9IGFjcGlfc2V0X2N1cnJlbnRfcmVzb3VyY2VzKGRldmljZS0+aGFuZGxlLCAmYnVmZmVyKTsKCgkvKiBjaGVjayBmb3IgdG90YWwgZmFpbHVyZSAqLwoJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CgkJcHJpbnRrKEtFUk5fRVJSIERSVl9QRlggIkVycm9yIGV2YWx1YXRpbmcgX1NSUyIpOwoJCXJlc3VsdCA9IC1FTk9ERVY7CgkJZ290byBlbmQ7Cgl9CgoJLyogTmVjZXNzYXJ5IGRldmljZSBpbml0aWFsaXphdGlvbnMgY2FsbHMgKGZyb20gc29ueXBpKSAqLwoJc29ueV9waWNfY2FsbDEoMHg4Mik7Cglzb255X3BpY19jYWxsMigweDgxLCAweGZmKTsKCXNvbnlfcGljX2NhbGwxKGNvbXBhdCA/IDB4OTIgOiAweDgyKTsKCmVuZDoKCWtmcmVlKHJlc291cmNlKTsKCXJldHVybiByZXN1bHQ7Cn0KCi8qKioqKioqKioqKioqKioqKgogKgogKiBJU1I6IHNvbWUgZXZlbnQgaXMgYXZhaWxhYmxlCiAqCiAqKioqKioqKioqKioqKioqKi8Kc3RhdGljIGlycXJldHVybl90IHNvbnlfcGljX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCnsKCWludCBpLCBqOwoJdTMyIHBvcnRfdmFsID0gMDsKCXU4IGV2ID0gMDsKCXU4IGRhdGFfbWFzayA9IDA7Cgl1OCBkZXZpY2VfZXZlbnQgPSAwOwoKCXN0cnVjdCBzb255X3BpY19kZXYgKmRldiA9IChzdHJ1Y3Qgc29ueV9waWNfZGV2ICopIGRldl9pZDsKCglhY3BpX29zX3JlYWRfcG9ydChkZXYtPmN1cl9pb3BvcnQtPmlvLm1pbmltdW0sICZwb3J0X3ZhbCwKCQkJZGV2LT5jdXJfaW9wb3J0LT5pby5hZGRyZXNzX2xlbmd0aCk7CglldiA9IHBvcnRfdmFsICYgU09OWV9QSUNfRVZfTUFTSzsKCWRhdGFfbWFzayA9IDB4ZmYgJiAocG9ydF92YWwgPj4gKGRldi0+Y3VyX2lvcG9ydC0+aW8uYWRkcmVzc19sZW5ndGggLSA4KSk7CgoJZHByaW50aygiZXZlbnQgKDB4JS44eCBbJS4yeF0gWyUuMnhdKSBhdCBwb3J0IDB4JS40eFxuIiwKCQkJcG9ydF92YWwsIGV2LCBkYXRhX21hc2ssIGRldi0+Y3VyX2lvcG9ydC0+aW8ubWluaW11bSk7CgoJaWYgKGV2ID09IDB4MDAgfHwgZXYgPT0gMHhmZikKCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CgoJZm9yIChpID0gMDsgc29ueV9waWNfZXZlbnR0eXBlc1tpXS5tb2RlbDsgaSsrKSB7CgoJCWlmIChzcGljX2Rldi5tb2RlbCAhPSBzb255X3BpY19ldmVudHR5cGVzW2ldLm1vZGVsKQoJCQljb250aW51ZTsKCgkJaWYgKChkYXRhX21hc2sgJiBzb255X3BpY19ldmVudHR5cGVzW2ldLmRhdGEpICE9CgkJICAgIHNvbnlfcGljX2V2ZW50dHlwZXNbaV0uZGF0YSkKCQkJY29udGludWU7CgoJCWlmICghKG1hc2sgJiBzb255X3BpY19ldmVudHR5cGVzW2ldLm1hc2spKQoJCQljb250aW51ZTsKCgkJZm9yIChqID0gMDsgc29ueV9waWNfZXZlbnR0eXBlc1tpXS5ldmVudHNbal0uZXZlbnQ7IGorKykgewoJCQlpZiAoZXYgPT0gc29ueV9waWNfZXZlbnR0eXBlc1tpXS5ldmVudHNbal0uZGF0YSkgewoJCQkJZGV2aWNlX2V2ZW50ID0KCQkJCQlzb255X3BpY19ldmVudHR5cGVzW2ldLmV2ZW50c1tqXS5ldmVudDsKCQkJCWdvdG8gZm91bmQ7CgkJCX0KCQl9Cgl9CglyZXR1cm4gSVJRX0hBTkRMRUQ7Cgpmb3VuZDoKCXNvbnlfbGFwdG9wX3JlcG9ydF9pbnB1dF9ldmVudChkZXZpY2VfZXZlbnQpOwoJYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoc3BpY19kZXYuYWNwaV9kZXYsIDEsIGRldmljZV9ldmVudCk7Cglzb255cGlfY29tcGF0X3JlcG9ydF9ldmVudChkZXZpY2VfZXZlbnQpOwoKCXJldHVybiBJUlFfSEFORExFRDsKfQoKLyoqKioqKioqKioqKioqKioqCiAqCiAqICBBQ1BJIGRyaXZlcgogKgogKioqKioqKioqKioqKioqKiovCnN0YXRpYyBpbnQgc29ueV9waWNfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKewoJc3RydWN0IHNvbnlfcGljX2lvcG9ydCAqaW8sICp0bXBfaW87CglzdHJ1Y3Qgc29ueV9waWNfaXJxICppcnEsICp0bXBfaXJxOwoKCXNvbnlwaV9jb21wYXRfZXhpdCgpOwoKCWlmIChzb255X3BpY19kaXNhYmxlKGRldmljZSkpIHsKCQlwcmludGsoS0VSTl9FUlIgRFJWX1BGWCAiQ291bGRuJ3QgZGlzYWJsZSBkZXZpY2UuXG4iKTsKCQlyZXR1cm4gLUVOWElPOwoJfQoKCWZyZWVfaXJxKHNwaWNfZGV2LmN1cl9pcnEtPmlycS5pbnRlcnJ1cHRzWzBdLCAmc3BpY19kZXYpOwoJcmVsZWFzZV9yZWdpb24oc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8ubWluaW11bSwKCQkJc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8uYWRkcmVzc19sZW5ndGgpOwoKCXNvbnlfbGFwdG9wX3JlbW92ZV9pbnB1dCgpOwoKCS8qIHBmIGF0dHJzICovCglzeXNmc19yZW1vdmVfZ3JvdXAoJnNvbnlfcGZfZGV2aWNlLT5kZXYua29iaiwgJnNwaWNfYXR0cmlidXRlX2dyb3VwKTsKCXNvbnlfcGZfcmVtb3ZlKCk7CgoJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGlvLCB0bXBfaW8sICZzcGljX2Rldi5pb3BvcnRzLCBsaXN0KSB7CgkJbGlzdF9kZWwoJmlvLT5saXN0KTsKCQlrZnJlZShpbyk7Cgl9CglsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaXJxLCB0bXBfaXJxLCAmc3BpY19kZXYuaW50ZXJydXB0cywgbGlzdCkgewoJCWxpc3RfZGVsKCZpcnEtPmxpc3QpOwoJCWtmcmVlKGlycSk7Cgl9CglzcGljX2Rldi5jdXJfaW9wb3J0ID0gTlVMTDsKCXNwaWNfZGV2LmN1cl9pcnEgPSBOVUxMOwoKCWRwcmludGsoU09OWV9QSUNfRFJJVkVSX05BTUUgIiByZW1vdmVkLlxuIik7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzb255X3BpY19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCnsKCWludCByZXN1bHQ7CglzdHJ1Y3Qgc29ueV9waWNfaW9wb3J0ICppbywgKnRtcF9pbzsKCXN0cnVjdCBzb255X3BpY19pcnEgKmlycSwgKnRtcF9pcnE7CgoJcHJpbnRrKEtFUk5fSU5GTyBEUlZfUEZYICIlcyB2JXMuXG4iLAoJCVNPTllfUElDX0RSSVZFUl9OQU1FLCBTT05ZX0xBUFRPUF9EUklWRVJfVkVSU0lPTik7CgoJc3BpY19kZXYuYWNwaV9kZXYgPSBkZXZpY2U7CglzdHJjcHkoYWNwaV9kZXZpY2VfY2xhc3MoZGV2aWNlKSwgInNvbnkvaG90a2V5Iik7CglzcGljX2Rldi5tb2RlbCA9IHNvbnlfcGljX2RldGVjdF9kZXZpY2VfdHlwZSgpOwoJbXV0ZXhfaW5pdCgmc3BpY19kZXYubG9jayk7CgoJLyogcmVhZCBfUFJTIHJlc291cmNlcyAqLwoJcmVzdWx0ID0gc29ueV9waWNfcG9zc2libGVfcmVzb3VyY2VzKGRldmljZSk7CglpZiAocmVzdWx0KSB7CgkJcHJpbnRrKEtFUk5fRVJSIERSVl9QRlgKCQkJCSJVbmFiZSB0byByZWFkIHBvc3NpYmxlIHJlc291cmNlcy5cbiIpOwoJCWdvdG8gZXJyX2ZyZWVfcmVzb3VyY2VzOwoJfQoKCS8qIHNldHVwIGlucHV0IGRldmljZXMgYW5kIGhlbHBlciBmaWZvICovCglyZXN1bHQgPSBzb255X2xhcHRvcF9zZXR1cF9pbnB1dCgpOwoJaWYgKHJlc3VsdCkgewoJCXByaW50ayhLRVJOX0VSUiBEUlZfUEZYCgkJCQkiVW5hYmUgdG8gY3JlYXRlIGlucHV0IGRldmljZXMuXG4iKTsKCQlnb3RvIGVycl9mcmVlX3Jlc291cmNlczsKCX0KCgkvKiByZXF1ZXN0IGlvIHBvcnQgKi8KCWxpc3RfZm9yX2VhY2hfZW50cnkoaW8sICZzcGljX2Rldi5pb3BvcnRzLCBsaXN0KSB7CgkJaWYgKHJlcXVlc3RfcmVnaW9uKGlvLT5pby5taW5pbXVtLCBpby0+aW8uYWRkcmVzc19sZW5ndGgsCgkJCQkJIlNvbnkgUHJvZ3JhbWFibGUgSS9PIERldmljZSIpKSB7CgkJCWRwcmludGsoIkkvTyBwb3J0OiAweCUuNHggKDB4JS40eCkgKyAweCUuMnhcbiIsCgkJCQkJaW8tPmlvLm1pbmltdW0sIGlvLT5pby5tYXhpbXVtLAoJCQkJCWlvLT5pby5hZGRyZXNzX2xlbmd0aCk7CgkJCXNwaWNfZGV2LmN1cl9pb3BvcnQgPSBpbzsKCQkJYnJlYWs7CgkJfQoJfQoJaWYgKCFzcGljX2Rldi5jdXJfaW9wb3J0KSB7CgkJcHJpbnRrKEtFUk5fRVJSIERSVl9QRlggIkZhaWxlZCB0byByZXF1ZXN0X3JlZ2lvbi5cbiIpOwoJCXJlc3VsdCA9IC1FTk9ERVY7CgkJZ290byBlcnJfcmVtb3ZlX2lucHV0OwoJfQoKCS8qIHJlcXVlc3QgSVJRICovCglsaXN0X2Zvcl9lYWNoX2VudHJ5KGlycSwgJnNwaWNfZGV2LmludGVycnVwdHMsIGxpc3QpIHsKCQlpZiAoIXJlcXVlc3RfaXJxKGlycS0+aXJxLmludGVycnVwdHNbMF0sIHNvbnlfcGljX2lycSwKCQkJCQlJUlFGX1NIQVJFRCwgInNvbnktbGFwdG9wIiwgJnNwaWNfZGV2KSkgewoJCQlkcHJpbnRrKCJJUlE6ICVkIC0gdHJpZ2dlcmluZzogJWQgLSAiCgkJCQkJInBvbGFyaXR5OiAlZCAtIHNocjogJWRcbiIsCgkJCQkJaXJxLT5pcnEuaW50ZXJydXB0c1swXSwKCQkJCQlpcnEtPmlycS50cmlnZ2VyaW5nLAoJCQkJCWlycS0+aXJxLnBvbGFyaXR5LAoJCQkJCWlycS0+aXJxLnNoYXJhYmxlKTsKCQkJc3BpY19kZXYuY3VyX2lycSA9IGlycTsKCQkJYnJlYWs7CgkJfQoJfQoJaWYgKCFzcGljX2Rldi5jdXJfaXJxKSB7CgkJcHJpbnRrKEtFUk5fRVJSIERSVl9QRlggIkZhaWxlZCB0byByZXF1ZXN0X2lycS5cbiIpOwoJCXJlc3VsdCA9IC1FTk9ERVY7CgkJZ290byBlcnJfcmVsZWFzZV9yZWdpb247Cgl9CgoJLyogc2V0IHJlc291cmNlIHN0YXR1cyBfU1JTICovCglyZXN1bHQgPSBzb255X3BpY19lbmFibGUoZGV2aWNlLCBzcGljX2Rldi5jdXJfaW9wb3J0LCBzcGljX2Rldi5jdXJfaXJxKTsKCWlmIChyZXN1bHQpIHsKCQlwcmludGsoS0VSTl9FUlIgRFJWX1BGWCAiQ291bGRuJ3QgZW5hYmxlIGRldmljZS5cbiIpOwoJCWdvdG8gZXJyX2ZyZWVfaXJxOwoJfQoKCXNwaWNfZGV2LmJsdWV0b290aF9wb3dlciA9IC0xOwoJLyogY3JlYXRlIGRldmljZSBhdHRyaWJ1dGVzICovCglyZXN1bHQgPSBzb255X3BmX2FkZCgpOwoJaWYgKHJlc3VsdCkKCQlnb3RvIGVycl9kaXNhYmxlX2RldmljZTsKCglyZXN1bHQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnNvbnlfcGZfZGV2aWNlLT5kZXYua29iaiwgJnNwaWNfYXR0cmlidXRlX2dyb3VwKTsKCWlmIChyZXN1bHQpCgkJZ290byBlcnJfcmVtb3ZlX3BmOwoKCWlmIChzb255cGlfY29tcGF0X2luaXQoKSkKCQlnb3RvIGVycl9yZW1vdmVfcGY7CgoJcmV0dXJuIDA7CgplcnJfcmVtb3ZlX3BmOgoJc29ueV9wZl9yZW1vdmUoKTsKCmVycl9kaXNhYmxlX2RldmljZToKCXNvbnlfcGljX2Rpc2FibGUoZGV2aWNlKTsKCmVycl9mcmVlX2lycToKCWZyZWVfaXJxKHNwaWNfZGV2LmN1cl9pcnEtPmlycS5pbnRlcnJ1cHRzWzBdLCAmc3BpY19kZXYpOwoKZXJyX3JlbGVhc2VfcmVnaW9uOgoJcmVsZWFzZV9yZWdpb24oc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8ubWluaW11bSwKCQkJc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8uYWRkcmVzc19sZW5ndGgpOwoKZXJyX3JlbW92ZV9pbnB1dDoKCXNvbnlfbGFwdG9wX3JlbW92ZV9pbnB1dCgpOwoKZXJyX2ZyZWVfcmVzb3VyY2VzOgoJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGlvLCB0bXBfaW8sICZzcGljX2Rldi5pb3BvcnRzLCBsaXN0KSB7CgkJbGlzdF9kZWwoJmlvLT5saXN0KTsKCQlrZnJlZShpbyk7Cgl9CglsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaXJxLCB0bXBfaXJxLCAmc3BpY19kZXYuaW50ZXJydXB0cywgbGlzdCkgewoJCWxpc3RfZGVsKCZpcnEtPmxpc3QpOwoJCWtmcmVlKGlycSk7Cgl9CglzcGljX2Rldi5jdXJfaW9wb3J0ID0gTlVMTDsKCXNwaWNfZGV2LmN1cl9pcnEgPSBOVUxMOwoKCXJldHVybiByZXN1bHQ7Cn0KCnN0YXRpYyBpbnQgc29ueV9waWNfc3VzcGVuZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgcG1fbWVzc2FnZV90IHN0YXRlKQp7CglpZiAoc29ueV9waWNfZGlzYWJsZShkZXZpY2UpKQoJCXJldHVybiAtRU5YSU87CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzb255X3BpY19yZXN1bWUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCnsKCXNvbnlfcGljX2VuYWJsZShkZXZpY2UsIHNwaWNfZGV2LmN1cl9pb3BvcnQsIHNwaWNfZGV2LmN1cl9pcnEpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgc29ueV9waWNfZHJpdmVyID0gewoJLm5hbWUgPSBTT05ZX1BJQ19EUklWRVJfTkFNRSwKCS5jbGFzcyA9IFNPTllfUElDX0NMQVNTLAoJLmlkcyA9IFNPTllfUElDX0hJRCwKCS5vd25lciA9IFRISVNfTU9EVUxFLAoJLm9wcyA9IHsKCQkuYWRkID0gc29ueV9waWNfYWRkLAoJCS5yZW1vdmUgPSBzb255X3BpY19yZW1vdmUsCgkJLnN1c3BlbmQgPSBzb255X3BpY19zdXNwZW5kLAoJCS5yZXN1bWUgPSBzb255X3BpY19yZXN1bWUsCgkJfSwKfTsKCnN0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBfX2luaXRkYXRhIHNvbnlwaV9kbWlfdGFibGVbXSA9IHsKCXsKCQkuaWRlbnQgPSAiU29ueSBWYWlvIiwKCQkubWF0Y2hlcyA9IHsKCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiU29ueSBDb3Jwb3JhdGlvbiIpLAoJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlBDRy0iKSwKCQl9LAoJfSwKCXsKCQkuaWRlbnQgPSAiU29ueSBWYWlvIiwKCQkubWF0Y2hlcyA9IHsKCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiU29ueSBDb3Jwb3JhdGlvbiIpLAoJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlZHTi0iKSwKCQl9LAoJfSwKCXsgfQp9OwoKc3RhdGljIGludCBfX2luaXQgc29ueV9sYXB0b3BfaW5pdCh2b2lkKQp7CglpbnQgcmVzdWx0OwoKCWlmICghbm9fc3BpYyAmJiBkbWlfY2hlY2tfc3lzdGVtKHNvbnlwaV9kbWlfdGFibGUpKSB7CgkJcmVzdWx0ID0gYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCZzb255X3BpY19kcml2ZXIpOwoJCWlmIChyZXN1bHQpIHsKCQkJcHJpbnRrKEtFUk5fRVJSIERSVl9QRlgKCQkJCQkiVW5hYmxlIHRvIHJlZ2lzdGVyIFNQSUMgZHJpdmVyLiIpOwoJCQlnb3RvIG91dDsKCQl9Cgl9CgoJcmVzdWx0ID0gYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCZzb255X25jX2RyaXZlcik7CglpZiAocmVzdWx0KSB7CgkJcHJpbnRrKEtFUk5fRVJSIERSVl9QRlggIlVuYWJsZSB0byByZWdpc3RlciBTTkMgZHJpdmVyLiIpOwoJCWdvdG8gb3V0X3VucmVnaXN0ZXJfcGljOwoJfQoKCXJldHVybiAwOwoKb3V0X3VucmVnaXN0ZXJfcGljOgoJaWYgKCFub19zcGljKQoJCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZzb255X3BpY19kcml2ZXIpOwpvdXQ6CglyZXR1cm4gcmVzdWx0Owp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgc29ueV9sYXB0b3BfZXhpdCh2b2lkKQp7CglhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmc29ueV9uY19kcml2ZXIpOwoJaWYgKCFub19zcGljKQoJCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZzb255X3BpY19kcml2ZXIpOwp9Cgptb2R1bGVfaW5pdChzb255X2xhcHRvcF9pbml0KTsKbW9kdWxlX2V4aXQoc29ueV9sYXB0b3BfZXhpdCk7Cg==