LyogLSotIHRhYi13aWR0aDogODsgYy1iYXNpYy1vZmZzZXQ6IDQgLSotICovCgovKgogKiBTYW1wbGUgTUlESSBXaW5lIERyaXZlciBmb3IgTGludXgKICoKICogQ29weXJpZ2h0IDE5OTQgTWFydGluIEF5b3R0ZQogKi8KCi8qIAogKiBFcmljIFBPVUVDSCA6IAogKiA5OC83IGNoYW5nZXMgZm9yIG1ha2luZyB0aGlzIE1JREkgZHJpdmVyIHdvcmsgb24gT1NTCiAqIAljdXJyZW50IHN1cHBvcnQgaXMgbGltaXRlZCB0byBNSURJIHBvcnRzIG9mIE9TUyBzeXN0ZW1zCiAqIDk4LzkJcmV3cml0aW5nIE1DSSBjb2RlIGZvciBNSURJCiAqIDk4LzExIHNwbGl0dGVkIGluIG1pZGkuYyBhbmQgbWNpbWlkaS5jCiAqLwoKI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgIm11bHRpbWVkaWEuaCIKI2luY2x1ZGUgInVzZXIuaCIKI2luY2x1ZGUgImRyaXZlci5oIgojaW5jbHVkZSAiaGVhcC5oIgojaW5jbHVkZSAiZGVidWd0b29scy5oIgoKREVDTEFSRV9ERUJVR19DSEFOTkVMKG1jaW1pZGkpCkRFQ0xBUkVfREVCVUdfQ0hBTk5FTChtaWRpKQoKdHlwZWRlZiBzdHJ1Y3QgewogICAgRFdPUkQJCWR3Rmlyc3Q7CQkvKiBvZmZzZXQgaW4gZmlsZSBvZiB0cmFjayAqLwogICAgRFdPUkQJCWR3TGFzdDsJCQkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gZmlsZSBvZiB0cmFjayAqLwogICAgRFdPUkQJCWR3SW5kZXg7CQkvKiBjdXJyZW50IGluZGV4IGluIGZpbGUgKGR3Rmlyc3QgPD0gZHdJbmRleCA8IGR3TGFzdCkgKi8KICAgIERXT1JECQlkd0xlbmd0aDsJCS8qIG51bWJlciBvZiBwdWxzZXMgaW4gdGhpcyB0cmFjayAqLwogICAgRFdPUkQJCWR3RXZlbnRQdWxzZTsJCS8qIGN1cnJlbnQgcHVsc2UgIyAoZXZlbnQpIHBvaW50ZWQgYnkgZHdJbmRleCAqLwogICAgRFdPUkQJCWR3RXZlbnREYXRhOwkJLyogY3VycmVudCBkYXRhICAgIChldmVudCkgcG9pbnRlZCBieSBkd0luZGV4ICovCiAgICBXT1JECQl3RXZlbnRMZW5ndGg7CQkvKiBjdXJyZW50IGxlbmd0aCAgKGV2ZW50KSBwb2ludGVkIGJ5IGR3SW5kZXggKi8KICAgIFdPUkQJCXdTdGF0dXMgOiAxLAkJLyogMSA6IHBsYXlpbmcsIDAgOiBkb25lICovCgkgICAgICAgICAgICAgICAgd1RyYWNrTnIgOiA3LAoJICAgICAgICAgICAgICAgIHdMYXN0Q29tbWFuZCA6IDg7Cn0gTUNJX01JRElUUkFDSzsKCnR5cGVkZWYgc3RydWN0IHsKICAgIFVJTlQxNgkJd0RldklEOwogICAgVUlOVDE2CQl3TWlkaUlEOwogICAgaW50CQkJblVzZUNvdW50OyAgICAgICAgICAJLyogSW5jcmVtZW50ZWQgZm9yIGVhY2ggc2hhcmVkIG9wZW4gICAgICAgICAgKi8KICAgIFdPUkQJCXdOb3RpZnlEZXZpY2VJRDsgICAgCS8qIE1DSSBkZXZpY2UgSUQgd2l0aCBhIHBlbmRpbmcgbm90aWZpY2F0aW9uICovCiAgICBIQU5ETEUxNiAJCWhDYWxsYmFjazsgICAgICAgICAJLyogQ2FsbGJhY2sgaGFuZGxlIGZvciBwZW5kaW5nIG5vdGlmaWNhdGlvbiAgKi8KICAgIEhNTUlPCQloRmlsZTsJICAgICAgICAgICAgCS8qIG1taW8gZmlsZSBoYW5kbGUgb3BlbiBhcyBFbGVtZW50ICAgICAgICAgICovCiAgICBNQ0lfT1BFTl9QQVJNU0EgCW9wZW5QYXJtczsKICAgIEhMT0NBTDE2CQloTWlkaUhkcjsKICAgIFdPUkQJCWR3U3RhdHVzOwkJLyogb25lIGZyb20gTUNJX01PREVfeHh4eCAqLwogICAgRFdPUkQJCWR3TWNpVGltZUZvcm1hdDsJLyogT25lIG9mIHRoZSBzdXBwb3J0ZWQgTUNJX0ZPUk1BVF94eHh4ICovCSAgICAgICAKICAgIFdPUkQJCXdGb3JtYXQ7CQkvKiBGb3JtYXQgb2YgTUlESSBoRmlsZSAoMCwgMSBvciAyKSAqLwogICAgV09SRAkJblRyYWNrczsJCS8qIE51bWJlciBvZiB0cmFja3MgaW4gaEZpbGUgKi8KICAgIFdPUkQJCW5EaXZpc2lvbjsJCS8qIE51bWJlciBvZiBkaXZpc2lvbiBpbiBoRmlsZSBQUFFOIG9yIFNNUFRFICovCiAgICBXT1JECQl3U3RhcnRlZFBsYXlpbmc7CiAgICBEV09SRAkJZHdUZW1wbzsJCS8qIFRlbXBvICgjIG9mIDEvNCBub3RlIHBlciBzZWNvbmQgKi8KICAgIE1DSV9NSURJVFJBQ0sqICAgICAJdHJhY2tzOwkJCS8qIENvbnRlbnQgb2YgZWFjaCB0cmFjayAqLwogICAgRFdPUkQJCWR3UHVsc2U7CQkKICAgIERXT1JECQlkd1Bvc2l0aW9uTVM7CiAgICBEV09SRAkJZHdTdGFydFRpY2tzOwp9IFdJTkVfTUNJTUlESTsKCiNkZWZpbmUgTUFYX01DSU1JRElEUlYgCSgxKQpzdGF0aWMgV0lORV9NQ0lNSURJCU1DSU1pZGlEZXZbTUFYX01DSU1JRElEUlZdOwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KgogKiAgICAgICAgICAgICAgICAgIAkgICAgTUNJIE1JREkgaW1wbGVtYW50YXRpb24JCQkqCiAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgojaWZkZWYgU05EQ1RMX01JRElfSU5GTwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfZHJ2R2V0RHJ2CQlbaW50ZXJuYWxdCQogKi8Kc3RhdGljIFdJTkVfTUNJTUlESSogIE1JRElfZHJ2R2V0RHJ2KFVJTlQxNiB3RGV2SUQpCnsKICAgIGludAlpOwoKICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTUNJTUlESURSVjsgaSsrKSB7CglpZiAoTUNJTWlkaURldltpXS53RGV2SUQgPT0gd0RldklEKSB7CgkgICAgcmV0dXJuICZNQ0lNaWRpRGV2W2ldOwoJfQogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9kcnZPcGVuCQkJW2ludGVybmFsXQkKICovCnN0YXRpYwlEV09SRAlNSURJX2Rydk9wZW4oTFBTVFIgc3RyLCBMUE1DSV9PUEVOX0RSSVZFUl9QQVJNU0EgbW9kcCkKewogICAgaW50CWk7CgogICAgZm9yIChpID0gMDsgaSA8IE1BWF9NQ0lNSURJRFJWOyBpKyspIHsKCWlmIChNQ0lNaWRpRGV2W2ldLndEZXZJRCA9PSAwKSB7CgkgICAgTUNJTWlkaURldltpXS53RGV2SUQgPSBtb2RwLT53RGV2aWNlSUQ7CgkgICAgbW9kcC0+d0N1c3RvbUNvbW1hbmRUYWJsZSA9IC0xOwoJICAgIG1vZHAtPndUeXBlID0gTUNJX0RFVlRZUEVfQ0RfQVVESU87CgkgICAgcmV0dXJuIG1vZHAtPndEZXZpY2VJRDsKCX0KICAgIH0KICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1DSU1JRElfZHJ2Q2xvc2UJCVtpbnRlcm5hbF0JCiAqLwpzdGF0aWMJRFdPUkQJTUlESV9kcnZDbG9zZShEV09SRCBkd0RldklEKQp7CiAgICBXSU5FX01DSU1JREkqICB3bW0gPSBNSURJX2RydkdldERydihkd0RldklEKTsKCiAgICBpZiAod21tKSB7Cgl3bW0tPndEZXZJRCA9IDA7CglyZXR1cm4gMTsKICAgIH0KICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpR2V0T3BlbkRldgkJW2ludGVybmFsXQkKICovCnN0YXRpYyBXSU5FX01DSU1JREkqICBNSURJX21jaUdldE9wZW5EZXYoVUlOVDE2IHdEZXZJRCkKewogICAgV0lORV9NQ0lNSURJKgl3bW0gPSBNSURJX2RydkdldERydih3RGV2SUQpOwogICAgCiAgICBpZiAod21tID09IE5VTEwgfHwgd21tLT5uVXNlQ291bnQgPT0gMCkgewoJV0FSTl8obWNpbWlkaSkoIkludmFsaWQgd0RldklEPSV1XG4iLCB3RGV2SUQpOwoJcmV0dXJuIDA7CiAgICB9CiAgICByZXR1cm4gd21tOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpUmVhZEJ5dGUJCVtpbnRlcm5hbF0JCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lSZWFkQnl0ZShXSU5FX01DSU1JREkqIHdtbSwgQllURSAqbHBieXQpCnsKICAgIERXT1JECXJldCA9IDA7CiAgICAKICAgIGlmIChscGJ5dCA9PSBOVUxMIHx8IAoJbW1pb1JlYWQod21tLT5oRmlsZSwgKEhQU1RSKWxwYnl0LCAobG9uZylzaXplb2YoQllURSkpICE9IChsb25nKXNpemVvZihCWVRFKSkgewoJV0FSTl8obWNpbWlkaSkoIkVycm9yIHJlYWRpbmcgd21tPSVwXG4iLCB3bW0pOwoJcmV0ID0gTUNJRVJSX0lOVkFMSURfRklMRTsKICAgIH0KICAgIAogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVJlYWRXb3JkCQlbaW50ZXJuYWxdCQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpUmVhZFdvcmQoV0lORV9NQ0lNSURJKiB3bW0sIExQV09SRCBscHcpCnsKICAgIEJZVEUJaGlieXRlLCBsb2J5dGU7CiAgICBEV09SRAlyZXQgPSBNQ0lFUlJfSU5WQUxJRF9GSUxFOwogICAgCiAgICBpZiAobHB3ICE9IE5VTEwgJiYgCglNSURJX21jaVJlYWRCeXRlKHdtbSwgJmhpYnl0ZSkgPT0gMCAmJiAKCU1JRElfbWNpUmVhZEJ5dGUod21tLCAmbG9ieXRlKSA9PSAwKSB7CgkqbHB3ID0gKChXT1JEKWhpYnl0ZSA8PCA4KSArIGxvYnl0ZTsKCXJldCA9IDA7CiAgICB9CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpUmVhZExvbmcJCVtpbnRlcm5hbF0JCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lSZWFkTG9uZyhXSU5FX01DSU1JREkqIHdtbSwgTFBEV09SRCBscGR3KQp7CiAgICBXT1JECWhpd29yZCwgbG93b3JkOwogICAgRFdPUkQJcmV0ID0gTUNJRVJSX0lOVkFMSURfRklMRTsKICAgIAogICAgaWYgKGxwZHcgIT0gTlVMTCAmJgoJTUlESV9tY2lSZWFkV29yZCh3bW0sICZoaXdvcmQpID09IDAgJiYKCU1JRElfbWNpUmVhZFdvcmQod21tLCAmbG93b3JkKSA9PSAwKSB7CgkqbHBkdyA9IE1BS0VMT05HKGxvd29yZCwgaGl3b3JkKTsKCXJldCA9IDA7CiAgICB9CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIAkJCQlNSURJX21jaVJlYWRWYXJ5TGVuCQlbaW50ZXJuYWxdCQogKi8Kc3RhdGljIFdPUkQgTUlESV9tY2lSZWFkVmFyeUxlbihXSU5FX01DSU1JREkqIHdtbSwgTFBEV09SRCBscGR3KQp7CiAgICBCWVRFCWJ5dGU7CiAgICBEV09SRAl2YWx1ZSA9IDA7CiAgICBXT1JECXJldCA9IDA7CiAgICAKICAgIGlmIChscGR3ID09IE5VTEwpIHsKCXJldCA9IE1DSUVSUl9JTlZBTElEX0ZJTEU7CiAgICB9IGVsc2UgewoJZG8gewoJICAgIGlmIChNSURJX21jaVJlYWRCeXRlKHdtbSwgJmJ5dGUpICE9IDApIHsKCQlyZXR1cm4gMDsKCSAgICB9CgkgICAgdmFsdWUgPSAodmFsdWUgPDwgNykgKyAoYnl0ZSAmIDB4N0YpOwoJICAgIHJldCsrOyAKCX0gd2hpbGUgKGJ5dGUgJiAweDgwKTsKCSpscGR3ID0gdmFsdWU7CgkvKgoJICBUUkFDRShtY2ltaWRpLCAidmFsPSUwOGxYIFxuIiwgdmFsdWUpOwoJKi8KICAgIH0KICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lSZWFkTmV4dEV2ZW50CQlbaW50ZXJuYWxdCQogKi8Kc3RhdGljIERXT1JECU1JRElfbWNpUmVhZE5leHRFdmVudChXSU5FX01DSU1JREkqIHdtbSwgTUNJX01JRElUUkFDSyogbW10KSAKewogICAgQllURQliMSwgYjIgPSAwLCBiMzsKICAgIFdPUkQJaHcgPSAwOwogICAgRFdPUkQJZXZ0UHVsc2U7CiAgICBEV09SRAlldnRMZW5ndGg7CiAgICBEV09SRAl0bXA7CiAgICAKICAgIGlmIChtbWlvU2Vlayh3bW0tPmhGaWxlLCBtbXQtPmR3SW5kZXgsIFNFRUtfU0VUKSAhPSBtbXQtPmR3SW5kZXgpIHsKCVdBUk5fKG1jaW1pZGkpKCJDYW4ndCBzZWVrIGF0ICUwOGxYIFxuIiwgbW10LT5kd0luZGV4KTsKCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9GSUxFOwogICAgfQogICAgZXZ0TGVuZ3RoID0gTUlESV9tY2lSZWFkVmFyeUxlbih3bW0sICZldnRQdWxzZSkgKyAxOwkvKiA+IDAgKi8KICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmYjEpOwogICAgc3dpdGNoIChiMSkgewogICAgY2FzZSAweEYwOgogICAgY2FzZSAweEY3OgoJZXZ0TGVuZ3RoICs9IE1JRElfbWNpUmVhZFZhcnlMZW4od21tLCAmdG1wKTsKCWV2dExlbmd0aCArPSB0bXA7CglicmVhazsKICAgIGNhc2UgMHhGRjoKCU1JRElfbWNpUmVhZEJ5dGUod21tLCAmYjIpOwlldnRMZW5ndGgrKzsKCQoJZXZ0TGVuZ3RoICs9IE1JRElfbWNpUmVhZFZhcnlMZW4od21tLCAmdG1wKTsKCWlmIChldnRMZW5ndGggPj0gMHgxMDAwMHUpIHsKCSAgICAvKiB0aGlzIGxpbWl0YXRpb24gc2hvdWxkbid0IGJlIGEgcHJvYmxlbSAqLwoJICAgIFdBUk5fKG1jaW1pZGkpKCJPdWNoICEhIEltcGxlbWVudGF0aW9uIGxpbWl0YXRpb24gdG8gNjRrIGJ5dGVzIGZvciBhIE1JREkgZXZlbnQgaXMgb3ZlcmZsb3dlZFxuIik7CgkgICAgaHcgPSAweEZGRkY7Cgl9IGVsc2UgewoJICAgIGh3ID0gTE9XT1JEKGV2dExlbmd0aCk7Cgl9CglldnRMZW5ndGggKz0gdG1wOwoJYnJlYWs7CiAgICBkZWZhdWx0OgoJaWYgKGIxICYgMHg4MCkgeyAvKiB1c2UgcnVubmluZyBzdGF0dXMgPyAqLwoJICAgIG1tdC0+d0xhc3RDb21tYW5kID0gYjE7CgkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZiMik7CWV2dExlbmd0aCsrOwoJfSBlbHNlIHsKCSAgICBiMiA9IGIxOwoJICAgIGIxID0gbW10LT53TGFzdENvbW1hbmQ7Cgl9Cglzd2l0Y2ggKChiMSA+PiA0KSAmIDB4MDcpIHsKCWNhc2UgMDoJY2FzZSAxOgljYXNlIDI6IGNhc2UgMzogY2FzZSA2OgoJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmYjMpOwlldnRMZW5ndGgrKzsKCSAgICBodyA9IGIzOwoJICAgIGJyZWFrOwoJY2FzZSA0OgljYXNlIDU6CgkgICAgYnJlYWs7CgljYXNlIDc6CgkgICAgV0FSTl8obWNpbWlkaSkoIlN0cmFuZ2UgaW5kZWVkIGIxPTB4JTAyeFxuIiwgYjEpOwoJfQoJYnJlYWs7CiAgICB9CiAgICBpZiAobW10LT5kd0luZGV4ICsgZXZ0TGVuZ3RoID4gbW10LT5kd0xhc3QpCglyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogICAgCiAgICBtbXQtPmR3RXZlbnRQdWxzZSArPSBldnRQdWxzZTsKICAgIG1tdC0+ZHdFdmVudERhdGEgICA9IChodyA8PCAxNikgKyAoYjIgPDwgOCkgKyBiMTsKICAgIG1tdC0+d0V2ZW50TGVuZ3RoICA9IGV2dExlbmd0aDsKICAgIAogICAgLyoKICAgICAgVFJBQ0UobWNpbWlkaSwgIlsldV0gPT4gcHVsc2U9JTA4bHgoJTA4bHgpLCBkYXRhPSUwOGx4LCBsZW5ndGg9JXVcbiIsIAogICAgICBtbXQtPndUcmFja05yLCBtbXQtPmR3RXZlbnRQdWxzZSwgZXZ0UHVsc2UsIAogICAgICBtbXQtPmR3RXZlbnREYXRhLCBtbXQtPndFdmVudExlbmd0aCk7CiAgICAqLwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lSZWFkTVRyawkJW2ludGVybmFsXQkKICovCnN0YXRpYyBEV09SRCBNSURJX21jaVJlYWRNVHJrKFdJTkVfTUNJTUlESSogd21tLCBNQ0lfTUlESVRSQUNLKiBtbXQpCnsKICAgIERXT1JECQl0b2JlcmVhZDsKICAgIEZPVVJDQwkJZm91cmNjOwogICAgCiAgICBpZiAobW1pb1JlYWQod21tLT5oRmlsZSwgKEhQU1RSKSZmb3VyY2MsIChsb25nKXNpemVvZihGT1VSQ0MpKSAhPSAKCShsb25nKXNpemVvZihGT1VSQ0MpKSB7CglyZXR1cm4gTUNJRVJSX0lOVkFMSURfRklMRTsKICAgIH0KICAgIAogICAgaWYgKGZvdXJjYyAhPSBtbWlvRk9VUkNDKCdNJywgJ1QnLCAncicsICdrJykpIHsKCVdBUk5fKG1jaW1pZGkpKCJDYW4ndCBzeW5jaHJvbml6ZSBvbiAnTVRyaycgIVxuIik7CglyZXR1cm4gTUNJRVJSX0lOVkFMSURfRklMRTsKICAgIH0KICAgIAogICAgaWYgKE1JRElfbWNpUmVhZExvbmcod21tLCAmdG9iZXJlYWQpICE9IDApIHsKCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9GSUxFOwogICAgfQogICAgbW10LT5kd0ZpcnN0ID0gbW1pb1NlZWsod21tLT5oRmlsZSwgMCwgU0VFS19DVVIpOyAvKiA+PSAwICovCiAgICBtbXQtPmR3TGFzdCA9IG1tdC0+ZHdGaXJzdCArIHRvYmVyZWFkOwogICAgCiAgICAvKiBjb21wdXRlICMgb2YgcHVsc2VzIGluIHRoaXMgdHJhY2sgKi8KICAgIG1tdC0+ZHdJbmRleCA9IG1tdC0+ZHdGaXJzdDsKICAgIG1tdC0+ZHdFdmVudFB1bHNlID0gMDsKICAgIAogICAgd2hpbGUgKE1JRElfbWNpUmVhZE5leHRFdmVudCh3bW0sIG1tdCkgPT0gMCAmJiAKCSAgIExPV09SRChtbXQtPmR3RXZlbnREYXRhKSAhPSAweDJGRkYpIHsJCgltbXQtPmR3SW5kZXggKz0gbW10LT53RXZlbnRMZW5ndGg7CiAgICB9CiAgICBtbXQtPmR3TGVuZ3RoID0gbW10LT5kd0V2ZW50UHVsc2U7CiAgICAKICAgIFRSQUNFXyhtY2ltaWRpKSgiVHJhY2sgJXUgaGFzICVsdSBieXRlcyBhbmQgJWx1IHB1bHNlc1xuIiwgbW10LT53VHJhY2tOciwgdG9iZXJlYWQsIG1tdC0+ZHdMZW5ndGgpOwogICAgCiAgICAvKiByZXNldCB0cmFjayBkYXRhICovCiAgICBtbXQtPndTdGF0dXMgPSAxOwkvKiBvaywgcGxheWluZyAqLwogICAgbW10LT5kd0luZGV4ID0gbW10LT5kd0ZpcnN0OwogICAgbW10LT5kd0V2ZW50UHVsc2UgPSAwOwogICAgCiAgICBpZiAobW1pb1NlZWsod21tLT5oRmlsZSwgMCwgU0VFS19DVVIpICE9IG1tdC0+ZHdMYXN0KSB7CglXQVJOXyhtY2ltaWRpKSgiT3VjaCwgb3V0IG9mIHN5bmMgc2Vlaz0lbHUgdHJhY2s9JWx1XG4iLCAKCSAgICAgbW1pb1NlZWsod21tLT5oRmlsZSwgMCwgU0VFS19DVVIpLCBtbXQtPmR3TGFzdCk7CgkvKiBwb3NpdGlvbiBhdCBlbmQgb2YgdGhpcyB0cmFjaywgdG8gYmUgcmVhZHkgdG8gcmVhZCBuZXh0IHRyYWNrICovCgltbWlvU2Vlayh3bW0tPmhGaWxlLCBtbXQtPmR3TGFzdCwgU0VFS19TRVQpOwogICAgfQogICAgCiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVJlYWRNVGhkCQlbaW50ZXJuYWxdCQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpUmVhZE1UaGQoV0lORV9NQ0lNSURJKiB3bW0sIERXT1JEIGR3T2Zmc2V0KQp7CiAgICBEV09SRAl0b2JlcmVhZDsKICAgIEZPVVJDQwlmb3VyY2M7CiAgICBXT1JECW50OwogICAgCiAgICBUUkFDRV8obWNpbWlkaSkoIiglcCwgJTA4bFgpO1xuIiwgd21tLCBkd09mZnNldCk7CiAgICAKICAgIGlmIChtbWlvU2Vlayh3bW0tPmhGaWxlLCBkd09mZnNldCwgU0VFS19TRVQpICE9IGR3T2Zmc2V0KSB7CglXQVJOXyhtY2ltaWRpKSgiQ2FuJ3Qgc2VlayBhdCAlMDhsWCBiZWdpbiBvZiAnTVRoZCcgXG4iLCBkd09mZnNldCk7CglyZXR1cm4gTUNJRVJSX0lOVkFMSURfRklMRTsKICAgIH0KICAgIGlmIChtbWlvUmVhZCh3bW0tPmhGaWxlLCAoSFBTVFIpJmZvdXJjYywKCQkgICAobG9uZykgc2l6ZW9mKEZPVVJDQykpICE9IChsb25nKSBzaXplb2YoRk9VUkNDKSkKCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9GSUxFOwogICAgCiAgICBpZiAoZm91cmNjICE9IG1taW9GT1VSQ0MoJ00nLCAnVCcsICdoJywgJ2QnKSkgewoJV0FSTl8obWNpbWlkaSkoIkNhbid0IHN5bmNocm9uaXplIG9uICdNVGhkJyAhXG4iKTsKCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9GSUxFOwogICAgfQogICAgCiAgICBpZiAoTUlESV9tY2lSZWFkTG9uZyh3bW0sICZ0b2JlcmVhZCkgIT0gMCB8fCB0b2JlcmVhZCA8IDMgKiBzaXplb2YoV09SRCkpCglyZXR1cm4gTUNJRVJSX0lOVkFMSURfRklMRTsKICAgIAogICAgaWYgKE1JRElfbWNpUmVhZFdvcmQod21tLCAmd21tLT53Rm9ybWF0KSAhPSAwIHx8CglNSURJX21jaVJlYWRXb3JkKHdtbSwgJndtbS0+blRyYWNrcykgIT0gMCB8fAoJTUlESV9tY2lSZWFkV29yZCh3bW0sICZ3bW0tPm5EaXZpc2lvbikgIT0gMCkgewoJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0ZJTEU7CiAgICB9CiAgICAKICAgIFRSQUNFXyhtY2ltaWRpKSgidG9iZXJlYWQ9MHglMDhsWCwgd0Zvcm1hdD0weCUwNFggblRyYWNrcz0weCUwNFggbkRpdmlzaW9uPTB4JTA0WFxuIiwKCSAgdG9iZXJlYWQsIHdtbS0+d0Zvcm1hdCwgd21tLT5uVHJhY2tzLCB3bW0tPm5EaXZpc2lvbik7CiAgICAKICAgIC8qIE1TIGRvYyBzYXlzIHRoYXQgdGhlIE1JREkgTUNJIHRpbWUgZm9ybWF0IG11c3QgYmUgcHV0IGJ5IGRlZmF1bHQgdG8gdGhlIGZvcm1hdAogICAgICogc3RvcmVkIGluIHRoZSBNSURJIGZpbGUuLi4KICAgICAqLwogICAgaWYgKHdtbS0+bkRpdmlzaW9uID4gMHg4MDAwKSB7CgkvKiBlcmljLnBvdWVjaEBsZW1lbC5mciA5OC8xMQoJICogSW4gZGlkIG5vdCBjaGVjayB0aGlzIHZlcnkgY29kZSAocHVsc2VzIGFyZSBleHByZXNzZWQgYXMgU01QVEUgc3ViLWZyYW1lcykuCgkgKiBJbiBhYm91dCA0MCBNQiBvZiBNSURJIGZpbGVzIEkgaGF2ZSwgbm9uZSB3YXMgU01QVEUgYmFzZWQuLi4KCSAqIEknbSBqdXN0IHdvbmRlcmluZyBpZiB0aGlzIGlzIHdpZGVseSB1c2VkIDotKS4gU28sIGlmIHNvbWVvbmUgaGFzIG9uZSBvZiAKCSAqIHRoZXNlIGZpbGVzLCBJJ2QgbGlrZSB0byBrbm93IGFib3V0LgoJICovCglGSVhNRV8obWNpbWlkaSkoIkhhbmRsaW5nIFNNUFRFIHRpbWUgaW4gTUlESSBmaWxlcyBoYXMgbm90IGJlZW4gdGVzdGVkXG4iCgkgICAgICAiUGxlYXNlIHJlcG9ydCB0byBjb21wLmVtdWxhdG9ycy5tcy13aW5kb3dzLndpbmUgd2l0aCBNSURJIGZpbGUgIVxuIik7CgkKCXN3aXRjaCAoSElCWVRFKHdtbS0+bkRpdmlzaW9uKSkgewoJY2FzZSAweEU4Ogl3bW0tPmR3TWNpVGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfU01QVEVfMjQ7CWJyZWFrOwkvKiAtMjQgKi8KCWNhc2UgMHhFNzoJd21tLT5kd01jaVRpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX1NNUFRFXzI1OwlicmVhazsJLyogLTI1ICovCgljYXNlIDB4RTM6CXdtbS0+ZHdNY2lUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9TTVBURV8zMERST1A7CWJyZWFrOwkvKiAtMjkgKi8gLyogaXMgdGhlIE1DSSBjb25zdGFudCBjb3JyZWN0ID8gKi8KCWNhc2UgMHhFMjoJd21tLT5kd01jaVRpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX1NNUFRFXzMwOwlicmVhazsJLyogLTMwICovCglkZWZhdWx0OgoJICAgIFdBUk5fKG1jaW1pZGkpKCJVbnN1cHBvcnRlZCBudW1iZXIgb2YgZnJhbWVzICVkXG4iLCAtKGNoYXIpSElCWVRFKHdtbS0+bkRpdmlzaW9uKSk7CgkgICAgcmV0dXJuIE1DSUVSUl9JTlZBTElEX0ZJTEU7Cgl9Cglzd2l0Y2ggKExPQllURSh3bW0tPm5EaXZpc2lvbikpIHsKCWNhc2UgNDoJLyogTUlESSBUaW1lIENvZGUgKi8KCWNhc2UgODoKCWNhc2UgMTA6CgljYXNlIDgwOiAvKiBTTVBURSBiaXQgcmVzb2x1dGlvbiAqLwoJY2FzZSAxMDA6CglkZWZhdWx0OgoJICAgIFdBUk5fKG1jaW1pZGkpKCJVbnN1cHBvcnRlZCBudW1iZXIgb2Ygc3ViLWZyYW1lcyAlZFxuIiwgTE9CWVRFKHdtbS0+bkRpdmlzaW9uKSk7CgkgICAgcmV0dXJuIE1DSUVSUl9JTlZBTElEX0ZJTEU7Cgl9CiAgICB9IGVsc2UgaWYgKHdtbS0+bkRpdmlzaW9uID09IDApIHsKCVdBUk5fKG1jaW1pZGkpKCJOdW1iZXIgb2YgZGl2aXNpb24gaXMgMCwgY2FuJ3Qgc3VwcG9ydCB0aGF0ICEhXG4iKTsKCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9GSUxFOwogICAgfSBlbHNlIHsKCXdtbS0+ZHdNY2lUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM7CiAgICB9CiAgICAKICAgIHN3aXRjaCAod21tLT53Rm9ybWF0KSB7CiAgICBjYXNlIDA6CglpZiAod21tLT5uVHJhY2tzICE9IDEpIHsKCSAgICBXQVJOXyhtY2ltaWRpKSgiR290IHR5cGUgMCBmaWxlIHdob3NlIG51bWJlciBvZiB0cmFjayBpcyBub3QgMS4gU2V0dGluZyBpdCB0byAxXG4iKTsKCSAgICB3bW0tPm5UcmFja3MgPSAxOwoJfQoJYnJlYWs7CiAgICBjYXNlIDE6CiAgICBjYXNlIDI6CglicmVhazsKICAgIGRlZmF1bHQ6CglXQVJOXyhtY2ltaWRpKSgiSGFuZGxpbmcgTUlESSBmaWxlcyB3aGljaCBmb3JtYXQgPSAlZCBpcyBub3QgKHlldCkgc3VwcG9ydGVkXG4iCgkgICAgICJQbGVhc2UgcmVwb3J0IHdpdGggTUlESSBmaWxlICFcbiIsIHdtbS0+d0Zvcm1hdCk7CglyZXR1cm4gTUNJRVJSX0lOVkFMSURfRklMRTsKICAgIH0KICAgIAogICAgaWYgKHdtbS0+blRyYWNrcyAmIDB4ODAwMCkgewoJLyogdGhpcyBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtLi4uICovCglXQVJOXyhtY2ltaWRpKSgiT3VjaCAhISBJbXBsZW1lbnRhdGlvbiBsaW1pdGF0aW9uIHRvIDMyayB0cmFja3MgcGVyIE1JREkgZmlsZSBpcyBvdmVyZmxvd2VkXG4iKTsKCXdtbS0+blRyYWNrcyA9IDB4N0ZGRjsKICAgIH0KICAgIAogICAgaWYgKCh3bW0tPnRyYWNrcyA9IG1hbGxvYyhzaXplb2YoTUNJX01JRElUUkFDSykgKiB3bW0tPm5UcmFja3MpKSA9PSBOVUxMKSB7CglyZXR1cm4gTUNJRVJSX09VVF9PRl9NRU1PUlk7CiAgICB9CiAgICAKICAgIHRvYmVyZWFkIC09IDMgKiBzaXplb2YoV09SRCk7IAogICAgaWYgKHRvYmVyZWFkID4gMCkgewoJVFJBQ0VfKG1jaW1pZGkpKCJTaXplIG9mIE1UaGQgPiA2LCBza2lwcGluZyAlbGQgZXh0cmEgYnl0ZXNcbiIsIHRvYmVyZWFkKTsKCW1taW9TZWVrKHdtbS0+aEZpbGUsIHRvYmVyZWFkLCBTRUVLX0NVUik7CiAgICB9CiAgICAKICAgIGZvciAobnQgPSAwOyBudCA8IHdtbS0+blRyYWNrczsgbnQrKykgewoJd21tLT50cmFja3NbbnRdLndUcmFja05yID0gbnQ7CglpZiAoTUlESV9tY2lSZWFkTVRyayh3bW0sICZ3bW0tPnRyYWNrc1tudF0pICE9IDApIHsKCSAgICBXQVJOXyhtY2ltaWRpKSgiQ2FuJ3QgcmVhZCAnTVRyaycgaGVhZGVyIFxuIik7CgkgICAgcmV0dXJuIE1DSUVSUl9JTlZBTElEX0ZJTEU7Cgl9CiAgICB9CiAgICAKICAgIHdtbS0+ZHdUZW1wbyA9IDUwMDAwMDsKICAgIAogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQlNSURJX0NvbnZlcnRQdWxzZVRvTVMJCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMJRFdPUkQJTUlESV9Db252ZXJ0UHVsc2VUb01TKFdJTkVfTUNJTUlESSogd21tLCBEV09SRCBwdWxzZSkKewogICAgRFdPUkQJcmV0ID0gMDsKICAgIAogICAgLyogRklYTUU6IHRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBmYWxzZSB2YWx1ZXMgc2luY2UgdGhlIHRlbXBvICh3bW0tPmR3VGVtcG8pCiAgICAgKiBtYXkgY2hhbmdlIGR1cmluZyBmaWxlIHBsYXlpbmcKICAgICAqLwogICAgaWYgKHdtbS0+bkRpdmlzaW9uID09IDApIHsKCUZJWE1FXyhtY2ltaWRpKSgiU2hvdWxkbid0IGhhcHBlbi4gd21tLT5uRGl2aXNpb24gPSAwXG4iKTsKICAgIH0gZWxzZSBpZiAod21tLT5uRGl2aXNpb24gPiAweDgwMDApIHsgLyogU01QVEUsIHVuY2hlY2tlZCBGSVhNRT8gKi8KCWludAluZiA9IC0oY2hhcilISUJZVEUod21tLT5uRGl2aXNpb24pOwkvKiBudW1iZXIgb2YgZnJhbWVzICAgICAqLwoJaW50CW5zZiA9IExPQllURSh3bW0tPm5EaXZpc2lvbik7CQkvKiBudW1iZXIgb2Ygc3ViLWZyYW1lcyAqLwoJcmV0ID0gKHB1bHNlICogMTAwMCkgLyAobmYgKiBuc2YpOwogICAgfSBlbHNlIHsKCXJldCA9IChEV09SRCkoKGRvdWJsZSlwdWxzZSAqICgoZG91YmxlKXdtbS0+ZHdUZW1wbyAvIDEwMDApIC8JCgkJICAgICAgKGRvdWJsZSl3bW0tPm5EaXZpc2lvbik7CiAgICB9CiAgICAKICAgIC8qCiAgICAgIFRSQUNFKG1jaW1pZGksICJwdWxzZT0lbHUgdGVtcG89JWx1IGRpdmlzaW9uPSV1PTB4JTA0eCA9PiBtcz0lbHVcbiIsIAogICAgICBwdWxzZSwgd21tLT5kd1RlbXBvLCB3bW0tPm5EaXZpc2lvbiwgd21tLT5uRGl2aXNpb24sIHJldCk7CiAgICAqLwogICAgCiAgICByZXR1cm4gcmV0Owp9CgojZGVmaW5lIFRJTUVfTVNfSU5fT05FX0hPVVIJKDYwKjYwKjEwMDApCiNkZWZpbmUgVElNRV9NU19JTl9PTkVfTUlOVVRFCSg2MCoxMDAwKQojZGVmaW5lIFRJTUVfTVNfSU5fT05FX1NFQ09ORAkoMTAwMCkKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQlNSURJX0NvbnZlcnRUaW1lRm9ybWF0VG9NUwkJW2ludGVybmFsXQogKi8Kc3RhdGljCURXT1JECU1JRElfQ29udmVydFRpbWVGb3JtYXRUb01TKFdJTkVfTUNJTUlESSogd21tLCBEV09SRCB2YWwpCnsKICAgIERXT1JECXJldCA9IDA7CiAgICAKICAgIHN3aXRjaCAod21tLT5kd01jaVRpbWVGb3JtYXQpIHsKICAgIGNhc2UgTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM6CQoJcmV0ID0gdmFsOwkJCglicmVhazsKICAgIGNhc2UgTUNJX0ZPUk1BVF9TTVBURV8yNDoKCXJldCA9IAoJICAgIChISUJZVEUoSElXT1JEKHZhbCkpICogMTI1KSAvIDMgKyAgICAgICAgICAgICBMT0JZVEUoSElXT1JEKHZhbCkpICogVElNRV9NU19JTl9PTkVfU0VDT05EICsKCSAgICBISUJZVEUoTE9XT1JEKHZhbCkpICogVElNRV9NU19JTl9PTkVfTUlOVVRFICsgTE9CWVRFKExPV09SRCh2YWwpKSAqIFRJTUVfTVNfSU5fT05FX0hPVVI7CglicmVhazsKICAgIGNhc2UgTUNJX0ZPUk1BVF9TTVBURV8yNToJCQoJcmV0ID0gCgkgICAgSElCWVRFKEhJV09SRCh2YWwpKSAqIDQwICsgCQkgIAkgIExPQllURShISVdPUkQodmFsKSkgKiBUSU1FX01TX0lOX09ORV9TRUNPTkQgKwoJICAgIEhJQllURShMT1dPUkQodmFsKSkgKiBUSU1FX01TX0lOX09ORV9NSU5VVEUgKyBMT0JZVEUoTE9XT1JEKHZhbCkpICogVElNRV9NU19JTl9PTkVfSE9VUjsKCWJyZWFrOwogICAgY2FzZSBNQ0lfRk9STUFUX1NNUFRFXzMwOgkJCglyZXQgPSAKCSAgICAoSElCWVRFKEhJV09SRCh2YWwpKSAqIDEwMCkgLyAzICsgCQkgIExPQllURShISVdPUkQodmFsKSkgKiBUSU1FX01TX0lOX09ORV9TRUNPTkQgKwoJICAgIEhJQllURShMT1dPUkQodmFsKSkgKiBUSU1FX01TX0lOX09ORV9NSU5VVEUgKyBMT0JZVEUoTE9XT1JEKHZhbCkpICogVElNRV9NU19JTl9PTkVfSE9VUjsKCWJyZWFrOwogICAgZGVmYXVsdDoKCVdBUk5fKG1jaW1pZGkpKCJCYWQgdGltZSBmb3JtYXQgJWx1IVxuIiwgd21tLT5kd01jaVRpbWVGb3JtYXQpOwogICAgfQogICAgLyoKICAgICAgVFJBQ0UobWNpbWlkaSwgInZhbD0lbHU9MHglMDhseCBbdGY9JWx1XSA9PiByZXQ9JWx1XG4iLCB2YWwsIHZhbCwgd21tLT5kd01jaVRpbWVGb3JtYXQsIHJldCk7CiAgICAqLwogICAgcmV0dXJuIHJldDsKfQkKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQlNSURJX0NvbnZlcnRNU1RvVGltZUZvcm1hdAkJW2ludGVybmFsXQogKi8Kc3RhdGljCURXT1JECU1JRElfQ29udmVydE1TVG9UaW1lRm9ybWF0KFdJTkVfTUNJTUlESSogd21tLCBEV09SRCBfdmFsKQp7CiAgICBEV09SRAlyZXQgPSAwLCB2YWwgPSBfdmFsOwogICAgRFdPUkQJaCwgbSwgcywgZjsKICAgIAogICAgc3dpdGNoICh3bW0tPmR3TWNpVGltZUZvcm1hdCkgewogICAgY2FzZSBNQ0lfRk9STUFUX01JTExJU0VDT05EUzoJCglyZXQgPSB2YWw7CQkKCWJyZWFrOwogICAgY2FzZSBNQ0lfRk9STUFUX1NNUFRFXzI0OgogICAgY2FzZSBNQ0lfRk9STUFUX1NNUFRFXzI1OgkJCiAgICBjYXNlIE1DSV9GT1JNQVRfU01QVEVfMzA6CQkKCWggPSB2YWwgLyBUSU1FX01TX0lOX09ORV9IT1VSOwkKCW0gPSAodmFsIC09IGggKiBUSU1FX01TX0lOX09ORV9IT1VSKSAgIC8gVElNRV9NU19JTl9PTkVfTUlOVVRFOwkKCXMgPSAodmFsIC09IG0gKiBUSU1FX01TX0lOX09ORV9NSU5VVEUpIC8gVElNRV9NU19JTl9PTkVfU0VDT05EOwoJc3dpdGNoICh3bW0tPmR3TWNpVGltZUZvcm1hdCkgewoJY2FzZSBNQ0lfRk9STUFUX1NNUFRFXzI0OgoJICAgIC8qIG9uZSBmcmFtZSBpcyAxMDAwLzI0IHZhbCBsb25nLCAxMDAwLzI0ID09IDEyNS8zICovCgkgICAgZiA9ICh2YWwgKiAzKSAvIDEyNTsgCXZhbCAtPSAoZiAqIDEyNSkgLyAzOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfRk9STUFUX1NNUFRFXzI1OgkJCgkgICAgLyogb25lIGZyYW1lIGlzIDEwMDAvMjUgbXMgbG9uZywgMTAwMC8yNSA9PSA0MCAqLwoJICAgIGYgPSB2YWwgLyA0MDsgCQl2YWwgLT0gZiAqIDQwOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfRk9STUFUX1NNUFRFXzMwOgkJCgkgICAgLyogb25lIGZyYW1lIGlzIDEwMDAvMzAgbXMgbG9uZywgMTAwMC8zMCA9PSAxMDAvMyAqLwoJICAgIGYgPSAodmFsICogMykgLyAxMDA7IAl2YWwgLT0gKGYgKiAxMDApIC8gMzsKCSAgICBicmVhazsKCWRlZmF1bHQ6CgkgICAgRklYTUVfKG1jaW1pZGkpKCJUaGVyZSBtdXN0IGJlIHNvbWUgYmFkIGJhZCBwcm9ncmFtbWVyXG4iKTsKCSAgICBmID0gMDsKCX0KCS8qIHZhbCBjb250YWlucyB0aGUgbnVtYmVyIG9mIG1zIHdoaWNoIGNhbm5vdCBtYWtlIGEgY29tcGxldGUgZnJhbWUgKi8KCS8qIEZJWE1FOiBpcyB0aGlzIGNvcnJlY3QgPyBwcm9ncmFtcyBzZWVtIHRvIGJlIGhhcHB5IHdpdGggdGhhdCAqLwoJcmV0ID0gKGYgPDwgMjQpIHwgKHMgPDwgMTYpIHwgKG0gPDwgOCkgfCAoaCA8PCAwKTsKCWJyZWFrOwogICAgZGVmYXVsdDoKCVdBUk5fKG1jaW1pZGkpKCJCYWQgdGltZSBmb3JtYXQgJWx1IVxuIiwgd21tLT5kd01jaVRpbWVGb3JtYXQpOwogICAgfQogICAgLyoKICAgICAgVFJBQ0UobWNpbWlkaSwgInZhbD0lbHUgW3RmPSVsdV0gPT4gcmV0PSVsdT0weCUwOGx4XG4iLCBfdmFsLCB3bW0tPmR3TWNpVGltZUZvcm1hdCwgcmV0LCByZXQpOwogICAgKi8KICAgIHJldHVybiByZXQ7Cn0JCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJTUlESV9HZXRNVGhkTGVuZ3RoTVMJCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMJRFdPUkQJTUlESV9HZXRNVGhkTGVuZ3RoTVMoV0lORV9NQ0lNSURJKiB3bW0pCnsKICAgIFdPUkQJbnQ7CiAgICBEV09SRAlyZXQgPSAwOwogICAgCiAgICBmb3IgKG50ID0gMDsgbnQgPCB3bW0tPm5UcmFja3M7IG50KyspIHsKCWlmICh3bW0tPndGb3JtYXQgPT0gMikgewoJICAgIHJldCArPSB3bW0tPnRyYWNrc1tudF0uZHdMZW5ndGg7Cgl9IGVsc2UgaWYgKHdtbS0+dHJhY2tzW250XS5kd0xlbmd0aCA+IHJldCkgewoJICAgIHJldCA9IHdtbS0+dHJhY2tzW250XS5kd0xlbmd0aDsKCX0KICAgIH0KICAgIC8qIEZJWE1FOiB0aGlzIGlzIHdyb25nIGlmIHRoZXJlIGlzIGEgdGVtcG8gY2hhbmdlIGluc2lkZSB0aGUgZmlsZSAqLwogICAgcmV0dXJuIE1JRElfQ29udmVydFB1bHNlVG9NUyh3bW0sIHJldCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lPcGVuCQkJW2ludGVybmFsXQkKICovCnN0YXRpYyBEV09SRCBNSURJX21jaU9wZW4oVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfT1BFTl9QQVJNU0EgbHBQYXJtcykKewogICAgTUlESU9QRU5ERVNDIAltaWRpT3BlbkRlc2M7CiAgICBEV09SRAkJZHdSZXQgPSAwOwogICAgRFdPUkQJCWR3RGV2aWNlSUQ7CiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfZHJ2R2V0RHJ2KHdEZXZJRCk7CiAgICAKICAgIFRSQUNFXyhtY2ltaWRpKSgiKCUwNHgsICUwOGxYLCAlcClcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAgICAKICAgIGlmIChscFBhcm1zID09IE5VTEwpIAlyZXR1cm4gTUNJRVJSX05VTExfUEFSQU1FVEVSX0JMT0NLOwogICAgaWYgKHdtbSA9PSBOVUxMKQkJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKICAgIGlmIChkd0ZsYWdzICYgTUNJX09QRU5fU0hBUkVBQkxFKQoJcmV0dXJuIE1DSUVSUl9IQVJEV0FSRTsKCiAgICBpZiAod21tLT5uVXNlQ291bnQgPiAwKSB7CgkvKiBUaGUgZHJpdmVyIGlzIGFscmVhZHkgb3BlbmVkIG9uIHRoaXMgY2hhbm5lbAoJICogTUlESSBzZXF1ZW5jZXIgY2Fubm90IGJlIHNoYXJlZAoJICovCglyZXR1cm4gTUNJRVJSX0RFVklDRV9PUEVOOwogICAgfQogICAgd21tLT5uVXNlQ291bnQrKzsKICAgIAogICAgd21tLT5oRmlsZSA9IDA7CiAgICB3bW0tPndNaWRpSUQgPSAwOwogICAgZHdEZXZpY2VJRCA9IGxwUGFybXMtPndEZXZpY2VJRDsKICAgIAogICAgVFJBQ0VfKG1jaW1pZGkpKCJ3RGV2SUQ9JTA0WCAobHBQYXJhbXMtPndEZXZpY2VJRD0lMDhsWClcbiIsIHdEZXZJRCwgZHdEZXZpY2VJRCk7CiAgICAvKglscFBhcm1zLT53RGV2aWNlSUQgPSB3RGV2SUQ7Ki8KICAgIAogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfT1BFTl9FTEVNRU5UKSB7CglMUFNUUgkJbHBzdHJFbGVtZW50TmFtZTsKCQoJbHBzdHJFbGVtZW50TmFtZSA9IGxwUGFybXMtPmxwc3RyRWxlbWVudE5hbWU7CgkKCVRSQUNFXyhtY2ltaWRpKSgiTUNJX09QRU5fRUxFTUVOVCAnJXMnICFcbiIsIGxwc3RyRWxlbWVudE5hbWUpOwoJaWYgKGxwc3RyRWxlbWVudE5hbWUgJiYgc3RybGVuKGxwc3RyRWxlbWVudE5hbWUpID4gMCkgewoJICAgIHdtbS0+aEZpbGUgPSBtbWlvT3BlbkEobHBzdHJFbGVtZW50TmFtZSwgTlVMTCwgCgkJCQkgICAgIE1NSU9fQUxMT0NCVUYgfCBNTUlPX1JFQURXUklURSB8IE1NSU9fRVhDTFVTSVZFKTsKCSAgICBpZiAod21tLT5oRmlsZSA9PSAwKSB7CgkJV0FSTl8obWNpbWlkaSkoIkNhbid0IGZpbmQgZmlsZT0nJXMnICFcbiIsIGxwc3RyRWxlbWVudE5hbWUpOwoJCXdtbS0+blVzZUNvdW50LS07CgkJcmV0dXJuIE1DSUVSUl9GSUxFX05PVF9GT1VORDsKCSAgICB9Cgl9IGVsc2UgewoJICAgIHdtbS0+aEZpbGUgPSAwOwoJfQogICAgfQogICAgVFJBQ0VfKG1jaW1pZGkpKCJoRmlsZT0ldVxuIiwgd21tLT5oRmlsZSk7CiAgICAKICAgIG1lbWNweSgmd21tLT5vcGVuUGFybXMsIGxwUGFybXMsIHNpemVvZihNQ0lfT1BFTl9QQVJNU0EpKTsKICAgIAogICAgd21tLT53Tm90aWZ5RGV2aWNlSUQgPSBkd0RldmljZUlEOwogICAgd21tLT5kd1N0YXR1cyA9IE1DSV9NT0RFX05PVF9SRUFEWTsJLyogd2hpbGUgbG9hZGluZyBmaWxlIGNvbnRlbnRzICovCiAgICAvKiBzcGVjIHNheXMgaXQgc2hvdWxkIGJlIHRoZSBkZWZhdWx0IGZvcm1hdCBmcm9tIHRoZSBNSURJIGZpbGUuLi4gKi8KICAgIHdtbS0+ZHdNY2lUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM7CiAgICAKICAgIG1pZGlPcGVuRGVzYy5oTWlkaSA9IDA7CiAgICAKICAgIGlmICh3bW0tPmhGaWxlICE9IDApIHsKCU1NQ0tJTkZPCWNrTWFpblJJRkY7CglNTUNLSU5GTwltbWNrSW5mbzsKCURXT1JECQlkd09mZnNldCA9IDA7CgkKCWlmIChtbWlvRGVzY2VuZCh3bW0tPmhGaWxlLCAmY2tNYWluUklGRiwgTlVMTCwgMCkgIT0gMCkgewoJICAgIGR3UmV0ID0gTUNJRVJSX0lOVkFMSURfRklMRTsKCX0gZWxzZSB7CgkgICAgVFJBQ0VfKG1jaW1pZGkpKCJQYXJlbnRDaHVuayBja2lkPSUuNHMgZmNjVHlwZT0lLjRzIGNrc2l6ZT0lMDhsWCBcbiIsCgkJICAoTFBTVFIpJmNrTWFpblJJRkYuY2tpZCwgKExQU1RSKSZja01haW5SSUZGLmZjY1R5cGUsIGNrTWFpblJJRkYuY2tzaXplKTsKCSAgICAKCSAgICBpZiAoY2tNYWluUklGRi5ja2lkID09IEZPVVJDQ19SSUZGICYmIGNrTWFpblJJRkYuZmNjVHlwZSA9PSBtbWlvRk9VUkNDKCdSJywgJ00nLCAnSScsICdEJykpIHsKCQltbWNrSW5mby5ja2lkID0gbW1pb0ZPVVJDQygnZCcsICdhJywgJ3QnLCAnYScpOwoJCWlmIChtbWlvRGVzY2VuZCh3bW0tPmhGaWxlLCAmbW1ja0luZm8sICZja01haW5SSUZGLCBNTUlPX0ZJTkRDSFVOSykgPT0gMCkgewoJCSAgICBUUkFDRV8obWNpbWlkaSkoIi4uLiBpcyBhICdSTUlEJyBmaWxlIFxuIik7CgkJICAgIGR3T2Zmc2V0ID0gbW1ja0luZm8uZHdEYXRhT2Zmc2V0OwoJCX0gZWxzZSB7CgkJICAgIGR3UmV0ID0gTUNJRVJSX0lOVkFMSURfRklMRTsKCQl9CgkgICAgfQoJICAgIGlmIChkd1JldCA9PSAwICYmIE1JRElfbWNpUmVhZE1UaGQod21tLCBkd09mZnNldCkgIT0gMCkgewoJCVdBUk5fKG1jaW1pZGkpKCJDYW4ndCByZWFkICdNVGhkJyBoZWFkZXIgXG4iKTsKCQlkd1JldCA9IE1DSUVSUl9JTlZBTElEX0ZJTEU7CgkgICAgfQoJfQogICAgfSBlbHNlIHsKCVRSQUNFXyhtY2ltaWRpKSgiaEZpbGU9PTAsIHNldHRpbmcgI3RyYWNrcyB0byAwOyBpcyB0aGlzIGNvcnJlY3QgP1xuIik7Cgl3bW0tPm5UcmFja3MgPSAwOwoJd21tLT53Rm9ybWF0ID0gMDsKCXdtbS0+bkRpdmlzaW9uID0gMTsKICAgIH0KICAgIGlmIChkd1JldCAhPSAwKSB7Cgl3bW0tPm5Vc2VDb3VudC0tOwoJaWYgKHdtbS0+aEZpbGUgIT0gMCkKCSAgICBtbWlvQ2xvc2Uod21tLT5oRmlsZSwgMCk7Cgl3bW0tPmhGaWxlID0gMDsKICAgIH0gZWxzZSB7Cgl3bW0tPmR3UG9zaXRpb25NUyA9IDA7Cgl3bW0tPmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKCXdtbS0+aE1pZGlIZHIgPSBVU0VSX0hFQVBfQUxMT0Moc2l6ZW9mKE1JRElIRFIxNikpOwoJCglkd1JldCA9IG1vZE1lc3NhZ2Uod21tLT53TWlkaUlELCBNT0RNX09QRU4sIDAsIChEV09SRCkmbWlkaU9wZW5EZXNjLCBDQUxMQkFDS19OVUxMKTsKCS8qCWR3UmV0ID0gbWlkTWVzc2FnZSh3bW0tPndNaWRpSUQsIE1JRE1fT1BFTiwgMCwgKERXT1JEKSZtaWRpT3BlbkRlc2MsIENBTExCQUNLX05VTEwpOyovCiAgICB9CiAgICByZXR1cm4gZHdSZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lTdG9wCQkJW2ludGVybmFsXQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpU3RvcChVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCnsgICAgCiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfbWNpR2V0T3BlbkRldih3RGV2SUQpOwogICAgCiAgICBUUkFDRV8obWNpbWlkaSkoIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKICAgIAogICAgaWYgKHdtbSA9PSBOVUxMKQlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwogICAgCiAgICB3bW0tPmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKICAgIFRSQUNFXyhtY2ltaWRpKSgid21tLT5kd1N0YXR1cz0lZFxuIiwgd21tLT5kd1N0YXR1cyk7CiAgICAKICAgIGlmIChscFBhcm1zICYmIChkd0ZsYWdzICYgTUNJX05PVElGWSkpIHsKCVRSQUNFXyhtY2ltaWRpKSgiTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOwoJbWNpRHJpdmVyTm90aWZ5MTYoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAoJCQkgIHdtbS0+d05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lDbG9zZQkJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRCBNSURJX21jaUNsb3NlKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKewogICAgRFdPUkQJCWR3UmV0OwogICAgV0lORV9NQ0lNSURJKgl3bW0gPSBNSURJX21jaUdldE9wZW5EZXYod0RldklEKTsKICAgIAogICAgVFJBQ0VfKG1jaW1pZGkpKCIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAgICAKICAgIGlmICh3bW0gPT0gTlVMTCkJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKICAgIAogICAgaWYgKHdtbS0+ZHdTdGF0dXMgIT0gTUNJX01PREVfU1RPUCkgewoJTUlESV9tY2lTdG9wKHdEZXZJRCwgTUNJX1dBSVQsIGxwUGFybXMpOwogICAgfQogICAgCiAgICB3bW0tPmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKICAgIHdtbS0+blVzZUNvdW50LS07CiAgICBpZiAod21tLT5uVXNlQ291bnQgPT0gMCkgewoJaWYgKHdtbS0+aEZpbGUgIT0gMCkgewoJICAgIG1taW9DbG9zZSh3bW0tPmhGaWxlLCAwKTsKCSAgICB3bW0tPmhGaWxlID0gMDsKCSAgICBUUkFDRV8obWNpbWlkaSkoImhGaWxlIGNsb3NlZCAhXG4iKTsKCX0KCVVTRVJfSEVBUF9GUkVFKHdtbS0+aE1pZGlIZHIpOwoJZnJlZSh3bW0tPnRyYWNrcyk7Cglkd1JldCA9IG1vZE1lc3NhZ2Uod21tLT53TWlkaUlELCBNT0RNX0NMT1NFLCAwLCAwTCwgMEwpOwoJaWYgKGR3UmV0ICE9IE1NU1lTRVJSX05PRVJST1IpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CgkvKgoJICBkd1JldCA9IG1pZE1lc3NhZ2Uod21tLT53TWlkaUlELCBNSURNX0NMT1NFLCAwLCAwTCwgMEwpOwoJICBpZiAoZHdSZXQgIT0gTU1TWVNFUlJfTk9FUlJPUikgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKCSovCiAgICB9IGVsc2UgewoJVFJBQ0VfKG1jaW1pZGkpKCJTaG91bGRuJ3QgaGFwcGVuLi4uIG5Vc2VDb3VudD0lZFxuIiwgd21tLT5uVXNlQ291bnQpOwoJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKICAgIH0KICAgIAogICAgaWYgKGxwUGFybXMgJiYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSkgewoJVFJBQ0VfKG1jaW1pZGkpKCJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CgltY2lEcml2ZXJOb3RpZnkxNigoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCgkJCSAgd21tLT53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaUZpbmROZXh0RXZlbnQJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBNQ0lfTUlESVRSQUNLKglNSURJX21jaUZpbmROZXh0RXZlbnQoV0lORV9NQ0lNSURJKiB3bW0sIExQRFdPUkQgaGlQdWxzZSkgCnsKICAgIFdPUkQJCWNudCwgbnQ7CiAgICBNQ0lfTUlESVRSQUNLKgltbXQ7CiAgICAKICAgICpoaVB1bHNlID0gMHhGRkZGRkZGRnVsOwogICAgY250ID0gMHhGRkZGdTsKICAgIGZvciAobnQgPSAwOyBudCA8IHdtbS0+blRyYWNrczsgbnQrKykgewoJbW10ID0gJndtbS0+dHJhY2tzW250XTsKCQoJaWYgKG1tdC0+d1N0YXR1cyA9PSAwKQoJICAgIGNvbnRpbnVlOwoJaWYgKG1tdC0+ZHdFdmVudFB1bHNlIDwgKmhpUHVsc2UpIHsKCSAgICAqaGlQdWxzZSA9IG1tdC0+ZHdFdmVudFB1bHNlOwoJICAgIGNudCA9IG50OwoJfQogICAgfQogICAgcmV0dXJuIChjbnQgPT0gMHhGRkZGdSkgPyAwIC8qIG5vIG1vcmUgZXZlbnQgb24gYWxsIHRyYWNrcyAqLwoJOiAmd21tLT50cmFja3NbY250XTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVBsYXkJCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lQbGF5KFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1BMQVlfUEFSTVMgbHBQYXJtcykKewogICAgRFdPUkQJCWR3U3RhcnRNUywgZHdFbmRNUywgZHdSZXQ7CiAgICBXT1JECQlkb1BsYXksIG50OwogICAgTUNJX01JRElUUkFDSyoJbW10OwogICAgRFdPUkQJCWhpUHVsc2U7CiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfbWNpR2V0T3BlbkRldih3RGV2SUQpOwogICAgCiAgICBUUkFDRV8obWNpbWlkaSkoIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKICAgIAogICAgaWYgKHdtbSA9PSBOVUxMKQlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwogICAgCiAgICBpZiAod21tLT5oRmlsZSA9PSAwKSB7CglXQVJOXyhtY2ltaWRpKSgiQ2FuJ3QgcGxheTogbm8gZmlsZSAnJXMnICFcbiIsIHdtbS0+b3BlblBhcm1zLmxwc3RyRWxlbWVudE5hbWUpOwoJcmV0dXJuIE1DSUVSUl9GSUxFX05PVF9GT1VORDsKICAgIH0KICAgIAogICAgaWYgKHdtbS0+ZHdTdGF0dXMgIT0gTUNJX01PREVfU1RPUCkgewoJV0FSTl8obWNpbWlkaSkoIkNhbid0IHBsYXk6IGRldmljZSBpcyBub3Qgc3RvcHBlZCAhXG4iKTsKCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAgICB9CiAgICAKICAgIGlmICghKGR3RmxhZ3MgJiBNQ0lfV0FJVCkpIHsJCgkvKiogRklYTUU6IEknbSBub3QgMTAwJSBzdXJlIHRoYXQgd05vdGlmeURldmljZUlEIGlzIHRoZSByaWdodCB2YWx1ZSBpbiBhbGwgY2FzZXMgPz8/ICovCglyZXR1cm4gTUNJX1NlbmRDb21tYW5kQXN5bmMod21tLT53Tm90aWZ5RGV2aWNlSUQsIE1DSV9QTEFZLCBkd0ZsYWdzLCAoRFdPUkQpbHBQYXJtcywgc2l6ZW9mKExQTUNJX1BMQVlfUEFSTVMpKTsKICAgIH0KICAgIAogICAgaWYgKGxwUGFybXMgJiYgKGR3RmxhZ3MgJiBNQ0lfRlJPTSkpIHsKCWR3U3RhcnRNUyA9IE1JRElfQ29udmVydFRpbWVGb3JtYXRUb01TKHdtbSwgbHBQYXJtcy0+ZHdGcm9tKTsgCiAgICB9IGVsc2UgewoJZHdTdGFydE1TID0gd21tLT5kd1Bvc2l0aW9uTVM7CiAgICB9CiAgICAKICAgIGlmIChscFBhcm1zICYmIChkd0ZsYWdzICYgTUNJX1RPKSkgewoJZHdFbmRNUyA9IE1JRElfQ29udmVydFRpbWVGb3JtYXRUb01TKHdtbSwgbHBQYXJtcy0+ZHdUbyk7CiAgICB9IGVsc2UgewoJZHdFbmRNUyA9IDB4RkZGRkZGRkZ1bDsKICAgIH0KICAgIAogICAgVFJBQ0VfKG1jaW1pZGkpKCJQbGF5aW5nIGZyb20gJWx1IHRvICVsdVxuIiwgZHdTdGFydE1TLCBkd0VuZE1TKTsKICAgIAogICAgLyogaW5pdCB0cmFja3MgKi8KICAgIGZvciAobnQgPSAwOyBudCA8IHdtbS0+blRyYWNrczsgbnQrKykgewoJbW10ID0gJndtbS0+dHJhY2tzW250XTsKCQoJbW10LT53U3RhdHVzID0gMTsJLyogb2ssIHBsYXlpbmcgKi8KCW1tdC0+ZHdJbmRleCA9IG1tdC0+ZHdGaXJzdDsKCWlmICh3bW0tPndGb3JtYXQgPT0gMiAmJiBudCA+IDApIHsKCSAgICBtbXQtPmR3RXZlbnRQdWxzZSA9IHdtbS0+dHJhY2tzW250IC0gMV0uZHdMZW5ndGg7Cgl9IGVsc2UgewoJICAgIG1tdC0+ZHdFdmVudFB1bHNlID0gMDsKCX0KCU1JRElfbWNpUmVhZE5leHRFdmVudCh3bW0sIG1tdCk7IC8qIEZJWE1FID09IDAgKi8KICAgIH0KICAgIAogICAgd21tLT5kd1B1bHNlID0gMDsKICAgIHdtbS0+ZHdUZW1wbyA9IDUwMDAwMDsKICAgIHdtbS0+ZHdTdGF0dXMgPSBNQ0lfTU9ERV9QTEFZOwogICAgd21tLT5kd1Bvc2l0aW9uTVMgPSAwOwogICAgd21tLT53U3RhcnRlZFBsYXlpbmcgPSBGQUxTRTsKICAgIAogICAgd2hpbGUgKHdtbS0+ZHdTdGF0dXMgIT0gTUNJX01PREVfU1RPUCkgewoJLyogaXQgc2VlbXMgdGhhdCBpbiBjYXNlIG9mIG11bHRpLXRocmVhZGluZywgZ2NjIGlzIG9wdGltaXppbmcganVzdCBhIGxpdHRsZSBiaXQgCgkgKiB0b28gbXVjaC4gVGVsbCBnY2Mgbm90IHRvIG9wdGltaXplIHN0YXR1cyB2YWx1ZSB1c2luZyB2b2xhdGlsZS4gCgkgKi8KCXdoaWxlICgoKHZvbGF0aWxlIFdJTkVfTUNJTUlESSopd21tKS0+ZHdTdGF0dXMgPT0gTUNJX01PREVfUEFVU0UpOwoJCglkb1BsYXkgPSAod21tLT5kd1Bvc2l0aW9uTVMgPj0gZHdTdGFydE1TICYmIHdtbS0+ZHdQb3NpdGlvbk1TIDw9IGR3RW5kTVMpOwoJCglUUkFDRV8obWNpbWlkaSkoIndtbS0+ZHdTdGF0dXM9JWQsIGRvUGxheT0lc1xuIiwgd21tLT5kd1N0YXR1cywgZG9QbGF5ID8gIlQiIDogIkYiKTsKCQoJaWYgKChtbXQgPSBNSURJX21jaUZpbmROZXh0RXZlbnQod21tLCAmaGlQdWxzZSkpID09IE5VTEwpCgkgICAgYnJlYWs7ICAvKiBubyBtb3JlIGV2ZW50IG9uIHRyYWNrcyAqLwoJCgkvKiBpZiBzdGFydGluZyBwbGF5aW5nLCB0aGVuIHNldCBTdGFydFRpY2tzIHRvIHRoZSB2YWx1ZSBpdCB3b3VsZCBoYXZlIGhhZAoJICogaWYgcGxheSBoYWQgc3RhcnRlZCBhdCBwb3NpdGlvbiAwCgkgKi8KCWlmIChkb1BsYXkgJiYgIXdtbS0+d1N0YXJ0ZWRQbGF5aW5nKSB7CgkgICAgd21tLT5kd1N0YXJ0VGlja3MgPSBHZXRUaWNrQ291bnQoKSAtIE1JRElfQ29udmVydFB1bHNlVG9NUyh3bW0sIHdtbS0+ZHdQdWxzZSk7CgkgICAgd21tLT53U3RhcnRlZFBsYXlpbmcgPSBUUlVFOwoJICAgIFRSQUNFXyhtY2ltaWRpKSgiU2V0dGluZyBkd1N0YXJ0VGlja3MgdG8gJWx1XG4iLCB3bW0tPmR3U3RhcnRUaWNrcyk7Cgl9CgkKCWlmIChoaVB1bHNlID4gd21tLT5kd1B1bHNlKSB7CgkgICAgd21tLT5kd1Bvc2l0aW9uTVMgKz0gTUlESV9Db252ZXJ0UHVsc2VUb01TKHdtbSwgaGlQdWxzZSAtIHdtbS0+ZHdQdWxzZSk7CgkgICAgaWYgKGRvUGxheSkgewoJCURXT1JECXRvZ28gPSB3bW0tPmR3U3RhcnRUaWNrcyArIHdtbS0+ZHdQb3NpdGlvbk1TOwoJCURXT1JECXRjID0gR2V0VGlja0NvdW50KCk7CgkJCgkJVFJBQ0VfKG1jaW1pZGkpKCJQdWxzZXMgaGk9MHglMDhseCA8PiBjdXI9MHglMDhseFxuIiwgaGlQdWxzZSwgd21tLT5kd1B1bHNlKTsKCQlUUkFDRV8obWNpbWlkaSkoIldhaXQgdW50aWwgJWx1ID0+ICVsdSBtc1xuIiwgCQoJCSAgICAgIHRjIC0gd21tLT5kd1N0YXJ0VGlja3MsIHRvZ28gLSB3bW0tPmR3U3RhcnRUaWNrcyk7CgkJaWYgKHRjIDwgdG9nbykJCgkJICAgIFNsZWVwKHRvZ28gLSB0Yyk7CgkgICAgfQoJICAgIHdtbS0+ZHdQdWxzZSA9IGhpUHVsc2U7Cgl9CgkKCXN3aXRjaCAoTE9CWVRFKExPV09SRChtbXQtPmR3RXZlbnREYXRhKSkpIHsKCWNhc2UgMHhGMDoKCWNhc2UgMHhGNzoJLyogc3lzZXggZXZlbnRzICovCgkgICAgewoJCUZJWE1FXyhtY2ltaWRpKSgiTm90IGhhbmRsaW5nIFN5c0V4IGV2ZW50cyAoeWV0KVxuIik7CgkgICAgfQoJICAgIGJyZWFrOwoJY2FzZSAweEZGOgoJICAgIC8qIHBvc2l0aW9uIGFmdGVyIG1ldGEgZGF0YSBoZWFkZXIgKi8KCSAgICBtbWlvU2Vlayh3bW0tPmhGaWxlLCBtbXQtPmR3SW5kZXggKyBISVdPUkQobW10LT5kd0V2ZW50RGF0YSksIFNFRUtfU0VUKTsKCSAgICBzd2l0Y2ggKEhJQllURShMT1dPUkQobW10LT5kd0V2ZW50RGF0YSkpKSB7CgkgICAgY2FzZSAweDAwOiAvKiAxNi1iaXQgc2VxdWVuY2UgbnVtYmVyICovCgkJaWYgKFRSQUNFX09OKG1pZGkpKSB7CgkJICAgIFdPUkQJdHdkOwoJCSAgICAKCQkgICAgTUlESV9tY2lSZWFkV29yZCh3bW0sICZ0d2QpOwkvKiA9PSAwICovCgkJICAgIFRSQUNFXyhtY2ltaWRpKSgiR290IHNlcXVlbmNlIG51bWJlciAldVxuIiwgdHdkKTsKCQl9CgkJYnJlYWs7CgkgICAgY2FzZSAweDAxOiAvKiBhbnkgdGV4dCAqLwoJICAgIGNhc2UgMHgwMjogLyogQ29weXJpZ2h0IE1lc3NhZ2UgdGV4dCAqLwoJICAgIGNhc2UgMHgwMzogLyogU2VxdWVuY2UvVHJhY2sgTmFtZSB0ZXh0ICovCgkgICAgY2FzZSAweDA0OiAvKiBJbnN0cnVtZW50IE5hbWUgdGV4dCAqLwoJICAgIGNhc2UgMHgwNTogLyogTHlyaWMgdGV4dCAqLwoJICAgIGNhc2UgMHgwNjogLyogTWFya2VyIHRleHQgKi8KCSAgICBjYXNlIDB4MDc6IC8qIEN1ZS1wb2ludCB0ZXh0ICovCgkJaWYgKFRSQUNFX09OKG1jaW1pZGkpKSB7CgkJICAgIGNoYXIJYnVmWzEwMjRdOwoJCSAgICBXT1JECWxlbiA9IG1tdC0+d0V2ZW50TGVuZ3RoIC0gSElXT1JEKG1tdC0+ZHdFdmVudERhdGEpOwoJCSAgICBzdGF0aWMJY2hhcioJaW5mb1s4XSA9IHsiIiwgIlRleHQiLCAiQ29weXJpZ2h0IiwgIlNlcS9UcmsgbmFtZSIsIAoJCQkJCQkgICAiSW5zdHJ1bWVudCIsICJMeXJpYyIsICJNYXJrZXIiLCAiQ3VlLXBvaW50In07CgkJICAgIFdPUkQJaWR4ID0gSElCWVRFKExPV09SRChtbXQtPmR3RXZlbnREYXRhKSk7CgkJICAgIAoJCSAgICBpZiAobGVuID49IHNpemVvZihidWYpKSB7CgkJCVdBUk5fKG1jaW1pZGkpKCJCdWZmZXIgZm9yIHRleHQgaXMgdG9vIHNtYWxsICglZCBieXRlcywgd2hlbiAldSBhcmUgbmVlZGVkKVxuIiwgc2l6ZW9mKGJ1ZikgLSAxLCBsZW4pOwoJCQlsZW4gPSBzaXplb2YoYnVmKSAtIDE7CgkJICAgIH0KCQkgICAgaWYgKG1taW9SZWFkKHdtbS0+aEZpbGUsIChIUFNUUilidWYsIGxlbikgPT0gbGVuKSB7CgkJCWJ1ZltsZW5dID0gMDsJLyogZW5kIHN0cmluZyBpbiBjYXNlICovCgkJCVRSQUNFXyhtY2ltaWRpKSgiJXMgPT4gXCIlc1wiXG4iLCAoaWR4IDwgOCApID8gaW5mb1tpZHhdIDogIiIsIGJ1Zik7CgkJICAgIH0gZWxzZSB7CgkJCVdBUk5fKG1jaW1pZGkpKCJDb3VsZG4ndCByZWFkIGRhdGEgZm9yICVzXG4iLCAoaWR4IDwgOCApID8gaW5mb1tpZHhdIDogIiIpOwoJCSAgICB9CgkJfQoJCWJyZWFrOwoJICAgIGNhc2UgMHgyMDogCgkJLyogTUlESSBjaGFubmVsIChjYykgKi8KCQlpZiAoRklYTUVfT04obWNpbWlkaSkpIHsKCQkgICAgQllURQlidDsKCQkgICAgCgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmYnQpOwkvKiA9PSAwICovCgkJICAgIEZJWE1FXyhtY2ltaWRpKSgiTklZOiBNSURJIGNoYW5uZWw9JXUsIHRyYWNrPSV1XG4iLCBidCwgbW10LT53VHJhY2tOcik7CgkJfQoJCWJyZWFrOwoJICAgIGNhc2UgMHgyMToKCQkvKiBNSURJIHBvcnQgKHBwKSAqLwoJCWlmIChGSVhNRV9PTihtY2ltaWRpKSkgewoJCSAgICBCWVRFCWJ0OwoJCSAgICAKCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZidCk7CS8qID09IDAgKi8KCQkgICAgRklYTUVfKG1jaW1pZGkpKCJOSVk6IE1JREkgcG9ydD0ldSwgdHJhY2s9JXVcbiIsIGJ0LCBtbXQtPndUcmFja05yKTsKCQl9CgkJYnJlYWs7CgkgICAgY2FzZSAweDJGOiAvKiBlbmQgb2YgdHJhY2sgKi8KCQltbXQtPndTdGF0dXMgPSAwOwoJCWJyZWFrOwoJICAgIGNhc2UgMHg1MTovKiBzZXQgdGVtcG8gKi8KCQkvKiBUZW1wbyBpcyBleHByZXNzZWQgaW4gtS1zZWNvbmRzIHBlciBtaWRpIHF1YXJ0ZXIgbm90ZQoJCSAqIGZvciBmb3JtYXQgMSBNSURJIGZpbGVzLCB0aGlzIGNhbiBvbmx5IGJlIHByZXNlbnQgb24gdHJhY2sgIzAKCQkgKi8KCQlpZiAobW10LT53VHJhY2tOciAhPSAwICYmIHdtbS0+d0Zvcm1hdCA9PSAxKSB7CgkJICAgIFdBUk5fKG1jaW1pZGkpKCJGb3IgZm9ybWF0ICMxIE1JREkgZmlsZXMsIHRlbXBvIGNhbiBvbmx5IGJlIGNoYW5nZWQgb24gdHJhY2sgIzAgKCV1KVxuIiwgbW10LT53VHJhY2tOcik7CgkJfSBlbHNlIHsgCgkJICAgIEJZVEUJdGJ0OwoJCSAgICBEV09SRAl2YWx1ZSA9IDA7CgkJICAgIAoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJnRidCk7CXZhbHVlICA9ICgoRFdPUkQpdGJ0KSA8PCAxNjsKCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZ0YnQpOwl2YWx1ZSB8PSAoKERXT1JEKXRidCkgPDwgODsKCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZ0YnQpOwl2YWx1ZSB8PSAoKERXT1JEKXRidCkgPDwgMDsKCQkgICAgVFJBQ0VfKG1jaW1pZGkpKCJTZXR0aW5nIHRlbXBvIHRvICVsZCAoQlBNPSVsZClcbiIsIHdtbS0+ZHdUZW1wbywgKHZhbHVlKSA/ICg2MDAwMDAwMGwgLyB2YWx1ZSkgOiAwKTsKCQkgICAgd21tLT5kd1RlbXBvID0gdmFsdWU7CgkJfQoJCWJyZWFrOwoJICAgIGNhc2UgMHg1NDogLyogKGhvdXIpIChtaW4pIChzZWNvbmQpIChmcmFtZSkgKGZyYWN0aW9uYWwtZnJhbWUpIC0gU01QVEUgdHJhY2sgc3RhcnQgKi8KCQlpZiAobW10LT53VHJhY2tOciAhPSAwICYmIHdtbS0+d0Zvcm1hdCA9PSAxKSB7CgkJICAgIFdBUk5fKG1jaW1pZGkpKCJGb3IgZm9ybWF0ICMxIE1JREkgZmlsZXMsIFNNUFRFIHRyYWNrIHN0YXJ0IGNhbiBvbmx5IGJlIGV4cHJlc3NlZCBvbiB0cmFjayAjMCAoJXUpXG4iLCBtbXQtPndUcmFja05yKTsKCQl9IGlmIChtbXQtPmR3RXZlbnRQdWxzZSAhPSAwKSB7CgkJICAgIFdBUk5fKG1jaW1pZGkpKCJTTVBURSB0cmFjayBzdGFydCBjYW4gb25seSBiZSBleHByZXNzZWQgYXQgc3RhcnQgb2YgdHJhY2sgKCVsdSlcbiIsIG1tdC0+ZHdFdmVudFB1bHNlKTsKCQl9IGVsc2UgewoJCSAgICBCWVRFCWgsIG0sIHMsIGYsIGZmOwoJCSAgICAKCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZoKTsKCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZtKTsKCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZzKTsKCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZmKTsKCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZmZik7CgkJICAgIEZJWE1FXyhtY2ltaWRpKSgiTklZOiBTTVBURSB0cmFjayBzdGFydCAldToldToldSAldS4ldVxuIiwgaCwgbSwgcywgZiwgZmYpOwoJCX0KCQlicmVhazsKCSAgICBjYXNlIDB4NTg6IC8qIGZpbGUgcnl0aG0gKi8KCQlpZiAoVFJBQ0VfT04obWNpbWlkaSkpIHsKCQkgICAgQllURQludW0sIGRlbiwgY3BtYywgXzMybnBxbjsKCQkgICAgCgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmbnVtKTsJCgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmZGVuKTsJCS8qIHRvIG5vdGF0ZSBlLmcuIDYvOCAqLwoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJmNwbWMpOwkJLyogbnVtYmVyIG9mIE1JREkgY2xvY2tzIHBlciBtZXRyb25vbWUgY2xpY2sgKi8gCgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmXzMybnBxbik7CQkvKiBudW1iZXIgb2Ygbm90YXRlZCAzMm5kIG5vdGVzIHBlciBNSURJIHF1YXJ0ZXIgbm90ZSAqLwoJCSAgICAKCQkgICAgVFJBQ0VfKG1jaW1pZGkpKCIldS8ldSwgY2xvY2sgcGVyIG1ldHJvbm9tZSBjbGljaz0ldSwgMzJuZCBub3RlcyBieSAxLzQgbm90ZT0ldVxuIiwgbnVtLCAxIDw8IGRlbiwgY3BtYywgXzMybnBxbik7CgkJfQoJCWJyZWFrOwoJICAgIGNhc2UgMHg1OTogLyoga2V5IHNpZ25hdHVyZSAqLwoJCWlmIChUUkFDRV9PTihtY2ltaWRpKSkgewoJCSAgICBCWVRFCXNmLCBtbTsKCQkgICAgCgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmc2YpOwkJCgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmbW0pOwkKCQkgICAgCgkJICAgIGlmIChzZiA+PSAweDgwKSAJVFJBQ0VfKG1jaW1pZGkpKCIlZCBmbGF0c1xuIiwgLShjaGFyKXNmKTsJIAoJCSAgICBlbHNlIGlmIChzZiA+IDApIAlUUkFDRV8obWNpbWlkaSkoIiVkIHNoYXJwc1xuIiwgKGNoYXIpc2YpOwkgCgkJICAgIGVsc2UgCQlUUkFDRV8obWNpbWlkaSkoIktleSBvZiBDXG4iKTsKCQkgICAgVFJBQ0VfKG1jaW1pZGkpKCJNb2RlOiAlc1xuIiwgKG1tID0gMCkgPyAibWFqb3IiIDogIm1pbm9yIik7CgkJfQoJCWJyZWFrOwoJICAgIGRlZmF1bHQ6CgkJV0FSTl8obWNpbWlkaSkoIlVua25vd24gTUlESSBtZXRhIGV2ZW50ICUwMnguIFNraXBwaW5nLi4uXG4iLCBISUJZVEUoTE9XT1JEKG1tdC0+ZHdFdmVudERhdGEpKSk7CgkJYnJlYWs7CgkgICAgfQoJICAgIGJyZWFrOwoJZGVmYXVsdDoKCSAgICBpZiAoZG9QbGF5KSB7CgkJZHdSZXQgPSBtb2RNZXNzYWdlKHdtbS0+d01pZGlJRCwgTU9ETV9EQVRBLCAwLCBtbXQtPmR3RXZlbnREYXRhLCAwKTsKCSAgICB9IGVsc2UgewoJCXN3aXRjaCAoTE9CWVRFKExPV09SRChtbXQtPmR3RXZlbnREYXRhKSkgJiAweEYwKSB7CgkJY2FzZSBNSURJX05PVEVPTjoKCQljYXNlIE1JRElfTk9URU9GRjoKCQkgICAgZHdSZXQgPSAwOwkKCQkgICAgYnJlYWs7CgkJZGVmYXVsdDoKCQkgICAgZHdSZXQgPSBtb2RNZXNzYWdlKHdtbS0+d01pZGlJRCwgTU9ETV9EQVRBLCAwLCBtbXQtPmR3RXZlbnREYXRhLCAwKTsKCQl9CgkgICAgfQoJfQoJbW10LT5kd0luZGV4ICs9IG1tdC0+d0V2ZW50TGVuZ3RoOwoJaWYgKG1tdC0+ZHdJbmRleCA8IG1tdC0+ZHdGaXJzdCB8fCBtbXQtPmR3SW5kZXggPj0gbW10LT5kd0xhc3QpIHsKCSAgICBtbXQtPndTdGF0dXMgPSAwOwoJfSAKCWlmIChtbXQtPndTdGF0dXMpIHsJCgkgICAgTUlESV9tY2lSZWFkTmV4dEV2ZW50KHdtbSwgbW10KTsKCX0KICAgIH0KICAgIAogICAgLyogc3RvcCBhbGwgbm90ZXMgKi8KICAgIC8qIHNob3VsZCBiZSAoMHg3ODAwIHwgTUlESV9DVExfQ0hBTkdFKSBpbnN0ZWFkIG9mIDB4NzhCMCwKICAgICAqIGJ1dCBNSURJX0NUTF9DSEFOR0UgaXMgZGVmaW5lZCBpbiBPU1MncyBzb3VuZGNhcmQuaCBhbmQgTUNJIG11c3QgY29tcGlsZQogICAgICogd2l0aG91dCBhbnkgcmVmZXJlbmNlIHRvIE9TUwogICAgICovCiAgICAvKiBGSVhNRTogY2hlY2sgaWYgMHg3OEIwIGlzIGNoYW5uZWwgZGVwZW5kYW50IG9yIG5vdC4gSSBjb2RlZCBpdCBzbyB0aGF0IAogICAgICogaXQncyBjaGFubmVsIGRlcGVuZGVudC4uLgogICAgICovCiAgICB7Cgl1bnNpZ25lZCBjaG47Cglmb3IgKGNobiA9IDA7IGNobiA8IDE2OyBjaG4rKykKCSAgICBtb2RNZXNzYWdlKHdtbS0+d01pZGlJRCwgTU9ETV9EQVRBLCAwLCAweDc4QjAgfCBjaG4sIDApOwogICAgfQogICAgCiAgICB3bW0tPmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKICAgIAogICAgLyogdG8gcmVzdGFydCBwbGF5aW5nIGF0IGJlZ2lubmluZyB3aGVuIGl0J3Mgb3ZlciAqLwogICAgd21tLT5kd1Bvc2l0aW9uTVMgPSAwOwogICAgCiAgICBpZiAobHBQYXJtcyAmJiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpKSB7CglUUkFDRV8obWNpbWlkaSkoIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKCW1jaURyaXZlck5vdGlmeTE2KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKCQkJICB3bW0tPndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKICAgIH0KICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpUmVjb3JkCQkJW2ludGVybmFsXQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpUmVjb3JkKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1JFQ09SRF9QQVJNUyBscFBhcm1zKQp7CiAgICBpbnQJCQlzdGFydCwgZW5kOwogICAgTFBNSURJSERSMTYJCWxwTWlkaUhkcjsKICAgIERXT1JECQlkd1JldDsKICAgIFdJTkVfTUNJTUlESSoJd21tID0gTUlESV9tY2lHZXRPcGVuRGV2KHdEZXZJRCk7CiAgICAKICAgIFRSQUNFXyhtY2ltaWRpKSgiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogICAgCiAgICBpZiAod21tID09IDApCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfSUQ7CiAgICAKICAgIGlmICh3bW0tPmhGaWxlID09IDApIHsKCVdBUk5fKG1jaW1pZGkpKCJDYW4ndCBmaW5kIGZpbGU9JyUwOGx4JyAhXG4iLCAKCSAgICAgKERXT1JEKXdtbS0+b3BlblBhcm1zLmxwc3RyRWxlbWVudE5hbWUpOwoJcmV0dXJuIE1DSUVSUl9GSUxFX05PVF9GT1VORDsKICAgIH0KICAgIHN0YXJ0ID0gMTsgCQllbmQgPSA5OTk5OTsKICAgIGlmIChscFBhcm1zICYmIChkd0ZsYWdzICYgTUNJX0ZST00pKSB7CglzdGFydCA9IGxwUGFybXMtPmR3RnJvbTsgCglUUkFDRV8obWNpbWlkaSkoIk1DSV9GUk9NPSVkIFxuIiwgc3RhcnQpOwogICAgfQogICAgaWYgKGxwUGFybXMgJiYgKGR3RmxhZ3MgJiBNQ0lfVE8pKSB7CgllbmQgPSBscFBhcm1zLT5kd1RvOwoJVFJBQ0VfKG1jaW1pZGkpKCJNQ0lfVE89JWQgXG4iLCBlbmQpOwogICAgfQogICAgbHBNaWRpSGRyID0gVVNFUl9IRUFQX0xJTl9BRERSKHdtbS0+aE1pZGlIZHIpOwogICAgbHBNaWRpSGRyLT5scERhdGEgPSAoTFBTVFIpIG1hbGxvYygxMjAwKTsKICAgIGlmICghbHBNaWRpSGRyKQoJcmV0dXJuIE1DSUVSUl9PVVRfT0ZfTUVNT1JZOwogICAgbHBNaWRpSGRyLT5kd0J1ZmZlckxlbmd0aCA9IDEwMjQ7CiAgICBscE1pZGlIZHItPmR3VXNlciA9IDBMOwogICAgbHBNaWRpSGRyLT5kd0ZsYWdzID0gMEw7CiAgICBkd1JldCA9IG1pZE1lc3NhZ2Uod21tLT53TWlkaUlELCBNSURNX1BSRVBBUkUsIDAsIChEV09SRClscE1pZGlIZHIsIHNpemVvZihNSURJSERSMTYpKTsKICAgIFRSQUNFXyhtY2ltaWRpKSgiQWZ0ZXIgTUlETV9QUkVQQVJFIFxuIik7CiAgICB3bW0tPmR3U3RhdHVzID0gTUNJX01PREVfUkVDT1JEOwogICAgd2hpbGUgKHdtbS0+ZHdTdGF0dXMgIT0gTUNJX01PREVfU1RPUCkgewoJVFJBQ0VfKG1jaW1pZGkpKCJ3bW0tPmR3U3RhdHVzPSVwICVkXG4iLAoJICAgICAgJndtbS0+ZHdTdGF0dXMsIHdtbS0+ZHdTdGF0dXMpOwoJbHBNaWRpSGRyLT5kd0J5dGVzUmVjb3JkZWQgPSAwOwoJZHdSZXQgPSBtaWRNZXNzYWdlKHdtbS0+d01pZGlJRCwgTUlETV9TVEFSVCwgMCwgMEwsIDBMKTsKCVRSQUNFXyhtY2ltaWRpKSgiQWZ0ZXIgTUlETV9TVEFSVCBscE1pZGlIZHI9JXAgZHdCeXRlc1JlY29yZGVkPSVsdVxuIiwKCSAgICAgIGxwTWlkaUhkciwgbHBNaWRpSGRyLT5kd0J5dGVzUmVjb3JkZWQpOwoJaWYgKGxwTWlkaUhkci0+ZHdCeXRlc1JlY29yZGVkID09IDApIGJyZWFrOwogICAgfQogICAgVFJBQ0VfKG1jaW1pZGkpKCJCZWZvcmUgTUlETV9VTlBSRVBBUkUgXG4iKTsKICAgIGR3UmV0ID0gbWlkTWVzc2FnZSh3bW0tPndNaWRpSUQsIE1JRE1fVU5QUkVQQVJFLCAwLCAoRFdPUkQpbHBNaWRpSGRyLCBzaXplb2YoTUlESUhEUjE2KSk7CiAgICBUUkFDRV8obWNpbWlkaSkoIkFmdGVyIE1JRE1fVU5QUkVQQVJFIFxuIik7CiAgICBpZiAobHBNaWRpSGRyLT5scERhdGEgIT0gTlVMTCkgewoJZnJlZShscE1pZGlIZHItPmxwRGF0YSk7CglscE1pZGlIZHItPmxwRGF0YSA9IE5VTEw7CiAgICB9CiAgICB3bW0tPmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKICAgIGlmIChscFBhcm1zICYmIChkd0ZsYWdzICYgTUNJX05PVElGWSkpIHsKCVRSQUNFXyhtY2ltaWRpKSgiTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOwoJbWNpRHJpdmVyTm90aWZ5MTYoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAoJCQkgIHdtbS0+d05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lQYXVzZQkJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRCBNSURJX21jaVBhdXNlKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKewogICAgV0lORV9NQ0lNSURJKgl3bW0gPSBNSURJX21jaUdldE9wZW5EZXYod0RldklEKTsKICAgIAogICAgVFJBQ0VfKG1jaW1pZGkpKCIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAgICAKICAgIGlmICh3bW0gPT0gTlVMTCkJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKICAgIAogICAgaWYgKHdtbS0+ZHdTdGF0dXMgPT0gTUNJX01PREVfUExBWSkgewoJLyogc3RvcCBhbGwgbm90ZXMgKi8KCS8qIHNlZSBub3RlIGluIE1JRElfbWNpUGxheSAqLwoJdW5zaWduZWQgY2huOwoJZm9yIChjaG4gPSAwOyBjaG4gPCAxNjsgY2huKyspCgkgICAgbW9kTWVzc2FnZSh3bW0tPndNaWRpSUQsIE1PRE1fREFUQSwgMCwgMHg3OEIwIHwgY2huLCAwKTsKCXdtbS0+ZHdTdGF0dXMgPSBNQ0lfTU9ERV9QQVVTRTsKICAgIH0gCiAgICBpZiAobHBQYXJtcyAmJiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpKSB7CglUUkFDRV8obWNpbWlkaSkoIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKCW1jaURyaXZlck5vdGlmeTE2KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKCQkJICB3bW0tPndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKICAgIH0KICAgIAogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lSZXN1bWUJCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lSZXN1bWUoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQp7CiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfbWNpR2V0T3BlbkRldih3RGV2SUQpOwogICAgCiAgICBUUkFDRV8obWNpbWlkaSkoIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKICAgIAogICAgaWYgKHdtbSA9PSBOVUxMKQlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwogICAgCiAgICBpZiAod21tLT5kd1N0YXR1cyA9PSBNQ0lfTU9ERV9QQVVTRSkgewoJd21tLT53U3RhcnRlZFBsYXlpbmcgPSBGQUxTRTsKCXdtbS0+ZHdTdGF0dXMgPSBNQ0lfTU9ERV9QTEFZOwogICAgfSAKICAgIGlmIChscFBhcm1zICYmIChkd0ZsYWdzICYgTUNJX05PVElGWSkpIHsKCVRSQUNFXyhtY2ltaWRpKSgiTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOwoJbWNpRHJpdmVyTm90aWZ5MTYoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAoJCQkgIHdtbS0+d05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lTZXQJCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lTZXQoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU0VUX1BBUk1TIGxwUGFybXMpCnsKICAgIFdJTkVfTUNJTUlESSoJd21tID0gTUlESV9tY2lHZXRPcGVuRGV2KHdEZXZJRCk7CiAgICAKICAgIFRSQUNFXyhtY2ltaWRpKSgiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogICAgCiAgICBpZiAobHBQYXJtcyA9PSBOVUxMKQlyZXR1cm4gTUNJRVJSX05VTExfUEFSQU1FVEVSX0JMT0NLOwogICAgaWYgKHdtbSA9PSBOVUxMKQkJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKICAgIAogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX1RJTUVfRk9STUFUKSB7Cglzd2l0Y2ggKGxwUGFybXMtPmR3VGltZUZvcm1hdCkgewoJY2FzZSBNQ0lfRk9STUFUX01JTExJU0VDT05EUzoKCSAgICBUUkFDRV8obWNpbWlkaSkoIk1DSV9GT1JNQVRfTUlMTElTRUNPTkRTICFcbiIpOwoJICAgIHdtbS0+ZHdNY2lUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9GT1JNQVRfU01QVEVfMjQ6CgkgICAgVFJBQ0VfKG1jaW1pZGkpKCJNQ0lfRk9STUFUX1NNUFRFXzI0ICFcbiIpOwoJICAgIHdtbS0+ZHdNY2lUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9TTVBURV8yNDsKCSAgICBicmVhazsKCWNhc2UgTUNJX0ZPUk1BVF9TTVBURV8yNToKCSAgICBUUkFDRV8obWNpbWlkaSkoIk1DSV9GT1JNQVRfU01QVEVfMjUgIVxuIik7CgkgICAgd21tLT5kd01jaVRpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX1NNUFRFXzI1OwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfRk9STUFUX1NNUFRFXzMwOgoJICAgIFRSQUNFXyhtY2ltaWRpKSgiTUNJX0ZPUk1BVF9TTVBURV8zMCAhXG4iKTsKCSAgICB3bW0tPmR3TWNpVGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfU01QVEVfMzA7CgkgICAgYnJlYWs7CglkZWZhdWx0OgoJICAgIFdBUk5fKG1jaW1pZGkpKCJCYWQgdGltZSBmb3JtYXQgJWx1IVxuIiwgbHBQYXJtcy0+ZHdUaW1lRm9ybWF0KTsKCSAgICByZXR1cm4gTUNJRVJSX0JBRF9USU1FX0ZPUk1BVDsKCX0KICAgIH0KICAgIGlmIChkd0ZsYWdzICYgTUNJX1NFVF9WSURFTykgewoJVFJBQ0VfKG1jaW1pZGkpKCJObyBzdXBwb3J0IGZvciB2aWRlbyAhXG4iKTsKCXJldHVybiBNQ0lFUlJfVU5TVVBQT1JURURfRlVOQ1RJT047CiAgICB9CiAgICBpZiAoZHdGbGFncyAmIE1DSV9TRVRfRE9PUl9PUEVOKSB7CglUUkFDRV8obWNpbWlkaSkoIk5vIHN1cHBvcnQgZm9yIGRvb3Igb3BlbiAhXG4iKTsKCXJldHVybiBNQ0lFUlJfVU5TVVBQT1JURURfRlVOQ1RJT047CiAgICB9CiAgICBpZiAoZHdGbGFncyAmIE1DSV9TRVRfRE9PUl9DTE9TRUQpIHsKCVRSQUNFXyhtY2ltaWRpKSgiTm8gc3VwcG9ydCBmb3IgZG9vciBjbG9zZSAhXG4iKTsKCXJldHVybiBNQ0lFUlJfVU5TVVBQT1JURURfRlVOQ1RJT047CiAgICB9CiAgICBpZiAoZHdGbGFncyAmIE1DSV9TRVRfQVVESU8pIHsKCWlmIChkd0ZsYWdzICYgTUNJX1NFVF9PTikgewoJICAgIFRSQUNFXyhtY2ltaWRpKSgiTUNJX1NFVF9PTiBhdWRpbyAhXG4iKTsKCX0gZWxzZSBpZiAoZHdGbGFncyAmIE1DSV9TRVRfT0ZGKSB7CgkgICAgVFJBQ0VfKG1jaW1pZGkpKCJNQ0lfU0VUX09GRiBhdWRpbyAhXG4iKTsKCX0gZWxzZSB7CgkgICAgV0FSTl8obWNpbWlkaSkoIk1DSV9TRVRfQVVESU8gd2l0aG91dCBTRVRfT04gb3IgU0VUX09GRlxuIik7CgkgICAgcmV0dXJuIE1DSUVSUl9CQURfSU5URUdFUjsKCX0KCQoJaWYgKGxwUGFybXMtPmR3QXVkaW8gJiBNQ0lfU0VUX0FVRElPX0FMTCkKCSAgICBUUkFDRV8obWNpbWlkaSkoIk1DSV9TRVRfQVVESU9fQUxMICFcbiIpOwoJaWYgKGxwUGFybXMtPmR3QXVkaW8gJiBNQ0lfU0VUX0FVRElPX0xFRlQpCgkgICAgVFJBQ0VfKG1jaW1pZGkpKCJNQ0lfU0VUX0FVRElPX0xFRlQgIVxuIik7CglpZiAobHBQYXJtcy0+ZHdBdWRpbyAmIE1DSV9TRVRfQVVESU9fUklHSFQpCgkgICAgVFJBQ0VfKG1jaW1pZGkpKCJNQ0lfU0VUX0FVRElPX1JJR0hUICFcbiIpOwogICAgfQogICAgCiAgICBpZiAoZHdGbGFncyAmIE1DSV9TRVFfU0VUX01BU1RFUikKCVRSQUNFXyhtY2ltaWRpKSgiTUNJX1NFUV9TRVRfTUFTVEVSICFcbiIpOwogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VRX1NFVF9TTEFWRSkKCVRSQUNFXyhtY2ltaWRpKSgiTUNJX1NFUV9TRVRfU0xBVkUgIVxuIik7CiAgICBpZiAoZHdGbGFncyAmIE1DSV9TRVFfU0VUX09GRlNFVCkKCVRSQUNFXyhtY2ltaWRpKSgiTUNJX1NFUV9TRVRfT0ZGU0VUICFcbiIpOwogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VRX1NFVF9QT1JUKQoJVFJBQ0VfKG1jaW1pZGkpKCJNQ0lfU0VRX1NFVF9QT1JUICFcbiIpOwogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VRX1NFVF9URU1QTykKCVRSQUNFXyhtY2ltaWRpKSgiTUNJX1NFUV9TRVRfVEVNUE8gIVxuIik7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVN0YXR1cwkJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRCBNSURJX21jaVN0YXR1cyhVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9TVEFUVVNfUEFSTVMgbHBQYXJtcykKewogICAgV0lORV9NQ0lNSURJKgl3bW0gPSBNSURJX21jaUdldE9wZW5EZXYod0RldklEKTsKICAgIAogICAgVFJBQ0VfKG1jaW1pZGkpKCIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAgICAKICAgIGlmIChscFBhcm1zID09IE5VTEwpIAlyZXR1cm4gTUNJRVJSX05VTExfUEFSQU1FVEVSX0JMT0NLOwogICAgaWYgKHdtbSA9PSBOVUxMKQkJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKICAgIAogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU1RBVFVTX0lURU0pIHsKCXN3aXRjaCAobHBQYXJtcy0+ZHdJdGVtKSB7CgljYXNlIE1DSV9TVEFUVVNfQ1VSUkVOVF9UUkFDSzoKCSAgICAvKiBGSVhNRSBpbiBGb3JtYXQgMiAqLwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gMTsKCSAgICBUUkFDRV8obWNpbWlkaSkoIk1DSV9TVEFUVVNfQ1VSUkVOVF9UUkFDSyA9PiAlbHVcbiIsIGxwUGFybXMtPmR3UmV0dXJuKTsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NUQVRVU19MRU5HVEg6CgkgICAgaWYgKChkd0ZsYWdzICYgTUNJX1RSQUNLKSAmJiB3bW0tPndGb3JtYXQgPT0gMikgewoJCWlmIChscFBhcm1zLT5kd1RyYWNrID49IHdtbS0+blRyYWNrcykKCQkgICAgcmV0dXJuIE1DSUVSUl9CQURfSU5URUdFUjsKCQkvKiBGSVhNRTogdGhpcyBpcyB3cm9uZyBpZiB0aGVyZSBpcyBhIHRlbXBvIGNoYW5nZSBpbnNpZGUgdGhlIGZpbGUgKi8KCQlscFBhcm1zLT5kd1JldHVybiA9IE1JRElfQ29udmVydFB1bHNlVG9NUyh3bW0sIHdtbS0+dHJhY2tzW2xwUGFybXMtPmR3VHJhY2tdLmR3TGVuZ3RoKTsKCSAgICB9IGVsc2UgewoJCWxwUGFybXMtPmR3UmV0dXJuID0gTUlESV9HZXRNVGhkTGVuZ3RoTVMod21tKTsKCSAgICB9CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBNSURJX0NvbnZlcnRNU1RvVGltZUZvcm1hdCh3bW0sIGxwUGFybXMtPmR3UmV0dXJuKTsKCSAgICBUUkFDRV8obWNpbWlkaSkoIk1DSV9TVEFUVVNfTEVOR1RIID0+ICVsdVxuIiwgbHBQYXJtcy0+ZHdSZXR1cm4pOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfU1RBVFVTX01PREU6CiAJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gd21tLT5kd1N0YXR1czsKCSAgICBUUkFDRV8obWNpbWlkaSkoIk1DSV9TVEFUVVNfTU9ERSA9PiAlbHVcbiIsIGxwUGFybXMtPmR3UmV0dXJuKTsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NUQVRVU19NRURJQV9QUkVTRU5UOgoJICAgIFRSQUNFXyhtY2ltaWRpKSgiTUNJX1NUQVRVU19NRURJQV9QUkVTRU5UID0+IFRSVUVcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gVFJVRTsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NUQVRVU19OVU1CRVJfT0ZfVFJBQ0tTOgoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gKHdtbS0+d0Zvcm1hdCA9PSAyKSA/IHdtbS0+blRyYWNrcyA6IDE7CgkgICAgVFJBQ0VfKG1jaW1pZGkpKCJNQ0lfU1RBVFVTX05VTUJFUl9PRl9UUkFDS1MgPT4gJWx1XG4iLCBscFBhcm1zLT5kd1JldHVybik7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TVEFUVVNfUE9TSVRJT046CgkgICAgLyogRklYTUU6IGRvIEkgbmVlZCB0byB1c2UgTUNJX1RSQUNLID8gKi8KCSAgICBscFBhcm1zLT5kd1JldHVybiA9IE1JRElfQ29udmVydE1TVG9UaW1lRm9ybWF0KHdtbSwgCgkJCQkJCQkgICAoZHdGbGFncyAmIE1DSV9TVEFUVVNfU1RBUlQpID8gMCA6IHdtbS0+ZHdQb3NpdGlvbk1TKTsKCSAgICBUUkFDRV8obWNpbWlkaSkoIk1DSV9TVEFUVVNfUE9TSVRJT04gJXMgPT4gJWx1XG4iLCAKCQkgIChkd0ZsYWdzICYgTUNJX1NUQVRVU19TVEFSVCkgPyAic3RhcnQiIDogImN1cnJlbnQiLCBscFBhcm1zLT5kd1JldHVybik7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TVEFUVVNfUkVBRFk6CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSAod21tLT5kd1N0YXR1cyAhPSBNQ0lfTU9ERV9OT1RfUkVBRFkpOwoJICAgIFRSQUNFXyhtY2ltaWRpKSgiTUNJX1NUQVRVU19SRUFEWSA9ICVsdVxuIiwgbHBQYXJtcy0+ZHdSZXR1cm4pOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfU1RBVFVTX1RJTUVfRk9STUFUOgoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gd21tLT5kd01jaVRpbWVGb3JtYXQ7CgkgICAgVFJBQ0VfKG1jaW1pZGkpKCJNQ0lfU1RBVFVTX1RJTUVfRk9STUFUID0+ICVsdVxuIiwgbHBQYXJtcy0+ZHdSZXR1cm4pOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfU0VRX1NUQVRVU19ESVZUWVBFOgoJICAgIFRSQUNFXyhtY2ltaWRpKSgiTUNJX1NFUV9TVEFUVVNfRElWVFlQRSAhXG4iKTsKCSAgICBpZiAod21tLT5uRGl2aXNpb24gPiAweDgwMDApIHsKCQlzd2l0Y2ggKHdtbS0+bkRpdmlzaW9uKSB7CgkJY2FzZSAweEU4OglscFBhcm1zLT5kd1JldHVybiA9IE1DSV9TRVFfRElWX1NNUFRFXzI0OwlicmVhazsJLyogLTI0ICovCgkJY2FzZSAweEU3OglscFBhcm1zLT5kd1JldHVybiA9IE1DSV9TRVFfRElWX1NNUFRFXzI1OwlicmVhazsJLyogLTI1ICovCgkJY2FzZSAweEUzOglscFBhcm1zLT5kd1JldHVybiA9IE1DSV9TRVFfRElWX1NNUFRFXzMwRFJPUDsJYnJlYWs7CS8qIC0yOSAqLyAvKiBpcyB0aGUgTUNJIGNvbnN0YW50IGNvcnJlY3QgPyAqLwoJCWNhc2UgMHhFMjoJbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQ0lfU0VRX0RJVl9TTVBURV8zMDsJYnJlYWs7CS8qIC0zMCAqLwoJCWRlZmF1bHQ6CUZJWE1FXyhtY2ltaWRpKSgiVGhlcmUgaXMgYSBiYWQgYmFkIHByb2dyYW1tZXJcbiIpOwoJCX0KCSAgICB9IGVsc2UgewoJCWxwUGFybXMtPmR3UmV0dXJuID0gTUNJX1NFUV9ESVZfUFBRTjsKCSAgICB9CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TRVFfU1RBVFVTX01BU1RFUjoKCSAgICBUUkFDRV8obWNpbWlkaSkoIk1DSV9TRVFfU1RBVFVTX01BU1RFUiAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IDA7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TRVFfU1RBVFVTX1NMQVZFOgoJICAgIFRSQUNFXyhtY2ltaWRpKSgiTUNJX1NFUV9TVEFUVVNfU0xBVkUgIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSAwOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfU0VRX1NUQVRVU19PRkZTRVQ6CgkgICAgVFJBQ0VfKG1jaW1pZGkpKCJNQ0lfU0VRX1NUQVRVU19PRkZTRVQgIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSAwOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfU0VRX1NUQVRVU19QT1JUOgoJICAgIFRSQUNFXyhtY2ltaWRpKSgiTUNJX1NFUV9TVEFUVVNfUE9SVCAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IDA7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TRVFfU1RBVFVTX1RFTVBPOgoJICAgIFRSQUNFXyhtY2ltaWRpKSgiTUNJX1NFUV9TVEFUVVNfVEVNUE8gIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSB3bW0tPmR3VGVtcG87CgkgICAgYnJlYWs7CglkZWZhdWx0OgoJICAgIFdBUk5fKG1jaW1pZGkpKCJVbmtub3dtIGNvbW1hbmQgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdJdGVtKTsKCSAgICByZXR1cm4gTUNJRVJSX1VOUkVDT0dOSVpFRF9DT01NQU5EOwoJfQogICAgfSBlbHNlIHsKCVdBUk5fKG1jaW1pZGkpKCJObyBTdGF0dXMtSXRlbSFcbiIpOwoJcmV0dXJuIE1DSUVSUl9VTlJFQ09HTklaRURfQ09NTUFORDsKICAgIH0KICAgIGlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewoJVFJBQ0VfKG1jaW1pZGkpKCJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CgltY2lEcml2ZXJOb3RpZnkxNigoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCgkJCSAgd21tLT53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaUdldERldkNhcHMJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRCBNSURJX21jaUdldERldkNhcHMoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgCgkJCQlMUE1DSV9HRVRERVZDQVBTX1BBUk1TIGxwUGFybXMpCnsKICAgIFdJTkVfTUNJTUlESSoJd21tID0gTUlESV9tY2lHZXRPcGVuRGV2KHdEZXZJRCk7CiAgICAKICAgIFRSQUNFXyhtY2ltaWRpKSgiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogICAgCiAgICBpZiAobHBQYXJtcyA9PSBOVUxMKSAJcmV0dXJuIE1DSUVSUl9OVUxMX1BBUkFNRVRFUl9CTE9DSzsKICAgIGlmICh3bW0gPT0gTlVMTCkJCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfSUQ7CiAgICAKICAgIGlmIChkd0ZsYWdzICYgTUNJX0dFVERFVkNBUFNfSVRFTSkgewoJc3dpdGNoIChscFBhcm1zLT5kd0l0ZW0pIHsKCWNhc2UgTUNJX0dFVERFVkNBUFNfREVWSUNFX1RZUEU6CgkgICAgVFJBQ0VfKG1jaW1pZGkpKCJNQ0lfR0VUREVWQ0FQU19ERVZJQ0VfVFlQRSAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IE1DSV9ERVZUWVBFX1NFUVVFTkNFUjsKCSAgICBicmVhazsKCWNhc2UgTUNJX0dFVERFVkNBUFNfSEFTX0FVRElPOgoJICAgIFRSQUNFXyhtY2ltaWRpKSgiTUNJX0dFVERFVkNBUFNfSEFTX0FVRElPICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gVFJVRTsKCSAgICBicmVhazsKCWNhc2UgTUNJX0dFVERFVkNBUFNfSEFTX1ZJREVPOgoJICAgIFRSQUNFXyhtY2ltaWRpKSgiTUNJX0dFVERFVkNBUFNfSEFTX1ZJREVPICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gRkFMU0U7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9HRVRERVZDQVBTX1VTRVNfRklMRVM6CgkgICAgVFJBQ0VfKG1jaW1pZGkpKCJNQ0lfR0VUREVWQ0FQU19VU0VTX0ZJTEVTICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gVFJVRTsKCSAgICBicmVhazsKCWNhc2UgTUNJX0dFVERFVkNBUFNfQ09NUE9VTkRfREVWSUNFOgoJICAgIFRSQUNFXyhtY2ltaWRpKSgiTUNJX0dFVERFVkNBUFNfQ09NUE9VTkRfREVWSUNFICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gVFJVRTsKCSAgICBicmVhazsKCWNhc2UgTUNJX0dFVERFVkNBUFNfQ0FOX0VKRUNUOgoJICAgIFRSQUNFXyhtY2ltaWRpKSgiTUNJX0dFVERFVkNBUFNfQ0FOX0VKRUNUICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gRkFMU0U7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9HRVRERVZDQVBTX0NBTl9QTEFZOgoJICAgIFRSQUNFXyhtY2ltaWRpKSgiTUNJX0dFVERFVkNBUFNfQ0FOX1BMQVkgIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBUUlVFOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfR0VUREVWQ0FQU19DQU5fUkVDT1JEOgoJICAgIFRSQUNFXyhtY2ltaWRpKSgiTUNJX0dFVERFVkNBUFNfQ0FOX1JFQ09SRCAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IFRSVUU7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9HRVRERVZDQVBTX0NBTl9TQVZFOgoJICAgIFRSQUNFXyhtY2ltaWRpKSgiTUNJX0dFVERFVkNBUFNfQ0FOX1NBVkUgIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBGQUxTRTsKCSAgICBicmVhazsKCWRlZmF1bHQ6CgkgICAgVFJBQ0VfKG1jaW1pZGkpKCJVbmtub3duIGNhcGFiaWxpdHkgKCUwOGx4KSAhXG4iLCBscFBhcm1zLT5kd0l0ZW0pOwoJICAgIHJldHVybiBNQ0lFUlJfVU5SRUNPR05JWkVEX0NPTU1BTkQ7Cgl9CiAgICB9IGVsc2UgewoJVFJBQ0VfKG1jaW1pZGkpKCJObyBHZXREZXZDYXBzLUl0ZW0gIVxuIik7CglyZXR1cm4gTUNJRVJSX1VOUkVDT0dOSVpFRF9DT01NQU5EOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lJbmZvCQkJW2ludGVybmFsXQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpSW5mbyhVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9JTkZPX1BBUk1TQSBscFBhcm1zKQp7CiAgICBEV09SRAkJcmV0ID0gMDsKICAgIExQU1RSCQlzdHIgPSAwOwogICAgV0lORV9NQ0lNSURJKgl3bW0gPSBNSURJX21jaUdldE9wZW5EZXYod0RldklEKTsKICAgIAogICAgVFJBQ0VfKG1jaW1pZGkpKCIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAgICAKICAgIGlmIChscFBhcm1zID09IE5VTEwgfHwgbHBQYXJtcy0+bHBzdHJSZXR1cm4gPT0gTlVMTCkgewoJcmV0ID0gTUNJRVJSX05VTExfUEFSQU1FVEVSX0JMT0NLOwogICAgfSBlbHNlIGlmICh3bW0gPT0gTlVMTCkgewoJcmV0ID0gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwogICAgfSBlbHNlIHsKCVRSQUNFXyhtY2ltaWRpKSgiYnVmPSVwLCBsZW49JWx1XG4iLCBscFBhcm1zLT5scHN0clJldHVybiwgbHBQYXJtcy0+ZHdSZXRTaXplKTsKCQoJc3dpdGNoIChkd0ZsYWdzKSB7CgljYXNlIE1DSV9JTkZPX1BST0RVQ1Q6CgkgICAgc3RyID0gIldpbmUncyBNSURJIHNlcXVlbmNlciI7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9JTkZPX0ZJTEU6CgkgICAgc3RyID0gd21tLT5vcGVuUGFybXMubHBzdHJFbGVtZW50TmFtZTsKCSAgICBicmVhazsKI2lmIDAKCSAgICAvKiBGSVhNRTogdGhlIGZvbGxvd2luZyBtYW5pZmVzdCBjb25zdGFudHMgYXJlIG5vdCBkZWZpbmVkIGluIDxXSU5FPi9pbmNsdWRlL21tc3lzdGVtLmggKi8KCWNhc2UgTUNJX0lORk9fQ09QWVJJR0hUOgoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfSU5GT19OQU1FOgoJICAgIGJyZWFrOwojZW5kaWYKCWRlZmF1bHQ6CgkgICAgV0FSTl8obWNpbWlkaSkoIkRvbid0IGtub3cgdGhpcyBpbmZvIGNvbW1hbmQgKCVsdSlcbiIsIGR3RmxhZ3MpOwoJICAgIHJldCA9IE1DSUVSUl9VTlJFQ09HTklaRURfQ09NTUFORDsKCX0KICAgIH0KICAgIGlmIChzdHIpIHsKCXJldCA9IE1DSV9Xcml0ZVN0cmluZyhscFBhcm1zLT5scHN0clJldHVybiwgbHBQYXJtcy0+ZHdSZXRTaXplLCBzdHIpOwogICAgfSBlbHNlIHsKCWxwUGFybXMtPmxwc3RyUmV0dXJuWzBdID0gMDsKICAgIH0KICAgIAogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVNlZWsJCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lTZWVrKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1NFRUtfUEFSTVMgbHBQYXJtcykKewogICAgRFdPUkQJCXJldCA9IDA7CiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfbWNpR2V0T3BlbkRldih3RGV2SUQpOwogICAgCiAgICBUUkFDRV8obWNpbWlkaSkoIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKICAgIAogICAgaWYgKGxwUGFybXMgPT0gTlVMTCkgewoJcmV0ID0gTUNJRVJSX05VTExfUEFSQU1FVEVSX0JMT0NLOwogICAgfSBlbHNlIGlmICh3bW0gPT0gTlVMTCkgewoJcmV0ID0gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwogICAgfSBlbHNlIHsKCU1JRElfbWNpU3RvcCh3RGV2SUQsIE1DSV9XQUlULCAwKTsKCQoJaWYgKGR3RmxhZ3MgJiBNQ0lfU0VFS19UT19TVEFSVCkgewoJICAgIHdtbS0+ZHdQb3NpdGlvbk1TID0gMDsKCX0gZWxzZSBpZiAoZHdGbGFncyAmIE1DSV9TRUVLX1RPX0VORCkgewoJICAgIHdtbS0+ZHdQb3NpdGlvbk1TID0gMHhGRkZGRkZGRjsgLyogZml4bWUgKi8KCX0gZWxzZSBpZiAoZHdGbGFncyAmIE1DSV9UTykgewoJICAgIHdtbS0+ZHdQb3NpdGlvbk1TID0gTUlESV9Db252ZXJ0VGltZUZvcm1hdFRvTVMod21tLCBscFBhcm1zLT5kd1RvKTsKCX0gZWxzZSB7CgkgICAgV0FSTl8obWNpbWlkaSkoImR3RmxhZyBkb2Vzbid0IHRlbGwgd2hlcmUgdG8gc2VlayB0by4uLlxuIik7CgkgICAgcmV0dXJuIE1DSUVSUl9NSVNTSU5HX1BBUkFNRVRFUjsKCX0KCQoJVFJBQ0VfKG1jaW1pZGkpKCJTZWVraW5nIHRvIHBvc2l0aW9uPSVsdSBtc1xuIiwgd21tLT5kd1Bvc2l0aW9uTVMpOwoJCglpZiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpIHsKCSAgICBUUkFDRV8obWNpbWlkaSkoIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKCSAgICBtY2lEcml2ZXJOb3RpZnkxNigoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCgkJCSAgICAgIHdtbS0+d05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwoJfQogICAgfQogICAgcmV0dXJuIHJldDsJCn0gICAgCiNlbmRpZgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KgogKiAgICAgICAgICAgICAgICAgIAkgICAgTUlESSBlbnRyeSBwb2ludHMgCQkJCSoKICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUNJTUlESV9Ecml2ZXJQcm9jCSAgICAgW3NhbXBsZSBkcml2ZXJdCiAqLwpMT05HIE1DSU1JRElfRHJpdmVyUHJvYyhEV09SRCBkd0RldklELCBIRFJWUiBoRHJpdiwgRFdPUkQgd01zZywgCgkJCURXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKewogICAgc3dpdGNoICh3TXNnKSB7CiAgICBjYXNlIERSVl9MT0FEOgkJcmV0dXJuIDE7CiAgICBjYXNlIERSVl9GUkVFOgkJcmV0dXJuIDE7CiAgICBjYXNlIERSVl9PUEVOOgkJcmV0dXJuIE1JRElfZHJ2T3BlbigoTFBTVFIpZHdQYXJhbTEsIChMUE1DSV9PUEVOX0RSSVZFUl9QQVJNU0EpZHdQYXJhbTIpOwogICAgY2FzZSBEUlZfQ0xPU0U6CQlyZXR1cm4gTUlESV9kcnZDbG9zZShkd0RldklEKTsKICAgIGNhc2UgRFJWX0VOQUJMRToJCXJldHVybiAxOwogICAgY2FzZSBEUlZfRElTQUJMRToJCXJldHVybiAxOwogICAgY2FzZSBEUlZfUVVFUllDT05GSUdVUkU6CXJldHVybiAxOwogICAgY2FzZSBEUlZfQ09ORklHVVJFOgkJTWVzc2FnZUJveEEoMCwgIlNhbXBsZSBNaWRpIERyaXZlciAhIiwgIk9TUyBEcml2ZXIiLCBNQl9PSyk7IHJldHVybiAxOwogICAgY2FzZSBEUlZfSU5TVEFMTDoJCXJldHVybiBEUlZDTkZfUkVTVEFSVDsKICAgIGNhc2UgRFJWX1JFTU9WRToJCXJldHVybiBEUlZDTkZfUkVTVEFSVDsKI2lmZGVmIFNORENUTF9NSURJX0lORk8KICAgIGNhc2UgTUNJX09QRU5fRFJJVkVSOglyZXR1cm4gTUlESV9tY2lPcGVuICAgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfT1BFTl9QQVJNU0EpICAgICBkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9DTE9TRV9EUklWRVI6CXJldHVybiBNSURJX21jaUNsb3NlICAgICAoZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9HRU5FUklDX1BBUk1TKSAgIGR3UGFyYW0yKTsKICAgIGNhc2UgTUNJX1BMQVk6CQlyZXR1cm4gTUlESV9tY2lQbGF5ICAgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfUExBWV9QQVJNUykgICAgICBkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9SRUNPUkQ6CQlyZXR1cm4gTUlESV9tY2lSZWNvcmQgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfUkVDT1JEX1BBUk1TKSAgICBkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9TVE9QOgkJcmV0dXJuIE1JRElfbWNpU3RvcCAgICAgIChkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX0dFTkVSSUNfUEFSTVMpICAgZHdQYXJhbTIpOwogICAgY2FzZSBNQ0lfU0VUOgkJcmV0dXJuIE1JRElfbWNpU2V0ICAgICAgIChkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX1NFVF9QQVJNUykgICAgICAgZHdQYXJhbTIpOwogICAgY2FzZSBNQ0lfUEFVU0U6CQlyZXR1cm4gTUlESV9tY2lQYXVzZSAgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfR0VORVJJQ19QQVJNUykgICBkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9SRVNVTUU6CQlyZXR1cm4gTUlESV9tY2lSZXN1bWUgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfR0VORVJJQ19QQVJNUykgICBkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9TVEFUVVM6CQlyZXR1cm4gTUlESV9tY2lTdGF0dXMgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfU1RBVFVTX1BBUk1TKSAgICBkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9HRVRERVZDQVBTOglyZXR1cm4gTUlESV9tY2lHZXREZXZDYXBzKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfR0VUREVWQ0FQU19QQVJNUylkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9JTkZPOgkJcmV0dXJuIE1JRElfbWNpSW5mbyAgICAgIChkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX0lORk9fUEFSTVNBKSAgICAgZHdQYXJhbTIpOwogICAgY2FzZSBNQ0lfU0VFSzoJCXJldHVybiBNSURJX21jaVNlZWsgICAgICAoZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9TRUVLX1BBUk1TKSAgICAgIGR3UGFyYW0yKTsKI2Vsc2UKICAgIGNhc2UgTUNJX09QRU5fRFJJVkVSOgogICAgY2FzZSBNQ0lfQ0xPU0VfRFJJVkVSOgogICAgY2FzZSBNQ0lfUExBWToKICAgIGNhc2UgTUNJX1JFQ09SRDoKICAgIGNhc2UgTUNJX1NUT1A6CiAgICBjYXNlIE1DSV9TRVQ6CiAgICBjYXNlIE1DSV9QQVVTRToKICAgIGNhc2UgTUNJX1JFU1VNRToKICAgIGNhc2UgTUNJX1NUQVRVUzoKICAgIGNhc2UgTUNJX0dFVERFVkNBUFM6CiAgICBjYXNlIE1DSV9JTkZPOgogICAgY2FzZSBNQ0lfU0VFSzoKI2VuZGlmCiAgICBjYXNlIE1DSV9MT0FEOgkJCiAgICBjYXNlIE1DSV9TQVZFOgkJCiAgICBjYXNlIE1DSV9GUkVFWkU6CQkKICAgIGNhc2UgTUNJX1BVVDoJCQogICAgY2FzZSBNQ0lfUkVBTElaRToJCQogICAgY2FzZSBNQ0lfVU5GUkVFWkU6CQkKICAgIGNhc2UgTUNJX1VQREFURToJCQogICAgY2FzZSBNQ0lfV0hFUkU6CQkKICAgIGNhc2UgTUNJX1dJTkRPVzoJCQogICAgY2FzZSBNQ0lfU1RFUDoJCQogICAgY2FzZSBNQ0lfU1BJTjoJCQogICAgY2FzZSBNQ0lfRVNDQVBFOgkJCiAgICBjYXNlIE1DSV9DT1BZOgkJCiAgICBjYXNlIE1DSV9DVVQ6CQkKICAgIGNhc2UgTUNJX0RFTEVURToJCQogICAgY2FzZSBNQ0lfUEFTVEU6CQkKCVdBUk5fKG1jaW1pZGkpKCJVbnN1cHBvcnRlZCBjb21tYW5kPSVzXG4iLCBNQ0lfQ29tbWFuZFRvU3RyaW5nKHdNc2cpKTsKCWJyZWFrOwogICAgY2FzZSBNQ0lfT1BFTjoKICAgIGNhc2UgTUNJX0NMT1NFOgoJRklYTUVfKG1jaW1pZGkpKCJTaG91bGRuJ3QgcmVjZWl2ZSBhIE1DSV9PUEVOIG9yIENMT1NFIG1lc3NhZ2VcbiIpOwoJYnJlYWs7CiAgICBkZWZhdWx0OgkJCQoJVFJBQ0VfKG1jaW1pZGkpKCJTZW5kaW5nIG1zZz0lcyB0byBkZWZhdWx0IGRyaXZlciBwcm9jXG4iLCBNQ0lfQ29tbWFuZFRvU3RyaW5nKHdNc2cpKTsKCXJldHVybiBEZWZEcml2ZXJQcm9jKGR3RGV2SUQsIGhEcml2LCB3TXNnLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwogICAgfQogICAgcmV0dXJuIE1DSUVSUl9VTlJFQ09HTklaRURfQ09NTUFORDsKfQoKICAgIAo=