LyogLSotIHRhYi13aWR0aDogODsgYy1iYXNpYy1vZmZzZXQ6IDQgLSotICovCgovKgogKiBTYW1wbGUgTUlESSBXaW5lIERyaXZlciBmb3IgTGludXgKICoKICogQ29weXJpZ2h0IAkxOTk0IE1hcnRpbiBBeW90dGUKICoJCTE5OTkgRXJpYyBQb3VlY2gKICovCgovKiAKICogRXJpYyBQT1VFQ0ggOiAKICogOTgvNyBjaGFuZ2VzIGZvciBtYWtpbmcgdGhpcyBNSURJIGRyaXZlciB3b3JrIG9uIE9TUwogKiAJY3VycmVudCBzdXBwb3J0IGlzIGxpbWl0ZWQgdG8gTUlESSBwb3J0cyBvZiBPU1Mgc3lzdGVtcwogKiA5OC85CXJld3JpdGluZyBNQ0kgY29kZSBmb3IgTUlESQogKiA5OC8xMSBzcGxpdHRlZCBpbiBtaWRpLmMgYW5kIG1jaW1pZGkuYwogKi8KCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgIm1tZGRrLmgiCiNpbmNsdWRlICJkcml2ZXIuaCIKI2luY2x1ZGUgImhlYXAuaCIKI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKCkRFRkFVTFRfREVCVUdfQ0hBTk5FTChtY2ltaWRpKQoKI2RlZmluZSBNSURJX05PVEVPRkYgICAgICAgICAgICAgMHg4MAojZGVmaW5lIE1JRElfTk9URU9OICAgICAgICAgICAgICAweDkwCgp0eXBlZGVmIHN0cnVjdCB7CiAgICBEV09SRAkJZHdGaXJzdDsJCS8qIG9mZnNldCBpbiBmaWxlIG9mIHRyYWNrICovCiAgICBEV09SRAkJZHdMYXN0OwkJCS8qIG51bWJlciBvZiBieXRlcyBpbiBmaWxlIG9mIHRyYWNrICovCiAgICBEV09SRAkJZHdJbmRleDsJCS8qIGN1cnJlbnQgaW5kZXggaW4gZmlsZSAoZHdGaXJzdCA8PSBkd0luZGV4IDwgZHdMYXN0KSAqLwogICAgRFdPUkQJCWR3TGVuZ3RoOwkJLyogbnVtYmVyIG9mIHB1bHNlcyBpbiB0aGlzIHRyYWNrICovCiAgICBEV09SRAkJZHdFdmVudFB1bHNlOwkJLyogY3VycmVudCBwdWxzZSAjIChldmVudCkgcG9pbnRlZCBieSBkd0luZGV4ICovCiAgICBEV09SRAkJZHdFdmVudERhdGE7CQkvKiBjdXJyZW50IGRhdGEgICAgKGV2ZW50KSBwb2ludGVkIGJ5IGR3SW5kZXggKi8KICAgIFdPUkQJCXdFdmVudExlbmd0aDsJCS8qIGN1cnJlbnQgbGVuZ3RoICAoZXZlbnQpIHBvaW50ZWQgYnkgZHdJbmRleCAqLwogICAgV09SRAkJd1N0YXR1cyA6IDEsCQkvKiAxIDogcGxheWluZywgMCA6IGRvbmUgKi8KCSAgICAgICAgICAgICAgICB3VHJhY2tOciA6IDcsCgkgICAgICAgICAgICAgICAgd0xhc3RDb21tYW5kIDogODsJLyogbGFzdCBNSURJIGNvbW1hbmQgb24gdHJhY2sgKi8KfSBNQ0lfTUlESVRSQUNLOwoKdHlwZWRlZiBzdHJ1Y3QgdGFnV0lORV9NQ0lNSURJIHsKICAgIFVJTlQJCXdEZXZJRDsJCQkvKiB0aGUgTUNJIG9uZSAqLwogICAgSE1JREkJCWhNaWRpOwogICAgaW50CQkJblVzZUNvdW50OyAgICAgICAgICAJLyogSW5jcmVtZW50ZWQgZm9yIGVhY2ggc2hhcmVkIG9wZW4gICAgICAgICAgKi8KICAgIFdPUkQJCXdOb3RpZnlEZXZpY2VJRDsgICAgCS8qIE1DSSBkZXZpY2UgSUQgd2l0aCBhIHBlbmRpbmcgbm90aWZpY2F0aW9uICovCiAgICBIQU5ETEUgCQloQ2FsbGJhY2s7ICAgICAgICAgCS8qIENhbGxiYWNrIGhhbmRsZSBmb3IgcGVuZGluZyBub3RpZmljYXRpb24gICovCiAgICBITU1JTwkJaEZpbGU7CSAgICAgICAgICAgIAkvKiBtbWlvIGZpbGUgaGFuZGxlIG9wZW4gYXMgRWxlbWVudCAgICAgICAgICAqLwogICAgTFBDU1RSCQlscHN0ckVsZW1lbnROYW1lOwkvKiBOYW1lIG9mIGZpbGUgKi8KICAgIFdPUkQJCWR3U3RhdHVzOwkJLyogb25lIGZyb20gTUNJX01PREVfeHh4eCAqLwogICAgRFdPUkQJCWR3TWNpVGltZUZvcm1hdDsJLyogT25lIG9mIHRoZSBzdXBwb3J0ZWQgTUNJX0ZPUk1BVF94eHh4ICovCSAgICAgICAKICAgIFdPUkQJCXdGb3JtYXQ7CQkvKiBGb3JtYXQgb2YgTUlESSBoRmlsZSAoMCwgMSBvciAyKSAqLwogICAgV09SRAkJblRyYWNrczsJCS8qIE51bWJlciBvZiB0cmFja3MgaW4gaEZpbGUgKi8KICAgIFdPUkQJCW5EaXZpc2lvbjsJCS8qIE51bWJlciBvZiBkaXZpc2lvbiBpbiBoRmlsZSBQUFFOIG9yIFNNUFRFICovCiAgICBXT1JECQl3U3RhcnRlZFBsYXlpbmc7CiAgICBEV09SRAkJZHdUZW1wbzsJCS8qIFRlbXBvICgjIG9mIDEvNCBub3RlIHBlciBzZWNvbmQgKi8KICAgIE1DSV9NSURJVFJBQ0sqICAgICAJdHJhY2tzOwkJCS8qIENvbnRlbnQgb2YgZWFjaCB0cmFjayAqLwogICAgRFdPUkQJCWR3UHVsc2U7CQkKICAgIERXT1JECQlkd1Bvc2l0aW9uTVM7CiAgICBEV09SRAkJZHdTdGFydFRpY2tzOwp9IFdJTkVfTUNJTUlESTsKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSoKICogICAgICAgICAgICAgICAgICAJICAgIE1DSSBNSURJIGltcGxlbWFudGF0aW9uCQkJKgogKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKc3RhdGljIERXT1JEIE1JRElfbWNpUmVzdW1lKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX2Rydk9wZW4JCQlbaW50ZXJuYWxdCQogKi8Kc3RhdGljCURXT1JECU1JRElfZHJ2T3BlbihMUFNUUiBzdHIsIExQTUNJX09QRU5fRFJJVkVSX1BBUk1TQSBtb2RwKQp7CiAgICBXSU5FX01DSU1JREkqCXdtbSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCBzaXplb2YoV0lORV9NQ0lNSURJKSk7CgogICAgaWYgKCF3bW0pCglyZXR1cm4gMDsKCiAgICB3bW0tPndEZXZJRCA9IG1vZHAtPndEZXZpY2VJRDsKICAgIG1jaVNldERyaXZlckRhdGEod21tLT53RGV2SUQsIChEV09SRCl3bW0pOwogICAgbW9kcC0+d0N1c3RvbUNvbW1hbmRUYWJsZSA9IE1DSV9OT19DT01NQU5EX1RBQkxFOwogICAgbW9kcC0+d1R5cGUgPSBNQ0lfREVWVFlQRV9TRVFVRU5DRVI7CiAgICByZXR1cm4gbW9kcC0+d0RldmljZUlEOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1DSU1JRElfZHJ2Q2xvc2UJCVtpbnRlcm5hbF0JCiAqLwpzdGF0aWMJRFdPUkQJTUlESV9kcnZDbG9zZShEV09SRCBkd0RldklEKQp7CiAgICBXSU5FX01DSU1JREkqICB3bW0gPSAoV0lORV9NQ0lNSURJKiltY2lHZXREcml2ZXJEYXRhKGR3RGV2SUQpOwoKICAgIGlmICh3bW0pIHsKCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHdtbSk7CQoJbWNpU2V0RHJpdmVyRGF0YShkd0RldklELCAwKTsKCXJldHVybiAxOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lHZXRPcGVuRGV2CQlbaW50ZXJuYWxdCQogKi8Kc3RhdGljIFdJTkVfTUNJTUlESSogIE1JRElfbWNpR2V0T3BlbkRldihVSU5UIHdEZXZJRCkKewogICAgV0lORV9NQ0lNSURJKgl3bW0gPSAoV0lORV9NQ0lNSURJKiltY2lHZXREcml2ZXJEYXRhKHdEZXZJRCk7CiAgICAKICAgIGlmICh3bW0gPT0gTlVMTCB8fCB3bW0tPm5Vc2VDb3VudCA9PSAwKSB7CglXQVJOKCJJbnZhbGlkIHdEZXZJRD0ldVxuIiwgd0RldklEKTsKCXJldHVybiAwOwogICAgfQogICAgcmV0dXJuIHdtbTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVJlYWRCeXRlCQlbaW50ZXJuYWxdCQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpUmVhZEJ5dGUoV0lORV9NQ0lNSURJKiB3bW0sIEJZVEUgKmxwYnl0KQp7CiAgICBEV09SRAlyZXQgPSAwOwogICAgCiAgICBpZiAobHBieXQgPT0gTlVMTCB8fCAKCW1taW9SZWFkKHdtbS0+aEZpbGUsIChIUFNUUilscGJ5dCwgc2l6ZW9mKEJZVEUpKSAhPSAobG9uZylzaXplb2YoQllURSkpIHsKCVdBUk4oIkVycm9yIHJlYWRpbmcgd21tPSVwXG4iLCB3bW0pOwoJcmV0ID0gTUNJRVJSX0lOVkFMSURfRklMRTsKICAgIH0KICAgIAogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVJlYWRXb3JkCQlbaW50ZXJuYWxdCQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpUmVhZFdvcmQoV0lORV9NQ0lNSURJKiB3bW0sIExQV09SRCBscHcpCnsKICAgIEJZVEUJaGlieXRlLCBsb2J5dGU7CiAgICBEV09SRAlyZXQgPSBNQ0lFUlJfSU5WQUxJRF9GSUxFOwogICAgCiAgICBpZiAobHB3ICE9IE5VTEwgJiYgCglNSURJX21jaVJlYWRCeXRlKHdtbSwgJmhpYnl0ZSkgPT0gMCAmJiAKCU1JRElfbWNpUmVhZEJ5dGUod21tLCAmbG9ieXRlKSA9PSAwKSB7CgkqbHB3ID0gKChXT1JEKWhpYnl0ZSA8PCA4KSArIGxvYnl0ZTsKCXJldCA9IDA7CiAgICB9CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpUmVhZExvbmcJCVtpbnRlcm5hbF0JCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lSZWFkTG9uZyhXSU5FX01DSU1JREkqIHdtbSwgTFBEV09SRCBscGR3KQp7CiAgICBXT1JECWhpd29yZCwgbG93b3JkOwogICAgRFdPUkQJcmV0ID0gTUNJRVJSX0lOVkFMSURfRklMRTsKICAgIAogICAgaWYgKGxwZHcgIT0gTlVMTCAmJgoJTUlESV9tY2lSZWFkV29yZCh3bW0sICZoaXdvcmQpID09IDAgJiYKCU1JRElfbWNpUmVhZFdvcmQod21tLCAmbG93b3JkKSA9PSAwKSB7CgkqbHBkdyA9IE1BS0VMT05HKGxvd29yZCwgaGl3b3JkKTsKCXJldCA9IDA7CiAgICB9CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIAkJCQlNSURJX21jaVJlYWRWYXJ5TGVuCQlbaW50ZXJuYWxdCQogKi8Kc3RhdGljIFdPUkQgTUlESV9tY2lSZWFkVmFyeUxlbihXSU5FX01DSU1JREkqIHdtbSwgTFBEV09SRCBscGR3KQp7CiAgICBCWVRFCWJ5dGU7CiAgICBEV09SRAl2YWx1ZSA9IDA7CiAgICBXT1JECXJldCA9IDA7CiAgICAKICAgIGlmIChscGR3ID09IE5VTEwpIHsKCXJldCA9IE1DSUVSUl9JTlZBTElEX0ZJTEU7CiAgICB9IGVsc2UgewoJZG8gewoJICAgIGlmIChNSURJX21jaVJlYWRCeXRlKHdtbSwgJmJ5dGUpICE9IDApIHsKCQlyZXR1cm4gMDsKCSAgICB9CgkgICAgdmFsdWUgPSAodmFsdWUgPDwgNykgKyAoYnl0ZSAmIDB4N0YpOwoJICAgIHJldCsrOyAKCX0gd2hpbGUgKGJ5dGUgJiAweDgwKTsKCSpscGR3ID0gdmFsdWU7CgkvKgoJICBUUkFDRSgidmFsPSUwOGxYIFxuIiwgdmFsdWUpOwoJKi8KICAgIH0KICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lSZWFkTmV4dEV2ZW50CQlbaW50ZXJuYWxdCQogKi8Kc3RhdGljIERXT1JECU1JRElfbWNpUmVhZE5leHRFdmVudChXSU5FX01DSU1JREkqIHdtbSwgTUNJX01JRElUUkFDSyogbW10KSAKewogICAgQllURQliMSwgYjIgPSAwLCBiMzsKICAgIFdPUkQJaHcgPSAwOwogICAgRFdPUkQJZXZ0UHVsc2U7CiAgICBEV09SRAlldnRMZW5ndGg7CiAgICBEV09SRAl0bXA7CiAgICAKICAgIGlmIChtbWlvU2Vlayh3bW0tPmhGaWxlLCBtbXQtPmR3SW5kZXgsIFNFRUtfU0VUKSAhPSBtbXQtPmR3SW5kZXgpIHsKCVdBUk4oIkNhbid0IHNlZWsgYXQgJTA4bFggXG4iLCBtbXQtPmR3SW5kZXgpOwoJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0ZJTEU7CiAgICB9CiAgICBldnRMZW5ndGggPSBNSURJX21jaVJlYWRWYXJ5TGVuKHdtbSwgJmV2dFB1bHNlKSArIDE7CS8qID4gMCAqLwogICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZiMSk7CiAgICBzd2l0Y2ggKGIxKSB7CiAgICBjYXNlIDB4RjA6CiAgICBjYXNlIDB4Rjc6CglldnRMZW5ndGggKz0gTUlESV9tY2lSZWFkVmFyeUxlbih3bW0sICZ0bXApOwoJZXZ0TGVuZ3RoICs9IHRtcDsKCWJyZWFrOwogICAgY2FzZSAweEZGOgoJTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZiMik7CWV2dExlbmd0aCsrOwoJCglldnRMZW5ndGggKz0gTUlESV9tY2lSZWFkVmFyeUxlbih3bW0sICZ0bXApOwoJaWYgKGV2dExlbmd0aCA+PSAweDEwMDAwdSkgewoJICAgIC8qIHRoaXMgbGltaXRhdGlvbiBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtICovCgkgICAgV0FSTigiT3VjaCAhISBJbXBsZW1lbnRhdGlvbiBsaW1pdGF0aW9uIHRvIDY0ayBieXRlcyBmb3IgYSBNSURJIGV2ZW50IGlzIG92ZXJmbG93ZWRcbiIpOwoJICAgIGh3ID0gMHhGRkZGOwoJfSBlbHNlIHsKCSAgICBodyA9IExPV09SRChldnRMZW5ndGgpOwoJfQoJZXZ0TGVuZ3RoICs9IHRtcDsKCWJyZWFrOwogICAgZGVmYXVsdDoKCWlmIChiMSAmIDB4ODApIHsgLyogdXNlIHJ1bm5pbmcgc3RhdHVzID8gKi8KCSAgICBtbXQtPndMYXN0Q29tbWFuZCA9IGIxOwoJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmYjIpOwlldnRMZW5ndGgrKzsKCX0gZWxzZSB7CgkgICAgYjIgPSBiMTsKCSAgICBiMSA9IG1tdC0+d0xhc3RDb21tYW5kOwoJfQoJc3dpdGNoICgoYjEgPj4gNCkgJiAweDA3KSB7CgljYXNlIDA6CWNhc2UgMToJY2FzZSAyOiBjYXNlIDM6IGNhc2UgNjoKCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJmIzKTsJZXZ0TGVuZ3RoKys7CgkgICAgaHcgPSBiMzsKCSAgICBicmVhazsKCWNhc2UgNDoJY2FzZSA1OgoJICAgIGJyZWFrOwoJY2FzZSA3OgoJICAgIFdBUk4oIlN0cmFuZ2UgaW5kZWVkIGIxPTB4JTAyeFxuIiwgYjEpOwoJfQoJYnJlYWs7CiAgICB9CiAgICBpZiAobW10LT5kd0luZGV4ICsgZXZ0TGVuZ3RoID4gbW10LT5kd0xhc3QpCglyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogICAgCiAgICBtbXQtPmR3RXZlbnRQdWxzZSArPSBldnRQdWxzZTsKICAgIG1tdC0+ZHdFdmVudERhdGEgICA9IChodyA8PCAxNikgKyAoYjIgPDwgOCkgKyBiMTsKICAgIG1tdC0+d0V2ZW50TGVuZ3RoICA9IGV2dExlbmd0aDsKICAgIAogICAgLyoKICAgICAgVFJBQ0UoIlsldV0gPT4gcHVsc2U9JTA4bHgoJTA4bHgpLCBkYXRhPSUwOGx4LCBsZW5ndGg9JXVcbiIsIAogICAgICBtbXQtPndUcmFja05yLCBtbXQtPmR3RXZlbnRQdWxzZSwgZXZ0UHVsc2UsIAogICAgICBtbXQtPmR3RXZlbnREYXRhLCBtbXQtPndFdmVudExlbmd0aCk7CiAgICAqLwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lSZWFkTVRyawkJW2ludGVybmFsXQkKICovCnN0YXRpYyBEV09SRCBNSURJX21jaVJlYWRNVHJrKFdJTkVfTUNJTUlESSogd21tLCBNQ0lfTUlESVRSQUNLKiBtbXQpCnsKICAgIERXT1JECQl0b2JlcmVhZDsKICAgIEZPVVJDQwkJZm91cmNjOwogICAgCiAgICBpZiAobW1pb1JlYWQod21tLT5oRmlsZSwgKEhQU1RSKSZmb3VyY2MsIChsb25nKXNpemVvZihGT1VSQ0MpKSAhPSAKCShsb25nKXNpemVvZihGT1VSQ0MpKSB7CglyZXR1cm4gTUNJRVJSX0lOVkFMSURfRklMRTsKICAgIH0KICAgIAogICAgaWYgKGZvdXJjYyAhPSBtbWlvRk9VUkNDKCdNJywgJ1QnLCAncicsICdrJykpIHsKCVdBUk4oIkNhbid0IHN5bmNocm9uaXplIG9uICdNVHJrJyAhXG4iKTsKCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9GSUxFOwogICAgfQogICAgCiAgICBpZiAoTUlESV9tY2lSZWFkTG9uZyh3bW0sICZ0b2JlcmVhZCkgIT0gMCkgewoJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0ZJTEU7CiAgICB9CiAgICBtbXQtPmR3Rmlyc3QgPSBtbWlvU2Vlayh3bW0tPmhGaWxlLCAwLCBTRUVLX0NVUik7IC8qID49IDAgKi8KICAgIG1tdC0+ZHdMYXN0ID0gbW10LT5kd0ZpcnN0ICsgdG9iZXJlYWQ7CiAgICAKICAgIC8qIGNvbXB1dGUgIyBvZiBwdWxzZXMgaW4gdGhpcyB0cmFjayAqLwogICAgbW10LT5kd0luZGV4ID0gbW10LT5kd0ZpcnN0OwogICAgbW10LT5kd0V2ZW50UHVsc2UgPSAwOwogICAgCiAgICB3aGlsZSAoTUlESV9tY2lSZWFkTmV4dEV2ZW50KHdtbSwgbW10KSA9PSAwICYmIAoJICAgTE9XT1JEKG1tdC0+ZHdFdmVudERhdGEpICE9IDB4MkZGRikgewkKCW1tdC0+ZHdJbmRleCArPSBtbXQtPndFdmVudExlbmd0aDsKICAgIH0KICAgIG1tdC0+ZHdMZW5ndGggPSBtbXQtPmR3RXZlbnRQdWxzZTsKICAgIAogICAgVFJBQ0UoIlRyYWNrICV1IGhhcyAlbHUgYnl0ZXMgYW5kICVsdSBwdWxzZXNcbiIsIG1tdC0+d1RyYWNrTnIsIHRvYmVyZWFkLCBtbXQtPmR3TGVuZ3RoKTsKICAgIAogICAgLyogcmVzZXQgdHJhY2sgZGF0YSAqLwogICAgbW10LT53U3RhdHVzID0gMTsJLyogb2ssIHBsYXlpbmcgKi8KICAgIG1tdC0+ZHdJbmRleCA9IG1tdC0+ZHdGaXJzdDsKICAgIG1tdC0+ZHdFdmVudFB1bHNlID0gMDsKICAgIAogICAgaWYgKG1taW9TZWVrKHdtbS0+aEZpbGUsIDAsIFNFRUtfQ1VSKSAhPSBtbXQtPmR3TGFzdCkgewoJV0FSTigiT3VjaCwgb3V0IG9mIHN5bmMgc2Vlaz0lbHUgdHJhY2s9JWx1XG4iLCAKCSAgICAgbW1pb1NlZWsod21tLT5oRmlsZSwgMCwgU0VFS19DVVIpLCBtbXQtPmR3TGFzdCk7CgkvKiBwb3NpdGlvbiBhdCBlbmQgb2YgdGhpcyB0cmFjaywgdG8gYmUgcmVhZHkgdG8gcmVhZCBuZXh0IHRyYWNrICovCgltbWlvU2Vlayh3bW0tPmhGaWxlLCBtbXQtPmR3TGFzdCwgU0VFS19TRVQpOwogICAgfQogICAgCiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVJlYWRNVGhkCQlbaW50ZXJuYWxdCQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpUmVhZE1UaGQoV0lORV9NQ0lNSURJKiB3bW0sIERXT1JEIGR3T2Zmc2V0KQp7CiAgICBEV09SRAl0b2JlcmVhZDsKICAgIEZPVVJDQwlmb3VyY2M7CiAgICBXT1JECW50OwogICAgCiAgICBUUkFDRSgiKCVwLCAlMDhsWCk7XG4iLCB3bW0sIGR3T2Zmc2V0KTsKICAgIAogICAgaWYgKG1taW9TZWVrKHdtbS0+aEZpbGUsIGR3T2Zmc2V0LCBTRUVLX1NFVCkgIT0gZHdPZmZzZXQpIHsKCVdBUk4oIkNhbid0IHNlZWsgYXQgJTA4bFggYmVnaW4gb2YgJ01UaGQnIFxuIiwgZHdPZmZzZXQpOwoJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0ZJTEU7CiAgICB9CiAgICBpZiAobW1pb1JlYWQod21tLT5oRmlsZSwgKEhQU1RSKSZmb3VyY2MsCgkJICAgKGxvbmcpIHNpemVvZihGT1VSQ0MpKSAhPSAobG9uZykgc2l6ZW9mKEZPVVJDQykpCglyZXR1cm4gTUNJRVJSX0lOVkFMSURfRklMRTsKICAgIAogICAgaWYgKGZvdXJjYyAhPSBtbWlvRk9VUkNDKCdNJywgJ1QnLCAnaCcsICdkJykpIHsKCVdBUk4oIkNhbid0IHN5bmNocm9uaXplIG9uICdNVGhkJyAhXG4iKTsKCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9GSUxFOwogICAgfQogICAgCiAgICBpZiAoTUlESV9tY2lSZWFkTG9uZyh3bW0sICZ0b2JlcmVhZCkgIT0gMCB8fCB0b2JlcmVhZCA8IDMgKiBzaXplb2YoV09SRCkpCglyZXR1cm4gTUNJRVJSX0lOVkFMSURfRklMRTsKICAgIAogICAgaWYgKE1JRElfbWNpUmVhZFdvcmQod21tLCAmd21tLT53Rm9ybWF0KSAhPSAwIHx8CglNSURJX21jaVJlYWRXb3JkKHdtbSwgJndtbS0+blRyYWNrcykgIT0gMCB8fAoJTUlESV9tY2lSZWFkV29yZCh3bW0sICZ3bW0tPm5EaXZpc2lvbikgIT0gMCkgewoJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0ZJTEU7CiAgICB9CiAgICAKICAgIFRSQUNFKCJ0b2JlcmVhZD0weCUwOGxYLCB3Rm9ybWF0PTB4JTA0WCBuVHJhY2tzPTB4JTA0WCBuRGl2aXNpb249MHglMDRYXG4iLAoJICB0b2JlcmVhZCwgd21tLT53Rm9ybWF0LCB3bW0tPm5UcmFja3MsIHdtbS0+bkRpdmlzaW9uKTsKICAgIAogICAgLyogTVMgZG9jIHNheXMgdGhhdCB0aGUgTUlESSBNQ0kgdGltZSBmb3JtYXQgbXVzdCBiZSBwdXQgYnkgZGVmYXVsdCB0byB0aGUgZm9ybWF0CiAgICAgKiBzdG9yZWQgaW4gdGhlIE1JREkgZmlsZS4uLgogICAgICovCiAgICBpZiAod21tLT5uRGl2aXNpb24gPiAweDgwMDApIHsKCS8qIGVyaWMucG91ZWNoQGxlbWVsLmZyIDk4LzExCgkgKiBJbiBkaWQgbm90IGNoZWNrIHRoaXMgdmVyeSBjb2RlIChwdWxzZXMgYXJlIGV4cHJlc3NlZCBhcyBTTVBURSBzdWItZnJhbWVzKS4KCSAqIEluIGFib3V0IDQwIE1CIG9mIE1JREkgZmlsZXMgSSBoYXZlLCBub25lIHdhcyBTTVBURSBiYXNlZC4uLgoJICogSSdtIGp1c3Qgd29uZGVyaW5nIGlmIHRoaXMgaXMgd2lkZWx5IHVzZWQgOi0pLiBTbywgaWYgc29tZW9uZSBoYXMgb25lIG9mIAoJICogdGhlc2UgZmlsZXMsIEknZCBsaWtlIHRvIGtub3cgYWJvdXQuCgkgKi8KCUZJWE1FKCJIYW5kbGluZyBTTVBURSB0aW1lIGluIE1JREkgZmlsZXMgaGFzIG5vdCBiZWVuIHRlc3RlZFxuIgoJICAgICAgIlBsZWFzZSByZXBvcnQgdG8gY29tcC5lbXVsYXRvcnMubXMtd2luZG93cy53aW5lIHdpdGggTUlESSBmaWxlICFcbiIpOwoJCglzd2l0Y2ggKEhJQllURSh3bW0tPm5EaXZpc2lvbikpIHsKCWNhc2UgMHhFODoJd21tLT5kd01jaVRpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX1NNUFRFXzI0OwlicmVhazsJLyogLTI0ICovCgljYXNlIDB4RTc6CXdtbS0+ZHdNY2lUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9TTVBURV8yNTsJYnJlYWs7CS8qIC0yNSAqLwoJY2FzZSAweEUzOgl3bW0tPmR3TWNpVGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfU01QVEVfMzBEUk9QOwlicmVhazsJLyogLTI5ICovIC8qIGlzIHRoZSBNQ0kgY29uc3RhbnQgY29ycmVjdCA/ICovCgljYXNlIDB4RTI6CXdtbS0+ZHdNY2lUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9TTVBURV8zMDsJYnJlYWs7CS8qIC0zMCAqLwoJZGVmYXVsdDoKCSAgICBXQVJOKCJVbnN1cHBvcnRlZCBudW1iZXIgb2YgZnJhbWVzICVkXG4iLCAtKGNoYXIpSElCWVRFKHdtbS0+bkRpdmlzaW9uKSk7CgkgICAgcmV0dXJuIE1DSUVSUl9JTlZBTElEX0ZJTEU7Cgl9Cglzd2l0Y2ggKExPQllURSh3bW0tPm5EaXZpc2lvbikpIHsKCWNhc2UgNDoJLyogTUlESSBUaW1lIENvZGUgKi8KCWNhc2UgODoKCWNhc2UgMTA6CgljYXNlIDgwOiAvKiBTTVBURSBiaXQgcmVzb2x1dGlvbiAqLwoJY2FzZSAxMDA6CglkZWZhdWx0OgoJICAgIFdBUk4oIlVuc3VwcG9ydGVkIG51bWJlciBvZiBzdWItZnJhbWVzICVkXG4iLCBMT0JZVEUod21tLT5uRGl2aXNpb24pKTsKCSAgICByZXR1cm4gTUNJRVJSX0lOVkFMSURfRklMRTsKCX0KICAgIH0gZWxzZSBpZiAod21tLT5uRGl2aXNpb24gPT0gMCkgewoJV0FSTigiTnVtYmVyIG9mIGRpdmlzaW9uIGlzIDAsIGNhbid0IHN1cHBvcnQgdGhhdCAhIVxuIik7CglyZXR1cm4gTUNJRVJSX0lOVkFMSURfRklMRTsKICAgIH0gZWxzZSB7Cgl3bW0tPmR3TWNpVGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfTUlMTElTRUNPTkRTOwogICAgfQogICAgCiAgICBzd2l0Y2ggKHdtbS0+d0Zvcm1hdCkgewogICAgY2FzZSAwOgoJaWYgKHdtbS0+blRyYWNrcyAhPSAxKSB7CgkgICAgV0FSTigiR290IHR5cGUgMCBmaWxlIHdob3NlIG51bWJlciBvZiB0cmFjayBpcyBub3QgMS4gU2V0dGluZyBpdCB0byAxXG4iKTsKCSAgICB3bW0tPm5UcmFja3MgPSAxOwoJfQoJYnJlYWs7CiAgICBjYXNlIDE6CiAgICBjYXNlIDI6CglicmVhazsKICAgIGRlZmF1bHQ6CglXQVJOKCJIYW5kbGluZyBNSURJIGZpbGVzIHdoaWNoIGZvcm1hdCA9ICVkIGlzIG5vdCAoeWV0KSBzdXBwb3J0ZWRcbiIKCSAgICAgIlBsZWFzZSByZXBvcnQgd2l0aCBNSURJIGZpbGUgIVxuIiwgd21tLT53Rm9ybWF0KTsKCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9GSUxFOwogICAgfQogICAgCiAgICBpZiAod21tLT5uVHJhY2tzICYgMHg4MDAwKSB7CgkvKiB0aGlzIHNob3VsZG4ndCBiZSBhIHByb2JsZW0uLi4gKi8KCVdBUk4oIk91Y2ggISEgSW1wbGVtZW50YXRpb24gbGltaXRhdGlvbiB0byAzMmsgdHJhY2tzIHBlciBNSURJIGZpbGUgaXMgb3ZlcmZsb3dlZFxuIik7Cgl3bW0tPm5UcmFja3MgPSAweDdGRkY7CiAgICB9CiAgICAKICAgIGlmICgod21tLT50cmFja3MgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKE1DSV9NSURJVFJBQ0spICogd21tLT5uVHJhY2tzKSkgPT0gTlVMTCkgewoJcmV0dXJuIE1DSUVSUl9PVVRfT0ZfTUVNT1JZOwogICAgfQogICAgCiAgICB0b2JlcmVhZCAtPSAzICogc2l6ZW9mKFdPUkQpOyAKICAgIGlmICh0b2JlcmVhZCA+IDApIHsKCVRSQUNFKCJTaXplIG9mIE1UaGQgPiA2LCBza2lwcGluZyAlbGQgZXh0cmEgYnl0ZXNcbiIsIHRvYmVyZWFkKTsKCW1taW9TZWVrKHdtbS0+aEZpbGUsIHRvYmVyZWFkLCBTRUVLX0NVUik7CiAgICB9CiAgICAKICAgIGZvciAobnQgPSAwOyBudCA8IHdtbS0+blRyYWNrczsgbnQrKykgewoJd21tLT50cmFja3NbbnRdLndUcmFja05yID0gbnQ7CglpZiAoTUlESV9tY2lSZWFkTVRyayh3bW0sICZ3bW0tPnRyYWNrc1tudF0pICE9IDApIHsKCSAgICBXQVJOKCJDYW4ndCByZWFkICdNVHJrJyBoZWFkZXIgXG4iKTsKCSAgICByZXR1cm4gTUNJRVJSX0lOVkFMSURfRklMRTsKCX0KICAgIH0KICAgIAogICAgd21tLT5kd1RlbXBvID0gNTAwMDAwOwogICAgCiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCU1JRElfQ29udmVydFB1bHNlVG9NUwkJCVtpbnRlcm5hbF0KICovCnN0YXRpYwlEV09SRAlNSURJX0NvbnZlcnRQdWxzZVRvTVMoV0lORV9NQ0lNSURJKiB3bW0sIERXT1JEIHB1bHNlKQp7CiAgICBEV09SRAlyZXQgPSAwOwogICAgCiAgICAvKiBGSVhNRTogdGhpcyBmdW5jdGlvbiBtYXkgcmV0dXJuIGZhbHNlIHZhbHVlcyBzaW5jZSB0aGUgdGVtcG8gKHdtbS0+ZHdUZW1wbykKICAgICAqIG1heSBjaGFuZ2UgZHVyaW5nIGZpbGUgcGxheWluZwogICAgICovCiAgICBpZiAod21tLT5uRGl2aXNpb24gPT0gMCkgewoJRklYTUUoIlNob3VsZG4ndCBoYXBwZW4uIHdtbS0+bkRpdmlzaW9uID0gMFxuIik7CiAgICB9IGVsc2UgaWYgKHdtbS0+bkRpdmlzaW9uID4gMHg4MDAwKSB7IC8qIFNNUFRFLCB1bmNoZWNrZWQgRklYTUU/ICovCglpbnQJbmYgPSAtKGNoYXIpSElCWVRFKHdtbS0+bkRpdmlzaW9uKTsJLyogbnVtYmVyIG9mIGZyYW1lcyAgICAgKi8KCWludAluc2YgPSBMT0JZVEUod21tLT5uRGl2aXNpb24pOwkJLyogbnVtYmVyIG9mIHN1Yi1mcmFtZXMgKi8KCXJldCA9IChwdWxzZSAqIDEwMDApIC8gKG5mICogbnNmKTsKICAgIH0gZWxzZSB7CglyZXQgPSAoRFdPUkQpKChkb3VibGUpcHVsc2UgKiAoKGRvdWJsZSl3bW0tPmR3VGVtcG8gLyAxMDAwKSAvCQoJCSAgICAgIChkb3VibGUpd21tLT5uRGl2aXNpb24pOwogICAgfQogICAgCiAgICAvKgogICAgICBUUkFDRSgicHVsc2U9JWx1IHRlbXBvPSVsdSBkaXZpc2lvbj0ldT0weCUwNHggPT4gbXM9JWx1XG4iLCAKICAgICAgcHVsc2UsIHdtbS0+ZHdUZW1wbywgd21tLT5uRGl2aXNpb24sIHdtbS0+bkRpdmlzaW9uLCByZXQpOwogICAgKi8KICAgIAogICAgcmV0dXJuIHJldDsKfQoKI2RlZmluZSBUSU1FX01TX0lOX09ORV9IT1VSCSg2MCo2MCoxMDAwKQojZGVmaW5lIFRJTUVfTVNfSU5fT05FX01JTlVURQkoNjAqMTAwMCkKI2RlZmluZSBUSU1FX01TX0lOX09ORV9TRUNPTkQJKDEwMDApCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJTUlESV9Db252ZXJ0VGltZUZvcm1hdFRvTVMJCVtpbnRlcm5hbF0KICovCnN0YXRpYwlEV09SRAlNSURJX0NvbnZlcnRUaW1lRm9ybWF0VG9NUyhXSU5FX01DSU1JREkqIHdtbSwgRFdPUkQgdmFsKQp7CiAgICBEV09SRAlyZXQgPSAwOwogICAgCiAgICBzd2l0Y2ggKHdtbS0+ZHdNY2lUaW1lRm9ybWF0KSB7CiAgICBjYXNlIE1DSV9GT1JNQVRfTUlMTElTRUNPTkRTOgkKCXJldCA9IHZhbDsJCQoJYnJlYWs7CiAgICBjYXNlIE1DSV9GT1JNQVRfU01QVEVfMjQ6CglyZXQgPSAKCSAgICAoSElCWVRFKEhJV09SRCh2YWwpKSAqIDEyNSkgLyAzICsgICAgICAgICAgICAgTE9CWVRFKEhJV09SRCh2YWwpKSAqIFRJTUVfTVNfSU5fT05FX1NFQ09ORCArCgkgICAgSElCWVRFKExPV09SRCh2YWwpKSAqIFRJTUVfTVNfSU5fT05FX01JTlVURSArIExPQllURShMT1dPUkQodmFsKSkgKiBUSU1FX01TX0lOX09ORV9IT1VSOwoJYnJlYWs7CiAgICBjYXNlIE1DSV9GT1JNQVRfU01QVEVfMjU6CQkKCXJldCA9IAoJICAgIEhJQllURShISVdPUkQodmFsKSkgKiA0MCArIAkJICAJICBMT0JZVEUoSElXT1JEKHZhbCkpICogVElNRV9NU19JTl9PTkVfU0VDT05EICsKCSAgICBISUJZVEUoTE9XT1JEKHZhbCkpICogVElNRV9NU19JTl9PTkVfTUlOVVRFICsgTE9CWVRFKExPV09SRCh2YWwpKSAqIFRJTUVfTVNfSU5fT05FX0hPVVI7CglicmVhazsKICAgIGNhc2UgTUNJX0ZPUk1BVF9TTVBURV8zMDoJCQoJcmV0ID0gCgkgICAgKEhJQllURShISVdPUkQodmFsKSkgKiAxMDApIC8gMyArIAkJICBMT0JZVEUoSElXT1JEKHZhbCkpICogVElNRV9NU19JTl9PTkVfU0VDT05EICsKCSAgICBISUJZVEUoTE9XT1JEKHZhbCkpICogVElNRV9NU19JTl9PTkVfTUlOVVRFICsgTE9CWVRFKExPV09SRCh2YWwpKSAqIFRJTUVfTVNfSU5fT05FX0hPVVI7CglicmVhazsKICAgIGRlZmF1bHQ6CglXQVJOKCJCYWQgdGltZSBmb3JtYXQgJWx1IVxuIiwgd21tLT5kd01jaVRpbWVGb3JtYXQpOwogICAgfQogICAgLyoKICAgICAgVFJBQ0UoInZhbD0lbHU9MHglMDhseCBbdGY9JWx1XSA9PiByZXQ9JWx1XG4iLCB2YWwsIHZhbCwgd21tLT5kd01jaVRpbWVGb3JtYXQsIHJldCk7CiAgICAqLwogICAgcmV0dXJuIHJldDsKfQkKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQlNSURJX0NvbnZlcnRNU1RvVGltZUZvcm1hdAkJW2ludGVybmFsXQogKi8Kc3RhdGljCURXT1JECU1JRElfQ29udmVydE1TVG9UaW1lRm9ybWF0KFdJTkVfTUNJTUlESSogd21tLCBEV09SRCBfdmFsKQp7CiAgICBEV09SRAlyZXQgPSAwLCB2YWwgPSBfdmFsOwogICAgRFdPUkQJaCwgbSwgcywgZjsKICAgIAogICAgc3dpdGNoICh3bW0tPmR3TWNpVGltZUZvcm1hdCkgewogICAgY2FzZSBNQ0lfRk9STUFUX01JTExJU0VDT05EUzoJCglyZXQgPSB2YWw7CQkKCWJyZWFrOwogICAgY2FzZSBNQ0lfRk9STUFUX1NNUFRFXzI0OgogICAgY2FzZSBNQ0lfRk9STUFUX1NNUFRFXzI1OgkJCiAgICBjYXNlIE1DSV9GT1JNQVRfU01QVEVfMzA6CQkKCWggPSB2YWwgLyBUSU1FX01TX0lOX09ORV9IT1VSOwkKCW0gPSAodmFsIC09IGggKiBUSU1FX01TX0lOX09ORV9IT1VSKSAgIC8gVElNRV9NU19JTl9PTkVfTUlOVVRFOwkKCXMgPSAodmFsIC09IG0gKiBUSU1FX01TX0lOX09ORV9NSU5VVEUpIC8gVElNRV9NU19JTl9PTkVfU0VDT05EOwoJc3dpdGNoICh3bW0tPmR3TWNpVGltZUZvcm1hdCkgewoJY2FzZSBNQ0lfRk9STUFUX1NNUFRFXzI0OgoJICAgIC8qIG9uZSBmcmFtZSBpcyAxMDAwLzI0IHZhbCBsb25nLCAxMDAwLzI0ID09IDEyNS8zICovCgkgICAgZiA9ICh2YWwgKiAzKSAvIDEyNTsgCXZhbCAtPSAoZiAqIDEyNSkgLyAzOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfRk9STUFUX1NNUFRFXzI1OgkJCgkgICAgLyogb25lIGZyYW1lIGlzIDEwMDAvMjUgbXMgbG9uZywgMTAwMC8yNSA9PSA0MCAqLwoJICAgIGYgPSB2YWwgLyA0MDsgCQl2YWwgLT0gZiAqIDQwOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfRk9STUFUX1NNUFRFXzMwOgkJCgkgICAgLyogb25lIGZyYW1lIGlzIDEwMDAvMzAgbXMgbG9uZywgMTAwMC8zMCA9PSAxMDAvMyAqLwoJICAgIGYgPSAodmFsICogMykgLyAxMDA7IAl2YWwgLT0gKGYgKiAxMDApIC8gMzsKCSAgICBicmVhazsKCWRlZmF1bHQ6CgkgICAgRklYTUUoIlRoZXJlIG11c3QgYmUgc29tZSBiYWQgYmFkIHByb2dyYW1tZXJcbiIpOwoJICAgIGYgPSAwOwoJfQoJLyogdmFsIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgbXMgd2hpY2ggY2Fubm90IG1ha2UgYSBjb21wbGV0ZSBmcmFtZSAqLwoJLyogRklYTUU6IGlzIHRoaXMgY29ycmVjdCA/IHByb2dyYW1zIHNlZW0gdG8gYmUgaGFwcHkgd2l0aCB0aGF0ICovCglyZXQgPSAoZiA8PCAyNCkgfCAocyA8PCAxNikgfCAobSA8PCA4KSB8IChoIDw8IDApOwoJYnJlYWs7CiAgICBkZWZhdWx0OgoJV0FSTigiQmFkIHRpbWUgZm9ybWF0ICVsdSFcbiIsIHdtbS0+ZHdNY2lUaW1lRm9ybWF0KTsKICAgIH0KICAgIC8qCiAgICAgIFRSQUNFKCJ2YWw9JWx1IFt0Zj0lbHVdID0+IHJldD0lbHU9MHglMDhseFxuIiwgX3ZhbCwgd21tLT5kd01jaVRpbWVGb3JtYXQsIHJldCwgcmV0KTsKICAgICovCiAgICByZXR1cm4gcmV0Owp9CQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCU1JRElfR2V0TVRoZExlbmd0aE1TCQkJW2ludGVybmFsXQogKi8Kc3RhdGljCURXT1JECU1JRElfR2V0TVRoZExlbmd0aE1TKFdJTkVfTUNJTUlESSogd21tKQp7CiAgICBXT1JECW50OwogICAgRFdPUkQJcmV0ID0gMDsKICAgIAogICAgZm9yIChudCA9IDA7IG50IDwgd21tLT5uVHJhY2tzOyBudCsrKSB7CglpZiAod21tLT53Rm9ybWF0ID09IDIpIHsKCSAgICByZXQgKz0gd21tLT50cmFja3NbbnRdLmR3TGVuZ3RoOwoJfSBlbHNlIGlmICh3bW0tPnRyYWNrc1tudF0uZHdMZW5ndGggPiByZXQpIHsKCSAgICByZXQgPSB3bW0tPnRyYWNrc1tudF0uZHdMZW5ndGg7Cgl9CiAgICB9CiAgICAvKiBGSVhNRTogdGhpcyBpcyB3cm9uZyBpZiB0aGVyZSBpcyBhIHRlbXBvIGNoYW5nZSBpbnNpZGUgdGhlIGZpbGUgKi8KICAgIHJldHVybiBNSURJX0NvbnZlcnRQdWxzZVRvTVMod21tLCByZXQpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpT3BlbgkJCVtpbnRlcm5hbF0JCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lPcGVuKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9PUEVOX1BBUk1TQSBscFBhcm1zKQp7CiAgICBEV09SRAkJZHdSZXQgPSAwOwogICAgRFdPUkQJCWR3RGV2aWNlSUQ7CiAgICBXSU5FX01DSU1JREkqCXdtbSA9IChXSU5FX01DSU1JREkqKW1jaUdldERyaXZlckRhdGEod0RldklEKTsKICAgIAogICAgVFJBQ0UoIiglMDR4LCAlMDhsWCwgJXApXG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogICAgCiAgICBpZiAobHBQYXJtcyA9PSBOVUxMKSAJcmV0dXJuIE1DSUVSUl9OVUxMX1BBUkFNRVRFUl9CTE9DSzsKICAgIGlmICh3bW0gPT0gTlVMTCkJCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfSUQ7CiAgICBpZiAoZHdGbGFncyAmIE1DSV9PUEVOX1NIQVJFQUJMRSkKCXJldHVybiBNQ0lFUlJfSEFSRFdBUkU7CgogICAgaWYgKHdtbS0+blVzZUNvdW50ID4gMCkgewoJLyogVGhlIGRyaXZlciBpcyBhbHJlYWR5IG9wZW5lZCBvbiB0aGlzIGNoYW5uZWwKCSAqIE1JREkgc2VxdWVuY2VyIGNhbm5vdCBiZSBzaGFyZWQKCSAqLwoJcmV0dXJuIE1DSUVSUl9ERVZJQ0VfT1BFTjsKICAgIH0KICAgIHdtbS0+blVzZUNvdW50Kys7CiAgICAKICAgIHdtbS0+aEZpbGUgPSAwOwogICAgd21tLT5oTWlkaSA9IDA7CiAgICBkd0RldmljZUlEID0gbHBQYXJtcy0+d0RldmljZUlEOwogICAgCiAgICBUUkFDRSgid0RldklEPSUwNFggKGxwUGFyYW1zLT53RGV2aWNlSUQ9JTA4bFgpXG4iLCB3RGV2SUQsIGR3RGV2aWNlSUQpOwogICAgLyoJbHBQYXJtcy0+d0RldmljZUlEID0gd0RldklEOyovCiAgICAKICAgIGlmIChkd0ZsYWdzICYgTUNJX09QRU5fRUxFTUVOVCkgewoJTFBTVFIJCWxwc3RyRWxlbWVudE5hbWU7CgkKCWxwc3RyRWxlbWVudE5hbWUgPSBscFBhcm1zLT5scHN0ckVsZW1lbnROYW1lOwoJCglUUkFDRSgiTUNJX09QRU5fRUxFTUVOVCAnJXMnICFcbiIsIGxwc3RyRWxlbWVudE5hbWUpOwoJaWYgKGxwc3RyRWxlbWVudE5hbWUgJiYgc3RybGVuKGxwc3RyRWxlbWVudE5hbWUpID4gMCkgewoJICAgIHdtbS0+aEZpbGUgPSBtbWlvT3BlbkEobHBzdHJFbGVtZW50TmFtZSwgTlVMTCwgCgkJCQkgICBNTUlPX0FMTE9DQlVGIHwgTU1JT19SRUFEIHwgTU1JT19ERU5ZV1JJVEUpOwoJICAgIGlmICh3bW0tPmhGaWxlID09IDApIHsKCQlXQVJOKCJDYW4ndCBmaW5kIGZpbGUgJyVzJyAhXG4iLCBscHN0ckVsZW1lbnROYW1lKTsKCQl3bW0tPm5Vc2VDb3VudC0tOwoJCXJldHVybiBNQ0lFUlJfRklMRV9OT1RfRk9VTkQ7CgkgICAgfQoJfSBlbHNlIHsKCSAgICB3bW0tPmhGaWxlID0gMDsKCX0KICAgIH0KICAgIFRSQUNFKCJoRmlsZT0ldVxuIiwgd21tLT5oRmlsZSk7CiAgICAKICAgIC8qIEZJWE1FOiBzaG91bGQgSSBnZXQgYSBzdHJkdXAoKSBvZiBpdCBpbnN0ZWFkPyAqLwogICAgd21tLT5scHN0ckVsZW1lbnROYW1lID0gbHBQYXJtcy0+bHBzdHJFbGVtZW50TmFtZTsKICAgIAogICAgd21tLT53Tm90aWZ5RGV2aWNlSUQgPSBkd0RldmljZUlEOwogICAgd21tLT5kd1N0YXR1cyA9IE1DSV9NT0RFX05PVF9SRUFEWTsJLyogd2hpbGUgbG9hZGluZyBmaWxlIGNvbnRlbnRzICovCiAgICAvKiBzcGVjIHNheXMgaXQgc2hvdWxkIGJlIHRoZSBkZWZhdWx0IGZvcm1hdCBmcm9tIHRoZSBNSURJIGZpbGUuLi4gKi8KICAgIHdtbS0+ZHdNY2lUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM7CiAgICAKICAgIGlmICh3bW0tPmhGaWxlICE9IDApIHsKCU1NQ0tJTkZPCWNrTWFpblJJRkY7CglNTUNLSU5GTwltbWNrSW5mbzsKCURXT1JECQlkd09mZnNldCA9IDA7CgkKCWlmIChtbWlvRGVzY2VuZCh3bW0tPmhGaWxlLCAmY2tNYWluUklGRiwgTlVMTCwgMCkgIT0gMCkgewoJICAgIGR3UmV0ID0gTUNJRVJSX0lOVkFMSURfRklMRTsKCX0gZWxzZSB7CgkgICAgVFJBQ0UoIlBhcmVudENodW5rIGNraWQ9JS40cyBmY2NUeXBlPSUuNHMgY2tzaXplPSUwOGxYIFxuIiwKCQkgIChMUFNUUikmY2tNYWluUklGRi5ja2lkLCAoTFBTVFIpJmNrTWFpblJJRkYuZmNjVHlwZSwgY2tNYWluUklGRi5ja3NpemUpOwoJICAgIAoJICAgIGlmIChja01haW5SSUZGLmNraWQgPT0gRk9VUkNDX1JJRkYgJiYgY2tNYWluUklGRi5mY2NUeXBlID09IG1taW9GT1VSQ0MoJ1InLCAnTScsICdJJywgJ0QnKSkgewoJCW1tY2tJbmZvLmNraWQgPSBtbWlvRk9VUkNDKCdkJywgJ2EnLCAndCcsICdhJyk7CgkJbW1pb1NlZWsod21tLT5oRmlsZSwgY2tNYWluUklGRi5kd0RhdGFPZmZzZXQgKyAoKGNrTWFpblJJRkYuY2tzaXplICsgMSkgJiB+MSksIFNFRUtfU0VUKTsKCQlpZiAobW1pb0Rlc2NlbmQod21tLT5oRmlsZSwgJm1tY2tJbmZvLCAmY2tNYWluUklGRiwgTU1JT19GSU5EQ0hVTkspID09IDApIHsKCQkgICAgVFJBQ0UoIi4uLiBpcyBhICdSTUlEJyBmaWxlIFxuIik7CgkJICAgIGR3T2Zmc2V0ID0gbW1ja0luZm8uZHdEYXRhT2Zmc2V0OwoJCX0gZWxzZSB7CgkJICAgIGR3UmV0ID0gTUNJRVJSX0lOVkFMSURfRklMRTsKCQl9CgkgICAgfQoJICAgIGlmIChkd1JldCA9PSAwICYmIE1JRElfbWNpUmVhZE1UaGQod21tLCBkd09mZnNldCkgIT0gMCkgewoJCVdBUk4oIkNhbid0IHJlYWQgJ01UaGQnIGhlYWRlciBcbiIpOwoJCWR3UmV0ID0gTUNJRVJSX0lOVkFMSURfRklMRTsKCSAgICB9Cgl9CiAgICB9IGVsc2UgewoJVFJBQ0UoImhGaWxlPT0wLCBzZXR0aW5nICN0cmFja3MgdG8gMDsgaXMgdGhpcyBjb3JyZWN0ID9cbiIpOwoJd21tLT5uVHJhY2tzID0gMDsKCXdtbS0+d0Zvcm1hdCA9IDA7Cgl3bW0tPm5EaXZpc2lvbiA9IDE7CiAgICB9CiAgICBpZiAoZHdSZXQgIT0gMCkgewoJd21tLT5uVXNlQ291bnQtLTsKCWlmICh3bW0tPmhGaWxlICE9IDApCgkgICAgbW1pb0Nsb3NlKHdtbS0+aEZpbGUsIDApOwoJd21tLT5oRmlsZSA9IDA7CiAgICB9IGVsc2UgewoJd21tLT5kd1Bvc2l0aW9uTVMgPSAwOwoJd21tLT5kd1N0YXR1cyA9IE1DSV9NT0RFX1NUT1A7CiAgICB9CiAgICByZXR1cm4gZHdSZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lTdG9wCQkJW2ludGVybmFsXQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpU3RvcChVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQp7ICAgIAogICAgV0lORV9NQ0lNSURJKgl3bW0gPSBNSURJX21jaUdldE9wZW5EZXYod0RldklEKTsKICAgIAogICAgVFJBQ0UoIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKICAgIAogICAgaWYgKHdtbSA9PSBOVUxMKQlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwogICAgCiAgICBpZiAod21tLT5kd1N0YXR1cyAhPSBNQ0lfTU9ERV9TVE9QKSB7Cgl3bW0tPmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKCW1pZGlPdXRDbG9zZSh3bW0tPmhNaWRpKTsKICAgIH0KICAgIFRSQUNFKCJ3bW0tPmR3U3RhdHVzPSVkXG4iLCB3bW0tPmR3U3RhdHVzKTsgICAgCgogICAgaWYgKGxwUGFybXMgJiYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSkgewoJVFJBQ0UoIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKCW1jaURyaXZlck5vdGlmeSgoSFdORClMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAoJCQl3bW0tPndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKICAgIH0KICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpQ2xvc2UJCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lDbG9zZShVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQp7CiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfbWNpR2V0T3BlbkRldih3RGV2SUQpOwogICAgCiAgICBUUkFDRSgiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogICAgCiAgICBpZiAod21tID09IE5VTEwpCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfSUQ7CiAgICAKICAgIGlmICh3bW0tPmR3U3RhdHVzICE9IE1DSV9NT0RFX1NUT1ApIHsKCU1JRElfbWNpU3RvcCh3RGV2SUQsIE1DSV9XQUlULCBscFBhcm1zKTsKICAgIH0KICAgIAogICAgd21tLT5kd1N0YXR1cyA9IE1DSV9NT0RFX1NUT1A7CiAgICB3bW0tPm5Vc2VDb3VudC0tOwogICAgaWYgKHdtbS0+blVzZUNvdW50ID09IDApIHsKCWlmICh3bW0tPmhGaWxlICE9IDApIHsKCSAgICBtbWlvQ2xvc2Uod21tLT5oRmlsZSwgMCk7CgkgICAgd21tLT5oRmlsZSA9IDA7CgkgICAgVFJBQ0UoImhGaWxlIGNsb3NlZCAhXG4iKTsKCX0KCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHdtbS0+dHJhY2tzKTsKICAgIH0gZWxzZSB7CglUUkFDRSgiU2hvdWxkbid0IGhhcHBlbi4uLiBuVXNlQ291bnQ9JWRcbiIsIHdtbS0+blVzZUNvdW50KTsKCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAgICB9CiAgICAKICAgIGlmIChscFBhcm1zICYmIChkd0ZsYWdzICYgTUNJX05PVElGWSkpIHsKCVRSQUNFKCJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CgltY2lEcml2ZXJOb3RpZnkoKEhXTkQpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKCQkJd21tLT53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaUZpbmROZXh0RXZlbnQJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBNQ0lfTUlESVRSQUNLKglNSURJX21jaUZpbmROZXh0RXZlbnQoV0lORV9NQ0lNSURJKiB3bW0sIExQRFdPUkQgaGlQdWxzZSkgCnsKICAgIFdPUkQJCWNudCwgbnQ7CiAgICBNQ0lfTUlESVRSQUNLKgltbXQ7CiAgICAKICAgICpoaVB1bHNlID0gMHhGRkZGRkZGRnVsOwogICAgY250ID0gMHhGRkZGdTsKICAgIGZvciAobnQgPSAwOyBudCA8IHdtbS0+blRyYWNrczsgbnQrKykgewoJbW10ID0gJndtbS0+dHJhY2tzW250XTsKCQoJaWYgKG1tdC0+d1N0YXR1cyA9PSAwKQoJICAgIGNvbnRpbnVlOwoJaWYgKG1tdC0+ZHdFdmVudFB1bHNlIDwgKmhpUHVsc2UpIHsKCSAgICAqaGlQdWxzZSA9IG1tdC0+ZHdFdmVudFB1bHNlOwoJICAgIGNudCA9IG50OwoJfQogICAgfQogICAgcmV0dXJuIChjbnQgPT0gMHhGRkZGdSkgPyAwIC8qIG5vIG1vcmUgZXZlbnQgb24gYWxsIHRyYWNrcyAqLwoJOiAmd21tLT50cmFja3NbY250XTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVBsYXkJCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lQbGF5KFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9QTEFZX1BBUk1TIGxwUGFybXMpCnsKICAgIERXT1JECQlkd1N0YXJ0TVMsIGR3RW5kTVMsIGR3UmV0OwogICAgV09SRAkJZG9QbGF5LCBudDsKICAgIE1DSV9NSURJVFJBQ0sqCW1tdDsKICAgIERXT1JECQloaVB1bHNlOwogICAgV0lORV9NQ0lNSURJKgl3bW0gPSBNSURJX21jaUdldE9wZW5EZXYod0RldklEKTsKICAgIAogICAgVFJBQ0UoIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKICAgIAogICAgaWYgKHdtbSA9PSBOVUxMKQlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwogICAgCiAgICBpZiAod21tLT5oRmlsZSA9PSAwKSB7CglXQVJOKCJDYW4ndCBwbGF5OiBubyBmaWxlICclcycgIVxuIiwgd21tLT5scHN0ckVsZW1lbnROYW1lKTsKCXJldHVybiBNQ0lFUlJfRklMRV9OT1RfRk9VTkQ7CiAgICB9CiAgICAKICAgIGlmICh3bW0tPmR3U3RhdHVzICE9IE1DSV9NT0RFX1NUT1ApIHsKCWlmICh3bW0tPmR3U3RhdHVzID09IE1DSV9NT0RFX1BBVVNFKSB7CgkgICAgLyogRklYTUU6IHBhcmFtZXRlcnMgKHN0YXJ0L2VuZCkgaW4gbHBQYXJhbXMgbWF5IG5vdCBiZSB1c2VkICovCgkgICAgcmV0dXJuIE1JRElfbWNpUmVzdW1lKHdEZXZJRCwgZHdGbGFncywgKExQTUNJX0dFTkVSSUNfUEFSTVMpbHBQYXJtcyk7Cgl9CglXQVJOKCJDYW4ndCBwbGF5OiBkZXZpY2UgaXMgbm90IHN0b3BwZWQgIVxuIik7CglyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogICAgfQogICAgCiAgICBpZiAoIShkd0ZsYWdzICYgTUNJX1dBSVQpKSB7CQoJLyoqIEZJWE1FOiBJJ20gbm90IDEwMCUgc3VyZSB0aGF0IHdOb3RpZnlEZXZpY2VJRCBpcyB0aGUgcmlnaHQgdmFsdWUgaW4gYWxsIGNhc2VzID8/PyAqLwoJcmV0dXJuIE1DSV9TZW5kQ29tbWFuZEFzeW5jKHdtbS0+d05vdGlmeURldmljZUlELCBNQ0lfUExBWSwgZHdGbGFncywgKERXT1JEKWxwUGFybXMsIHNpemVvZihMUE1DSV9QTEFZX1BBUk1TKSk7CiAgICB9CiAgICAKICAgIGlmIChscFBhcm1zICYmIChkd0ZsYWdzICYgTUNJX0ZST00pKSB7Cglkd1N0YXJ0TVMgPSBNSURJX0NvbnZlcnRUaW1lRm9ybWF0VG9NUyh3bW0sIGxwUGFybXMtPmR3RnJvbSk7IAogICAgfSBlbHNlIHsKCWR3U3RhcnRNUyA9IHdtbS0+ZHdQb3NpdGlvbk1TOwogICAgfQogICAgCiAgICBpZiAobHBQYXJtcyAmJiAoZHdGbGFncyAmIE1DSV9UTykpIHsKCWR3RW5kTVMgPSBNSURJX0NvbnZlcnRUaW1lRm9ybWF0VG9NUyh3bW0sIGxwUGFybXMtPmR3VG8pOwogICAgfSBlbHNlIHsKCWR3RW5kTVMgPSAweEZGRkZGRkZGdWw7CiAgICB9CiAgICAKICAgIFRSQUNFKCJQbGF5aW5nIGZyb20gJWx1IHRvICVsdVxuIiwgZHdTdGFydE1TLCBkd0VuZE1TKTsKICAgIAogICAgLyogaW5pdCB0cmFja3MgKi8KICAgIGZvciAobnQgPSAwOyBudCA8IHdtbS0+blRyYWNrczsgbnQrKykgewoJbW10ID0gJndtbS0+dHJhY2tzW250XTsKCQoJbW10LT53U3RhdHVzID0gMTsJLyogb2ssIHBsYXlpbmcgKi8KCW1tdC0+ZHdJbmRleCA9IG1tdC0+ZHdGaXJzdDsKCWlmICh3bW0tPndGb3JtYXQgPT0gMiAmJiBudCA+IDApIHsKCSAgICBtbXQtPmR3RXZlbnRQdWxzZSA9IHdtbS0+dHJhY2tzW250IC0gMV0uZHdMZW5ndGg7Cgl9IGVsc2UgewoJICAgIG1tdC0+ZHdFdmVudFB1bHNlID0gMDsKCX0KCU1JRElfbWNpUmVhZE5leHRFdmVudCh3bW0sIG1tdCk7IC8qIEZJWE1FID09IDAgKi8KICAgIH0KICAgIAogICAgd21tLT5kd1B1bHNlID0gMDsKICAgIHdtbS0+ZHdUZW1wbyA9IDUwMDAwMDsKICAgIHdtbS0+ZHdTdGF0dXMgPSBNQ0lfTU9ERV9QTEFZOwogICAgd21tLT5kd1Bvc2l0aW9uTVMgPSAwOwogICAgd21tLT53U3RhcnRlZFBsYXlpbmcgPSBGQUxTRTsKICAgIAogICAgZHdSZXQgPSBtaWRpT3V0T3Blbigmd21tLT5oTWlkaSwgMCwgMEwsIDBMLCBDQUxMQkFDS19OVUxMKTsKICAgIC8qCWR3UmV0ID0gbWlkaUluT3Blbigmd21tLT5oTWlkaSwgMCwgMEwsIDBMLCBDQUxMQkFDS19OVUxMKTsqLwoKICAgIHdoaWxlICh3bW0tPmR3U3RhdHVzICE9IE1DSV9NT0RFX1NUT1ApIHsKCS8qIGl0IHNlZW1zIHRoYXQgaW4gY2FzZSBvZiBtdWx0aS10aHJlYWRpbmcsIGdjYyBpcyBvcHRpbWl6aW5nIGp1c3QgYSBsaXR0bGUgYml0IAoJICogdG9vIG11Y2guIFRlbGwgZ2NjIG5vdCB0byBvcHRpbWl6ZSBzdGF0dXMgdmFsdWUgdXNpbmcgdm9sYXRpbGUuIAoJICovCgl3aGlsZSAoKCh2b2xhdGlsZSBXSU5FX01DSU1JREkqKXdtbSktPmR3U3RhdHVzID09IE1DSV9NT0RFX1BBVVNFKTsKCQoJZG9QbGF5ID0gKHdtbS0+ZHdQb3NpdGlvbk1TID49IGR3U3RhcnRNUyAmJiB3bW0tPmR3UG9zaXRpb25NUyA8PSBkd0VuZE1TKTsKCQoJVFJBQ0UoIndtbS0+ZHdTdGF0dXM9JWQsIGRvUGxheT0lc1xuIiwgd21tLT5kd1N0YXR1cywgZG9QbGF5ID8gIlQiIDogIkYiKTsKCQoJaWYgKChtbXQgPSBNSURJX21jaUZpbmROZXh0RXZlbnQod21tLCAmaGlQdWxzZSkpID09IE5VTEwpCgkgICAgYnJlYWs7ICAvKiBubyBtb3JlIGV2ZW50IG9uIHRyYWNrcyAqLwoJCgkvKiBpZiBzdGFydGluZyBwbGF5aW5nLCB0aGVuIHNldCBTdGFydFRpY2tzIHRvIHRoZSB2YWx1ZSBpdCB3b3VsZCBoYXZlIGhhZAoJICogaWYgcGxheSBoYWQgc3RhcnRlZCBhdCBwb3NpdGlvbiAwCgkgKi8KCWlmIChkb1BsYXkgJiYgIXdtbS0+d1N0YXJ0ZWRQbGF5aW5nKSB7CgkgICAgd21tLT5kd1N0YXJ0VGlja3MgPSBHZXRUaWNrQ291bnQoKSAtIE1JRElfQ29udmVydFB1bHNlVG9NUyh3bW0sIHdtbS0+ZHdQdWxzZSk7CgkgICAgd21tLT53U3RhcnRlZFBsYXlpbmcgPSBUUlVFOwoJICAgIFRSQUNFKCJTZXR0aW5nIGR3U3RhcnRUaWNrcyB0byAlbHVcbiIsIHdtbS0+ZHdTdGFydFRpY2tzKTsKCX0KCQoJaWYgKGhpUHVsc2UgPiB3bW0tPmR3UHVsc2UpIHsKCSAgICB3bW0tPmR3UG9zaXRpb25NUyArPSBNSURJX0NvbnZlcnRQdWxzZVRvTVMod21tLCBoaVB1bHNlIC0gd21tLT5kd1B1bHNlKTsKCSAgICBpZiAoZG9QbGF5KSB7CgkJRFdPUkQJdG9nbyA9IHdtbS0+ZHdTdGFydFRpY2tzICsgd21tLT5kd1Bvc2l0aW9uTVM7CgkJRFdPUkQJdGMgPSBHZXRUaWNrQ291bnQoKTsKCQkKCQlUUkFDRSgiUHVsc2VzIGhpPTB4JTA4bHggPD4gY3VyPTB4JTA4bHhcbiIsIGhpUHVsc2UsIHdtbS0+ZHdQdWxzZSk7CgkJVFJBQ0UoIldhaXQgdW50aWwgJWx1ID0+ICVsdSBtc1xuIiwgCQoJCSAgICAgIHRjIC0gd21tLT5kd1N0YXJ0VGlja3MsIHRvZ28gLSB3bW0tPmR3U3RhcnRUaWNrcyk7CgkJaWYgKHRjIDwgdG9nbykJCgkJICAgIFNsZWVwKHRvZ28gLSB0Yyk7CgkgICAgfQoJICAgIHdtbS0+ZHdQdWxzZSA9IGhpUHVsc2U7Cgl9CgkKCXN3aXRjaCAoTE9CWVRFKExPV09SRChtbXQtPmR3RXZlbnREYXRhKSkpIHsKCWNhc2UgMHhGMDoKCWNhc2UgMHhGNzoJLyogc3lzZXggZXZlbnRzICovCgkgICAgewoJCUZJWE1FKCJOb3QgaGFuZGxpbmcgU3lzRXggZXZlbnRzICh5ZXQpXG4iKTsKCSAgICB9CgkgICAgYnJlYWs7CgljYXNlIDB4RkY6CgkgICAgLyogcG9zaXRpb24gYWZ0ZXIgbWV0YSBkYXRhIGhlYWRlciAqLwoJICAgIG1taW9TZWVrKHdtbS0+aEZpbGUsIG1tdC0+ZHdJbmRleCArIEhJV09SRChtbXQtPmR3RXZlbnREYXRhKSwgU0VFS19TRVQpOwoJICAgIHN3aXRjaCAoSElCWVRFKExPV09SRChtbXQtPmR3RXZlbnREYXRhKSkpIHsKCSAgICBjYXNlIDB4MDA6IC8qIDE2LWJpdCBzZXF1ZW5jZSBudW1iZXIgKi8KCQlpZiAoVFJBQ0VfT04obWNpbWlkaSkpIHsKCQkgICAgV09SRAl0d2Q7CgkJICAgIAoJCSAgICBNSURJX21jaVJlYWRXb3JkKHdtbSwgJnR3ZCk7CS8qID09IDAgKi8KCQkgICAgVFJBQ0UoIkdvdCBzZXF1ZW5jZSBudW1iZXIgJXVcbiIsIHR3ZCk7CgkJfQoJCWJyZWFrOwoJICAgIGNhc2UgMHgwMTogLyogYW55IHRleHQgKi8KCSAgICBjYXNlIDB4MDI6IC8qIENvcHlyaWdodCBNZXNzYWdlIHRleHQgKi8KCSAgICBjYXNlIDB4MDM6IC8qIFNlcXVlbmNlL1RyYWNrIE5hbWUgdGV4dCAqLwoJICAgIGNhc2UgMHgwNDogLyogSW5zdHJ1bWVudCBOYW1lIHRleHQgKi8KCSAgICBjYXNlIDB4MDU6IC8qIEx5cmljIHRleHQgKi8KCSAgICBjYXNlIDB4MDY6IC8qIE1hcmtlciB0ZXh0ICovCgkgICAgY2FzZSAweDA3OiAvKiBDdWUtcG9pbnQgdGV4dCAqLwoJCWlmIChUUkFDRV9PTihtY2ltaWRpKSkgewoJCSAgICBjaGFyCWJ1ZlsxMDI0XTsKCQkgICAgV09SRAlsZW4gPSBtbXQtPndFdmVudExlbmd0aCAtIEhJV09SRChtbXQtPmR3RXZlbnREYXRhKTsKCQkgICAgc3RhdGljCWNoYXIqCWluZm9bOF0gPSB7IiIsICJUZXh0IiwgIkNvcHlyaWdodCIsICJTZXEvVHJrIG5hbWUiLCAKCQkJCQkJICAgIkluc3RydW1lbnQiLCAiTHlyaWMiLCAiTWFya2VyIiwgIkN1ZS1wb2ludCJ9OwoJCSAgICBXT1JECWlkeCA9IEhJQllURShMT1dPUkQobW10LT5kd0V2ZW50RGF0YSkpOwoJCSAgICAKCQkgICAgaWYgKGxlbiA+PSBzaXplb2YoYnVmKSkgewoJCQlXQVJOKCJCdWZmZXIgZm9yIHRleHQgaXMgdG9vIHNtYWxsICglZCBieXRlcywgd2hlbiAldSBhcmUgbmVlZGVkKVxuIiwgc2l6ZW9mKGJ1ZikgLSAxLCBsZW4pOwoJCQlsZW4gPSBzaXplb2YoYnVmKSAtIDE7CgkJICAgIH0KCQkgICAgaWYgKG1taW9SZWFkKHdtbS0+aEZpbGUsIChIUFNUUilidWYsIGxlbikgPT0gbGVuKSB7CgkJCWJ1ZltsZW5dID0gMDsJLyogZW5kIHN0cmluZyBpbiBjYXNlICovCgkJCVRSQUNFKCIlcyA9PiBcIiVzXCJcbiIsIChpZHggPCA4ICkgPyBpbmZvW2lkeF0gOiAiIiwgYnVmKTsKCQkgICAgfSBlbHNlIHsKCQkJV0FSTigiQ291bGRuJ3QgcmVhZCBkYXRhIGZvciAlc1xuIiwgKGlkeCA8IDggKSA/IGluZm9baWR4XSA6ICIiKTsKCQkgICAgfQoJCX0KCQlicmVhazsKCSAgICBjYXNlIDB4MjA6IAoJCS8qIE1JREkgY2hhbm5lbCAoY2MpICovCgkJaWYgKEZJWE1FX09OKG1jaW1pZGkpKSB7CgkJICAgIEJZVEUJYnQ7CgkJICAgIAoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJmJ0KTsJLyogPT0gMCAqLwoJCSAgICBGSVhNRSgiTklZOiBNSURJIGNoYW5uZWw9JXUsIHRyYWNrPSV1XG4iLCBidCwgbW10LT53VHJhY2tOcik7CgkJfQoJCWJyZWFrOwoJICAgIGNhc2UgMHgyMToKCQkvKiBNSURJIHBvcnQgKHBwKSAqLwoJCWlmIChGSVhNRV9PTihtY2ltaWRpKSkgewoJCSAgICBCWVRFCWJ0OwoJCSAgICAKCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZidCk7CS8qID09IDAgKi8KCQkgICAgRklYTUUoIk5JWTogTUlESSBwb3J0PSV1LCB0cmFjaz0ldVxuIiwgYnQsIG1tdC0+d1RyYWNrTnIpOwoJCX0KCQlicmVhazsKCSAgICBjYXNlIDB4MkY6IC8qIGVuZCBvZiB0cmFjayAqLwoJCW1tdC0+d1N0YXR1cyA9IDA7CgkJYnJlYWs7CgkgICAgY2FzZSAweDUxOi8qIHNldCB0ZW1wbyAqLwoJCS8qIFRlbXBvIGlzIGV4cHJlc3NlZCBpbiC1LXNlY29uZHMgcGVyIG1pZGkgcXVhcnRlciBub3RlCgkJICogZm9yIGZvcm1hdCAxIE1JREkgZmlsZXMsIHRoaXMgY2FuIG9ubHkgYmUgcHJlc2VudCBvbiB0cmFjayAjMAoJCSAqLwoJCWlmIChtbXQtPndUcmFja05yICE9IDAgJiYgd21tLT53Rm9ybWF0ID09IDEpIHsKCQkgICAgV0FSTigiRm9yIGZvcm1hdCAjMSBNSURJIGZpbGVzLCB0ZW1wbyBjYW4gb25seSBiZSBjaGFuZ2VkIG9uIHRyYWNrICMwICgldSlcbiIsIG1tdC0+d1RyYWNrTnIpOwoJCX0gZWxzZSB7IAoJCSAgICBCWVRFCXRidDsKCQkgICAgRFdPUkQJdmFsdWUgPSAwOwoJCSAgICAKCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZ0YnQpOwl2YWx1ZSAgPSAoKERXT1JEKXRidCkgPDwgMTY7CgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmdGJ0KTsJdmFsdWUgfD0gKChEV09SRCl0YnQpIDw8IDg7CgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmdGJ0KTsJdmFsdWUgfD0gKChEV09SRCl0YnQpIDw8IDA7CgkJICAgIFRSQUNFKCJTZXR0aW5nIHRlbXBvIHRvICVsZCAoQlBNPSVsZClcbiIsIHdtbS0+ZHdUZW1wbywgKHZhbHVlKSA/ICg2MDAwMDAwMGwgLyB2YWx1ZSkgOiAwKTsKCQkgICAgd21tLT5kd1RlbXBvID0gdmFsdWU7CgkJfQoJCWJyZWFrOwoJICAgIGNhc2UgMHg1NDogLyogKGhvdXIpIChtaW4pIChzZWNvbmQpIChmcmFtZSkgKGZyYWN0aW9uYWwtZnJhbWUpIC0gU01QVEUgdHJhY2sgc3RhcnQgKi8KCQlpZiAobW10LT53VHJhY2tOciAhPSAwICYmIHdtbS0+d0Zvcm1hdCA9PSAxKSB7CgkJICAgIFdBUk4oIkZvciBmb3JtYXQgIzEgTUlESSBmaWxlcywgU01QVEUgdHJhY2sgc3RhcnQgY2FuIG9ubHkgYmUgZXhwcmVzc2VkIG9uIHRyYWNrICMwICgldSlcbiIsIG1tdC0+d1RyYWNrTnIpOwoJCX0gaWYgKG1tdC0+ZHdFdmVudFB1bHNlICE9IDApIHsKCQkgICAgV0FSTigiU01QVEUgdHJhY2sgc3RhcnQgY2FuIG9ubHkgYmUgZXhwcmVzc2VkIGF0IHN0YXJ0IG9mIHRyYWNrICglbHUpXG4iLCBtbXQtPmR3RXZlbnRQdWxzZSk7CgkJfSBlbHNlIHsKCQkgICAgQllURQloLCBtLCBzLCBmLCBmZjsKCQkgICAgCgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmaCk7CgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmbSk7CgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmcyk7CgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmZik7CgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmZmYpOwoJCSAgICBGSVhNRSgiTklZOiBTTVBURSB0cmFjayBzdGFydCAldToldToldSAldS4ldVxuIiwgaCwgbSwgcywgZiwgZmYpOwoJCX0KCQlicmVhazsKCSAgICBjYXNlIDB4NTg6IC8qIGZpbGUgcnl0aG0gKi8KCQlpZiAoVFJBQ0VfT04obWNpbWlkaSkpIHsKCQkgICAgQllURQludW0sIGRlbiwgY3BtYywgXzMybnBxbjsKCQkgICAgCgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmbnVtKTsJCgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmZGVuKTsJCS8qIHRvIG5vdGF0ZSBlLmcuIDYvOCAqLwoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJmNwbWMpOwkJLyogbnVtYmVyIG9mIE1JREkgY2xvY2tzIHBlciBtZXRyb25vbWUgY2xpY2sgKi8gCgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmXzMybnBxbik7CQkvKiBudW1iZXIgb2Ygbm90YXRlZCAzMm5kIG5vdGVzIHBlciBNSURJIHF1YXJ0ZXIgbm90ZSAqLwoJCSAgICAKCQkgICAgVFJBQ0UoIiV1LyV1LCBjbG9jayBwZXIgbWV0cm9ub21lIGNsaWNrPSV1LCAzMm5kIG5vdGVzIGJ5IDEvNCBub3RlPSV1XG4iLCBudW0sIDEgPDwgZGVuLCBjcG1jLCBfMzJucHFuKTsKCQl9CgkJYnJlYWs7CgkgICAgY2FzZSAweDU5OiAvKiBrZXkgc2lnbmF0dXJlICovCgkJaWYgKFRSQUNFX09OKG1jaW1pZGkpKSB7CgkJICAgIEJZVEUJc2YsIG1tOwoJCSAgICAKCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZzZik7CQkKCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZtbSk7CQoJCSAgICAKCQkgICAgaWYgKHNmID49IDB4ODApIAlUUkFDRSgiJWQgZmxhdHNcbiIsIC0oY2hhcilzZik7CSAKCQkgICAgZWxzZSBpZiAoc2YgPiAwKSAJVFJBQ0UoIiVkIHNoYXJwc1xuIiwgKGNoYXIpc2YpOwkgCgkJICAgIGVsc2UgCQlUUkFDRSgiS2V5IG9mIENcbiIpOwoJCSAgICBUUkFDRSgiTW9kZTogJXNcbiIsIChtbSA9IDApID8gIm1ham9yIiA6ICJtaW5vciIpOwoJCX0KCQlicmVhazsKCSAgICBkZWZhdWx0OgoJCVdBUk4oIlVua25vd24gTUlESSBtZXRhIGV2ZW50ICUwMnguIFNraXBwaW5nLi4uXG4iLCBISUJZVEUoTE9XT1JEKG1tdC0+ZHdFdmVudERhdGEpKSk7CgkJYnJlYWs7CgkgICAgfQoJICAgIGJyZWFrOwoJZGVmYXVsdDoKCSAgICBpZiAoZG9QbGF5KSB7CgkJZHdSZXQgPSBtaWRpT3V0U2hvcnRNc2cod21tLT5oTWlkaSwgbW10LT5kd0V2ZW50RGF0YSk7CgkgICAgfSBlbHNlIHsKCQlzd2l0Y2ggKExPQllURShMT1dPUkQobW10LT5kd0V2ZW50RGF0YSkpICYgMHhGMCkgewoJCWNhc2UgTUlESV9OT1RFT046CgkJY2FzZSBNSURJX05PVEVPRkY6CgkJICAgIGR3UmV0ID0gMDsJCgkJICAgIGJyZWFrOwoJCWRlZmF1bHQ6CgkJICAgIGR3UmV0ID0gbWlkaU91dFNob3J0TXNnKHdtbS0+aE1pZGksIG1tdC0+ZHdFdmVudERhdGEpOwoJCX0KCSAgICB9Cgl9CgltbXQtPmR3SW5kZXggKz0gbW10LT53RXZlbnRMZW5ndGg7CglpZiAobW10LT5kd0luZGV4IDwgbW10LT5kd0ZpcnN0IHx8IG1tdC0+ZHdJbmRleCA+PSBtbXQtPmR3TGFzdCkgewoJICAgIG1tdC0+d1N0YXR1cyA9IDA7Cgl9IAoJaWYgKG1tdC0+d1N0YXR1cykgewkKCSAgICBNSURJX21jaVJlYWROZXh0RXZlbnQod21tLCBtbXQpOwoJfQogICAgfQogICAgCiAgICBtaWRpT3V0UmVzZXQod21tLT5oTWlkaSk7CiAgICAKICAgIGR3UmV0ID0gbWlkaU91dENsb3NlKHdtbS0+aE1pZGkpOwogICAgd21tLT5kd1N0YXR1cyA9IE1DSV9NT0RFX1NUT1A7CiAgICAKICAgIC8qIHRvIHJlc3RhcnQgcGxheWluZyBhdCBiZWdpbm5pbmcgd2hlbiBpdCdzIG92ZXIgKi8KICAgIHdtbS0+ZHdQb3NpdGlvbk1TID0gMDsKICAgIAogICAgaWYgKGxwUGFybXMgJiYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSkgewoJVFJBQ0UoIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKCW1jaURyaXZlck5vdGlmeSgoSFdORClMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAoJCQl3bW0tPndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKICAgIH0KICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpUmVjb3JkCQkJW2ludGVybmFsXQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpUmVjb3JkKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9SRUNPUkRfUEFSTVMgbHBQYXJtcykKewogICAgaW50CQkJc3RhcnQsIGVuZDsKICAgIE1JRElIRFIJCW1pZGlIZHI7CiAgICBEV09SRAkJZHdSZXQ7CiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfbWNpR2V0T3BlbkRldih3RGV2SUQpOwogICAgCiAgICBUUkFDRSgiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogICAgCiAgICBpZiAod21tID09IDApCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfSUQ7CiAgICAKICAgIGlmICh3bW0tPmhGaWxlID09IDApIHsKCVdBUk4oIkNhbid0IGZpbmQgZmlsZT0nJXMnICFcbiIsIHdtbS0+bHBzdHJFbGVtZW50TmFtZSk7CglyZXR1cm4gTUNJRVJSX0ZJTEVfTk9UX0ZPVU5EOwogICAgfQogICAgc3RhcnQgPSAxOyAJCWVuZCA9IDk5OTk5OwogICAgaWYgKGxwUGFybXMgJiYgKGR3RmxhZ3MgJiBNQ0lfRlJPTSkpIHsKCXN0YXJ0ID0gbHBQYXJtcy0+ZHdGcm9tOyAKCVRSQUNFKCJNQ0lfRlJPTT0lZCBcbiIsIHN0YXJ0KTsKICAgIH0KICAgIGlmIChscFBhcm1zICYmIChkd0ZsYWdzICYgTUNJX1RPKSkgewoJZW5kID0gbHBQYXJtcy0+ZHdUbzsKCVRSQUNFKCJNQ0lfVE89JWQgXG4iLCBlbmQpOwogICAgfQogICAgbWlkaUhkci5scERhdGEgPSAoTFBTVFIpIEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCAxMjAwKTsKICAgIGlmICghbWlkaUhkci5scERhdGEpCglyZXR1cm4gTUNJRVJSX09VVF9PRl9NRU1PUlk7CiAgICBtaWRpSGRyLmR3QnVmZmVyTGVuZ3RoID0gMTAyNDsKICAgIG1pZGlIZHIuZHdVc2VyID0gMEw7CiAgICBtaWRpSGRyLmR3RmxhZ3MgPSAwTDsKICAgIGR3UmV0ID0gbWlkaUluUHJlcGFyZUhlYWRlcih3bW0tPmhNaWRpLCAmbWlkaUhkciwgc2l6ZW9mKE1JRElIRFIpKTsKICAgIFRSQUNFKCJBZnRlciBNSURNX1BSRVBBUkUgXG4iKTsKICAgIHdtbS0+ZHdTdGF0dXMgPSBNQ0lfTU9ERV9SRUNPUkQ7CiAgICAvKiBGSVhNRTogdGhlcmUgaXMgbm8gYnVmZmVyIGFkZGVkICovCiAgICB3aGlsZSAod21tLT5kd1N0YXR1cyAhPSBNQ0lfTU9ERV9TVE9QKSB7CglUUkFDRSgid21tLT5kd1N0YXR1cz0lcCAlZFxuIiwKCSAgICAgICZ3bW0tPmR3U3RhdHVzLCB3bW0tPmR3U3RhdHVzKTsKCW1pZGlIZHIuZHdCeXRlc1JlY29yZGVkID0gMDsKCWR3UmV0ID0gbWlkaUluU3RhcnQod21tLT5oTWlkaSk7CglUUkFDRSgibWlkaUluU3RhcnQgPT4gZHdCeXRlc1JlY29yZGVkPSVsdVxuIiwgbWlkaUhkci5kd0J5dGVzUmVjb3JkZWQpOwoJaWYgKG1pZGlIZHIuZHdCeXRlc1JlY29yZGVkID09IDApIGJyZWFrOwogICAgfQogICAgVFJBQ0UoIkJlZm9yZSBNSURNX1VOUFJFUEFSRSBcbiIpOwogICAgZHdSZXQgPSBtaWRpSW5VbnByZXBhcmVIZWFkZXIod21tLT5oTWlkaSwgJm1pZGlIZHIsIHNpemVvZihNSURJSERSKSk7CiAgICBUUkFDRSgiQWZ0ZXIgTUlETV9VTlBSRVBBUkUgXG4iKTsKICAgIGlmIChtaWRpSGRyLmxwRGF0YSAhPSBOVUxMKSB7CglIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBtaWRpSGRyLmxwRGF0YSk7CgltaWRpSGRyLmxwRGF0YSA9IE5VTEw7CiAgICB9CiAgICB3bW0tPmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKICAgIGlmIChscFBhcm1zICYmIChkd0ZsYWdzICYgTUNJX05PVElGWSkpIHsKCVRSQUNFKCJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CgltY2lEcml2ZXJOb3RpZnkoKEhXTkQpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKCQkJd21tLT53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVBhdXNlCQkJW2ludGVybmFsXQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpUGF1c2UoVUlOVCB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKewogICAgV0lORV9NQ0lNSURJKgl3bW0gPSBNSURJX21jaUdldE9wZW5EZXYod0RldklEKTsKICAgIAogICAgVFJBQ0UoIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKICAgIAogICAgaWYgKHdtbSA9PSBOVUxMKQlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwogICAgCiAgICBpZiAod21tLT5kd1N0YXR1cyA9PSBNQ0lfTU9ERV9QTEFZKSB7CgkvKiBzdG9wIGFsbCBub3RlcyAqLwoJdW5zaWduZWQgY2huOwoJZm9yIChjaG4gPSAwOyBjaG4gPCAxNjsgY2huKyspCgkgICAgbWlkaU91dFNob3J0TXNnKHdtbS0+aE1pZGksIDB4NzhCMCB8IGNobik7Cgl3bW0tPmR3U3RhdHVzID0gTUNJX01PREVfUEFVU0U7CiAgICB9IAogICAgaWYgKGxwUGFybXMgJiYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSkgewoJVFJBQ0UoIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKCW1jaURyaXZlck5vdGlmeSgoSFdORClMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAoJCQl3bW0tPndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKICAgIH0KICAgIAogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lSZXN1bWUJCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lSZXN1bWUoVUlOVCB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKewogICAgV0lORV9NQ0lNSURJKgl3bW0gPSBNSURJX21jaUdldE9wZW5EZXYod0RldklEKTsKICAgIAogICAgVFJBQ0UoIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKICAgIAogICAgaWYgKHdtbSA9PSBOVUxMKQlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwogICAgCiAgICBpZiAod21tLT5kd1N0YXR1cyA9PSBNQ0lfTU9ERV9QQVVTRSkgewoJd21tLT53U3RhcnRlZFBsYXlpbmcgPSBGQUxTRTsKCXdtbS0+ZHdTdGF0dXMgPSBNQ0lfTU9ERV9QTEFZOwogICAgfSAKICAgIGlmIChscFBhcm1zICYmIChkd0ZsYWdzICYgTUNJX05PVElGWSkpIHsKCVRSQUNFKCJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CgltY2lEcml2ZXJOb3RpZnkoKEhXTkQpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKCQkJd21tLT53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVNldAkJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRCBNSURJX21jaVNldChVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU0VUX1BBUk1TIGxwUGFybXMpCnsKICAgIFdJTkVfTUNJTUlESSoJd21tID0gTUlESV9tY2lHZXRPcGVuRGV2KHdEZXZJRCk7CiAgICAKICAgIFRSQUNFKCIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAgICAKICAgIGlmIChscFBhcm1zID09IE5VTEwpCXJldHVybiBNQ0lFUlJfTlVMTF9QQVJBTUVURVJfQkxPQ0s7CiAgICBpZiAod21tID09IE5VTEwpCQlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwogICAgCiAgICBpZiAoZHdGbGFncyAmIE1DSV9TRVRfVElNRV9GT1JNQVQpIHsKCXN3aXRjaCAobHBQYXJtcy0+ZHdUaW1lRm9ybWF0KSB7CgljYXNlIE1DSV9GT1JNQVRfTUlMTElTRUNPTkRTOgoJICAgIFRSQUNFKCJNQ0lfRk9STUFUX01JTExJU0VDT05EUyAhXG4iKTsKCSAgICB3bW0tPmR3TWNpVGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfTUlMTElTRUNPTkRTOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfRk9STUFUX1NNUFRFXzI0OgoJICAgIFRSQUNFKCJNQ0lfRk9STUFUX1NNUFRFXzI0ICFcbiIpOwoJICAgIHdtbS0+ZHdNY2lUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9TTVBURV8yNDsKCSAgICBicmVhazsKCWNhc2UgTUNJX0ZPUk1BVF9TTVBURV8yNToKCSAgICBUUkFDRSgiTUNJX0ZPUk1BVF9TTVBURV8yNSAhXG4iKTsKCSAgICB3bW0tPmR3TWNpVGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfU01QVEVfMjU7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9GT1JNQVRfU01QVEVfMzA6CgkgICAgVFJBQ0UoIk1DSV9GT1JNQVRfU01QVEVfMzAgIVxuIik7CgkgICAgd21tLT5kd01jaVRpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX1NNUFRFXzMwOwoJICAgIGJyZWFrOwoJZGVmYXVsdDoKCSAgICBXQVJOKCJCYWQgdGltZSBmb3JtYXQgJWx1IVxuIiwgbHBQYXJtcy0+ZHdUaW1lRm9ybWF0KTsKCSAgICByZXR1cm4gTUNJRVJSX0JBRF9USU1FX0ZPUk1BVDsKCX0KICAgIH0KICAgIGlmIChkd0ZsYWdzICYgTUNJX1NFVF9WSURFTykgewoJVFJBQ0UoIk5vIHN1cHBvcnQgZm9yIHZpZGVvICFcbiIpOwoJcmV0dXJuIE1DSUVSUl9VTlNVUFBPUlRFRF9GVU5DVElPTjsKICAgIH0KICAgIGlmIChkd0ZsYWdzICYgTUNJX1NFVF9ET09SX09QRU4pIHsKCVRSQUNFKCJObyBzdXBwb3J0IGZvciBkb29yIG9wZW4gIVxuIik7CglyZXR1cm4gTUNJRVJSX1VOU1VQUE9SVEVEX0ZVTkNUSU9OOwogICAgfQogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX0RPT1JfQ0xPU0VEKSB7CglUUkFDRSgiTm8gc3VwcG9ydCBmb3IgZG9vciBjbG9zZSAhXG4iKTsKCXJldHVybiBNQ0lFUlJfVU5TVVBQT1JURURfRlVOQ1RJT047CiAgICB9CiAgICBpZiAoZHdGbGFncyAmIE1DSV9TRVRfQVVESU8pIHsKCWlmIChkd0ZsYWdzICYgTUNJX1NFVF9PTikgewoJICAgIFRSQUNFKCJNQ0lfU0VUX09OIGF1ZGlvICFcbiIpOwoJfSBlbHNlIGlmIChkd0ZsYWdzICYgTUNJX1NFVF9PRkYpIHsKCSAgICBUUkFDRSgiTUNJX1NFVF9PRkYgYXVkaW8gIVxuIik7Cgl9IGVsc2UgewoJICAgIFdBUk4oIk1DSV9TRVRfQVVESU8gd2l0aG91dCBTRVRfT04gb3IgU0VUX09GRlxuIik7CgkgICAgcmV0dXJuIE1DSUVSUl9CQURfSU5URUdFUjsKCX0KCQoJaWYgKGxwUGFybXMtPmR3QXVkaW8gJiBNQ0lfU0VUX0FVRElPX0FMTCkKCSAgICBUUkFDRSgiTUNJX1NFVF9BVURJT19BTEwgIVxuIik7CglpZiAobHBQYXJtcy0+ZHdBdWRpbyAmIE1DSV9TRVRfQVVESU9fTEVGVCkKCSAgICBUUkFDRSgiTUNJX1NFVF9BVURJT19MRUZUICFcbiIpOwoJaWYgKGxwUGFybXMtPmR3QXVkaW8gJiBNQ0lfU0VUX0FVRElPX1JJR0hUKQoJICAgIFRSQUNFKCJNQ0lfU0VUX0FVRElPX1JJR0hUICFcbiIpOwogICAgfQogICAgCiAgICBpZiAoZHdGbGFncyAmIE1DSV9TRVFfU0VUX01BU1RFUikKCVRSQUNFKCJNQ0lfU0VRX1NFVF9NQVNURVIgIVxuIik7CiAgICBpZiAoZHdGbGFncyAmIE1DSV9TRVFfU0VUX1NMQVZFKQoJVFJBQ0UoIk1DSV9TRVFfU0VUX1NMQVZFICFcbiIpOwogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VRX1NFVF9PRkZTRVQpCglUUkFDRSgiTUNJX1NFUV9TRVRfT0ZGU0VUICFcbiIpOwogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VRX1NFVF9QT1JUKQoJVFJBQ0UoIk1DSV9TRVFfU0VUX1BPUlQgIVxuIik7CiAgICBpZiAoZHdGbGFncyAmIE1DSV9TRVFfU0VUX1RFTVBPKQoJVFJBQ0UoIk1DSV9TRVFfU0VUX1RFTVBPICFcbiIpOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lTdGF0dXMJCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lTdGF0dXMoVUlOVCB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1NUQVRVU19QQVJNUyBscFBhcm1zKQp7CiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfbWNpR2V0T3BlbkRldih3RGV2SUQpOwogICAgRFdPUkQJCXJldCA9IDA7CgogICAgVFJBQ0UoIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKICAgIAogICAgaWYgKGxwUGFybXMgPT0gTlVMTCkgCXJldHVybiBNQ0lFUlJfTlVMTF9QQVJBTUVURVJfQkxPQ0s7CiAgICBpZiAod21tID09IE5VTEwpCQlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwogICAgCiAgICBpZiAoZHdGbGFncyAmIE1DSV9TVEFUVVNfSVRFTSkgewoJc3dpdGNoIChscFBhcm1zLT5kd0l0ZW0pIHsKCWNhc2UgTUNJX1NUQVRVU19DVVJSRU5UX1RSQUNLOgoJICAgIC8qIEZJWE1FIGluIEZvcm1hdCAyICovCgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSAxOwoJICAgIFRSQUNFKCJNQ0lfU1RBVFVTX0NVUlJFTlRfVFJBQ0sgPT4gJWx1XG4iLCBscFBhcm1zLT5kd1JldHVybik7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TVEFUVVNfTEVOR1RIOgoJICAgIGlmICgoZHdGbGFncyAmIE1DSV9UUkFDSykgJiYgd21tLT53Rm9ybWF0ID09IDIpIHsKCQlpZiAobHBQYXJtcy0+ZHdUcmFjayA+PSB3bW0tPm5UcmFja3MpCgkJICAgIHJldHVybiBNQ0lFUlJfQkFEX0lOVEVHRVI7CgkJLyogRklYTUU6IHRoaXMgaXMgd3JvbmcgaWYgdGhlcmUgaXMgYSB0ZW1wbyBjaGFuZ2UgaW5zaWRlIHRoZSBmaWxlICovCgkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBNSURJX0NvbnZlcnRQdWxzZVRvTVMod21tLCB3bW0tPnRyYWNrc1tscFBhcm1zLT5kd1RyYWNrXS5kd0xlbmd0aCk7CgkgICAgfSBlbHNlIHsKCQlscFBhcm1zLT5kd1JldHVybiA9IE1JRElfR2V0TVRoZExlbmd0aE1TKHdtbSk7CgkgICAgfQoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gTUlESV9Db252ZXJ0TVNUb1RpbWVGb3JtYXQod21tLCBscFBhcm1zLT5kd1JldHVybik7CgkgICAgVFJBQ0UoIk1DSV9TVEFUVVNfTEVOR1RIID0+ICVsdVxuIiwgbHBQYXJtcy0+ZHdSZXR1cm4pOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfU1RBVFVTX01PREU6CgkgICAgVFJBQ0UoIk1DSV9TVEFUVVNfTU9ERSA9PiAldVxuIiwgd21tLT5kd1N0YXR1cyk7CiAJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gTUFLRU1DSVJFU09VUkNFKHdtbS0+ZHdTdGF0dXMsIHdtbS0+ZHdTdGF0dXMpOwoJICAgIHJldCA9IE1DSV9SRVNPVVJDRV9SRVRVUk5FRDsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NUQVRVU19NRURJQV9QUkVTRU5UOgoJICAgIFRSQUNFKCJNQ0lfU1RBVFVTX01FRElBX1BSRVNFTlQgPT4gVFJVRVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQUtFTUNJUkVTT1VSQ0UoVFJVRSwgTUNJX1RSVUUpOwoJICAgIHJldCA9IE1DSV9SRVNPVVJDRV9SRVRVUk5FRDsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NUQVRVU19OVU1CRVJfT0ZfVFJBQ0tTOgoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gKHdtbS0+d0Zvcm1hdCA9PSAyKSA/IHdtbS0+blRyYWNrcyA6IDE7CgkgICAgVFJBQ0UoIk1DSV9TVEFUVVNfTlVNQkVSX09GX1RSQUNLUyA9PiAlbHVcbiIsIGxwUGFybXMtPmR3UmV0dXJuKTsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NUQVRVU19QT1NJVElPTjoKCSAgICAvKiBGSVhNRTogZG8gSSBuZWVkIHRvIHVzZSBNQ0lfVFJBQ0sgPyAqLwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gTUlESV9Db252ZXJ0TVNUb1RpbWVGb3JtYXQod21tLCAKCQkJCQkJCSAgIChkd0ZsYWdzICYgTUNJX1NUQVRVU19TVEFSVCkgPyAwIDogd21tLT5kd1Bvc2l0aW9uTVMpOwoJICAgIFRSQUNFKCJNQ0lfU1RBVFVTX1BPU0lUSU9OICVzID0+ICVsdVxuIiwgCgkJICAoZHdGbGFncyAmIE1DSV9TVEFUVVNfU1RBUlQpID8gInN0YXJ0IiA6ICJjdXJyZW50IiwgbHBQYXJtcy0+ZHdSZXR1cm4pOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfU1RBVFVTX1JFQURZOgoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gKHdtbS0+ZHdTdGF0dXMgPT0gTUNJX01PREVfTk9UX1JFQURZKSA/CgkJTUFLRU1DSVJFU09VUkNFKEZBTFNFLCBNQ0lfRkFMU0UpIDogTUFLRU1DSVJFU09VUkNFKFRSVUUsIE1DSV9UUlVFKTsKCSAgICByZXQgPSBNQ0lfUkVTT1VSQ0VfUkVUVVJORUQ7CgkgICAgVFJBQ0UoIk1DSV9TVEFUVVNfUkVBRFkgPSAldVxuIiwgTE9XT1JEKGxwUGFybXMtPmR3UmV0dXJuKSk7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TVEFUVVNfVElNRV9GT1JNQVQ6CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQUtFTUNJUkVTT1VSQ0Uod21tLT5kd01jaVRpbWVGb3JtYXQsIHdtbS0+ZHdNY2lUaW1lRm9ybWF0KTsKCSAgICBUUkFDRSgiTUNJX1NUQVRVU19USU1FX0ZPUk1BVCA9PiAldVxuIiwgTE9XT1JEKGxwUGFybXMtPmR3UmV0dXJuKSk7CgkgICAgcmV0ID0gTUNJX1JFU09VUkNFX1JFVFVSTkVEOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfU0VRX1NUQVRVU19ESVZUWVBFOgoJICAgIFRSQUNFKCJNQ0lfU0VRX1NUQVRVU19ESVZUWVBFICFcbiIpOwoJICAgIGlmICh3bW0tPm5EaXZpc2lvbiA+IDB4ODAwMCkgewoJCXN3aXRjaCAod21tLT5uRGl2aXNpb24pIHsKCQljYXNlIDB4RTg6CWxwUGFybXMtPmR3UmV0dXJuID0gTUNJX1NFUV9ESVZfU01QVEVfMjQ7CWJyZWFrOwkvKiAtMjQgKi8KCQljYXNlIDB4RTc6CWxwUGFybXMtPmR3UmV0dXJuID0gTUNJX1NFUV9ESVZfU01QVEVfMjU7CWJyZWFrOwkvKiAtMjUgKi8KCQljYXNlIDB4RTM6CWxwUGFybXMtPmR3UmV0dXJuID0gTUNJX1NFUV9ESVZfU01QVEVfMzBEUk9QOwlicmVhazsJLyogLTI5ICovIC8qIGlzIHRoZSBNQ0kgY29uc3RhbnQgY29ycmVjdCA/ICovCgkJY2FzZSAweEUyOglscFBhcm1zLT5kd1JldHVybiA9IE1DSV9TRVFfRElWX1NNUFRFXzMwOwlicmVhazsJLyogLTMwICovCgkJZGVmYXVsdDoJRklYTUUoIlRoZXJlIGlzIGEgYmFkIGJhZCBwcm9ncmFtbWVyXG4iKTsKCQl9CgkgICAgfSBlbHNlIHsKCQlscFBhcm1zLT5kd1JldHVybiA9IE1DSV9TRVFfRElWX1BQUU47CgkgICAgfQoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gTUFLRU1DSVJFU09VUkNFKGxwUGFybXMtPmR3UmV0dXJuLGxwUGFybXMtPmR3UmV0dXJuKTsKCSAgICByZXQgPSBNQ0lfUkVTT1VSQ0VfUkVUVVJORUQ7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TRVFfU1RBVFVTX01BU1RFUjoKCSAgICBUUkFDRSgiTUNJX1NFUV9TVEFUVVNfTUFTVEVSICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gMDsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NFUV9TVEFUVVNfU0xBVkU6CgkgICAgVFJBQ0UoIk1DSV9TRVFfU1RBVFVTX1NMQVZFICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gMDsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NFUV9TVEFUVVNfT0ZGU0VUOgoJICAgIFRSQUNFKCJNQ0lfU0VRX1NUQVRVU19PRkZTRVQgIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSAwOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfU0VRX1NUQVRVU19QT1JUOgoJICAgIFRSQUNFKCJNQ0lfU0VRX1NUQVRVU19QT1JUICgldSkhXG4iLCB3bW0tPndEZXZJRCk7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSB3bW0tPndEZXZJRDsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NFUV9TVEFUVVNfVEVNUE86CgkgICAgVFJBQ0UoIk1DSV9TRVFfU1RBVFVTX1RFTVBPICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gd21tLT5kd1RlbXBvOwoJICAgIGJyZWFrOwoJZGVmYXVsdDoKCSAgICBGSVhNRSgiVW5rbm93bSBjb21tYW5kICUwOGxYICFcbiIsIGxwUGFybXMtPmR3SXRlbSk7CgkgICAgcmV0dXJuIE1DSUVSUl9VTlJFQ09HTklaRURfQ09NTUFORDsKCX0KICAgIH0gZWxzZSB7CglXQVJOKCJObyBTdGF0dXMtSXRlbSFcbiIpOwoJcmV0dXJuIE1DSUVSUl9VTlJFQ09HTklaRURfQ09NTUFORDsKICAgIH0KICAgIGlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewoJVFJBQ0UoIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKCW1jaURyaXZlck5vdGlmeSgoSFdORClMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAoJCQl3bW0tPndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKICAgIH0KICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lHZXREZXZDYXBzCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lHZXREZXZDYXBzKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCAKCQkJCUxQTUNJX0dFVERFVkNBUFNfUEFSTVMgbHBQYXJtcykKewogICAgV0lORV9NQ0lNSURJKgl3bW0gPSBNSURJX21jaUdldE9wZW5EZXYod0RldklEKTsKICAgIERXT1JECQlyZXQ7CgogICAgVFJBQ0UoIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKICAgIAogICAgaWYgKGxwUGFybXMgPT0gTlVMTCkgCXJldHVybiBNQ0lFUlJfTlVMTF9QQVJBTUVURVJfQkxPQ0s7CiAgICBpZiAod21tID09IE5VTEwpCQlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwogICAgCiAgICBpZiAoZHdGbGFncyAmIE1DSV9HRVRERVZDQVBTX0lURU0pIHsKCXN3aXRjaCAobHBQYXJtcy0+ZHdJdGVtKSB7CgljYXNlIE1DSV9HRVRERVZDQVBTX0RFVklDRV9UWVBFOgoJICAgIFRSQUNFKCJNQ0lfR0VUREVWQ0FQU19ERVZJQ0VfVFlQRSAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IE1BS0VNQ0lSRVNPVVJDRShNQ0lfREVWVFlQRV9TRVFVRU5DRVIsIE1DSV9ERVZUWVBFX1NFUVVFTkNFUik7CgkgICAgcmV0ID0gTUNJX1JFU09VUkNFX1JFVFVSTkVEOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfR0VUREVWQ0FQU19IQVNfQVVESU86CgkgICAgVFJBQ0UoIk1DSV9HRVRERVZDQVBTX0hBU19BVURJTyAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IE1BS0VNQ0lSRVNPVVJDRShUUlVFLCBNQ0lfVFJVRSk7CgkgICAgcmV0ID0gTUNJX1JFU09VUkNFX1JFVFVSTkVEOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfR0VUREVWQ0FQU19IQVNfVklERU86CgkgICAgVFJBQ0UoIk1DSV9HRVRERVZDQVBTX0hBU19WSURFTyAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IE1BS0VNQ0lSRVNPVVJDRShGQUxTRSwgTUNJX0ZBTFNFKTsKCSAgICByZXQgPSBNQ0lfUkVTT1VSQ0VfUkVUVVJORUQ7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9HRVRERVZDQVBTX1VTRVNfRklMRVM6CgkgICAgVFJBQ0UoIk1DSV9HRVRERVZDQVBTX1VTRVNfRklMRVMgIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQUtFTUNJUkVTT1VSQ0UoVFJVRSwgTUNJX1RSVUUpOwoJICAgIHJldCA9IE1DSV9SRVNPVVJDRV9SRVRVUk5FRDsKCSAgICBicmVhazsKCWNhc2UgTUNJX0dFVERFVkNBUFNfQ09NUE9VTkRfREVWSUNFOgoJICAgIFRSQUNFKCJNQ0lfR0VUREVWQ0FQU19DT01QT1VORF9ERVZJQ0UgIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQUtFTUNJUkVTT1VSQ0UoVFJVRSwgTUNJX1RSVUUpOwoJICAgIHJldCA9IE1DSV9SRVNPVVJDRV9SRVRVUk5FRDsKCSAgICBicmVhazsKCWNhc2UgTUNJX0dFVERFVkNBUFNfQ0FOX0VKRUNUOgoJICAgIFRSQUNFKCJNQ0lfR0VUREVWQ0FQU19DQU5fRUpFQ1QgIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQUtFTUNJUkVTT1VSQ0UoRkFMU0UsIE1DSV9GQUxTRSk7CgkgICAgcmV0ID0gTUNJX1JFU09VUkNFX1JFVFVSTkVEOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfR0VUREVWQ0FQU19DQU5fUExBWToKCSAgICBUUkFDRSgiTUNJX0dFVERFVkNBUFNfQ0FOX1BMQVkgIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQUtFTUNJUkVTT1VSQ0UoVFJVRSwgTUNJX1RSVUUpOwoJICAgIHJldCA9IE1DSV9SRVNPVVJDRV9SRVRVUk5FRDsKCSAgICBicmVhazsKCWNhc2UgTUNJX0dFVERFVkNBUFNfQ0FOX1JFQ09SRDoKCSAgICBUUkFDRSgiTUNJX0dFVERFVkNBUFNfQ0FOX1JFQ09SRCAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IE1BS0VNQ0lSRVNPVVJDRShUUlVFLCBNQ0lfVFJVRSk7CgkgICAgcmV0ID0gTUNJX1JFU09VUkNFX1JFVFVSTkVEOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfR0VUREVWQ0FQU19DQU5fU0FWRToKCSAgICBUUkFDRSgiTUNJX0dFVERFVkNBUFNfQ0FOX1NBVkUgIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQUtFTUNJUkVTT1VSQ0UoRkFMU0UsIE1DSV9GQUxTRSk7CgkgICAgcmV0ID0gTUNJX1JFU09VUkNFX1JFVFVSTkVEOwoJICAgIGJyZWFrOwoJZGVmYXVsdDoKCSAgICBGSVhNRSgiVW5rbm93biBjYXBhYmlsaXR5ICglMDhseCkgIVxuIiwgbHBQYXJtcy0+ZHdJdGVtKTsKCSAgICByZXR1cm4gTUNJRVJSX1VOUkVDT0dOSVpFRF9DT01NQU5EOwoJfQogICAgfSBlbHNlIHsKCVdBUk4oIk5vIEdldERldkNhcHMtSXRlbSAhXG4iKTsKCXJldHVybiBNQ0lFUlJfVU5SRUNPR05JWkVEX0NPTU1BTkQ7CiAgICB9CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpSW5mbwkJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRCBNSURJX21jaUluZm8oVUlOVCB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0lORk9fUEFSTVNBIGxwUGFybXMpCnsKICAgIExQQ1NUUgkJc3RyID0gMDsKICAgIFdJTkVfTUNJTUlESSoJd21tID0gTUlESV9tY2lHZXRPcGVuRGV2KHdEZXZJRCk7CiAgICAKICAgIFRSQUNFKCIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAgICAKICAgIGlmIChscFBhcm1zID09IE5VTEwgfHwgbHBQYXJtcy0+bHBzdHJSZXR1cm4gPT0gTlVMTCkKCXJldHVybiBNQ0lFUlJfTlVMTF9QQVJBTUVURVJfQkxPQ0s7CiAgICBpZiAod21tID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfSUQ7CgogICAgVFJBQ0UoImJ1Zj0lcCwgbGVuPSVsdVxuIiwgbHBQYXJtcy0+bHBzdHJSZXR1cm4sIGxwUGFybXMtPmR3UmV0U2l6ZSk7CiAgICAKICAgIHN3aXRjaCAoZHdGbGFncykgewogICAgY2FzZSBNQ0lfSU5GT19QUk9EVUNUOgoJc3RyID0gIldpbmUncyBNSURJIHNlcXVlbmNlciI7CglicmVhazsKICAgIGNhc2UgTUNJX0lORk9fRklMRToKCXN0ciA9IHdtbS0+bHBzdHJFbGVtZW50TmFtZTsKCWJyZWFrOwojaWYgMAoJLyogRklYTUU6IHRoZSBmb2xsb3dpbmcgbWFuaWZlc3QgY29uc3RhbnRzIGFyZSBub3QgZGVmaW5lZCBpbiA8V0lORT4vaW5jbHVkZS9tbXN5c3RlbS5oICovCiAgICBjYXNlIE1DSV9JTkZPX0NPUFlSSUdIVDoKCWJyZWFrOwogICAgY2FzZSBNQ0lfSU5GT19OQU1FOgoJYnJlYWs7CiNlbmRpZgogICAgZGVmYXVsdDoKCVdBUk4oIkRvbid0IGtub3cgdGhpcyBpbmZvIGNvbW1hbmQgKCVsdSlcbiIsIGR3RmxhZ3MpOwoJcmV0dXJuIE1DSUVSUl9VTlJFQ09HTklaRURfQ09NTUFORDsKICAgIH0KICAgIHJldHVybiBNQ0lfV3JpdGVTdHJpbmcobHBQYXJtcy0+bHBzdHJSZXR1cm4sIGxwUGFybXMtPmR3UmV0U2l6ZSwgc3RyKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVNlZWsJCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lTZWVrKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9TRUVLX1BBUk1TIGxwUGFybXMpCnsKICAgIERXT1JECQlyZXQgPSAwOwogICAgV0lORV9NQ0lNSURJKgl3bW0gPSBNSURJX21jaUdldE9wZW5EZXYod0RldklEKTsKICAgIAogICAgVFJBQ0UoIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKICAgIAogICAgaWYgKGxwUGFybXMgPT0gTlVMTCkgewoJcmV0ID0gTUNJRVJSX05VTExfUEFSQU1FVEVSX0JMT0NLOwogICAgfSBlbHNlIGlmICh3bW0gPT0gTlVMTCkgewoJcmV0ID0gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwogICAgfSBlbHNlIHsKCU1JRElfbWNpU3RvcCh3RGV2SUQsIE1DSV9XQUlULCAwKTsKCQoJaWYgKGR3RmxhZ3MgJiBNQ0lfU0VFS19UT19TVEFSVCkgewoJICAgIHdtbS0+ZHdQb3NpdGlvbk1TID0gMDsKCX0gZWxzZSBpZiAoZHdGbGFncyAmIE1DSV9TRUVLX1RPX0VORCkgewoJICAgIHdtbS0+ZHdQb3NpdGlvbk1TID0gMHhGRkZGRkZGRjsgLyogZml4bWUgKi8KCX0gZWxzZSBpZiAoZHdGbGFncyAmIE1DSV9UTykgewoJICAgIHdtbS0+ZHdQb3NpdGlvbk1TID0gTUlESV9Db252ZXJ0VGltZUZvcm1hdFRvTVMod21tLCBscFBhcm1zLT5kd1RvKTsKCX0gZWxzZSB7CgkgICAgV0FSTigiZHdGbGFnIGRvZXNuJ3QgdGVsbCB3aGVyZSB0byBzZWVrIHRvLi4uXG4iKTsKCSAgICByZXR1cm4gTUNJRVJSX01JU1NJTkdfUEFSQU1FVEVSOwoJfQoJCglUUkFDRSgiU2Vla2luZyB0byBwb3NpdGlvbj0lbHUgbXNcbiIsIHdtbS0+ZHdQb3NpdGlvbk1TKTsKCQoJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7CgkgICAgVFJBQ0UoIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKCSAgICBtY2lEcml2ZXJOb3RpZnkoKEhXTkQpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKCQkJICAgIHdtbS0+d05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwoJfQogICAgfQogICAgcmV0dXJuIHJldDsJCn0gICAgCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qCiAqICAgICAgICAgICAgICAgICAgCSAgICBNSURJIGVudHJ5IHBvaW50cyAJCQkJKgogKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNQ0lNSURJX0RyaXZlclByb2MJICAgICBbc2FtcGxlIGRyaXZlcl0KICovCkxPTkcgQ0FMTEJBQ0sJTUNJTUlESV9Ecml2ZXJQcm9jKERXT1JEIGR3RGV2SUQsIEhEUlZSIGhEcml2LCBEV09SRCB3TXNnLCAKCQkJCSAgIERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKewogICAgc3dpdGNoICh3TXNnKSB7CiAgICBjYXNlIERSVl9MT0FEOgkJcmV0dXJuIDE7CiAgICBjYXNlIERSVl9GUkVFOgkJcmV0dXJuIDE7CiAgICBjYXNlIERSVl9FTkFCTEU6CQlyZXR1cm4gMTsKICAgIGNhc2UgRFJWX0RJU0FCTEU6CQlyZXR1cm4gMTsKICAgIGNhc2UgRFJWX1FVRVJZQ09ORklHVVJFOglyZXR1cm4gMTsKICAgIGNhc2UgRFJWX0NPTkZJR1VSRToJCU1lc3NhZ2VCb3hBKDAsICJTYW1wbGUgTWlkaSBEcml2ZXIgISIsICJPU1MgRHJpdmVyIiwgTUJfT0spOyByZXR1cm4gMTsKICAgIGNhc2UgRFJWX0lOU1RBTEw6CQlyZXR1cm4gRFJWQ05GX1JFU1RBUlQ7CiAgICBjYXNlIERSVl9SRU1PVkU6CQlyZXR1cm4gRFJWQ05GX1JFU1RBUlQ7CiAgICBjYXNlIERSVl9PUEVOOgkJcmV0dXJuIE1JRElfZHJ2T3BlbigoTFBTVFIpZHdQYXJhbTEsIChMUE1DSV9PUEVOX0RSSVZFUl9QQVJNU0EpZHdQYXJhbTIpOwogICAgY2FzZSBEUlZfQ0xPU0U6CQlyZXR1cm4gTUlESV9kcnZDbG9zZShkd0RldklEKTsKICAgIGNhc2UgTUNJX09QRU5fRFJJVkVSOglyZXR1cm4gTUlESV9tY2lPcGVuICAgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfT1BFTl9QQVJNU0EpICAgICBkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9DTE9TRV9EUklWRVI6CXJldHVybiBNSURJX21jaUNsb3NlICAgICAoZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9HRU5FUklDX1BBUk1TKSAgIGR3UGFyYW0yKTsKICAgIGNhc2UgTUNJX1BMQVk6CQlyZXR1cm4gTUlESV9tY2lQbGF5ICAgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfUExBWV9QQVJNUykgICAgICBkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9SRUNPUkQ6CQlyZXR1cm4gTUlESV9tY2lSZWNvcmQgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfUkVDT1JEX1BBUk1TKSAgICBkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9TVE9QOgkJcmV0dXJuIE1JRElfbWNpU3RvcCAgICAgIChkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX0dFTkVSSUNfUEFSTVMpICAgZHdQYXJhbTIpOwogICAgY2FzZSBNQ0lfU0VUOgkJcmV0dXJuIE1JRElfbWNpU2V0ICAgICAgIChkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX1NFVF9QQVJNUykgICAgICAgZHdQYXJhbTIpOwogICAgY2FzZSBNQ0lfUEFVU0U6CQlyZXR1cm4gTUlESV9tY2lQYXVzZSAgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfR0VORVJJQ19QQVJNUykgICBkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9SRVNVTUU6CQlyZXR1cm4gTUlESV9tY2lSZXN1bWUgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfR0VORVJJQ19QQVJNUykgICBkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9TVEFUVVM6CQlyZXR1cm4gTUlESV9tY2lTdGF0dXMgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfU1RBVFVTX1BBUk1TKSAgICBkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9HRVRERVZDQVBTOglyZXR1cm4gTUlESV9tY2lHZXREZXZDYXBzKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfR0VUREVWQ0FQU19QQVJNUylkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9JTkZPOgkJcmV0dXJuIE1JRElfbWNpSW5mbyAgICAgIChkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX0lORk9fUEFSTVNBKSAgICAgZHdQYXJhbTIpOwogICAgY2FzZSBNQ0lfU0VFSzoJCXJldHVybiBNSURJX21jaVNlZWsgICAgICAoZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9TRUVLX1BBUk1TKSAgICAgIGR3UGFyYW0yKTsKICAgIC8qIGNvbW1hbmRzIHRoYXQgc2hvdWxkIGJlIHN1cHBvcnRlZCAqLwogICAgY2FzZSBNQ0lfTE9BRDoJCQogICAgY2FzZSBNQ0lfU0FWRToJCQogICAgY2FzZSBNQ0lfRlJFRVpFOgkJCiAgICBjYXNlIE1DSV9QVVQ6CQkKICAgIGNhc2UgTUNJX1JFQUxJWkU6CQkKICAgIGNhc2UgTUNJX1VORlJFRVpFOgkJCiAgICBjYXNlIE1DSV9VUERBVEU6CQkKICAgIGNhc2UgTUNJX1dIRVJFOgkJCiAgICBjYXNlIE1DSV9TVEVQOgkJCiAgICBjYXNlIE1DSV9TUElOOgkJCiAgICBjYXNlIE1DSV9FU0NBUEU6CQkKICAgIGNhc2UgTUNJX0NPUFk6CQkKICAgIGNhc2UgTUNJX0NVVDoJCQogICAgY2FzZSBNQ0lfREVMRVRFOgkJCiAgICBjYXNlIE1DSV9QQVNURToJCQoJV0FSTigiVW5zdXBwb3J0ZWQgY29tbWFuZD0lc1xuIiwgTUNJX01lc3NhZ2VUb1N0cmluZyh3TXNnKSk7CglicmVhazsKICAgIC8qIGNvbW1hbmRzIHRoYXQgc2hvdWxkIHJlcG9ydCBhbiBlcnJvciAqLwogICAgY2FzZSBNQ0lfV0lORE9XOgkJCglUUkFDRSgiVW5zdXBwb3J0ZWQgY29tbWFuZD0lc1xuIiwgTUNJX01lc3NhZ2VUb1N0cmluZyh3TXNnKSk7CglicmVhazsKICAgIGNhc2UgTUNJX09QRU46CiAgICBjYXNlIE1DSV9DTE9TRToKCUZJWE1FKCJTaG91bGRuJ3QgcmVjZWl2ZSBhIE1DSV9PUEVOIG9yIENMT1NFIG1lc3NhZ2VcbiIpOwoJYnJlYWs7CiAgICBkZWZhdWx0OgkJCQoJVFJBQ0UoIlNlbmRpbmcgbXNnPSVzIHRvIGRlZmF1bHQgZHJpdmVyIHByb2NcbiIsIE1DSV9NZXNzYWdlVG9TdHJpbmcod01zZykpOwoJcmV0dXJuIERlZkRyaXZlclByb2MoZHdEZXZJRCwgaERyaXYsIHdNc2csIGR3UGFyYW0xLCBkd1BhcmFtMik7CiAgICB9CiAgICByZXR1cm4gTUNJRVJSX1VOUkVDT0dOSVpFRF9DT01NQU5EOwp9CgogICAgCg==