IC8qCiAqIERFQyA5MyBFcmlrIEJvcyA8ZXJpa0B4czRhbGwubmw+CiAqCiAqIENvcHlyaWdodCAxOTk2IE1hcmN1cyBNZWlzc25lcgogKgogKiBNYXIgMzEsIDE5OTkuIE92ZSBL5XZlbiA8b3Zla0BhcmN0aWNuZXQubm8+CiAqIC0gSW1wbGVtZW50ZWQgYnVmZmVycyBhbmQgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbi4KICoKICogQXByIDMsIDE5OTkuICBMYXdzb24gV2hpdG5leSA8bGF3c29uX3doaXRuZXlAanVuby5jb20+CiAqIC0gRml4ZWQgdGhlIG1vZGVtIGNvbnRyb2wgcGFydCBvZiBFc2NhcGVDb21tRnVuY3Rpb24xNi4KICoKICogTWFyIDMsIDE5OTkuIE92ZSBL5XZlbiA8b3Zla0BhcmN0aWNuZXQubm8+CiAqIC0gVXNlIHBvcnQgaW5kaWNlcyBpbnN0ZWFkIG9mIHVuaXhmZHMgZm9yIHdpbjE2CiAqIC0gTW92ZWQgdGhpbmdzIGFyb3VuZCAoc2VwYXJhdGVkIHdpbjE2IGFuZCB3aW4zMiByb3V0aW5lcykKICogLSBBZGRlZCBzb21lIGhpbnRzIG9uIGhvdyB0byBpbXBsZW1lbnQgYnVmZmVycyBhbmQgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbi4KICoKICogTWF5IDI2LCAxOTk3LiAgRml4ZXMgYW5kIGNvbW1lbnRzIGJ5IFJpY2sgUmljaGFyZHNvbiA8cmlja0BkZ2lpLmNvbT4gW1JFUl0KICogLSBwdHItPmZkIHdhc24ndCBnZXR0aW5nIGNsZWFyZWQgb24gY2xvc2UuCiAqIC0gR2V0Q29tbUV2ZW50TWFzaygpIGFuZCBHZXRDb21tRXJyb3IoKSBkaWRuJ3QgZG8gbXVjaCBvZiBhbnl0aGluZy4KICogICBJTUhPLCB0aGV5IGFyZSBzdGlsbCB3cm9uZywgYnV0IHRoZXkgYXQgbGVhc3QgaW1wbGVtZW50IHRoZSBSWENIQVIKICogICBldmVudCBhbmQgcmV0dXJuIEkvTyBxdWV1ZSBzaXplcywgd2hpY2ggbWFrZXMgdGhlIGFwcCBJJ20gaW50ZXJlc3RlZAogKiAgIGluIChhbmFsb2cgZGV2aWNlcyBFWktJVCBEU1AgZGV2ZWxvcG1lbnQgc3lzdGVtKSB3b3JrLgogKgogKiBBdWd1c3QgMTIsIDE5OTcuICBUYWtlIGEgYmFzaCBhdCBTZXRDb21tRXZlbnRNYXNrIC0gTGF3c29uIFdoaXRuZXkKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhd3Nvbl93aGl0bmV5QGp1bm8uY29tPgogKiBKdWx5IDYsIDE5OTguIEZpeGVzIGFuZCBjb21tZW50cyBieSBWYWxlbnRpam4gU2Vzc2luawogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dnNlc3NpbmtAaWMudXZhLm5sPiBbVl0KICogT2t0b2JlciA5OCwgUmVpbiBLbGF6ZXMgW1JIS10KICogQSBwcm9ncmFtIHRoYXQgd2FudHMgdG8gbW9uaXRvciB0aGUgbW9kZW0gc3RhdHVzIGxpbmUgKFJMU0QvRENEKSBtYXkKICogcG9sbCB0aGUgbW9kZW0gc3RhdHVzIHJlZ2lzdGVyIGluIHRoZSBjb21tTWFzayBzdHJ1Y3R1cmUuIEkgdXBkYXRlIHRoZSBiaXQKICogaW4gR2V0Q29tbUVycm9yLCB3YWl0aW5nIGZvciBhbiBpbXBsZW1lbnRhdGlvbiBvZiBjb21tdW5pY2F0aW9uIGV2ZW50cy4KICogCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHRlcm1pb3MuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2lmZGVmIEhBVkVfU1RSSU5HU19ICiMgaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2lmZGVmIEhBVkVfU1lTX0ZJTElPX0gKIyBpbmNsdWRlIDxzeXMvZmlsaW8uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAiY29tbS5oIgojaWZkZWYgSEFWRV9TWVNfTU9ERU1fSAojIGluY2x1ZGUgPHN5cy9tb2RlbS5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX1NUUlRJT19ICiMgaW5jbHVkZSA8c3lzL3N0cnRpby5oPgojZW5kaWYKI2luY2x1ZGUgImhlYXAuaCIKI2luY2x1ZGUgIm9wdGlvbnMuaCIKCiNpbmNsdWRlICJzZXJ2ZXIuaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCiNpbmNsdWRlICJzZXJ2aWNlcy5oIgojaW5jbHVkZSAiY2FsbGJhY2suaCIKI2luY2x1ZGUgImZpbGUuaCIKCiNpbmNsdWRlICJkZWJ1Z3Rvb2xzLmgiCgpERUZBVUxUX0RFQlVHX0NIQU5ORUwoY29tbSk7CgojaWZuZGVmIFRJT0NJTlEKI2RlZmluZQlUSU9DSU5RIEZJT05SRUFECiNlbmRpZgoKLyogd2luZG93J3Mgc2VtaSBkb2N1bWVudGVkIG1vZGVtIHN0YXR1cyByZWdpc3RlciAqLwojZGVmaW5lIENPTU1fTVNSX09GRlNFVCAgMzUKI2RlZmluZSBNU1JfQ1RTICAweDEwCiNkZWZpbmUgTVNSX0RTUiAgMHgyMAojZGVmaW5lIE1TUl9SSSAgIDB4NDAKI2RlZmluZSBNU1JfUkxTRCAweDgwCiNkZWZpbmUgTVNSX01BU0sgKE1TUl9DVFN8TVNSX0RTUnxNU1JfUkl8TVNSX1JMU0QpCgojZGVmaW5lIEZMQUdfTFBUIDB4ODAKCiNpZmRlZiBsaW51eAojZGVmaW5lIENNU1BBUiAweDQwMDAwMDAwIC8qIHN0aWNrIHBhcml0eSAqLwojZW5kaWYKCnN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgQ09NW01BWF9QT1JUU107CnN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgTFBUW01BWF9QT1JUU107Ci8qIHBvaW50ZXJzIHRvIHVua25vd24oPT11bmRvY3VtZW50ZWQpIGNvbW0gc3RydWN0dXJlICovIApMUENWT0lEICp1bmtub3duW01BWF9QT1JUU107Ci8qIHNhdmUgdGVybWluYWwgc3RhdGVzICovCnN0YXRpYyBzdHJ1Y3QgdGVybWlvcyBtX3N0YXRbTUFYX1BPUlRTXTsKCi8qIHVwZGF0ZSB3aW5kb3cncyBzZW1pIGRvY3VtZW50ZWQgbW9kZW0gc3RhdHVzIHJlZ2lzdGVyICovCi8qIHNlZSBrbm93bGVkZ2UgYmFzZSBRMTAxNDE3ICovCnN0YXRpYyB2b2lkIENPTU1fTVNSVXBkYXRlKCBVQ0hBUiAqIHBNc3IsIHVuc2lnbmVkIGludCBtc3RhdCkKewogICAgVUNIQVIgdG1wbXNyPTA7CiAgICBpZihtc3RhdCAmIFRJT0NNX0NUUykgdG1wbXNyIHw9IE1TUl9DVFM7CiAgICBpZihtc3RhdCAmIFRJT0NNX0RTUikgdG1wbXNyIHw9IE1TUl9EU1I7CiAgICBpZihtc3RhdCAmIFRJT0NNX1JJKSAgdG1wbXNyIHw9IE1TUl9SSTsKICAgIGlmKG1zdGF0ICYgVElPQ01fQ0FSKSB0bXBtc3IgfD0gTVNSX1JMU0Q7CiAgICAqcE1zciA9ICgqcE1zciAmIH5NU1JfTUFTSykgfCB0bXBtc3I7Cn0KCnZvaWQgQ09NTV9Jbml0KHZvaWQpCnsKCWludCB4OwoJY2hhciBvcHRpb25bMTBdLCB0ZW1wWzI1Nl0sICpidGVtcDsKCXN0cnVjdCBzdGF0IHN0OwoKCWZvciAoeD0wOyB4IT1NQVhfUE9SVFM7IHgrKykgewoJCXN0cmNweShvcHRpb24sIkNPTXgiKTsKCQlvcHRpb25bM10gPSAnMScgKyB4OwoJCW9wdGlvbls0XSA9ICdcMCc7CgoJCVBST0ZJTEVfR2V0V2luZUluaVN0cmluZyggInNlcmlhbHBvcnRzIiwgb3B0aW9uLCAiKiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAsIHNpemVvZih0ZW1wKSApOwoJCWlmICghc3RyY21wKHRlbXAsICIqIikgfHwgKnRlbXAgPT0gJ1wwJykgCgkJCUNPTVt4XS5kZXZpY2VuYW1lID0gTlVMTDsKCQllbHNlIHsKCQkgIAlidGVtcCA9IHN0cmNocih0ZW1wLCcsJyk7CgkJCWlmIChidGVtcCAhPSBOVUxMKSB7CgkJCSAgCSpidGVtcCsrID0gJ1wwJzsKCQkJCUNPTVt4XS5iYXVkcmF0ZSA9IGF0b2koYnRlbXApOwoJCQl9IGVsc2UgewoJCQkJQ09NW3hdLmJhdWRyYXRlID0gLTE7CgkJCX0KCQkJc3RhdCh0ZW1wLCAmc3QpOwoJCQlpZiAoIVNfSVNDSFIoc3Quc3RfbW9kZSkpIAoJCQkJV0FSTigiQ2FuJ3QgdXNlIGAlcycgYXMgJXMgIVxuIiwgdGVtcCwgb3B0aW9uKTsKCQkJZWxzZQoJCQkJaWYgKChDT01beF0uZGV2aWNlbmFtZSA9IG1hbGxvYyhzdHJsZW4odGVtcCkrMSkpID09IE5VTEwpIAoJCQkJCVdBUk4oIkNhbid0IG1hbGxvYyBmb3IgZGV2aWNlIGluZm8hXG4iKTsKCQkJCWVsc2UgewoJCQkJCUNPTVt4XS5mZCA9IDA7CgkJCQkJc3RyY3B5KENPTVt4XS5kZXZpY2VuYW1lLCB0ZW1wKTsKCQkJCX0KICAgICAgICAgICAgICAgIFRSQUNFKCIlcyA9ICVzXG4iLCBvcHRpb24sIENPTVt4XS5kZXZpY2VuYW1lKTsKIAkJfQoKCQlzdHJjcHkob3B0aW9uLCAiTFBUeCIpOwoJCW9wdGlvblszXSA9ICcxJyArIHg7CgkJb3B0aW9uWzRdID0gJ1wwJzsKCgkJUFJPRklMRV9HZXRXaW5lSW5pU3RyaW5nKCAicGFyYWxsZWxwb3J0cyIsIG9wdGlvbiwgIioiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLCBzaXplb2YodGVtcCkgKTsKCQlpZiAoIXN0cmNtcCh0ZW1wLCAiKiIpIHx8ICp0ZW1wID09ICdcMCcpCgkJCUxQVFt4XS5kZXZpY2VuYW1lID0gTlVMTDsKCQllbHNlIHsKCQkJc3RhdCh0ZW1wLCAmc3QpOwoJCQlpZiAoIVNfSVNDSFIoc3Quc3RfbW9kZSkpIAoJCQkJV0FSTigiQ2FuJ3QgdXNlIGAlcycgYXMgJXMgIVxuIiwgdGVtcCwgb3B0aW9uKTsKCQkJZWxzZSAKCQkJCWlmICgoTFBUW3hdLmRldmljZW5hbWUgPSBtYWxsb2Moc3RybGVuKHRlbXApKzEpKSA9PSBOVUxMKSAKCQkJCQlXQVJOKCJDYW4ndCBtYWxsb2MgZm9yIGRldmljZSBpbmZvIVxuIik7CgkJCQllbHNlIHsKCQkJCQlMUFRbeF0uZmQgPSAwOwoJCQkJCXN0cmNweShMUFRbeF0uZGV2aWNlbmFtZSwgdGVtcCk7CgkJCQl9CiAgICAgICAgICAgICAgICBUUkFDRSgiJXMgPSAlc1xuIiwgb3B0aW9uLCBMUFRbeF0uZGV2aWNlbmFtZSk7CgkJfQoKCX0KfQoKCnN0YXRpYyBzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpHZXREZXZpY2VTdHJ1Y3QoaW50IGZkKQp7CglpZiAoKGZkJjB4N0YpPD1NQVhfUE9SVFMpIHsKICAgICAgICAgICAgaWYgKCEoZmQmRkxBR19MUFQpKSB7CgkJaWYgKENPTVtmZF0uZmQpCgkJICAgIHJldHVybiAmQ09NW2ZkXTsKCSAgICB9IGVsc2UgewoJCWZkICY9IDB4N2Y7CgkJaWYgKExQVFtmZF0uZmQpCgkJICAgIHJldHVybiAmTFBUW2ZkXTsKCSAgICB9Cgl9CgoJcmV0dXJuIE5VTEw7Cn0KCnN0YXRpYyBpbnQgICAgR2V0Q29tbVBvcnRfZmQoaW50IGZkKQp7CiAgICAgICAgaW50IHg7CiAgICAgICAgCiAgICAgICAgZm9yICh4PTA7IHg8TUFYX1BPUlRTOyB4KyspIHsKICAgICAgICAgICAgIGlmIChDT01beF0uZmQgPT0gZmQpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICB9CiAgICAgICAKICAgICAgIHJldHVybiAtMTsKfSAKCnN0YXRpYyBpbnQgVmFsaWRDT01Qb3J0KGludCB4KQp7CglyZXR1cm4oeCA8IE1BWF9QT1JUUyA/IChpbnQpIENPTVt4XS5kZXZpY2VuYW1lIDogMCk7IAp9CgpzdGF0aWMgaW50IFZhbGlkTFBUUG9ydChpbnQgeCkKewoJcmV0dXJuKHggPCBNQVhfUE9SVFMgPyAoaW50KSBMUFRbeF0uZGV2aWNlbmFtZSA6IDApOyAKfQoKc3RhdGljIGludCBXaW5FcnJvcih2b2lkKQp7CiAgICAgICAgVFJBQ0UoImVycm5vID0gJWRcbiIsIGVycm5vKTsKCXN3aXRjaCAoZXJybm8pIHsKCQlkZWZhdWx0OgoJCQlyZXR1cm4gQ0VfSU9FOwoJCX0KfQoKc3RhdGljIHVuc2lnbmVkIGNvbW1faW5idWYoc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyKQp7CiAgcmV0dXJuICgocHRyLT5pYnVmX3RhaWwgPiBwdHItPmlidWZfaGVhZCkgPyBwdHItPmlidWZfc2l6ZSA6IDApCiAgICArIHB0ci0+aWJ1Zl9oZWFkIC0gcHRyLT5pYnVmX3RhaWw7Cn0KCnN0YXRpYyB1bnNpZ25lZCBjb21tX291dGJ1ZihzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHIpCnsKICByZXR1cm4gKChwdHItPm9idWZfdGFpbCA+IHB0ci0+b2J1Zl9oZWFkKSA/IHB0ci0+b2J1Zl9zaXplIDogMCkKICAgICsgcHRyLT5vYnVmX2hlYWQgLSBwdHItPm9idWZfdGFpbDsKfQoKc3RhdGljIGludCBDT01NX1doYWNrTW9kZW0oaW50IGZkLCB1bnNpZ25lZCBpbnQgYW5keSwgdW5zaWduZWQgaW50IG9ycmllKQp7CiAgICB1bnNpZ25lZCBpbnQgbXN0YXQsIG9rYXk7CiAgICBva2F5ID0gaW9jdGwoZmQsIFRJT0NNR0VULCAmbXN0YXQpOwogICAgaWYgKG9rYXkpIHJldHVybiBva2F5OwogICAgaWYgKGFuZHkpIG1zdGF0ICY9IGFuZHk7CiAgICBtc3RhdCB8PSBvcnJpZTsKICAgIHJldHVybiBpb2N0bChmZCwgVElPQ01TRVQsICZtc3RhdCk7Cn0KCQpzdGF0aWMgdm9pZCBDQUxMQkFDSyBjb21tX25vdGlmaWNhdGlvbiggVUxPTkdfUFRSIHByaXZhdGUgKQp7CiAgc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyID0gKHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKilwcml2YXRlOwogIGludCBwcmV2LCBibGVmdCwgbGVuOwogIFdPUkQgbWFzayA9IDA7CiAgaW50IGNpZCA9IEdldENvbW1Qb3J0X2ZkKHB0ci0+ZmQpOwoKICBUUkFDRSgiYXN5bmMgbm90aWZpY2F0aW9uXG4iKTsKICAvKiByZWFkIGRhdGEgZnJvbSBjb21tIHBvcnQgKi8KICBwcmV2ID0gY29tbV9pbmJ1ZihwdHIpOwogIGRvIHsKICAgIGJsZWZ0ID0gKChwdHItPmlidWZfdGFpbCA+IHB0ci0+aWJ1Zl9oZWFkKSA/IChwdHItPmlidWZfdGFpbC0xKSA6IHB0ci0+aWJ1Zl9zaXplKQogICAgICAtIHB0ci0+aWJ1Zl9oZWFkOwogICAgbGVuID0gcmVhZChwdHItPmZkLCBwdHItPmluYnVmICsgcHRyLT5pYnVmX2hlYWQsIGJsZWZ0P2JsZWZ0OjEpOwogICAgaWYgKGxlbiA+IDApIHsKICAgICAgaWYgKCFibGVmdCkgewoJcHRyLT5jb21tZXJyb3IgPSBDRV9SWE9WRVI7CiAgICAgIH0gZWxzZSB7CgkvKiBjaGVjayBmb3IgZXZlbnRzICovCglpZiAoKHB0ci0+ZXZlbnRtYXNrICYgRVZfUlhGTEFHKSAmJgoJICAgIG1lbWNocihwdHItPmluYnVmICsgcHRyLT5pYnVmX2hlYWQsIHB0ci0+ZXZ0Y2hhciwgbGVuKSkgewoJICAqKFdPUkQqKSh1bmtub3duW2NpZF0pIHw9IEVWX1JYRkxBRzsKCSAgbWFzayB8PSBDTl9FVkVOVDsKCX0KCWlmIChwdHItPmV2ZW50bWFzayAmIEVWX1JYQ0hBUikgewoJICAqKFdPUkQqKSh1bmtub3duW2NpZF0pIHw9IEVWX1JYQ0hBUjsKCSAgbWFzayB8PSBDTl9FVkVOVDsKCX0KCS8qIGFkdmFuY2UgYnVmZmVyIHBvc2l0aW9uICovCglwdHItPmlidWZfaGVhZCArPSBsZW47CglpZiAocHRyLT5pYnVmX2hlYWQgPj0gcHRyLT5pYnVmX3NpemUpCgkgIHB0ci0+aWJ1Zl9oZWFkID0gMDsKICAgICAgfQogICAgfQogIH0gd2hpbGUgKGxlbiA+IDApOwogIC8qIGNoZWNrIGZvciBub3RpZmljYXRpb24gKi8KICBpZiAocHRyLT53bmQgJiYgKHB0ci0+bl9yZWFkPjApICYmIChwcmV2PHB0ci0+bl9yZWFkKSAmJgogICAgICAoY29tbV9pbmJ1ZihwdHIpPj1wdHItPm5fcmVhZCkpIHsKICAgIC8qIHBhc3NlZCB0aGUgcmVjZWl2ZSBub3RpZmljYXRpb24gdGhyZXNob2xkICovCiAgICBtYXNrIHw9IENOX1JFQ0VJVkU7CiAgfQoKICAvKiB3cml0ZSBhbnkgVHJhbnNtaXRDb21tQ2hhciBjaGFyYWN0ZXIgKi8KICBpZiAocHRyLT54bWl0Pj0wKSB7CiAgICBsZW4gPSB3cml0ZShwdHItPmZkLCAmKHB0ci0+eG1pdCksIDEpOwogICAgaWYgKGxlbiA+IDApIHB0ci0+eG1pdCA9IC0xOwogIH0KICAvKiB3cml0ZSBmcm9tIG91dHB1dCBxdWV1ZSAqLwogIHByZXYgPSBjb21tX291dGJ1ZihwdHIpOwogIGRvIHsKICAgIGJsZWZ0ID0gKChwdHItPm9idWZfdGFpbCA8PSBwdHItPm9idWZfaGVhZCkgPyBwdHItPm9idWZfaGVhZCA6IHB0ci0+b2J1Zl9zaXplKQogICAgICAtIHB0ci0+b2J1Zl90YWlsOwogICAgbGVuID0gYmxlZnQgPyB3cml0ZShwdHItPmZkLCBwdHItPm91dGJ1ZiArIHB0ci0+b2J1Zl90YWlsLCBibGVmdCkgOiAwOwogICAgaWYgKGxlbiA+IDApIHsKICAgICAgcHRyLT5vYnVmX3RhaWwgKz0gbGVuOwogICAgICBpZiAocHRyLT5vYnVmX3RhaWwgPj0gcHRyLT5vYnVmX3NpemUpCglwdHItPm9idWZfdGFpbCA9IDA7CiAgICAgIC8qIGZsYWcgZXZlbnQgKi8KICAgICAgaWYgKHB0ci0+b2J1Zl90YWlsID09IHB0ci0+b2J1Zl9oZWFkKSB7CglpZiAocHRyLT5zX3dyaXRlKSB7CgkgIFNFUlZJQ0VfRGVsZXRlKCBwdHItPnNfd3JpdGUgKTsKCSAgcHRyLT5zX3dyaXRlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Cgl9CiAgICAgICAgaWYgKHB0ci0+ZXZlbnRtYXNrICYgRVZfVFhFTVBUWSkgewoJICAqKFdPUkQqKSh1bmtub3duW2NpZF0pIHw9IEVWX1RYRU1QVFk7CgkgIG1hc2sgfD0gQ05fRVZFTlQ7Cgl9CiAgICAgIH0KICAgIH0KICB9IHdoaWxlIChsZW4gPiAwKTsKICAvKiBjaGVjayBmb3Igbm90aWZpY2F0aW9uICovCiAgaWYgKHB0ci0+d25kICYmIChwdHItPm5fd3JpdGU+MCkgJiYgKHByZXY+PXB0ci0+bl93cml0ZSkgJiYKICAgICAgKGNvbW1fb3V0YnVmKHB0cik8cHRyLT5uX3dyaXRlKSkgewogICAgLyogcGFzc2VkIHRoZSB0cmFuc21pdCBub3RpZmljYXRpb24gdGhyZXNob2xkICovCiAgICBtYXNrIHw9IENOX1RSQU5TTUlUOwogIH0KCiAgLyogc2VuZCBub3RpZmljYXRpb25zLCBpZiBhbnkgKi8KICBpZiAocHRyLT53bmQgJiYgbWFzaykgewogICAgVFJBQ0UoIm5vdGlmeWluZyAlMDR4OiBjaWQ9JWQsIG1hc2s9JTAyeFxuIiwgcHRyLT53bmQsIGNpZCwgbWFzayk7CiAgICBDYWxsb3V0LlBvc3RNZXNzYWdlQShwdHItPnduZCwgV01fQ09NTU5PVElGWSwgY2lkLCBtYXNrKTsKICB9Cn0KCnN0YXRpYyB2b2lkIGNvbW1fd2FpdHJlYWQoc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyKQp7CiAgaWYgKHB0ci0+c19yZWFkICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSByZXR1cm47CiAgcHRyLT5zX3JlYWQgPSBTRVJWSUNFX0FkZE9iamVjdCggRklMRV9EdXBVbml4SGFuZGxlKCBwdHItPmZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19SRUFEIHwgU1lOQ0hST05JWkUgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbV9ub3RpZmljYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVTE9OR19QVFIpcHRyICk7Cn0KCnN0YXRpYyB2b2lkIGNvbW1fd2FpdHdyaXRlKHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cikKewogIGlmIChwdHItPnNfd3JpdGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHJldHVybjsKICBwdHItPnNfd3JpdGUgPSBTRVJWSUNFX0FkZE9iamVjdCggRklMRV9EdXBVbml4SGFuZGxlKCBwdHItPmZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTkVSSUNfV1JJVEUgfCBTWU5DSFJPTklaRSApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbV9ub3RpZmljYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVUxPTkdfUFRSKXB0ciApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBCdWlsZENvbW1EQ0IJCShVU0VSLjIxMykKICoKICogQWNjb3JkaW5nIHRvIHRoZSBFQ01BLTIzNCAoMzY4LjMpIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiBGQUxTRSBvbiAKICogc3VjY2Vzcywgb3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuIC0xLiAKICogSUYgVEhJUyBJUyBOT1QgQ09SUkVDVCBUSEUgUkVUVVJOVkFMVUUgQ0hFQ0sgSU4gQnVpbGRDb21tRENCQW5kVGltZW91dHNBCiAqIE5FRURTIFRPIEJFIEZJWEVECiAqLwpCT09MMTYgV0lOQVBJIEJ1aWxkQ29tbURDQjE2KExQQ1NUUiBkZXZpY2UsIExQRENCMTYgbHBkY2IpCnsKCS8qICJDT00xOjk2MDAsbiw4LDEiCSovCgkvKiAgMDEyMzQ1CQkqLwoJaW50IHBvcnQ7CgljaGFyICpwdHIsIHRlbXBbMjU2XTsKCglUUkFDRSgiKCVzKSwgcHRyICVwXG4iLCBkZXZpY2UsIGxwZGNiKTsKCglpZiAoIWxzdHJuY21waUEoZGV2aWNlLCJDT00iLDMpKSB7CgkJcG9ydCA9IGRldmljZVszXSAtICcwJzsKCQoKCQlpZiAocG9ydC0tID09IDApIHsKCQkJRVJSKCJCVUcgISBDT00wIGNhbid0IGV4aXN0IS5cbiIpOwoJCQlyZXR1cm4gLTE7CgkJfQoKCQlpZiAoIVZhbGlkQ09NUG9ydChwb3J0KSkgewoJCQlGSVhNRSgiaW52YWxpZCBDT00gcG9ydCAlZD9cbiIscG9ydCk7CgkJCXJldHVybiAtMTsKCQl9CgkJCgkJbWVtc2V0KGxwZGNiLCAwLCBzaXplb2YoRENCMTYpKTsgLyogaW5pdGlhbGl6ZSAqLwoKCQlscGRjYi0+SWQgPSBwb3J0OwoJCQoJCWlmICghKihkZXZpY2UrNCkpCgkJCXJldHVybiAwOwoKCQlpZiAoKihkZXZpY2UrNCkgIT0gJzonKQoJCQlyZXR1cm4gLTE7CgkJCgkJc3RyY3B5KHRlbXAsZGV2aWNlKzUpOwoJCXB0ciA9IHN0cnRvayh0ZW1wLCAiLCAiKTsgCgoJCWlmIChDT01bcG9ydF0uYmF1ZHJhdGUgPiAwKQoJCQlscGRjYi0+QmF1ZFJhdGUgPSBDT01bcG9ydF0uYmF1ZHJhdGU7CgkJZWxzZQoJCQlscGRjYi0+QmF1ZFJhdGUgPSBhdG9pKHB0cik7CiAgICAgICAgCVRSQUNFKCJiYXVkcmF0ZSAoJWQpXG4iLCBscGRjYi0+QmF1ZFJhdGUpOwoKCQlwdHIgPSBzdHJ0b2soTlVMTCwgIiwgIik7CgkJaWYgKGlzbG93ZXIoKnB0cikpCgkJCSpwdHIgPSB0b3VwcGVyKCpwdHIpOwoKICAgICAgICAJVFJBQ0UoInBhcml0eSAoJWMpXG4iLCAqcHRyKTsKCQlscGRjYi0+ZlBhcml0eSA9IFRSVUU7CgkJc3dpdGNoICgqcHRyKSB7CgkJCWNhc2UgJ04nOgoJCQkJbHBkY2ItPlBhcml0eSA9IE5PUEFSSVRZOwoJCQkJbHBkY2ItPmZQYXJpdHkgPSBGQUxTRTsKCQkJCWJyZWFrOwkJCQoJCQljYXNlICdFJzoKCQkJCWxwZGNiLT5QYXJpdHkgPSBFVkVOUEFSSVRZOwoJCQkJYnJlYWs7CQkJCgkJCWNhc2UgJ00nOgoJCQkJbHBkY2ItPlBhcml0eSA9IE1BUktQQVJJVFk7CgkJCQlicmVhazsJCQkKCQkJY2FzZSAnTyc6CgkJCQlscGRjYi0+UGFyaXR5ID0gT0REUEFSSVRZOwoJCQkJYnJlYWs7CQkJCgkJCWRlZmF1bHQ6CgkJCQlXQVJOKCJVbmtub3duIHBhcml0eSBgJWMnIVxuIiwgKnB0cik7CgkJCQlyZXR1cm4gLTE7CgkJfQoKCQlwdHIgPSBzdHJ0b2soTlVMTCwgIiwgIik7IAogICAgICAgICAJVFJBQ0UoImNoYXJzaXplICglYylcbiIsICpwdHIpOwoJCWxwZGNiLT5CeXRlU2l6ZSA9ICpwdHIgLSAnMCc7CgoJCXB0ciA9IHN0cnRvayhOVUxMLCAiLCAiKTsKICAgICAgICAJVFJBQ0UoInN0b3BiaXRzICglYylcbiIsICpwdHIpOwoJCXN3aXRjaCAoKnB0cikgewoJCQljYXNlICcxJzoKCQkJCWxwZGNiLT5TdG9wQml0cyA9IE9ORVNUT1BCSVQ7CgkJCQlicmVhazsJCQkKCQkJY2FzZSAnMic6CgkJCQlscGRjYi0+U3RvcEJpdHMgPSBUV09TVE9QQklUUzsKCQkJCWJyZWFrOwkJCQoJCQlkZWZhdWx0OgoJCQkJV0FSTigiVW5rbm93biAjIG9mIHN0b3BiaXRzIGAlYychXG4iLCAqcHRyKTsKCQkJCXJldHVybiAtMTsKCQl9Cgl9CQoKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJT3BlbkNvbW0JCShVU0VSLjIwMCkKICovCklOVDE2IFdJTkFQSSBPcGVuQ29tbTE2KExQQ1NUUiBkZXZpY2UsVUlOVDE2IGNiSW5RdWV1ZSxVSU5UMTYgY2JPdXRRdWV1ZSkKewoJaW50IHBvcnQsZmQ7CgogICAgCVRSQUNFKCIlcywgJWQsICVkXG4iLCBkZXZpY2UsIGNiSW5RdWV1ZSwgY2JPdXRRdWV1ZSk7CgoJaWYgKHN0cmxlbihkZXZpY2UpIDwgNCkKCSAgIHJldHVybiBJRV9CQURJRDsKCglwb3J0ID0gZGV2aWNlWzNdIC0gJzAnOwoKCWlmIChwb3J0LS0gPT0gMCkKCQlFUlIoIkJVRyAhIENPTTAgb3IgTFBUMCBkb24ndCBleGlzdCAhXG4iKTsKCglpZiAoIWxzdHJuY21waUEoZGV2aWNlLCJDT00iLDMpKSB7CgkJCiAgICAgICAgICAgICAgICBUUkFDRSgiJXMgPSAlc1xuIiwgZGV2aWNlLCBDT01bcG9ydF0uZGV2aWNlbmFtZSk7CgoJCWlmICghVmFsaWRDT01Qb3J0KHBvcnQpKQoJCQlyZXR1cm4gSUVfQkFESUQ7CgoJCWlmIChDT01bcG9ydF0uZmQpCgkJCXJldHVybiBJRV9PUEVOOwoKCQlmZCA9IG9wZW4oQ09NW3BvcnRdLmRldmljZW5hbWUsIE9fUkRXUiB8IE9fTk9OQkxPQ0spOwoJCWlmIChmZCA9PSAtMSkgewoJCQlFUlIoIkNvdWxkbid0IG9wZW4gJXMgISAoJXMpXG4iLCBDT01bcG9ydF0uZGV2aWNlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKCQkJcmV0dXJuIElFX0hBUkRXQVJFOwoJCX0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25bcG9ydF0gPSBTRUdQVFJfQUxMT0MoNDApOwogICAgICAgICAgICAgICAgICAgICAgICBiemVybyh1bmtub3duW3BvcnRdLDQwKTsKCQkJQ09NW3BvcnRdLmZkID0gZmQ7CgkJCUNPTVtwb3J0XS5jb21tZXJyb3IgPSAwOwoJCQlDT01bcG9ydF0uZXZlbnRtYXNrID0gMDsKCQkJQ09NW3BvcnRdLmV2dGNoYXIgPSAwOyAvKiBGSVhNRTogZGVmYXVsdD8gKi8KICAgICAgICAgICAgICAgICAgICAgICAgLyogc2F2ZSB0ZXJtaW5hbCBzdGF0ZSAqLwogICAgICAgICAgICAgICAgICAgICAgICB0Y2dldGF0dHIoZmQsJm1fc3RhdFtwb3J0XSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCBkZWZhdWx0IHBhcmFtZXRlcnMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgaWYoQ09NW3BvcnRdLmJhdWRyYXRlPi0xKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDQjE2IGRjYjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldENvbW1TdGF0ZTE2KHBvcnQsICZkY2IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGNiLkJhdWRSYXRlPUNPTVtwb3J0XS5iYXVkcmF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vcmUgZGVmYXVsdHM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBkYXRhYml0cywgcGFyaXR5LCBzdG9wYml0cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRDb21tU3RhdGUxNiggJmRjYik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCQkJLyogaW5pdCBwcmlvcml0eSBjaGFyYWN0ZXJzICovCgkJCUNPTVtwb3J0XS51bmdldCA9IC0xOwoJCQlDT01bcG9ydF0ueG1pdCA9IC0xOwoJCQkvKiBhbGxvY2F0ZSBidWZmZXJzICovCgkJCUNPTVtwb3J0XS5pYnVmX3NpemUgPSBjYkluUXVldWU7CgkJCUNPTVtwb3J0XS5pYnVmX2hlYWQgPSBDT01bcG9ydF0uaWJ1Zl90YWlsPSAwOwoJCQlDT01bcG9ydF0ub2J1Zl9zaXplID0gY2JPdXRRdWV1ZTsKCQkJQ09NW3BvcnRdLm9idWZfaGVhZCA9IENPTVtwb3J0XS5vYnVmX3RhaWwgPSAwOwoKCQkJQ09NW3BvcnRdLmluYnVmID0gbWFsbG9jKGNiSW5RdWV1ZSk7CgkJCWlmIChDT01bcG9ydF0uaW5idWYpIHsKCQkJICBDT01bcG9ydF0ub3V0YnVmID0gbWFsbG9jKGNiT3V0UXVldWUpOwoJCQkgIGlmICghQ09NW3BvcnRdLm91dGJ1ZikKCQkJICAgIGZyZWUoQ09NW3BvcnRdLmluYnVmKTsKCQkJfSBlbHNlIENPTVtwb3J0XS5vdXRidWYgPSBOVUxMOwoJCQlpZiAoIUNPTVtwb3J0XS5vdXRidWYpIHsKCQkJICAvKiBub3QgZW5vdWdoIG1lbW9yeSAqLwoJCQkgIHRjc2V0YXR0cihDT01bcG9ydF0uZmQsVENTQU5PVywmbV9zdGF0W3BvcnRdKTsKCQkJICBjbG9zZShDT01bcG9ydF0uZmQpOwoJCQkgIEVSUigib3V0IG9mIG1lbW9yeVxuIik7CgkJCSAgcmV0dXJuIElFX01FTU9SWTsKCQkJfQoKICAgICAgICAgICAgICAgICAgICAgICAgQ09NW3BvcnRdLnNfcmVhZCA9IElOVkFMSURfSEFORExFX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICAgICBDT01bcG9ydF0uc193cml0ZSA9IElOVkFMSURfSEFORExFX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICAgICBjb21tX3dhaXRyZWFkKCAmQ09NW3BvcnRdICk7CgkJCXJldHVybiBwb3J0OwoJCX0KCX0gCgllbHNlIAoJaWYgKCFsc3RybmNtcGlBKGRldmljZSwiTFBUIiwzKSkgewoJCgkJaWYgKCFWYWxpZExQVFBvcnQocG9ydCkpCgkJCXJldHVybiBJRV9CQURJRDsKCgkJaWYgKExQVFtwb3J0XS5mZCkKCQkJcmV0dXJuIElFX09QRU47CgoJCWZkID0gb3BlbihMUFRbcG9ydF0uZGV2aWNlbmFtZSwgT19SRFdSIHwgT19OT05CTE9DSywgMCk7CgkJaWYgKGZkID09IC0xKSB7CgkJCXJldHVybiBJRV9IQVJEV0FSRTsKCQl9IGVsc2UgewoJCQlMUFRbcG9ydF0uZmQgPSBmZDsKCQkJTFBUW3BvcnRdLmNvbW1lcnJvciA9IDA7CgkJCUxQVFtwb3J0XS5ldmVudG1hc2sgPSAwOwoJCQlyZXR1cm4gcG9ydHxGTEFHX0xQVDsKCQl9Cgl9CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUNsb3NlQ29tbQkJKFVTRVIuMjA3KQogKi8KSU5UMTYgV0lOQVBJIENsb3NlQ29tbTE2KElOVDE2IGNpZCkKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwogICAgICAgIAogICAgCVRSQUNFKCJjaWQ9JWRcbiIsIGNpZCk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGNpZD0lZCBmb3VuZCFcbiIsIGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoJaWYgKCEoY2lkJkZMQUdfTFBUKSkgewoJCS8qIENPTSBwb3J0ICovCgkJU0VHUFRSX0ZSRUUodW5rbm93bltjaWRdKTsgLyogW0xXXSAqLwoKCQlTRVJWSUNFX0RlbGV0ZSggQ09NW2NpZF0uc193cml0ZSApOwoJCVNFUlZJQ0VfRGVsZXRlKCBDT01bY2lkXS5zX3JlYWQgKTsKCQkvKiBmcmVlIGJ1ZmZlcnMgKi8KCQlmcmVlKHB0ci0+b3V0YnVmKTsKCQlmcmVlKHB0ci0+aW5idWYpOwoKCQkvKiByZXNldCBtb2RlbSBsaW5lcyAqLwoJCXRjc2V0YXR0cihwdHItPmZkLFRDU0FOT1csJm1fc3RhdFtjaWRdKTsKCX0KCglpZiAoY2xvc2UocHRyLT5mZCkgPT0gLTEpIHsKCQlwdHItPmNvbW1lcnJvciA9IFdpbkVycm9yKCk7CgkJLyogRklYTUU6IHNob3VsZCB3ZSBjbGVhciBwdHItPmZkIGhlcmU/ICovCgkJcmV0dXJuIC0xOwoJfSBlbHNlIHsKCQlwdHItPmNvbW1lcnJvciA9IDA7CgkJcHRyLT5mZCA9IDA7CgkJcmV0dXJuIDA7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTZXRDb21tQnJlYWsJCShVU0VSLjIxMCkKICovCklOVDE2IFdJTkFQSSBTZXRDb21tQnJlYWsxNihJTlQxNiBjaWQpCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCglUUkFDRSgiY2lkPSVkXG4iLCBjaWQpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBjaWQ9JWQgZm91bmQhXG4iLCBjaWQpOwoJCXJldHVybiAtMTsKCX0KCglwdHItPnN1c3BlbmRlZCA9IDE7CglwdHItPmNvbW1lcnJvciA9IDA7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUNsZWFyQ29tbUJyZWFrCQkoVVNFUi4yMTEpCiAqLwpJTlQxNiBXSU5BUEkgQ2xlYXJDb21tQnJlYWsxNihJTlQxNiBjaWQpCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCiAgICAJVFJBQ0UoImNpZD0lZFxuIiwgY2lkKTsKCWlmICghKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSkgewoJCUZJWE1FKCJubyBjaWQ9JWQgZm91bmQhXG4iLCBjaWQpOwoJCXJldHVybiAtMTsKCX0KCXB0ci0+c3VzcGVuZGVkID0gMDsKCXB0ci0+Y29tbWVycm9yID0gMDsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJRXNjYXBlQ29tbUZ1bmN0aW9uCShVU0VSLjIxNCkKICovCkxPTkcgV0lOQVBJIEVzY2FwZUNvbW1GdW5jdGlvbjE2KFVJTlQxNiBjaWQsVUlOVDE2IG5GdW5jdGlvbikKewoJaW50CW1heDsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCXN0cnVjdCB0ZXJtaW9zIHBvcnQ7CgogICAgCVRSQUNFKCJjaWQ9JWQsIGZ1bmN0aW9uPSVkXG4iLCBjaWQsIG5GdW5jdGlvbik7CglpZiAoKG5GdW5jdGlvbiAhPSBHRVRNQVhDT00pICYmIChuRnVuY3Rpb24gIT0gR0VUTUFYTFBUKSkgewoJCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQkJRklYTUUoIm5vIGNpZD0lZCBmb3VuZCFcbiIsIGNpZCk7CgkJCXJldHVybiAtMTsKCQl9CgkJaWYgKHRjZ2V0YXR0cihwdHItPmZkLCZwb3J0KSA9PSAtMSkgewoJCSAgICAgICAgVFJBQ0UoInRjZ2V0YXR0ciBmYWlsZWRcbiIpOwoJCQlwdHItPmNvbW1lcnJvcj1XaW5FcnJvcigpOwkKCQkJcmV0dXJuIC0xOwoJCX0KCX0gZWxzZSBwdHIgPSBOVUxMOwoKCXN3aXRjaCAobkZ1bmN0aW9uKSB7CgkJY2FzZSBSRVNFVERFVjoKCQkgICAgICAgIFRSQUNFKCJSRVNFVERFVlxuIik7CgkJCWJyZWFrOwkJCQkJCgoJCWNhc2UgR0VUTUFYQ09NOgoJCSAgICAgICAgVFJBQ0UoIkdFVE1BWENPTVxuIik7IAoJCQlmb3IgKG1heCA9IE1BWF9QT1JUUzshQ09NW21heF0uZGV2aWNlbmFtZTttYXgtLSkKCQkJCTsKCQkJcmV0dXJuIG1heDsKCQkJYnJlYWs7CgoJCWNhc2UgR0VUTUFYTFBUOgoJCSAgICAgICAgVFJBQ0UoIkdFVE1BWExQVFxuIik7IAoJCQlmb3IgKG1heCA9IE1BWF9QT1JUUzshTFBUW21heF0uZGV2aWNlbmFtZTttYXgtLSkKCQkJCTsKCQkJcmV0dXJuIEZMQUdfTFBUICsgbWF4OwoJCQlicmVhazsKCgkJY2FzZSBHRVRCQVNFSVJROgoJCSAgICAgICAgVFJBQ0UoIkdFVEJBU0VJUlFcbiIpOyAKCQkJLyogRklYTUU6IHVzZSB0YWJsZXMgKi8KCQkJLyoganVzdCBmYWtlIHNvbWV0aGluZyBmb3Igbm93ICovCgkJCWlmIChjaWQgJiBGTEFHX0xQVCkgewoJCQkJLyogTFBUMTogaXJxIDcsIExQVDI6IGlycSA1ICovCgkJCQlyZXR1cm4gKGNpZCAmIDB4N2YpID8gNSA6IDc7CgkJCX0gZWxzZSB7CgkJCQkvKiBDT00xOiBpcnEgNCwgQ09NMjogaXJxIDMsCgkJCQkgICBDT00zOiBpcnEgNCwgQ09NNDogaXJxIDMgKi8KCQkJCXJldHVybiA0IC0gKGNpZCAmIDEpOwoJCQl9CgkJCWJyZWFrOwoKCQljYXNlIENMUkRUUjoKCQkgICAgICAgIFRSQUNFKCJDTFJEVFJcbiIpOyAKI2lmZGVmIFRJT0NNX0RUUgoJCQlyZXR1cm4gQ09NTV9XaGFja01vZGVtKHB0ci0+ZmQsIH5USU9DTV9EVFIsIDApOwojZW5kaWYKCQljYXNlIENMUlJUUzoKCQkgICAgICAgIFRSQUNFKCJDTFJSVFNcbiIpOyAKI2lmZGVmIFRJT0NNX1JUUwoJCQlyZXR1cm4gQ09NTV9XaGFja01vZGVtKHB0ci0+ZmQsIH5USU9DTV9SVFMsIDApOwojZW5kaWYKCQoJCWNhc2UgU0VURFRSOgoJCSAgICAgICAgVFJBQ0UoIlNFVERUUlxuIik7IAojaWZkZWYgVElPQ01fRFRSCgkJCXJldHVybiBDT01NX1doYWNrTW9kZW0ocHRyLT5mZCwgMCwgVElPQ01fRFRSKTsKI2VuZGlmCgoJCWNhc2UgU0VUUlRTOgoJCSAgICAgICAgVFJBQ0UoIlNFVFJUU1xuIik7IAojaWZkZWYgVElPQ01fUlRTCQkJCgkJCXJldHVybiBDT01NX1doYWNrTW9kZW0ocHRyLT5mZCwgMCwgVElPQ01fUlRTKTsKI2VuZGlmCgoJCWNhc2UgU0VUWE9GRjoKCQkgICAgICAgIFRSQUNFKCJTRVRYT0ZGXG4iKTsgCgkJCXBvcnQuY19pZmxhZyB8PSBJWE9GRjsKCQkJYnJlYWs7CgoJCWNhc2UgU0VUWE9OOgoJCSAgICAgICAgVFJBQ0UoIlNFVFhPTlxuIik7IAoJCQlwb3J0LmNfaWZsYWcgfD0gSVhPTjsKCQkJYnJlYWs7CgoJCWRlZmF1bHQ6CgkJCVdBUk4oIihjaWQ9JWQsbkZ1bmN0aW9uPSVkKTogVW5rbm93biBmdW5jdGlvblxuIiwgCgkJCWNpZCwgbkZ1bmN0aW9uKTsKCQkJYnJlYWs7CQkJCQoJfQoJCglpZiAodGNzZXRhdHRyKHB0ci0+ZmQsIFRDU0FEUkFJTiwgJnBvcnQpID09IC0xKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBXaW5FcnJvcigpOwoJCXJldHVybiAtMTsJCgl9IGVsc2UgewoJCXB0ci0+Y29tbWVycm9yID0gMDsKCQlyZXR1cm4gMDsKCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUZsdXNoQ29tbQkoVVNFUi4yMTUpCiAqLwpJTlQxNiBXSU5BUEkgRmx1c2hDb21tMTYoSU5UMTYgY2lkLElOVDE2IGZuUXVldWUpCnsKCWludCBxdWV1ZTsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCiAgICAJVFJBQ0UoImNpZD0lZCwgcXVldWU9JWRcbiIsIGNpZCwgZm5RdWV1ZSk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGNpZD0lZCBmb3VuZCFcbiIsIGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoJc3dpdGNoIChmblF1ZXVlKSB7CgkJY2FzZSAwOgoJCSAgcXVldWUgPSBUQ09GTFVTSDsKCQkgIHB0ci0+b2J1Zl90YWlsID0gcHRyLT5vYnVmX2hlYWQ7CgkJICBicmVhazsKCQljYXNlIDE6CgkJICBxdWV1ZSA9IFRDSUZMVVNIOwoJCSAgcHRyLT5pYnVmX2hlYWQgPSBwdHItPmlidWZfdGFpbDsKCQkgIGJyZWFrOwoJCWRlZmF1bHQ6CgkJICBXQVJOKCIoY2lkPSVkLGZuUXVldWU9JWQpOlVua25vd24gcXVldWVcbiIsIAoJCSAgICAgICAgICAgIGNpZCwgZm5RdWV1ZSk7CgkJICByZXR1cm4gLTE7CgkJfQoJaWYgKHRjZmx1c2gocHRyLT5mZCwgcXVldWUpKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBXaW5FcnJvcigpOwoJCXJldHVybiAtMTsJCgl9IGVsc2UgewoJCXB0ci0+Y29tbWVycm9yID0gMDsKCQlyZXR1cm4gMDsKCX0KfSAgCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJR2V0Q29tbUVycm9yCShVU0VSLjIwMykKICovCklOVDE2IFdJTkFQSSBHZXRDb21tRXJyb3IxNihJTlQxNiBjaWQsTFBDT01TVEFUMTYgbHBTdGF0KQp7CglpbnQJCXRlbXBlcnJvcjsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKICAgICAgICB1bnNpZ25lZCBjaGFyICpzdG9sOwogICAgICAgIHVuc2lnbmVkIGludCBtc3RhdDsKCglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IS5cbiIsY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CiAgICAgICAgaWYgKGNpZCZGTEFHX0xQVCkgewogICAgICAgICAgICBXQVJOKCIgY2lkICVkIG5vdCBjb21tIHBvcnRcbiIsY2lkKTsKICAgICAgICAgICAgcmV0dXJuIENFX01PREU7CiAgICAgICAgfQogICAgICAgIHN0b2wgPSAodW5zaWduZWQgY2hhciAqKXVua25vd25bY2lkXSArIENPTU1fTVNSX09GRlNFVDsKICAgICAgICBpb2N0bChwdHItPmZkLFRJT0NNR0VULCZtc3RhdCk7CiAgICAgICAgQ09NTV9NU1JVcGRhdGUoIHN0b2wsIG1zdGF0KTsKCglpZiAobHBTdGF0KSB7CgkJbHBTdGF0LT5zdGF0dXMgPSAwOwoKCQlscFN0YXQtPmNiT3V0UXVlID0gY29tbV9vdXRidWYocHRyKTsKCQlscFN0YXQtPmNiSW5RdWUgPSBjb21tX2luYnVmKHB0cik7CgogICAgCQlUUkFDRSgiY2lkICVkLCBlcnJvciAlZCwgbHBTdGF0ICVkICVkICVkIHN0b2wgJXhcbiIsCgkJCSAgICAgY2lkLCBwdHItPmNvbW1lcnJvciwgbHBTdGF0LT5zdGF0dXMsIGxwU3RhdC0+Y2JJblF1ZSwgCgkJCSAgICAgbHBTdGF0LT5jYk91dFF1ZSwgKnN0b2wpOwoJfQoJZWxzZQoJCVRSQUNFKCJjaWQgJWQsIGVycm9yICVkLCBscFN0YXQgTlVMTCBzdG9sICV4XG4iLAoJCQkgICAgIGNpZCwgcHRyLT5jb21tZXJyb3IsICpzdG9sKTsKCgkvKiBSZXR1cm4gYW55IGVycm9ycyBhbmQgY2xlYXIgaXQgKi8KCXRlbXBlcnJvciA9IHB0ci0+Y29tbWVycm9yOwoJcHRyLT5jb21tZXJyb3IgPSAwOwoJcmV0dXJuKHRlbXBlcnJvcik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTZXRDb21tRXZlbnRNYXNrCShVU0VSLjIwOCkKICovClNFR1BUUiBXSU5BUEkgU2V0Q29tbUV2ZW50TWFzazE2KElOVDE2IGNpZCxVSU5UMTYgZnVFdnRNYXNrKQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CiAgICAgICAgdW5zaWduZWQgY2hhciAqc3RvbDsKICAgICAgICBpbnQgcmVwaWQ7CiAgICAgICAgdW5zaWduZWQgaW50IG1zdGF0OwoKICAgIAlUUkFDRSgiY2lkICVkLG1hc2sgJWRcbiIsY2lkLGZ1RXZ0TWFzayk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IS5cbiIsY2lkKTsKCSAgICByZXR1cm4gKFNFR1BUUilOVUxMOwoJfQoKCXB0ci0+ZXZlbnRtYXNrID0gZnVFdnRNYXNrOwoKICAgICAgICBpZiAoKGNpZCZGTEFHX0xQVCkgfHwgIVZhbGlkQ09NUG9ydChjaWQpKSB7CiAgICAgICAgICAgIFdBUk4oIiBjaWQgJWQgbm90IGNvbW0gcG9ydFxuIixjaWQpOwogICAgICAgICAgICByZXR1cm4gKFNFR1BUUilOVUxMOwogICAgICAgIH0KICAgICAgICAvKiBpdCdzIGEgQ09NIHBvcnQgPyAtPiBtb2RpZnkgZmxhZ3MgKi8KICAgICAgICBzdG9sID0gKHVuc2lnbmVkIGNoYXIgKil1bmtub3duW2NpZF0gKyBDT01NX01TUl9PRkZTRVQ7CglyZXBpZCA9IGlvY3RsKHB0ci0+ZmQsVElPQ01HRVQsJm1zdGF0KTsKCVRSQUNFKCIgaW9jdGwgICVkLCBtc3IgJXggYXQgJXAgJXBcbiIscmVwaWQsbXN0YXQsc3RvbCx1bmtub3duW2NpZF0pOwogICAgICAgIENPTU1fTVNSVXBkYXRlKCBzdG9sLCBtc3RhdCk7CgoJVFJBQ0UoIiBtb2RlbSBkY2QgY29uc3RydWN0ICV4XG4iLCpzdG9sKTsKCXJldHVybiBTRUdQVFJfR0VUKHVua25vd25bY2lkXSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglHZXRDb21tRXZlbnRNYXNrCShVU0VSLjIwOSkKICovClVJTlQxNiBXSU5BUEkgR2V0Q29tbUV2ZW50TWFzazE2KElOVDE2IGNpZCxVSU5UMTYgZm5FdnRDbGVhcikKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoJV09SRCBldmVudHM7CgogICAgCVRSQUNFKCJjaWQgJWQsIG1hc2sgJWRcbiIsIGNpZCwgZm5FdnRDbGVhcik7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IS5cbiIsY2lkKTsKCSAgICByZXR1cm4gMDsKCX0KCiAgICAgICAgaWYgKChjaWQmRkxBR19MUFQpIHx8ICFWYWxpZENPTVBvcnQoY2lkKSkgewogICAgICAgICAgICBXQVJOKCIgY2lkICVkIG5vdCBjb21tIHBvcnRcbiIsY2lkKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQoKCWV2ZW50cyA9ICooV09SRCopKHVua25vd25bY2lkXSkgJiBmbkV2dENsZWFyOwoJKihXT1JEKikodW5rbm93bltjaWRdKSAmPSB+Zm5FdnRDbGVhcjsKCXJldHVybiBldmVudHM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTZXRDb21tU3RhdGUxNgkoVVNFUi4yMDEpCiAqLwpJTlQxNiBXSU5BUEkgU2V0Q29tbVN0YXRlMTYoTFBEQ0IxNiBscGRjYikKewoJc3RydWN0IHRlcm1pb3MgcG9ydDsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKICAgICAgICBpbnQgYnl0ZXNpemUsIHN0b3BiaXRzOwogICAgICAgIGludCBmYWlsPTA7CgogICAgCVRSQUNFKCJjaWQgJWQsIHB0ciAlcFxuIiwgbHBkY2ItPklkLCBscGRjYik7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChscGRjYi0+SWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IS5cbiIsbHBkY2ItPklkKTsKCQlyZXR1cm4gLTE7Cgl9CglpZiAodGNnZXRhdHRyKHB0ci0+ZmQsICZwb3J0KSA9PSAtMSkgewoJCXB0ci0+Y29tbWVycm9yID0gV2luRXJyb3IoKTsJCgkJcmV0dXJuIC0xOwoJfQoKCXBvcnQuY19jY1tWTUlOXSA9IDA7Cglwb3J0LmNfY2NbVlRJTUVdID0gMTsKCiNpZmRlZiBJTUFYQkVMCglwb3J0LmNfaWZsYWcgJj0gfihJU1RSSVB8QlJLSU5UfElHTkNSfElDUk5MfElOTENSfElNQVhCRUwpOwojZWxzZQoJcG9ydC5jX2lmbGFnICY9IH4oSVNUUklQfEJSS0lOVHxJR05DUnxJQ1JOTHxJTkxDUik7CiNlbmRpZgoJcG9ydC5jX2lmbGFnIHw9IChJR05CUkspOwoKCXBvcnQuY19vZmxhZyAmPSB+KE9QT1NUKTsKCglwb3J0LmNfY2ZsYWcgJj0gfihIVVBDTCk7Cglwb3J0LmNfY2ZsYWcgfD0gQ0xPQ0FMIHwgQ1JFQUQ7CgoJcG9ydC5jX2xmbGFnICY9IH4oSUNBTk9OfEVDSE98SVNJRyk7Cglwb3J0LmNfbGZsYWcgfD0gTk9GTFNIOwoKICAgIAlUUkFDRSgiYmF1ZHJhdGUgJWRcbiIsbHBkY2ItPkJhdWRSYXRlKTsKI2lmZGVmIENCQVVECglwb3J0LmNfY2ZsYWcgJj0gfkNCQVVEOwoJc3dpdGNoIChscGRjYi0+QmF1ZFJhdGUpIHsKCQljYXNlIDExMDoKCQljYXNlIENCUl8xMTA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMTEwOwoJCQlicmVhazsJCQoJCWNhc2UgMzAwOgoJCWNhc2UgQ0JSXzMwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIzMDA7CgkJCWJyZWFrOwkJCgkJY2FzZSA2MDA6CgkJY2FzZSBDQlJfNjAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjYwMDsKCQkJYnJlYWs7CQkKCQljYXNlIDEyMDA6CgkJY2FzZSBDQlJfMTIwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIxMjAwOwoJCQlicmVhazsJCQoJCWNhc2UgMjQwMDoKCQljYXNlIENCUl8yNDAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjI0MDA7CgkJCWJyZWFrOwkJCgkJY2FzZSA0ODAwOgoJCWNhc2UgQ0JSXzQ4MDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCNDgwMDsKCQkJYnJlYWs7CQkKCQljYXNlIDk2MDA6CgkJY2FzZSBDQlJfOTYwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI5NjAwOwoJCQlicmVhazsJCQoJCWNhc2UgMTkyMDA6CgkJY2FzZSBDQlJfMTkyMDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMTkyMDA7CgkJCWJyZWFrOwkJCgkJY2FzZSAzODQwMDoKCQljYXNlIENCUl8zODQwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIzODQwMDsKCQkJYnJlYWs7CQkKI2lmZGVmIEI1NzYwMAoJCWNhc2UgNTc2MDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCNTc2MDA7CgkJCWJyZWFrOwkJCiNlbmRpZgojaWZkZWYgQjExNTIwMAoJCWNhc2UgNTc2MDE6CgkJCXBvcnQuY19jZmxhZyB8PSBCMTE1MjAwOwoJCQlicmVhazsJCQojZW5kaWYKCQlkZWZhdWx0OgoJCQlwdHItPmNvbW1lcnJvciA9IElFX0JBVURSQVRFOwoJCQlmYWlsPTE7Cgl9CiNlbGlmICFkZWZpbmVkKF9fRU1YX18pCiAgICAgICAgc3dpdGNoIChscGRjYi0+QmF1ZFJhdGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgMTEwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMTEwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjExMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDMwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzMwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIzMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA2MDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl82MDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCNjAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMTIwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzEyMDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMTIwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDI0MDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl8yNDAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjI0MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA0ODAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfNDgwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEI0ODAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgOTYwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzk2MDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCOTYwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDE5MjAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMTkyMDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMTkyMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAzODQwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzM4NDAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjM4NDAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHB0ci0+Y29tbWVycm9yID0gSUVfQkFVRFJBVEU7CiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWw9MTsKICAgICAgICB9CiAgICAgICAgcG9ydC5jX2lzcGVlZCA9IHBvcnQuY19vc3BlZWQ7CiNlbmRpZgogICAgICAgIGJ5dGVzaXplPWxwZGNiLT5CeXRlU2l6ZTsKICAgICAgICBzdG9wYml0cz1scGRjYi0+U3RvcEJpdHM7CgogICAgCVRSQUNFKCJmUGFyaXR5ICVkIFBhcml0eSAlZFxuIixscGRjYi0+ZlBhcml0eSwgbHBkY2ItPlBhcml0eSk7CiNpZmRlZiBDTVNQQVIKCXBvcnQuY19jZmxhZyAmPSB+KFBBUkVOQiB8IFBBUk9ERCB8IENNU1BBUik7CiNlbHNlCglwb3J0LmNfY2ZsYWcgJj0gfihQQVJFTkIgfCBQQVJPREQpOwojZW5kaWYKCWlmIChscGRjYi0+ZlBhcml0eSkKICAgICAgICAgICAgcG9ydC5jX2lmbGFnIHw9IElOUENLOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcG9ydC5jX2lmbGFnICY9IH5JTlBDSzsKICAgICAgICBzd2l0Y2ggKGxwZGNiLT5QYXJpdHkpIHsKICAgICAgICAgICAgICAgIGNhc2UgTk9QQVJJVFk6CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBPRERQQVJJVFk6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19jZmxhZyB8PSAoUEFSRU5CIHwgUEFST0REKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIEVWRU5QQVJJVFk6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19jZmxhZyB8PSBQQVJFTkI7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwojaWZkZWYgQ01TUEFSCiAgICAgICAgICAgICAgICAvKiBMaW51eCBkZWZpbmVzIG1hcmsvc3BhY2UgKHN0aWNrKSBwYXJpdHkgKi8KICAgICAgICAgICAgICAgIGNhc2UgTUFSS1BBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX2NmbGFnIHw9IChQQVJFTkIgfCBDTVNQQVIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgU1BBQ0VQQVJJVFk6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19jZmxhZyB8PSAoUEFSRU5CIHwgUEFST0REIHwgIENNU1BBUik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwojZWxzZQogICAgICAgICAgICAgICAgLyogdHJ5IHRoZSBQT1NJWCB3YXkgKi8KICAgICAgICAgICAgICAgIGNhc2UgTUFSS1BBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHN0b3BiaXRzID09IE9ORVNUT1BCSVQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BiaXRzID0gVFdPU1RPUEJJVFM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfaWZsYWcgJj0gfklOUENLOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyLT5jb21tZXJyb3IgPSBJRV9CWVRFU0laRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWw9MTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgU1BBQ0VQQVJJVFk6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBieXRlc2l6ZSA8IDgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzaXplICs9MTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19pZmxhZyAmPSB+SU5QQ0s7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHItPmNvbW1lcnJvciA9IElFX0JZVEVTSVpFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbD0xOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwojZW5kaWYKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHB0ci0+Y29tbWVycm9yID0gSUVfQllURVNJWkU7CiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWw9MTsKICAgICAgICB9CgkKICAgIAlUUkFDRSgiYnl0ZXNpemUgJWRcbiIsYnl0ZXNpemUpOwoJcG9ydC5jX2NmbGFnICY9IH5DU0laRTsKCXN3aXRjaCAoYnl0ZXNpemUpIHsKCQljYXNlIDU6CgkJCXBvcnQuY19jZmxhZyB8PSBDUzU7CgkJCWJyZWFrOwoJCWNhc2UgNjoKCQkJcG9ydC5jX2NmbGFnIHw9IENTNjsKCQkJYnJlYWs7CgkJY2FzZSA3OgoJCQlwb3J0LmNfY2ZsYWcgfD0gQ1M3OwoJCQlicmVhazsKCQljYXNlIDg6CgkJCXBvcnQuY19jZmxhZyB8PSBDUzg7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCXB0ci0+Y29tbWVycm9yID0gSUVfQllURVNJWkU7CgkJCWZhaWw9MTsKCX0KCiAgICAJVFJBQ0UoInN0b3BiaXRzICVkXG4iLHN0b3BiaXRzKTsKCglzd2l0Y2ggKHN0b3BiaXRzKSB7CgkJY2FzZSBPTkVTVE9QQklUOgoJCQkJcG9ydC5jX2NmbGFnICY9IH5DU1RPUEI7CgkJCQlicmVhazsKCQljYXNlIE9ORTVTVE9QQklUUzogLyogd2lsIGJlIHNlbGVjdGVkIGlmIGJ5dGVzaXplIGlzIDUgKi8KCQljYXNlIFRXT1NUT1BCSVRTOgoJCQkJcG9ydC5jX2NmbGFnIHw9IENTVE9QQjsKCQkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCXB0ci0+Y29tbWVycm9yID0gSUVfQllURVNJWkU7CgkJCWZhaWw9MTsKCX0KI2lmZGVmIENSVFNDVFMKCglpZiAobHBkY2ItPmZEdHJmbG93IHx8IGxwZGNiLT5mUnRzZmxvdyB8fCBscGRjYi0+Zk91dHhDdHNGbG93KQoJCXBvcnQuY19jZmxhZyB8PSBDUlRTQ1RTOwoKCWlmIChscGRjYi0+ZkR0ckRpc2FibGUpIAoJCXBvcnQuY19jZmxhZyAmPSB+Q1JUU0NUUzsKI2VuZGlmCQoJaWYgKGxwZGNiLT5mSW5YKQoJCXBvcnQuY19pZmxhZyB8PSBJWE9OOwoJZWxzZQoJCXBvcnQuY19pZmxhZyAmPSB+SVhPTjsKCWlmIChscGRjYi0+Zk91dFgpCgkJcG9ydC5jX2lmbGFnIHw9IElYT0ZGOwoJZWxzZQoJCXBvcnQuY19pZmxhZyAmPSB+SVhPRkY7CgoJcHRyLT5ldnRjaGFyID0gbHBkY2ItPkV2dENoYXI7CgogICAgICAgIGlmKGZhaWwpCiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAKCWlmICh0Y3NldGF0dHIocHRyLT5mZCwgVENTQURSQUlOLCAmcG9ydCkgPT0gLTEpIHsKCQlwdHItPmNvbW1lcnJvciA9IFdpbkVycm9yKCk7CQoJCXJldHVybiAtMTsKCX0gZWxzZSB7CgkJcHRyLT5jb21tZXJyb3IgPSAwOwoJCXJldHVybiAwOwoJfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJR2V0Q29tbVN0YXRlCShVU0VSLjIwMikKICovCklOVDE2IFdJTkFQSSBHZXRDb21tU3RhdGUxNihJTlQxNiBjaWQsIExQRENCMTYgbHBkY2IpCnsKCWludCBzcGVlZDsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCXN0cnVjdCB0ZXJtaW9zIHBvcnQ7CgogICAgCVRSQUNFKCJjaWQgJWQsIHB0ciAlcFxuIiwgY2lkLCBscGRjYik7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IS5cbiIsY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CglpZiAodGNnZXRhdHRyKHB0ci0+ZmQsICZwb3J0KSA9PSAtMSkgewoJCXB0ci0+Y29tbWVycm9yID0gV2luRXJyb3IoKTsJCgkJcmV0dXJuIC0xOwoJfQoJbHBkY2ItPklkID0gY2lkOwojaWZuZGVmIF9fRU1YX18KI2lmZGVmIENCQVVECiAgICAgICAgc3BlZWQgPSBwb3J0LmNfY2ZsYWcgJiBDQkFVRDsKI2Vsc2UKICAgICAgICBzcGVlZCA9IHBvcnQuY19vc3BlZWQ7CiNlbmRpZgogICAgICAgIHN3aXRjaChzcGVlZCkgewoJCWNhc2UgQjExMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMTEwOwoJCQlicmVhazsKCQljYXNlIEIzMDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDMwMDsKCQkJYnJlYWs7CgkJY2FzZSBCNjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSA2MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjEyMDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDEyMDA7CgkJCWJyZWFrOwoJCWNhc2UgQjI0MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDI0MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjQ4MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDQ4MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjk2MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDk2MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjE5MjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSAxOTIwMDsKCQkJYnJlYWs7CgkJY2FzZSBCMzg0MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDM4NDAwOwoJCQlicmVhazsKI2lmZGVmIEI1NzYwMAoJCWNhc2UgQjU3NjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSA1NzYwMDsKCQkJYnJlYWs7CiNlbmRpZgojaWZkZWYgQjExNTIwMAoJCWNhc2UgQjExNTIwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gNTc2MDE7CgkJCWJyZWFrOwojZW5kaWYKCX0KI2VuZGlmCglzd2l0Y2ggKHBvcnQuY19jZmxhZyAmIENTSVpFKSB7CgkJY2FzZSBDUzU6CgkJCWxwZGNiLT5CeXRlU2l6ZSA9IDU7CgkJCWJyZWFrOwoJCWNhc2UgQ1M2OgoJCQlscGRjYi0+Qnl0ZVNpemUgPSA2OwoJCQlicmVhazsKCQljYXNlIENTNzoKCQkJbHBkY2ItPkJ5dGVTaXplID0gNzsKCQkJYnJlYWs7CgkJY2FzZSBDUzg6CgkJCWxwZGNiLT5CeXRlU2l6ZSA9IDg7CgkJCWJyZWFrOwoJfQkKCQogICAgICAgIGlmKHBvcnQuY19pZmxhZyAmIElOUENLKQogICAgICAgICAgICBscGRjYi0+ZlBhcml0eSA9IFRSVUU7CiAgICAgICAgZWxzZQogICAgICAgICAgICBscGRjYi0+ZlBhcml0eSA9IEZBTFNFOwojaWZkZWYgQ01TUEFSCglzd2l0Y2ggKHBvcnQuY19jZmxhZyAmIChQQVJFTkIgfCBQQVJPREQgfCBDTVNQQVIpKQojZWxzZQoJc3dpdGNoIChwb3J0LmNfY2ZsYWcgJiAoUEFSRU5CIHwgUEFST0REKSkKI2VuZGlmCgl7CgkJY2FzZSAwOgoJCQlscGRjYi0+UGFyaXR5ID0gTk9QQVJJVFk7CgkJCWJyZWFrOwoJCWNhc2UgUEFSRU5COgoJCQlscGRjYi0+UGFyaXR5ID0gRVZFTlBBUklUWTsKCQkJYnJlYWs7CgkJY2FzZSAoUEFSRU5CIHwgUEFST0REKToKCQkJbHBkY2ItPlBhcml0eSA9IE9ERFBBUklUWTsJCQoJCQlicmVhazsKI2lmZGVmIENNU1BBUgoJCWNhc2UgKFBBUkVOQiB8IENNU1BBUik6CgkJCWxwZGNiLT5QYXJpdHkgPSBNQVJLUEFSSVRZOwkJCgkJCWJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAoUEFSRU5CIHwgUEFST0REIHwgQ01TUEFSKToKCQkJbHBkY2ItPlBhcml0eSA9IFNQQUNFUEFSSVRZOwkJCgkJCWJyZWFrOwojZW5kaWYKCX0KCglpZiAocG9ydC5jX2NmbGFnICYgQ1NUT1BCKQogICAgICAgICAgICBpZihscGRjYi0+Qnl0ZVNpemUgPT0gNSkKICAgICAgICAgICAgICAgIGxwZGNiLT5TdG9wQml0cyA9IE9ORTVTVE9QQklUUzsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgbHBkY2ItPlN0b3BCaXRzID0gVFdPU1RPUEJJVFM7CgllbHNlCiAgICAgICAgICAgIGxwZGNiLT5TdG9wQml0cyA9IE9ORVNUT1BCSVQ7CgoJbHBkY2ItPlJsc1RpbWVvdXQgPSA1MDsKCWxwZGNiLT5DdHNUaW1lb3V0ID0gNTA7IAoJbHBkY2ItPkRzclRpbWVvdXQgPSA1MDsKCWxwZGNiLT5mTnVsbCA9IDA7CglscGRjYi0+ZkNoRXZ0ID0gMDsKCWxwZGNiLT5mQmluYXJ5ID0gMTsKCWxwZGNiLT5mRHRyRGlzYWJsZSA9IDA7CgojaWZkZWYgQ1JUU0NUUwoKCWlmIChwb3J0LmNfY2ZsYWcgJiBDUlRTQ1RTKSB7CgkJbHBkY2ItPmZEdHJmbG93ID0gMTsKCQlscGRjYi0+ZlJ0c2Zsb3cgPSAxOwoJCWxwZGNiLT5mT3V0eEN0c0Zsb3cgPSAxOwoJCWxwZGNiLT5mT3V0eERzckZsb3cgPSAxOwoJfSBlbHNlIAojZW5kaWYKCQlscGRjYi0+ZkR0ckRpc2FibGUgPSAxOwoKCWlmIChwb3J0LmNfaWZsYWcgJiBJWE9OKQoJCWxwZGNiLT5mSW5YID0gMTsKCWVsc2UKCQlscGRjYi0+ZkluWCA9IDA7CgoJaWYgKHBvcnQuY19pZmxhZyAmIElYT0ZGKQoJCWxwZGNiLT5mT3V0WCA9IDE7CgllbHNlCgkJbHBkY2ItPmZPdXRYID0gMDsKLyoKCWxwZGNiLT5Yb25DaGFyID0gCglscGRjYi0+WG9mZkNoYXIgPSAKICovCglscGRjYi0+WG9uTGltID0gMTA7CglscGRjYi0+WG9mZkxpbSA9IDEwOwoKCWxwZGNiLT5FdnRDaGFyID0gcHRyLT5ldnRjaGFyOwoKCXB0ci0+Y29tbWVycm9yID0gMDsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJVHJhbnNtaXRDb21tQ2hhcgkoVVNFUi4yMDYpCiAqLwpJTlQxNiBXSU5BUEkgVHJhbnNtaXRDb21tQ2hhcjE2KElOVDE2IGNpZCxDSEFSIGNoVHJhbnNtaXQpCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCiAgICAJVFJBQ0UoImNpZCAlZCwgZGF0YSAlZCBcbiIsIGNpZCwgY2hUcmFuc21pdCk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IS5cbiIsY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKHB0ci0+c3VzcGVuZGVkKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBJRV9IQVJEV0FSRTsKCQlyZXR1cm4gLTE7Cgl9CQoKCWlmIChwdHItPnhtaXQgPj0gMCkgewoJICAvKiBjaGFyYWN0ZXIgYWxyZWFkeSBxdWV1ZWQgKi8KCSAgLyogRklYTUU6IHdoaWNoIGVycm9yIHdvdWxkIFdpbmRvd3MgcmV0dXJuPyAqLwoJICBwdHItPmNvbW1lcnJvciA9IENFX1RYRlVMTDsKCSAgcmV0dXJuIC0xOwoJfQoKCWlmIChwdHItPm9idWZfaGVhZCA9PSBwdHItPm9idWZfdGFpbCkgewoJICAvKiB0cmFuc21pdCBxdWV1ZSBlbXB0eSwgdHJ5IHRvIHRyYW5zbWl0IGRpcmVjdGx5ICovCgkgIGlmICh3cml0ZShwdHItPmZkLCAmY2hUcmFuc21pdCwgMSkgPT0gLTEpIHsKCSAgICAvKiBkaWRuJ3Qgd29yaywgcXVldWUgaXQgKi8KCSAgICBwdHItPnhtaXQgPSBjaFRyYW5zbWl0OwoJICAgIGNvbW1fd2FpdHdyaXRlKHB0cik7CgkgIH0KCX0gZWxzZSB7CgkgIC8qIGRhdGEgaW4gcXVldWUsIGxldCB0aGlzIGNoYXIgYmUgdHJhbnNtaXR0ZWQgbmV4dCAqLwoJICBwdHItPnhtaXQgPSBjaFRyYW5zbWl0OwoJICBjb21tX3dhaXR3cml0ZShwdHIpOwoJfQoKCXB0ci0+Y29tbWVycm9yID0gMDsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJVW5nZXRDb21tQ2hhcgkoVVNFUi4yMTIpCiAqLwpJTlQxNiBXSU5BUEkgVW5nZXRDb21tQ2hhcjE2KElOVDE2IGNpZCxDSEFSIGNoVW5nZXQpCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCiAgICAJVFJBQ0UoImNpZCAlZCAoY2hhciAlZClcbiIsIGNpZCwgY2hVbmdldCk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IS5cbiIsY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKHB0ci0+c3VzcGVuZGVkKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBJRV9IQVJEV0FSRTsKCQlyZXR1cm4gLTE7Cgl9CQoKCWlmIChwdHItPnVuZ2V0Pj0wKSB7CgkgIC8qIGNoYXJhY3RlciBhbHJlYWR5IHF1ZXVlZCAqLwoJICAvKiBGSVhNRTogd2hpY2ggZXJyb3Igd291bGQgV2luZG93cyByZXR1cm4/ICovCgkgIHB0ci0+Y29tbWVycm9yID0gQ0VfUlhPVkVSOwoJICByZXR1cm4gLTE7Cgl9CgoJcHRyLT51bmdldCA9IGNoVW5nZXQ7CgoJcHRyLT5jb21tZXJyb3IgPSAwOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglSZWFkQ29tbQkoVVNFUi4yMDQpCiAqLwpJTlQxNiBXSU5BUEkgUmVhZENvbW0xNihJTlQxNiBjaWQsTFBTVFIgbHB2QnVmLElOVDE2IGNiUmVhZCkKewoJaW50IHN0YXR1cywgbGVuZ3RoOwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoJTFBTVFIgb3JnQnVmID0gbHB2QnVmOwoKICAgIAlUUkFDRSgiY2lkICVkLCBwdHIgJXAsIGxlbmd0aCAlZFxuIiwgY2lkLCBscHZCdWYsIGNiUmVhZCk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IS5cbiIsY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKHB0ci0+c3VzcGVuZGVkKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBJRV9IQVJEV0FSRTsKCQlyZXR1cm4gLTE7Cgl9CQoKCS8qIHJlYWQgdW5nZXQgY2hhcmFjdGVyICovCglpZiAocHRyLT51bmdldD49MCkgewoJCSpscHZCdWYrKyA9IHB0ci0+dW5nZXQ7CgkJcHRyLT51bmdldCA9IC0xOwoKCQlsZW5ndGggPSAxOwoJfSBlbHNlCgkgCWxlbmd0aCA9IDA7CgoJLyogcmVhZCBmcm9tIHJlY2VpdmUgYnVmZmVyICovCgl3aGlsZSAobGVuZ3RoIDwgY2JSZWFkKSB7CgkgIHN0YXR1cyA9ICgocHRyLT5pYnVmX2hlYWQgPCBwdHItPmlidWZfdGFpbCkgPwoJCSAgICBwdHItPmlidWZfc2l6ZSA6IHB0ci0+aWJ1Zl9oZWFkKSAtIHB0ci0+aWJ1Zl90YWlsOwoJICBpZiAoIXN0YXR1cykgYnJlYWs7CgkgIGlmICgoY2JSZWFkIC0gbGVuZ3RoKSA8IHN0YXR1cykKCSAgICBzdGF0dXMgPSBjYlJlYWQgLSBsZW5ndGg7CgoJICBtZW1jcHkobHB2QnVmLCBwdHItPmluYnVmICsgcHRyLT5pYnVmX3RhaWwsIHN0YXR1cyk7CgkgIHB0ci0+aWJ1Zl90YWlsICs9IHN0YXR1czsKCSAgaWYgKHB0ci0+aWJ1Zl90YWlsID49IHB0ci0+aWJ1Zl9zaXplKQoJICAgIHB0ci0+aWJ1Zl90YWlsID0gMDsKCSAgbHB2QnVmICs9IHN0YXR1czsKCSAgbGVuZ3RoICs9IHN0YXR1czsKCX0KCglUUkFDRSgiJS4qc1xuIiwgbGVuZ3RoLCBvcmdCdWYpOwoJcHRyLT5jb21tZXJyb3IgPSAwOwoJcmV0dXJuIGxlbmd0aDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVdyaXRlQ29tbQkoVVNFUi4yMDUpCiAqLwpJTlQxNiBXSU5BUEkgV3JpdGVDb21tMTYoSU5UMTYgY2lkLCBMUFNUUiBscHZCdWYsIElOVDE2IGNiV3JpdGUpCnsKCWludCBzdGF0dXMsIGxlbmd0aDsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCiAgICAJVFJBQ0UoImNpZCAlZCwgcHRyICVwLCBsZW5ndGggJWRcbiIsIAoJCWNpZCwgbHB2QnVmLCBjYldyaXRlKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghLlxuIixjaWQpOwoJCXJldHVybiAtMTsKCX0KCglpZiAocHRyLT5zdXNwZW5kZWQpIHsKCQlwdHItPmNvbW1lcnJvciA9IElFX0hBUkRXQVJFOwoJCXJldHVybiAtMTsKCX0JCgkKCVRSQUNFKCIlLipzXG4iLCBjYldyaXRlLCBscHZCdWYgKTsKCglsZW5ndGggPSAwOwoJd2hpbGUgKGxlbmd0aCA8IGNiV3JpdGUpIHsKCSAgaWYgKChwdHItPm9idWZfaGVhZCA9PSBwdHItPm9idWZfdGFpbCkgJiYgKHB0ci0+eG1pdCA8IDApKSB7CgkgICAgLyogbm8gZGF0YSBxdWV1ZWQsIHRyeSB0byB3cml0ZSBkaXJlY3RseSAqLwoJICAgIHN0YXR1cyA9IHdyaXRlKHB0ci0+ZmQsIGxwdkJ1ZiwgY2JXcml0ZSAtIGxlbmd0aCk7CgkgICAgaWYgKHN0YXR1cyA+IDApIHsKCSAgICAgIGxwdkJ1ZiArPSBzdGF0dXM7CgkgICAgICBsZW5ndGggKz0gc3RhdHVzOwoJICAgICAgY29udGludWU7CgkgICAgfQoJICB9CgkgIC8qIGNhbid0IHdyaXRlIGRpcmVjdGx5LCBwdXQgaW50byB0cmFuc21pdCBidWZmZXIgKi8KCSAgc3RhdHVzID0gKChwdHItPm9idWZfdGFpbCA+IHB0ci0+b2J1Zl9oZWFkKSA/CgkJICAgIChwdHItPm9idWZfdGFpbC0xKSA6IHB0ci0+b2J1Zl9zaXplKSAtIHB0ci0+b2J1Zl9oZWFkOwoJICBpZiAoIXN0YXR1cykgYnJlYWs7CgkgIGlmICgoY2JXcml0ZSAtIGxlbmd0aCkgPCBzdGF0dXMpCgkgICAgc3RhdHVzID0gY2JXcml0ZSAtIGxlbmd0aDsKCSAgbWVtY3B5KGxwdkJ1ZiwgcHRyLT5vdXRidWYgKyBwdHItPm9idWZfaGVhZCwgc3RhdHVzKTsKCSAgcHRyLT5vYnVmX2hlYWQgKz0gc3RhdHVzOwoJICBpZiAocHRyLT5vYnVmX2hlYWQgPj0gcHRyLT5vYnVmX3NpemUpCgkgICAgcHRyLT5vYnVmX2hlYWQgPSAwOwoJICBscHZCdWYgKz0gc3RhdHVzOwoJICBsZW5ndGggKz0gc3RhdHVzOwoJICBjb21tX3dhaXR3cml0ZShwdHIpOwoJfQoKCXB0ci0+Y29tbWVycm9yID0gMDsJCglyZXR1cm4gbGVuZ3RoOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIEVuYWJsZUNvbW1Ob3RpZmljYXRpb24gICAoVVNFUi4yNDYpCiAqLwpCT09MMTYgV0lOQVBJIEVuYWJsZUNvbW1Ob3RpZmljYXRpb24xNiggSU5UMTYgY2lkLCBIV05EMTYgaHduZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQxNiBjYldyaXRlTm90aWZ5LCBJTlQxNiBjYk91dFF1ZXVlICkKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKCVRSQUNFKCIoJWQsICV4LCAlZCwgJWQpXG4iLCBjaWQsIGh3bmQsIGNiV3JpdGVOb3RpZnksIGNiT3V0UXVldWUpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBoYW5kbGUgZm9yIGNpZCA9ICUweCEuXG4iLGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoJcHRyLT53bmQgPSBod25kOwoJcHRyLT5uX3JlYWQgPSBjYldyaXRlTm90aWZ5OwoJcHRyLT5uX3dyaXRlID0gY2JPdXRRdWV1ZTsKCXJldHVybiBUUlVFOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgQnVpbGRDb21tRENCQQkJKEtFUk5FTDMyLjE0KQogKi8KQk9PTCBXSU5BUEkgQnVpbGRDb21tRENCQShMUENTVFIgZGV2aWNlLExQRENCIGxwZGNiKQp7CglyZXR1cm4gQnVpbGRDb21tRENCQW5kVGltZW91dHNBKGRldmljZSxscGRjYixOVUxMKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgQnVpbGRDb21tRENCQW5kVGltZW91dHNBCShLRVJORUwzMi4xNSkKICovCkJPT0wgV0lOQVBJIEJ1aWxkQ29tbURDQkFuZFRpbWVvdXRzQShMUENTVFIgZGV2aWNlLCBMUERDQiBscGRjYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENPTU1USU1FT1VUUyBscHRpbWVvdXRzKQp7CglpbnQJcG9ydDsKCWNoYXIJKnB0ciwqdGVtcDsKCglUUkFDRSgiKCVzLCVwLCVwKVxuIixkZXZpY2UsbHBkY2IsbHB0aW1lb3V0cyk7CgoJaWYgKCFsc3RybmNtcGlBKGRldmljZSwiQ09NIiwzKSkgewoJCXBvcnQ9ZGV2aWNlWzNdLScwJzsKCQlpZiAocG9ydC0tPT0wKSB7CgkJCUVSUigiQlVHISBDT00wIGNhbid0IGV4aXN0cyEuXG4iKTsKCQkJcmV0dXJuIEZBTFNFOwoJCX0KCQlpZiAoIVZhbGlkQ09NUG9ydChwb3J0KSkKCQkJcmV0dXJuIEZBTFNFOwoJCWlmICgqKGRldmljZSs0KSE9JzonKQoJCQlyZXR1cm4gRkFMU0U7CgkJdGVtcD0oTFBTVFIpKGRldmljZSs1KTsKCX0gZWxzZQoJCXRlbXA9KExQU1RSKWRldmljZTsKCglscGRjYi0+RENCbGVuZ3RoCT0gc2l6ZW9mKERDQik7CglpZiAoc3RyY2hyKHRlbXAsJywnKSkgewkvKiBvbGQgc3R5bGUgKi8KCQlEQ0IxNglkY2IxNjsKCQlCT09MMTYJcmV0OwoJCWNoYXIJbGFzdD10ZW1wW3N0cmxlbih0ZW1wKS0xXTsKCgkJcmV0PUJ1aWxkQ29tbURDQjE2KGRldmljZSwmZGNiMTYpOwoJCWlmIChyZXQpCgkJCXJldHVybiBGQUxTRTsKCQlscGRjYi0+QmF1ZFJhdGUJCT0gZGNiMTYuQmF1ZFJhdGU7CgkJbHBkY2ItPkJ5dGVTaXplCQk9IGRjYjE2LkJ5dGVTaXplOwoJCWxwZGNiLT5mQmluYXJ5CQk9IGRjYjE2LmZCaW5hcnk7CgkJbHBkY2ItPlBhcml0eQkJPSBkY2IxNi5QYXJpdHk7CgkJbHBkY2ItPmZQYXJpdHkJCT0gZGNiMTYuZlBhcml0eTsKCQlscGRjYi0+Zk51bGwJCT0gZGNiMTYuZk51bGw7CgkJbHBkY2ItPlN0b3BCaXRzCQk9IGRjYjE2LlN0b3BCaXRzOwoJCWlmIChsYXN0ID09ICd4JykgewoJCQlscGRjYi0+ZkluWAkJPSBUUlVFOwoJCQlscGRjYi0+Zk91dFgJCT0gVFJVRTsKCQkJbHBkY2ItPmZPdXR4Q3RzRmxvdwk9IEZBTFNFOwoJCQlscGRjYi0+Zk91dHhEc3JGbG93CT0gRkFMU0U7CgkJCWxwZGNiLT5mRHRyQ29udHJvbAk9IERUUl9DT05UUk9MX0VOQUJMRTsKCQkJbHBkY2ItPmZSdHNDb250cm9sCT0gUlRTX0NPTlRST0xfRU5BQkxFOwoJCX0gZWxzZSBpZiAobGFzdD09J3AnKSB7CgkJCWxwZGNiLT5mSW5YCQk9IEZBTFNFOwoJCQlscGRjYi0+Zk91dFgJCT0gRkFMU0U7CgkJCWxwZGNiLT5mT3V0eEN0c0Zsb3cJPSBUUlVFOwoJCQlscGRjYi0+Zk91dHhEc3JGbG93CT0gVFJVRTsKCQkJbHBkY2ItPmZEdHJDb250cm9sCT0gRFRSX0NPTlRST0xfSEFORFNIQUtFOwoJCQlscGRjYi0+ZlJ0c0NvbnRyb2wJPSBSVFNfQ09OVFJPTF9IQU5EU0hBS0U7CgkJfSBlbHNlIHsKCQkJbHBkY2ItPmZJblgJCT0gRkFMU0U7CgkJCWxwZGNiLT5mT3V0WAkJPSBGQUxTRTsKCQkJbHBkY2ItPmZPdXR4Q3RzRmxvdwk9IEZBTFNFOwoJCQlscGRjYi0+Zk91dHhEc3JGbG93CT0gRkFMU0U7CgkJCWxwZGNiLT5mRHRyQ29udHJvbAk9IERUUl9DT05UUk9MX0VOQUJMRTsKCQkJbHBkY2ItPmZSdHNDb250cm9sCT0gUlRTX0NPTlRST0xfRU5BQkxFOwoJCX0KCQlscGRjYi0+WG9uQ2hhcgk9IGRjYjE2LlhvbkNoYXI7CgkJbHBkY2ItPlhvZmZDaGFyCT0gZGNiMTYuWG9mZkNoYXI7CgkJbHBkY2ItPkVycm9yQ2hhcj0gZGNiMTYuUGVDaGFyOwoJCWxwZGNiLT5mRXJyb3JDaGFyPSBkY2IxNi5mUGVDaGFyOwoJCWxwZGNiLT5Fb2ZDaGFyCT0gZGNiMTYuRW9mQ2hhcjsKCQlscGRjYi0+RXZ0Q2hhcgk9IGRjYjE2LkV2dENoYXI7CgkJbHBkY2ItPlhvbkxpbQk9IGRjYjE2LlhvbkxpbTsKCQlscGRjYi0+WG9mZkxpbQk9IGRjYjE2LlhvZmZMaW07CgkJcmV0dXJuIFRSVUU7Cgl9CglwdHI9c3RydG9rKHRlbXAsIiAiKTsgCgl3aGlsZSAocHRyKSB7CgkJRFdPUkQJZmxhZyx4OwoKCQlmbGFnPTA7CgkJaWYgKCFzdHJuY21wKCJiYXVkPSIscHRyLDUpKSB7CgkJCWlmICghc3NjYW5mKHB0cis1LCIlbGQiLCZ4KSkKCQkJCVdBUk4oIkNvdWxkbid0IHBhcnNlICVzXG4iLHB0cik7CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IHg7CgkJCWZsYWc9MTsKCQl9CgkJaWYgKCFzdHJuY21wKCJzdG9wPSIscHRyLDUpKSB7CgkJCWlmICghc3NjYW5mKHB0cis1LCIlbGQiLCZ4KSkKCQkJCVdBUk4oIkNvdWxkbid0IHBhcnNlICVzXG4iLHB0cik7CgkJCWxwZGNiLT5TdG9wQml0cyA9IHg7CgkJCWZsYWc9MTsKCQl9CgkJaWYgKCFzdHJuY21wKCJkYXRhPSIscHRyLDUpKSB7CgkJCWlmICghc3NjYW5mKHB0cis1LCIlbGQiLCZ4KSkKCQkJCVdBUk4oIkNvdWxkbid0IHBhcnNlICVzXG4iLHB0cik7CgkJCWxwZGNiLT5CeXRlU2l6ZSA9IHg7CgkJCWZsYWc9MTsKCQl9CgkJaWYgKCFzdHJuY21wKCJwYXJpdHk9IixwdHIsNykpIHsKCQkJbHBkY2ItPmZQYXJpdHkJPSBUUlVFOwoJCQlzd2l0Y2ggKHB0cls4XSkgewoJCQljYXNlICdOJzpjYXNlICduJzoKCQkJCWxwZGNiLT5mUGFyaXR5CT0gRkFMU0U7CgkJCQlscGRjYi0+UGFyaXR5CT0gTk9QQVJJVFk7CgkJCQlicmVhazsKCQkJY2FzZSAnRSc6Y2FzZSAnZSc6CgkJCQlscGRjYi0+UGFyaXR5CT0gRVZFTlBBUklUWTsKCQkJCWJyZWFrOwoJCQljYXNlICdPJzpjYXNlICdvJzoKCQkJCWxwZGNiLT5QYXJpdHkJPSBPRERQQVJJVFk7CgkJCQlicmVhazsKCQkJY2FzZSAnTSc6Y2FzZSAnbSc6CgkJCQlscGRjYi0+UGFyaXR5CT0gTUFSS1BBUklUWTsKCQkJCWJyZWFrOwoJCQl9CgkJCWZsYWc9MTsKCQl9CgkJaWYgKCFmbGFnKQoJCQlFUlIoIlVuaGFuZGxlZCBzcGVjaWZpZXIgJyVzJywgcGxlYXNlIHJlcG9ydC5cbiIscHRyKTsKCQlwdHI9c3RydG9rKE5VTEwsIiAiKTsKCX0KCWlmIChscGRjYi0+QmF1ZFJhdGU9PTExMCkKCQlscGRjYi0+U3RvcEJpdHMgPSAyOwoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEJ1aWxkQ29tbURDQkFuZFRpbWVvdXRzVwkJKEtFUk5FTDMyLjE2KQogKi8KQk9PTCBXSU5BUEkgQnVpbGRDb21tRENCQW5kVGltZW91dHNXKCBMUENXU1RSIGRldmlkLCBMUERDQiBscGRjYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDT01NVElNRU9VVFMgbHB0aW1lb3V0cyApCnsKCUxQU1RSCWRldmlkQTsKCUJPT0wJcmV0OwoKCVRSQUNFKCIoJXAsJXAsJXApXG4iLGRldmlkLGxwZGNiLGxwdGltZW91dHMpOwoJZGV2aWRBID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBkZXZpZCApOwoJcmV0PUJ1aWxkQ29tbURDQkFuZFRpbWVvdXRzQShkZXZpZEEsbHBkY2IsbHB0aW1lb3V0cyk7CiAgICAgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGRldmlkQSApOwoJcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgQnVpbGRDb21tRENCVwkJKEtFUk5FTDMyLjE3KQogKi8KQk9PTCBXSU5BUEkgQnVpbGRDb21tRENCVyhMUENXU1RSIGRldmlkLExQRENCIGxwZGNiKQp7CglyZXR1cm4gQnVpbGRDb21tRENCQW5kVGltZW91dHNXKGRldmlkLGxwZGNiLE5VTEwpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBDT01NX0dldFJlYWRGZAogKiAgUmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciBmb3IgcmVhZGluZy4KICogIE1ha2Ugc3VyZSB0byBjbG9zZSB0aGUgaGFuZGxlIGFmdGVyd2FyZHMhCiAqLwppbmxpbmUgc3RhdGljIGludCBDT01NX0dldFJlYWRGZCggSEFORExFIGhhbmRsZSkKewogICAgcmV0dXJuIEZJTEVfR2V0VW5peEhhbmRsZSggaGFuZGxlLCBHRU5FUklDX1JFQUQgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQ09NTV9HZXRXcml0ZUZkCiAqICBSZXR1cm5zIGEgZmlsZSBkZXNjcmlwdG9yIGZvciB3cml0aW5nLgogKiAgTWFrZSBzdXJlIHRvIGNsb3NlIHRoZSBoYW5kbGUgYWZ0ZXJ3YXJkcyEKICovCmlubGluZSBzdGF0aWMgaW50IENPTU1fR2V0V3JpdGVGZCggSEFORExFIGhhbmRsZSkKewogICAgcmV0dXJuIEZJTEVfR2V0VW5peEhhbmRsZSggaGFuZGxlLCBHRU5FUklDX1dSSVRFICk7Cn0KCi8qIEZJWE1FOiBoYXZpbmcgdGhlc2UgZ2xvYmFsIGZvciB3aW4zMiBmb3Igbm93ICovCmludCBjb21tZXJyb3I9MCxldmVudG1hc2s9MDsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTZXRDb21tQnJlYWsJCShLRVJORUwzMi40NDkpCiAqLwpCT09MIFdJTkFQSSBTZXRDb21tQnJlYWsoSEFORExFIGhhbmRsZSkKewojaWYgZGVmaW5lZChUSU9DU0JSSykgJiYgZGVmaW5lZChUSU9DQ0JSSykgLyogY2hlY2sgaWYgYXZhaWxhYmxlIGZvciBjb21waWxhdGlvbiAqLwogICAgICAgIGludCBmZCxyZXN1bHQ7CiAKCWZkID0gQ09NTV9HZXRXcml0ZUZkKGhhbmRsZSk7CglpZihmZDwwKSB7CgkgICAgICAgIFRSQUNFKCJDT01NX0dldFdyaXRlRmQgZmFpbGVkXG4iKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CglyZXN1bHQgPSBpb2N0bChmZCxUSU9DU0JSSywwKTsKCWNsb3NlKGZkKTsKCWlmIChyZXN1bHQgPT0tMSkKCSAgewoJICAgICAgICBUUkFDRSgiaW9jdGwgZmFpbGVkXG4iKTsKCQlTZXRMYXN0RXJyb3IoRVJST1JfTk9UX1NVUFBPUlRFRCk7CgkJcmV0dXJuIEZBTFNFOwoJICB9CglyZXR1cm4gVFJVRTsKI2Vsc2UKCUZJWE1FKCJpb2N0bCBub3QgYXZhaWxhYmxlXG4iKTsKCVNldExhc3RFcnJvcihFUlJPUl9OT1RfU1VQUE9SVEVEKTsKCXJldHVybiBGQUxTRTsKI2VuZGlmCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglDbGVhckNvbW1CcmVhawkJKEtFUk5FTDMyLjIwKQogKi8KQk9PTCBXSU5BUEkgQ2xlYXJDb21tQnJlYWsoSEFORExFIGhhbmRsZSkKewojaWYgZGVmaW5lZChUSU9DU0JSSykgJiYgZGVmaW5lZChUSU9DQ0JSSykgLyogY2hlY2sgaWYgYXZhaWxhYmxlIGZvciBjb21waWxhdGlvbiAqLwogICAgICAgIGludCBmZCxyZXN1bHQ7CiAKCWZkID0gQ09NTV9HZXRXcml0ZUZkKGhhbmRsZSk7CglpZihmZDwwKSB7CgkgICAgICAgIFRSQUNFKCJDT01NX0dldFdyaXRlRmQgZmFpbGVkXG4iKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CglyZXN1bHQgPSBpb2N0bChmZCxUSU9DQ0JSSywwKTsKCWNsb3NlKGZkKTsKCWlmIChyZXN1bHQgPT0tMSkKCSAgewoJICAgICAgICBUUkFDRSgiaW9jdGwgZmFpbGVkXG4iKTsKCQlTZXRMYXN0RXJyb3IoRVJST1JfTk9UX1NVUFBPUlRFRCk7CgkJcmV0dXJuIEZBTFNFOwoJICB9CglyZXR1cm4gVFJVRTsKI2Vsc2UKCUZJWE1FKCJpb2N0bCBub3QgYXZhaWxhYmxlXG4iKTsKCVNldExhc3RFcnJvcihFUlJPUl9OT1RfU1VQUE9SVEVEKTsKCXJldHVybiBGQUxTRTsKI2VuZGlmCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglFc2NhcGVDb21tRnVuY3Rpb24JKEtFUk5FTDMyLjIxNCkKICovCkJPT0wgV0lOQVBJIEVzY2FwZUNvbW1GdW5jdGlvbihIQU5ETEUgaGFuZGxlLFVJTlQgbkZ1bmN0aW9uKQp7CglpbnQgZmQsZGlyZWN0PUZBTFNFLHJlc3VsdD1GQUxTRTsKCXN0cnVjdCB0ZXJtaW9zCXBvcnQ7CgogICAgCVRSQUNFKCJoYW5kbGUgJWQsIGZ1bmN0aW9uPSVkXG4iLCBoYW5kbGUsIG5GdW5jdGlvbik7CglmZCA9IENPTU1fR2V0V3JpdGVGZChoYW5kbGUpOwoJaWYoZmQ8MCkgewoJCUZJWE1FKCJoYW5kbGUgJWQgbm90IGZvdW5kLlxuIixoYW5kbGUpOwoJCXJldHVybiBGQUxTRTsKCX0KCglpZiAodGNnZXRhdHRyKGZkLCZwb3J0KSA9PSAtMSkgewoJCWNvbW1lcnJvcj1XaW5FcnJvcigpOwoJCWNsb3NlKGZkKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CgoJc3dpdGNoIChuRnVuY3Rpb24pIHsKCQljYXNlIFJFU0VUREVWOgoJCSAgICAgICAgVFJBQ0UoIlxuIik7CgkJCWJyZWFrOwkJCQkJCgoJCWNhc2UgQ0xSRFRSOgoJCSAgICAgICAgVFJBQ0UoIkNMUkRUUlxuIik7CiNpZmRlZiBUSU9DTV9EVFIKCQkJZGlyZWN0PVRSVUU7CgkJCXJlc3VsdD0gQ09NTV9XaGFja01vZGVtKGZkLCB+VElPQ01fRFRSLCAwKTsKCQkJYnJlYWs7CiNlbmRpZgoKCQljYXNlIENMUlJUUzoKCQkgICAgICAgIFRSQUNFKCJDTFJSVFNcbiIpOwojaWZkZWYgVElPQ01fUlRTCgkJCWRpcmVjdD1UUlVFOwoJCQlyZXN1bHQ9IENPTU1fV2hhY2tNb2RlbShmZCwgflRJT0NNX1JUUywgMCk7CgkJCWJyZWFrOwojZW5kaWYKCQoJCWNhc2UgU0VURFRSOgoJCSAgICAgICAgVFJBQ0UoIlNFVERUUlxuIik7CiNpZmRlZiBUSU9DTV9EVFIKCQkJZGlyZWN0PVRSVUU7CgkJCXJlc3VsdD0gQ09NTV9XaGFja01vZGVtKGZkLCAwLCBUSU9DTV9EVFIpOwoJCQlicmVhazsKI2VuZGlmCgoJCWNhc2UgU0VUUlRTOgoJCSAgICAgICAgVFJBQ0UoIlNFVFJUU1xuIik7CiNpZmRlZiBUSU9DTV9EVFIKCQkJZGlyZWN0PVRSVUU7CgkJCXJlc3VsdD0gQ09NTV9XaGFja01vZGVtKGZkLCAwLCBUSU9DTV9SVFMpOwoJCQlicmVhazsKI2VuZGlmCgoJCWNhc2UgU0VUWE9GRjoKCQkgICAgICAgIFRSQUNFKCJTRVRYT0ZGXG4iKTsKCQkJcG9ydC5jX2lmbGFnIHw9IElYT0ZGOwoJCQlicmVhazsKCgkJY2FzZSBTRVRYT046CgkJICAgICAgICBUUkFDRSgiU0VUWE9OXG4iKTsKCQkJcG9ydC5jX2lmbGFnIHw9IElYT047CgkJCWJyZWFrOwoJCWNhc2UgU0VUQlJFQUs6CgkJCVRSQUNFKCJzZXRicmVha1xuIik7CiNpZmRlZiAJVElPQ1NCUksKCQkJZGlyZWN0PVRSVUU7CgkJCXJlc3VsdCA9IGlvY3RsKGZkLFRJT0NTQlJLLDApOwoJCQlicmVhazsKI2VuZGlmCgkJY2FzZSBDTFJCUkVBSzoKCQkJVFJBQ0UoImNscmJyZWFrXG4iKTsKI2lmZGVmIAlUSU9DU0JSSwoJCQlkaXJlY3Q9VFJVRTsKCQkJcmVzdWx0ID0gaW9jdGwoZmQsVElPQ0NCUkssMCk7CgkJCWJyZWFrOwojZW5kaWYKCQlkZWZhdWx0OgoJCQlXQVJOKCIoaGFuZGxlPSVkLG5GdW5jdGlvbj0lZCk6IFVua25vd24gZnVuY3Rpb25cbiIsIAoJCQloYW5kbGUsIG5GdW5jdGlvbik7CgkJCWJyZWFrOwkJCQkKCX0KCQoJaWYgKCFkaXJlY3QpCgkgIGlmICh0Y3NldGF0dHIoZmQsIFRDU0FEUkFJTiwgJnBvcnQpID09IC0xKSB7CgkJY29tbWVycm9yID0gV2luRXJyb3IoKTsKCQljbG9zZShmZCk7CgkJcmV0dXJuIEZBTFNFOwkKCSAgfSBlbHNlIAoJICAgICAgICByZXN1bHQ9IFRSVUU7CgllbHNlCgkgIHsKCSAgICBpZiAocmVzdWx0ID09IC0xKQoJICAgICAgewoJCXJlc3VsdD0gRkFMU0U7CgkJY29tbWVycm9yPVdpbkVycm9yKCk7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgcmVzdWx0ID0gVFJVRTsKCSAgfQoJY2xvc2UoZmQpOwoJcmV0dXJuIHJlc3VsdDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgUHVyZ2VDb21tICAgICAgICAoS0VSTkVMMzIuNTU3KQogKi8KQk9PTCBXSU5BUEkgUHVyZ2VDb21tKCBIQU5ETEUgaGFuZGxlLCBEV09SRCBmbGFncykgCnsKICAgICBpbnQgZmQ7CgogICAgIFRSQUNFKCJoYW5kbGUgJWQsIGZsYWdzICVseFxuIiwgaGFuZGxlLCBmbGFncyk7CgogICAgIGZkID0gQ09NTV9HZXRXcml0ZUZkKGhhbmRsZSk7CiAgICAgaWYoZmQ8MCkgewoJRklYTUUoIm5vIGhhbmRsZSAlZCBmb3VuZFxuIixoYW5kbGUpOwoJcmV0dXJuIEZBTFNFOwogICAgIH0KCiAgICAgLyoKICAgICAqKiBub3QgZXhhY3RseSBzdXJlIGhvdyB0aGVzZSBhcmUgZGlmZmVyZW50CiAgICAgKiogUGVyaGFwcyBpZiB3ZSBoYWQgb3VyIG93biBpbnRlcm5hbCBxdWV1ZXMsIG9uZSBmbHVzaGVzIHRoZW0KICAgICAqKiBhbmQgdGhlIG90aGVyIGZsdXNoZXMgdGhlIGtlcm5lbCdzIGJ1ZmZlcnMuCiAgICAgKi8KICAgICBpZihmbGFncyZQVVJHRV9UWEFCT1JUKQogICAgICAgICB0Y2ZsdXNoKGZkLFRDT0ZMVVNIKTsKICAgICBpZihmbGFncyZQVVJHRV9SWEFCT1JUKQogICAgICAgICB0Y2ZsdXNoKGZkLFRDSUZMVVNIKTsKICAgICBpZihmbGFncyZQVVJHRV9UWENMRUFSKQogICAgICAgICB0Y2ZsdXNoKGZkLFRDT0ZMVVNIKTsKICAgICBpZihmbGFncyZQVVJHRV9SWENMRUFSKQogICAgICAgICB0Y2ZsdXNoKGZkLFRDSUZMVVNIKTsKICAgICBjbG9zZShmZCk7CgogICAgIHJldHVybiAxOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJQ2xlYXJDb21tRXJyb3IJKEtFUk5FTDMyLjIxKQogKi8KQk9PTCBXSU5BUEkgQ2xlYXJDb21tRXJyb3IoSEFORExFIGhhbmRsZSxMUERXT1JEIGVycm9ycyxMUENPTVNUQVQgbHBTdGF0KQp7CiAgICBpbnQgZmQ7CgogICAgZmQ9Q09NTV9HZXRSZWFkRmQoaGFuZGxlKTsKICAgIGlmKDA+ZmQpIAogICAgewoJRklYTUUoIm5vIGhhbmRsZSAlZCBmb3VuZFxuIixoYW5kbGUpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBpZiAobHBTdGF0KSAKICAgIHsKCWxwU3RhdC0+c3RhdHVzID0gMDsKCiNpZmRlZiBUSU9DT1VUUQoJaWYoaW9jdGwoZmQsIFRJT0NPVVRRLCAmbHBTdGF0LT5jYk91dFF1ZSkpCgkgICAgV0FSTigiaW9jdGwgcmV0dXJuZWQgZXJyb3JcbiIpOwojZWxzZQoJbHBTdGF0LT5jYk91dFF1ZSA9IDA7IC8qIEZJWE1FOiBmaW5kIGEgZGlmZmVyZW50IHdheSB0byBmaW5kIG91dCAqLwojZW5kaWYKCglpZihpb2N0bChmZCwgVElPQ0lOUSwgJmxwU3RhdC0+Y2JJblF1ZSkpCgkgICAgV0FSTigiaW9jdGwgcmV0dXJuZWQgZXJyb3JcbiIpOwoKCVRSQUNFKCJoYW5kbGUgJWQgY2JJblF1ZSA9ICVsZCBjYk91dFF1ZSA9ICVsZFxuIiwKCSAgICAgIGhhbmRsZSwgbHBTdGF0LT5jYkluUXVlLCBscFN0YXQtPmNiT3V0UXVlKTsKICAgIH0KCiAgICBjbG9zZShmZCk7CgogICAgaWYoZXJyb3JzKQogICAgICAgICplcnJvcnMgPSAwOwoKICAgIC8qCiAgICAqKiBBZnRlciBhbiBhc3luY2hyb25vdXMgd3JpdGUgb3BwZXJhdGlvbiwgdGhlCiAgICAqKiBhcHAgd2lsbCBjYWxsIENsZWFyQ29tbUVycm9yIHRvIHNlZSBpZiB0aGUKICAgICoqIHJlc3VsdHMgYXJlIHJlYWR5IHlldC4gSXQgd2FpdHMgZm9yIEVSUk9SX0lPX1BFTkRJTkcKICAgICovCiAgICBjb21tZXJyb3IgPSBFUlJPUl9JT19QRU5ESU5HOwoKICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBTZXR1cENvbW0gICAgICAgKEtFUk5FTDMyLjY3NikKICovCkJPT0wgV0lOQVBJIFNldHVwQ29tbSggSEFORExFIGhhbmRsZSwgRFdPUkQgaW5zaXplLCBEV09SRCBvdXRzaXplKQp7CiAgICBpbnQgZmQ7CgogICAgRklYTUUoImluc2l6ZSAlbGQgb3V0c2l6ZSAlbGQgdW5pbXBsZW1lbnRlZCBzdHViXG4iLCBpbnNpemUsIG91dHNpemUpOwogICAgZmQ9Q09NTV9HZXRXcml0ZUZkKGhhbmRsZSk7CiAgICBpZigwPmZkKSB7CglGSVhNRSgiaGFuZGxlICVkIG5vdCBmb3VuZD9cbiIsaGFuZGxlKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAgICBjbG9zZShmZCk7CiAgICByZXR1cm4gVFJVRTsKfSAKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglHZXRDb21tTWFzawkoS0VSTkVMMzIuMTU2KQogKi8KQk9PTCBXSU5BUEkgR2V0Q29tbU1hc2soSEFORExFIGhhbmRsZSxMUERXT1JEIGV2dG1hc2spCnsKICAgIGludCBmZDsKCiAgICBUUkFDRSgiaGFuZGxlICVkLCBtYXNrICVwXG4iLCBoYW5kbGUsIGV2dG1hc2spOwogICAgaWYoMD4oZmQ9Q09NTV9HZXRSZWFkRmQoaGFuZGxlKSkpIAogICAgewoJRklYTUUoIm5vIGhhbmRsZSAlZCBmb3VuZFxuIixoYW5kbGUpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIGNsb3NlKGZkKTsKICAgICpldnRtYXNrID0gZXZlbnRtYXNrOwogICAgVFJBQ0UoIiVzJXMlcyVzJXMlcyVzJXMlc1xuIiwKCSAgKGV2ZW50bWFzayZFVl9CUkVBSyk/IkVWX0JSRUFLIjoiIiwKCSAgKGV2ZW50bWFzayZFVl9DVFMpPyJFVl9DVFMiOiIiLAoJICAoZXZlbnRtYXNrJkVWX0RTUik/IkVWX0RTUiI6IiIsCgkgIChldmVudG1hc2smRVZfRVJSKT8iRVZfRVJSIjoiIiwKCSAgKGV2ZW50bWFzayZFVl9SSU5HKT8iRVZfUklORyI6IiIsCgkgIChldmVudG1hc2smRVZfUkxTRCk/IkVWX1JMU0QiOiIiLAoJICAoZXZlbnRtYXNrJkVWX1JYQ0hBUik/IkVWX1JYQ0hBUiI6IiIsCgkgIChldmVudG1hc2smRVZfUlhGTEFHKT8iRVZfUlhGTEFHIjoiIiwKCSAgKGV2ZW50bWFzayZFVl9UWEVNUFRZKT8iRVZfVFhFTVBUWSI6IiIpOwoJICAKICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU2V0Q29tbU1hc2sJKEtFUk5FTDMyLjQ1MSkKICovCkJPT0wgV0lOQVBJIFNldENvbW1NYXNrKEhBTkRMRSBoYW5kbGUsRFdPUkQgZXZ0bWFzaykKewogICAgaW50IGZkOwoKICAgIFRSQUNFKCJoYW5kbGUgJWQsIG1hc2sgJWx4XG4iLCBoYW5kbGUsIGV2dG1hc2spOwogICAgVFJBQ0UoIiVzJXMlcyVzJXMlcyVzJXMlc1xuIiwKCSAgKGV2dG1hc2smRVZfQlJFQUspPyJFVl9CUkVBSyI6IiIsCgkgIChldnRtYXNrJkVWX0NUUyk/IkVWX0NUUyI6IiIsCgkgIChldnRtYXNrJkVWX0RTUik/IkVWX0RTUiI6IiIsCgkgIChldnRtYXNrJkVWX0VSUik/IkVWX0VSUiI6IiIsCgkgIChldnRtYXNrJkVWX1JJTkcpPyJFVl9SSU5HIjoiIiwKCSAgKGV2dG1hc2smRVZfUkxTRCk/IkVWX1JMU0QiOiIiLAoJICAoZXZ0bWFzayZFVl9SWENIQVIpPyJFVl9SWENIQVIiOiIiLAoJICAoZXZ0bWFzayZFVl9SWEZMQUcpPyJFVl9SWEZMQUciOiIiLAoJICAoZXZ0bWFzayZFVl9UWEVNUFRZKT8iRVZfVFhFTVBUWSI6IiIpOwoJICAKICAgIGlmKDA+KGZkPUNPTU1fR2V0V3JpdGVGZChoYW5kbGUpKSkgewoJRklYTUUoIm5vIGhhbmRsZSAlZCBmb3VuZFxuIixoYW5kbGUpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIGNsb3NlKGZkKTsKICAgIGV2ZW50bWFzayA9IGV2dG1hc2s7CiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVNldENvbW1TdGF0ZSAgICAoS0VSTkVMMzIuNDUyKQogKi8KQk9PTCBXSU5BUEkgU2V0Q29tbVN0YXRlKEhBTkRMRSBoYW5kbGUsTFBEQ0IgbHBkY2IpCnsKICAgICBzdHJ1Y3QgdGVybWlvcyBwb3J0OwogICAgIGludCBmZDsKICAgICBpbnQgYnl0ZXNpemUsIHN0b3BiaXRzOwoKICAgICBUUkFDRSgiaGFuZGxlICVkLCBwdHIgJXBcbiIsIGhhbmRsZSwgbHBkY2IpOwogICAgIFRSQUNFKCJieXRlc2l6ZSAlZCBiYXVkcmF0ZSAlbGQgZlBhcml0eSAlZCBQYXJpdHkgJWQgc3RvcGJpdHMgJWRcbiIsCgkgICBscGRjYi0+Qnl0ZVNpemUsbHBkY2ItPkJhdWRSYXRlLGxwZGNiLT5mUGFyaXR5LCBscGRjYi0+UGFyaXR5LAoJICAgKGxwZGNiLT5TdG9wQml0cyA9PSBPTkVTVE9QQklUKT8xOgoJICAgKGxwZGNiLT5TdG9wQml0cyA9PSBUV09TVE9QQklUUyk/MjowKTsKICAgICBUUkFDRSgiJXMgJXNcbiIsKGxwZGNiLT5mSW5YKT8iSVhPTiI6In5JWE9OIiwKCSAgIChscGRjYi0+Zk91dFgpPyJJWE9GRiI6In5JWE9GRiIpOwoKICAgICBpZiAoKGZkID0gQ09NTV9HZXRXcml0ZUZkKGhhbmRsZSkpIDwgMCkgIHsKCUZJWE1FKCJubyBoYW5kbGUgJWQgZm91bmRcbiIsaGFuZGxlKTsKCXJldHVybiBGQUxTRTsKICAgICB9CgogICAgIGlmICgodGNnZXRhdHRyKGZkLCZwb3J0KSkgPT0gLTEpIHsKICAgICAgICAgaW50IHNhdmVfZXJyb3IgPSBlcnJubzsKICAgICAgICAgY29tbWVycm9yID0gV2luRXJyb3IoKTsKICAgICAgICAgY2xvc2UoIGZkICk7CiAgICAgICAgIEVSUigidGNnZXRhdHRyIGVycm9yICclcydcbiIsIHN0cmVycm9yKHNhdmVfZXJyb3IpKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KCglwb3J0LmNfY2NbVk1JTl0gPSAwOwoJcG9ydC5jX2NjW1ZUSU1FXSA9IDE7CgojaWZkZWYgSU1BWEJFTAoJcG9ydC5jX2lmbGFnICY9IH4oSVNUUklQfEJSS0lOVHxJR05DUnxJQ1JOTHxJTkxDUnxJTUFYQkVMKTsKI2Vsc2UKCXBvcnQuY19pZmxhZyAmPSB+KElTVFJJUHxCUktJTlR8SUdOQ1J8SUNSTkx8SU5MQ1IpOwojZW5kaWYKCXBvcnQuY19pZmxhZyB8PSAoSUdOQlJLKTsKCglwb3J0LmNfb2ZsYWcgJj0gfihPUE9TVCk7CgoJcG9ydC5jX2NmbGFnICY9IH4oSFVQQ0wpOwoJcG9ydC5jX2NmbGFnIHw9IENMT0NBTCB8IENSRUFEOwoKCXBvcnQuY19sZmxhZyAmPSB+KElDQU5PTnxFQ0hPfElTSUcpOwoJcG9ydC5jX2xmbGFnIHw9IE5PRkxTSDsKCiAgICAgLyoKICAgICAqKiBNSk0gLSByZW1vdmVkIGRlZmF1bHQgYmF1ZHJhdGUgc2V0dGluZ3MKICAgICAqKiBUUkFDRShjb21tLCJiYXVkcmF0ZSAlbGRcbiIsbHBkY2ItPkJhdWRSYXRlKTsKICAgICAqLwojaWZkZWYgQ0JBVUQKCXBvcnQuY19jZmxhZyAmPSB+Q0JBVUQ7Cglzd2l0Y2ggKGxwZGNiLT5CYXVkUmF0ZSkgewoJCWNhc2UgMTEwOgoJCWNhc2UgQ0JSXzExMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIxMTA7CgkJCWJyZWFrOwkJCgkJY2FzZSAzMDA6CgkJY2FzZSBDQlJfMzAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjMwMDsKCQkJYnJlYWs7CQkKCQljYXNlIDYwMDoKCQljYXNlIENCUl82MDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCNjAwOwoJCQlicmVhazsJCQoJCWNhc2UgMTIwMDoKCQljYXNlIENCUl8xMjAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjEyMDA7CgkJCWJyZWFrOwkJCgkJY2FzZSAyNDAwOgoJCWNhc2UgQ0JSXzI0MDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMjQwMDsKCQkJYnJlYWs7CQkKCQljYXNlIDQ4MDA6CgkJY2FzZSBDQlJfNDgwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI0ODAwOwoJCQlicmVhazsJCQoJCWNhc2UgOTYwMDoKCQljYXNlIENCUl85NjAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjk2MDA7CgkJCWJyZWFrOwkJCgkJY2FzZSAxOTIwMDoKCQljYXNlIENCUl8xOTIwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIxOTIwMDsKCQkJYnJlYWs7CQkKCQljYXNlIDM4NDAwOgoJCWNhc2UgQ0JSXzM4NDAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjM4NDAwOwoJCQlicmVhazsJCQojaWZkZWYgQjU3NjAwCgkJY2FzZSA1NzYwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI1NzYwMDsKCQkJYnJlYWs7CQkKI2VuZGlmCiNpZmRlZiBCMTE1MjAwCgkJY2FzZSAxMTUyMDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMTE1MjAwOwoJCQlicmVhazsJCQojZW5kaWYKI2lmZGVmIEIyMzA0MDAKCQljYXNlIDIzMDQwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIyMzA0MDA7CgkJCWJyZWFrOwkJCiNlbmRpZgojaWZkZWYgQjQ2MDgwMAoJCWNhc2UgNDYwNjAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjQ2MDgwMDsKCQkJYnJlYWs7CQkKI2VuZGlmCiAgICAgICAJICAgICAgICBkZWZhdWx0OgoJCQljb21tZXJyb3IgPSBJRV9CQVVEUkFURTsKCQkJY2xvc2UoIGZkICk7CgkJCUVSUigiYmF1ZHJhdGUgJWxkXG4iLGxwZGNiLT5CYXVkUmF0ZSk7CgkJCXJldHVybiBGQUxTRTsKCX0KI2VsaWYgIWRlZmluZWQoX19FTVhfXykKICAgICAgICBzd2l0Y2ggKGxwZGNiLT5CYXVkUmF0ZSkgewogICAgICAgICAgICAgICAgY2FzZSAxMTA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl8xMTA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMTEwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMzAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMzAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjMwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDYwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzYwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEI2MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAxMjAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMTIwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIxMjAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMjQwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzI0MDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMjQwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDQ4MDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl80ODAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjQ4MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA5NjAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfOTYwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEI5NjAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMTkyMDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl8xOTIwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIxOTIwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDM4NDAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMzg0MDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMzg0MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVycm9yID0gSUVfQkFVRFJBVEU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKCBmZCApOwoJCQlFUlIoImJhdWRyYXRlICVsZFxuIixscGRjYi0+QmF1ZFJhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgfQogICAgICAgIHBvcnQuY19pc3BlZWQgPSBwb3J0LmNfb3NwZWVkOwojZW5kaWYKICAgICAgICBieXRlc2l6ZT1scGRjYi0+Qnl0ZVNpemU7CiAgICAgICAgc3RvcGJpdHM9bHBkY2ItPlN0b3BCaXRzOwoKI2lmZGVmIENNU1BBUgoJcG9ydC5jX2NmbGFnICY9IH4oUEFSRU5CIHwgUEFST0REIHwgQ01TUEFSKTsKI2Vsc2UKCXBvcnQuY19jZmxhZyAmPSB+KFBBUkVOQiB8IFBBUk9ERCk7CiNlbmRpZgoJaWYgKGxwZGNiLT5mUGFyaXR5KQogICAgICAgICAgICBwb3J0LmNfaWZsYWcgfD0gSU5QQ0s7CiAgICAgICAgZWxzZQogICAgICAgICAgICBwb3J0LmNfaWZsYWcgJj0gfklOUENLOwogICAgICAgIHN3aXRjaCAobHBkY2ItPlBhcml0eSkgewogICAgICAgICAgICAgICAgY2FzZSBOT1BBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIE9ERFBBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX2NmbGFnIHw9IChQQVJFTkIgfCBQQVJPREQpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgRVZFTlBBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX2NmbGFnIHw9IFBBUkVOQjsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiNpZmRlZiBDTVNQQVIKICAgICAgICAgICAgICAgIC8qIExpbnV4IGRlZmluZXMgbWFyay9zcGFjZSAoc3RpY2spIHBhcml0eSAqLwogICAgICAgICAgICAgICAgY2FzZSBNQVJLUEFSSVRZOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfY2ZsYWcgfD0gKFBBUkVOQiB8IENNU1BBUik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBTUEFDRVBBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX2NmbGFnIHw9IChQQVJFTkIgfCBQQVJPREQgfCAgQ01TUEFSKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiNlbHNlCiAgICAgICAgICAgICAgICAvKiB0cnkgdGhlIFBPU0lYIHdheSAqLwogICAgICAgICAgICAgICAgY2FzZSBNQVJLUEFSSVRZOgogICAgICAgICAgICAgICAgICAgICAgICBpZiggc3RvcGJpdHMgPT0gT05FU1RPUEJJVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcGJpdHMgPSBUV09TVE9QQklUUzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19pZmxhZyAmPSB+SU5QQ0s7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZXJyb3IgPSBJRV9CWVRFU0laRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKCBmZCApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSKCJDYW5ub3Qgc2V0IE1BUksgUGFyaXR5XG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgU1BBQ0VQQVJJVFk6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBieXRlc2l6ZSA8IDgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzaXplICs9MTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19pZmxhZyAmPSB+SU5QQ0s7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZXJyb3IgPSBJRV9CWVRFU0laRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKCBmZCApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSKCJDYW5ub3Qgc2V0IFNQQUNFIFBhcml0eVxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiNlbmRpZgogICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICBjb21tZXJyb3IgPSBJRV9CWVRFU0laRTsKICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UoIGZkICk7CgkJCUVSUigiUGFyaXR5XG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgIH0KCQoKCXBvcnQuY19jZmxhZyAmPSB+Q1NJWkU7Cglzd2l0Y2ggKGJ5dGVzaXplKSB7CgkJY2FzZSA1OgoJCQlwb3J0LmNfY2ZsYWcgfD0gQ1M1OwoJCQlicmVhazsKCQljYXNlIDY6CgkJCXBvcnQuY19jZmxhZyB8PSBDUzY7CgkJCWJyZWFrOwoJCWNhc2UgNzoKCQkJcG9ydC5jX2NmbGFnIHw9IENTNzsKCQkJYnJlYWs7CgkJY2FzZSA4OgoJCQlwb3J0LmNfY2ZsYWcgfD0gQ1M4OwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQljb21tZXJyb3IgPSBJRV9CWVRFU0laRTsKICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UoIGZkICk7CgkJCUVSUigiQnl0ZVNpemVcbiIpOwoJCQlyZXR1cm4gRkFMU0U7Cgl9CiAgICAgICAgCglzd2l0Y2ggKHN0b3BiaXRzKSB7CgkJY2FzZSBPTkVTVE9QQklUOgoJCQkJcG9ydC5jX2NmbGFnICY9IH5DU1RPUEI7CgkJCQlicmVhazsKCQljYXNlIE9ORTVTVE9QQklUUzogLyogd2lsIGJlIHNlbGVjdGVkIGlmIGJ5dGVzaXplIGlzIDUgKi8KCQljYXNlIFRXT1NUT1BCSVRTOgoJCQkJcG9ydC5jX2NmbGFnIHw9IENTVE9QQjsKCQkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWNvbW1lcnJvciA9IElFX0JZVEVTSVpFOwogICAgICAgICAgICAgICAgICAgICAgICBjbG9zZSggZmQgKTsKCQkJRVJSKCJTdG9wQml0c1xuIik7CgkJCXJldHVybiBGQUxTRTsKCX0KI2lmZGVmIENSVFNDVFMKCWlmICgJbHBkY2ItPmZPdXR4Q3RzRmxvdyAJCQl8fAoJCWxwZGNiLT5mRHRyQ29udHJvbCA9PSBEVFJfQ09OVFJPTF9FTkFCTEV8fAoJCWxwZGNiLT5mUnRzQ29udHJvbCA9PSBSVFNfQ09OVFJPTF9FTkFCTEUKCSkgCgkgIHsKCSAgICBwb3J0LmNfY2ZsYWcgfD0gQ1JUU0NUUzsKCSAgICBUUkFDRSgiQ1JUU0NUU1xuIik7CgkgIH0KCQoJaWYgKGxwZGNiLT5mRHRyQ29udHJvbCA9PSBEVFJfQ09OVFJPTF9ESVNBQkxFKQoJICB7CgkgICAgcG9ydC5jX2NmbGFnICY9IH5DUlRTQ1RTOwoJICAgIFRSQUNFKCJ+Q1JUU0NUU1xuIik7CgkgIH0KCiNlbmRpZgkKCWlmIChscGRjYi0+ZkluWCkKCQlwb3J0LmNfaWZsYWcgfD0gSVhPTjsKCWVsc2UKCQlwb3J0LmNfaWZsYWcgJj0gfklYT047CglpZiAobHBkY2ItPmZPdXRYKQoJCXBvcnQuY19pZmxhZyB8PSBJWE9GRjsKCWVsc2UKCQlwb3J0LmNfaWZsYWcgJj0gfklYT0ZGOwoKCWlmICh0Y3NldGF0dHIoZmQsVENTQU5PVywmcG9ydCk9PS0xKSB7IC8qIG90aGVyd2lzZSBpdCBoYW5ncyB3aXRoIHBlbmRpbmcgaW5wdXQqLwoJICAgICAgICBpbnQgc2F2ZV9lcnJvcj1lcnJubzsKCQljb21tZXJyb3IgPSBXaW5FcnJvcigpOwkKICAgICAgICAgICAgICAgIGNsb3NlKCBmZCApOwogICAgICAgICAgICAgICAgRVJSKCJ0Y2dldGF0dHIgZXJyb3IgJyVzJ1xuIiwgc3RyZXJyb3Ioc2F2ZV9lcnJvcikpOwoJCXJldHVybiBGQUxTRTsKCX0gZWxzZSB7CgkJY29tbWVycm9yID0gMDsKICAgICAgICAgICAgICAgIGNsb3NlKCBmZCApOwoJCXJldHVybiBUUlVFOwoJfQp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUdldENvbW1TdGF0ZQkoS0VSTkVMMzIuMTU5KQogKi8KQk9PTCBXSU5BUEkgR2V0Q29tbVN0YXRlKEhBTkRMRSBoYW5kbGUsIExQRENCIGxwZGNiKQp7CiAgICAgc3RydWN0IHRlcm1pb3MgcG9ydDsKICAgICBpbnQgZmQsc3BlZWQ7CgogICAgIFRSQUNFKCJoYW5kbGUgJWQsIHB0ciAlcFxuIiwgaGFuZGxlLCBscGRjYik7CgogICAgIGlmICgoZmQgPSBDT01NX0dldFJlYWRGZChoYW5kbGUpKSA8IDApIAogICAgICAgewoJIEVSUigiY2FuJ3QgZ2V0IENPTU1fR2V0UmVhZEZkXG4iKTsKCSByZXR1cm4gRkFMU0U7CiAgICAgICB9CiAgICAgaWYgKHRjZ2V0YXR0cihmZCwgJnBvcnQpID09IC0xKSB7CiAgICAgICAgICAgICAgICBpbnQgc2F2ZV9lcnJvcj1lcnJubzsKICAgICAgICAgICAgICAgIEVSUigidGNnZXRhdHRyIGVycm9yICclcydcbiIsIHN0cmVycm9yKHNhdmVfZXJyb3IpKTsKCQljb21tZXJyb3IgPSBXaW5FcnJvcigpOwkKICAgICAgICAgICAgICAgIGNsb3NlKCBmZCApOwoJCXJldHVybiBGQUxTRTsKCX0KICAgICBjbG9zZSggZmQgKTsKI2lmbmRlZiBfX0VNWF9fCiNpZmRlZiBDQkFVRAogICAgIHNwZWVkPSAocG9ydC5jX2NmbGFnICYgQ0JBVUQpOwojZWxzZQogICAgIHNwZWVkPSAoY2ZnZXRvc3BlZWQoJnBvcnQpKTsKI2VuZGlmCiAgICAgc3dpdGNoIChzcGVlZCkgewoJCWNhc2UgQjExMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMTEwOwoJCQlicmVhazsKCQljYXNlIEIzMDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDMwMDsKCQkJYnJlYWs7CgkJY2FzZSBCNjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSA2MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjEyMDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDEyMDA7CgkJCWJyZWFrOwoJCWNhc2UgQjI0MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDI0MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjQ4MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDQ4MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjk2MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDk2MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjE5MjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSAxOTIwMDsKCQkJYnJlYWs7CgkJY2FzZSBCMzg0MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDM4NDAwOwoJCQlicmVhazsKI2lmZGVmIEI1NzYwMAoJCWNhc2UgQjU3NjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSA1NzYwMDsKCQkJYnJlYWs7CQkKI2VuZGlmCiNpZmRlZiBCMTE1MjAwCgkJY2FzZSBCMTE1MjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSAxMTUyMDA7CgkJCWJyZWFrOwkJCiNlbmRpZgojaWZkZWYgQjIzMDQwMAogICAgICAgICAgICAgICAgY2FzZSBCMjMwNDAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSAyMzA0MDA7CgkJCWJyZWFrOwkJCiNlbmRpZgojaWZkZWYgQjQ2MDgwMAogICAgICAgICAgICAgICAgY2FzZSBCNDYwODAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSA0NjA4MDA7CgkJCWJyZWFrOwkJCiNlbmRpZgoJICAgICAgICBkZWZhdWx0OgoJCSAgICAgICAgRVJSKCJ1bmtub3duIHNwZWVkICV4IFxuIixzcGVlZCk7Cgl9CiNlbmRpZgoJc3dpdGNoIChwb3J0LmNfY2ZsYWcgJiBDU0laRSkgewoJCWNhc2UgQ1M1OgoJCQlscGRjYi0+Qnl0ZVNpemUgPSA1OwoJCQlicmVhazsKCQljYXNlIENTNjoKCQkJbHBkY2ItPkJ5dGVTaXplID0gNjsKCQkJYnJlYWs7CgkJY2FzZSBDUzc6CgkJCWxwZGNiLT5CeXRlU2l6ZSA9IDc7CgkJCWJyZWFrOwoJCWNhc2UgQ1M4OgoJCQlscGRjYi0+Qnl0ZVNpemUgPSA4OwoJCQlicmVhazsKCSAgICAgICAgZGVmYXVsdDoKCQkgICAgICAgIEVSUigidW5rbm93biBzaXplICV4IFxuIixwb3J0LmNfY2ZsYWcgJiBDU0laRSk7Cgl9CQoJCiAgICAgICAgaWYocG9ydC5jX2lmbGFnICYgSU5QQ0spCiAgICAgICAgICAgIGxwZGNiLT5mUGFyaXR5ID0gVFJVRTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGxwZGNiLT5mUGFyaXR5ID0gRkFMU0U7CiNpZmRlZiBDTVNQQVIKCXN3aXRjaCAocG9ydC5jX2NmbGFnICYgKFBBUkVOQiB8IFBBUk9ERCB8IENNU1BBUikpCiNlbHNlCglzd2l0Y2ggKHBvcnQuY19jZmxhZyAmIChQQVJFTkIgfCBQQVJPREQpKQojZW5kaWYKCXsKCQljYXNlIDA6CgkJCWxwZGNiLT5QYXJpdHkgPSBOT1BBUklUWTsKCQkJYnJlYWs7CgkJY2FzZSBQQVJFTkI6CgkJCWxwZGNiLT5QYXJpdHkgPSBFVkVOUEFSSVRZOwoJCQlicmVhazsKCQljYXNlIChQQVJFTkIgfCBQQVJPREQpOgoJCQlscGRjYi0+UGFyaXR5ID0gT0REUEFSSVRZOwkJCgkJCWJyZWFrOwojaWZkZWYgQ01TUEFSCgkJY2FzZSAoUEFSRU5CIHwgQ01TUEFSKToKCQkJbHBkY2ItPlBhcml0eSA9IE1BUktQQVJJVFk7CQkKCQkJYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIChQQVJFTkIgfCBQQVJPREQgfCBDTVNQQVIpOgoJCQlscGRjYi0+UGFyaXR5ID0gU1BBQ0VQQVJJVFk7CQkKCQkJYnJlYWs7CiNlbmRpZgoJfQoKCWlmIChwb3J0LmNfY2ZsYWcgJiBDU1RPUEIpCiAgICAgICAgICAgIGlmKGxwZGNiLT5CeXRlU2l6ZSA9PSA1KQogICAgICAgICAgICAgICAgbHBkY2ItPlN0b3BCaXRzID0gT05FNVNUT1BCSVRTOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBscGRjYi0+U3RvcEJpdHMgPSBUV09TVE9QQklUUzsKCWVsc2UKICAgICAgICAgICAgbHBkY2ItPlN0b3BCaXRzID0gT05FU1RPUEJJVDsKCglscGRjYi0+Zk51bGwgPSAwOwoJbHBkY2ItPmZCaW5hcnkgPSAxOwoKI2lmZGVmIENSVFNDVFMKCglpZiAocG9ydC5jX2NmbGFnICYgQ1JUU0NUUykgewoJCWxwZGNiLT5mRHRyQ29udHJvbCA9IERUUl9DT05UUk9MX0VOQUJMRTsKCQlscGRjYi0+ZlJ0c0NvbnRyb2wgPSBSVFNfQ09OVFJPTF9FTkFCTEU7CgkJbHBkY2ItPmZPdXR4Q3RzRmxvdyA9IDE7CgkJbHBkY2ItPmZPdXR4RHNyRmxvdyA9IDE7Cgl9IGVsc2UgCiNlbmRpZgoJewoJCWxwZGNiLT5mRHRyQ29udHJvbCA9IERUUl9DT05UUk9MX0RJU0FCTEU7CgkJbHBkY2ItPmZSdHNDb250cm9sID0gUlRTX0NPTlRST0xfRElTQUJMRTsKCX0KCWlmIChwb3J0LmNfaWZsYWcgJiBJWE9OKQoJCWxwZGNiLT5mSW5YID0gMTsKCWVsc2UKCQlscGRjYi0+ZkluWCA9IDA7CgoJaWYgKHBvcnQuY19pZmxhZyAmIElYT0ZGKQoJCWxwZGNiLT5mT3V0WCA9IDE7CgllbHNlCgkJbHBkY2ItPmZPdXRYID0gMDsKLyoKCWxwZGNiLT5Yb25DaGFyID0gCglscGRjYi0+WG9mZkNoYXIgPSAKICovCglscGRjYi0+WG9uTGltID0gMTA7CglscGRjYi0+WG9mZkxpbSA9IDEwOwoKCWNvbW1lcnJvciA9IDA7CgogICAgICAgIFRSQUNFKCJPS1xuIik7CiAKCVRSQUNFKCJieXRlc2l6ZSAlZCBiYXVkcmF0ZSAlbGQgZlBhcml0eSAlZCBQYXJpdHkgJWQgc3RvcGJpdHMgJWRcbiIsCgkgICAgICBscGRjYi0+Qnl0ZVNpemUsbHBkY2ItPkJhdWRSYXRlLGxwZGNiLT5mUGFyaXR5LCBscGRjYi0+UGFyaXR5LAoJICAgICAgKGxwZGNiLT5TdG9wQml0cyA9PSBPTkVTVE9QQklUKT8xOgoJICAgICAgKGxwZGNiLT5TdG9wQml0cyA9PSBUV09TVE9QQklUUyk/MjowKTsKCVRSQUNFKCIlcyAlc1xuIiwobHBkY2ItPmZJblgpPyJJWE9OIjoifklYT04iLAoJICAgICAgKGxwZGNiLT5mT3V0WCk/IklYT0ZGIjoifklYT0ZGIik7CiNpZmRlZiBDUlRTQ1RTCglpZiAoCWxwZGNiLT5mT3V0eEN0c0Zsb3cgCQkJfHwKCQlscGRjYi0+ZkR0ckNvbnRyb2wgPT0gRFRSX0NPTlRST0xfRU5BQkxFfHwKCQlscGRjYi0+ZlJ0c0NvbnRyb2wgPT0gUlRTX0NPTlRST0xfRU5BQkxFCgkJKSAKCSAgVFJBQ0UoIkNSVFNDVFNcbiIpOwoJCglpZiAobHBkY2ItPmZEdHJDb250cm9sID09IERUUl9DT05UUk9MX0RJU0FCTEUpCgkgIFRSQUNFKCJ+Q1JUU0NUU1xuIik7CgkKI2VuZGlmCQoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglUcmFuc21pdENvbW1DaGFyCShLRVJORUwzMi41MzUpCiAqLwpCT09MIFdJTkFQSSBUcmFuc21pdENvbW1DaGFyKEhBTkRMRSBoQ29tbSxDSEFSIGNoVHJhbnNtaXQpCnsKICAgIAlGSVhNRSgiKCV4LCclYycpLCB1c2Ugd2luMzIgaGFuZGxlIVxuIixoQ29tbSxjaFRyYW5zbWl0KTsKCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJR2V0Q29tbVRpbWVvdXRzCQkoS0VSTkVMMzIuMTYwKQogKi8KQk9PTCBXSU5BUEkgR2V0Q29tbVRpbWVvdXRzKEhBTkRMRSBoY29tLExQQ09NTVRJTUVPVVRTIGxwdGltZW91dHMpCnsKCUZJWE1FKCIoJXgsJXApOnN0dWIuXG4iLGhjb20sbHB0aW1lb3V0cyk7CglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVNldENvbW1UaW1lb3V0cwkJKEtFUk5FTDMyLjQ1MykKICovCkJPT0wgV0lOQVBJIFNldENvbW1UaW1lb3V0cyhIQU5ETEUgaGNvbSxMUENPTU1USU1FT1VUUyBscHRpbWVvdXRzKSB7CgkvKiBzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7ICovCglzdHJ1Y3QgdGVybWlvcwl0aW9zOwoJaW50CWZkOwoKCUZJWE1FKCIoJXgsJXApOnN0dWIuXG4iLGhjb20sbHB0aW1lb3V0cyk7CgkvKiAKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGhjb20pKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IS5cbiIsaGNvbSk7CgkJcmV0dXJuIEZBTFNFOwoJfQoJICovCgoJZmQgPSBDT01NX0dldFdyaXRlRmQoaGNvbSk7CglpZiAoZmQgPCAwKSB7CgkJRklYTUUoIm5vIGZkIGZvciBjaWQgPSAlMHghLlxuIixoY29tKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CgoKCUZJWE1FKCJSZWFkSW50ZXJ2YWxUaW1lb3V0ICVsZFxuIixscHRpbWVvdXRzLT5SZWFkSW50ZXJ2YWxUaW1lb3V0KTsKCUZJWE1FKCJSZWFkVG90YWxUaW1lb3V0TXVsdGlwbGllciAlbGRcbiIsbHB0aW1lb3V0cy0+UmVhZFRvdGFsVGltZW91dE11bHRpcGxpZXIpOwoJRklYTUUoIlJlYWRUb3RhbFRpbWVvdXRDb25zdGFudCAlbGRcbiIsbHB0aW1lb3V0cy0+UmVhZFRvdGFsVGltZW91dENvbnN0YW50KTsKCUZJWE1FKCJXcml0ZVRvdGFsVGltZW91dE11bHRpcGxpZXIgJWxkXG4iLGxwdGltZW91dHMtPldyaXRlVG90YWxUaW1lb3V0TXVsdGlwbGllcik7CglGSVhNRSgiV3JpdGVUb3RhbFRpbWVvdXRDb25zdGFudCAlbGRcbiIsbHB0aW1lb3V0cy0+V3JpdGVUb3RhbFRpbWVvdXRDb25zdGFudCk7CgoKCWlmICgtMT09dGNnZXRhdHRyKGZkLCZ0aW9zKSkgewoJCUZJWE1FKCJ0Y2dldGF0dHIgb24gZmQgJWQgZmFpbGVkIVxuIixmZCk7CgkJcmV0dXJuIEZBTFNFOwoJfQoJLyogVlRJTUUgaXMgaW4gMS8xMCBzZWNvbmRzICovCgl0aW9zLmNfY2NbVlRJTUVdPSAobHB0aW1lb3V0cy0+UmVhZEludGVydmFsVGltZW91dCs5OSkvMTAwOwoJaWYgKC0xPT10Y3NldGF0dHIoZmQsMCwmdGlvcykpIHsKCQlGSVhNRSgidGNzZXRhdHRyIG9uIGZkICVkIGZhaWxlZCFcbiIsZmQpOwoJCXJldHVybiBGQUxTRTsKCX0KCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIEdldENvbW1Nb2RlbVN0YXR1cyAgIChLRVJORUwzMi4yODUpCiAqLwpCT09MIFdJTkFQSSBHZXRDb21tTW9kZW1TdGF0dXMoSEFORExFIGhGaWxlLExQRFdPUkQgbHBNb2RlbVN0YXQgKQp7CglpbnQgZmQsbXN0YXQsIHJlc3VsdD1GQUxTRTsKCQoJKmxwTW9kZW1TdGF0PTA7CiNpZmRlZiBUSU9DTUdFVAoJZmQgPSBDT01NX0dldFdyaXRlRmQoaEZpbGUpOwoJaWYoZmQ8MCkKCQlyZXR1cm4gRkFMU0U7CglyZXN1bHQgPSBpb2N0bChmZCwgVElPQ01HRVQsICZtc3RhdCk7CgljbG9zZShmZCk7CglpZiAocmVzdWx0ID09IC0xKQoJICB7CgkgICAgVFJBQ0UoImlvY3RsIGZhaWxlZFxuIik7CgkgICAgcmV0dXJuIEZBTFNFOwoJICB9CglpZiAobXN0YXQgJiBUSU9DTV9DVFMpCgkgICAgKmxwTW9kZW1TdGF0IHw9IE1TX0NUU19PTjsKCWlmIChtc3RhdCAmIFRJT0NNX0RTUikKCSAgKmxwTW9kZW1TdGF0IHw9IE1TX0RTUl9PTjsKCWlmIChtc3RhdCAmIFRJT0NNX1JORykKCSAgKmxwTW9kZW1TdGF0IHw9IE1TX1JJTkdfT047CgkvKkZJWE1FOiAgTm90IHJlYWxseSBzdXJlIGFib3V0IFJMU0QgIFVCIDk5MDgxMCovCglpZiAobXN0YXQgJiBUSU9DTV9DQVIpCgkgICpscE1vZGVtU3RhdCB8PSBNU19STFNEX09OOwoJVFJBQ0UoIiVzJXMlcyVzXG4iLAoJICAgICAgKCpscE1vZGVtU3RhdCAmTVNfUkxTRF9PTik/Ik1TX1JMU0RfT04gIjoiIiwKCSAgICAgICgqbHBNb2RlbVN0YXQgJk1TX1JJTkdfT04pPyJNU19SSU5HX09OICI6IiIsCgkgICAgICAoKmxwTW9kZW1TdGF0ICZNU19EU1JfT04pPyJNU19EU1JfT04gIjoiIiwKCSAgICAgICgqbHBNb2RlbVN0YXQgJk1TX0NUU19PTik/Ik1TX0NUU19PTiAiOiIiKTsKCXJldHVybiBUUlVFOwojZWxzZQoJcmV0dXJuIEZBTFNFOwojZW5kaWYKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFdhaXRDb21tRXZlbnQgICAoS0VSTkVMMzIuNzE5KQogKi8KQk9PTCBXSU5BUEkgV2FpdENvbW1FdmVudChIQU5ETEUgaEZpbGUsTFBEV09SRCBldmVudG1hc2sgLExQT1ZFUkxBUFBFRCBvdmVybGFwcGVkKQp7CglGSVhNRSgiKCVkICVwICVwIClcbiIsaEZpbGUsIGV2ZW50bWFzayxvdmVybGFwcGVkKTsKCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIEdldENvbW1Qcm9wZXJ0aWVzICAgKEtFUk5FTDMyLjI4NikKICoKICogVGhpcyBmdW5jdGlvbiBmaWxscyBpbiBhIHN0cnVjdHVyZSB3aXRoIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIAogKiBjb21tdW5pY2F0aW9ucyBwb3J0IGRyaXZlci4KICoKICogUkVUVVJOUwogKgogKiAgVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlCiAqICBJZiBzdWNjZXNzZnVsLCB0aGUgbHBDb21tUHJvcCBzdHJ1Y3R1cmUgYmUgZmlsbGVkIGluIHdpdGgKICogIHByb3BlcnRpZXMgb2YgdGhlIGNvbW0gcG9ydC4KICovCkJPT0wgV0lOQVBJIEdldENvbW1Qcm9wZXJ0aWVzKAoJSEFORExFIGhGaWxlLCAgICAgICAgICAvKiBoYW5kbGUgb2YgdGhlIGNvbW0gcG9ydCAqLwoJTFBDT01NUFJPUCBscENvbW1Qcm9wIC8qIHBvaW50ZXIgdG8gc3RydWN0IHRvIGJlIGZpbGxlZCAqLwopIHsKICAgIEZJWE1FKCIoJWQgJXAgKVxuIixoRmlsZSxscENvbW1Qcm9wKTsKICAgIGlmKCFscENvbW1Qcm9wKQogICAgICAgIHJldHVybiBGQUxTRTsKCiAgICAvKgogICAgICogVGhlc2UgdmFsdWVzIHNob3VsZCBiZSB2YWxpZCBmb3IgTElOVVgncyBzZXJpYWwgZHJpdmVyCiAgICAgKiBGSVhNRTogUGVyaGFwcyB0aGV5IGRlc2VydmUgYW4gI2lmZGVmIExJTlVYCiAgICAgKi8KICAgIG1lbXNldChscENvbW1Qcm9wLDAsc2l6ZW9mKENPTU1QUk9QKSk7CiAgICBscENvbW1Qcm9wLT53UGFja2V0TGVuZ3RoICAgICAgID0gMTsKICAgIGxwQ29tbVByb3AtPndQYWNrZXRWZXJzaW9uICAgICAgPSAxOwogICAgbHBDb21tUHJvcC0+ZHdTZXJ2aWNlTWFzayAgICAgICA9IFNQX1NFUklBTENPTU07CiAgICBscENvbW1Qcm9wLT5kd1Jlc2VydmVkMSAgICAgICAgID0gMDsKICAgIGxwQ29tbVByb3AtPmR3TWF4VHhRdWV1ZSAgICAgICAgPSA0MDk2OwogICAgbHBDb21tUHJvcC0+ZHdNYXhSeFF1ZXVlICAgICAgICA9IDQwOTY7CiAgICBscENvbW1Qcm9wLT5kd01heEJhdWQgICAgICAgICAgID0gQkFVRF8xMTUyMDA7CiAgICBscENvbW1Qcm9wLT5kd1Byb3ZTdWJUeXBlICAgICAgID0gUFNUX1JTMjMyOwogICAgbHBDb21tUHJvcC0+ZHdQcm92Q2FwYWJpbGl0aWVzICA9IFBDRl9EVFJEU1IgfCBQQ0ZfUEFSSVRZX0NIRUNLIHwgUENGX1JUU0NUUyA7CiAgICBscENvbW1Qcm9wLT5kd1NldHRhYmxlUGFyYW1zICAgID0gU1BfQkFVRCB8IFNQX0RBVEFCSVRTIHwgU1BfSEFORFNIQUtJTkcgfCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUF9QQVJJVFkgfCBTUF9QQVJJVFlfQ0hFQ0sgfCBTUF9TVE9QQklUUyA7CiAgICBscENvbW1Qcm9wLT5kd1NldHRhYmxlQmF1ZCAgICAgID0gQkFVRF8wNzUgfCBCQVVEXzExMCB8IEJBVURfMTM0XzUgfCBCQVVEXzE1MCB8CiAgICAgICAgICAgICAgICBCQVVEXzMwMCB8IEJBVURfNjAwIHwgQkFVRF8xMjAwIHwgQkFVRF8xODAwIHwgQkFVRF8yNDAwIHwgQkFVRF80ODAwIHwKICAgICAgICAgICAgICAgIEJBVURfOTYwMCB8IEJBVURfMTkyMDAgfCBCQVVEXzM4NDAwIHwgQkFVRF81NzYwMCB8IEJBVURfMTE1MjAwIDsKICAgIGxwQ29tbVByb3AtPndTZXR0YWJsZURhdGEgICAgICAgPSBEQVRBQklUU181IHwgREFUQUJJVFNfNiB8IERBVEFCSVRTXzcgfCBEQVRBQklUU184IDsKICAgIGxwQ29tbVByb3AtPndTZXR0YWJsZVN0b3BQYXJpdHkgPSBTVE9QQklUU18xMCB8IFNUT1BCSVRTXzE1IHwgU1RPUEJJVFNfMjAgfCAKICAgICAgICAgICAgICAgIFBBUklUWV9OT05FIHwgUEFSSVRZX09ERCB8UEFSSVRZX0VWRU4gfCBQQVJJVFlfTUFSSyB8IFBBUklUWV9TUEFDRTsKICAgIGxwQ29tbVByb3AtPmR3Q3VycmVudFR4UXVldWUgICAgPSBscENvbW1Qcm9wLT5kd01heFR4UXVldWU7CiAgICBscENvbW1Qcm9wLT5kd0N1cnJlbnRSeFF1ZXVlICAgID0gbHBDb21tUHJvcC0+ZHdNYXhSeFF1ZXVlOwoKICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRklYTUU6CiAqIFRoZSBmdW5jdGlvbmFsaXR5IG9mIENvbW1Db25maWdEaWFsb2dBLCBHZXREZWZhdWx0Q29tbUNvbmZpZyBhbmQKICogU2V0RGVmYXVsdENvbW1Db25maWcgaXMgaW1wbGVtZW50ZWQgaW4gYSBETEwgKHVzdWFsbHkgU0VSSUFMVUkuRExMKS4KICogVGhpcyBpcyBkZXBlbmRlbnQgb24gdGhlIHR5cGUgb2YgQ09NTSBwb3J0LCBidXQgc2luY2UgaXQgaXMgZG91YnRmdWwKICogYW55Ym9keSB3aWxsIGdldCBhcm91bmQgdG8gaW1wbGVtZW50aW5nIHN1cHBvcnQgZm9yIGZhbmN5IHNlcmlhbAogKiBwb3J0cyBpbiBXSU5FLCB0aGlzIGlzIGhhcmRjb2RlZCBmb3IgdGhlIHRpbWUgYmVpbmcuICBUaGUgbmFtZSBvZiAKICogdGhpcyBETEwgc2hvdWxkIGJlIHN0b3JlZCBpbiBhbmQgcmVhZCBmcm9tIHRoZSBzeXN0ZW0gcmVnaXN0cnkgaW4gCiAqIHRoZSBoaXZlIEhLRVlfTE9DQUxfTUFDSElORSwga2V5CiAqIFN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXFNlcnZpY2VzXFxDbGFzc1xcUG9ydHNcXD8/Pz8KICogd2hlcmUgPz8/PyBpcyB0aGUgcG9ydCBudW1iZXIuLi4gdGhhdCBpcyBkZXRlcm1pbmVkIGJ5IFBOUAogKiBUaGUgRExMIHNob3VsZCBiZSBsb2FkZWQgd2hlbiB0aGUgQ09NTSBwb3J0IGlzIG9wZW5lZCwgYW5kIGNsb3NlZCAKICogd2hlbiB0aGUgQ09NTSBwb3J0IGlzIGNsb3NlZC4gLSBNSk0gMjAgSnVuZSAyMDAwCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIENIQVIgbHBzelNlcmlhbFVJW10gPSAic2VyaWFsdWkuZGxsIjsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIENvbW1Db25maWdEaWFsb2dBICAgKEtFUk5FTDMyLjE0MCkKICoKICogUmFpc2VzIGEgZGlhbG9nIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBhIGNvbW0gcG9ydC4KICogRmlsbHMgdGhlIENPTU1DT05GSUcgc3RydWN0IHdpdGggaW5mb3JtYXRpb24gc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgogKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBjYWxsIGEgc2ltaWxhciByb3V0aW5lIGluIHRoZSBDT01NIGRyaXZlci4uLgogKgogKiBSRVRVUk5TCiAqCiAqICBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUKICogIElmIHN1Y2Nlc3NmdWwsIHRoZSBscENvbW1Db25maWcgc3RydWN0dXJlIHdpbGwgY29udGFpbiBhIG5ldwogKiAgY29uZmlndXJhdGlvbiBmb3IgdGhlIGNvbW0gcG9ydCwgYXMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgogKgogKiBCVUdTCiAqICBUaGUgbGlicmFyeSB3aXRoIHRoZSBDb21tQ29uZmlnRGlhbG9nIGNvZGUgaXMgbmV2ZXIgdW5sb2FkZWQuCiAqIFBlcmhhcHMgdGhpcyBzaG91bGQgYmUgZG9uZSB3aGVuIHRoZSBjb21tIHBvcnQgaXMgY2xvc2VkPwogKi8KQk9PTCBXSU5BUEkgQ29tbUNvbmZpZ0RpYWxvZ0EoCglMUENTVFIgbHBzekRldmljZSwgICAgICAgICAvKiBuYW1lIG9mIGNvbW11bmljYXRpb25zIGRldmljZSAqLwoJSEFORExFIGhXbmQsICAgICAgICAgICAgICAgLyogcGFyZW50IHdpbmRvdyBmb3IgdGhlIGRpYWxvZyAqLwoJTFBDT01NQ09ORklHIGxwQ29tbUNvbmZpZyAgLyogcG9pbnRlciB0byBzdHJ1Y3QgdG8gZmlsbCAqLwopIHsKICAgIEZBUlBST0MgbHBmbkNvbW1EaWFsb2c7CiAgICBITU9EVUxFIGhDb25maWdNb2R1bGU7CiAgICBCT09MIHI7CgogICAgVFJBQ0UoIiglcCAleCAlcClcbiIsbHBzekRldmljZSwgaFduZCwgbHBDb21tQ29uZmlnKTsKCiAgICBoQ29uZmlnTW9kdWxlID0gTG9hZExpYnJhcnlBKGxwc3pTZXJpYWxVSSk7CiAgICBpZighaENvbmZpZ01vZHVsZSkKICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgbHBmbkNvbW1EaWFsb2cgPSBHZXRQcm9jQWRkcmVzcyhoQ29uZmlnTW9kdWxlLCAoTFBDU1RSKTNMKTsKCiAgICBpZighbHBmbkNvbW1EaWFsb2cpCiAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgIHIgPSBscGZuQ29tbURpYWxvZyhscHN6RGV2aWNlLGhXbmQsbHBDb21tQ29uZmlnKTsKCiAgICAvKiBVbmxvYWRMaWJyYXJ5KGhDb25maWdNb2R1bGUpOyAqLwoKICAgIHJldHVybiByOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIENvbW1Db25maWdEaWFsb2dXICAgKEtFUk5FTDMyLjE0MSkKICoKICogc2VlIENvbW1Db25maWdEaWFsb2dBIGZvciBtb3JlIGluZm8KICovCkJPT0wgV0lOQVBJIENvbW1Db25maWdEaWFsb2dXKAoJTFBDV1NUUiBscHN6RGV2aWNlLCAgICAgICAgLyogbmFtZSBvZiBjb21tdW5pY2F0aW9ucyBkZXZpY2UgKi8KCUhBTkRMRSBoV25kLCAgICAgICAgICAgICAgIC8qIHBhcmVudCB3aW5kb3cgZm9yIHRoZSBkaWFsb2cgKi8KCUxQQ09NTUNPTkZJRyBscENvbW1Db25maWcgIC8qIHBvaW50ZXIgdG8gc3RydWN0IHRvIGZpbGwgKi8KKSB7CiAgICBCT09MIHI7CiAgICBMUFNUUiBscERldmljZUE7CgogICAgbHBEZXZpY2VBID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBscHN6RGV2aWNlICk7CiAgICBpZihscERldmljZUEpCiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgciA9IENvbW1Db25maWdEaWFsb2dBKGxwRGV2aWNlQSxoV25kLGxwQ29tbUNvbmZpZyk7CiAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHBEZXZpY2VBICk7CiAgICByZXR1cm4gcjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBHZXRDb21tQ29uZmlnICAgICAoS0VSTkVMMzIuMjgzKQogKgogKiBGaWxsIGluIHRoZSBDT01NQ09ORklHIHN0cnVjdHVyZSBmb3IgdGhlIGNvbW0gcG9ydCBoRmlsZQogKgogKiBSRVRVUk5TCiAqCiAqICBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUKICogIElmIHN1Y2Nlc3NmdWwsIGxwQ29tbUNvbmZpZyBjb250YWlucyB0aGUgY29tbSBwb3J0IGNvbmZpZ3VyYXRpb24uCiAqLwpCT09MIFdJTkFQSSBHZXRDb21tQ29uZmlnKAoJSEZJTEUgaEZpbGUsCglMUENPTU1DT05GSUcgbHBDb21tQ29uZmlnCikgewogICAgQk9PTCByOwoKICAgIFRSQUNFKCIoJXggJXApXG4iLGhGaWxlLGxwQ29tbUNvbmZpZyk7CgogICAgaWYobHBDb21tQ29uZmlnID09IE5VTEwpCiAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgIGxwQ29tbUNvbmZpZy0+ZHdTaXplID0gc2l6ZW9mKENPTU1DT05GSUcpOwogICAgbHBDb21tQ29uZmlnLT53VmVyc2lvbiA9IDE7CiAgICBscENvbW1Db25maWctPndSZXNlcnZlZCA9IDA7CiAgICByID0gR2V0Q29tbVN0YXRlKGhGaWxlLCZscENvbW1Db25maWctPmRjYik7CiAgICBscENvbW1Db25maWctPmR3UHJvdmlkZXJTdWJUeXBlID0gUFNUX1JTMjMyOwogICAgbHBDb21tQ29uZmlnLT5kd1Byb3ZpZGVyT2Zmc2V0ID0gMDsKICAgIGxwQ29tbUNvbmZpZy0+ZHdQcm92aWRlclNpemUgPSAwOwoKICAgIHJldHVybiByOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFNldENvbW1Db25maWcgICAgIChLRVJORUwzMi42MTcpCiAqCiAqLwpCT09MIFdJTkFQSSBTZXRDb21tQ29uZmlnKAoJSEZJTEUgaEZpbGUsCglMUENPTU1DT05GSUcgbHBDb21tQ29uZmlnCikgewogICAgQk9PTCByOwoKICAgIFRSQUNFKCIoJXggJXApXG4iLGhGaWxlLGxwQ29tbUNvbmZpZyk7CiAgICAKICAgIHIgPSBTZXRDb21tU3RhdGUoaEZpbGUsJmxwQ29tbUNvbmZpZy0+ZGNiKTsKICAgIHJldHVybiByOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFNldERlZmF1bHRDb21tQ29uZmlnQSAgIChLRVJORUwzMi5AKQogKi8KQk9PTCBXSU5BUEkgU2V0RGVmYXVsdENvbW1Db25maWdBKAoJTFBDU1RSIGxwc3pEZXZpY2UsIAoJTFBDT01NQ09ORklHIGxwQ29tbUNvbmZpZywKCURXT1JEIGR3U2l6ZQopIHsKICAgIEZBUlBST0MgbHBmblNldERlZmF1bHRDb21tQ29uZmlnOwogICAgSE1PRFVMRSBoQ29uZmlnTW9kdWxlOwogICAgQk9PTCByOwoKICAgIFRSQUNFKCIoJXAgJXAgJWx4KVxuIixscHN6RGV2aWNlLCBscENvbW1Db25maWcsIGR3U2l6ZSk7CgogICAgaENvbmZpZ01vZHVsZSA9IExvYWRMaWJyYXJ5QShscHN6U2VyaWFsVUkpOwogICAgaWYoIWhDb25maWdNb2R1bGUpCiAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgIGxwZm5TZXREZWZhdWx0Q29tbUNvbmZpZyA9IEdldFByb2NBZGRyZXNzKGhDb25maWdNb2R1bGUsIChMUENTVFIpNEwpOwoKICAgIGlmKCEgbHBmblNldERlZmF1bHRDb21tQ29uZmlnKQoJcmV0dXJuIFRSVUU7CgogICAgciA9IGxwZm5TZXREZWZhdWx0Q29tbUNvbmZpZyhscHN6RGV2aWNlLCBscENvbW1Db25maWcsIGR3U2l6ZSk7CgogICAgLyogVW5sb2FkTGlicmFyeShoQ29uZmlnTW9kdWxlKTsgKi8KCiAgICByZXR1cm4gcjsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgU2V0RGVmYXVsdENvbW1Db25maWdXICAgICAoS0VSTkVMMzIuNjM5KQogKgogKi8KQk9PTCBXSU5BUEkgU2V0RGVmYXVsdENvbW1Db25maWdXKAoJTFBDV1NUUiBscHN6RGV2aWNlLCAKCUxQQ09NTUNPTkZJRyBscENvbW1Db25maWcsCglEV09SRCBkd1NpemUKKSB7CiAgICBCT09MIHI7CiAgICBMUFNUUiBscERldmljZUE7CgogICAgVFJBQ0UoIiglcyAlcCAlbHgpXG4iLGRlYnVnc3RyX3cobHBzekRldmljZSksbHBDb21tQ29uZmlnLGR3U2l6ZSk7CgogICAgbHBEZXZpY2VBID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBscHN6RGV2aWNlICk7CiAgICBpZihscERldmljZUEpCiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgciA9IFNldERlZmF1bHRDb21tQ29uZmlnQShscERldmljZUEsbHBDb21tQ29uZmlnLGR3U2l6ZSk7CiAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHBEZXZpY2VBICk7CiAgICByZXR1cm4gcjsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgR2V0RGVmYXVsdENvbW1Db25maWdBICAgKEtFUk5FTDMyLjMxMykKICovCkJPT0wgV0lOQVBJIEdldERlZmF1bHRDb21tQ29uZmlnQShMUENTVFIgbHBzek5hbWUsTFBDT01NQ09ORklHIGxwQ0MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCBscGR3U2l6ZSkKeyAgICAKICAgICBMUERDQiBscGRjYiA9ICYobHBDQy0+ZGNiKTsKICAgICBjaGFyICB0ZW1wWzQwXTsKCiAgICAgaWYgKHN0cm5jYXNlY21wKGxwc3pOYW1lLCJDT00iLDMpKSB7CiAgICAgICAgRVJSKCJub3QgaW1wbGVtZW50ZWQgZm9yIDwlcz5cbiIsIGxwc3pOYW1lKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQoKICAgICBpZiAoIVZhbGlkQ09NUG9ydChscHN6TmFtZVszXS0nMScpKQogICAgICAgIHJldHVybiBGQUxTRTsKCiAgICAgVFJBQ0UoIiglcyAlcCAlbGQpXG4iLCBscHN6TmFtZSwgbHBDQywgKmxwZHdTaXplICk7CiAgICAgaWYgKCpscGR3U2l6ZSA8IHNpemVvZihDT01NQ09ORklHKSkgewogICAgICAgICAqbHBkd1NpemUgPSBzaXplb2YoQ09NTUNPTkZJRyk7CiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgIH0KCiAgICAgKmxwZHdTaXplID0gc2l6ZW9mKENPTU1DT05GSUcpOwoKICAgICBscENDLT5kd1NpemUgPSBzaXplb2YoQ09NTUNPTkZJRyk7CiAgICAgbHBDQy0+d1ZlcnNpb24gPSAxOwogICAgIGxwQ0MtPmR3UHJvdmlkZXJTdWJUeXBlID0gUFNUX1JTMjMyOwogICAgIGxwQ0MtPmR3UHJvdmlkZXJPZmZzZXQgPSAwTDsKICAgICBscENDLT5kd1Byb3ZpZGVyU2l6ZSA9IDBMOwoKICAgICAodm9pZCkgc3ByaW50ZiggdGVtcCwgIkNPTSVjOjM4NDAwLG4sOCwxIiwgbHBzek5hbWVbM10pOwogICAgIEZJWE1FKCJzZXR0aW5nICVzIGFzIGRlZmF1bHRcbiIsIHRlbXApOwoKICAgICByZXR1cm4gQnVpbGRDb21tRENCQSggdGVtcCwgbHBkY2IpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXREZWZhdWx0Q29tbUNvbmZpZ1cJCShLRVJORUwzMi4zMTQpCiAqLwpCT09MIFdJTkFQSSBHZXREZWZhdWx0Q29tbUNvbmZpZ1coIExQQ1dTVFIgbHBzek5hbWUsTFBDT01NQ09ORklHIGxwQ0MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCBscGR3U2l6ZSkKewoJTFBTVFIJbHBzek5hbWVBOwoJQk9PTAlyZXQ7CgoJVFJBQ0UoIiglcCwlcCwlbGQpXG4iLGxwc3pOYW1lLGxwQ0MsKmxwZHdTaXplKTsKCWxwc3pOYW1lQSA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHBzek5hbWUgKTsKCXJldD1HZXREZWZhdWx0Q29tbUNvbmZpZ0EobHBzek5hbWVBLGxwQ0MsbHBkd1NpemUpOwogICAgICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBscHN6TmFtZUEgKTsKCXJldHVybiByZXQ7Cn0K