LyoKICogREVDIDkzIEVyaWsgQm9zIDxlcmlrQHhzNGFsbC5ubD4KICoKICogQ29weXJpZ2h0IDE5OTYgTWFyY3VzIE1laXNzbmVyCiAqCiAqIENvcHlyaWdodCAyMDAxIE1pa2UgTWNDb3JtYWNrCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKgogKiBIaXN0b3J5OgogKgogKiBNYXIgMzEsIDE5OTkuIE92ZSBL5XZlbiA8b3Zla0BhcmN0aWNuZXQubm8+CiAqIC0gSW1wbGVtZW50ZWQgYnVmZmVycyBhbmQgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbi4KICoKICogQXByIDMsIDE5OTkuICBMYXdzb24gV2hpdG5leSA8bGF3c29uX3doaXRuZXlAanVuby5jb20+CiAqIC0gRml4ZWQgdGhlIG1vZGVtIGNvbnRyb2wgcGFydCBvZiBFc2NhcGVDb21tRnVuY3Rpb24xNi4KICoKICogTWFyIDMsIDE5OTkuIE92ZSBL5XZlbiA8b3Zla0BhcmN0aWNuZXQubm8+CiAqIC0gVXNlIHBvcnQgaW5kaWNlcyBpbnN0ZWFkIG9mIHVuaXhmZHMgZm9yIHdpbjE2CiAqIC0gTW92ZWQgdGhpbmdzIGFyb3VuZCAoc2VwYXJhdGVkIHdpbjE2IGFuZCB3aW4zMiByb3V0aW5lcykKICogLSBBZGRlZCBzb21lIGhpbnRzIG9uIGhvdyB0byBpbXBsZW1lbnQgYnVmZmVycyBhbmQgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbi4KICoKICogTWF5IDI2LCAxOTk3LiAgRml4ZXMgYW5kIGNvbW1lbnRzIGJ5IFJpY2sgUmljaGFyZHNvbiA8cmlja0BkZ2lpLmNvbT4gW1JFUl0KICogLSBwdHItPmZkIHdhc24ndCBnZXR0aW5nIGNsZWFyZWQgb24gY2xvc2UuCiAqIC0gR2V0Q29tbUV2ZW50TWFzaygpIGFuZCBHZXRDb21tRXJyb3IoKSBkaWRuJ3QgZG8gbXVjaCBvZiBhbnl0aGluZy4KICogICBJTUhPLCB0aGV5IGFyZSBzdGlsbCB3cm9uZywgYnV0IHRoZXkgYXQgbGVhc3QgaW1wbGVtZW50IHRoZSBSWENIQVIKICogICBldmVudCBhbmQgcmV0dXJuIEkvTyBxdWV1ZSBzaXplcywgd2hpY2ggbWFrZXMgdGhlIGFwcCBJJ20gaW50ZXJlc3RlZAogKiAgIGluIChhbmFsb2cgZGV2aWNlcyBFWktJVCBEU1AgZGV2ZWxvcG1lbnQgc3lzdGVtKSB3b3JrLgogKgogKiBBdWd1c3QgMTIsIDE5OTcuICBUYWtlIGEgYmFzaCBhdCBTZXRDb21tRXZlbnRNYXNrIC0gTGF3c29uIFdoaXRuZXkKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhd3Nvbl93aGl0bmV5QGp1bm8uY29tPgogKiBKdWx5IDYsIDE5OTguIEZpeGVzIGFuZCBjb21tZW50cyBieSBWYWxlbnRpam4gU2Vzc2luawogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dnNlc3NpbmtAaWMudXZhLm5sPiBbVl0KICogT2t0b2JlciA5OCwgUmVpbiBLbGF6ZXMgW1JIS10KICogQSBwcm9ncmFtIHRoYXQgd2FudHMgdG8gbW9uaXRvciB0aGUgbW9kZW0gc3RhdHVzIGxpbmUgKFJMU0QvRENEKSBtYXkKICogcG9sbCB0aGUgbW9kZW0gc3RhdHVzIHJlZ2lzdGVyIGluIHRoZSBjb21tTWFzayBzdHJ1Y3R1cmUuIEkgdXBkYXRlIHRoZSBiaXQKICogaW4gR2V0Q29tbUVycm9yLCB3YWl0aW5nIGZvciBhbiBpbXBsZW1lbnRhdGlvbiBvZiBjb21tdW5pY2F0aW9uIGV2ZW50cy4KICoKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgoKI2luY2x1ZGUgIm50c3RhdHVzLmgiCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgojaW5jbHVkZSAid2lucmVnLmgiCiNpbmNsdWRlICJ3aW51c2VyLmgiCiNpbmNsdWRlICJ3aW5lL3dpbnVzZXIxNi5oIgojaW5jbHVkZSAid2luZS9wb3J0LmgiCiNpbmNsdWRlICJ3aW4uaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoY29tbSk7CgovKiB3aW5kb3cncyBzZW1pIGRvY3VtZW50ZWQgbW9kZW0gc3RhdHVzIHJlZ2lzdGVyICovCiNkZWZpbmUgQ09NTV9NU1JfT0ZGU0VUICAzNQojZGVmaW5lIE1TUl9DVFMgIDB4MTAKI2RlZmluZSBNU1JfRFNSICAweDIwCiNkZWZpbmUgTVNSX1JJICAgMHg0MAojZGVmaW5lIE1TUl9STFNEIDB4ODAKI2RlZmluZSBNU1JfTUFTSyAoTVNSX0NUU3xNU1JfRFNSfE1TUl9SSXxNU1JfUkxTRCkKCiNkZWZpbmUgRkxBR19MUFQgMHg4MAoKI2RlZmluZSBNQVhfUE9SVFMgICA5CgpzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0IHsKICAgIEhBTkRMRSBoYW5kbGU7CiAgICBpbnQgc3VzcGVuZGVkOwogICAgaW50IHVuZ2V0LHhtaXQ7CiAgICBpbnQgZXZ0Y2hhcjsKICAgIC8qIGV2ZW50cyAqLwogICAgaW50IGNvbW1lcnJvciwgZXZlbnRtYXNrOwogICAgLyogYnVmZmVycyAqLwogICAgY2hhciAqaW5idWYsKm91dGJ1ZjsKICAgIHVuc2lnbmVkIGlidWZfc2l6ZSxpYnVmX2hlYWQsaWJ1Zl90YWlsOwogICAgdW5zaWduZWQgb2J1Zl9zaXplLG9idWZfaGVhZCxvYnVmX3RhaWw7CiAgICAvKiBub3RpZmljYXRpb25zICovCiAgICBIV05EIHduZDsKICAgIGludCBuX3JlYWQsIG5fd3JpdGU7CiAgICBPVkVSTEFQUEVEIHJlYWRfb3YsIHdyaXRlX292OwogICAgLyogc2F2ZSB0ZXJtaW5hbCBzdGF0ZXMgKi8KICAgIERDQjE2IGRjYjsKICAgIC8qIHBvaW50ZXIgdG8gdW5rbm93big9PXVuZG9jdW1lbnRlZCkgY29tbSBzdHJ1Y3R1cmUgKi8KICAgIFNFR1BUUiBzZWdfdW5rbm93bjsKICAgIEJZVEUgdW5rbm93bls0MF07Cn07CgpzdGF0aWMgc3RydWN0IERvc0RldmljZVN0cnVjdCBDT01bTUFYX1BPUlRTXTsKc3RhdGljIHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgTFBUW01BWF9QT1JUU107CgovKiB1cGRhdGUgd2luZG93J3Mgc2VtaSBkb2N1bWVudGVkIG1vZGVtIHN0YXR1cyByZWdpc3RlciAqLwovKiBzZWUga25vd2xlZGdlIGJhc2UgUTEwMTQxNyAqLwpzdGF0aWMgdm9pZCBDT01NX01TUlVwZGF0ZSggSEFORExFIGhhbmRsZSwgVUNIQVIgKiBwTXNyICkKewogICAgVUNIQVIgdG1wbXNyPTA7CiAgICBEV09SRCBtc3RhdD0wOwoKICAgIGlmKCFHZXRDb21tTW9kZW1TdGF0dXMoaGFuZGxlLCZtc3RhdCkpCiAgICAgICAgcmV0dXJuOwoKICAgIGlmKG1zdGF0ICYgTVNfQ1RTX09OKSB0bXBtc3IgfD0gTVNSX0NUUzsKICAgIGlmKG1zdGF0ICYgTVNfRFNSX09OKSB0bXBtc3IgfD0gTVNSX0RTUjsKICAgIGlmKG1zdGF0ICYgTVNfUklOR19PTikgdG1wbXNyIHw9IE1TUl9SSTsKICAgIGlmKG1zdGF0ICYgTVNfUkxTRF9PTikgdG1wbXNyIHw9IE1TUl9STFNEOwogICAgKnBNc3IgPSAoKnBNc3IgJiB+TVNSX01BU0spIHwgdG1wbXNyOwp9CgpzdGF0aWMgQk9PTCBnZXRfY29tX2RldmljZV9uYW1lKCBpbnQgcG9ydCwgY2hhciAqZGV2aWNlbmFtZSwgRFdPUkQgc2l6ZSwgaW50ICpiYXVkcmF0ZSApCnsKICAgIEhLRVkgaGtleTsKICAgIGNoYXIgdGVtcFsyNTZdLCAqYnRlbXA7CgogICAgaWYgKHBvcnQgPj0gTUFYX1BPUlRTKSByZXR1cm4gRkFMU0U7CiAgICB0ZW1wWzBdID0gMDsKICAgIGlmICghUmVnT3BlbktleUEoSEtFWV9MT0NBTF9NQUNISU5FLCAiU29mdHdhcmVcXFdpbmVcXFdpbmVcXENvbmZpZ1xcc2VyaWFscG9ydHMiLCAmaGtleSkpCiAgICB7CiAgICAgICAgRFdPUkQgdHlwZSwgY291bnQgPSBzaXplb2YodGVtcCk7CiAgICAgICAgY2hhciB2YWx1ZVs4XTsKCiAgICAgICAgc3ByaW50ZiggdmFsdWUsICJDT00lZCIsIHBvcnQrMSApOwogICAgICAgIFJlZ1F1ZXJ5VmFsdWVFeEEoaGtleSwgdmFsdWUsIDAsICZ0eXBlLCB0ZW1wLCAmY291bnQpOwogICAgICAgIFJlZ0Nsb3NlS2V5KGhrZXkpOwogICAgfQogICAgaWYgKCF0ZW1wWzBdKSByZXR1cm4gRkFMU0U7CgogICAgYnRlbXAgPSBzdHJjaHIodGVtcCwnLCcpOwogICAgaWYgKGJ0ZW1wICE9IE5VTEwpCiAgICB7CiAgICAgICAgKmJ0ZW1wKysgPSAnXDAnOwogICAgICAgIGlmIChiYXVkcmF0ZSkgKmJhdWRyYXRlID0gYXRvaShidGVtcCk7CiAgICB9CiAgICBlbHNlIGlmIChiYXVkcmF0ZSkgKmJhdWRyYXRlID0gLTE7CiAgICBpZiAoZGV2aWNlbmFtZSkgbHN0cmNweW5BKCBkZXZpY2VuYW1lLCB0ZW1wLCBzaXplICk7CiAgICByZXR1cm4gVFJVRTsKfQoKc3RhdGljIEJPT0wgZ2V0X2xwdF9kZXZpY2VfbmFtZSggaW50IHBvcnQsIGNoYXIgKmRldmljZW5hbWUsIERXT1JEIHNpemUgKQp7CiAgICBIS0VZIGhrZXk7CiAgICBjaGFyIHRlbXBbMjU2XTsKCiAgICBpZiAocG9ydCA+PSBNQVhfUE9SVFMpIHJldHVybiBGQUxTRTsKICAgIHRlbXBbMF0gPSAwOwogICAgaWYgKCFSZWdPcGVuS2V5QShIS0VZX0xPQ0FMX01BQ0hJTkUsICJTb2Z0d2FyZVxcV2luZVxcV2luZVxcQ29uZmlnXFxwYXJhbGxlbHBvcnRzIiwgJmhrZXkpKQogICAgewogICAgICAgIERXT1JEIHR5cGUsIGNvdW50ID0gc2l6ZW9mKHRlbXApOwogICAgICAgIGNoYXIgdmFsdWVbOF07CgogICAgICAgIHNwcmludGYoIHZhbHVlLCAiTFBUJWQiLCBwb3J0KzEgKTsKICAgICAgICBSZWdRdWVyeVZhbHVlRXhBKGhrZXksIHZhbHVlLCAwLCAmdHlwZSwgdGVtcCwgJmNvdW50KTsKICAgICAgICBSZWdDbG9zZUtleShoa2V5KTsKICAgIH0KICAgIGlmICghdGVtcFswXSkgcmV0dXJuIEZBTFNFOwoKICAgIGlmIChkZXZpY2VuYW1lKSBsc3RyY3B5bkEoIGRldmljZW5hbWUsIHRlbXAsIHNpemUgKTsKICAgIHJldHVybiBUUlVFOwp9CgoKc3RhdGljIHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKkdldERldmljZVN0cnVjdChpbnQgaW5kZXgpCnsKCWlmICgoaW5kZXgmMHg3Rik8PU1BWF9QT1JUUykgewogICAgICAgICAgICBpZiAoIShpbmRleCZGTEFHX0xQVCkpIHsKCQlpZiAoQ09NW2luZGV4XS5oYW5kbGUpCgkJICAgIHJldHVybiAmQ09NW2luZGV4XTsKCSAgICB9IGVsc2UgewoJCWluZGV4ICY9IDB4N2Y7CgkJaWYgKExQVFtpbmRleF0uaGFuZGxlKQoJCSAgICByZXR1cm4gJkxQVFtpbmRleF07CgkgICAgfQoJfQoKCXJldHVybiBOVUxMOwp9CgpzdGF0aWMgaW50ICAgIEdldENvbW1Qb3J0X292KExQT1ZFUkxBUFBFRCBvdiwgaW50IHdyaXRlKQp7CglpbnQgeDsKCglmb3IgKHg9MDsgeDxNQVhfUE9SVFM7IHgrKykgewoJCWlmIChvdiA9PSAod3JpdGU/JkNPTVt4XS53cml0ZV9vdjomQ09NW3hdLnJlYWRfb3YpKQoJCQlyZXR1cm4geDsKCX0KCglyZXR1cm4gLTE7Cn0KCmlubGluZSBzdGF0aWMgaW50IFZhbGlkQ09NUG9ydChpbnQgeCkKewogICAgcmV0dXJuIGdldF9jb21fZGV2aWNlX25hbWUoIHgsIE5VTEwsIDAsIE5VTEwgKTsKfQoKaW5saW5lIHN0YXRpYyBpbnQgVmFsaWRMUFRQb3J0KGludCB4KQp7CiAgICByZXR1cm4gZ2V0X2xwdF9kZXZpY2VfbmFtZSggeCwgTlVMTCwgMCApOwp9CgpzdGF0aWMgaW50IFdpbkVycm9yKHZvaWQpCnsKICAgICAgICBUUkFDRSgiZXJybm8gPSAlZFxuIiwgZXJybm8pOwoJc3dpdGNoIChlcnJubykgewoJCWRlZmF1bHQ6CgkJCXJldHVybiBDRV9JT0U7CgkJfQp9CgpzdGF0aWMgdW5zaWduZWQgY29tbV9pbmJ1ZihzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHIpCnsKICByZXR1cm4gKChwdHItPmlidWZfdGFpbCA+IHB0ci0+aWJ1Zl9oZWFkKSA/IHB0ci0+aWJ1Zl9zaXplIDogMCkKICAgICsgcHRyLT5pYnVmX2hlYWQgLSBwdHItPmlidWZfdGFpbDsKfQoKc3RhdGljIHVuc2lnbmVkIGNvbW1fb3V0YnVmKHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cikKewogIHJldHVybiAoKHB0ci0+b2J1Zl90YWlsID4gcHRyLT5vYnVmX2hlYWQpID8gcHRyLT5vYnVmX3NpemUgOiAwKQogICAgKyBwdHItPm9idWZfaGVhZCAtIHB0ci0+b2J1Zl90YWlsOwp9CgpzdGF0aWMgdm9pZCBjb21tX3dhaXRyZWFkKHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cik7CnN0YXRpYyB2b2lkIGNvbW1fd2FpdHdyaXRlKHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cik7CgpzdGF0aWMgVk9JRCBXSU5BUEkgQ09NTTE2X1JlYWRDb21wbGV0ZShEV09SRCBzdGF0dXMsIERXT1JEIGxlbiwgTFBPVkVSTEFQUEVEIG92KQp7CglpbnQgcHJldiA7CglXT1JEIG1hc2sgPSAwOwoJaW50IGNpZCA9IEdldENvbW1Qb3J0X292KG92LDApOwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKCWlmKGNpZDwwKSB7CgkJRVJSKCJhc3luYyB3cml0ZSB3aXRoIGJhZCBvdmVybGFwcGVkIHBvaW50ZXJcbiIpOwoJCXJldHVybjsKCX0KCXB0ciA9ICZDT01bY2lkXTsKCgkvKiB3ZSBnZXQgY2FuY2VsbGVkIHdoZW4gQ2xvc2VDb21tIGlzIGNhbGxlZCAqLwoJaWYgKHN0YXR1cz09U1RBVFVTX0NBTkNFTExFRCkKCXsKCQlUUkFDRSgiQ2FuY2VsbGVkXG4iKTsKCQlyZXR1cm47Cgl9CgoJLyogcmVhZCBkYXRhIGZyb20gY29tbSBwb3J0ICovCglpZiAoc3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKSB7CgkJRVJSKCJhc3luYyByZWFkIGZhaWxlZCAlMDhseFxuIixzdGF0dXMpOwoJCUNPTVtjaWRdLmNvbW1lcnJvciA9IENFX1JYT1ZFUjsKCQlyZXR1cm47Cgl9CglUUkFDRSgiYXN5bmMgcmVhZCBjb21wbGV0ZWQgJWxkIGJ5dGVzXG4iLGxlbik7CgoJcHJldiA9IGNvbW1faW5idWYocHRyKTsKCgkvKiBjaGVjayBmb3IgZXZlbnRzICovCglpZiAoKHB0ci0+ZXZlbnRtYXNrICYgRVZfUlhGTEFHKSAmJgoJICAgIG1lbWNocihwdHItPmluYnVmICsgcHRyLT5pYnVmX2hlYWQsIHB0ci0+ZXZ0Y2hhciwgbGVuKSkgewoJCSooV09SRCopKENPTVtjaWRdLnVua25vd24pIHw9IEVWX1JYRkxBRzsKCQltYXNrIHw9IENOX0VWRU5UOwoJfQoJaWYgKHB0ci0+ZXZlbnRtYXNrICYgRVZfUlhDSEFSKSB7CgkJKihXT1JEKikoQ09NW2NpZF0udW5rbm93bikgfD0gRVZfUlhDSEFSOwoJCW1hc2sgfD0gQ05fRVZFTlQ7Cgl9CgoJLyogYWR2YW5jZSBidWZmZXIgcG9zaXRpb24gKi8KCXB0ci0+aWJ1Zl9oZWFkICs9IGxlbjsKCWlmIChwdHItPmlidWZfaGVhZCA+PSBwdHItPmlidWZfc2l6ZSkKCQlwdHItPmlidWZfaGVhZCA9IDA7CgoJLyogY2hlY2sgZm9yIG5vdGlmaWNhdGlvbiAqLwoJaWYgKHB0ci0+d25kICYmIChwdHItPm5fcmVhZD4wKSAmJiAocHJldjxwdHItPm5fcmVhZCkgJiYKCSAgICAoY29tbV9pbmJ1ZihwdHIpPj1wdHItPm5fcmVhZCkpIHsKCQkvKiBwYXNzZWQgdGhlIHJlY2VpdmUgbm90aWZpY2F0aW9uIHRocmVzaG9sZCAqLwoJCW1hc2sgfD0gQ05fUkVDRUlWRTsKCX0KCgkvKiBzZW5kIG5vdGlmaWNhdGlvbnMsIGlmIGFueSAqLwoJaWYgKHB0ci0+d25kICYmIG1hc2spIHsKCQlUUkFDRSgibm90aWZ5aW5nICVwOiBjaWQ9JWQsIG1hc2s9JTAyeFxuIiwgcHRyLT53bmQsIGNpZCwgbWFzayk7CgkJUG9zdE1lc3NhZ2VBKHB0ci0+d25kLCBXTV9DT01NTk9USUZZLCBjaWQsIG1hc2spOwoJfQoKCS8qIG9uIHJlYWwgd2luZG93cywgdGhpcyBjb3VsZCBjYXVzZSBwcm9ibGVtcywgc2luY2UgaXQgaXMgcmVjdXJzaXZlICovCgkvKiByZXN0YXJ0IHRoZSByZWNlaXZlICovCgljb21tX3dhaXRyZWFkKHB0cik7Cn0KCi8qIHRoaXMgaXMgbWVhbnQgdG8gd29yayBsaWtlIHdyaXRlKCkgKi8Kc3RhdGljIElOVCBDT01NMTZfV3JpdGVGaWxlKEhBTkRMRSBoQ29tbSwgTFBDVk9JRCBidWZmZXIsIERXT1JEIGxlbikKewoJT1ZFUkxBUFBFRCBvdjsKCURXT1JEIGNvdW50PSAtMTsKCglaZXJvTWVtb3J5KCZvdixzaXplb2Yob3YpKTsKCW92LmhFdmVudCA9IENyZWF0ZUV2ZW50QShOVUxMLDAsMCxOVUxMKTsKCWlmKG92LmhFdmVudD09SU5WQUxJRF9IQU5ETEVfVkFMVUUpCgkJcmV0dXJuIC0xOwoKCWlmKCFXcml0ZUZpbGUoaENvbW0sYnVmZmVyLGxlbiwmY291bnQsJm92KSkKCXsKCQlpZihHZXRMYXN0RXJyb3IoKT09RVJST1JfSU9fUEVORElORykKCQl7CgkJCUdldE92ZXJsYXBwZWRSZXN1bHQoaENvbW0sJm92LCZjb3VudCxUUlVFKTsKCQl9Cgl9CglDbG9zZUhhbmRsZShvdi5oRXZlbnQpOwoKCXJldHVybiBjb3VudDsKfQoKc3RhdGljIFZPSUQgV0lOQVBJIENPTU0xNl9Xcml0ZUNvbXBsZXRlKERXT1JEIHN0YXR1cywgRFdPUkQgbGVuLCBMUE9WRVJMQVBQRUQgb3YpCnsKCWludCBwcmV2LCBibGVmdDsKCVdPUkQgbWFzayA9IDA7CglpbnQgY2lkID0gR2V0Q29tbVBvcnRfb3Yob3YsMSk7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CgoJaWYoY2lkPDApIHsKCQlFUlIoImFzeW5jIHdyaXRlIHdpdGggYmFkIG92ZXJsYXBwZWQgcG9pbnRlclxuIik7CgkJcmV0dXJuOwoJfQoJcHRyID0gJkNPTVtjaWRdOwoKCS8qIHJlYWQgZGF0YSBmcm9tIGNvbW0gcG9ydCAqLwoJaWYgKHN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgewoJCUVSUigiYXN5bmMgd3JpdGUgZmFpbGVkXG4iKTsKCQlDT01bY2lkXS5jb21tZXJyb3IgPSBDRV9SWE9WRVI7CgkJcmV0dXJuOwoJfQoJVFJBQ0UoImFzeW5jIHdyaXRlIGNvbXBsZXRlZCAlbGQgYnl0ZXNcbiIsbGVuKTsKCgkvKiB1cGRhdGUgdGhlIGJ1ZmZlciBwb2ludGVycyAqLwoJcHJldiA9IGNvbW1fb3V0YnVmKCZDT01bY2lkXSk7CglwdHItPm9idWZfdGFpbCArPSBsZW47CglpZiAocHRyLT5vYnVmX3RhaWwgPj0gcHRyLT5vYnVmX3NpemUpCgkJcHRyLT5vYnVmX3RhaWwgPSAwOwoKCS8qIHdyaXRlIGFueSBUcmFuc21pdENvbW1DaGFyIGNoYXJhY3RlciAqLwoJaWYgKHB0ci0+eG1pdD49MCkgewoJCWxlbiA9IENPTU0xNl9Xcml0ZUZpbGUocHRyLT5oYW5kbGUsICYocHRyLT54bWl0KSwgMSk7CgkJaWYgKGxlbiA+IDApIHB0ci0+eG1pdCA9IC0xOwoJfQoKCS8qIHdyaXRlIGZyb20gb3V0cHV0IHF1ZXVlICovCglibGVmdCA9ICgocHRyLT5vYnVmX3RhaWwgPD0gcHRyLT5vYnVmX2hlYWQpID8KCQlwdHItPm9idWZfaGVhZCA6IHB0ci0+b2J1Zl9zaXplKSAtIHB0ci0+b2J1Zl90YWlsOwoKCS8qIGNoZWNrIGZvciBub3RpZmljYXRpb24gKi8KCWlmIChwdHItPnduZCAmJiAocHRyLT5uX3dyaXRlPjApICYmIChwcmV2Pj1wdHItPm5fd3JpdGUpICYmCgkgIChjb21tX291dGJ1ZihwdHIpPHB0ci0+bl93cml0ZSkpIHsKCQkvKiBwYXNzZWQgdGhlIHRyYW5zbWl0IG5vdGlmaWNhdGlvbiB0aHJlc2hvbGQgKi8KCQltYXNrIHw9IENOX1RSQU5TTUlUOwoJfQoKCS8qIHNlbmQgbm90aWZpY2F0aW9ucywgaWYgYW55ICovCglpZiAocHRyLT53bmQgJiYgbWFzaykgewoJCVRSQUNFKCJub3RpZnlpbmcgJXA6IGNpZD0lZCwgbWFzaz0lMDJ4XG4iLCBwdHItPnduZCwgY2lkLCBtYXNrKTsKCQlQb3N0TWVzc2FnZUEocHRyLT53bmQsIFdNX0NPTU1OT1RJRlksIGNpZCwgbWFzayk7Cgl9CgoJLyogc3RhcnQgYWdhaW4gaWYgbmVjZXNzYXJ5ICovCglpZihibGVmdCkKCQljb21tX3dhaXR3cml0ZShwdHIpOwp9CgpzdGF0aWMgdm9pZCBjb21tX3dhaXRyZWFkKHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cikKewoJaW50IGJsZWZ0OwogICAgICAgIENPTVNUQVQgc3RhdDsKCgkvKiBGSVhNRTogZ2V0IHRpbWVvdXRzIHdvcmtpbmcgcHJvcGVybHkgc28gd2UgY2FuIHJlYWQgYmxlZnQgYnl0ZXMgKi8KCWJsZWZ0ID0gKChwdHItPmlidWZfdGFpbCA+IHB0ci0+aWJ1Zl9oZWFkKSA/CgkJKHB0ci0+aWJ1Zl90YWlsLTEpIDogcHRyLT5pYnVmX3NpemUpIC0gcHRyLT5pYnVmX2hlYWQ7CgoJLyogZmluZCBvdXQgaG93IG1hbnkgYnl0ZXMgYXJlIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLwoJaWYoQ2xlYXJDb21tRXJyb3IocHRyLT5oYW5kbGUsTlVMTCwmc3RhdCkpCgkJYmxlZnQgPSAoYmxlZnQ8c3RhdC5jYkluUXVlKSA/IGJsZWZ0IDogc3RhdC5jYkluUXVlOwoJZWxzZQoJCWJsZWZ0ID0gMTsKCgkvKiBhbHdheXMgcmVhZCBhdCBsZWFzdCBvbmUgYnl0ZSAqLwoJaWYoYmxlZnQ9PTApCgkJYmxlZnQrKzsKCglSZWFkRmlsZUV4KHB0ci0+aGFuZGxlLAoJCXB0ci0+aW5idWYgKyBwdHItPmlidWZfaGVhZCwKCQlibGVmdCwKCQkmcHRyLT5yZWFkX292LAoJCUNPTU0xNl9SZWFkQ29tcGxldGUpOwp9CgpzdGF0aWMgdm9pZCBjb21tX3dhaXR3cml0ZShzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHIpCnsKCWludCBibGVmdDsKCglibGVmdCA9ICgocHRyLT5vYnVmX3RhaWwgPD0gcHRyLT5vYnVmX2hlYWQpID8KCQlwdHItPm9idWZfaGVhZCA6IHB0ci0+b2J1Zl9zaXplKSAtIHB0ci0+b2J1Zl90YWlsOwoJV3JpdGVGaWxlRXgocHRyLT5oYW5kbGUsCgkJcHRyLT5vdXRidWYgKyBwdHItPm9idWZfdGFpbCwKCQlibGVmdCwKCQkmcHRyLT53cml0ZV9vdiwKCQlDT01NMTZfV3JpdGVDb21wbGV0ZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglDT01NMTZfRENCdG9EQ0IxNgkoSW50ZXJuYWwpCiAqLwpJTlQxNiBDT01NMTZfRENCdG9EQ0IxNihMUERDQiBscGRjYiwgTFBEQ0IxNiBscGRjYjE2KQp7CglpZihscGRjYi0+QmF1ZFJhdGU8MHgxMDAwMCkKCQlscGRjYjE2LT5CYXVkUmF0ZSA9IGxwZGNiLT5CYXVkUmF0ZTsKCWVsc2UgaWYobHBkY2ItPkJhdWRSYXRlPT0xMTUyMDApCgkJCWxwZGNiMTYtPkJhdWRSYXRlID0gNTc2MDE7CgllbHNlIHsKCQlXQVJOKCJCYXVkIHJhdGUgY2FuJ3QgYmUgY29udmVydGVkXG4iKTsKCQlscGRjYjE2LT5CYXVkUmF0ZSA9IDU3NjAxOwoJfQoJbHBkY2IxNi0+Qnl0ZVNpemUgPSBscGRjYi0+Qnl0ZVNpemU7CglscGRjYjE2LT5mUGFyaXR5ID0gbHBkY2ItPmZQYXJpdHk7CglscGRjYjE2LT5QYXJpdHkgPSBscGRjYi0+UGFyaXR5OwoJbHBkY2IxNi0+U3RvcEJpdHMgPSBscGRjYi0+U3RvcEJpdHM7CgoJbHBkY2IxNi0+UmxzVGltZW91dCA9IDUwOwoJbHBkY2IxNi0+Q3RzVGltZW91dCA9IDUwOwoJbHBkY2IxNi0+RHNyVGltZW91dCA9IDUwOwoJbHBkY2IxNi0+Zk51bGwgPSAwOwoJbHBkY2IxNi0+ZkNoRXZ0ID0gMDsKCWxwZGNiMTYtPmZCaW5hcnkgPSAxOwoKCWxwZGNiMTYtPmZEdHJmbG93ID0gKGxwZGNiLT5mRHRyQ29udHJvbD09RFRSX0NPTlRST0xfSEFORFNIQUtFKTsKCWxwZGNiMTYtPmZSdHNmbG93ID0gKGxwZGNiLT5mUnRzQ29udHJvbD09UlRTX0NPTlRST0xfSEFORFNIQUtFKTsKCWxwZGNiMTYtPmZPdXR4Q3RzRmxvdyA9IGxwZGNiLT5mT3V0eEN0c0Zsb3c7CglscGRjYjE2LT5mT3V0eERzckZsb3cgPSBscGRjYi0+Zk91dHhEc3JGbG93OwoJbHBkY2IxNi0+ZkR0ckRpc2FibGUgPSAobHBkY2ItPmZEdHJDb250cm9sPT1EVFJfQ09OVFJPTF9ESVNBQkxFKTsKCglscGRjYjE2LT5mSW5YID0gbHBkY2ItPmZJblg7CgoJbHBkY2IxNi0+Zk91dFggPSBscGRjYi0+Zk91dFg7Ci8qCglscGRjYjE2LT5Yb25DaGFyID0KCWxwZGNiMTYtPlhvZmZDaGFyID0KICovCglscGRjYjE2LT5Yb25MaW0gPSAxMDsKCWxwZGNiMTYtPlhvZmZMaW0gPSAxMDsKCglyZXR1cm4gMDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEJ1aWxkQ29tbURDQgkJKFVTRVIuMjEzKQogKgogKiBBY2NvcmRpbmcgdG8gdGhlIEVDTUEtMjM0ICgzNjguMykgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIEZBTFNFIG9uCiAqIHN1Y2Nlc3MsIG90aGVyd2lzZSBpdCB3aWxsIHJldHVybiAtMS4KICovCklOVDE2IFdJTkFQSSBCdWlsZENvbW1EQ0IxNihMUENTVFIgZGV2aWNlLCBMUERDQjE2IGxwZGNiKQp7CgkvKiAiQ09NMTo5NixuLDgsMSIJKi8KCS8qICAwMTIzNDUJCSovCglpbnQgcG9ydDsKCURDQiBkY2I7CgoJVFJBQ0UoIiglcyksIHB0ciAlcFxuIiwgZGV2aWNlLCBscGRjYik7CgoJaWYgKHN0cm5jYXNlY21wKGRldmljZSwiQ09NIiwzKSkKCQlyZXR1cm4gLTE7Cglwb3J0ID0gZGV2aWNlWzNdIC0gJzAnOwoKCWlmIChwb3J0LS0gPT0gMCkgewoJCUVSUigiQlVHICEgQ09NMCBjYW4ndCBleGlzdCFcbiIpOwoJCXJldHVybiAtMTsKCX0KCglpZiAoIVZhbGlkQ09NUG9ydChwb3J0KSkgewoJCUZJWE1FKCJpbnZhbGlkIENPTSBwb3J0ICVkP1xuIixwb3J0KTsKCQlyZXR1cm4gLTE7Cgl9CgoJbWVtc2V0KGxwZGNiLCAwLCBzaXplb2YoRENCMTYpKTsgLyogaW5pdGlhbGl6ZSAqLwoKCWxwZGNiLT5JZCA9IHBvcnQ7CglkY2IuRENCbGVuZ3RoID0gc2l6ZW9mKERDQik7CgoJaWYgKHN0cmNocihkZXZpY2UsJz0nKSkgLyogYmxvY2sgbmV3IHN0eWxlICovCgkJcmV0dXJuIC0xOwoKCWlmKCFCdWlsZENvbW1EQ0JBKGRldmljZSwmZGNiKSkKCQlyZXR1cm4gLTE7CgoJcmV0dXJuIENPTU0xNl9EQ0J0b0RDQjE2KCZkY2IsIGxwZGNiKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCU9wZW5Db21tCQkoVVNFUi4yMDApCiAqLwpJTlQxNiBXSU5BUEkgT3BlbkNvbW0xNihMUENTVFIgZGV2aWNlLFVJTlQxNiBjYkluUXVldWUsVUlOVDE2IGNiT3V0UXVldWUpCnsKCWludCBwb3J0OwoJSEFORExFIGhhbmRsZTsKCiAgICAJVFJBQ0UoIiVzLCAlZCwgJWRcbiIsIGRldmljZSwgY2JJblF1ZXVlLCBjYk91dFF1ZXVlKTsKCglpZiAoc3RybGVuKGRldmljZSkgPCA0KQoJICAgcmV0dXJuIElFX0JBRElEOwoKCXBvcnQgPSBkZXZpY2VbM10gLSAnMCc7CgoJaWYgKHBvcnQtLSA9PSAwKQoJCUVSUigiQlVHICEgQ09NMCBvciBMUFQwIGRvbid0IGV4aXN0ICFcbiIpOwoKCWlmICghc3RybmNhc2VjbXAoZGV2aWNlLCJDT00iLDMpKQogICAgICAgIHsKICAgICAgICAgICAgICAgIGNoYXIgZGV2aWNlbmFtZVszMl07CiAgICAgICAgICAgICAgICBpbnQgYmF1ZHJhdGU7CgogICAgICAgICAgICAgICAgaWYgKCFnZXRfY29tX2RldmljZV9uYW1lKCBwb3J0LCBkZXZpY2VuYW1lLCBzaXplb2YoZGV2aWNlbmFtZSksICZiYXVkcmF0ZSApKQoJCQlyZXR1cm4gSUVfQkFESUQ7CgogICAgICAgICAgICAgICAgVFJBQ0UoIiVzID0gJXNcbiIsIGRldmljZSwgZGV2aWNlbmFtZSk7CgoJCWlmIChDT01bcG9ydF0uaGFuZGxlKQoJCQlyZXR1cm4gSUVfT1BFTjsKCgkJaGFuZGxlID0gQ3JlYXRlRmlsZUEoZGV2aWNlLCBHRU5FUklDX1JFQUR8R0VORVJJQ19XUklURSwKCQkJRklMRV9TSEFSRV9SRUFEIHwgRklMRV9TSEFSRV9XUklURSwgTlVMTCwgQ1JFQVRFX0FMV0FZUywKCQkJRklMRV9GTEFHX09WRVJMQVBQRUR8RklMRV9GTEFHX05PX0JVRkZFUklORywgMCApOwoJCWlmIChoYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKCQkJRVJSKCJDb3VsZG4ndCBvcGVuICVzICEgKCVzKVxuIiwgZGV2aWNlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKCQkJcmV0dXJuIElFX0hBUkRXQVJFOwoJCX0gZWxzZSB7CgkJCW1lbXNldChDT01bcG9ydF0udW5rbm93biwgMCwgc2l6ZW9mKENPTVtwb3J0XS51bmtub3duKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIENPTVtwb3J0XS5zZWdfdW5rbm93biA9IDA7CgkJCUNPTVtwb3J0XS5oYW5kbGUgPSBoYW5kbGU7CgkJCUNPTVtwb3J0XS5jb21tZXJyb3IgPSAwOwoJCQlDT01bcG9ydF0uZXZlbnRtYXNrID0gMDsKCQkJQ09NW3BvcnRdLmV2dGNoYXIgPSAwOyAvKiBGSVhNRTogZGVmYXVsdD8gKi8KICAgICAgICAgICAgICAgICAgICAgICAgLyogc2F2ZSB0ZXJtaW5hbCBzdGF0ZSAqLwoJCQlHZXRDb21tU3RhdGUxNihwb3J0LCZDT01bcG9ydF0uZGNiKTsKICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IGRlZmF1bHQgcGFyYW1ldGVycyAqLwogICAgICAgICAgICAgICAgICAgICAgICBpZihiYXVkcmF0ZT4tMSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQ0IxNiBkY2I7CgkJCSAgICBtZW1jcHkoJmRjYiwmQ09NW3BvcnRdLmRjYixzaXplb2YoZGNiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkY2IuQmF1ZFJhdGU9YmF1ZHJhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3JlIGRlZmF1bHRzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZGF0YWJpdHMsIHBhcml0eSwgc3RvcGJpdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0Q29tbVN0YXRlMTYoICZkY2IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgkJCS8qIGluaXQgcHJpb3JpdHkgY2hhcmFjdGVycyAqLwoJCQlDT01bcG9ydF0udW5nZXQgPSAtMTsKCQkJQ09NW3BvcnRdLnhtaXQgPSAtMTsKCQkJLyogYWxsb2NhdGUgYnVmZmVycyAqLwoJCQlDT01bcG9ydF0uaWJ1Zl9zaXplID0gY2JJblF1ZXVlOwoJCQlDT01bcG9ydF0uaWJ1Zl9oZWFkID0gQ09NW3BvcnRdLmlidWZfdGFpbCA9IDA7CgkJCUNPTVtwb3J0XS5vYnVmX3NpemUgPSBjYk91dFF1ZXVlOwoJCQlDT01bcG9ydF0ub2J1Zl9oZWFkID0gQ09NW3BvcnRdLm9idWZfdGFpbCA9IDA7CgoJCQlDT01bcG9ydF0uaW5idWYgPSBtYWxsb2MoY2JJblF1ZXVlKTsKCQkJaWYgKENPTVtwb3J0XS5pbmJ1ZikgewoJCQkgIENPTVtwb3J0XS5vdXRidWYgPSBtYWxsb2MoY2JPdXRRdWV1ZSk7CgkJCSAgaWYgKCFDT01bcG9ydF0ub3V0YnVmKQoJCQkgICAgZnJlZShDT01bcG9ydF0uaW5idWYpOwoJCQl9IGVsc2UgQ09NW3BvcnRdLm91dGJ1ZiA9IE5VTEw7CgkJCWlmICghQ09NW3BvcnRdLm91dGJ1ZikgewoJCQkgIC8qIG5vdCBlbm91Z2ggbWVtb3J5ICovCgkJCSAgU2V0Q29tbVN0YXRlMTYoJkNPTVtwb3J0XS5kY2IpOwoJCQkgIENsb3NlSGFuZGxlKENPTVtwb3J0XS5oYW5kbGUpOwoJCQkgIEVSUigib3V0IG9mIG1lbW9yeVxuIik7CgkJCSAgcmV0dXJuIElFX01FTU9SWTsKCQkJfQoKCQkJWmVyb01lbW9yeSgmQ09NW3BvcnRdLnJlYWRfb3Ysc2l6ZW9mIChPVkVSTEFQUEVEKSk7CgkJCVplcm9NZW1vcnkoJkNPTVtwb3J0XS53cml0ZV9vdixzaXplb2YgKE9WRVJMQVBQRUQpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1fd2FpdHJlYWQoICZDT01bcG9ydF0gKTsKCQkJVVNFUjE2X0FsZXJ0YWJsZVdhaXQrKzsKCgkJCXJldHVybiBwb3J0OwoJCX0KCX0KCWVsc2UKCWlmICghc3RybmNhc2VjbXAoZGV2aWNlLCJMUFQiLDMpKSB7CgoJCWlmICghVmFsaWRMUFRQb3J0KHBvcnQpKQoJCQlyZXR1cm4gSUVfQkFESUQ7CgoJCWlmIChMUFRbcG9ydF0uaGFuZGxlKQoJCQlyZXR1cm4gSUVfT1BFTjsKCgkJaGFuZGxlID0gQ3JlYXRlRmlsZUEoZGV2aWNlLCBHRU5FUklDX1JFQUR8R0VORVJJQ19XUklURSwKCQkJRklMRV9TSEFSRV9SRUFEIHwgRklMRV9TSEFSRV9XUklURSwgTlVMTCwgQ1JFQVRFX0FMV0FZUywgMCwgMCApOwoJCWlmIChoYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKCQkJcmV0dXJuIElFX0hBUkRXQVJFOwoJCX0gZWxzZSB7CgkJCUxQVFtwb3J0XS5oYW5kbGUgPSBoYW5kbGU7CgkJCUxQVFtwb3J0XS5jb21tZXJyb3IgPSAwOwoJCQlMUFRbcG9ydF0uZXZlbnRtYXNrID0gMDsKCQkJcmV0dXJuIHBvcnR8RkxBR19MUFQ7CgkJfQoJfQoJcmV0dXJuIElFX0JBRElEOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJQ2xvc2VDb21tCQkoVVNFUi4yMDcpCiAqLwpJTlQxNiBXSU5BUEkgQ2xvc2VDb21tMTYoSU5UMTYgY2lkKQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CgogICAgCVRSQUNFKCJjaWQ9JWRcbiIsIGNpZCk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGNpZD0lZCBmb3VuZCFcbiIsIGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoJaWYgKCEoY2lkJkZMQUdfTFBUKSkgewoJCS8qIENPTSBwb3J0ICovCiAgICAgICAgICAgICAgICBVbk1hcExTKCBDT01bY2lkXS5zZWdfdW5rbm93biApOwoJCVVTRVIxNl9BbGVydGFibGVXYWl0LS07CgkJQ2FuY2VsSW8ocHRyLT5oYW5kbGUpOwoKCQkvKiBmcmVlIGJ1ZmZlcnMgKi8KCQlmcmVlKHB0ci0+b3V0YnVmKTsKCQlmcmVlKHB0ci0+aW5idWYpOwoKCQkvKiByZXNldCBtb2RlbSBsaW5lcyAqLwoJCVNldENvbW1TdGF0ZTE2KCZDT01bY2lkXS5kY2IpOwoJfQoKCWlmICghQ2xvc2VIYW5kbGUocHRyLT5oYW5kbGUpKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBXaW5FcnJvcigpOwoJCS8qIEZJWE1FOiBzaG91bGQgd2UgY2xlYXIgcHRyLT5oYW5kbGUgaGVyZT8gKi8KCQlyZXR1cm4gLTE7Cgl9IGVsc2UgewoJCXB0ci0+Y29tbWVycm9yID0gMDsKCQlwdHItPmhhbmRsZSA9IDA7CgkJcmV0dXJuIDA7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTZXRDb21tQnJlYWsJCShVU0VSLjIxMCkKICovCklOVDE2IFdJTkFQSSBTZXRDb21tQnJlYWsxNihJTlQxNiBjaWQpCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCglUUkFDRSgiY2lkPSVkXG4iLCBjaWQpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBjaWQ9JWQgZm91bmQhXG4iLCBjaWQpOwoJCXJldHVybiAtMTsKCX0KCglwdHItPnN1c3BlbmRlZCA9IDE7CglwdHItPmNvbW1lcnJvciA9IDA7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUNsZWFyQ29tbUJyZWFrCShVU0VSLjIxMSkKICovCklOVDE2IFdJTkFQSSBDbGVhckNvbW1CcmVhazE2KElOVDE2IGNpZCkKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKICAgIAlUUkFDRSgiY2lkPSVkXG4iLCBjaWQpOwoJaWYgKCEocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpKSB7CgkJRklYTUUoIm5vIGNpZD0lZCBmb3VuZCFcbiIsIGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoJcHRyLT5zdXNwZW5kZWQgPSAwOwoJcHRyLT5jb21tZXJyb3IgPSAwOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglFc2NhcGVDb21tRnVuY3Rpb24JKFVTRVIuMjE0KQogKi8KTE9ORyBXSU5BUEkgRXNjYXBlQ29tbUZ1bmN0aW9uMTYoVUlOVDE2IGNpZCxVSU5UMTYgbkZ1bmN0aW9uKQp7CglzdHJ1Y3QgIERvc0RldmljZVN0cnVjdCAqcHRyOwoJaW50CW1heDsKCiAgICAJVFJBQ0UoImNpZD0lZCwgZnVuY3Rpb249JWRcbiIsIGNpZCwgbkZ1bmN0aW9uKTsKCglzd2l0Y2gobkZ1bmN0aW9uKSB7CgljYXNlIEdFVE1BWENPTToKCSAgICAgICAgVFJBQ0UoIkdFVE1BWENPTVxuIik7CgkJZm9yIChtYXggPSBNQVhfUE9SVFM7IVZhbGlkQ09NUG9ydChtYXgpO21heC0tKQoJCQk7CgkJcmV0dXJuIG1heDsKCgljYXNlIEdFVE1BWExQVDoKCQlUUkFDRSgiR0VUTUFYTFBUXG4iKTsKCQlmb3IgKG1heCA9IE1BWF9QT1JUUzshVmFsaWRMUFRQb3J0KG1heCk7bWF4LS0pCgkJCTsKCQlyZXR1cm4gRkxBR19MUFQgKyBtYXg7CgoJY2FzZSBHRVRCQVNFSVJROgoJCVRSQUNFKCJHRVRCQVNFSVJRXG4iKTsKCQkvKiBGSVhNRTogdXNlIHRhYmxlcyAqLwoJCS8qIGp1c3QgZmFrZSBzb21ldGhpbmcgZm9yIG5vdyAqLwoJCWlmIChjaWQgJiBGTEFHX0xQVCkgewoJCQkvKiBMUFQxOiBpcnEgNywgTFBUMjogaXJxIDUgKi8KCQkJcmV0dXJuIChjaWQgJiAweDdmKSA/IDUgOiA3OwoJCX0gZWxzZSB7CgkJCS8qIENPTTE6IGlycSA0LCBDT00yOiBpcnEgMywKCQkJICAgQ09NMzogaXJxIDQsIENPTTQ6IGlycSAzICovCgkJCXJldHVybiA0IC0gKGNpZCAmIDEpOwoJCX0KCX0KCglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGNpZD0lZCBmb3VuZCFcbiIsIGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoKCXN3aXRjaCAobkZ1bmN0aW9uKSB7CgljYXNlIFJFU0VUREVWOgoJY2FzZSBDTFJEVFI6CgljYXNlIENMUlJUUzoKCWNhc2UgU0VURFRSOgoJY2FzZSBTRVRSVFM6CgljYXNlIFNFVFhPRkY6CgljYXNlIFNFVFhPTjoKCQlpZihFc2NhcGVDb21tRnVuY3Rpb24ocHRyLT5oYW5kbGUsbkZ1bmN0aW9uKSkKCQkJcmV0dXJuIDA7CgkJZWxzZSB7CgkJCXB0ci0+Y29tbWVycm9yID0gV2luRXJyb3IoKTsKCQkJcmV0dXJuIC0xOwoJCX0KCgljYXNlIENMUkJSRUFLOgoJY2FzZSBTRVRCUkVBSzoKCWRlZmF1bHQ6CgkJV0FSTigiKGNpZD0lZCxuRnVuY3Rpb249JWQpOiBVbmtub3duIGZ1bmN0aW9uXG4iLAoJCQljaWQsIG5GdW5jdGlvbik7Cgl9CglyZXR1cm4gLTE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglGbHVzaENvbW0JKFVTRVIuMjE1KQogKi8KSU5UMTYgV0lOQVBJIEZsdXNoQ29tbTE2KElOVDE2IGNpZCxJTlQxNiBmblF1ZXVlKQp7CglEV09SRCBxdWV1ZTsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCiAgICAJVFJBQ0UoImNpZD0lZCwgcXVldWU9JWRcbiIsIGNpZCwgZm5RdWV1ZSk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGNpZD0lZCBmb3VuZCFcbiIsIGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoJc3dpdGNoIChmblF1ZXVlKSB7CgljYXNlIDA6CgkJcXVldWUgPSBQVVJHRV9UWEFCT1JUOwoJCXB0ci0+b2J1Zl90YWlsID0gcHRyLT5vYnVmX2hlYWQ7CgkJYnJlYWs7CgljYXNlIDE6CgkJcXVldWUgPSBQVVJHRV9SWEFCT1JUOwoJCXB0ci0+aWJ1Zl9oZWFkID0gcHRyLT5pYnVmX3RhaWw7CgkJYnJlYWs7CglkZWZhdWx0OgoJCVdBUk4oIihjaWQ9JWQsZm5RdWV1ZT0lZCk6VW5rbm93biBxdWV1ZVxuIiwKCQkgICAgICAgICAgICBjaWQsIGZuUXVldWUpOwoJCXJldHVybiAtMTsKCX0KCglpZiAoIVB1cmdlQ29tbShwdHItPmhhbmRsZSxxdWV1ZSkpIHsKCQlwdHItPmNvbW1lcnJvciA9IFdpbkVycm9yKCk7CgkJcmV0dXJuIC0xOwoJfSBlbHNlIHsKCQlwdHItPmNvbW1lcnJvciA9IDA7CgkJcmV0dXJuIDA7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglHZXRDb21tRXJyb3IJKFVTRVIuMjAzKQogKi8KSU5UMTYgV0lOQVBJIEdldENvbW1FcnJvcjE2KElOVDE2IGNpZCxMUENPTVNUQVQxNiBscFN0YXQpCnsKCWludAkJdGVtcGVycm9yOwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwogICAgICAgIHVuc2lnbmVkIGNoYXIgKnN0b2w7CgoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBoYW5kbGUgZm9yIGNpZCA9ICUweCFcbiIsY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CiAgICAgICAgaWYgKGNpZCZGTEFHX0xQVCkgewogICAgICAgICAgICBXQVJOKCIgY2lkICVkIG5vdCBjb21tIHBvcnRcbiIsY2lkKTsKICAgICAgICAgICAgcmV0dXJuIENFX01PREU7CiAgICAgICAgfQogICAgICAgIHN0b2wgPSAodW5zaWduZWQgY2hhciAqKUNPTVtjaWRdLnVua25vd24gKyBDT01NX01TUl9PRkZTRVQ7CglDT01NX01TUlVwZGF0ZSggcHRyLT5oYW5kbGUsIHN0b2wgKTsKCglpZiAobHBTdGF0KSB7CgkJbHBTdGF0LT5zdGF0dXMgPSAwOwoKCQlTbGVlcEV4KDEsVFJVRSk7CgoJCWxwU3RhdC0+Y2JPdXRRdWUgPSBjb21tX291dGJ1ZihwdHIpOwoJCWxwU3RhdC0+Y2JJblF1ZSA9IGNvbW1faW5idWYocHRyKTsKCiAgICAJCVRSQUNFKCJjaWQgJWQsIGVycm9yICVkLCBzdGF0ICVkIGluICVkIG91dCAlZCwgc3RvbCAleFxuIiwKCQkJICAgICBjaWQsIHB0ci0+Y29tbWVycm9yLCBscFN0YXQtPnN0YXR1cywgbHBTdGF0LT5jYkluUXVlLAoJCQkgICAgIGxwU3RhdC0+Y2JPdXRRdWUsICpzdG9sKTsKCX0KCWVsc2UKCQlUUkFDRSgiY2lkICVkLCBlcnJvciAlZCwgbHBTdGF0IE5VTEwgc3RvbCAleFxuIiwKCQkJICAgICBjaWQsIHB0ci0+Y29tbWVycm9yLCAqc3RvbCk7CgoJLyogUmV0dXJuIGFueSBlcnJvcnMgYW5kIGNsZWFyIGl0ICovCgl0ZW1wZXJyb3IgPSBwdHItPmNvbW1lcnJvcjsKCXB0ci0+Y29tbWVycm9yID0gMDsKCXJldHVybih0ZW1wZXJyb3IpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU2V0Q29tbUV2ZW50TWFzawkoVVNFUi4yMDgpCiAqLwpTRUdQVFIgV0lOQVBJIFNldENvbW1FdmVudE1hc2sxNihJTlQxNiBjaWQsVUlOVDE2IGZ1RXZ0TWFzaykKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwogICAgICAgIHVuc2lnbmVkIGNoYXIgKnN0b2w7CgogICAgCVRSQUNFKCJjaWQgJWQsbWFzayAlZFxuIixjaWQsZnVFdnRNYXNrKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghXG4iLGNpZCk7CgkgICAgcmV0dXJuIChTRUdQVFIpTlVMTDsKCX0KCglwdHItPmV2ZW50bWFzayA9IGZ1RXZ0TWFzazsKCiAgICAgICAgaWYgKChjaWQmRkxBR19MUFQpIHx8ICFWYWxpZENPTVBvcnQoY2lkKSkgewogICAgICAgICAgICBXQVJOKCIgY2lkICVkIG5vdCBjb21tIHBvcnRcbiIsY2lkKTsKICAgICAgICAgICAgcmV0dXJuIChTRUdQVFIpTlVMTDsKICAgICAgICB9CiAgICAgICAgLyogaXQncyBhIENPTSBwb3J0ID8gLT4gbW9kaWZ5IGZsYWdzICovCiAgICAgICAgc3RvbCA9ICh1bnNpZ25lZCBjaGFyICopQ09NW2NpZF0udW5rbm93biArIENPTU1fTVNSX09GRlNFVDsKCUNPTU1fTVNSVXBkYXRlKCBwdHItPmhhbmRsZSwgc3RvbCApOwoKCVRSQUNFKCIgbW9kZW0gZGNkIGNvbnN0cnVjdCAleFxuIiwqc3RvbCk7CiAgICAgICAgaWYgKCFDT01bY2lkXS5zZWdfdW5rbm93bikgQ09NW2NpZF0uc2VnX3Vua25vd24gPSBNYXBMUyggQ09NW2NpZF0udW5rbm93biApOwogICAgICAgIHJldHVybiBDT01bY2lkXS5zZWdfdW5rbm93bjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUdldENvbW1FdmVudE1hc2sJKFVTRVIuMjA5KQogKi8KVUlOVDE2IFdJTkFQSSBHZXRDb21tRXZlbnRNYXNrMTYoSU5UMTYgY2lkLFVJTlQxNiBmbkV2dENsZWFyKQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CglXT1JEIGV2ZW50czsKCiAgICAJVFJBQ0UoImNpZCAlZCwgbWFzayAlZFxuIiwgY2lkLCBmbkV2dENsZWFyKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghXG4iLGNpZCk7CgkgICAgcmV0dXJuIDA7Cgl9CgogICAgICAgIGlmICgoY2lkJkZMQUdfTFBUKSB8fCAhVmFsaWRDT01Qb3J0KGNpZCkpIHsKICAgICAgICAgICAgV0FSTigiIGNpZCAlZCBub3QgY29tbSBwb3J0XG4iLGNpZCk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KCglldmVudHMgPSAqKFdPUkQqKShDT01bY2lkXS51bmtub3duKSAmIGZuRXZ0Q2xlYXI7CgkqKFdPUkQqKShDT01bY2lkXS51bmtub3duKSAmPSB+Zm5FdnRDbGVhcjsKCXJldHVybiBldmVudHM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTZXRDb21tU3RhdGUJKFVTRVIuMjAxKQogKi8KSU5UMTYgV0lOQVBJIFNldENvbW1TdGF0ZTE2KExQRENCMTYgbHBkY2IpCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCURDQiBkY2I7CgogICAgCVRSQUNFKCJjaWQgJWQsIHB0ciAlcFxuIiwgbHBkY2ItPklkLCBscGRjYik7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChscGRjYi0+SWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IVxuIixscGRjYi0+SWQpOwoJCXJldHVybiAtMTsKCX0KCgltZW1zZXQoJmRjYiwwLHNpemVvZihkY2IpKTsKCWRjYi5EQ0JsZW5ndGggPSBzaXplb2YoZGNiKTsKCgkvKgoJICogYWNjb3JkaW5nIHRvIE1TRE4sIHdlIHNob3VsZCBmaXJzdCBpbnRlcnByZXQgbHBkY2ItPkJhdWRSYXRlIGFzIGZvbGxvd3M6CgkgKiAxLiBpZiB0aGUgYmF1ZCByYXRlIGlzIGEgQ0JSIGNvbnN0YW50LCBpbnRlcnByZXQgaXQuCgkgKiAyLiBpZiBpdCBpcyBncmVhdGVyIHRoYW4gNTc2MDAsIHRoZSBiYXVkIHJhdGUgaXMgMTE1MjAwCgkgKiAzLiB1c2UgdGhlIGFjdHVhbCBiYXVkcmF0ZQoJICogc3RlcHMgMiBhbmQgMyBhcmUgZXF1aXZpbGVudCB0byAxNjU1MCBiYXVkcmF0ZSBkaXZpc29yID0gMTE1MjAwL0JhdWRSYXRlCgkgKiBzZWUgaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9zdXBwb3J0L2tiL2FydGljbGVzL3ExMDgvOS8yOC5hc3AKCSAqLwoJc3dpdGNoKGxwZGNiLT5CYXVkUmF0ZSkKCXsKCWNhc2UgQ0JSXzExMDogICAgZGNiLkJhdWRSYXRlID0gMTEwOyAgICBicmVhazsKCWNhc2UgQ0JSXzMwMDogICAgZGNiLkJhdWRSYXRlID0gMzAwOyAgICBicmVhazsKCWNhc2UgQ0JSXzYwMDogICAgZGNiLkJhdWRSYXRlID0gNjAwOyAgICBicmVhazsKCWNhc2UgQ0JSXzEyMDA6ICAgZGNiLkJhdWRSYXRlID0gMTIwMDsgICBicmVhazsKCWNhc2UgQ0JSXzI0MDA6ICAgZGNiLkJhdWRSYXRlID0gMjQwMDsgICBicmVhazsKCWNhc2UgQ0JSXzQ4MDA6ICAgZGNiLkJhdWRSYXRlID0gNDgwMDsgICBicmVhazsKCWNhc2UgQ0JSXzk2MDA6ICAgZGNiLkJhdWRSYXRlID0gOTYwMDsgICBicmVhazsKCWNhc2UgQ0JSXzE0NDAwOiAgZGNiLkJhdWRSYXRlID0gMTQ0MDA7ICBicmVhazsKCWNhc2UgQ0JSXzE5MjAwOiAgZGNiLkJhdWRSYXRlID0gMTkyMDA7ICBicmVhazsKCWNhc2UgQ0JSXzM4NDAwOiAgZGNiLkJhdWRSYXRlID0gMzg0MDA7ICBicmVhazsKCWNhc2UgQ0JSXzU2MDAwOiAgZGNiLkJhdWRSYXRlID0gNTYwMDA7ICBicmVhazsKCWNhc2UgQ0JSXzEyODAwMDogZGNiLkJhdWRSYXRlID0gMTI4MDAwOyBicmVhazsKCWNhc2UgQ0JSXzI1NjAwMDogZGNiLkJhdWRSYXRlID0gMjU2MDAwOyBicmVhazsKCWRlZmF1bHQ6CgkJaWYobHBkY2ItPkJhdWRSYXRlPjU3NjAwKQoJCWRjYi5CYXVkUmF0ZSA9IDExNTIwMDsKICAgICAgICBlbHNlCgkJZGNiLkJhdWRSYXRlID0gbHBkY2ItPkJhdWRSYXRlOwogCX0KCiAgICAgICAgZGNiLkJ5dGVTaXplPWxwZGNiLT5CeXRlU2l6ZTsKICAgICAgICBkY2IuU3RvcEJpdHM9bHBkY2ItPlN0b3BCaXRzOwoKCWRjYi5mUGFyaXR5PWxwZGNiLT5mUGFyaXR5OwoJZGNiLlBhcml0eT1scGRjYi0+UGFyaXR5OwoKCWRjYi5mT3V0eEN0c0Zsb3cgPSBscGRjYi0+Zk91dHhDdHNGbG93OwoKCWlmIChscGRjYi0+ZkR0cmZsb3cgfHwgbHBkY2ItPmZSdHNmbG93KQoJCWRjYi5mUnRzQ29udHJvbCA9IFRSVUU7CgoJaWYgKGxwZGNiLT5mRHRyRGlzYWJsZSkKCQlkY2IuZkR0ckNvbnRyb2wgPSBUUlVFOwoKCXB0ci0+ZXZ0Y2hhciA9IGxwZGNiLT5FdnRDaGFyOwoKCWRjYi5mSW5YID0gbHBkY2ItPmZJblg7CglkY2IuZk91dFggPSBscGRjYi0+Zk91dFg7CgoJaWYgKCFTZXRDb21tU3RhdGUocHRyLT5oYW5kbGUsJmRjYikpIHsKCQlwdHItPmNvbW1lcnJvciA9IFdpbkVycm9yKCk7CgkJcmV0dXJuIC0xOwoJfSBlbHNlIHsKCQlwdHItPmNvbW1lcnJvciA9IDA7CgkJcmV0dXJuIDA7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglHZXRDb21tU3RhdGUJKFVTRVIuMjAyKQogKi8KSU5UMTYgV0lOQVBJIEdldENvbW1TdGF0ZTE2KElOVDE2IGNpZCwgTFBEQ0IxNiBscGRjYikKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoJRENCIGRjYjsKCiAgICAJVFJBQ0UoImNpZCAlZCwgcHRyICVwXG4iLCBjaWQsIGxwZGNiKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghXG4iLGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoJaWYgKCFHZXRDb21tU3RhdGUocHRyLT5oYW5kbGUsJmRjYikpIHsKCQlwdHItPmNvbW1lcnJvciA9IFdpbkVycm9yKCk7CgkJcmV0dXJuIC0xOwoJfQoKCWxwZGNiLT5JZCA9IGNpZDsKCglDT01NMTZfRENCdG9EQ0IxNigmZGNiLGxwZGNiKTsKCglscGRjYi0+RXZ0Q2hhciA9IHB0ci0+ZXZ0Y2hhcjsKCglwdHItPmNvbW1lcnJvciA9IDA7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVRyYW5zbWl0Q29tbUNoYXIJKFVTRVIuMjA2KQogKi8KSU5UMTYgV0lOQVBJIFRyYW5zbWl0Q29tbUNoYXIxNihJTlQxNiBjaWQsQ0hBUiBjaFRyYW5zbWl0KQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CgogICAgCVRSQUNFKCJjaWQgJWQsIGRhdGEgJWQgXG4iLCBjaWQsIGNoVHJhbnNtaXQpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBoYW5kbGUgZm9yIGNpZCA9ICUweCFcbiIsY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKHB0ci0+c3VzcGVuZGVkKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBJRV9IQVJEV0FSRTsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKHB0ci0+eG1pdCA+PSAwKSB7CgkgIC8qIGNoYXJhY3RlciBhbHJlYWR5IHF1ZXVlZCAqLwoJICAvKiBGSVhNRTogd2hpY2ggZXJyb3Igd291bGQgV2luZG93cyByZXR1cm4/ICovCgkgIHB0ci0+Y29tbWVycm9yID0gQ0VfVFhGVUxMOwoJICByZXR1cm4gLTE7Cgl9CgoJaWYgKHB0ci0+b2J1Zl9oZWFkID09IHB0ci0+b2J1Zl90YWlsKSB7CgkgIC8qIHRyYW5zbWl0IHF1ZXVlIGVtcHR5LCB0cnkgdG8gdHJhbnNtaXQgZGlyZWN0bHkgKi8KCSAgaWYoMSE9Q09NTTE2X1dyaXRlRmlsZShwdHItPmhhbmRsZSwgJmNoVHJhbnNtaXQsIDEpKQoJICB7CgkgICAgLyogZGlkbid0IHdvcmssIHF1ZXVlIGl0ICovCgkgICAgcHRyLT54bWl0ID0gY2hUcmFuc21pdDsKCSAgICBjb21tX3dhaXR3cml0ZShwdHIpOwoJICB9Cgl9IGVsc2UgewoJICAvKiBkYXRhIGluIHF1ZXVlLCBsZXQgdGhpcyBjaGFyIGJlIHRyYW5zbWl0dGVkIG5leHQgKi8KCSAgcHRyLT54bWl0ID0gY2hUcmFuc21pdDsKCSAgY29tbV93YWl0d3JpdGUocHRyKTsKCX0KCglwdHItPmNvbW1lcnJvciA9IDA7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVVuZ2V0Q29tbUNoYXIJKFVTRVIuMjEyKQogKi8KSU5UMTYgV0lOQVBJIFVuZ2V0Q29tbUNoYXIxNihJTlQxNiBjaWQsQ0hBUiBjaFVuZ2V0KQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CgogICAgCVRSQUNFKCJjaWQgJWQgKGNoYXIgJWQpXG4iLCBjaWQsIGNoVW5nZXQpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBoYW5kbGUgZm9yIGNpZCA9ICUweCFcbiIsY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKHB0ci0+c3VzcGVuZGVkKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBJRV9IQVJEV0FSRTsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKHB0ci0+dW5nZXQ+PTApIHsKCSAgLyogY2hhcmFjdGVyIGFscmVhZHkgcXVldWVkICovCgkgIC8qIEZJWE1FOiB3aGljaCBlcnJvciB3b3VsZCBXaW5kb3dzIHJldHVybj8gKi8KCSAgcHRyLT5jb21tZXJyb3IgPSBDRV9SWE9WRVI7CgkgIHJldHVybiAtMTsKCX0KCglwdHItPnVuZ2V0ID0gY2hVbmdldDsKCglwdHItPmNvbW1lcnJvciA9IDA7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVJlYWRDb21tCShVU0VSLjIwNCkKICovCklOVDE2IFdJTkFQSSBSZWFkQ29tbTE2KElOVDE2IGNpZCxMUFNUUiBscHZCdWYsSU5UMTYgY2JSZWFkKQp7CglpbnQgc3RhdHVzLCBsZW5ndGg7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CglMUFNUUiBvcmdCdWYgPSBscHZCdWY7CgogICAgCVRSQUNFKCJjaWQgJWQsIHB0ciAlcCwgbGVuZ3RoICVkXG4iLCBjaWQsIGxwdkJ1ZiwgY2JSZWFkKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghXG4iLGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoKCWlmIChwdHItPnN1c3BlbmRlZCkgewoJCXB0ci0+Y29tbWVycm9yID0gSUVfSEFSRFdBUkU7CgkJcmV0dXJuIC0xOwoJfQoKCWlmKDA9PWNvbW1faW5idWYocHRyKSkKCQlTbGVlcEV4KDEsVFJVRSk7CgoJLyogcmVhZCB1bmdldCBjaGFyYWN0ZXIgKi8KCWlmIChwdHItPnVuZ2V0Pj0wKSB7CgkJKmxwdkJ1ZisrID0gcHRyLT51bmdldDsKCQlwdHItPnVuZ2V0ID0gLTE7CgoJCWxlbmd0aCA9IDE7Cgl9IGVsc2UKCSAJbGVuZ3RoID0gMDsKCgkvKiByZWFkIGZyb20gcmVjZWl2ZSBidWZmZXIgKi8KCXdoaWxlIChsZW5ndGggPCBjYlJlYWQpIHsKCSAgc3RhdHVzID0gKChwdHItPmlidWZfaGVhZCA8IHB0ci0+aWJ1Zl90YWlsKSA/CgkJICAgIHB0ci0+aWJ1Zl9zaXplIDogcHRyLT5pYnVmX2hlYWQpIC0gcHRyLT5pYnVmX3RhaWw7CgkgIGlmICghc3RhdHVzKSBicmVhazsKCSAgaWYgKChjYlJlYWQgLSBsZW5ndGgpIDwgc3RhdHVzKQoJICAgIHN0YXR1cyA9IGNiUmVhZCAtIGxlbmd0aDsKCgkgIG1lbWNweShscHZCdWYsIHB0ci0+aW5idWYgKyBwdHItPmlidWZfdGFpbCwgc3RhdHVzKTsKCSAgcHRyLT5pYnVmX3RhaWwgKz0gc3RhdHVzOwoJICBpZiAocHRyLT5pYnVmX3RhaWwgPj0gcHRyLT5pYnVmX3NpemUpCgkgICAgcHRyLT5pYnVmX3RhaWwgPSAwOwoJICBscHZCdWYgKz0gc3RhdHVzOwoJICBsZW5ndGggKz0gc3RhdHVzOwoJfQoKCVRSQUNFKCIlc1xuIiwgZGVidWdzdHJfYW4oIG9yZ0J1ZiwgbGVuZ3RoICkpOwoJcHRyLT5jb21tZXJyb3IgPSAwOwoJcmV0dXJuIGxlbmd0aDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVdyaXRlQ29tbQkoVVNFUi4yMDUpCiAqLwpJTlQxNiBXSU5BUEkgV3JpdGVDb21tMTYoSU5UMTYgY2lkLCBMUFNUUiBscHZCdWYsIElOVDE2IGNiV3JpdGUpCnsKCWludCBzdGF0dXMsIGxlbmd0aDsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCiAgICAJVFJBQ0UoImNpZCAlZCwgcHRyICVwLCBsZW5ndGggJWRcbiIsCgkJY2lkLCBscHZCdWYsIGNiV3JpdGUpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBoYW5kbGUgZm9yIGNpZCA9ICUweCFcbiIsY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKHB0ci0+c3VzcGVuZGVkKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBJRV9IQVJEV0FSRTsKCQlyZXR1cm4gLTE7Cgl9CgoJVFJBQ0UoIiVzXG4iLCBkZWJ1Z3N0cl9hbiggbHB2QnVmLCBjYldyaXRlICkpOwoKCWxlbmd0aCA9IDA7Cgl3aGlsZSAobGVuZ3RoIDwgY2JXcml0ZSkgewoJICBpZiAoKHB0ci0+b2J1Zl9oZWFkID09IHB0ci0+b2J1Zl90YWlsKSAmJiAocHRyLT54bWl0IDwgMCkpIHsKCSAgICAvKiBubyBkYXRhIHF1ZXVlZCwgdHJ5IHRvIHdyaXRlIGRpcmVjdGx5ICovCgkgICAgc3RhdHVzID0gQ09NTTE2X1dyaXRlRmlsZShwdHItPmhhbmRsZSwgbHB2QnVmLCBjYldyaXRlIC0gbGVuZ3RoKTsKCSAgICBpZiAoc3RhdHVzID4gMCkgewoJICAgICAgbHB2QnVmICs9IHN0YXR1czsKCSAgICAgIGxlbmd0aCArPSBzdGF0dXM7CgkgICAgICBjb250aW51ZTsKCSAgICB9CgkgIH0KCSAgLyogY2FuJ3Qgd3JpdGUgZGlyZWN0bHksIHB1dCBpbnRvIHRyYW5zbWl0IGJ1ZmZlciAqLwoJICBzdGF0dXMgPSAoKHB0ci0+b2J1Zl90YWlsID4gcHRyLT5vYnVmX2hlYWQpID8KCQkgICAgKHB0ci0+b2J1Zl90YWlsLTEpIDogcHRyLT5vYnVmX3NpemUpIC0gcHRyLT5vYnVmX2hlYWQ7CgkgIGlmICghc3RhdHVzKSBicmVhazsKCSAgaWYgKChjYldyaXRlIC0gbGVuZ3RoKSA8IHN0YXR1cykKCSAgICBzdGF0dXMgPSBjYldyaXRlIC0gbGVuZ3RoOwoJICBtZW1jcHkobHB2QnVmLCBwdHItPm91dGJ1ZiArIHB0ci0+b2J1Zl9oZWFkLCBzdGF0dXMpOwoJICBwdHItPm9idWZfaGVhZCArPSBzdGF0dXM7CgkgIGlmIChwdHItPm9idWZfaGVhZCA+PSBwdHItPm9idWZfc2l6ZSkKCSAgICBwdHItPm9idWZfaGVhZCA9IDA7CgkgIGxwdkJ1ZiArPSBzdGF0dXM7CgkgIGxlbmd0aCArPSBzdGF0dXM7CgkgIGNvbW1fd2FpdHdyaXRlKHB0cik7Cgl9CgoJcHRyLT5jb21tZXJyb3IgPSAwOwoJcmV0dXJuIGxlbmd0aDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBFbmFibGVDb21tTm90aWZpY2F0aW9uICAgKFVTRVIuMjQ1KQogKi8KQk9PTDE2IFdJTkFQSSBFbmFibGVDb21tTm90aWZpY2F0aW9uMTYoIElOVDE2IGNpZCwgSFdORDE2IGh3bmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMTYgY2JXcml0ZU5vdGlmeSwgSU5UMTYgY2JPdXRRdWV1ZSApCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCglUUkFDRSgiKCVkLCAleCwgJWQsICVkKVxuIiwgY2lkLCBod25kLCBjYldyaXRlTm90aWZ5LCBjYk91dFF1ZXVlKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghXG4iLGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoJcHRyLT53bmQgPSBXSU5fSGFuZGxlMzIoIGh3bmQgKTsKCXB0ci0+bl9yZWFkID0gY2JXcml0ZU5vdGlmeTsKCXB0ci0+bl93cml0ZSA9IGNiT3V0UXVldWU7CglyZXR1cm4gVFJVRTsKfQo=