LyogLSotIHRhYi13aWR0aDogODsgYy1iYXNpYy1vZmZzZXQ6IDQgLSotICovCgovKgogKiBTYW1wbGUgTUlESSBXaW5lIERyaXZlciBmb3IgTGludXgKICoKICogQ29weXJpZ2h0IAkxOTk0IE1hcnRpbiBBeW90dGUKICoJCTE5OTkgRXJpYyBQb3VlY2gKICovCgovKiAKICogRXJpYyBQT1VFQ0ggOiAKICogOTgvNyBjaGFuZ2VzIGZvciBtYWtpbmcgdGhpcyBNSURJIGRyaXZlciB3b3JrIG9uIE9TUwogKiAJY3VycmVudCBzdXBwb3J0IGlzIGxpbWl0ZWQgdG8gTUlESSBwb3J0cyBvZiBPU1Mgc3lzdGVtcwogKiA5OC85CXJld3JpdGluZyBNQ0kgY29kZSBmb3IgTUlESQogKiA5OC8xMSBzcGxpdHRlZCBpbiBtaWRpLmMgYW5kIG1jaW1pZGkuYwogKi8KCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgIm1tZGRrLmgiCiNpbmNsdWRlICJkcml2ZXIuaCIKI2luY2x1ZGUgImhlYXAuaCIKI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKCkRFRkFVTFRfREVCVUdfQ0hBTk5FTChtY2ltaWRpKQoKI2RlZmluZSBNSURJX05PVEVPRkYgICAgICAgICAgICAgMHg4MAojZGVmaW5lIE1JRElfTk9URU9OICAgICAgICAgICAgICAweDkwCgp0eXBlZGVmIHN0cnVjdCB7CiAgICBEV09SRAkJZHdGaXJzdDsJCS8qIG9mZnNldCBpbiBmaWxlIG9mIHRyYWNrICovCiAgICBEV09SRAkJZHdMYXN0OwkJCS8qIG51bWJlciBvZiBieXRlcyBpbiBmaWxlIG9mIHRyYWNrICovCiAgICBEV09SRAkJZHdJbmRleDsJCS8qIGN1cnJlbnQgaW5kZXggaW4gZmlsZSAoZHdGaXJzdCA8PSBkd0luZGV4IDwgZHdMYXN0KSAqLwogICAgRFdPUkQJCWR3TGVuZ3RoOwkJLyogbnVtYmVyIG9mIHB1bHNlcyBpbiB0aGlzIHRyYWNrICovCiAgICBEV09SRAkJZHdFdmVudFB1bHNlOwkJLyogY3VycmVudCBwdWxzZSAjIChldmVudCkgcG9pbnRlZCBieSBkd0luZGV4ICovCiAgICBEV09SRAkJZHdFdmVudERhdGE7CQkvKiBjdXJyZW50IGRhdGEgICAgKGV2ZW50KSBwb2ludGVkIGJ5IGR3SW5kZXggKi8KICAgIFdPUkQJCXdFdmVudExlbmd0aDsJCS8qIGN1cnJlbnQgbGVuZ3RoICAoZXZlbnQpIHBvaW50ZWQgYnkgZHdJbmRleCAqLwogICAgV09SRAkJd1N0YXR1cyA6IDEsCQkvKiAxIDogcGxheWluZywgMCA6IGRvbmUgKi8KCSAgICAgICAgICAgICAgICB3VHJhY2tOciA6IDcsCgkgICAgICAgICAgICAgICAgd0xhc3RDb21tYW5kIDogODsJLyogbGFzdCBNSURJIGNvbW1hbmQgb24gdHJhY2sgKi8KfSBNQ0lfTUlESVRSQUNLOwoKdHlwZWRlZiBzdHJ1Y3QgdGFnV0lORV9NQ0lNSURJIHsKICAgIFVJTlQJCXdEZXZJRDsJCQkvKiB0aGUgTUNJIG9uZSAqLwogICAgSE1JREkJCWhNaWRpOwogICAgaW50CQkJblVzZUNvdW50OyAgICAgICAgICAJLyogSW5jcmVtZW50ZWQgZm9yIGVhY2ggc2hhcmVkIG9wZW4gICAgICAgICAgKi8KICAgIFdPUkQJCXdOb3RpZnlEZXZpY2VJRDsgICAgCS8qIE1DSSBkZXZpY2UgSUQgd2l0aCBhIHBlbmRpbmcgbm90aWZpY2F0aW9uICovCiAgICBIQU5ETEUgCQloQ2FsbGJhY2s7ICAgICAgICAgCS8qIENhbGxiYWNrIGhhbmRsZSBmb3IgcGVuZGluZyBub3RpZmljYXRpb24gICovCiAgICBITU1JTwkJaEZpbGU7CSAgICAgICAgICAgIAkvKiBtbWlvIGZpbGUgaGFuZGxlIG9wZW4gYXMgRWxlbWVudCAgICAgICAgICAqLwogICAgTFBDU1RSCQlscHN0ckVsZW1lbnROYW1lOwkvKiBOYW1lIG9mIGZpbGUgKi8KICAgIExQQ1NUUgkJbHBzdHJDb3B5cmlnaHQ7CiAgICBMUENTVFIJCWxwc3RyTmFtZTsJICAgICAgIAkKICAgIFdPUkQJCWR3U3RhdHVzOwkJLyogb25lIGZyb20gTUNJX01PREVfeHh4eCAqLwogICAgRFdPUkQJCWR3TWNpVGltZUZvcm1hdDsJLyogT25lIG9mIHRoZSBzdXBwb3J0ZWQgTUNJX0ZPUk1BVF94eHh4ICovCSAgICAgICAKICAgIFdPUkQJCXdGb3JtYXQ7CQkvKiBGb3JtYXQgb2YgTUlESSBoRmlsZSAoMCwgMSBvciAyKSAqLwogICAgV09SRAkJblRyYWNrczsJCS8qIE51bWJlciBvZiB0cmFja3MgaW4gaEZpbGUgKi8KICAgIFdPUkQJCW5EaXZpc2lvbjsJCS8qIE51bWJlciBvZiBkaXZpc2lvbiBpbiBoRmlsZSBQUFFOIG9yIFNNUFRFICovCiAgICBXT1JECQl3U3RhcnRlZFBsYXlpbmc7CiAgICBEV09SRAkJZHdUZW1wbzsJCS8qIFRlbXBvICgjIG9mIDEvNCBub3RlIHBlciBzZWNvbmQgKi8KICAgIE1DSV9NSURJVFJBQ0sqICAgICAJdHJhY2tzOwkJCS8qIENvbnRlbnQgb2YgZWFjaCB0cmFjayAqLwogICAgRFdPUkQJCWR3UHVsc2U7CQkKICAgIERXT1JECQlkd1Bvc2l0aW9uTVM7CiAgICBEV09SRAkJZHdTdGFydFRpY2tzOwp9IFdJTkVfTUNJTUlESTsKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBGSVhNRTogc2hvdWxkIGJlIHVzaW5nIHRoZSBuZXcgbW1UaHJlYWRYWFhYIGZ1bmN0aW9ucyBmcm9tIFdJTk1NCiAqIGluc3RlYWQgb2YgdGhvc2UKICogaXQgd291bGQgcmVxdWlyZSB0byBhZGQgYSB3aW5lIGludGVybmFsIGZsYWcgdG8gbW1UaHJlYWRDcmVhdGUKICogaW4gb3JkZXIgdG8gcGFzcyBhIDMyIGJpdCBmdW5jdGlvbiBpbnN0ZWFkIG9mIGEgMTYgYml0CiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKc3RydWN0IFNDQSB7CiAgICBVSU5UIAl3RGV2SUQ7CiAgICBVSU5UIAl3TXNnOwogICAgRFdPUkQgCWR3UGFyYW0xOwogICAgRFdPUkQgCWR3UGFyYW0yOwogICAgQk9PTAlhbGxvY2F0ZWRDb3B5Owp9OwoKLyogRVBQIERXT1JEIFdJTkFQSSBtY2lTZW5kQ29tbWFuZEEoVUlOVCB3RGV2SUQsIFVJTlQgd01zZywgRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKTsgKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUNJX1NDQVN0YXJ0ZXIJCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMgRFdPUkQgQ0FMTEJBQ0sJTUNJX1NDQVN0YXJ0ZXIoTFBWT0lEIGFyZykKewogICAgc3RydWN0IFNDQSoJc2NhID0gKHN0cnVjdCBTQ0EqKWFyZzsKICAgIERXT1JECQlyZXQ7CgogICAgVFJBQ0UoIkluIHRocmVhZCBiZWZvcmUgYXN5bmMgY29tbWFuZCAoJTA4eCwldSwlMDhseCwlMDhseClcbiIsCgkgIHNjYS0+d0RldklELCBzY2EtPndNc2csIHNjYS0+ZHdQYXJhbTEsIHNjYS0+ZHdQYXJhbTIpOwogICAgcmV0ID0gbWNpU2VuZENvbW1hbmRBKHNjYS0+d0RldklELCBzY2EtPndNc2csIHNjYS0+ZHdQYXJhbTEgfCBNQ0lfV0FJVCwgc2NhLT5kd1BhcmFtMik7CiAgICBUUkFDRSgiSW4gdGhyZWFkIGFmdGVyIGFzeW5jIGNvbW1hbmQgKCUwOHgsJXUsJTA4bHgsJTA4bHgpXG4iLAoJICBzY2EtPndEZXZJRCwgc2NhLT53TXNnLCBzY2EtPmR3UGFyYW0xLCBzY2EtPmR3UGFyYW0yKTsKICAgIGlmIChzY2EtPmFsbG9jYXRlZENvcHkpCglIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCAoTFBWT0lEKXNjYS0+ZHdQYXJhbTIpOwogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2NhKTsKICAgIEV4aXRUaHJlYWQocmV0KTsKICAgIFdBUk4oIlNob3VsZCBub3QgaGFwcGVuID8gd2hhdCdzIHdyb25nIFxuIik7CiAgICAvKiBzaG91bGQgbm90IGdvIGFmdGVyIHRoaXMgcG9pbnQgKi8KICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUNJX1NlbmRDb21tYW5kQXN5bmMJCVtpbnRlcm5hbF0KICovCnN0YXRpYwlEV09SRCBNQ0lfU2VuZENvbW1hbmRBc3luYyhVSU5UIHdEZXZJRCwgVUlOVCB3TXNnLCBEV09SRCBkd1BhcmFtMSwgCgkJCQkgICBEV09SRCBkd1BhcmFtMiwgVUlOVCBzaXplKQp7CiAgICBzdHJ1Y3QgU0NBKglzY2EgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKHN0cnVjdCBTQ0EpKTsKCiAgICBpZiAoc2NhID09IDApCglyZXR1cm4gTUNJRVJSX09VVF9PRl9NRU1PUlk7CgogICAgc2NhLT53RGV2SUQgICA9IHdEZXZJRDsKICAgIHNjYS0+d01zZyAgICAgPSB3TXNnOwogICAgc2NhLT5kd1BhcmFtMSA9IGR3UGFyYW0xOwogICAgCiAgICBpZiAoc2l6ZSkgewoJc2NhLT5kd1BhcmFtMiA9IChEV09SRClIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZSk7CglpZiAoc2NhLT5kd1BhcmFtMiA9PSAwKSB7CgkgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2NhKTsKCSAgICByZXR1cm4gTUNJRVJSX09VVF9PRl9NRU1PUlk7Cgl9CglzY2EtPmFsbG9jYXRlZENvcHkgPSBUUlVFOwoJLyogY29weSBzdHJ1Y3R1cmUgcGFzc2VkIGJ5IHByb2dyYW0gaW4gZHdQYXJhbTIgdG8gYmUgc3VyZSAKCSAqIHdlIGNhbiBzdGlsbCB1c2UgaXQgd2hhdGV2ZXIgdGhlIHByb2dyYW0gZG9lcyAKCSAqLwoJbWVtY3B5KChMUFZPSUQpc2NhLT5kd1BhcmFtMiwgKExQVk9JRClkd1BhcmFtMiwgc2l6ZSk7CiAgICB9IGVsc2UgewoJc2NhLT5kd1BhcmFtMiA9IGR3UGFyYW0yOwoJc2NhLT5hbGxvY2F0ZWRDb3B5ID0gRkFMU0U7CiAgICB9CgogICAgaWYgKENyZWF0ZVRocmVhZChOVUxMLCAwLCBNQ0lfU0NBU3RhcnRlciwgc2NhLCAwLCBOVUxMKSA9PSAwKSB7CglXQVJOKCJDb3VsZG4ndCBhbGxvY2F0ZSB0aHJlYWQgZm9yIGFzeW5jIGNvbW1hbmQgaGFuZGxpbmcsIHNlbmRpbmcgc3luY2hvbm91c2x5XG4iKTsKCXJldHVybiBNQ0lfU0NBU3RhcnRlcigmc2NhKTsKICAgIH0KICAgIHJldHVybiAwOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qCiAqICAgICAgICAgICAgICAgICAgCSAgICBNQ0kgTUlESSBpbXBsZW1hbnRhdGlvbgkJCSoKICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCnN0YXRpYyBEV09SRCBNSURJX21jaVJlc3VtZShVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9kcnZPcGVuCQkJW2ludGVybmFsXQkKICovCnN0YXRpYwlEV09SRAlNSURJX2Rydk9wZW4oTFBTVFIgc3RyLCBMUE1DSV9PUEVOX0RSSVZFUl9QQVJNU0EgbW9kcCkKewogICAgV0lORV9NQ0lNSURJKgl3bW0gPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKFdJTkVfTUNJTUlESSkpOwoKICAgIGlmICghd21tKQoJcmV0dXJuIDA7CgogICAgd21tLT53RGV2SUQgPSBtb2RwLT53RGV2aWNlSUQ7CiAgICBtY2lTZXREcml2ZXJEYXRhKHdtbS0+d0RldklELCAoRFdPUkQpd21tKTsKICAgIG1vZHAtPndDdXN0b21Db21tYW5kVGFibGUgPSBNQ0lfTk9fQ09NTUFORF9UQUJMRTsKICAgIG1vZHAtPndUeXBlID0gTUNJX0RFVlRZUEVfU0VRVUVOQ0VSOwogICAgcmV0dXJuIG1vZHAtPndEZXZpY2VJRDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNQ0lNSURJX2RydkNsb3NlCQlbaW50ZXJuYWxdCQogKi8Kc3RhdGljCURXT1JECU1JRElfZHJ2Q2xvc2UoRFdPUkQgZHdEZXZJRCkKewogICAgV0lORV9NQ0lNSURJKiAgd21tID0gKFdJTkVfTUNJTUlESSopbWNpR2V0RHJpdmVyRGF0YShkd0RldklEKTsKCiAgICBpZiAod21tKSB7CglIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCB3bW0pOwkKCW1jaVNldERyaXZlckRhdGEoZHdEZXZJRCwgMCk7CglyZXR1cm4gMTsKICAgIH0KICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpR2V0T3BlbkRldgkJW2ludGVybmFsXQkKICovCnN0YXRpYyBXSU5FX01DSU1JREkqICBNSURJX21jaUdldE9wZW5EZXYoVUlOVCB3RGV2SUQpCnsKICAgIFdJTkVfTUNJTUlESSoJd21tID0gKFdJTkVfTUNJTUlESSopbWNpR2V0RHJpdmVyRGF0YSh3RGV2SUQpOwogICAgCiAgICBpZiAod21tID09IE5VTEwgfHwgd21tLT5uVXNlQ291bnQgPT0gMCkgewoJV0FSTigiSW52YWxpZCB3RGV2SUQ9JXVcbiIsIHdEZXZJRCk7CglyZXR1cm4gMDsKICAgIH0KICAgIHJldHVybiB3bW07Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lSZWFkQnl0ZQkJW2ludGVybmFsXQkKICovCnN0YXRpYyBEV09SRCBNSURJX21jaVJlYWRCeXRlKFdJTkVfTUNJTUlESSogd21tLCBCWVRFICpscGJ5dCkKewogICAgRFdPUkQJcmV0ID0gMDsKICAgIAogICAgaWYgKGxwYnl0ID09IE5VTEwgfHwgCgltbWlvUmVhZCh3bW0tPmhGaWxlLCAoSFBTVFIpbHBieXQsIHNpemVvZihCWVRFKSkgIT0gKGxvbmcpc2l6ZW9mKEJZVEUpKSB7CglXQVJOKCJFcnJvciByZWFkaW5nIHdtbT0lcFxuIiwgd21tKTsKCXJldCA9IE1DSUVSUl9JTlZBTElEX0ZJTEU7CiAgICB9CiAgICAKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lSZWFkV29yZAkJW2ludGVybmFsXQkKICovCnN0YXRpYyBEV09SRCBNSURJX21jaVJlYWRXb3JkKFdJTkVfTUNJTUlESSogd21tLCBMUFdPUkQgbHB3KQp7CiAgICBCWVRFCWhpYnl0ZSwgbG9ieXRlOwogICAgRFdPUkQJcmV0ID0gTUNJRVJSX0lOVkFMSURfRklMRTsKICAgIAogICAgaWYgKGxwdyAhPSBOVUxMICYmIAoJTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZoaWJ5dGUpID09IDAgJiYgCglNSURJX21jaVJlYWRCeXRlKHdtbSwgJmxvYnl0ZSkgPT0gMCkgewoJKmxwdyA9ICgoV09SRCloaWJ5dGUgPDwgOCkgKyBsb2J5dGU7CglyZXQgPSAwOwogICAgfQogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVJlYWRMb25nCQlbaW50ZXJuYWxdCQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpUmVhZExvbmcoV0lORV9NQ0lNSURJKiB3bW0sIExQRFdPUkQgbHBkdykKewogICAgV09SRAloaXdvcmQsIGxvd29yZDsKICAgIERXT1JECXJldCA9IE1DSUVSUl9JTlZBTElEX0ZJTEU7CiAgICAKICAgIGlmIChscGR3ICE9IE5VTEwgJiYKCU1JRElfbWNpUmVhZFdvcmQod21tLCAmaGl3b3JkKSA9PSAwICYmCglNSURJX21jaVJlYWRXb3JkKHdtbSwgJmxvd29yZCkgPT0gMCkgewoJKmxwZHcgPSBNQUtFTE9ORyhsb3dvcmQsIGhpd29yZCk7CglyZXQgPSAwOwogICAgfQogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAJCQkJTUlESV9tY2lSZWFkVmFyeUxlbgkJW2ludGVybmFsXQkKICovCnN0YXRpYyBXT1JEIE1JRElfbWNpUmVhZFZhcnlMZW4oV0lORV9NQ0lNSURJKiB3bW0sIExQRFdPUkQgbHBkdykKewogICAgQllURQlieXRlOwogICAgRFdPUkQJdmFsdWUgPSAwOwogICAgV09SRAlyZXQgPSAwOwogICAgCiAgICBpZiAobHBkdyA9PSBOVUxMKSB7CglyZXQgPSBNQ0lFUlJfSU5WQUxJRF9GSUxFOwogICAgfSBlbHNlIHsKCWRvIHsKCSAgICBpZiAoTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZieXRlKSAhPSAwKSB7CgkJcmV0dXJuIDA7CgkgICAgfQoJICAgIHZhbHVlID0gKHZhbHVlIDw8IDcpICsgKGJ5dGUgJiAweDdGKTsKCSAgICByZXQrKzsgCgl9IHdoaWxlIChieXRlICYgMHg4MCk7CgkqbHBkdyA9IHZhbHVlOwoJLyoKCSAgVFJBQ0UoInZhbD0lMDhsWCBcbiIsIHZhbHVlKTsKCSovCiAgICB9CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpUmVhZE5leHRFdmVudAkJW2ludGVybmFsXQkKICovCnN0YXRpYyBEV09SRAlNSURJX21jaVJlYWROZXh0RXZlbnQoV0lORV9NQ0lNSURJKiB3bW0sIE1DSV9NSURJVFJBQ0sqIG1tdCkgCnsKICAgIEJZVEUJYjEsIGIyID0gMCwgYjM7CiAgICBXT1JECWh3ID0gMDsKICAgIERXT1JECWV2dFB1bHNlOwogICAgRFdPUkQJZXZ0TGVuZ3RoOwogICAgRFdPUkQJdG1wOwogICAgCiAgICBpZiAobW1pb1NlZWsod21tLT5oRmlsZSwgbW10LT5kd0luZGV4LCBTRUVLX1NFVCkgIT0gbW10LT5kd0luZGV4KSB7CglXQVJOKCJDYW4ndCBzZWVrIGF0ICUwOGxYIFxuIiwgbW10LT5kd0luZGV4KTsKCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9GSUxFOwogICAgfQogICAgZXZ0TGVuZ3RoID0gTUlESV9tY2lSZWFkVmFyeUxlbih3bW0sICZldnRQdWxzZSkgKyAxOwkvKiA+IDAgKi8KICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmYjEpOwogICAgc3dpdGNoIChiMSkgewogICAgY2FzZSAweEYwOgogICAgY2FzZSAweEY3OgoJZXZ0TGVuZ3RoICs9IE1JRElfbWNpUmVhZFZhcnlMZW4od21tLCAmdG1wKTsKCWV2dExlbmd0aCArPSB0bXA7CglicmVhazsKICAgIGNhc2UgMHhGRjoKCU1JRElfbWNpUmVhZEJ5dGUod21tLCAmYjIpOwlldnRMZW5ndGgrKzsKCQoJZXZ0TGVuZ3RoICs9IE1JRElfbWNpUmVhZFZhcnlMZW4od21tLCAmdG1wKTsKCWlmIChldnRMZW5ndGggPj0gMHgxMDAwMHUpIHsKCSAgICAvKiB0aGlzIGxpbWl0YXRpb24gc2hvdWxkbid0IGJlIGEgcHJvYmxlbSAqLwoJICAgIFdBUk4oIk91Y2ggISEgSW1wbGVtZW50YXRpb24gbGltaXRhdGlvbiB0byA2NGsgYnl0ZXMgZm9yIGEgTUlESSBldmVudCBpcyBvdmVyZmxvd2VkXG4iKTsKCSAgICBodyA9IDB4RkZGRjsKCX0gZWxzZSB7CgkgICAgaHcgPSBMT1dPUkQoZXZ0TGVuZ3RoKTsKCX0KCWV2dExlbmd0aCArPSB0bXA7CglicmVhazsKICAgIGRlZmF1bHQ6CglpZiAoYjEgJiAweDgwKSB7IC8qIHVzZSBydW5uaW5nIHN0YXR1cyA/ICovCgkgICAgbW10LT53TGFzdENvbW1hbmQgPSBiMTsKCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJmIyKTsJZXZ0TGVuZ3RoKys7Cgl9IGVsc2UgewoJICAgIGIyID0gYjE7CgkgICAgYjEgPSBtbXQtPndMYXN0Q29tbWFuZDsKCX0KCXN3aXRjaCAoKGIxID4+IDQpICYgMHgwNykgewoJY2FzZSAwOgljYXNlIDE6CWNhc2UgMjogY2FzZSAzOiBjYXNlIDY6CgkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZiMyk7CWV2dExlbmd0aCsrOwoJICAgIGh3ID0gYjM7CgkgICAgYnJlYWs7CgljYXNlIDQ6CWNhc2UgNToKCSAgICBicmVhazsKCWNhc2UgNzoKCSAgICBXQVJOKCJTdHJhbmdlIGluZGVlZCBiMT0weCUwMnhcbiIsIGIxKTsKCX0KCWJyZWFrOwogICAgfQogICAgaWYgKG1tdC0+ZHdJbmRleCArIGV2dExlbmd0aCA+IG1tdC0+ZHdMYXN0KQoJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKICAgIAogICAgbW10LT5kd0V2ZW50UHVsc2UgKz0gZXZ0UHVsc2U7CiAgICBtbXQtPmR3RXZlbnREYXRhICAgPSAoaHcgPDwgMTYpICsgKGIyIDw8IDgpICsgYjE7CiAgICBtbXQtPndFdmVudExlbmd0aCAgPSBldnRMZW5ndGg7CiAgICAKICAgIC8qCiAgICAgIFRSQUNFKCJbJXVdID0+IHB1bHNlPSUwOGx4KCUwOGx4KSwgZGF0YT0lMDhseCwgbGVuZ3RoPSV1XG4iLCAKICAgICAgbW10LT53VHJhY2tOciwgbW10LT5kd0V2ZW50UHVsc2UsIGV2dFB1bHNlLCAKICAgICAgbW10LT5kd0V2ZW50RGF0YSwgbW10LT53RXZlbnRMZW5ndGgpOwogICAgKi8KICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpUmVhZE1UcmsJCVtpbnRlcm5hbF0JCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lSZWFkTVRyayhXSU5FX01DSU1JREkqIHdtbSwgTUNJX01JRElUUkFDSyogbW10KQp7CiAgICBEV09SRAkJdG9iZXJlYWQ7CiAgICBGT1VSQ0MJCWZvdXJjYzsKICAgIAogICAgaWYgKG1taW9SZWFkKHdtbS0+aEZpbGUsIChIUFNUUikmZm91cmNjLCAobG9uZylzaXplb2YoRk9VUkNDKSkgIT0gCgkobG9uZylzaXplb2YoRk9VUkNDKSkgewoJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0ZJTEU7CiAgICB9CiAgICAKICAgIGlmIChmb3VyY2MgIT0gbW1pb0ZPVVJDQygnTScsICdUJywgJ3InLCAnaycpKSB7CglXQVJOKCJDYW4ndCBzeW5jaHJvbml6ZSBvbiAnTVRyaycgIVxuIik7CglyZXR1cm4gTUNJRVJSX0lOVkFMSURfRklMRTsKICAgIH0KICAgIAogICAgaWYgKE1JRElfbWNpUmVhZExvbmcod21tLCAmdG9iZXJlYWQpICE9IDApIHsKCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9GSUxFOwogICAgfQogICAgbW10LT5kd0ZpcnN0ID0gbW1pb1NlZWsod21tLT5oRmlsZSwgMCwgU0VFS19DVVIpOyAvKiA+PSAwICovCiAgICBtbXQtPmR3TGFzdCA9IG1tdC0+ZHdGaXJzdCArIHRvYmVyZWFkOwogICAgCiAgICAvKiBjb21wdXRlICMgb2YgcHVsc2VzIGluIHRoaXMgdHJhY2sgKi8KICAgIG1tdC0+ZHdJbmRleCA9IG1tdC0+ZHdGaXJzdDsKICAgIG1tdC0+ZHdFdmVudFB1bHNlID0gMDsKICAgIAogICAgd2hpbGUgKE1JRElfbWNpUmVhZE5leHRFdmVudCh3bW0sIG1tdCkgPT0gMCAmJiBMT1dPUkQobW10LT5kd0V2ZW50RGF0YSkgIT0gMHgyRkZGKSB7CgljaGFyCWJ1ZlsxMDI0XTsKCVdPUkQJbGVuOwoKCW1tdC0+ZHdJbmRleCArPSBtbXQtPndFdmVudExlbmd0aDsKCglzd2l0Y2ggKExPV09SRChtbXQtPmR3RXZlbnREYXRhKSkgewoJY2FzZSAweDAyRkY6CgljYXNlIDB4MDNGRjoKCSAgICAvKiBwb3NpdGlvbiBhZnRlciBtZXRhIGRhdGEgaGVhZGVyICovCgkgICAgbW1pb1NlZWsod21tLT5oRmlsZSwgbW10LT5kd0luZGV4ICsgSElXT1JEKG1tdC0+ZHdFdmVudERhdGEpLCBTRUVLX1NFVCk7CgkgICAgbGVuID0gbW10LT53RXZlbnRMZW5ndGggLSBISVdPUkQobW10LT5kd0V2ZW50RGF0YSk7CgkJICAgIAoJICAgIGlmIChsZW4gPj0gc2l6ZW9mKGJ1ZikpIHsKCQlXQVJOKCJCdWZmZXIgZm9yIHRleHQgaXMgdG9vIHNtYWxsICglZCBieXRlcywgd2hlbiAldSBhcmUgbmVlZGVkKVxuIiwgc2l6ZW9mKGJ1ZikgLSAxLCBsZW4pOwoJCWxlbiA9IHNpemVvZihidWYpIC0gMTsKCSAgICB9CgkgICAgaWYgKG1taW9SZWFkKHdtbS0+aEZpbGUsIChIUFNUUilidWYsIGxlbikgPT0gbGVuKSB7CgkJYnVmW2xlbl0gPSAwOwkvKiBlbmQgc3RyaW5nIGluIGNhc2UgKi8KCQlzd2l0Y2ggKEhJQllURShMT1dPUkQobW10LT5kd0V2ZW50RGF0YSkpKSB7CgkJY2FzZSAweDAyOgoJCSAgICBpZiAod21tLT5scHN0ckNvcHlyaWdodCkgewoJCQlXQVJOKCJUd28gY29weXJpZ2h0IG5vdGljZXMgKCVzfCVzKVxuIiwgd21tLT5scHN0ckNvcHlyaWdodCwgYnVmKTsKCQkgICAgfSBlbHNlIHsKCQkJd21tLT5scHN0ckNvcHlyaWdodCA9IEhFQVBfc3RyZHVwQShHZXRQcm9jZXNzSGVhcCgpLCAwLCBidWYpOwoJCSAgICB9CgkJICAgIGJyZWFrOwoJCWNhc2UgMHgwMzoKCQkgICAgaWYgKHdtbS0+bHBzdHJDb3B5cmlnaHQpIHsKCQkJV0FSTigiVHdvIG5hbWVzICglc3wlcylcbiIsIHdtbS0+bHBzdHJOYW1lLCBidWYpOwoJCSAgICB9IGVsc2UgewoJCQl3bW0tPmxwc3RyTmFtZSA9IEhFQVBfc3RyZHVwQShHZXRQcm9jZXNzSGVhcCgpLCAwLCBidWYpOwoJCSAgICB9CgkJICAgIGJyZWFrOwoJCX0KCSAgICB9CgkgICAgYnJlYWs7Cgl9CiAgICB9CiAgICBtbXQtPmR3TGVuZ3RoID0gbW10LT5kd0V2ZW50UHVsc2U7CiAgICAKICAgIFRSQUNFKCJUcmFjayAldSBoYXMgJWx1IGJ5dGVzIGFuZCAlbHUgcHVsc2VzXG4iLCBtbXQtPndUcmFja05yLCB0b2JlcmVhZCwgbW10LT5kd0xlbmd0aCk7CiAgICAKICAgIC8qIHJlc2V0IHRyYWNrIGRhdGEgKi8KICAgIG1tdC0+d1N0YXR1cyA9IDE7CS8qIG9rLCBwbGF5aW5nICovCiAgICBtbXQtPmR3SW5kZXggPSBtbXQtPmR3Rmlyc3Q7CiAgICBtbXQtPmR3RXZlbnRQdWxzZSA9IDA7CiAgICAKICAgIGlmIChtbWlvU2Vlayh3bW0tPmhGaWxlLCAwLCBTRUVLX0NVUikgIT0gbW10LT5kd0xhc3QpIHsKCVdBUk4oIk91Y2gsIG91dCBvZiBzeW5jIHNlZWs9JWx1IHRyYWNrPSVsdVxuIiwgCgkgICAgIG1taW9TZWVrKHdtbS0+aEZpbGUsIDAsIFNFRUtfQ1VSKSwgbW10LT5kd0xhc3QpOwoJLyogcG9zaXRpb24gYXQgZW5kIG9mIHRoaXMgdHJhY2ssIHRvIGJlIHJlYWR5IHRvIHJlYWQgbmV4dCB0cmFjayAqLwoJbW1pb1NlZWsod21tLT5oRmlsZSwgbW10LT5kd0xhc3QsIFNFRUtfU0VUKTsKICAgIH0KICAgIAogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lSZWFkTVRoZAkJW2ludGVybmFsXQkKICovCnN0YXRpYyBEV09SRCBNSURJX21jaVJlYWRNVGhkKFdJTkVfTUNJTUlESSogd21tLCBEV09SRCBkd09mZnNldCkKewogICAgRFdPUkQJdG9iZXJlYWQ7CiAgICBGT1VSQ0MJZm91cmNjOwogICAgV09SRAludDsKICAgIAogICAgVFJBQ0UoIiglcCwgJTA4bFgpO1xuIiwgd21tLCBkd09mZnNldCk7CiAgICAKICAgIGlmIChtbWlvU2Vlayh3bW0tPmhGaWxlLCBkd09mZnNldCwgU0VFS19TRVQpICE9IGR3T2Zmc2V0KSB7CglXQVJOKCJDYW4ndCBzZWVrIGF0ICUwOGxYIGJlZ2luIG9mICdNVGhkJyBcbiIsIGR3T2Zmc2V0KTsKCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9GSUxFOwogICAgfQogICAgaWYgKG1taW9SZWFkKHdtbS0+aEZpbGUsIChIUFNUUikmZm91cmNjLAoJCSAgIChsb25nKSBzaXplb2YoRk9VUkNDKSkgIT0gKGxvbmcpIHNpemVvZihGT1VSQ0MpKQoJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0ZJTEU7CiAgICAKICAgIGlmIChmb3VyY2MgIT0gbW1pb0ZPVVJDQygnTScsICdUJywgJ2gnLCAnZCcpKSB7CglXQVJOKCJDYW4ndCBzeW5jaHJvbml6ZSBvbiAnTVRoZCcgIVxuIik7CglyZXR1cm4gTUNJRVJSX0lOVkFMSURfRklMRTsKICAgIH0KICAgIAogICAgaWYgKE1JRElfbWNpUmVhZExvbmcod21tLCAmdG9iZXJlYWQpICE9IDAgfHwgdG9iZXJlYWQgPCAzICogc2l6ZW9mKFdPUkQpKQoJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0ZJTEU7CiAgICAKICAgIGlmIChNSURJX21jaVJlYWRXb3JkKHdtbSwgJndtbS0+d0Zvcm1hdCkgIT0gMCB8fAoJTUlESV9tY2lSZWFkV29yZCh3bW0sICZ3bW0tPm5UcmFja3MpICE9IDAgfHwKCU1JRElfbWNpUmVhZFdvcmQod21tLCAmd21tLT5uRGl2aXNpb24pICE9IDApIHsKCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9GSUxFOwogICAgfQogICAgCiAgICBUUkFDRSgidG9iZXJlYWQ9MHglMDhsWCwgd0Zvcm1hdD0weCUwNFggblRyYWNrcz0weCUwNFggbkRpdmlzaW9uPTB4JTA0WFxuIiwKCSAgdG9iZXJlYWQsIHdtbS0+d0Zvcm1hdCwgd21tLT5uVHJhY2tzLCB3bW0tPm5EaXZpc2lvbik7CiAgICAKICAgIC8qIE1TIGRvYyBzYXlzIHRoYXQgdGhlIE1JREkgTUNJIHRpbWUgZm9ybWF0IG11c3QgYmUgcHV0IGJ5IGRlZmF1bHQgdG8gdGhlIGZvcm1hdAogICAgICogc3RvcmVkIGluIHRoZSBNSURJIGZpbGUuLi4KICAgICAqLwogICAgaWYgKHdtbS0+bkRpdmlzaW9uID4gMHg4MDAwKSB7CgkvKiBlcmljLnBvdWVjaEBsZW1lbC5mciA5OC8xMQoJICogSW4gZGlkIG5vdCBjaGVjayB0aGlzIHZlcnkgY29kZSAocHVsc2VzIGFyZSBleHByZXNzZWQgYXMgU01QVEUgc3ViLWZyYW1lcykuCgkgKiBJbiBhYm91dCA0MCBNQiBvZiBNSURJIGZpbGVzIEkgaGF2ZSwgbm9uZSB3YXMgU01QVEUgYmFzZWQuLi4KCSAqIEknbSBqdXN0IHdvbmRlcmluZyBpZiB0aGlzIGlzIHdpZGVseSB1c2VkIDotKS4gU28sIGlmIHNvbWVvbmUgaGFzIG9uZSBvZiAKCSAqIHRoZXNlIGZpbGVzLCBJJ2QgbGlrZSB0byBrbm93IGFib3V0LgoJICovCglGSVhNRSgiSGFuZGxpbmcgU01QVEUgdGltZSBpbiBNSURJIGZpbGVzIGhhcyBub3QgYmVlbiB0ZXN0ZWRcbiIKCSAgICAgICJQbGVhc2UgcmVwb3J0IHRvIGNvbXAuZW11bGF0b3JzLm1zLXdpbmRvd3Mud2luZSB3aXRoIE1JREkgZmlsZSAhXG4iKTsKCQoJc3dpdGNoIChISUJZVEUod21tLT5uRGl2aXNpb24pKSB7CgljYXNlIDB4RTg6CXdtbS0+ZHdNY2lUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9TTVBURV8yNDsJYnJlYWs7CS8qIC0yNCAqLwoJY2FzZSAweEU3Ogl3bW0tPmR3TWNpVGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfU01QVEVfMjU7CWJyZWFrOwkvKiAtMjUgKi8KCWNhc2UgMHhFMzoJd21tLT5kd01jaVRpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX1NNUFRFXzMwRFJPUDsJYnJlYWs7CS8qIC0yOSAqLyAvKiBpcyB0aGUgTUNJIGNvbnN0YW50IGNvcnJlY3QgPyAqLwoJY2FzZSAweEUyOgl3bW0tPmR3TWNpVGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfU01QVEVfMzA7CWJyZWFrOwkvKiAtMzAgKi8KCWRlZmF1bHQ6CgkgICAgV0FSTigiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGZyYW1lcyAlZFxuIiwgLShjaGFyKUhJQllURSh3bW0tPm5EaXZpc2lvbikpOwoJICAgIHJldHVybiBNQ0lFUlJfSU5WQUxJRF9GSUxFOwoJfQoJc3dpdGNoIChMT0JZVEUod21tLT5uRGl2aXNpb24pKSB7CgljYXNlIDQ6CS8qIE1JREkgVGltZSBDb2RlICovCgljYXNlIDg6CgljYXNlIDEwOgoJY2FzZSA4MDogLyogU01QVEUgYml0IHJlc29sdXRpb24gKi8KCWNhc2UgMTAwOgoJZGVmYXVsdDoKCSAgICBXQVJOKCJVbnN1cHBvcnRlZCBudW1iZXIgb2Ygc3ViLWZyYW1lcyAlZFxuIiwgTE9CWVRFKHdtbS0+bkRpdmlzaW9uKSk7CgkgICAgcmV0dXJuIE1DSUVSUl9JTlZBTElEX0ZJTEU7Cgl9CiAgICB9IGVsc2UgaWYgKHdtbS0+bkRpdmlzaW9uID09IDApIHsKCVdBUk4oIk51bWJlciBvZiBkaXZpc2lvbiBpcyAwLCBjYW4ndCBzdXBwb3J0IHRoYXQgISFcbiIpOwoJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0ZJTEU7CiAgICB9IGVsc2UgewoJd21tLT5kd01jaVRpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX01JTExJU0VDT05EUzsKICAgIH0KICAgIAogICAgc3dpdGNoICh3bW0tPndGb3JtYXQpIHsKICAgIGNhc2UgMDoKCWlmICh3bW0tPm5UcmFja3MgIT0gMSkgewoJICAgIFdBUk4oIkdvdCB0eXBlIDAgZmlsZSB3aG9zZSBudW1iZXIgb2YgdHJhY2sgaXMgbm90IDEuIFNldHRpbmcgaXQgdG8gMVxuIik7CgkgICAgd21tLT5uVHJhY2tzID0gMTsKCX0KCWJyZWFrOwogICAgY2FzZSAxOgogICAgY2FzZSAyOgoJYnJlYWs7CiAgICBkZWZhdWx0OgoJV0FSTigiSGFuZGxpbmcgTUlESSBmaWxlcyB3aGljaCBmb3JtYXQgPSAlZCBpcyBub3QgKHlldCkgc3VwcG9ydGVkXG4iCgkgICAgICJQbGVhc2UgcmVwb3J0IHdpdGggTUlESSBmaWxlICFcbiIsIHdtbS0+d0Zvcm1hdCk7CglyZXR1cm4gTUNJRVJSX0lOVkFMSURfRklMRTsKICAgIH0KICAgIAogICAgaWYgKHdtbS0+blRyYWNrcyAmIDB4ODAwMCkgewoJLyogdGhpcyBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtLi4uICovCglXQVJOKCJPdWNoICEhIEltcGxlbWVudGF0aW9uIGxpbWl0YXRpb24gdG8gMzJrIHRyYWNrcyBwZXIgTUlESSBmaWxlIGlzIG92ZXJmbG93ZWRcbiIpOwoJd21tLT5uVHJhY2tzID0gMHg3RkZGOwogICAgfQogICAgCiAgICBpZiAoKHdtbS0+dHJhY2tzID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZihNQ0lfTUlESVRSQUNLKSAqIHdtbS0+blRyYWNrcykpID09IE5VTEwpIHsKCXJldHVybiBNQ0lFUlJfT1VUX09GX01FTU9SWTsKICAgIH0KICAgIAogICAgdG9iZXJlYWQgLT0gMyAqIHNpemVvZihXT1JEKTsgCiAgICBpZiAodG9iZXJlYWQgPiAwKSB7CglUUkFDRSgiU2l6ZSBvZiBNVGhkID4gNiwgc2tpcHBpbmcgJWxkIGV4dHJhIGJ5dGVzXG4iLCB0b2JlcmVhZCk7CgltbWlvU2Vlayh3bW0tPmhGaWxlLCB0b2JlcmVhZCwgU0VFS19DVVIpOwogICAgfQogICAgCiAgICBmb3IgKG50ID0gMDsgbnQgPCB3bW0tPm5UcmFja3M7IG50KyspIHsKCXdtbS0+dHJhY2tzW250XS53VHJhY2tOciA9IG50OwoJaWYgKE1JRElfbWNpUmVhZE1Ucmsod21tLCAmd21tLT50cmFja3NbbnRdKSAhPSAwKSB7CgkgICAgV0FSTigiQ2FuJ3QgcmVhZCAnTVRyaycgaGVhZGVyIFxuIik7CgkgICAgcmV0dXJuIE1DSUVSUl9JTlZBTElEX0ZJTEU7Cgl9CiAgICB9CiAgICAKICAgIHdtbS0+ZHdUZW1wbyA9IDUwMDAwMDsKICAgIAogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQlNSURJX0NvbnZlcnRQdWxzZVRvTVMJCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMJRFdPUkQJTUlESV9Db252ZXJ0UHVsc2VUb01TKFdJTkVfTUNJTUlESSogd21tLCBEV09SRCBwdWxzZSkKewogICAgRFdPUkQJcmV0ID0gMDsKICAgIAogICAgLyogRklYTUU6IHRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBmYWxzZSB2YWx1ZXMgc2luY2UgdGhlIHRlbXBvICh3bW0tPmR3VGVtcG8pCiAgICAgKiBtYXkgY2hhbmdlIGR1cmluZyBmaWxlIHBsYXlpbmcKICAgICAqLwogICAgaWYgKHdtbS0+bkRpdmlzaW9uID09IDApIHsKCUZJWE1FKCJTaG91bGRuJ3QgaGFwcGVuLiB3bW0tPm5EaXZpc2lvbiA9IDBcbiIpOwogICAgfSBlbHNlIGlmICh3bW0tPm5EaXZpc2lvbiA+IDB4ODAwMCkgeyAvKiBTTVBURSwgdW5jaGVja2VkIEZJWE1FPyAqLwoJaW50CW5mID0gLShjaGFyKUhJQllURSh3bW0tPm5EaXZpc2lvbik7CS8qIG51bWJlciBvZiBmcmFtZXMgICAgICovCglpbnQJbnNmID0gTE9CWVRFKHdtbS0+bkRpdmlzaW9uKTsJCS8qIG51bWJlciBvZiBzdWItZnJhbWVzICovCglyZXQgPSAocHVsc2UgKiAxMDAwKSAvIChuZiAqIG5zZik7CiAgICB9IGVsc2UgewoJcmV0ID0gKERXT1JEKSgoZG91YmxlKXB1bHNlICogKChkb3VibGUpd21tLT5kd1RlbXBvIC8gMTAwMCkgLwkKCQkgICAgICAoZG91YmxlKXdtbS0+bkRpdmlzaW9uKTsKICAgIH0KICAgIAogICAgLyoKICAgICAgVFJBQ0UoInB1bHNlPSVsdSB0ZW1wbz0lbHUgZGl2aXNpb249JXU9MHglMDR4ID0+IG1zPSVsdVxuIiwgCiAgICAgIHB1bHNlLCB3bW0tPmR3VGVtcG8sIHdtbS0+bkRpdmlzaW9uLCB3bW0tPm5EaXZpc2lvbiwgcmV0KTsKICAgICovCiAgICAKICAgIHJldHVybiByZXQ7Cn0KCiNkZWZpbmUgVElNRV9NU19JTl9PTkVfSE9VUgkoNjAqNjAqMTAwMCkKI2RlZmluZSBUSU1FX01TX0lOX09ORV9NSU5VVEUJKDYwKjEwMDApCiNkZWZpbmUgVElNRV9NU19JTl9PTkVfU0VDT05ECSgxMDAwKQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCU1JRElfQ29udmVydFRpbWVGb3JtYXRUb01TCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMJRFdPUkQJTUlESV9Db252ZXJ0VGltZUZvcm1hdFRvTVMoV0lORV9NQ0lNSURJKiB3bW0sIERXT1JEIHZhbCkKewogICAgRFdPUkQJcmV0ID0gMDsKICAgIAogICAgc3dpdGNoICh3bW0tPmR3TWNpVGltZUZvcm1hdCkgewogICAgY2FzZSBNQ0lfRk9STUFUX01JTExJU0VDT05EUzoJCglyZXQgPSB2YWw7CQkKCWJyZWFrOwogICAgY2FzZSBNQ0lfRk9STUFUX1NNUFRFXzI0OgoJcmV0ID0gCgkgICAgKEhJQllURShISVdPUkQodmFsKSkgKiAxMjUpIC8gMyArICAgICAgICAgICAgIExPQllURShISVdPUkQodmFsKSkgKiBUSU1FX01TX0lOX09ORV9TRUNPTkQgKwoJICAgIEhJQllURShMT1dPUkQodmFsKSkgKiBUSU1FX01TX0lOX09ORV9NSU5VVEUgKyBMT0JZVEUoTE9XT1JEKHZhbCkpICogVElNRV9NU19JTl9PTkVfSE9VUjsKCWJyZWFrOwogICAgY2FzZSBNQ0lfRk9STUFUX1NNUFRFXzI1OgkJCglyZXQgPSAKCSAgICBISUJZVEUoSElXT1JEKHZhbCkpICogNDAgKyAJCSAgCSAgTE9CWVRFKEhJV09SRCh2YWwpKSAqIFRJTUVfTVNfSU5fT05FX1NFQ09ORCArCgkgICAgSElCWVRFKExPV09SRCh2YWwpKSAqIFRJTUVfTVNfSU5fT05FX01JTlVURSArIExPQllURShMT1dPUkQodmFsKSkgKiBUSU1FX01TX0lOX09ORV9IT1VSOwoJYnJlYWs7CiAgICBjYXNlIE1DSV9GT1JNQVRfU01QVEVfMzA6CQkKCXJldCA9IAoJICAgIChISUJZVEUoSElXT1JEKHZhbCkpICogMTAwKSAvIDMgKyAJCSAgTE9CWVRFKEhJV09SRCh2YWwpKSAqIFRJTUVfTVNfSU5fT05FX1NFQ09ORCArCgkgICAgSElCWVRFKExPV09SRCh2YWwpKSAqIFRJTUVfTVNfSU5fT05FX01JTlVURSArIExPQllURShMT1dPUkQodmFsKSkgKiBUSU1FX01TX0lOX09ORV9IT1VSOwoJYnJlYWs7CiAgICBkZWZhdWx0OgoJV0FSTigiQmFkIHRpbWUgZm9ybWF0ICVsdSFcbiIsIHdtbS0+ZHdNY2lUaW1lRm9ybWF0KTsKICAgIH0KICAgIC8qCiAgICAgIFRSQUNFKCJ2YWw9JWx1PTB4JTA4bHggW3RmPSVsdV0gPT4gcmV0PSVsdVxuIiwgdmFsLCB2YWwsIHdtbS0+ZHdNY2lUaW1lRm9ybWF0LCByZXQpOwogICAgKi8KICAgIHJldHVybiByZXQ7Cn0JCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJTUlESV9Db252ZXJ0TVNUb1RpbWVGb3JtYXQJCVtpbnRlcm5hbF0KICovCnN0YXRpYwlEV09SRAlNSURJX0NvbnZlcnRNU1RvVGltZUZvcm1hdChXSU5FX01DSU1JREkqIHdtbSwgRFdPUkQgX3ZhbCkKewogICAgRFdPUkQJcmV0ID0gMCwgdmFsID0gX3ZhbDsKICAgIERXT1JECWgsIG0sIHMsIGY7CiAgICAKICAgIHN3aXRjaCAod21tLT5kd01jaVRpbWVGb3JtYXQpIHsKICAgIGNhc2UgTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM6CQoJcmV0ID0gdmFsOwkJCglicmVhazsKICAgIGNhc2UgTUNJX0ZPUk1BVF9TTVBURV8yNDoKICAgIGNhc2UgTUNJX0ZPUk1BVF9TTVBURV8yNToJCQogICAgY2FzZSBNQ0lfRk9STUFUX1NNUFRFXzMwOgkJCgloID0gdmFsIC8gVElNRV9NU19JTl9PTkVfSE9VUjsJCgltID0gKHZhbCAtPSBoICogVElNRV9NU19JTl9PTkVfSE9VUikgICAvIFRJTUVfTVNfSU5fT05FX01JTlVURTsJCglzID0gKHZhbCAtPSBtICogVElNRV9NU19JTl9PTkVfTUlOVVRFKSAvIFRJTUVfTVNfSU5fT05FX1NFQ09ORDsKCXN3aXRjaCAod21tLT5kd01jaVRpbWVGb3JtYXQpIHsKCWNhc2UgTUNJX0ZPUk1BVF9TTVBURV8yNDoKCSAgICAvKiBvbmUgZnJhbWUgaXMgMTAwMC8yNCB2YWwgbG9uZywgMTAwMC8yNCA9PSAxMjUvMyAqLwoJICAgIGYgPSAodmFsICogMykgLyAxMjU7IAl2YWwgLT0gKGYgKiAxMjUpIC8gMzsKCSAgICBicmVhazsKCWNhc2UgTUNJX0ZPUk1BVF9TTVBURV8yNToJCQoJICAgIC8qIG9uZSBmcmFtZSBpcyAxMDAwLzI1IG1zIGxvbmcsIDEwMDAvMjUgPT0gNDAgKi8KCSAgICBmID0gdmFsIC8gNDA7IAkJdmFsIC09IGYgKiA0MDsKCSAgICBicmVhazsKCWNhc2UgTUNJX0ZPUk1BVF9TTVBURV8zMDoJCQoJICAgIC8qIG9uZSBmcmFtZSBpcyAxMDAwLzMwIG1zIGxvbmcsIDEwMDAvMzAgPT0gMTAwLzMgKi8KCSAgICBmID0gKHZhbCAqIDMpIC8gMTAwOyAJdmFsIC09IChmICogMTAwKSAvIDM7CgkgICAgYnJlYWs7CglkZWZhdWx0OgoJICAgIEZJWE1FKCJUaGVyZSBtdXN0IGJlIHNvbWUgYmFkIGJhZCBwcm9ncmFtbWVyXG4iKTsKCSAgICBmID0gMDsKCX0KCS8qIHZhbCBjb250YWlucyB0aGUgbnVtYmVyIG9mIG1zIHdoaWNoIGNhbm5vdCBtYWtlIGEgY29tcGxldGUgZnJhbWUgKi8KCS8qIEZJWE1FOiBpcyB0aGlzIGNvcnJlY3QgPyBwcm9ncmFtcyBzZWVtIHRvIGJlIGhhcHB5IHdpdGggdGhhdCAqLwoJcmV0ID0gKGYgPDwgMjQpIHwgKHMgPDwgMTYpIHwgKG0gPDwgOCkgfCAoaCA8PCAwKTsKCWJyZWFrOwogICAgZGVmYXVsdDoKCVdBUk4oIkJhZCB0aW1lIGZvcm1hdCAlbHUhXG4iLCB3bW0tPmR3TWNpVGltZUZvcm1hdCk7CiAgICB9CiAgICAvKgogICAgICBUUkFDRSgidmFsPSVsdSBbdGY9JWx1XSA9PiByZXQ9JWx1PTB4JTA4bHhcbiIsIF92YWwsIHdtbS0+ZHdNY2lUaW1lRm9ybWF0LCByZXQsIHJldCk7CiAgICAqLwogICAgcmV0dXJuIHJldDsKfQkKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQlNSURJX0dldE1UaGRMZW5ndGhNUwkJCVtpbnRlcm5hbF0KICovCnN0YXRpYwlEV09SRAlNSURJX0dldE1UaGRMZW5ndGhNUyhXSU5FX01DSU1JREkqIHdtbSkKewogICAgV09SRAludDsKICAgIERXT1JECXJldCA9IDA7CiAgICAKICAgIGZvciAobnQgPSAwOyBudCA8IHdtbS0+blRyYWNrczsgbnQrKykgewoJaWYgKHdtbS0+d0Zvcm1hdCA9PSAyKSB7CgkgICAgcmV0ICs9IHdtbS0+dHJhY2tzW250XS5kd0xlbmd0aDsKCX0gZWxzZSBpZiAod21tLT50cmFja3NbbnRdLmR3TGVuZ3RoID4gcmV0KSB7CgkgICAgcmV0ID0gd21tLT50cmFja3NbbnRdLmR3TGVuZ3RoOwoJfQogICAgfQogICAgLyogRklYTUU6IHRoaXMgaXMgd3JvbmcgaWYgdGhlcmUgaXMgYSB0ZW1wbyBjaGFuZ2UgaW5zaWRlIHRoZSBmaWxlICovCiAgICByZXR1cm4gTUlESV9Db252ZXJ0UHVsc2VUb01TKHdtbSwgcmV0KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaU9wZW4JCQlbaW50ZXJuYWxdCQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpT3BlbihVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfT1BFTl9QQVJNU0EgbHBQYXJtcykKewogICAgRFdPUkQJCWR3UmV0ID0gMDsKICAgIERXT1JECQlkd0RldmljZUlEOwogICAgV0lORV9NQ0lNSURJKgl3bW0gPSAoV0lORV9NQ0lNSURJKiltY2lHZXREcml2ZXJEYXRhKHdEZXZJRCk7CiAgICAKICAgIFRSQUNFKCIoJTA0eCwgJTA4bFgsICVwKVxuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKICAgIAogICAgaWYgKGxwUGFybXMgPT0gTlVMTCkgCXJldHVybiBNQ0lFUlJfTlVMTF9QQVJBTUVURVJfQkxPQ0s7CiAgICBpZiAod21tID09IE5VTEwpCQlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfT1BFTl9TSEFSRUFCTEUpCglyZXR1cm4gTUNJRVJSX0hBUkRXQVJFOwoKICAgIGlmICh3bW0tPm5Vc2VDb3VudCA+IDApIHsKCS8qIFRoZSBkcml2ZXIgaXMgYWxyZWFkeSBvcGVuZWQgb24gdGhpcyBjaGFubmVsCgkgKiBNSURJIHNlcXVlbmNlciBjYW5ub3QgYmUgc2hhcmVkCgkgKi8KCXJldHVybiBNQ0lFUlJfREVWSUNFX09QRU47CiAgICB9CiAgICB3bW0tPm5Vc2VDb3VudCsrOwogICAgCiAgICB3bW0tPmhGaWxlID0gMDsKICAgIHdtbS0+aE1pZGkgPSAwOwogICAgZHdEZXZpY2VJRCA9IGxwUGFybXMtPndEZXZpY2VJRDsKICAgIAogICAgVFJBQ0UoIndEZXZJRD0lMDRYIChscFBhcmFtcy0+d0RldmljZUlEPSUwOGxYKVxuIiwgd0RldklELCBkd0RldmljZUlEKTsKICAgIC8qCWxwUGFybXMtPndEZXZpY2VJRCA9IHdEZXZJRDsqLwogICAgCiAgICBpZiAoZHdGbGFncyAmIE1DSV9PUEVOX0VMRU1FTlQpIHsKCVRSQUNFKCJNQ0lfT1BFTl9FTEVNRU5UICclcycgIVxuIiwgbHBQYXJtcy0+bHBzdHJFbGVtZW50TmFtZSk7CglpZiAobHBQYXJtcy0+bHBzdHJFbGVtZW50TmFtZSAmJiBzdHJsZW4obHBQYXJtcy0+bHBzdHJFbGVtZW50TmFtZSkgPiAwKSB7CgkgICAgd21tLT5oRmlsZSA9IG1taW9PcGVuQShscFBhcm1zLT5scHN0ckVsZW1lbnROYW1lLCBOVUxMLCAKCQkJCSAgIE1NSU9fQUxMT0NCVUYgfCBNTUlPX1JFQUQgfCBNTUlPX0RFTllXUklURSk7CgkgICAgaWYgKHdtbS0+aEZpbGUgPT0gMCkgewoJCVdBUk4oIkNhbid0IGZpbmQgZmlsZSAnJXMnICFcbiIsIGxwUGFybXMtPmxwc3RyRWxlbWVudE5hbWUpOwoJCXdtbS0+blVzZUNvdW50LS07CgkJcmV0dXJuIE1DSUVSUl9GSUxFX05PVF9GT1VORDsKCSAgICB9Cgl9IGVsc2UgewoJICAgIHdtbS0+aEZpbGUgPSAwOwoJfQogICAgfQogICAgVFJBQ0UoImhGaWxlPSV1XG4iLCB3bW0tPmhGaWxlKTsKICAgIAogICAgLyogRklYTUU6IHNob3VsZCBJIGdldCBhIHN0cmR1cCgpIG9mIGl0IGluc3RlYWQ/ICovCiAgICB3bW0tPmxwc3RyRWxlbWVudE5hbWUgPSBIRUFQX3N0cmR1cEEoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHBQYXJtcy0+bHBzdHJFbGVtZW50TmFtZSk7CiAgICB3bW0tPmxwc3RyQ29weXJpZ2h0ID0gTlVMTDsKICAgIHdtbS0+bHBzdHJOYW1lID0gTlVMTDsKCiAgICB3bW0tPndOb3RpZnlEZXZpY2VJRCA9IGR3RGV2aWNlSUQ7CiAgICB3bW0tPmR3U3RhdHVzID0gTUNJX01PREVfTk9UX1JFQURZOwkvKiB3aGlsZSBsb2FkaW5nIGZpbGUgY29udGVudHMgKi8KICAgIC8qIHNwZWMgc2F5cyBpdCBzaG91bGQgYmUgdGhlIGRlZmF1bHQgZm9ybWF0IGZyb20gdGhlIE1JREkgZmlsZS4uLiAqLwogICAgd21tLT5kd01jaVRpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX01JTExJU0VDT05EUzsKICAgIAogICAgaWYgKHdtbS0+aEZpbGUgIT0gMCkgewoJTU1DS0lORk8JY2tNYWluUklGRjsKCU1NQ0tJTkZPCW1tY2tJbmZvOwoJRFdPUkQJCWR3T2Zmc2V0ID0gMDsKCQoJaWYgKG1taW9EZXNjZW5kKHdtbS0+aEZpbGUsICZja01haW5SSUZGLCBOVUxMLCAwKSAhPSAwKSB7CgkgICAgZHdSZXQgPSBNQ0lFUlJfSU5WQUxJRF9GSUxFOwoJfSBlbHNlIHsKCSAgICBUUkFDRSgiUGFyZW50Q2h1bmsgY2tpZD0lLjRzIGZjY1R5cGU9JS40cyBja3NpemU9JTA4bFggXG4iLAoJCSAgKExQU1RSKSZja01haW5SSUZGLmNraWQsIChMUFNUUikmY2tNYWluUklGRi5mY2NUeXBlLCBja01haW5SSUZGLmNrc2l6ZSk7CgkgICAgCgkgICAgaWYgKGNrTWFpblJJRkYuY2tpZCA9PSBGT1VSQ0NfUklGRiAmJiBja01haW5SSUZGLmZjY1R5cGUgPT0gbW1pb0ZPVVJDQygnUicsICdNJywgJ0knLCAnRCcpKSB7CgkJbW1ja0luZm8uY2tpZCA9IG1taW9GT1VSQ0MoJ2QnLCAnYScsICd0JywgJ2EnKTsKCQltbWlvU2Vlayh3bW0tPmhGaWxlLCBja01haW5SSUZGLmR3RGF0YU9mZnNldCArICgoY2tNYWluUklGRi5ja3NpemUgKyAxKSAmIH4xKSwgU0VFS19TRVQpOwoJCWlmIChtbWlvRGVzY2VuZCh3bW0tPmhGaWxlLCAmbW1ja0luZm8sICZja01haW5SSUZGLCBNTUlPX0ZJTkRDSFVOSykgPT0gMCkgewoJCSAgICBUUkFDRSgiLi4uIGlzIGEgJ1JNSUQnIGZpbGUgXG4iKTsKCQkgICAgZHdPZmZzZXQgPSBtbWNrSW5mby5kd0RhdGFPZmZzZXQ7CgkJfSBlbHNlIHsKCQkgICAgZHdSZXQgPSBNQ0lFUlJfSU5WQUxJRF9GSUxFOwoJCX0KCSAgICB9CgkgICAgaWYgKGR3UmV0ID09IDAgJiYgTUlESV9tY2lSZWFkTVRoZCh3bW0sIGR3T2Zmc2V0KSAhPSAwKSB7CgkJV0FSTigiQ2FuJ3QgcmVhZCAnTVRoZCcgaGVhZGVyIFxuIik7CgkJZHdSZXQgPSBNQ0lFUlJfSU5WQUxJRF9GSUxFOwoJICAgIH0KCX0KICAgIH0gZWxzZSB7CglUUkFDRSgiaEZpbGU9PTAsIHNldHRpbmcgI3RyYWNrcyB0byAwOyBpcyB0aGlzIGNvcnJlY3QgP1xuIik7Cgl3bW0tPm5UcmFja3MgPSAwOwoJd21tLT53Rm9ybWF0ID0gMDsKCXdtbS0+bkRpdmlzaW9uID0gMTsKICAgIH0KICAgIGlmIChkd1JldCAhPSAwKSB7Cgl3bW0tPm5Vc2VDb3VudC0tOwoJaWYgKHdtbS0+aEZpbGUgIT0gMCkKCSAgICBtbWlvQ2xvc2Uod21tLT5oRmlsZSwgMCk7Cgl3bW0tPmhGaWxlID0gMDsKICAgIH0gZWxzZSB7Cgl3bW0tPmR3UG9zaXRpb25NUyA9IDA7Cgl3bW0tPmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKICAgIH0KICAgIHJldHVybiBkd1JldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVN0b3AJCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lTdG9wKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCnsgICAgCiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfbWNpR2V0T3BlbkRldih3RGV2SUQpOwogICAgCiAgICBUUkFDRSgiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogICAgCiAgICBpZiAod21tID09IE5VTEwpCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfSUQ7CiAgICAKICAgIGlmICh3bW0tPmR3U3RhdHVzICE9IE1DSV9NT0RFX1NUT1ApIHsKCXdtbS0+ZHdTdGF0dXMgPSBNQ0lfTU9ERV9TVE9QOwoJbWlkaU91dENsb3NlKHdtbS0+aE1pZGkpOwogICAgfQogICAgVFJBQ0UoIndtbS0+ZHdTdGF0dXM9JWRcbiIsIHdtbS0+ZHdTdGF0dXMpOyAgICAKCiAgICBpZiAobHBQYXJtcyAmJiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpKSB7CglUUkFDRSgiTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOwoJbWNpRHJpdmVyTm90aWZ5KChIV05EKUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCgkJCXdtbS0+d05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lDbG9zZQkJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRCBNSURJX21jaUNsb3NlKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCnsKICAgIFdJTkVfTUNJTUlESSoJd21tID0gTUlESV9tY2lHZXRPcGVuRGV2KHdEZXZJRCk7CiAgICAKICAgIFRSQUNFKCIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAgICAKICAgIGlmICh3bW0gPT0gTlVMTCkJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKICAgIAogICAgaWYgKHdtbS0+ZHdTdGF0dXMgIT0gTUNJX01PREVfU1RPUCkgewoJTUlESV9tY2lTdG9wKHdEZXZJRCwgTUNJX1dBSVQsIGxwUGFybXMpOwogICAgfQogICAgCiAgICB3bW0tPmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKICAgIHdtbS0+blVzZUNvdW50LS07CiAgICBpZiAod21tLT5uVXNlQ291bnQgPT0gMCkgewoJaWYgKHdtbS0+aEZpbGUgIT0gMCkgewoJICAgIG1taW9DbG9zZSh3bW0tPmhGaWxlLCAwKTsKCSAgICB3bW0tPmhGaWxlID0gMDsKCSAgICBUUkFDRSgiaEZpbGUgY2xvc2VkICFcbiIpOwoJfQoJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgd21tLT50cmFja3MpOwoJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKExQU1RSKXdtbS0+bHBzdHJFbGVtZW50TmFtZSk7CglIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCAoTFBTVFIpd21tLT5scHN0ckNvcHlyaWdodCk7CglIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCAoTFBTVFIpd21tLT5scHN0ck5hbWUpOwogICAgfSBlbHNlIHsKCVRSQUNFKCJTaG91bGRuJ3QgaGFwcGVuLi4uIG5Vc2VDb3VudD0lZFxuIiwgd21tLT5uVXNlQ291bnQpOwoJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKICAgIH0KICAgIAogICAgaWYgKGxwUGFybXMgJiYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSkgewoJVFJBQ0UoIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKCW1jaURyaXZlck5vdGlmeSgoSFdORClMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAoJCQl3bW0tPndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKICAgIH0KICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpRmluZE5leHRFdmVudAkJW2ludGVybmFsXQogKi8Kc3RhdGljIE1DSV9NSURJVFJBQ0sqCU1JRElfbWNpRmluZE5leHRFdmVudChXSU5FX01DSU1JREkqIHdtbSwgTFBEV09SRCBoaVB1bHNlKSAKewogICAgV09SRAkJY250LCBudDsKICAgIE1DSV9NSURJVFJBQ0sqCW1tdDsKICAgIAogICAgKmhpUHVsc2UgPSAweEZGRkZGRkZGdWw7CiAgICBjbnQgPSAweEZGRkZ1OwogICAgZm9yIChudCA9IDA7IG50IDwgd21tLT5uVHJhY2tzOyBudCsrKSB7CgltbXQgPSAmd21tLT50cmFja3NbbnRdOwoJCglpZiAobW10LT53U3RhdHVzID09IDApCgkgICAgY29udGludWU7CglpZiAobW10LT5kd0V2ZW50UHVsc2UgPCAqaGlQdWxzZSkgewoJICAgICpoaVB1bHNlID0gbW10LT5kd0V2ZW50UHVsc2U7CgkgICAgY250ID0gbnQ7Cgl9CiAgICB9CiAgICByZXR1cm4gKGNudCA9PSAweEZGRkZ1KSA/IDAgLyogbm8gbW9yZSBldmVudCBvbiBhbGwgdHJhY2tzICovCgk6ICZ3bW0tPnRyYWNrc1tjbnRdOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpUGxheQkJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRCBNSURJX21jaVBsYXkoVUlOVCB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1BMQVlfUEFSTVMgbHBQYXJtcykKewogICAgRFdPUkQJCWR3U3RhcnRNUywgZHdFbmRNUywgZHdSZXQ7CiAgICBXT1JECQlkb1BsYXksIG50OwogICAgTUNJX01JRElUUkFDSyoJbW10OwogICAgRFdPUkQJCWhpUHVsc2U7CiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfbWNpR2V0T3BlbkRldih3RGV2SUQpOwogICAgCiAgICBUUkFDRSgiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogICAgCiAgICBpZiAod21tID09IE5VTEwpCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfSUQ7CiAgICAKICAgIGlmICh3bW0tPmhGaWxlID09IDApIHsKCVdBUk4oIkNhbid0IHBsYXk6IG5vIGZpbGUgJyVzJyAhXG4iLCB3bW0tPmxwc3RyRWxlbWVudE5hbWUpOwoJcmV0dXJuIE1DSUVSUl9GSUxFX05PVF9GT1VORDsKICAgIH0KICAgIAogICAgaWYgKHdtbS0+ZHdTdGF0dXMgIT0gTUNJX01PREVfU1RPUCkgewoJaWYgKHdtbS0+ZHdTdGF0dXMgPT0gTUNJX01PREVfUEFVU0UpIHsKCSAgICAvKiBGSVhNRTogcGFyYW1ldGVycyAoc3RhcnQvZW5kKSBpbiBscFBhcmFtcyBtYXkgbm90IGJlIHVzZWQgKi8KCSAgICByZXR1cm4gTUlESV9tY2lSZXN1bWUod0RldklELCBkd0ZsYWdzLCAoTFBNQ0lfR0VORVJJQ19QQVJNUylscFBhcm1zKTsKCX0KCVdBUk4oIkNhbid0IHBsYXk6IGRldmljZSBpcyBub3Qgc3RvcHBlZCAhXG4iKTsKCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAgICB9CiAgICAKICAgIGlmICghKGR3RmxhZ3MgJiBNQ0lfV0FJVCkpIHsJCgkvKiogRklYTUU6IEknbSBub3QgMTAwJSBzdXJlIHRoYXQgd05vdGlmeURldmljZUlEIGlzIHRoZSByaWdodCB2YWx1ZSBpbiBhbGwgY2FzZXMgPz8/ICovCglyZXR1cm4gTUNJX1NlbmRDb21tYW5kQXN5bmMod21tLT53Tm90aWZ5RGV2aWNlSUQsIE1DSV9QTEFZLCBkd0ZsYWdzLCAoRFdPUkQpbHBQYXJtcywgc2l6ZW9mKExQTUNJX1BMQVlfUEFSTVMpKTsKICAgIH0KICAgIAogICAgaWYgKGxwUGFybXMgJiYgKGR3RmxhZ3MgJiBNQ0lfRlJPTSkpIHsKCWR3U3RhcnRNUyA9IE1JRElfQ29udmVydFRpbWVGb3JtYXRUb01TKHdtbSwgbHBQYXJtcy0+ZHdGcm9tKTsgCiAgICB9IGVsc2UgewoJZHdTdGFydE1TID0gd21tLT5kd1Bvc2l0aW9uTVM7CiAgICB9CiAgICAKICAgIGlmIChscFBhcm1zICYmIChkd0ZsYWdzICYgTUNJX1RPKSkgewoJZHdFbmRNUyA9IE1JRElfQ29udmVydFRpbWVGb3JtYXRUb01TKHdtbSwgbHBQYXJtcy0+ZHdUbyk7CiAgICB9IGVsc2UgewoJZHdFbmRNUyA9IDB4RkZGRkZGRkZ1bDsKICAgIH0KICAgIAogICAgVFJBQ0UoIlBsYXlpbmcgZnJvbSAlbHUgdG8gJWx1XG4iLCBkd1N0YXJ0TVMsIGR3RW5kTVMpOwogICAgCiAgICAvKiBpbml0IHRyYWNrcyAqLwogICAgZm9yIChudCA9IDA7IG50IDwgd21tLT5uVHJhY2tzOyBudCsrKSB7CgltbXQgPSAmd21tLT50cmFja3NbbnRdOwoJCgltbXQtPndTdGF0dXMgPSAxOwkvKiBvaywgcGxheWluZyAqLwoJbW10LT5kd0luZGV4ID0gbW10LT5kd0ZpcnN0OwoJaWYgKHdtbS0+d0Zvcm1hdCA9PSAyICYmIG50ID4gMCkgewoJICAgIG1tdC0+ZHdFdmVudFB1bHNlID0gd21tLT50cmFja3NbbnQgLSAxXS5kd0xlbmd0aDsKCX0gZWxzZSB7CgkgICAgbW10LT5kd0V2ZW50UHVsc2UgPSAwOwoJfQoJTUlESV9tY2lSZWFkTmV4dEV2ZW50KHdtbSwgbW10KTsgLyogRklYTUUgPT0gMCAqLwogICAgfQogICAgCiAgICB3bW0tPmR3UHVsc2UgPSAwOwogICAgd21tLT5kd1RlbXBvID0gNTAwMDAwOwogICAgd21tLT5kd1N0YXR1cyA9IE1DSV9NT0RFX1BMQVk7CiAgICB3bW0tPmR3UG9zaXRpb25NUyA9IDA7CiAgICB3bW0tPndTdGFydGVkUGxheWluZyA9IEZBTFNFOwogICAgCiAgICBkd1JldCA9IG1pZGlPdXRPcGVuKCZ3bW0tPmhNaWRpLCBNSURJTUFQUEVSLCAwTCwgMEwsIENBTExCQUNLX05VTEwpOwogICAgLyoJZHdSZXQgPSBtaWRpSW5PcGVuKCZ3bW0tPmhNaWRpLCBNSURJTUFQUEVSLCAwTCwgMEwsIENBTExCQUNLX05VTEwpOyovCgogICAgd2hpbGUgKHdtbS0+ZHdTdGF0dXMgIT0gTUNJX01PREVfU1RPUCkgewoJLyogaXQgc2VlbXMgdGhhdCBpbiBjYXNlIG9mIG11bHRpLXRocmVhZGluZywgZ2NjIGlzIG9wdGltaXppbmcganVzdCBhIGxpdHRsZSBiaXQgCgkgKiB0b28gbXVjaC4gVGVsbCBnY2Mgbm90IHRvIG9wdGltaXplIHN0YXR1cyB2YWx1ZSB1c2luZyB2b2xhdGlsZS4gCgkgKi8KCXdoaWxlICgoKHZvbGF0aWxlIFdJTkVfTUNJTUlESSopd21tKS0+ZHdTdGF0dXMgPT0gTUNJX01PREVfUEFVU0UpOwoJCglkb1BsYXkgPSAod21tLT5kd1Bvc2l0aW9uTVMgPj0gZHdTdGFydE1TICYmIHdtbS0+ZHdQb3NpdGlvbk1TIDw9IGR3RW5kTVMpOwoJCglUUkFDRSgid21tLT5kd1N0YXR1cz0lZCwgZG9QbGF5PSVjXG4iLCB3bW0tPmR3U3RhdHVzLCBkb1BsYXkgPyAnVCcgOiAnRicpOwoJCglpZiAoKG1tdCA9IE1JRElfbWNpRmluZE5leHRFdmVudCh3bW0sICZoaVB1bHNlKSkgPT0gTlVMTCkKCSAgICBicmVhazsgIC8qIG5vIG1vcmUgZXZlbnQgb24gdHJhY2tzICovCgkKCS8qIGlmIHN0YXJ0aW5nIHBsYXlpbmcsIHRoZW4gc2V0IFN0YXJ0VGlja3MgdG8gdGhlIHZhbHVlIGl0IHdvdWxkIGhhdmUgaGFkCgkgKiBpZiBwbGF5IGhhZCBzdGFydGVkIGF0IHBvc2l0aW9uIDAKCSAqLwoJaWYgKGRvUGxheSAmJiAhd21tLT53U3RhcnRlZFBsYXlpbmcpIHsKCSAgICB3bW0tPmR3U3RhcnRUaWNrcyA9IEdldFRpY2tDb3VudCgpIC0gTUlESV9Db252ZXJ0UHVsc2VUb01TKHdtbSwgd21tLT5kd1B1bHNlKTsKCSAgICB3bW0tPndTdGFydGVkUGxheWluZyA9IFRSVUU7CgkgICAgVFJBQ0UoIlNldHRpbmcgZHdTdGFydFRpY2tzIHRvICVsdVxuIiwgd21tLT5kd1N0YXJ0VGlja3MpOwoJfQoJCglpZiAoaGlQdWxzZSA+IHdtbS0+ZHdQdWxzZSkgewoJICAgIHdtbS0+ZHdQb3NpdGlvbk1TICs9IE1JRElfQ29udmVydFB1bHNlVG9NUyh3bW0sIGhpUHVsc2UgLSB3bW0tPmR3UHVsc2UpOwoJICAgIGlmIChkb1BsYXkpIHsKCQlEV09SRAl0b2dvID0gd21tLT5kd1N0YXJ0VGlja3MgKyB3bW0tPmR3UG9zaXRpb25NUzsKCQlEV09SRAl0YyA9IEdldFRpY2tDb3VudCgpOwoJCQoJCVRSQUNFKCJQdWxzZXMgaGk9MHglMDhseCA8PiBjdXI9MHglMDhseFxuIiwgaGlQdWxzZSwgd21tLT5kd1B1bHNlKTsKCQlUUkFDRSgiV2FpdCB1bnRpbCAlbHUgPT4gJWx1IG1zXG4iLCAJCgkJICAgICAgdGMgLSB3bW0tPmR3U3RhcnRUaWNrcywgdG9nbyAtIHdtbS0+ZHdTdGFydFRpY2tzKTsKCQlpZiAodGMgPCB0b2dvKQkKCQkgICAgU2xlZXAodG9nbyAtIHRjKTsKCSAgICB9CgkgICAgd21tLT5kd1B1bHNlID0gaGlQdWxzZTsKCX0KCQoJc3dpdGNoIChMT0JZVEUoTE9XT1JEKG1tdC0+ZHdFdmVudERhdGEpKSkgewoJY2FzZSAweEYwOgoJY2FzZSAweEY3OgkvKiBzeXNleCBldmVudHMgKi8KCSAgICB7CgkJRklYTUUoIk5vdCBoYW5kbGluZyBTeXNFeCBldmVudHMgKHlldClcbiIpOwoJICAgIH0KCSAgICBicmVhazsKCWNhc2UgMHhGRjoKCSAgICAvKiBwb3NpdGlvbiBhZnRlciBtZXRhIGRhdGEgaGVhZGVyICovCgkgICAgbW1pb1NlZWsod21tLT5oRmlsZSwgbW10LT5kd0luZGV4ICsgSElXT1JEKG1tdC0+ZHdFdmVudERhdGEpLCBTRUVLX1NFVCk7CgkgICAgc3dpdGNoIChISUJZVEUoTE9XT1JEKG1tdC0+ZHdFdmVudERhdGEpKSkgewoJICAgIGNhc2UgMHgwMDogLyogMTYtYml0IHNlcXVlbmNlIG51bWJlciAqLwoJCWlmIChUUkFDRV9PTihtY2ltaWRpKSkgewoJCSAgICBXT1JECXR3ZDsKCQkgICAgCgkJICAgIE1JRElfbWNpUmVhZFdvcmQod21tLCAmdHdkKTsJLyogPT0gMCAqLwoJCSAgICBUUkFDRSgiR290IHNlcXVlbmNlIG51bWJlciAldVxuIiwgdHdkKTsKCQl9CgkJYnJlYWs7CgkgICAgY2FzZSAweDAxOiAvKiBhbnkgdGV4dCAqLwoJICAgIGNhc2UgMHgwMjogLyogQ29weXJpZ2h0IE1lc3NhZ2UgdGV4dCAqLwoJICAgIGNhc2UgMHgwMzogLyogU2VxdWVuY2UvVHJhY2sgTmFtZSB0ZXh0ICovCgkgICAgY2FzZSAweDA0OiAvKiBJbnN0cnVtZW50IE5hbWUgdGV4dCAqLwoJICAgIGNhc2UgMHgwNTogLyogTHlyaWMgdGV4dCAqLwoJICAgIGNhc2UgMHgwNjogLyogTWFya2VyIHRleHQgKi8KCSAgICBjYXNlIDB4MDc6IC8qIEN1ZS1wb2ludCB0ZXh0ICovCgkJaWYgKFRSQUNFX09OKG1jaW1pZGkpKSB7CgkJICAgIGNoYXIJYnVmWzEwMjRdOwoJCSAgICBXT1JECWxlbiA9IG1tdC0+d0V2ZW50TGVuZ3RoIC0gSElXT1JEKG1tdC0+ZHdFdmVudERhdGEpOwoJCSAgICBzdGF0aWMJY2hhcioJaW5mb1s4XSA9IHsiIiwgIlRleHQiLCAiQ29weXJpZ2h0IiwgIlNlcS9UcmsgbmFtZSIsIAoJCQkJCQkgICAiSW5zdHJ1bWVudCIsICJMeXJpYyIsICJNYXJrZXIiLCAiQ3VlLXBvaW50In07CgkJICAgIFdPUkQJaWR4ID0gSElCWVRFKExPV09SRChtbXQtPmR3RXZlbnREYXRhKSk7CgkJICAgIAoJCSAgICBpZiAobGVuID49IHNpemVvZihidWYpKSB7CgkJCVdBUk4oIkJ1ZmZlciBmb3IgdGV4dCBpcyB0b28gc21hbGwgKCVkIGJ5dGVzLCB3aGVuICV1IGFyZSBuZWVkZWQpXG4iLCBzaXplb2YoYnVmKSAtIDEsIGxlbik7CgkJCWxlbiA9IHNpemVvZihidWYpIC0gMTsKCQkgICAgfQoJCSAgICBpZiAobW1pb1JlYWQod21tLT5oRmlsZSwgKEhQU1RSKWJ1ZiwgbGVuKSA9PSBsZW4pIHsKCQkJYnVmW2xlbl0gPSAwOwkvKiBlbmQgc3RyaW5nIGluIGNhc2UgKi8KCQkJVFJBQ0UoIiVzID0+IFwiJXNcIlxuIiwgKGlkeCA8IDggKSA/IGluZm9baWR4XSA6ICIiLCBidWYpOwoJCSAgICB9IGVsc2UgewoJCQlXQVJOKCJDb3VsZG4ndCByZWFkIGRhdGEgZm9yICVzXG4iLCAoaWR4IDwgOCkgPyBpbmZvW2lkeF0gOiAiIik7CgkJICAgIH0KCQl9CgkJYnJlYWs7CgkgICAgY2FzZSAweDIwOiAKCQkvKiBNSURJIGNoYW5uZWwgKGNjKSAqLwoJCWlmIChGSVhNRV9PTihtY2ltaWRpKSkgewoJCSAgICBCWVRFCWJ0OwoJCSAgICAKCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZidCk7CS8qID09IDAgKi8KCQkgICAgRklYTUUoIk5JWTogTUlESSBjaGFubmVsPSV1LCB0cmFjaz0ldVxuIiwgYnQsIG1tdC0+d1RyYWNrTnIpOwoJCX0KCQlicmVhazsKCSAgICBjYXNlIDB4MjE6CgkJLyogTUlESSBwb3J0IChwcCkgKi8KCQlpZiAoRklYTUVfT04obWNpbWlkaSkpIHsKCQkgICAgQllURQlidDsKCQkgICAgCgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmYnQpOwkvKiA9PSAwICovCgkJICAgIEZJWE1FKCJOSVk6IE1JREkgcG9ydD0ldSwgdHJhY2s9JXVcbiIsIGJ0LCBtbXQtPndUcmFja05yKTsKCQl9CgkJYnJlYWs7CgkgICAgY2FzZSAweDJGOiAvKiBlbmQgb2YgdHJhY2sgKi8KCQltbXQtPndTdGF0dXMgPSAwOwoJCWJyZWFrOwoJICAgIGNhc2UgMHg1MTovKiBzZXQgdGVtcG8gKi8KCQkvKiBUZW1wbyBpcyBleHByZXNzZWQgaW4gtS1zZWNvbmRzIHBlciBtaWRpIHF1YXJ0ZXIgbm90ZQoJCSAqIGZvciBmb3JtYXQgMSBNSURJIGZpbGVzLCB0aGlzIGNhbiBvbmx5IGJlIHByZXNlbnQgb24gdHJhY2sgIzAKCQkgKi8KCQlpZiAobW10LT53VHJhY2tOciAhPSAwICYmIHdtbS0+d0Zvcm1hdCA9PSAxKSB7CgkJICAgIFdBUk4oIkZvciBmb3JtYXQgIzEgTUlESSBmaWxlcywgdGVtcG8gY2FuIG9ubHkgYmUgY2hhbmdlZCBvbiB0cmFjayAjMCAoJXUpXG4iLCBtbXQtPndUcmFja05yKTsKCQl9IGVsc2UgeyAKCQkgICAgQllURQl0YnQ7CgkJICAgIERXT1JECXZhbHVlID0gMDsKCQkgICAgCgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmdGJ0KTsJdmFsdWUgID0gKChEV09SRCl0YnQpIDw8IDE2OwoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJnRidCk7CXZhbHVlIHw9ICgoRFdPUkQpdGJ0KSA8PCA4OwoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJnRidCk7CXZhbHVlIHw9ICgoRFdPUkQpdGJ0KSA8PCAwOwoJCSAgICBUUkFDRSgiU2V0dGluZyB0ZW1wbyB0byAlbGQgKEJQTT0lbGQpXG4iLCB3bW0tPmR3VGVtcG8sICh2YWx1ZSkgPyAoNjAwMDAwMDBsIC8gdmFsdWUpIDogMCk7CgkJICAgIHdtbS0+ZHdUZW1wbyA9IHZhbHVlOwoJCX0KCQlicmVhazsKCSAgICBjYXNlIDB4NTQ6IC8qIChob3VyKSAobWluKSAoc2Vjb25kKSAoZnJhbWUpIChmcmFjdGlvbmFsLWZyYW1lKSAtIFNNUFRFIHRyYWNrIHN0YXJ0ICovCgkJaWYgKG1tdC0+d1RyYWNrTnIgIT0gMCAmJiB3bW0tPndGb3JtYXQgPT0gMSkgewoJCSAgICBXQVJOKCJGb3IgZm9ybWF0ICMxIE1JREkgZmlsZXMsIFNNUFRFIHRyYWNrIHN0YXJ0IGNhbiBvbmx5IGJlIGV4cHJlc3NlZCBvbiB0cmFjayAjMCAoJXUpXG4iLCBtbXQtPndUcmFja05yKTsKCQl9IGlmIChtbXQtPmR3RXZlbnRQdWxzZSAhPSAwKSB7CgkJICAgIFdBUk4oIlNNUFRFIHRyYWNrIHN0YXJ0IGNhbiBvbmx5IGJlIGV4cHJlc3NlZCBhdCBzdGFydCBvZiB0cmFjayAoJWx1KVxuIiwgbW10LT5kd0V2ZW50UHVsc2UpOwoJCX0gZWxzZSB7CgkJICAgIEJZVEUJaCwgbSwgcywgZiwgZmY7CgkJICAgIAoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJmgpOwoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJm0pOwoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJnMpOwoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJmYpOwoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJmZmKTsKCQkgICAgRklYTUUoIk5JWTogU01QVEUgdHJhY2sgc3RhcnQgJXU6JXU6JXUgJXUuJXVcbiIsIGgsIG0sIHMsIGYsIGZmKTsKCQl9CgkJYnJlYWs7CgkgICAgY2FzZSAweDU4OiAvKiBmaWxlIHJ5dGhtICovCgkJaWYgKFRSQUNFX09OKG1jaW1pZGkpKSB7CgkJICAgIEJZVEUJbnVtLCBkZW4sIGNwbWMsIF8zMm5wcW47CgkJICAgIAoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJm51bSk7CQoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJmRlbik7CQkvKiB0byBub3RhdGUgZS5nLiA2LzggKi8KCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZjcG1jKTsJCS8qIG51bWJlciBvZiBNSURJIGNsb2NrcyBwZXIgbWV0cm9ub21lIGNsaWNrICovIAoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJl8zMm5wcW4pOwkJLyogbnVtYmVyIG9mIG5vdGF0ZWQgMzJuZCBub3RlcyBwZXIgTUlESSBxdWFydGVyIG5vdGUgKi8KCQkgICAgCgkJICAgIFRSQUNFKCIldS8ldSwgY2xvY2sgcGVyIG1ldHJvbm9tZSBjbGljaz0ldSwgMzJuZCBub3RlcyBieSAxLzQgbm90ZT0ldVxuIiwgbnVtLCAxIDw8IGRlbiwgY3BtYywgXzMybnBxbik7CgkJfQoJCWJyZWFrOwoJICAgIGNhc2UgMHg1OTogLyoga2V5IHNpZ25hdHVyZSAqLwoJCWlmIChUUkFDRV9PTihtY2ltaWRpKSkgewoJCSAgICBCWVRFCXNmLCBtbTsKCQkgICAgCgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmc2YpOwkJCgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmbW0pOwkKCQkgICAgCgkJICAgIGlmIChzZiA+PSAweDgwKSAJVFJBQ0UoIiVkIGZsYXRzXG4iLCAtKGNoYXIpc2YpOwkgCgkJICAgIGVsc2UgaWYgKHNmID4gMCkgCVRSQUNFKCIlZCBzaGFycHNcbiIsIChjaGFyKXNmKTsJIAoJCSAgICBlbHNlIAkJVFJBQ0UoIktleSBvZiBDXG4iKTsKCQkgICAgVFJBQ0UoIk1vZGU6ICVzXG4iLCAobW0gPSAwKSA/ICJtYWpvciIgOiAibWlub3IiKTsKCQl9CgkJYnJlYWs7CgkgICAgZGVmYXVsdDoKCQlXQVJOKCJVbmtub3duIE1JREkgbWV0YSBldmVudCAlMDJ4LiBTa2lwcGluZy4uLlxuIiwgSElCWVRFKExPV09SRChtbXQtPmR3RXZlbnREYXRhKSkpOwoJCWJyZWFrOwoJICAgIH0KCSAgICBicmVhazsKCWRlZmF1bHQ6CgkgICAgaWYgKGRvUGxheSkgewoJCWR3UmV0ID0gbWlkaU91dFNob3J0TXNnKHdtbS0+aE1pZGksIG1tdC0+ZHdFdmVudERhdGEpOwoJICAgIH0gZWxzZSB7CgkJc3dpdGNoIChMT0JZVEUoTE9XT1JEKG1tdC0+ZHdFdmVudERhdGEpKSAmIDB4RjApIHsKCQljYXNlIE1JRElfTk9URU9OOgoJCWNhc2UgTUlESV9OT1RFT0ZGOgoJCSAgICBkd1JldCA9IDA7CQoJCSAgICBicmVhazsKCQlkZWZhdWx0OgoJCSAgICBkd1JldCA9IG1pZGlPdXRTaG9ydE1zZyh3bW0tPmhNaWRpLCBtbXQtPmR3RXZlbnREYXRhKTsKCQl9CgkgICAgfQoJfQoJbW10LT5kd0luZGV4ICs9IG1tdC0+d0V2ZW50TGVuZ3RoOwoJaWYgKG1tdC0+ZHdJbmRleCA8IG1tdC0+ZHdGaXJzdCB8fCBtbXQtPmR3SW5kZXggPj0gbW10LT5kd0xhc3QpIHsKCSAgICBtbXQtPndTdGF0dXMgPSAwOwoJfSAKCWlmIChtbXQtPndTdGF0dXMpIHsJCgkgICAgTUlESV9tY2lSZWFkTmV4dEV2ZW50KHdtbSwgbW10KTsKCX0KICAgIH0KICAgIAogICAgbWlkaU91dFJlc2V0KHdtbS0+aE1pZGkpOwogICAgCiAgICBkd1JldCA9IG1pZGlPdXRDbG9zZSh3bW0tPmhNaWRpKTsKICAgIHdtbS0+ZHdTdGF0dXMgPSBNQ0lfTU9ERV9TVE9QOwogICAgCiAgICAvKiB0byByZXN0YXJ0IHBsYXlpbmcgYXQgYmVnaW5uaW5nIHdoZW4gaXQncyBvdmVyICovCiAgICB3bW0tPmR3UG9zaXRpb25NUyA9IDA7CiAgICAKICAgIGlmIChscFBhcm1zICYmIChkd0ZsYWdzICYgTUNJX05PVElGWSkpIHsKCVRSQUNFKCJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CgltY2lEcml2ZXJOb3RpZnkoKEhXTkQpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKCQkJd21tLT53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVJlY29yZAkJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRCBNSURJX21jaVJlY29yZChVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfUkVDT1JEX1BBUk1TIGxwUGFybXMpCnsKICAgIGludAkJCXN0YXJ0LCBlbmQ7CiAgICBNSURJSERSCQltaWRpSGRyOwogICAgRFdPUkQJCWR3UmV0OwogICAgV0lORV9NQ0lNSURJKgl3bW0gPSBNSURJX21jaUdldE9wZW5EZXYod0RldklEKTsKICAgIAogICAgVFJBQ0UoIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKICAgIAogICAgaWYgKHdtbSA9PSAwKQlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwogICAgCiAgICBpZiAod21tLT5oRmlsZSA9PSAwKSB7CglXQVJOKCJDYW4ndCBmaW5kIGZpbGU9JyVzJyAhXG4iLCB3bW0tPmxwc3RyRWxlbWVudE5hbWUpOwoJcmV0dXJuIE1DSUVSUl9GSUxFX05PVF9GT1VORDsKICAgIH0KICAgIHN0YXJ0ID0gMTsgCQllbmQgPSA5OTk5OTsKICAgIGlmIChscFBhcm1zICYmIChkd0ZsYWdzICYgTUNJX0ZST00pKSB7CglzdGFydCA9IGxwUGFybXMtPmR3RnJvbTsgCglUUkFDRSgiTUNJX0ZST009JWQgXG4iLCBzdGFydCk7CiAgICB9CiAgICBpZiAobHBQYXJtcyAmJiAoZHdGbGFncyAmIE1DSV9UTykpIHsKCWVuZCA9IGxwUGFybXMtPmR3VG87CglUUkFDRSgiTUNJX1RPPSVkIFxuIiwgZW5kKTsKICAgIH0KICAgIG1pZGlIZHIubHBEYXRhID0gKExQU1RSKSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgMTIwMCk7CiAgICBpZiAoIW1pZGlIZHIubHBEYXRhKQoJcmV0dXJuIE1DSUVSUl9PVVRfT0ZfTUVNT1JZOwogICAgbWlkaUhkci5kd0J1ZmZlckxlbmd0aCA9IDEwMjQ7CiAgICBtaWRpSGRyLmR3VXNlciA9IDBMOwogICAgbWlkaUhkci5kd0ZsYWdzID0gMEw7CiAgICBkd1JldCA9IG1pZGlJblByZXBhcmVIZWFkZXIod21tLT5oTWlkaSwgJm1pZGlIZHIsIHNpemVvZihNSURJSERSKSk7CiAgICBUUkFDRSgiQWZ0ZXIgTUlETV9QUkVQQVJFIFxuIik7CiAgICB3bW0tPmR3U3RhdHVzID0gTUNJX01PREVfUkVDT1JEOwogICAgLyogRklYTUU6IHRoZXJlIGlzIG5vIGJ1ZmZlciBhZGRlZCAqLwogICAgd2hpbGUgKHdtbS0+ZHdTdGF0dXMgIT0gTUNJX01PREVfU1RPUCkgewoJVFJBQ0UoIndtbS0+ZHdTdGF0dXM9JXAgJWRcbiIsCgkgICAgICAmd21tLT5kd1N0YXR1cywgd21tLT5kd1N0YXR1cyk7CgltaWRpSGRyLmR3Qnl0ZXNSZWNvcmRlZCA9IDA7Cglkd1JldCA9IG1pZGlJblN0YXJ0KHdtbS0+aE1pZGkpOwoJVFJBQ0UoIm1pZGlJblN0YXJ0ID0+IGR3Qnl0ZXNSZWNvcmRlZD0lbHVcbiIsIG1pZGlIZHIuZHdCeXRlc1JlY29yZGVkKTsKCWlmIChtaWRpSGRyLmR3Qnl0ZXNSZWNvcmRlZCA9PSAwKSBicmVhazsKICAgIH0KICAgIFRSQUNFKCJCZWZvcmUgTUlETV9VTlBSRVBBUkUgXG4iKTsKICAgIGR3UmV0ID0gbWlkaUluVW5wcmVwYXJlSGVhZGVyKHdtbS0+aE1pZGksICZtaWRpSGRyLCBzaXplb2YoTUlESUhEUikpOwogICAgVFJBQ0UoIkFmdGVyIE1JRE1fVU5QUkVQQVJFIFxuIik7CiAgICBpZiAobWlkaUhkci5scERhdGEgIT0gTlVMTCkgewoJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbWlkaUhkci5scERhdGEpOwoJbWlkaUhkci5scERhdGEgPSBOVUxMOwogICAgfQogICAgd21tLT5kd1N0YXR1cyA9IE1DSV9NT0RFX1NUT1A7CiAgICBpZiAobHBQYXJtcyAmJiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpKSB7CglUUkFDRSgiTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOwoJbWNpRHJpdmVyTm90aWZ5KChIV05EKUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCgkJCXdtbS0+d05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lQYXVzZQkJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRCBNSURJX21jaVBhdXNlKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCnsKICAgIFdJTkVfTUNJTUlESSoJd21tID0gTUlESV9tY2lHZXRPcGVuRGV2KHdEZXZJRCk7CiAgICAKICAgIFRSQUNFKCIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAgICAKICAgIGlmICh3bW0gPT0gTlVMTCkJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKICAgIAogICAgaWYgKHdtbS0+ZHdTdGF0dXMgPT0gTUNJX01PREVfUExBWSkgewoJLyogc3RvcCBhbGwgbm90ZXMgKi8KCXVuc2lnbmVkIGNobjsKCWZvciAoY2huID0gMDsgY2huIDwgMTY7IGNobisrKQoJICAgIG1pZGlPdXRTaG9ydE1zZyh3bW0tPmhNaWRpLCAweDc4QjAgfCBjaG4pOwoJd21tLT5kd1N0YXR1cyA9IE1DSV9NT0RFX1BBVVNFOwogICAgfSAKICAgIGlmIChscFBhcm1zICYmIChkd0ZsYWdzICYgTUNJX05PVElGWSkpIHsKCVRSQUNFKCJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CgltY2lEcml2ZXJOb3RpZnkoKEhXTkQpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKCQkJd21tLT53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAgICB9CiAgICAKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpUmVzdW1lCQkJW2ludGVybmFsXQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpUmVzdW1lKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCnsKICAgIFdJTkVfTUNJTUlESSoJd21tID0gTUlESV9tY2lHZXRPcGVuRGV2KHdEZXZJRCk7CiAgICAKICAgIFRSQUNFKCIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAgICAKICAgIGlmICh3bW0gPT0gTlVMTCkJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKICAgIAogICAgaWYgKHdtbS0+ZHdTdGF0dXMgPT0gTUNJX01PREVfUEFVU0UpIHsKCXdtbS0+d1N0YXJ0ZWRQbGF5aW5nID0gRkFMU0U7Cgl3bW0tPmR3U3RhdHVzID0gTUNJX01PREVfUExBWTsKICAgIH0gCiAgICBpZiAobHBQYXJtcyAmJiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpKSB7CglUUkFDRSgiTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOwoJbWNpRHJpdmVyTm90aWZ5KChIV05EKUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCgkJCXdtbS0+d05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lTZXQJCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lTZXQoVUlOVCB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1NFVF9QQVJNUyBscFBhcm1zKQp7CiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfbWNpR2V0T3BlbkRldih3RGV2SUQpOwogICAgCiAgICBUUkFDRSgiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogICAgCiAgICBpZiAobHBQYXJtcyA9PSBOVUxMKQlyZXR1cm4gTUNJRVJSX05VTExfUEFSQU1FVEVSX0JMT0NLOwogICAgaWYgKHdtbSA9PSBOVUxMKQkJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKICAgIAogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX1RJTUVfRk9STUFUKSB7Cglzd2l0Y2ggKGxwUGFybXMtPmR3VGltZUZvcm1hdCkgewoJY2FzZSBNQ0lfRk9STUFUX01JTExJU0VDT05EUzoKCSAgICBUUkFDRSgiTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFMgIVxuIik7CgkgICAgd21tLT5kd01jaVRpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX01JTExJU0VDT05EUzsKCSAgICBicmVhazsKCWNhc2UgTUNJX0ZPUk1BVF9TTVBURV8yNDoKCSAgICBUUkFDRSgiTUNJX0ZPUk1BVF9TTVBURV8yNCAhXG4iKTsKCSAgICB3bW0tPmR3TWNpVGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfU01QVEVfMjQ7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9GT1JNQVRfU01QVEVfMjU6CgkgICAgVFJBQ0UoIk1DSV9GT1JNQVRfU01QVEVfMjUgIVxuIik7CgkgICAgd21tLT5kd01jaVRpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX1NNUFRFXzI1OwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfRk9STUFUX1NNUFRFXzMwOgoJICAgIFRSQUNFKCJNQ0lfRk9STUFUX1NNUFRFXzMwICFcbiIpOwoJICAgIHdtbS0+ZHdNY2lUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9TTVBURV8zMDsKCSAgICBicmVhazsKCWRlZmF1bHQ6CgkgICAgV0FSTigiQmFkIHRpbWUgZm9ybWF0ICVsdSFcbiIsIGxwUGFybXMtPmR3VGltZUZvcm1hdCk7CgkgICAgcmV0dXJuIE1DSUVSUl9CQURfVElNRV9GT1JNQVQ7Cgl9CiAgICB9CiAgICBpZiAoZHdGbGFncyAmIE1DSV9TRVRfVklERU8pIHsKCVRSQUNFKCJObyBzdXBwb3J0IGZvciB2aWRlbyAhXG4iKTsKCXJldHVybiBNQ0lFUlJfVU5TVVBQT1JURURfRlVOQ1RJT047CiAgICB9CiAgICBpZiAoZHdGbGFncyAmIE1DSV9TRVRfRE9PUl9PUEVOKSB7CglUUkFDRSgiTm8gc3VwcG9ydCBmb3IgZG9vciBvcGVuICFcbiIpOwoJcmV0dXJuIE1DSUVSUl9VTlNVUFBPUlRFRF9GVU5DVElPTjsKICAgIH0KICAgIGlmIChkd0ZsYWdzICYgTUNJX1NFVF9ET09SX0NMT1NFRCkgewoJVFJBQ0UoIk5vIHN1cHBvcnQgZm9yIGRvb3IgY2xvc2UgIVxuIik7CglyZXR1cm4gTUNJRVJSX1VOU1VQUE9SVEVEX0ZVTkNUSU9OOwogICAgfQogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX0FVRElPKSB7CglpZiAoZHdGbGFncyAmIE1DSV9TRVRfT04pIHsKCSAgICBUUkFDRSgiTUNJX1NFVF9PTiBhdWRpbyAhXG4iKTsKCX0gZWxzZSBpZiAoZHdGbGFncyAmIE1DSV9TRVRfT0ZGKSB7CgkgICAgVFJBQ0UoIk1DSV9TRVRfT0ZGIGF1ZGlvICFcbiIpOwoJfSBlbHNlIHsKCSAgICBXQVJOKCJNQ0lfU0VUX0FVRElPIHdpdGhvdXQgU0VUX09OIG9yIFNFVF9PRkZcbiIpOwoJICAgIHJldHVybiBNQ0lFUlJfQkFEX0lOVEVHRVI7Cgl9CgkKCWlmIChscFBhcm1zLT5kd0F1ZGlvICYgTUNJX1NFVF9BVURJT19BTEwpCgkgICAgVFJBQ0UoIk1DSV9TRVRfQVVESU9fQUxMICFcbiIpOwoJaWYgKGxwUGFybXMtPmR3QXVkaW8gJiBNQ0lfU0VUX0FVRElPX0xFRlQpCgkgICAgVFJBQ0UoIk1DSV9TRVRfQVVESU9fTEVGVCAhXG4iKTsKCWlmIChscFBhcm1zLT5kd0F1ZGlvICYgTUNJX1NFVF9BVURJT19SSUdIVCkKCSAgICBUUkFDRSgiTUNJX1NFVF9BVURJT19SSUdIVCAhXG4iKTsKICAgIH0KICAgIAogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VRX1NFVF9NQVNURVIpCglUUkFDRSgiTUNJX1NFUV9TRVRfTUFTVEVSICFcbiIpOwogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VRX1NFVF9TTEFWRSkKCVRSQUNFKCJNQ0lfU0VRX1NFVF9TTEFWRSAhXG4iKTsKICAgIGlmIChkd0ZsYWdzICYgTUNJX1NFUV9TRVRfT0ZGU0VUKQoJVFJBQ0UoIk1DSV9TRVFfU0VUX09GRlNFVCAhXG4iKTsKICAgIGlmIChkd0ZsYWdzICYgTUNJX1NFUV9TRVRfUE9SVCkKCVRSQUNFKCJNQ0lfU0VRX1NFVF9QT1JUICFcbiIpOwogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VRX1NFVF9URU1QTykKCVRSQUNFKCJNQ0lfU0VRX1NFVF9URU1QTyAhXG4iKTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpU3RhdHVzCQkJW2ludGVybmFsXQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpU3RhdHVzKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9TVEFUVVNfUEFSTVMgbHBQYXJtcykKewogICAgV0lORV9NQ0lNSURJKgl3bW0gPSBNSURJX21jaUdldE9wZW5EZXYod0RldklEKTsKICAgIERXT1JECQlyZXQgPSAwOwoKICAgIFRSQUNFKCIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAgICAKICAgIGlmIChscFBhcm1zID09IE5VTEwpIAlyZXR1cm4gTUNJRVJSX05VTExfUEFSQU1FVEVSX0JMT0NLOwogICAgaWYgKHdtbSA9PSBOVUxMKQkJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKICAgIAogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU1RBVFVTX0lURU0pIHsKCXN3aXRjaCAobHBQYXJtcy0+ZHdJdGVtKSB7CgljYXNlIE1DSV9TVEFUVVNfQ1VSUkVOVF9UUkFDSzoKCSAgICAvKiBGSVhNRSBpbiBGb3JtYXQgMiAqLwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gMTsKCSAgICBUUkFDRSgiTUNJX1NUQVRVU19DVVJSRU5UX1RSQUNLID0+ICVsdVxuIiwgbHBQYXJtcy0+ZHdSZXR1cm4pOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfU1RBVFVTX0xFTkdUSDoKCSAgICBpZiAoKGR3RmxhZ3MgJiBNQ0lfVFJBQ0spICYmIHdtbS0+d0Zvcm1hdCA9PSAyKSB7CgkJaWYgKGxwUGFybXMtPmR3VHJhY2sgPj0gd21tLT5uVHJhY2tzKQoJCSAgICByZXR1cm4gTUNJRVJSX0JBRF9JTlRFR0VSOwoJCS8qIEZJWE1FOiB0aGlzIGlzIHdyb25nIGlmIHRoZXJlIGlzIGEgdGVtcG8gY2hhbmdlIGluc2lkZSB0aGUgZmlsZSAqLwoJCWxwUGFybXMtPmR3UmV0dXJuID0gTUlESV9Db252ZXJ0UHVsc2VUb01TKHdtbSwgd21tLT50cmFja3NbbHBQYXJtcy0+ZHdUcmFja10uZHdMZW5ndGgpOwoJICAgIH0gZWxzZSB7CgkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBNSURJX0dldE1UaGRMZW5ndGhNUyh3bW0pOwoJICAgIH0KCSAgICBscFBhcm1zLT5kd1JldHVybiA9IE1JRElfQ29udmVydE1TVG9UaW1lRm9ybWF0KHdtbSwgbHBQYXJtcy0+ZHdSZXR1cm4pOwoJICAgIFRSQUNFKCJNQ0lfU1RBVFVTX0xFTkdUSCA9PiAlbHVcbiIsIGxwUGFybXMtPmR3UmV0dXJuKTsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NUQVRVU19NT0RFOgoJICAgIFRSQUNFKCJNQ0lfU1RBVFVTX01PREUgPT4gJXVcbiIsIHdtbS0+ZHdTdGF0dXMpOwogCSAgICBscFBhcm1zLT5kd1JldHVybiA9IE1BS0VNQ0lSRVNPVVJDRSh3bW0tPmR3U3RhdHVzLCB3bW0tPmR3U3RhdHVzKTsKCSAgICByZXQgPSBNQ0lfUkVTT1VSQ0VfUkVUVVJORUQ7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TVEFUVVNfTUVESUFfUFJFU0VOVDoKCSAgICBUUkFDRSgiTUNJX1NUQVRVU19NRURJQV9QUkVTRU5UID0+IFRSVUVcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gTUFLRU1DSVJFU09VUkNFKFRSVUUsIE1DSV9UUlVFKTsKCSAgICByZXQgPSBNQ0lfUkVTT1VSQ0VfUkVUVVJORUQ7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TVEFUVVNfTlVNQkVSX09GX1RSQUNLUzoKCSAgICBscFBhcm1zLT5kd1JldHVybiA9ICh3bW0tPndGb3JtYXQgPT0gMikgPyB3bW0tPm5UcmFja3MgOiAxOwoJICAgIFRSQUNFKCJNQ0lfU1RBVFVTX05VTUJFUl9PRl9UUkFDS1MgPT4gJWx1XG4iLCBscFBhcm1zLT5kd1JldHVybik7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TVEFUVVNfUE9TSVRJT046CgkgICAgLyogRklYTUU6IGRvIEkgbmVlZCB0byB1c2UgTUNJX1RSQUNLID8gKi8KCSAgICBscFBhcm1zLT5kd1JldHVybiA9IE1JRElfQ29udmVydE1TVG9UaW1lRm9ybWF0KHdtbSwgCgkJCQkJCQkgICAoZHdGbGFncyAmIE1DSV9TVEFUVVNfU1RBUlQpID8gMCA6IHdtbS0+ZHdQb3NpdGlvbk1TKTsKCSAgICBUUkFDRSgiTUNJX1NUQVRVU19QT1NJVElPTiAlcyA9PiAlbHVcbiIsIAoJCSAgKGR3RmxhZ3MgJiBNQ0lfU1RBVFVTX1NUQVJUKSA/ICJzdGFydCIgOiAiY3VycmVudCIsIGxwUGFybXMtPmR3UmV0dXJuKTsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NUQVRVU19SRUFEWToKCSAgICBscFBhcm1zLT5kd1JldHVybiA9ICh3bW0tPmR3U3RhdHVzID09IE1DSV9NT0RFX05PVF9SRUFEWSkgPwoJCU1BS0VNQ0lSRVNPVVJDRShGQUxTRSwgTUNJX0ZBTFNFKSA6IE1BS0VNQ0lSRVNPVVJDRShUUlVFLCBNQ0lfVFJVRSk7CgkgICAgcmV0ID0gTUNJX1JFU09VUkNFX1JFVFVSTkVEOwoJICAgIFRSQUNFKCJNQ0lfU1RBVFVTX1JFQURZID0gJXVcbiIsIExPV09SRChscFBhcm1zLT5kd1JldHVybikpOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfU1RBVFVTX1RJTUVfRk9STUFUOgoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gTUFLRU1DSVJFU09VUkNFKHdtbS0+ZHdNY2lUaW1lRm9ybWF0LCB3bW0tPmR3TWNpVGltZUZvcm1hdCk7CgkgICAgVFJBQ0UoIk1DSV9TVEFUVVNfVElNRV9GT1JNQVQgPT4gJXVcbiIsIExPV09SRChscFBhcm1zLT5kd1JldHVybikpOwoJICAgIHJldCA9IE1DSV9SRVNPVVJDRV9SRVRVUk5FRDsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NFUV9TVEFUVVNfRElWVFlQRToKCSAgICBUUkFDRSgiTUNJX1NFUV9TVEFUVVNfRElWVFlQRSAhXG4iKTsKCSAgICBpZiAod21tLT5uRGl2aXNpb24gPiAweDgwMDApIHsKCQlzd2l0Y2ggKHdtbS0+bkRpdmlzaW9uKSB7CgkJY2FzZSAweEU4OglscFBhcm1zLT5kd1JldHVybiA9IE1DSV9TRVFfRElWX1NNUFRFXzI0OwlicmVhazsJLyogLTI0ICovCgkJY2FzZSAweEU3OglscFBhcm1zLT5kd1JldHVybiA9IE1DSV9TRVFfRElWX1NNUFRFXzI1OwlicmVhazsJLyogLTI1ICovCgkJY2FzZSAweEUzOglscFBhcm1zLT5kd1JldHVybiA9IE1DSV9TRVFfRElWX1NNUFRFXzMwRFJPUDsJYnJlYWs7CS8qIC0yOSAqLyAvKiBpcyB0aGUgTUNJIGNvbnN0YW50IGNvcnJlY3QgPyAqLwoJCWNhc2UgMHhFMjoJbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQ0lfU0VRX0RJVl9TTVBURV8zMDsJYnJlYWs7CS8qIC0zMCAqLwoJCWRlZmF1bHQ6CUZJWE1FKCJUaGVyZSBpcyBhIGJhZCBiYWQgcHJvZ3JhbW1lclxuIik7CgkJfQoJICAgIH0gZWxzZSB7CgkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQ0lfU0VRX0RJVl9QUFFOOwoJICAgIH0KCSAgICBscFBhcm1zLT5kd1JldHVybiA9IE1BS0VNQ0lSRVNPVVJDRShscFBhcm1zLT5kd1JldHVybixscFBhcm1zLT5kd1JldHVybik7CgkgICAgcmV0ID0gTUNJX1JFU09VUkNFX1JFVFVSTkVEOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfU0VRX1NUQVRVU19NQVNURVI6CgkgICAgVFJBQ0UoIk1DSV9TRVFfU1RBVFVTX01BU1RFUiAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IDA7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TRVFfU1RBVFVTX1NMQVZFOgoJICAgIFRSQUNFKCJNQ0lfU0VRX1NUQVRVU19TTEFWRSAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IDA7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TRVFfU1RBVFVTX09GRlNFVDoKCSAgICBUUkFDRSgiTUNJX1NFUV9TVEFUVVNfT0ZGU0VUICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gMDsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NFUV9TVEFUVVNfUE9SVDoKCSAgICBUUkFDRSgiTUNJX1NFUV9TVEFUVVNfUE9SVCAoJXUpIVxuIiwgd21tLT53RGV2SUQpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gd21tLT53RGV2SUQ7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TRVFfU1RBVFVTX1RFTVBPOgoJICAgIFRSQUNFKCJNQ0lfU0VRX1NUQVRVU19URU1QTyAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IHdtbS0+ZHdUZW1wbzsKCSAgICBicmVhazsKCWRlZmF1bHQ6CgkgICAgRklYTUUoIlVua25vd20gY29tbWFuZCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0l0ZW0pOwoJICAgIHJldHVybiBNQ0lFUlJfVU5SRUNPR05JWkVEX0NPTU1BTkQ7Cgl9CiAgICB9IGVsc2UgewoJV0FSTigiTm8gU3RhdHVzLUl0ZW0hXG4iKTsKCXJldHVybiBNQ0lFUlJfVU5SRUNPR05JWkVEX0NPTU1BTkQ7CiAgICB9CiAgICBpZiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpIHsKCVRSQUNFKCJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CgltY2lEcml2ZXJOb3RpZnkoKEhXTkQpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKCQkJd21tLT53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAgICB9CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpR2V0RGV2Q2FwcwkJW2ludGVybmFsXQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpR2V0RGV2Q2FwcyhVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgCgkJCQlMUE1DSV9HRVRERVZDQVBTX1BBUk1TIGxwUGFybXMpCnsKICAgIFdJTkVfTUNJTUlESSoJd21tID0gTUlESV9tY2lHZXRPcGVuRGV2KHdEZXZJRCk7CiAgICBEV09SRAkJcmV0OwoKICAgIFRSQUNFKCIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAgICAKICAgIGlmIChscFBhcm1zID09IE5VTEwpIAlyZXR1cm4gTUNJRVJSX05VTExfUEFSQU1FVEVSX0JMT0NLOwogICAgaWYgKHdtbSA9PSBOVUxMKQkJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKICAgIAogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfR0VUREVWQ0FQU19JVEVNKSB7Cglzd2l0Y2ggKGxwUGFybXMtPmR3SXRlbSkgewoJY2FzZSBNQ0lfR0VUREVWQ0FQU19ERVZJQ0VfVFlQRToKCSAgICBUUkFDRSgiTUNJX0dFVERFVkNBUFNfREVWSUNFX1RZUEUgIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQUtFTUNJUkVTT1VSQ0UoTUNJX0RFVlRZUEVfU0VRVUVOQ0VSLCBNQ0lfREVWVFlQRV9TRVFVRU5DRVIpOwoJICAgIHJldCA9IE1DSV9SRVNPVVJDRV9SRVRVUk5FRDsKCSAgICBicmVhazsKCWNhc2UgTUNJX0dFVERFVkNBUFNfSEFTX0FVRElPOgoJICAgIFRSQUNFKCJNQ0lfR0VUREVWQ0FQU19IQVNfQVVESU8gIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQUtFTUNJUkVTT1VSQ0UoVFJVRSwgTUNJX1RSVUUpOwoJICAgIHJldCA9IE1DSV9SRVNPVVJDRV9SRVRVUk5FRDsKCSAgICBicmVhazsKCWNhc2UgTUNJX0dFVERFVkNBUFNfSEFTX1ZJREVPOgoJICAgIFRSQUNFKCJNQ0lfR0VUREVWQ0FQU19IQVNfVklERU8gIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQUtFTUNJUkVTT1VSQ0UoRkFMU0UsIE1DSV9GQUxTRSk7CgkgICAgcmV0ID0gTUNJX1JFU09VUkNFX1JFVFVSTkVEOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfR0VUREVWQ0FQU19VU0VTX0ZJTEVTOgoJICAgIFRSQUNFKCJNQ0lfR0VUREVWQ0FQU19VU0VTX0ZJTEVTICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gTUFLRU1DSVJFU09VUkNFKFRSVUUsIE1DSV9UUlVFKTsKCSAgICByZXQgPSBNQ0lfUkVTT1VSQ0VfUkVUVVJORUQ7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9HRVRERVZDQVBTX0NPTVBPVU5EX0RFVklDRToKCSAgICBUUkFDRSgiTUNJX0dFVERFVkNBUFNfQ09NUE9VTkRfREVWSUNFICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gTUFLRU1DSVJFU09VUkNFKFRSVUUsIE1DSV9UUlVFKTsKCSAgICByZXQgPSBNQ0lfUkVTT1VSQ0VfUkVUVVJORUQ7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9HRVRERVZDQVBTX0NBTl9FSkVDVDoKCSAgICBUUkFDRSgiTUNJX0dFVERFVkNBUFNfQ0FOX0VKRUNUICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gTUFLRU1DSVJFU09VUkNFKEZBTFNFLCBNQ0lfRkFMU0UpOwoJICAgIHJldCA9IE1DSV9SRVNPVVJDRV9SRVRVUk5FRDsKCSAgICBicmVhazsKCWNhc2UgTUNJX0dFVERFVkNBUFNfQ0FOX1BMQVk6CgkgICAgVFJBQ0UoIk1DSV9HRVRERVZDQVBTX0NBTl9QTEFZICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gTUFLRU1DSVJFU09VUkNFKFRSVUUsIE1DSV9UUlVFKTsKCSAgICByZXQgPSBNQ0lfUkVTT1VSQ0VfUkVUVVJORUQ7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9HRVRERVZDQVBTX0NBTl9SRUNPUkQ6CgkgICAgVFJBQ0UoIk1DSV9HRVRERVZDQVBTX0NBTl9SRUNPUkQgIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQUtFTUNJUkVTT1VSQ0UoVFJVRSwgTUNJX1RSVUUpOwoJICAgIHJldCA9IE1DSV9SRVNPVVJDRV9SRVRVUk5FRDsKCSAgICBicmVhazsKCWNhc2UgTUNJX0dFVERFVkNBUFNfQ0FOX1NBVkU6CgkgICAgVFJBQ0UoIk1DSV9HRVRERVZDQVBTX0NBTl9TQVZFICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gTUFLRU1DSVJFU09VUkNFKEZBTFNFLCBNQ0lfRkFMU0UpOwoJICAgIHJldCA9IE1DSV9SRVNPVVJDRV9SRVRVUk5FRDsKCSAgICBicmVhazsKCWRlZmF1bHQ6CgkgICAgRklYTUUoIlVua25vd24gY2FwYWJpbGl0eSAoJTA4bHgpICFcbiIsIGxwUGFybXMtPmR3SXRlbSk7CgkgICAgcmV0dXJuIE1DSUVSUl9VTlJFQ09HTklaRURfQ09NTUFORDsKCX0KICAgIH0gZWxzZSB7CglXQVJOKCJObyBHZXREZXZDYXBzLUl0ZW0gIVxuIik7CglyZXR1cm4gTUNJRVJSX1VOUkVDT0dOSVpFRF9DT01NQU5EOwogICAgfQogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaUluZm8JCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lJbmZvKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9JTkZPX1BBUk1TQSBscFBhcm1zKQp7CiAgICBMUENTVFIJCXN0ciA9IDA7CiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfbWNpR2V0T3BlbkRldih3RGV2SUQpOwogICAgRFdPUkQJCXJldCA9IDA7CgogICAgVFJBQ0UoIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKICAgIAogICAgaWYgKGxwUGFybXMgPT0gTlVMTCB8fCBscFBhcm1zLT5scHN0clJldHVybiA9PSBOVUxMKQoJcmV0dXJuIE1DSUVSUl9OVUxMX1BBUkFNRVRFUl9CTE9DSzsKICAgIGlmICh3bW0gPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKCiAgICBUUkFDRSgiYnVmPSVwLCBsZW49JWx1XG4iLCBscFBhcm1zLT5scHN0clJldHVybiwgbHBQYXJtcy0+ZHdSZXRTaXplKTsKICAgIAogICAgc3dpdGNoIChkd0ZsYWdzICYgfihNQ0lfV0FJVHxNQ0lfTk9USUZZKSkgewogICAgY2FzZSBNQ0lfSU5GT19QUk9EVUNUOgoJc3RyID0gIldpbmUncyBNSURJIHNlcXVlbmNlciI7CglicmVhazsKICAgIGNhc2UgTUNJX0lORk9fRklMRToKCXN0ciA9IHdtbS0+bHBzdHJFbGVtZW50TmFtZTsKCWJyZWFrOwogICAgY2FzZSBNQ0lfSU5GT19DT1BZUklHSFQ6CglzdHIgPSB3bW0tPmxwc3RyQ29weXJpZ2h0OwoJYnJlYWs7ICAKICAgIGNhc2UgTUNJX0lORk9fTkFNRToKCXN0ciA9IHdtbS0+bHBzdHJOYW1lOwoJYnJlYWs7CiAgICBkZWZhdWx0OgoJV0FSTigiRG9uJ3Qga25vdyB0aGlzIGluZm8gY29tbWFuZCAoJWx1KVxuIiwgZHdGbGFncyk7CglyZXR1cm4gTUNJRVJSX1VOUkVDT0dOSVpFRF9DT01NQU5EOwogICAgfQogICAgaWYgKHN0cikgewoJaWYgKGxwUGFybXMtPmR3UmV0U2l6ZSA8PSBzdHJsZW4oc3RyKSkgewoJICAgIGxzdHJjcHluQShscFBhcm1zLT5scHN0clJldHVybiwgc3RyLCBscFBhcm1zLT5kd1JldFNpemUgLSAxKTsKCSAgICByZXQgPSBNQ0lFUlJfUEFSQU1fT1ZFUkZMT1c7Cgl9IGVsc2UgewoJICAgIHN0cmNweShscFBhcm1zLT5scHN0clJldHVybiwgc3RyKTsKCX0JCiAgICB9IGVsc2UgewoJKmxwUGFybXMtPmxwc3RyUmV0dXJuID0gMDsKICAgIH0KICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lTZWVrCQkJW2ludGVybmFsXQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpU2VlayhVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU0VFS19QQVJNUyBscFBhcm1zKQp7CiAgICBEV09SRAkJcmV0ID0gMDsKICAgIFdJTkVfTUNJTUlESSoJd21tID0gTUlESV9tY2lHZXRPcGVuRGV2KHdEZXZJRCk7CiAgICAKICAgIFRSQUNFKCIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAgICAKICAgIGlmIChscFBhcm1zID09IE5VTEwpIHsKCXJldCA9IE1DSUVSUl9OVUxMX1BBUkFNRVRFUl9CTE9DSzsKICAgIH0gZWxzZSBpZiAod21tID09IE5VTEwpIHsKCXJldCA9IE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKICAgIH0gZWxzZSB7CglNSURJX21jaVN0b3Aod0RldklELCBNQ0lfV0FJVCwgMCk7CgkKCWlmIChkd0ZsYWdzICYgTUNJX1NFRUtfVE9fU1RBUlQpIHsKCSAgICB3bW0tPmR3UG9zaXRpb25NUyA9IDA7Cgl9IGVsc2UgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VFS19UT19FTkQpIHsKCSAgICB3bW0tPmR3UG9zaXRpb25NUyA9IDB4RkZGRkZGRkY7IC8qIGZpeG1lICovCgl9IGVsc2UgaWYgKGR3RmxhZ3MgJiBNQ0lfVE8pIHsKCSAgICB3bW0tPmR3UG9zaXRpb25NUyA9IE1JRElfQ29udmVydFRpbWVGb3JtYXRUb01TKHdtbSwgbHBQYXJtcy0+ZHdUbyk7Cgl9IGVsc2UgewoJICAgIFdBUk4oImR3RmxhZyBkb2Vzbid0IHRlbGwgd2hlcmUgdG8gc2VlayB0by4uLlxuIik7CgkgICAgcmV0dXJuIE1DSUVSUl9NSVNTSU5HX1BBUkFNRVRFUjsKCX0KCQoJVFJBQ0UoIlNlZWtpbmcgdG8gcG9zaXRpb249JWx1IG1zXG4iLCB3bW0tPmR3UG9zaXRpb25NUyk7CgkKCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewoJICAgIFRSQUNFKCJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CgkgICAgbWNpRHJpdmVyTm90aWZ5KChIV05EKUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCgkJCSAgICB3bW0tPndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKCX0KICAgIH0KICAgIHJldHVybiByZXQ7CQp9ICAgIAoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KgogKiAgICAgICAgICAgICAgICAgIAkgICAgTUlESSBlbnRyeSBwb2ludHMgCQkJCSoKICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUNJTUlESV9Ecml2ZXJQcm9jCSAgICAgW3NhbXBsZSBkcml2ZXJdCiAqLwpMT05HIENBTExCQUNLCU1DSU1JRElfRHJpdmVyUHJvYyhEV09SRCBkd0RldklELCBIRFJWUiBoRHJpdiwgRFdPUkQgd01zZywgCgkJCQkgICBEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCnsKICAgIHN3aXRjaCAod01zZykgewogICAgY2FzZSBEUlZfTE9BRDoJCXJldHVybiAxOwogICAgY2FzZSBEUlZfRlJFRToJCXJldHVybiAxOwogICAgY2FzZSBEUlZfRU5BQkxFOgkJcmV0dXJuIDE7CiAgICBjYXNlIERSVl9ESVNBQkxFOgkJcmV0dXJuIDE7CiAgICBjYXNlIERSVl9RVUVSWUNPTkZJR1VSRToJcmV0dXJuIDE7CiAgICBjYXNlIERSVl9DT05GSUdVUkU6CQlNZXNzYWdlQm94QSgwLCAiU2FtcGxlIE1pZGkgRHJpdmVyICEiLCAiT1NTIERyaXZlciIsIE1CX09LKTsgcmV0dXJuIDE7CiAgICBjYXNlIERSVl9JTlNUQUxMOgkJcmV0dXJuIERSVkNORl9SRVNUQVJUOwogICAgY2FzZSBEUlZfUkVNT1ZFOgkJcmV0dXJuIERSVkNORl9SRVNUQVJUOwogICAgY2FzZSBEUlZfT1BFTjoJCXJldHVybiBNSURJX2Rydk9wZW4oKExQU1RSKWR3UGFyYW0xLCAoTFBNQ0lfT1BFTl9EUklWRVJfUEFSTVNBKWR3UGFyYW0yKTsKICAgIGNhc2UgRFJWX0NMT1NFOgkJcmV0dXJuIE1JRElfZHJ2Q2xvc2UoZHdEZXZJRCk7CiAgICBjYXNlIE1DSV9PUEVOX0RSSVZFUjoJcmV0dXJuIE1JRElfbWNpT3BlbiAgICAgIChkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX09QRU5fUEFSTVNBKSAgICAgZHdQYXJhbTIpOwogICAgY2FzZSBNQ0lfQ0xPU0VfRFJJVkVSOglyZXR1cm4gTUlESV9tY2lDbG9zZSAgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfR0VORVJJQ19QQVJNUykgICBkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9QTEFZOgkJcmV0dXJuIE1JRElfbWNpUGxheSAgICAgIChkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX1BMQVlfUEFSTVMpICAgICAgZHdQYXJhbTIpOwogICAgY2FzZSBNQ0lfUkVDT1JEOgkJcmV0dXJuIE1JRElfbWNpUmVjb3JkICAgIChkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX1JFQ09SRF9QQVJNUykgICAgZHdQYXJhbTIpOwogICAgY2FzZSBNQ0lfU1RPUDoJCXJldHVybiBNSURJX21jaVN0b3AgICAgICAoZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9HRU5FUklDX1BBUk1TKSAgIGR3UGFyYW0yKTsKICAgIGNhc2UgTUNJX1NFVDoJCXJldHVybiBNSURJX21jaVNldCAgICAgICAoZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9TRVRfUEFSTVMpICAgICAgIGR3UGFyYW0yKTsKICAgIGNhc2UgTUNJX1BBVVNFOgkJcmV0dXJuIE1JRElfbWNpUGF1c2UgICAgIChkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX0dFTkVSSUNfUEFSTVMpICAgZHdQYXJhbTIpOwogICAgY2FzZSBNQ0lfUkVTVU1FOgkJcmV0dXJuIE1JRElfbWNpUmVzdW1lICAgIChkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX0dFTkVSSUNfUEFSTVMpICAgZHdQYXJhbTIpOwogICAgY2FzZSBNQ0lfU1RBVFVTOgkJcmV0dXJuIE1JRElfbWNpU3RhdHVzICAgIChkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX1NUQVRVU19QQVJNUykgICAgZHdQYXJhbTIpOwogICAgY2FzZSBNQ0lfR0VUREVWQ0FQUzoJcmV0dXJuIE1JRElfbWNpR2V0RGV2Q2Fwcyhkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX0dFVERFVkNBUFNfUEFSTVMpZHdQYXJhbTIpOwogICAgY2FzZSBNQ0lfSU5GTzoJCXJldHVybiBNSURJX21jaUluZm8gICAgICAoZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9JTkZPX1BBUk1TQSkgICAgIGR3UGFyYW0yKTsKICAgIGNhc2UgTUNJX1NFRUs6CQlyZXR1cm4gTUlESV9tY2lTZWVrICAgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfU0VFS19QQVJNUykgICAgICBkd1BhcmFtMik7CiAgICAvKiBjb21tYW5kcyB0aGF0IHNob3VsZCBiZSBzdXBwb3J0ZWQgKi8KICAgIGNhc2UgTUNJX0xPQUQ6CQkKICAgIGNhc2UgTUNJX1NBVkU6CQkKICAgIGNhc2UgTUNJX0ZSRUVaRToJCQogICAgY2FzZSBNQ0lfUFVUOgkJCiAgICBjYXNlIE1DSV9SRUFMSVpFOgkJCiAgICBjYXNlIE1DSV9VTkZSRUVaRToJCQogICAgY2FzZSBNQ0lfVVBEQVRFOgkJCiAgICBjYXNlIE1DSV9XSEVSRToJCQogICAgY2FzZSBNQ0lfU1RFUDoJCQogICAgY2FzZSBNQ0lfU1BJTjoJCQogICAgY2FzZSBNQ0lfRVNDQVBFOgkJCiAgICBjYXNlIE1DSV9DT1BZOgkJCiAgICBjYXNlIE1DSV9DVVQ6CQkKICAgIGNhc2UgTUNJX0RFTEVURToJCQogICAgY2FzZSBNQ0lfUEFTVEU6CQkKCVdBUk4oIlVuc3VwcG9ydGVkIGNvbW1hbmQgWyVsdV1cbiIsIHdNc2cpOwoJYnJlYWs7CiAgICAvKiBjb21tYW5kcyB0aGF0IHNob3VsZCByZXBvcnQgYW4gZXJyb3IgKi8KICAgIGNhc2UgTUNJX1dJTkRPVzoJCQoJVFJBQ0UoIlVuc3VwcG9ydGVkIGNvbW1hbmQgWyVsdV1cbiIsIHdNc2cpOwoJYnJlYWs7CiAgICBjYXNlIE1DSV9PUEVOOgogICAgY2FzZSBNQ0lfQ0xPU0U6CglGSVhNRSgiU2hvdWxkbid0IHJlY2VpdmUgYSBNQ0lfT1BFTiBvciBDTE9TRSBtZXNzYWdlXG4iKTsKCWJyZWFrOwogICAgZGVmYXVsdDoJCQkKCVRSQUNFKCJTZW5kaW5nIG1zZyBbJWx1XSB0byBkZWZhdWx0IGRyaXZlciBwcm9jXG4iLCB3TXNnKTsKCXJldHVybiBEZWZEcml2ZXJQcm9jKGR3RGV2SUQsIGhEcml2LCB3TXNnLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwogICAgfQogICAgcmV0dXJuIE1DSUVSUl9VTlJFQ09HTklaRURfQ09NTUFORDsKfQoKICAgIAo=