LyogLSotIHRhYi13aWR0aDogODsgYy1iYXNpYy1vZmZzZXQ6IDQgLSotICovCgovKgogKiBTYW1wbGUgTUlESSBXaW5lIERyaXZlciBmb3IgTGludXgKICoKICogQ29weXJpZ2h0IAkxOTk0IE1hcnRpbiBBeW90dGUKICoJCTE5OTkgRXJpYyBQb3VlY2gKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKLyoKICogRXJpYyBQT1VFQ0ggOgogKiA5OC83IGNoYW5nZXMgZm9yIG1ha2luZyB0aGlzIE1JREkgZHJpdmVyIHdvcmsgb24gT1NTCiAqIAljdXJyZW50IHN1cHBvcnQgaXMgbGltaXRlZCB0byBNSURJIHBvcnRzIG9mIE9TUyBzeXN0ZW1zCiAqIDk4LzkJcmV3cml0aW5nIE1DSSBjb2RlIGZvciBNSURJCiAqIDk4LzExIHNwbGl0dGVkIGluIG1pZGkuYyBhbmQgbWNpbWlkaS5jCiAqLwoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgIndvd250MzIuaCIKI2luY2x1ZGUgIm1tZGRrLmgiCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChtY2ltaWRpKTsKCiNkZWZpbmUgTUlESV9OT1RFT0ZGICAgICAgICAgICAgIDB4ODAKI2RlZmluZSBNSURJX05PVEVPTiAgICAgICAgICAgICAgMHg5MAoKdHlwZWRlZiBzdHJ1Y3QgewogICAgRFdPUkQJCWR3Rmlyc3Q7CQkvKiBvZmZzZXQgaW4gZmlsZSBvZiB0cmFjayAqLwogICAgRFdPUkQJCWR3TGFzdDsJCQkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gZmlsZSBvZiB0cmFjayAqLwogICAgRFdPUkQJCWR3SW5kZXg7CQkvKiBjdXJyZW50IGluZGV4IGluIGZpbGUgKGR3Rmlyc3QgPD0gZHdJbmRleCA8IGR3TGFzdCkgKi8KICAgIERXT1JECQlkd0xlbmd0aDsJCS8qIG51bWJlciBvZiBwdWxzZXMgaW4gdGhpcyB0cmFjayAqLwogICAgRFdPUkQJCWR3RXZlbnRQdWxzZTsJCS8qIGN1cnJlbnQgcHVsc2UgIyAoZXZlbnQpIHBvaW50ZWQgYnkgZHdJbmRleCAqLwogICAgRFdPUkQJCWR3RXZlbnREYXRhOwkJLyogY3VycmVudCBkYXRhICAgIChldmVudCkgcG9pbnRlZCBieSBkd0luZGV4ICovCiAgICBXT1JECQl3RXZlbnRMZW5ndGg7CQkvKiBjdXJyZW50IGxlbmd0aCAgKGV2ZW50KSBwb2ludGVkIGJ5IGR3SW5kZXggKi8KICAgIFdPUkQJCXdTdGF0dXMgOiAxLAkJLyogMSA6IHBsYXlpbmcsIDAgOiBkb25lICovCgkgICAgICAgICAgICAgICAgd1RyYWNrTnIgOiA3LAoJICAgICAgICAgICAgICAgIHdMYXN0Q29tbWFuZCA6IDg7CS8qIGxhc3QgTUlESSBjb21tYW5kIG9uIHRyYWNrICovCn0gTUNJX01JRElUUkFDSzsKCnR5cGVkZWYgc3RydWN0IHRhZ1dJTkVfTUNJTUlESSB7CiAgICBVSU5UCQl3RGV2SUQ7CQkJLyogdGhlIE1DSSBvbmUgKi8KICAgIEhNSURJCQloTWlkaTsKICAgIGludAkJCW5Vc2VDb3VudDsgICAgICAgICAgCS8qIEluY3JlbWVudGVkIGZvciBlYWNoIHNoYXJlZCBvcGVuICAgICAgICAgICovCiAgICBXT1JECQl3Tm90aWZ5RGV2aWNlSUQ7ICAgIAkvKiBNQ0kgZGV2aWNlIElEIHdpdGggYSBwZW5kaW5nIG5vdGlmaWNhdGlvbiAqLwogICAgSEFORExFIAkJaENhbGxiYWNrOyAgICAgICAgIAkvKiBDYWxsYmFjayBoYW5kbGUgZm9yIHBlbmRpbmcgbm90aWZpY2F0aW9uICAqLwogICAgSE1NSU8JCWhGaWxlOwkgICAgICAgICAgICAJLyogbW1pbyBmaWxlIGhhbmRsZSBvcGVuIGFzIEVsZW1lbnQgICAgICAgICAgKi8KICAgIExQU1RSCQlscHN0ckVsZW1lbnROYW1lOyAgICAgICAvKiBOYW1lIG9mIGZpbGUgKGlmIGFueSkgICAgICAgICAgICAgICAgICAgICAqLwogICAgTFBTVFIJCWxwc3RyQ29weXJpZ2h0OwogICAgTFBTVFIJCWxwc3RyTmFtZTsKICAgIFdPUkQJCWR3U3RhdHVzOwkJLyogb25lIGZyb20gTUNJX01PREVfeHh4eCAqLwogICAgRFdPUkQJCWR3TWNpVGltZUZvcm1hdDsJLyogT25lIG9mIHRoZSBzdXBwb3J0ZWQgTUNJX0ZPUk1BVF94eHh4ICovCiAgICBXT1JECQl3Rm9ybWF0OwkJLyogRm9ybWF0IG9mIE1JREkgaEZpbGUgKDAsIDEgb3IgMikgKi8KICAgIFdPUkQJCW5UcmFja3M7CQkvKiBOdW1iZXIgb2YgdHJhY2tzIGluIGhGaWxlICovCiAgICBXT1JECQluRGl2aXNpb247CQkvKiBOdW1iZXIgb2YgZGl2aXNpb24gaW4gaEZpbGUgUFBRTiBvciBTTVBURSAqLwogICAgV09SRAkJd1N0YXJ0ZWRQbGF5aW5nOwogICAgRFdPUkQJCWR3VGVtcG87CQkvKiBUZW1wbyAoIyBvZiAxLzQgbm90ZSBwZXIgc2Vjb25kICovCiAgICBNQ0lfTUlESVRSQUNLKiAgICAgCXRyYWNrczsJCQkvKiBDb250ZW50IG9mIGVhY2ggdHJhY2sgKi8KICAgIERXT1JECQlkd1B1bHNlOwogICAgRFdPUkQJCWR3UG9zaXRpb25NUzsKICAgIERXT1JECQlkd1N0YXJ0VGlja3M7Cn0gV0lORV9NQ0lNSURJOwoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIEZJWE1FOiBzaG91bGQgYmUgdXNpbmcgdGhlIG5ldyBtbVRocmVhZFhYWFggZnVuY3Rpb25zIGZyb20gV0lOTU0KICogaW5zdGVhZCBvZiB0aG9zZQogKiBpdCB3b3VsZCByZXF1aXJlIHRvIGFkZCBhIHdpbmUgaW50ZXJuYWwgZmxhZyB0byBtbVRocmVhZENyZWF0ZQogKiBpbiBvcmRlciB0byBwYXNzIGEgMzIgYml0IGZ1bmN0aW9uIGluc3RlYWQgb2YgYSAxNiBiaXQKICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgpzdHJ1Y3QgU0NBIHsKICAgIFVJTlQgCXdEZXZJRDsKICAgIFVJTlQgCXdNc2c7CiAgICBEV09SRCAJZHdQYXJhbTE7CiAgICBEV09SRCAJZHdQYXJhbTI7Cn07CgovKiBFUFAgRFdPUkQgV0lOQVBJIG1jaVNlbmRDb21tYW5kQShVSU5UIHdEZXZJRCwgVUlOVCB3TXNnLCBEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpOyAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNQ0lfU0NBU3RhcnRlcgkJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRCBDQUxMQkFDSwlNQ0lfU0NBU3RhcnRlcihMUFZPSUQgYXJnKQp7CiAgICBzdHJ1Y3QgU0NBKglzY2EgPSAoc3RydWN0IFNDQSopYXJnOwogICAgRFdPUkQJCXJldDsKCiAgICBUUkFDRSgiSW4gdGhyZWFkIGJlZm9yZSBhc3luYyBjb21tYW5kICglMDh4LCV1LCUwOGx4LCUwOGx4KVxuIiwKCSAgc2NhLT53RGV2SUQsIHNjYS0+d01zZywgc2NhLT5kd1BhcmFtMSwgc2NhLT5kd1BhcmFtMik7CiAgICByZXQgPSBtY2lTZW5kQ29tbWFuZEEoc2NhLT53RGV2SUQsIHNjYS0+d01zZywgc2NhLT5kd1BhcmFtMSB8IE1DSV9XQUlULCBzY2EtPmR3UGFyYW0yKTsKICAgIFRSQUNFKCJJbiB0aHJlYWQgYWZ0ZXIgYXN5bmMgY29tbWFuZCAoJTA4eCwldSwlMDhseCwlMDhseClcbiIsCgkgIHNjYS0+d0RldklELCBzY2EtPndNc2csIHNjYS0+ZHdQYXJhbTEsIHNjYS0+ZHdQYXJhbTIpOwogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2NhKTsKICAgIEV4aXRUaHJlYWQocmV0KTsKICAgIFdBUk4oIlNob3VsZCBub3QgaGFwcGVuID8gd2hhdCdzIHdyb25nIFxuIik7CiAgICAvKiBzaG91bGQgbm90IGdvIGFmdGVyIHRoaXMgcG9pbnQgKi8KICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUNJX1NlbmRDb21tYW5kQXN5bmMJCVtpbnRlcm5hbF0KICovCnN0YXRpYwlEV09SRCBNQ0lfU2VuZENvbW1hbmRBc3luYyhVSU5UIHdEZXZJRCwgVUlOVCB3TXNnLCBEV09SRCBkd1BhcmFtMSwKCQkJCSAgIERXT1JEIGR3UGFyYW0yLCBVSU5UIHNpemUpCnsKICAgIEhBTkRMRSBoYW5kbGU7CiAgICBzdHJ1Y3QgU0NBKglzY2EgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKHN0cnVjdCBTQ0EpICsgc2l6ZSk7CgogICAgaWYgKHNjYSA9PSAwKQoJcmV0dXJuIE1DSUVSUl9PVVRfT0ZfTUVNT1JZOwoKICAgIHNjYS0+d0RldklEICAgPSB3RGV2SUQ7CiAgICBzY2EtPndNc2cgICAgID0gd01zZzsKICAgIHNjYS0+ZHdQYXJhbTEgPSBkd1BhcmFtMTsKCiAgICBpZiAoc2l6ZSAmJiBkd1BhcmFtMikgewoJc2NhLT5kd1BhcmFtMiA9IChEV09SRClzY2EgKyBzaXplb2Yoc3RydWN0IFNDQSk7CgkvKiBjb3B5IHN0cnVjdHVyZSBwYXNzZWQgYnkgcHJvZ3JhbSBpbiBkd1BhcmFtMiB0byBiZSBzdXJlCgkgKiB3ZSBjYW4gc3RpbGwgdXNlIGl0IHdoYXRldmVyIHRoZSBwcm9ncmFtIGRvZXMKCSAqLwoJbWVtY3B5KChMUFZPSUQpc2NhLT5kd1BhcmFtMiwgKExQVk9JRClkd1BhcmFtMiwgc2l6ZSk7CiAgICB9IGVsc2UgewoJc2NhLT5kd1BhcmFtMiA9IGR3UGFyYW0yOwogICAgfQoKICAgIGlmICgoaGFuZGxlID0gQ3JlYXRlVGhyZWFkKE5VTEwsIDAsIE1DSV9TQ0FTdGFydGVyLCBzY2EsIDAsIE5VTEwpKSA9PSAwKSB7CglXQVJOKCJDb3VsZG4ndCBhbGxvY2F0ZSB0aHJlYWQgZm9yIGFzeW5jIGNvbW1hbmQgaGFuZGxpbmcsIHNlbmRpbmcgc3luY2hvbm91c2x5XG4iKTsKCXJldHVybiBNQ0lfU0NBU3RhcnRlcigmc2NhKTsKICAgIH0KICAgIENsb3NlSGFuZGxlKGhhbmRsZSk7CiAgICByZXR1cm4gMDsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KgogKiAgICAgICAgICAgICAgICAgIAkgICAgTUNJIE1JREkgaW1wbGVtYW50YXRpb24JCQkqCiAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgpzdGF0aWMgRFdPUkQgTUlESV9tY2lSZXN1bWUoVUlOVCB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcyk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfZHJ2T3BlbgkJCVtpbnRlcm5hbF0KICovCnN0YXRpYwlEV09SRAlNSURJX2Rydk9wZW4oTFBTVFIgc3RyLCBMUE1DSV9PUEVOX0RSSVZFUl9QQVJNU0EgbW9kcCkKewogICAgV0lORV9NQ0lNSURJKgl3bW07CgogICAgaWYgKCFtb2RwKSByZXR1cm4gMHhGRkZGRkZGRjsKCiAgICB3bW0gPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKFdJTkVfTUNJTUlESSkpOwoKICAgIGlmICghd21tKQoJcmV0dXJuIDA7CgogICAgd21tLT53RGV2SUQgPSBtb2RwLT53RGV2aWNlSUQ7CiAgICBtY2lTZXREcml2ZXJEYXRhKHdtbS0+d0RldklELCAoRFdPUkQpd21tKTsKICAgIG1vZHAtPndDdXN0b21Db21tYW5kVGFibGUgPSBNQ0lfTk9fQ09NTUFORF9UQUJMRTsKICAgIG1vZHAtPndUeXBlID0gTUNJX0RFVlRZUEVfU0VRVUVOQ0VSOwogICAgcmV0dXJuIG1vZHAtPndEZXZpY2VJRDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNQ0lNSURJX2RydkNsb3NlCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMJRFdPUkQJTUlESV9kcnZDbG9zZShEV09SRCBkd0RldklEKQp7CiAgICBXSU5FX01DSU1JREkqICB3bW0gPSAoV0lORV9NQ0lNSURJKiltY2lHZXREcml2ZXJEYXRhKGR3RGV2SUQpOwoKICAgIGlmICh3bW0pIHsKCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHdtbSk7CgltY2lTZXREcml2ZXJEYXRhKGR3RGV2SUQsIDApOwoJcmV0dXJuIDE7CiAgICB9CiAgICByZXR1cm4gKGR3RGV2SUQgPT0gMHhGRkZGRkZGRikgPyAxIDogMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaUdldE9wZW5EZXYJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBXSU5FX01DSU1JREkqICBNSURJX21jaUdldE9wZW5EZXYoVUlOVCB3RGV2SUQpCnsKICAgIFdJTkVfTUNJTUlESSoJd21tID0gKFdJTkVfTUNJTUlESSopbWNpR2V0RHJpdmVyRGF0YSh3RGV2SUQpOwoKICAgIGlmICh3bW0gPT0gTlVMTCB8fCB3bW0tPm5Vc2VDb3VudCA9PSAwKSB7CglXQVJOKCJJbnZhbGlkIHdEZXZJRD0ldVxuIiwgd0RldklEKTsKCXJldHVybiAwOwogICAgfQogICAgcmV0dXJuIHdtbTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVJlYWRCeXRlCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lSZWFkQnl0ZShXSU5FX01DSU1JREkqIHdtbSwgQllURSAqbHBieXQpCnsKICAgIERXT1JECXJldCA9IDA7CgogICAgaWYgKGxwYnl0ID09IE5VTEwgfHwKCW1taW9SZWFkKHdtbS0+aEZpbGUsIChIUFNUUilscGJ5dCwgc2l6ZW9mKEJZVEUpKSAhPSAobG9uZylzaXplb2YoQllURSkpIHsKCVdBUk4oIkVycm9yIHJlYWRpbmcgd21tPSVwXG4iLCB3bW0pOwoJcmV0ID0gTUNJRVJSX0lOVkFMSURfRklMRTsKICAgIH0KCiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpUmVhZFdvcmQJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRCBNSURJX21jaVJlYWRXb3JkKFdJTkVfTUNJTUlESSogd21tLCBMUFdPUkQgbHB3KQp7CiAgICBCWVRFCWhpYnl0ZSwgbG9ieXRlOwogICAgRFdPUkQJcmV0ID0gTUNJRVJSX0lOVkFMSURfRklMRTsKCiAgICBpZiAobHB3ICE9IE5VTEwgJiYKCU1JRElfbWNpUmVhZEJ5dGUod21tLCAmaGlieXRlKSA9PSAwICYmCglNSURJX21jaVJlYWRCeXRlKHdtbSwgJmxvYnl0ZSkgPT0gMCkgewoJKmxwdyA9ICgoV09SRCloaWJ5dGUgPDwgOCkgKyBsb2J5dGU7CglyZXQgPSAwOwogICAgfQogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVJlYWRMb25nCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lSZWFkTG9uZyhXSU5FX01DSU1JREkqIHdtbSwgTFBEV09SRCBscGR3KQp7CiAgICBXT1JECWhpd29yZCwgbG93b3JkOwogICAgRFdPUkQJcmV0ID0gTUNJRVJSX0lOVkFMSURfRklMRTsKCiAgICBpZiAobHBkdyAhPSBOVUxMICYmCglNSURJX21jaVJlYWRXb3JkKHdtbSwgJmhpd29yZCkgPT0gMCAmJgoJTUlESV9tY2lSZWFkV29yZCh3bW0sICZsb3dvcmQpID09IDApIHsKCSpscGR3ID0gTUFLRUxPTkcobG93b3JkLCBoaXdvcmQpOwoJcmV0ID0gMDsKICAgIH0KICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgCQkJCU1JRElfbWNpUmVhZFZhcnlMZW4JCVtpbnRlcm5hbF0KICovCnN0YXRpYyBXT1JEIE1JRElfbWNpUmVhZFZhcnlMZW4oV0lORV9NQ0lNSURJKiB3bW0sIExQRFdPUkQgbHBkdykKewogICAgQllURQlieXRlOwogICAgRFdPUkQJdmFsdWUgPSAwOwogICAgV09SRAlyZXQgPSAwOwoKICAgIGlmIChscGR3ID09IE5VTEwpIHsKCXJldCA9IE1DSUVSUl9JTlZBTElEX0ZJTEU7CiAgICB9IGVsc2UgewoJZG8gewoJICAgIGlmIChNSURJX21jaVJlYWRCeXRlKHdtbSwgJmJ5dGUpICE9IDApIHsKCQlyZXR1cm4gMDsKCSAgICB9CgkgICAgdmFsdWUgPSAodmFsdWUgPDwgNykgKyAoYnl0ZSAmIDB4N0YpOwoJICAgIHJldCsrOwoJfSB3aGlsZSAoYnl0ZSAmIDB4ODApOwoJKmxwZHcgPSB2YWx1ZTsKCS8qCgkgIFRSQUNFKCJ2YWw9JTA4bFggXG4iLCB2YWx1ZSk7CgkqLwogICAgfQogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVJlYWROZXh0RXZlbnQJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRAlNSURJX21jaVJlYWROZXh0RXZlbnQoV0lORV9NQ0lNSURJKiB3bW0sIE1DSV9NSURJVFJBQ0sqIG1tdCkKewogICAgQllURQliMSwgYjIgPSAwLCBiMzsKICAgIFdPUkQJaHcgPSAwOwogICAgRFdPUkQJZXZ0UHVsc2U7CiAgICBEV09SRAlldnRMZW5ndGg7CiAgICBEV09SRAl0bXA7CgogICAgaWYgKG1taW9TZWVrKHdtbS0+aEZpbGUsIG1tdC0+ZHdJbmRleCwgU0VFS19TRVQpICE9IG1tdC0+ZHdJbmRleCkgewoJV0FSTigiQ2FuJ3Qgc2VlayBhdCAlMDhsWCBcbiIsIG1tdC0+ZHdJbmRleCk7CglyZXR1cm4gTUNJRVJSX0lOVkFMSURfRklMRTsKICAgIH0KICAgIGV2dExlbmd0aCA9IE1JRElfbWNpUmVhZFZhcnlMZW4od21tLCAmZXZ0UHVsc2UpICsgMTsJLyogPiAwICovCiAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJmIxKTsKICAgIHN3aXRjaCAoYjEpIHsKICAgIGNhc2UgMHhGMDoKICAgIGNhc2UgMHhGNzoKCWV2dExlbmd0aCArPSBNSURJX21jaVJlYWRWYXJ5TGVuKHdtbSwgJnRtcCk7CglldnRMZW5ndGggKz0gdG1wOwoJYnJlYWs7CiAgICBjYXNlIDB4RkY6CglNSURJX21jaVJlYWRCeXRlKHdtbSwgJmIyKTsJZXZ0TGVuZ3RoKys7CgoJZXZ0TGVuZ3RoICs9IE1JRElfbWNpUmVhZFZhcnlMZW4od21tLCAmdG1wKTsKCWlmIChldnRMZW5ndGggPj0gMHgxMDAwMHUpIHsKCSAgICAvKiB0aGlzIGxpbWl0YXRpb24gc2hvdWxkbid0IGJlIGEgcHJvYmxlbSAqLwoJICAgIFdBUk4oIk91Y2ggISEgSW1wbGVtZW50YXRpb24gbGltaXRhdGlvbiB0byA2NGsgYnl0ZXMgZm9yIGEgTUlESSBldmVudCBpcyBvdmVyZmxvd2VkXG4iKTsKCSAgICBodyA9IDB4RkZGRjsKCX0gZWxzZSB7CgkgICAgaHcgPSBMT1dPUkQoZXZ0TGVuZ3RoKTsKCX0KCWV2dExlbmd0aCArPSB0bXA7CglicmVhazsKICAgIGRlZmF1bHQ6CglpZiAoYjEgJiAweDgwKSB7IC8qIHVzZSBydW5uaW5nIHN0YXR1cyA/ICovCgkgICAgbW10LT53TGFzdENvbW1hbmQgPSBiMTsKCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJmIyKTsJZXZ0TGVuZ3RoKys7Cgl9IGVsc2UgewoJICAgIGIyID0gYjE7CgkgICAgYjEgPSBtbXQtPndMYXN0Q29tbWFuZDsKCX0KCXN3aXRjaCAoKGIxID4+IDQpICYgMHgwNykgewoJY2FzZSAwOgljYXNlIDE6CWNhc2UgMjogY2FzZSAzOiBjYXNlIDY6CgkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZiMyk7CWV2dExlbmd0aCsrOwoJICAgIGh3ID0gYjM7CgkgICAgYnJlYWs7CgljYXNlIDQ6CWNhc2UgNToKCSAgICBicmVhazsKCWNhc2UgNzoKCSAgICBXQVJOKCJTdHJhbmdlIGluZGVlZCBiMT0weCUwMnhcbiIsIGIxKTsKCX0KCWJyZWFrOwogICAgfQogICAgaWYgKG1tdC0+ZHdJbmRleCArIGV2dExlbmd0aCA+IG1tdC0+ZHdMYXN0KQoJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKCiAgICBtbXQtPmR3RXZlbnRQdWxzZSArPSBldnRQdWxzZTsKICAgIG1tdC0+ZHdFdmVudERhdGEgICA9IChodyA8PCAxNikgKyAoYjIgPDwgOCkgKyBiMTsKICAgIG1tdC0+d0V2ZW50TGVuZ3RoICA9IGV2dExlbmd0aDsKCiAgICAvKgogICAgICBUUkFDRSgiWyV1XSA9PiBwdWxzZT0lMDhseCglMDhseCksIGRhdGE9JTA4bHgsIGxlbmd0aD0ldVxuIiwKICAgICAgbW10LT53VHJhY2tOciwgbW10LT5kd0V2ZW50UHVsc2UsIGV2dFB1bHNlLAogICAgICBtbXQtPmR3RXZlbnREYXRhLCBtbXQtPndFdmVudExlbmd0aCk7CiAgICAqLwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lSZWFkTVRyawkJW2ludGVybmFsXQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpUmVhZE1UcmsoV0lORV9NQ0lNSURJKiB3bW0sIE1DSV9NSURJVFJBQ0sqIG1tdCkKewogICAgRFdPUkQJCXRvYmVyZWFkOwogICAgRk9VUkNDCQlmb3VyY2M7CgogICAgaWYgKG1taW9SZWFkKHdtbS0+aEZpbGUsIChIUFNUUikmZm91cmNjLCAobG9uZylzaXplb2YoRk9VUkNDKSkgIT0KCShsb25nKXNpemVvZihGT1VSQ0MpKSB7CglyZXR1cm4gTUNJRVJSX0lOVkFMSURfRklMRTsKICAgIH0KCiAgICBpZiAoZm91cmNjICE9IG1taW9GT1VSQ0MoJ00nLCAnVCcsICdyJywgJ2snKSkgewoJV0FSTigiQ2FuJ3Qgc3luY2hyb25pemUgb24gJ01UcmsnICFcbiIpOwoJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0ZJTEU7CiAgICB9CgogICAgaWYgKE1JRElfbWNpUmVhZExvbmcod21tLCAmdG9iZXJlYWQpICE9IDApIHsKCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9GSUxFOwogICAgfQogICAgbW10LT5kd0ZpcnN0ID0gbW1pb1NlZWsod21tLT5oRmlsZSwgMCwgU0VFS19DVVIpOyAvKiA+PSAwICovCiAgICBtbXQtPmR3TGFzdCA9IG1tdC0+ZHdGaXJzdCArIHRvYmVyZWFkOwoKICAgIC8qIGNvbXB1dGUgIyBvZiBwdWxzZXMgaW4gdGhpcyB0cmFjayAqLwogICAgbW10LT5kd0luZGV4ID0gbW10LT5kd0ZpcnN0OwogICAgbW10LT5kd0V2ZW50UHVsc2UgPSAwOwoKICAgIHdoaWxlIChNSURJX21jaVJlYWROZXh0RXZlbnQod21tLCBtbXQpID09IDAgJiYgTE9XT1JEKG1tdC0+ZHdFdmVudERhdGEpICE9IDB4MkZGRikgewoJY2hhcglidWZbMTAyNF07CglXT1JECWxlbjsKCgltbXQtPmR3SW5kZXggKz0gbW10LT53RXZlbnRMZW5ndGg7CgoJc3dpdGNoIChMT1dPUkQobW10LT5kd0V2ZW50RGF0YSkpIHsKCWNhc2UgMHgwMkZGOgoJY2FzZSAweDAzRkY6CgkgICAgLyogcG9zaXRpb24gYWZ0ZXIgbWV0YSBkYXRhIGhlYWRlciAqLwoJICAgIG1taW9TZWVrKHdtbS0+aEZpbGUsIG1tdC0+ZHdJbmRleCArIEhJV09SRChtbXQtPmR3RXZlbnREYXRhKSwgU0VFS19TRVQpOwoJICAgIGxlbiA9IG1tdC0+d0V2ZW50TGVuZ3RoIC0gSElXT1JEKG1tdC0+ZHdFdmVudERhdGEpOwoKCSAgICBpZiAobGVuID49IHNpemVvZihidWYpKSB7CgkJV0FSTigiQnVmZmVyIGZvciB0ZXh0IGlzIHRvbyBzbWFsbCAoJWQgYnl0ZXMsIHdoZW4gJXUgYXJlIG5lZWRlZClcbiIsIHNpemVvZihidWYpIC0gMSwgbGVuKTsKCQlsZW4gPSBzaXplb2YoYnVmKSAtIDE7CgkgICAgfQoJICAgIGlmIChtbWlvUmVhZCh3bW0tPmhGaWxlLCAoSFBTVFIpYnVmLCBsZW4pID09IGxlbikgewoJCWJ1ZltsZW5dID0gMDsJLyogZW5kIHN0cmluZyBpbiBjYXNlICovCgkJc3dpdGNoIChISUJZVEUoTE9XT1JEKG1tdC0+ZHdFdmVudERhdGEpKSkgewoJCWNhc2UgMHgwMjoKCQkgICAgaWYgKHdtbS0+bHBzdHJDb3B5cmlnaHQpIHsKCQkJV0FSTigiVHdvIGNvcHlyaWdodCBub3RpY2VzICglc3wlcylcbiIsIHdtbS0+bHBzdHJDb3B5cmlnaHQsIGJ1Zik7CgkJICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdtbS0+bHBzdHJDb3B5cmlnaHQgPSBIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIHN0cmxlbihidWYpKzEgKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KCB3bW0tPmxwc3RyQ29weXJpZ2h0LCBidWYgKTsKCQkgICAgfQoJCSAgICBicmVhazsKCQljYXNlIDB4MDM6CgkJICAgIGlmICh3bW0tPmxwc3RyTmFtZSkgewoJCQlXQVJOKCJUd28gbmFtZXMgKCVzfCVzKVxuIiwgd21tLT5scHN0ck5hbWUsIGJ1Zik7CgkJICAgIH0gZWxzZSB7CgkJCXdtbS0+bHBzdHJOYW1lID0gSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzdHJsZW4oYnVmKSsxICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweSggd21tLT5scHN0ck5hbWUsIGJ1ZiApOwoJCSAgICB9CgkJICAgIGJyZWFrOwoJCX0KCSAgICB9CgkgICAgYnJlYWs7Cgl9CiAgICB9CiAgICBtbXQtPmR3TGVuZ3RoID0gbW10LT5kd0V2ZW50UHVsc2U7CgogICAgVFJBQ0UoIlRyYWNrICV1IGhhcyAlbHUgYnl0ZXMgYW5kICVsdSBwdWxzZXNcbiIsIG1tdC0+d1RyYWNrTnIsIHRvYmVyZWFkLCBtbXQtPmR3TGVuZ3RoKTsKCiAgICAvKiByZXNldCB0cmFjayBkYXRhICovCiAgICBtbXQtPndTdGF0dXMgPSAxOwkvKiBvaywgcGxheWluZyAqLwogICAgbW10LT5kd0luZGV4ID0gbW10LT5kd0ZpcnN0OwogICAgbW10LT5kd0V2ZW50UHVsc2UgPSAwOwoKICAgIGlmIChtbWlvU2Vlayh3bW0tPmhGaWxlLCAwLCBTRUVLX0NVUikgIT0gbW10LT5kd0xhc3QpIHsKCVdBUk4oIk91Y2gsIG91dCBvZiBzeW5jIHNlZWs9JWx1IHRyYWNrPSVsdVxuIiwKCSAgICAgbW1pb1NlZWsod21tLT5oRmlsZSwgMCwgU0VFS19DVVIpLCBtbXQtPmR3TGFzdCk7CgkvKiBwb3NpdGlvbiBhdCBlbmQgb2YgdGhpcyB0cmFjaywgdG8gYmUgcmVhZHkgdG8gcmVhZCBuZXh0IHRyYWNrICovCgltbWlvU2Vlayh3bW0tPmhGaWxlLCBtbXQtPmR3TGFzdCwgU0VFS19TRVQpOwogICAgfQoKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpUmVhZE1UaGQJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRCBNSURJX21jaVJlYWRNVGhkKFdJTkVfTUNJTUlESSogd21tLCBEV09SRCBkd09mZnNldCkKewogICAgRFdPUkQJdG9iZXJlYWQ7CiAgICBGT1VSQ0MJZm91cmNjOwogICAgV09SRAludDsKCiAgICBUUkFDRSgiKCVwLCAlMDhsWCk7XG4iLCB3bW0sIGR3T2Zmc2V0KTsKCiAgICBpZiAobW1pb1NlZWsod21tLT5oRmlsZSwgZHdPZmZzZXQsIFNFRUtfU0VUKSAhPSBkd09mZnNldCkgewoJV0FSTigiQ2FuJ3Qgc2VlayBhdCAlMDhsWCBiZWdpbiBvZiAnTVRoZCcgXG4iLCBkd09mZnNldCk7CglyZXR1cm4gTUNJRVJSX0lOVkFMSURfRklMRTsKICAgIH0KICAgIGlmIChtbWlvUmVhZCh3bW0tPmhGaWxlLCAoSFBTVFIpJmZvdXJjYywKCQkgICAobG9uZykgc2l6ZW9mKEZPVVJDQykpICE9IChsb25nKSBzaXplb2YoRk9VUkNDKSkKCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9GSUxFOwoKICAgIGlmIChmb3VyY2MgIT0gbW1pb0ZPVVJDQygnTScsICdUJywgJ2gnLCAnZCcpKSB7CglXQVJOKCJDYW4ndCBzeW5jaHJvbml6ZSBvbiAnTVRoZCcgIVxuIik7CglyZXR1cm4gTUNJRVJSX0lOVkFMSURfRklMRTsKICAgIH0KCiAgICBpZiAoTUlESV9tY2lSZWFkTG9uZyh3bW0sICZ0b2JlcmVhZCkgIT0gMCB8fCB0b2JlcmVhZCA8IDMgKiBzaXplb2YoV09SRCkpCglyZXR1cm4gTUNJRVJSX0lOVkFMSURfRklMRTsKCiAgICBpZiAoTUlESV9tY2lSZWFkV29yZCh3bW0sICZ3bW0tPndGb3JtYXQpICE9IDAgfHwKCU1JRElfbWNpUmVhZFdvcmQod21tLCAmd21tLT5uVHJhY2tzKSAhPSAwIHx8CglNSURJX21jaVJlYWRXb3JkKHdtbSwgJndtbS0+bkRpdmlzaW9uKSAhPSAwKSB7CglyZXR1cm4gTUNJRVJSX0lOVkFMSURfRklMRTsKICAgIH0KCiAgICBUUkFDRSgidG9iZXJlYWQ9MHglMDhsWCwgd0Zvcm1hdD0weCUwNFggblRyYWNrcz0weCUwNFggbkRpdmlzaW9uPTB4JTA0WFxuIiwKCSAgdG9iZXJlYWQsIHdtbS0+d0Zvcm1hdCwgd21tLT5uVHJhY2tzLCB3bW0tPm5EaXZpc2lvbik7CgogICAgLyogTVMgZG9jIHNheXMgdGhhdCB0aGUgTUlESSBNQ0kgdGltZSBmb3JtYXQgbXVzdCBiZSBwdXQgYnkgZGVmYXVsdCB0byB0aGUgZm9ybWF0CiAgICAgKiBzdG9yZWQgaW4gdGhlIE1JREkgZmlsZS4uLgogICAgICovCiAgICBpZiAod21tLT5uRGl2aXNpb24gPiAweDgwMDApIHsKCS8qIGVyaWMucG91ZWNoQGxlbWVsLmZyIDk4LzExCgkgKiBJbiBkaWQgbm90IGNoZWNrIHRoaXMgdmVyeSBjb2RlIChwdWxzZXMgYXJlIGV4cHJlc3NlZCBhcyBTTVBURSBzdWItZnJhbWVzKS4KCSAqIEluIGFib3V0IDQwIE1CIG9mIE1JREkgZmlsZXMgSSBoYXZlLCBub25lIHdhcyBTTVBURSBiYXNlZC4uLgoJICogSSdtIGp1c3Qgd29uZGVyaW5nIGlmIHRoaXMgaXMgd2lkZWx5IHVzZWQgOi0pLiBTbywgaWYgc29tZW9uZSBoYXMgb25lIG9mCgkgKiB0aGVzZSBmaWxlcywgSSdkIGxpa2UgdG8ga25vdyBhYm91dC4KCSAqLwoJRklYTUUoIkhhbmRsaW5nIFNNUFRFIHRpbWUgaW4gTUlESSBmaWxlcyBoYXMgbm90IGJlZW4gdGVzdGVkXG4iCgkgICAgICAiUGxlYXNlIHJlcG9ydCB0byBjb21wLmVtdWxhdG9ycy5tcy13aW5kb3dzLndpbmUgd2l0aCBNSURJIGZpbGUgIVxuIik7CgoJc3dpdGNoIChISUJZVEUod21tLT5uRGl2aXNpb24pKSB7CgljYXNlIDB4RTg6CXdtbS0+ZHdNY2lUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9TTVBURV8yNDsJYnJlYWs7CS8qIC0yNCAqLwoJY2FzZSAweEU3Ogl3bW0tPmR3TWNpVGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfU01QVEVfMjU7CWJyZWFrOwkvKiAtMjUgKi8KCWNhc2UgMHhFMzoJd21tLT5kd01jaVRpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX1NNUFRFXzMwRFJPUDsJYnJlYWs7CS8qIC0yOSAqLyAvKiBpcyB0aGUgTUNJIGNvbnN0YW50IGNvcnJlY3QgPyAqLwoJY2FzZSAweEUyOgl3bW0tPmR3TWNpVGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfU01QVEVfMzA7CWJyZWFrOwkvKiAtMzAgKi8KCWRlZmF1bHQ6CgkgICAgV0FSTigiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGZyYW1lcyAlZFxuIiwgLShjaGFyKUhJQllURSh3bW0tPm5EaXZpc2lvbikpOwoJICAgIHJldHVybiBNQ0lFUlJfSU5WQUxJRF9GSUxFOwoJfQoJc3dpdGNoIChMT0JZVEUod21tLT5uRGl2aXNpb24pKSB7CgljYXNlIDQ6CS8qIE1JREkgVGltZSBDb2RlICovCgljYXNlIDg6CgljYXNlIDEwOgoJY2FzZSA4MDogLyogU01QVEUgYml0IHJlc29sdXRpb24gKi8KCWNhc2UgMTAwOgoJZGVmYXVsdDoKCSAgICBXQVJOKCJVbnN1cHBvcnRlZCBudW1iZXIgb2Ygc3ViLWZyYW1lcyAlZFxuIiwgTE9CWVRFKHdtbS0+bkRpdmlzaW9uKSk7CgkgICAgcmV0dXJuIE1DSUVSUl9JTlZBTElEX0ZJTEU7Cgl9CiAgICB9IGVsc2UgaWYgKHdtbS0+bkRpdmlzaW9uID09IDApIHsKCVdBUk4oIk51bWJlciBvZiBkaXZpc2lvbiBpcyAwLCBjYW4ndCBzdXBwb3J0IHRoYXQgISFcbiIpOwoJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0ZJTEU7CiAgICB9IGVsc2UgewoJd21tLT5kd01jaVRpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX01JTExJU0VDT05EUzsKICAgIH0KCiAgICBzd2l0Y2ggKHdtbS0+d0Zvcm1hdCkgewogICAgY2FzZSAwOgoJaWYgKHdtbS0+blRyYWNrcyAhPSAxKSB7CgkgICAgV0FSTigiR290IHR5cGUgMCBmaWxlIHdob3NlIG51bWJlciBvZiB0cmFjayBpcyBub3QgMS4gU2V0dGluZyBpdCB0byAxXG4iKTsKCSAgICB3bW0tPm5UcmFja3MgPSAxOwoJfQoJYnJlYWs7CiAgICBjYXNlIDE6CiAgICBjYXNlIDI6CglicmVhazsKICAgIGRlZmF1bHQ6CglXQVJOKCJIYW5kbGluZyBNSURJIGZpbGVzIHdoaWNoIGZvcm1hdCA9ICVkIGlzIG5vdCAoeWV0KSBzdXBwb3J0ZWRcbiIKCSAgICAgIlBsZWFzZSByZXBvcnQgd2l0aCBNSURJIGZpbGUgIVxuIiwgd21tLT53Rm9ybWF0KTsKCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9GSUxFOwogICAgfQoKICAgIGlmICh3bW0tPm5UcmFja3MgJiAweDgwMDApIHsKCS8qIHRoaXMgc2hvdWxkbid0IGJlIGEgcHJvYmxlbS4uLiAqLwoJV0FSTigiT3VjaCAhISBJbXBsZW1lbnRhdGlvbiBsaW1pdGF0aW9uIHRvIDMyayB0cmFja3MgcGVyIE1JREkgZmlsZSBpcyBvdmVyZmxvd2VkXG4iKTsKCXdtbS0+blRyYWNrcyA9IDB4N0ZGRjsKICAgIH0KCiAgICBpZiAoKHdtbS0+dHJhY2tzID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZihNQ0lfTUlESVRSQUNLKSAqIHdtbS0+blRyYWNrcykpID09IE5VTEwpIHsKCXJldHVybiBNQ0lFUlJfT1VUX09GX01FTU9SWTsKICAgIH0KCiAgICB0b2JlcmVhZCAtPSAzICogc2l6ZW9mKFdPUkQpOwogICAgaWYgKHRvYmVyZWFkID4gMCkgewoJVFJBQ0UoIlNpemUgb2YgTVRoZCA+IDYsIHNraXBwaW5nICVsZCBleHRyYSBieXRlc1xuIiwgdG9iZXJlYWQpOwoJbW1pb1NlZWsod21tLT5oRmlsZSwgdG9iZXJlYWQsIFNFRUtfQ1VSKTsKICAgIH0KCiAgICBmb3IgKG50ID0gMDsgbnQgPCB3bW0tPm5UcmFja3M7IG50KyspIHsKCXdtbS0+dHJhY2tzW250XS53VHJhY2tOciA9IG50OwoJaWYgKE1JRElfbWNpUmVhZE1Ucmsod21tLCAmd21tLT50cmFja3NbbnRdKSAhPSAwKSB7CgkgICAgV0FSTigiQ2FuJ3QgcmVhZCAnTVRyaycgaGVhZGVyIFxuIik7CgkgICAgcmV0dXJuIE1DSUVSUl9JTlZBTElEX0ZJTEU7Cgl9CiAgICB9CgogICAgd21tLT5kd1RlbXBvID0gNTAwMDAwOwoKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJTUlESV9Db252ZXJ0UHVsc2VUb01TCQkJW2ludGVybmFsXQogKi8Kc3RhdGljCURXT1JECU1JRElfQ29udmVydFB1bHNlVG9NUyhXSU5FX01DSU1JREkqIHdtbSwgRFdPUkQgcHVsc2UpCnsKICAgIERXT1JECXJldCA9IDA7CgogICAgLyogRklYTUU6IHRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBmYWxzZSB2YWx1ZXMgc2luY2UgdGhlIHRlbXBvICh3bW0tPmR3VGVtcG8pCiAgICAgKiBtYXkgY2hhbmdlIGR1cmluZyBmaWxlIHBsYXlpbmcKICAgICAqLwogICAgaWYgKHdtbS0+bkRpdmlzaW9uID09IDApIHsKCUZJWE1FKCJTaG91bGRuJ3QgaGFwcGVuLiB3bW0tPm5EaXZpc2lvbiA9IDBcbiIpOwogICAgfSBlbHNlIGlmICh3bW0tPm5EaXZpc2lvbiA+IDB4ODAwMCkgeyAvKiBTTVBURSwgdW5jaGVja2VkIEZJWE1FPyAqLwoJaW50CW5mID0gLShjaGFyKUhJQllURSh3bW0tPm5EaXZpc2lvbik7CS8qIG51bWJlciBvZiBmcmFtZXMgICAgICovCglpbnQJbnNmID0gTE9CWVRFKHdtbS0+bkRpdmlzaW9uKTsJCS8qIG51bWJlciBvZiBzdWItZnJhbWVzICovCglyZXQgPSAocHVsc2UgKiAxMDAwKSAvIChuZiAqIG5zZik7CiAgICB9IGVsc2UgewoJcmV0ID0gKERXT1JEKSgoZG91YmxlKXB1bHNlICogKChkb3VibGUpd21tLT5kd1RlbXBvIC8gMTAwMCkgLwoJCSAgICAgIChkb3VibGUpd21tLT5uRGl2aXNpb24pOwogICAgfQoKICAgIC8qCiAgICAgIFRSQUNFKCJwdWxzZT0lbHUgdGVtcG89JWx1IGRpdmlzaW9uPSV1PTB4JTA0eCA9PiBtcz0lbHVcbiIsCiAgICAgIHB1bHNlLCB3bW0tPmR3VGVtcG8sIHdtbS0+bkRpdmlzaW9uLCB3bW0tPm5EaXZpc2lvbiwgcmV0KTsKICAgICovCgogICAgcmV0dXJuIHJldDsKfQoKI2RlZmluZSBUSU1FX01TX0lOX09ORV9IT1VSCSg2MCo2MCoxMDAwKQojZGVmaW5lIFRJTUVfTVNfSU5fT05FX01JTlVURQkoNjAqMTAwMCkKI2RlZmluZSBUSU1FX01TX0lOX09ORV9TRUNPTkQJKDEwMDApCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJTUlESV9Db252ZXJ0VGltZUZvcm1hdFRvTVMJCVtpbnRlcm5hbF0KICovCnN0YXRpYwlEV09SRAlNSURJX0NvbnZlcnRUaW1lRm9ybWF0VG9NUyhXSU5FX01DSU1JREkqIHdtbSwgRFdPUkQgdmFsKQp7CiAgICBEV09SRAlyZXQgPSAwOwoKICAgIHN3aXRjaCAod21tLT5kd01jaVRpbWVGb3JtYXQpIHsKICAgIGNhc2UgTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM6CglyZXQgPSB2YWw7CglicmVhazsKICAgIGNhc2UgTUNJX0ZPUk1BVF9TTVBURV8yNDoKCXJldCA9CgkgICAgKEhJQllURShISVdPUkQodmFsKSkgKiAxMjUpIC8gMyArICAgICAgICAgICAgIExPQllURShISVdPUkQodmFsKSkgKiBUSU1FX01TX0lOX09ORV9TRUNPTkQgKwoJICAgIEhJQllURShMT1dPUkQodmFsKSkgKiBUSU1FX01TX0lOX09ORV9NSU5VVEUgKyBMT0JZVEUoTE9XT1JEKHZhbCkpICogVElNRV9NU19JTl9PTkVfSE9VUjsKCWJyZWFrOwogICAgY2FzZSBNQ0lfRk9STUFUX1NNUFRFXzI1OgoJcmV0ID0KCSAgICBISUJZVEUoSElXT1JEKHZhbCkpICogNDAgKyAJCSAgCSAgTE9CWVRFKEhJV09SRCh2YWwpKSAqIFRJTUVfTVNfSU5fT05FX1NFQ09ORCArCgkgICAgSElCWVRFKExPV09SRCh2YWwpKSAqIFRJTUVfTVNfSU5fT05FX01JTlVURSArIExPQllURShMT1dPUkQodmFsKSkgKiBUSU1FX01TX0lOX09ORV9IT1VSOwoJYnJlYWs7CiAgICBjYXNlIE1DSV9GT1JNQVRfU01QVEVfMzA6CglyZXQgPQoJICAgIChISUJZVEUoSElXT1JEKHZhbCkpICogMTAwKSAvIDMgKyAJCSAgTE9CWVRFKEhJV09SRCh2YWwpKSAqIFRJTUVfTVNfSU5fT05FX1NFQ09ORCArCgkgICAgSElCWVRFKExPV09SRCh2YWwpKSAqIFRJTUVfTVNfSU5fT05FX01JTlVURSArIExPQllURShMT1dPUkQodmFsKSkgKiBUSU1FX01TX0lOX09ORV9IT1VSOwoJYnJlYWs7CiAgICBkZWZhdWx0OgoJV0FSTigiQmFkIHRpbWUgZm9ybWF0ICVsdSFcbiIsIHdtbS0+ZHdNY2lUaW1lRm9ybWF0KTsKICAgIH0KICAgIC8qCiAgICAgIFRSQUNFKCJ2YWw9JWx1PTB4JTA4bHggW3RmPSVsdV0gPT4gcmV0PSVsdVxuIiwgdmFsLCB2YWwsIHdtbS0+ZHdNY2lUaW1lRm9ybWF0LCByZXQpOwogICAgKi8KICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQlNSURJX0NvbnZlcnRNU1RvVGltZUZvcm1hdAkJW2ludGVybmFsXQogKi8Kc3RhdGljCURXT1JECU1JRElfQ29udmVydE1TVG9UaW1lRm9ybWF0KFdJTkVfTUNJTUlESSogd21tLCBEV09SRCBfdmFsKQp7CiAgICBEV09SRAlyZXQgPSAwLCB2YWwgPSBfdmFsOwogICAgRFdPUkQJaCwgbSwgcywgZjsKCiAgICBzd2l0Y2ggKHdtbS0+ZHdNY2lUaW1lRm9ybWF0KSB7CiAgICBjYXNlIE1DSV9GT1JNQVRfTUlMTElTRUNPTkRTOgoJcmV0ID0gdmFsOwoJYnJlYWs7CiAgICBjYXNlIE1DSV9GT1JNQVRfU01QVEVfMjQ6CiAgICBjYXNlIE1DSV9GT1JNQVRfU01QVEVfMjU6CiAgICBjYXNlIE1DSV9GT1JNQVRfU01QVEVfMzA6CgloID0gdmFsIC8gVElNRV9NU19JTl9PTkVfSE9VUjsKCW0gPSAodmFsIC09IGggKiBUSU1FX01TX0lOX09ORV9IT1VSKSAgIC8gVElNRV9NU19JTl9PTkVfTUlOVVRFOwoJcyA9ICh2YWwgLT0gbSAqIFRJTUVfTVNfSU5fT05FX01JTlVURSkgLyBUSU1FX01TX0lOX09ORV9TRUNPTkQ7Cglzd2l0Y2ggKHdtbS0+ZHdNY2lUaW1lRm9ybWF0KSB7CgljYXNlIE1DSV9GT1JNQVRfU01QVEVfMjQ6CgkgICAgLyogb25lIGZyYW1lIGlzIDEwMDAvMjQgdmFsIGxvbmcsIDEwMDAvMjQgPT0gMTI1LzMgKi8KCSAgICBmID0gKHZhbCAqIDMpIC8gMTI1OyAJdmFsIC09IChmICogMTI1KSAvIDM7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9GT1JNQVRfU01QVEVfMjU6CgkgICAgLyogb25lIGZyYW1lIGlzIDEwMDAvMjUgbXMgbG9uZywgMTAwMC8yNSA9PSA0MCAqLwoJICAgIGYgPSB2YWwgLyA0MDsgCQl2YWwgLT0gZiAqIDQwOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfRk9STUFUX1NNUFRFXzMwOgoJICAgIC8qIG9uZSBmcmFtZSBpcyAxMDAwLzMwIG1zIGxvbmcsIDEwMDAvMzAgPT0gMTAwLzMgKi8KCSAgICBmID0gKHZhbCAqIDMpIC8gMTAwOyAJdmFsIC09IChmICogMTAwKSAvIDM7CgkgICAgYnJlYWs7CglkZWZhdWx0OgoJICAgIEZJWE1FKCJUaGVyZSBtdXN0IGJlIHNvbWUgYmFkIGJhZCBwcm9ncmFtbWVyXG4iKTsKCSAgICBmID0gMDsKCX0KCS8qIHZhbCBjb250YWlucyB0aGUgbnVtYmVyIG9mIG1zIHdoaWNoIGNhbm5vdCBtYWtlIGEgY29tcGxldGUgZnJhbWUgKi8KCS8qIEZJWE1FOiBpcyB0aGlzIGNvcnJlY3QgPyBwcm9ncmFtcyBzZWVtIHRvIGJlIGhhcHB5IHdpdGggdGhhdCAqLwoJcmV0ID0gKGYgPDwgMjQpIHwgKHMgPDwgMTYpIHwgKG0gPDwgOCkgfCAoaCA8PCAwKTsKCWJyZWFrOwogICAgZGVmYXVsdDoKCVdBUk4oIkJhZCB0aW1lIGZvcm1hdCAlbHUhXG4iLCB3bW0tPmR3TWNpVGltZUZvcm1hdCk7CiAgICB9CiAgICAvKgogICAgICBUUkFDRSgidmFsPSVsdSBbdGY9JWx1XSA9PiByZXQ9JWx1PTB4JTA4bHhcbiIsIF92YWwsIHdtbS0+ZHdNY2lUaW1lRm9ybWF0LCByZXQsIHJldCk7CiAgICAqLwogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCU1JRElfR2V0TVRoZExlbmd0aE1TCQkJW2ludGVybmFsXQogKi8Kc3RhdGljCURXT1JECU1JRElfR2V0TVRoZExlbmd0aE1TKFdJTkVfTUNJTUlESSogd21tKQp7CiAgICBXT1JECW50OwogICAgRFdPUkQJcmV0ID0gMDsKCiAgICBmb3IgKG50ID0gMDsgbnQgPCB3bW0tPm5UcmFja3M7IG50KyspIHsKCWlmICh3bW0tPndGb3JtYXQgPT0gMikgewoJICAgIHJldCArPSB3bW0tPnRyYWNrc1tudF0uZHdMZW5ndGg7Cgl9IGVsc2UgaWYgKHdtbS0+dHJhY2tzW250XS5kd0xlbmd0aCA+IHJldCkgewoJICAgIHJldCA9IHdtbS0+dHJhY2tzW250XS5kd0xlbmd0aDsKCX0KICAgIH0KICAgIC8qIEZJWE1FOiB0aGlzIGlzIHdyb25nIGlmIHRoZXJlIGlzIGEgdGVtcG8gY2hhbmdlIGluc2lkZSB0aGUgZmlsZSAqLwogICAgcmV0dXJuIE1JRElfQ29udmVydFB1bHNlVG9NUyh3bW0sIHJldCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lPcGVuCQkJW2ludGVybmFsXQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpT3BlbihVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfT1BFTl9QQVJNU0EgbHBQYXJtcykKewogICAgRFdPUkQJCWR3UmV0ID0gMDsKICAgIERXT1JECQlkd0RldmljZUlEOwogICAgV0lORV9NQ0lNSURJKgl3bW0gPSAoV0lORV9NQ0lNSURJKiltY2lHZXREcml2ZXJEYXRhKHdEZXZJRCk7CgogICAgVFJBQ0UoIiglMDR4LCAlMDhsWCwgJXApXG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwoKICAgIGlmIChscFBhcm1zID09IE5VTEwpIAlyZXR1cm4gTUNJRVJSX05VTExfUEFSQU1FVEVSX0JMT0NLOwogICAgaWYgKHdtbSA9PSBOVUxMKQkJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKICAgIGlmIChkd0ZsYWdzICYgTUNJX09QRU5fU0hBUkVBQkxFKQoJcmV0dXJuIE1DSUVSUl9IQVJEV0FSRTsKCiAgICBpZiAod21tLT5uVXNlQ291bnQgPiAwKSB7CgkvKiBUaGUgZHJpdmVyIGlzIGFscmVhZHkgb3BlbmVkIG9uIHRoaXMgY2hhbm5lbAoJICogTUlESSBzZXF1ZW5jZXIgY2Fubm90IGJlIHNoYXJlZAoJICovCglyZXR1cm4gTUNJRVJSX0RFVklDRV9PUEVOOwogICAgfQogICAgd21tLT5uVXNlQ291bnQrKzsKCiAgICB3bW0tPmhGaWxlID0gMDsKICAgIHdtbS0+aE1pZGkgPSAwOwogICAgd21tLT5scHN0ckVsZW1lbnROYW1lID0gTlVMTDsKICAgIGR3RGV2aWNlSUQgPSBscFBhcm1zLT53RGV2aWNlSUQ7CgogICAgVFJBQ0UoIndEZXZJRD0lMDRYIChscFBhcmFtcy0+d0RldmljZUlEPSUwOGxYKVxuIiwgd0RldklELCBkd0RldmljZUlEKTsKICAgIC8qCWxwUGFybXMtPndEZXZpY2VJRCA9IHdEZXZJRDsqLwoKICAgIGlmIChkd0ZsYWdzICYgTUNJX09QRU5fRUxFTUVOVCkgewoJVFJBQ0UoIk1DSV9PUEVOX0VMRU1FTlQgJyVzJyAhXG4iLCBscFBhcm1zLT5scHN0ckVsZW1lbnROYW1lKTsKCWlmIChscFBhcm1zLT5scHN0ckVsZW1lbnROYW1lICYmIHN0cmxlbihscFBhcm1zLT5scHN0ckVsZW1lbnROYW1lKSA+IDApIHsKCSAgICB3bW0tPmhGaWxlID0gbW1pb09wZW5BKGxwUGFybXMtPmxwc3RyRWxlbWVudE5hbWUsIE5VTEwsCgkJCQkgICBNTUlPX0FMTE9DQlVGIHwgTU1JT19SRUFEIHwgTU1JT19ERU5ZV1JJVEUpOwoJICAgIGlmICh3bW0tPmhGaWxlID09IDApIHsKCQlXQVJOKCJDYW4ndCBmaW5kIGZpbGUgJyVzJyAhXG4iLCBscFBhcm1zLT5scHN0ckVsZW1lbnROYW1lKTsKCQl3bW0tPm5Vc2VDb3VudC0tOwoJCXJldHVybiBNQ0lFUlJfRklMRV9OT1RfRk9VTkQ7CgkgICAgfQogICAgICAgICAgICB3bW0tPmxwc3RyRWxlbWVudE5hbWUgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3RybGVuKGxwUGFybXMtPmxwc3RyRWxlbWVudE5hbWUpICsgMSk7CiAgICAgICAgICAgIHN0cmNweSh3bW0tPmxwc3RyRWxlbWVudE5hbWUsIGxwUGFybXMtPmxwc3RyRWxlbWVudE5hbWUpOwoJfQogICAgfQogICAgVFJBQ0UoImhGaWxlPSVwXG4iLCB3bW0tPmhGaWxlKTsKCiAgICB3bW0tPmxwc3RyQ29weXJpZ2h0ID0gTlVMTDsKICAgIHdtbS0+bHBzdHJOYW1lID0gTlVMTDsKCiAgICB3bW0tPndOb3RpZnlEZXZpY2VJRCA9IGR3RGV2aWNlSUQ7CiAgICB3bW0tPmR3U3RhdHVzID0gTUNJX01PREVfTk9UX1JFQURZOwkvKiB3aGlsZSBsb2FkaW5nIGZpbGUgY29udGVudHMgKi8KICAgIC8qIHNwZWMgc2F5cyBpdCBzaG91bGQgYmUgdGhlIGRlZmF1bHQgZm9ybWF0IGZyb20gdGhlIE1JREkgZmlsZS4uLiAqLwogICAgd21tLT5kd01jaVRpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX01JTExJU0VDT05EUzsKCiAgICBpZiAod21tLT5oRmlsZSAhPSAwKSB7CglNTUNLSU5GTwlja01haW5SSUZGOwoJTU1DS0lORk8JbW1ja0luZm87CglEV09SRAkJZHdPZmZzZXQgPSAwOwoKCWlmIChtbWlvRGVzY2VuZCh3bW0tPmhGaWxlLCAmY2tNYWluUklGRiwgTlVMTCwgMCkgIT0gMCkgewoJICAgIGR3UmV0ID0gTUNJRVJSX0lOVkFMSURfRklMRTsKCX0gZWxzZSB7CgkgICAgVFJBQ0UoIlBhcmVudENodW5rIGNraWQ9JS40cyBmY2NUeXBlPSUuNHMgY2tzaXplPSUwOGxYIFxuIiwKCQkgIChMUFNUUikmY2tNYWluUklGRi5ja2lkLCAoTFBTVFIpJmNrTWFpblJJRkYuZmNjVHlwZSwgY2tNYWluUklGRi5ja3NpemUpOwoKCSAgICBpZiAoY2tNYWluUklGRi5ja2lkID09IEZPVVJDQ19SSUZGICYmIGNrTWFpblJJRkYuZmNjVHlwZSA9PSBtbWlvRk9VUkNDKCdSJywgJ00nLCAnSScsICdEJykpIHsKCQltbWNrSW5mby5ja2lkID0gbW1pb0ZPVVJDQygnZCcsICdhJywgJ3QnLCAnYScpOwoJCW1taW9TZWVrKHdtbS0+aEZpbGUsIGNrTWFpblJJRkYuZHdEYXRhT2Zmc2V0ICsgKChja01haW5SSUZGLmNrc2l6ZSArIDEpICYgfjEpLCBTRUVLX1NFVCk7CgkJaWYgKG1taW9EZXNjZW5kKHdtbS0+aEZpbGUsICZtbWNrSW5mbywgJmNrTWFpblJJRkYsIE1NSU9fRklORENIVU5LKSA9PSAwKSB7CgkJICAgIFRSQUNFKCIuLi4gaXMgYSAnUk1JRCcgZmlsZSBcbiIpOwoJCSAgICBkd09mZnNldCA9IG1tY2tJbmZvLmR3RGF0YU9mZnNldDsKCQl9IGVsc2UgewoJCSAgICBkd1JldCA9IE1DSUVSUl9JTlZBTElEX0ZJTEU7CgkJfQoJICAgIH0KCSAgICBpZiAoZHdSZXQgPT0gMCAmJiBNSURJX21jaVJlYWRNVGhkKHdtbSwgZHdPZmZzZXQpICE9IDApIHsKCQlXQVJOKCJDYW4ndCByZWFkICdNVGhkJyBoZWFkZXIgXG4iKTsKCQlkd1JldCA9IE1DSUVSUl9JTlZBTElEX0ZJTEU7CgkgICAgfQoJfQogICAgfSBlbHNlIHsKCVRSQUNFKCJoRmlsZT09MCwgc2V0dGluZyAjdHJhY2tzIHRvIDA7IGlzIHRoaXMgY29ycmVjdCA/XG4iKTsKCXdtbS0+blRyYWNrcyA9IDA7Cgl3bW0tPndGb3JtYXQgPSAwOwoJd21tLT5uRGl2aXNpb24gPSAxOwogICAgfQogICAgaWYgKGR3UmV0ICE9IDApIHsKCXdtbS0+blVzZUNvdW50LS07CglpZiAod21tLT5oRmlsZSAhPSAwKQoJICAgIG1taW9DbG9zZSh3bW0tPmhGaWxlLCAwKTsKCXdtbS0+aEZpbGUgPSAwOwogICAgfSBlbHNlIHsKCXdtbS0+ZHdQb3NpdGlvbk1TID0gMDsKCXdtbS0+ZHdTdGF0dXMgPSBNQ0lfTU9ERV9TVE9QOwogICAgfQogICAgcmV0dXJuIGR3UmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpU3RvcAkJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRCBNSURJX21jaVN0b3AoVUlOVCB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKewogICAgV0lORV9NQ0lNSURJKgl3bW0gPSBNSURJX21jaUdldE9wZW5EZXYod0RldklEKTsKICAgIERXT1JECQlkd1JldCA9IDA7CgogICAgVFJBQ0UoIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKCiAgICBpZiAod21tID09IE5VTEwpCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfSUQ7CgogICAgaWYgKHdtbS0+ZHdTdGF0dXMgIT0gTUNJX01PREVfU1RPUCkgewoJaW50CW9sZHN0YXQgPSB3bW0tPmR3U3RhdHVzOwoKCXdtbS0+ZHdTdGF0dXMgPSBNQ0lfTU9ERV9OT1RfUkVBRFk7CglpZiAob2xkc3RhdCA9PSBNQ0lfTU9ERV9QQVVTRSkKCSAgICBkd1JldCA9IG1pZGlPdXRSZXNldCgoSE1JRElPVVQpd21tLT5oTWlkaSk7CgoJd2hpbGUgKHdtbS0+ZHdTdGF0dXMgIT0gTUNJX01PREVfU1RPUCkKCSAgICBTbGVlcCgxMCk7CiAgICB9CgogICAgLyogc2FuaXRpeSByZXNldCAqLwogICAgd21tLT5kd1N0YXR1cyA9IE1DSV9NT0RFX1NUT1A7CgogICAgVFJBQ0UoIndtbS0+ZHdTdGF0dXM9JWRcbiIsIHdtbS0+ZHdTdGF0dXMpOwoKICAgIGlmIChscFBhcm1zICYmIChkd0ZsYWdzICYgTUNJX05PVElGWSkpIHsKCVRSQUNFKCJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CgltY2lEcml2ZXJOb3RpZnkoSFdORF8zMihMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjaykpLAoJCQl3bW0tPndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKICAgIH0KICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpQ2xvc2UJCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lDbG9zZShVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQp7CiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfbWNpR2V0T3BlbkRldih3RGV2SUQpOwoKICAgIFRSQUNFKCIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CgogICAgaWYgKHdtbSA9PSBOVUxMKQlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwoKICAgIGlmICh3bW0tPmR3U3RhdHVzICE9IE1DSV9NT0RFX1NUT1ApIHsKCU1JRElfbWNpU3RvcCh3RGV2SUQsIE1DSV9XQUlULCBscFBhcm1zKTsKICAgIH0KCiAgICB3bW0tPm5Vc2VDb3VudC0tOwogICAgaWYgKHdtbS0+blVzZUNvdW50ID09IDApIHsKCWlmICh3bW0tPmhGaWxlICE9IDApIHsKCSAgICBtbWlvQ2xvc2Uod21tLT5oRmlsZSwgMCk7CgkgICAgd21tLT5oRmlsZSA9IDA7CgkgICAgVFJBQ0UoImhGaWxlIGNsb3NlZCAhXG4iKTsKCX0KCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHdtbS0+dHJhY2tzKTsKCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIChMUFNUUil3bW0tPmxwc3RyRWxlbWVudE5hbWUpOwoJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKExQU1RSKXdtbS0+bHBzdHJDb3B5cmlnaHQpOwoJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKExQU1RSKXdtbS0+bHBzdHJOYW1lKTsKICAgIH0gZWxzZSB7CglUUkFDRSgiU2hvdWxkbid0IGhhcHBlbi4uLiBuVXNlQ291bnQ9JWRcbiIsIHdtbS0+blVzZUNvdW50KTsKCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAgICB9CgogICAgaWYgKGxwUGFybXMgJiYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSkgewoJVFJBQ0UoIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKCW1jaURyaXZlck5vdGlmeShIV05EXzMyKExPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSksCgkJCXdtbS0+d05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lGaW5kTmV4dEV2ZW50CQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMgTUNJX01JRElUUkFDSyoJTUlESV9tY2lGaW5kTmV4dEV2ZW50KFdJTkVfTUNJTUlESSogd21tLCBMUERXT1JEIGhpUHVsc2UpCnsKICAgIFdPUkQJCWNudCwgbnQ7CiAgICBNQ0lfTUlESVRSQUNLKgltbXQ7CgogICAgKmhpUHVsc2UgPSAweEZGRkZGRkZGdWw7CiAgICBjbnQgPSAweEZGRkZ1OwogICAgZm9yIChudCA9IDA7IG50IDwgd21tLT5uVHJhY2tzOyBudCsrKSB7CgltbXQgPSAmd21tLT50cmFja3NbbnRdOwoKCWlmIChtbXQtPndTdGF0dXMgPT0gMCkKCSAgICBjb250aW51ZTsKCWlmIChtbXQtPmR3RXZlbnRQdWxzZSA8ICpoaVB1bHNlKSB7CgkgICAgKmhpUHVsc2UgPSBtbXQtPmR3RXZlbnRQdWxzZTsKCSAgICBjbnQgPSBudDsKCX0KICAgIH0KICAgIHJldHVybiAoY250ID09IDB4RkZGRnUpID8gMCAvKiBubyBtb3JlIGV2ZW50IG9uIGFsbCB0cmFja3MgKi8KCTogJndtbS0+dHJhY2tzW2NudF07Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lQbGF5CQkJW2ludGVybmFsXQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpUGxheShVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfUExBWV9QQVJNUyBscFBhcm1zKQp7CiAgICBEV09SRAkJZHdTdGFydE1TLCBkd0VuZE1TOwogICAgRFdPUkQJCWR3UmV0ID0gMDsKICAgIFdPUkQJCWRvUGxheSwgbnQ7CiAgICBNQ0lfTUlESVRSQUNLKgltbXQ7CiAgICBEV09SRAkJaGlQdWxzZTsKICAgIFdJTkVfTUNJTUlESSoJd21tID0gTUlESV9tY2lHZXRPcGVuRGV2KHdEZXZJRCk7CgogICAgVFJBQ0UoIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKCiAgICBpZiAod21tID09IE5VTEwpCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfSUQ7CgogICAgaWYgKHdtbS0+aEZpbGUgPT0gMCkgewoJV0FSTigiQ2FuJ3QgcGxheTogbm8gZmlsZSAnJXMnICFcbiIsIGRlYnVnc3RyX2Eod21tLT5scHN0ckVsZW1lbnROYW1lKSk7CglyZXR1cm4gTUNJRVJSX0ZJTEVfTk9UX0ZPVU5EOwogICAgfQoKICAgIGlmICh3bW0tPmR3U3RhdHVzICE9IE1DSV9NT0RFX1NUT1ApIHsKCWlmICh3bW0tPmR3U3RhdHVzID09IE1DSV9NT0RFX1BBVVNFKSB7CgkgICAgLyogRklYTUU6IHBhcmFtZXRlcnMgKHN0YXJ0L2VuZCkgaW4gbHBQYXJhbXMgbWF5IG5vdCBiZSB1c2VkICovCgkgICAgcmV0dXJuIE1JRElfbWNpUmVzdW1lKHdEZXZJRCwgZHdGbGFncywgKExQTUNJX0dFTkVSSUNfUEFSTVMpbHBQYXJtcyk7Cgl9CglXQVJOKCJDYW4ndCBwbGF5OiBkZXZpY2UgaXMgbm90IHN0b3BwZWQgIVxuIik7CglyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogICAgfQoKICAgIGlmICghKGR3RmxhZ3MgJiBNQ0lfV0FJVCkpIHsKCS8qKiBGSVhNRTogSSdtIG5vdCAxMDAlIHN1cmUgdGhhdCB3Tm90aWZ5RGV2aWNlSUQgaXMgdGhlIHJpZ2h0IHZhbHVlIGluIGFsbCBjYXNlcyA/Pz8gKi8KCXJldHVybiBNQ0lfU2VuZENvbW1hbmRBc3luYyh3bW0tPndOb3RpZnlEZXZpY2VJRCwgTUNJX1BMQVksIGR3RmxhZ3MsIChEV09SRClscFBhcm1zLCBzaXplb2YoTFBNQ0lfUExBWV9QQVJNUykpOwogICAgfQoKICAgIGlmIChscFBhcm1zICYmIChkd0ZsYWdzICYgTUNJX0ZST00pKSB7Cglkd1N0YXJ0TVMgPSBNSURJX0NvbnZlcnRUaW1lRm9ybWF0VG9NUyh3bW0sIGxwUGFybXMtPmR3RnJvbSk7CiAgICB9IGVsc2UgewoJZHdTdGFydE1TID0gd21tLT5kd1Bvc2l0aW9uTVM7CiAgICB9CgogICAgaWYgKGxwUGFybXMgJiYgKGR3RmxhZ3MgJiBNQ0lfVE8pKSB7Cglkd0VuZE1TID0gTUlESV9Db252ZXJ0VGltZUZvcm1hdFRvTVMod21tLCBscFBhcm1zLT5kd1RvKTsKICAgIH0gZWxzZSB7Cglkd0VuZE1TID0gMHhGRkZGRkZGRnVsOwogICAgfQoKICAgIFRSQUNFKCJQbGF5aW5nIGZyb20gJWx1IHRvICVsdVxuIiwgZHdTdGFydE1TLCBkd0VuZE1TKTsKCiAgICAvKiBpbml0IHRyYWNrcyAqLwogICAgZm9yIChudCA9IDA7IG50IDwgd21tLT5uVHJhY2tzOyBudCsrKSB7CgltbXQgPSAmd21tLT50cmFja3NbbnRdOwoKCW1tdC0+d1N0YXR1cyA9IDE7CS8qIG9rLCBwbGF5aW5nICovCgltbXQtPmR3SW5kZXggPSBtbXQtPmR3Rmlyc3Q7CglpZiAod21tLT53Rm9ybWF0ID09IDIgJiYgbnQgPiAwKSB7CgkgICAgbW10LT5kd0V2ZW50UHVsc2UgPSB3bW0tPnRyYWNrc1tudCAtIDFdLmR3TGVuZ3RoOwoJfSBlbHNlIHsKCSAgICBtbXQtPmR3RXZlbnRQdWxzZSA9IDA7Cgl9CglNSURJX21jaVJlYWROZXh0RXZlbnQod21tLCBtbXQpOyAvKiBGSVhNRSA9PSAwICovCiAgICB9CgogICAgZHdSZXQgPSBtaWRpT3V0T3BlbigoTFBITUlESU9VVCkmd21tLT5oTWlkaSwgTUlESU1BUFBFUiwgMEwsIDBMLCBDQUxMQkFDS19OVUxMKTsKICAgIC8qCWR3UmV0ID0gbWlkaUluT3Blbigmd21tLT5oTWlkaSwgTUlESU1BUFBFUiwgMEwsIDBMLCBDQUxMQkFDS19OVUxMKTsqLwogICAgaWYgKGR3UmV0ICE9IE1NU1lTRVJSX05PRVJST1IpIHsKCXJldHVybiBkd1JldDsKICAgIH0KCiAgICB3bW0tPmR3UHVsc2UgPSAwOwogICAgd21tLT5kd1RlbXBvID0gNTAwMDAwOwogICAgd21tLT5kd1N0YXR1cyA9IE1DSV9NT0RFX1BMQVk7CiAgICB3bW0tPmR3UG9zaXRpb25NUyA9IDA7CiAgICB3bW0tPndTdGFydGVkUGxheWluZyA9IEZBTFNFOwoKICAgIHdoaWxlICh3bW0tPmR3U3RhdHVzICE9IE1DSV9NT0RFX1NUT1AgJiYgd21tLT5kd1N0YXR1cyAhPSBNQ0lfTU9ERV9OT1RfUkVBRFkpIHsKCS8qIGl0IHNlZW1zIHRoYXQgaW4gY2FzZSBvZiBtdWx0aS10aHJlYWRpbmcsIGdjYyBpcyBvcHRpbWl6aW5nIGp1c3QgYSBsaXR0bGUgYml0CgkgKiB0b28gbXVjaC4gVGVsbCBnY2Mgbm90IHRvIG9wdGltaXplIHN0YXR1cyB2YWx1ZSB1c2luZyB2b2xhdGlsZS4KCSAqLwoJd2hpbGUgKCgodm9sYXRpbGUgV0lORV9NQ0lNSURJKil3bW0pLT5kd1N0YXR1cyA9PSBNQ0lfTU9ERV9QQVVTRSk7CgoJZG9QbGF5ID0gKHdtbS0+ZHdQb3NpdGlvbk1TID49IGR3U3RhcnRNUyAmJiB3bW0tPmR3UG9zaXRpb25NUyA8PSBkd0VuZE1TKTsKCglUUkFDRSgid21tLT5kd1N0YXR1cz0lZCwgZG9QbGF5PSVjXG4iLCB3bW0tPmR3U3RhdHVzLCBkb1BsYXkgPyAnVCcgOiAnRicpOwoKCWlmICgobW10ID0gTUlESV9tY2lGaW5kTmV4dEV2ZW50KHdtbSwgJmhpUHVsc2UpKSA9PSBOVUxMKQoJICAgIGJyZWFrOyAgLyogbm8gbW9yZSBldmVudCBvbiB0cmFja3MgKi8KCgkvKiBpZiBzdGFydGluZyBwbGF5aW5nLCB0aGVuIHNldCBTdGFydFRpY2tzIHRvIHRoZSB2YWx1ZSBpdCB3b3VsZCBoYXZlIGhhZAoJICogaWYgcGxheSBoYWQgc3RhcnRlZCBhdCBwb3NpdGlvbiAwCgkgKi8KCWlmIChkb1BsYXkgJiYgIXdtbS0+d1N0YXJ0ZWRQbGF5aW5nKSB7CgkgICAgd21tLT5kd1N0YXJ0VGlja3MgPSBHZXRUaWNrQ291bnQoKSAtIE1JRElfQ29udmVydFB1bHNlVG9NUyh3bW0sIHdtbS0+ZHdQdWxzZSk7CgkgICAgd21tLT53U3RhcnRlZFBsYXlpbmcgPSBUUlVFOwoJICAgIFRSQUNFKCJTZXR0aW5nIGR3U3RhcnRUaWNrcyB0byAlbHVcbiIsIHdtbS0+ZHdTdGFydFRpY2tzKTsKCX0KCglpZiAoaGlQdWxzZSA+IHdtbS0+ZHdQdWxzZSkgewoJICAgIHdtbS0+ZHdQb3NpdGlvbk1TICs9IE1JRElfQ29udmVydFB1bHNlVG9NUyh3bW0sIGhpUHVsc2UgLSB3bW0tPmR3UHVsc2UpOwoJICAgIGlmIChkb1BsYXkpIHsKCQlEV09SRAl0b2dvID0gd21tLT5kd1N0YXJ0VGlja3MgKyB3bW0tPmR3UG9zaXRpb25NUzsKCQlEV09SRAl0YyA9IEdldFRpY2tDb3VudCgpOwoKCQlUUkFDRSgiUHVsc2VzIGhpPTB4JTA4bHggPD4gY3VyPTB4JTA4bHhcbiIsIGhpUHVsc2UsIHdtbS0+ZHdQdWxzZSk7CgkJVFJBQ0UoIldhaXQgdW50aWwgJWx1ID0+ICVsdSBtc1xuIiwKCQkgICAgICB0YyAtIHdtbS0+ZHdTdGFydFRpY2tzLCB0b2dvIC0gd21tLT5kd1N0YXJ0VGlja3MpOwoJCWlmICh0YyA8IHRvZ28pCgkJICAgIFNsZWVwKHRvZ28gLSB0Yyk7CgkgICAgfQoJICAgIHdtbS0+ZHdQdWxzZSA9IGhpUHVsc2U7Cgl9CgoJc3dpdGNoIChMT0JZVEUoTE9XT1JEKG1tdC0+ZHdFdmVudERhdGEpKSkgewoJY2FzZSAweEYwOgoJY2FzZSAweEY3OgkvKiBzeXNleCBldmVudHMgKi8KCSAgICB7CgkJRklYTUUoIk5vdCBoYW5kbGluZyBTeXNFeCBldmVudHMgKHlldClcbiIpOwoJICAgIH0KCSAgICBicmVhazsKCWNhc2UgMHhGRjoKCSAgICAvKiBwb3NpdGlvbiBhZnRlciBtZXRhIGRhdGEgaGVhZGVyICovCgkgICAgbW1pb1NlZWsod21tLT5oRmlsZSwgbW10LT5kd0luZGV4ICsgSElXT1JEKG1tdC0+ZHdFdmVudERhdGEpLCBTRUVLX1NFVCk7CgkgICAgc3dpdGNoIChISUJZVEUoTE9XT1JEKG1tdC0+ZHdFdmVudERhdGEpKSkgewoJICAgIGNhc2UgMHgwMDogLyogMTYtYml0IHNlcXVlbmNlIG51bWJlciAqLwoJCWlmIChUUkFDRV9PTihtY2ltaWRpKSkgewoJCSAgICBXT1JECXR3ZDsKCgkJICAgIE1JRElfbWNpUmVhZFdvcmQod21tLCAmdHdkKTsJLyogPT0gMCAqLwoJCSAgICBUUkFDRSgiR290IHNlcXVlbmNlIG51bWJlciAldVxuIiwgdHdkKTsKCQl9CgkJYnJlYWs7CgkgICAgY2FzZSAweDAxOiAvKiBhbnkgdGV4dCAqLwoJICAgIGNhc2UgMHgwMjogLyogQ29weXJpZ2h0IE1lc3NhZ2UgdGV4dCAqLwoJICAgIGNhc2UgMHgwMzogLyogU2VxdWVuY2UvVHJhY2sgTmFtZSB0ZXh0ICovCgkgICAgY2FzZSAweDA0OiAvKiBJbnN0cnVtZW50IE5hbWUgdGV4dCAqLwoJICAgIGNhc2UgMHgwNTogLyogTHlyaWMgdGV4dCAqLwoJICAgIGNhc2UgMHgwNjogLyogTWFya2VyIHRleHQgKi8KCSAgICBjYXNlIDB4MDc6IC8qIEN1ZS1wb2ludCB0ZXh0ICovCgkJaWYgKFRSQUNFX09OKG1jaW1pZGkpKSB7CgkJICAgIGNoYXIJYnVmWzEwMjRdOwoJCSAgICBXT1JECWxlbiA9IG1tdC0+d0V2ZW50TGVuZ3RoIC0gSElXT1JEKG1tdC0+ZHdFdmVudERhdGEpOwoJCSAgICBzdGF0aWMgY29uc3QgY2hhcioJaW5mb1s4XSA9IHsiIiwgIlRleHQiLCAiQ29weXJpZ2h0IiwgIlNlcS9UcmsgbmFtZSIsCgkJCQkJCSAgICJJbnN0cnVtZW50IiwgIkx5cmljIiwgIk1hcmtlciIsICJDdWUtcG9pbnQifTsKCQkgICAgV09SRAlpZHggPSBISUJZVEUoTE9XT1JEKG1tdC0+ZHdFdmVudERhdGEpKTsKCgkJICAgIGlmIChsZW4gPj0gc2l6ZW9mKGJ1ZikpIHsKCQkJV0FSTigiQnVmZmVyIGZvciB0ZXh0IGlzIHRvbyBzbWFsbCAoJWQgYnl0ZXMsIHdoZW4gJXUgYXJlIG5lZWRlZClcbiIsIHNpemVvZihidWYpIC0gMSwgbGVuKTsKCQkJbGVuID0gc2l6ZW9mKGJ1ZikgLSAxOwoJCSAgICB9CgkJICAgIGlmIChtbWlvUmVhZCh3bW0tPmhGaWxlLCAoSFBTVFIpYnVmLCBsZW4pID09IGxlbikgewoJCQlidWZbbGVuXSA9IDA7CS8qIGVuZCBzdHJpbmcgaW4gY2FzZSAqLwoJCQlUUkFDRSgiJXMgPT4gXCIlc1wiXG4iLCAoaWR4IDwgOCApID8gaW5mb1tpZHhdIDogIiIsIGJ1Zik7CgkJICAgIH0gZWxzZSB7CgkJCVdBUk4oIkNvdWxkbid0IHJlYWQgZGF0YSBmb3IgJXNcbiIsIChpZHggPCA4KSA/IGluZm9baWR4XSA6ICIiKTsKCQkgICAgfQoJCX0KCQlicmVhazsKCSAgICBjYXNlIDB4MjA6CgkJLyogTUlESSBjaGFubmVsIChjYykgKi8KCQlpZiAoRklYTUVfT04obWNpbWlkaSkpIHsKCQkgICAgQllURQlidDsKCgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmYnQpOwkvKiA9PSAwICovCgkJICAgIEZJWE1FKCJOSVk6IE1JREkgY2hhbm5lbD0ldSwgdHJhY2s9JXVcbiIsIGJ0LCBtbXQtPndUcmFja05yKTsKCQl9CgkJYnJlYWs7CgkgICAgY2FzZSAweDIxOgoJCS8qIE1JREkgcG9ydCAocHApICovCgkJaWYgKEZJWE1FX09OKG1jaW1pZGkpKSB7CgkJICAgIEJZVEUJYnQ7CgoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJmJ0KTsJLyogPT0gMCAqLwoJCSAgICBGSVhNRSgiTklZOiBNSURJIHBvcnQ9JXUsIHRyYWNrPSV1XG4iLCBidCwgbW10LT53VHJhY2tOcik7CgkJfQoJCWJyZWFrOwoJICAgIGNhc2UgMHgyRjogLyogZW5kIG9mIHRyYWNrICovCgkJbW10LT53U3RhdHVzID0gMDsKCQlicmVhazsKCSAgICBjYXNlIDB4NTE6Lyogc2V0IHRlbXBvICovCgkJLyogVGVtcG8gaXMgZXhwcmVzc2VkIGluILUtc2Vjb25kcyBwZXIgbWlkaSBxdWFydGVyIG5vdGUKCQkgKiBmb3IgZm9ybWF0IDEgTUlESSBmaWxlcywgdGhpcyBjYW4gb25seSBiZSBwcmVzZW50IG9uIHRyYWNrICMwCgkJICovCgkJaWYgKG1tdC0+d1RyYWNrTnIgIT0gMCAmJiB3bW0tPndGb3JtYXQgPT0gMSkgewoJCSAgICBXQVJOKCJGb3IgZm9ybWF0ICMxIE1JREkgZmlsZXMsIHRlbXBvIGNhbiBvbmx5IGJlIGNoYW5nZWQgb24gdHJhY2sgIzAgKCV1KVxuIiwgbW10LT53VHJhY2tOcik7CgkJfSBlbHNlIHsKCQkgICAgQllURQl0YnQ7CgkJICAgIERXT1JECXZhbHVlID0gMDsKCgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmdGJ0KTsJdmFsdWUgID0gKChEV09SRCl0YnQpIDw8IDE2OwoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJnRidCk7CXZhbHVlIHw9ICgoRFdPUkQpdGJ0KSA8PCA4OwoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJnRidCk7CXZhbHVlIHw9ICgoRFdPUkQpdGJ0KSA8PCAwOwoJCSAgICBUUkFDRSgiU2V0dGluZyB0ZW1wbyB0byAlbGQgKEJQTT0lbGQpXG4iLCB3bW0tPmR3VGVtcG8sICh2YWx1ZSkgPyAoNjAwMDAwMDBsIC8gdmFsdWUpIDogMCk7CgkJICAgIHdtbS0+ZHdUZW1wbyA9IHZhbHVlOwoJCX0KCQlicmVhazsKCSAgICBjYXNlIDB4NTQ6IC8qIChob3VyKSAobWluKSAoc2Vjb25kKSAoZnJhbWUpIChmcmFjdGlvbmFsLWZyYW1lKSAtIFNNUFRFIHRyYWNrIHN0YXJ0ICovCgkJaWYgKG1tdC0+d1RyYWNrTnIgIT0gMCAmJiB3bW0tPndGb3JtYXQgPT0gMSkgewoJCSAgICBXQVJOKCJGb3IgZm9ybWF0ICMxIE1JREkgZmlsZXMsIFNNUFRFIHRyYWNrIHN0YXJ0IGNhbiBvbmx5IGJlIGV4cHJlc3NlZCBvbiB0cmFjayAjMCAoJXUpXG4iLCBtbXQtPndUcmFja05yKTsKCQl9IGlmIChtbXQtPmR3RXZlbnRQdWxzZSAhPSAwKSB7CgkJICAgIFdBUk4oIlNNUFRFIHRyYWNrIHN0YXJ0IGNhbiBvbmx5IGJlIGV4cHJlc3NlZCBhdCBzdGFydCBvZiB0cmFjayAoJWx1KVxuIiwgbW10LT5kd0V2ZW50UHVsc2UpOwoJCX0gZWxzZSB7CgkJICAgIEJZVEUJaCwgbSwgcywgZiwgZmY7CgoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJmgpOwoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJm0pOwoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJnMpOwoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJmYpOwoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJmZmKTsKCQkgICAgRklYTUUoIk5JWTogU01QVEUgdHJhY2sgc3RhcnQgJXU6JXU6JXUgJXUuJXVcbiIsIGgsIG0sIHMsIGYsIGZmKTsKCQl9CgkJYnJlYWs7CgkgICAgY2FzZSAweDU4OiAvKiBmaWxlIHJ5dGhtICovCgkJaWYgKFRSQUNFX09OKG1jaW1pZGkpKSB7CgkJICAgIEJZVEUJbnVtLCBkZW4sIGNwbWMsIF8zMm5wcW47CgoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJm51bSk7CgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmZGVuKTsJCS8qIHRvIG5vdGF0ZSBlLmcuIDYvOCAqLwoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJmNwbWMpOwkJLyogbnVtYmVyIG9mIE1JREkgY2xvY2tzIHBlciBtZXRyb25vbWUgY2xpY2sgKi8KCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZfMzJucHFuKTsJCS8qIG51bWJlciBvZiBub3RhdGVkIDMybmQgbm90ZXMgcGVyIE1JREkgcXVhcnRlciBub3RlICovCgoJCSAgICBUUkFDRSgiJXUvJXUsIGNsb2NrIHBlciBtZXRyb25vbWUgY2xpY2s9JXUsIDMybmQgbm90ZXMgYnkgMS80IG5vdGU9JXVcbiIsIG51bSwgMSA8PCBkZW4sIGNwbWMsIF8zMm5wcW4pOwoJCX0KCQlicmVhazsKCSAgICBjYXNlIDB4NTk6IC8qIGtleSBzaWduYXR1cmUgKi8KCQlpZiAoVFJBQ0VfT04obWNpbWlkaSkpIHsKCQkgICAgQllURQlzZiwgbW07CgoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJnNmKTsKCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZtbSk7CgoJCSAgICBpZiAoc2YgPj0gMHg4MCkgCVRSQUNFKCIlZCBmbGF0c1xuIiwgLShjaGFyKXNmKTsKCQkgICAgZWxzZSBpZiAoc2YgPiAwKSAJVFJBQ0UoIiVkIHNoYXJwc1xuIiwgKGNoYXIpc2YpOwoJCSAgICBlbHNlIAkJVFJBQ0UoIktleSBvZiBDXG4iKTsKCQkgICAgVFJBQ0UoIk1vZGU6ICVzXG4iLCAobW0gPSAwKSA/ICJtYWpvciIgOiAibWlub3IiKTsKCQl9CgkJYnJlYWs7CgkgICAgZGVmYXVsdDoKCQlXQVJOKCJVbmtub3duIE1JREkgbWV0YSBldmVudCAlMDJ4LiBTa2lwcGluZy4uLlxuIiwgSElCWVRFKExPV09SRChtbXQtPmR3RXZlbnREYXRhKSkpOwoJCWJyZWFrOwoJICAgIH0KCSAgICBicmVhazsKCWRlZmF1bHQ6CgkgICAgaWYgKGRvUGxheSkgewoJCWR3UmV0ID0gbWlkaU91dFNob3J0TXNnKChITUlESU9VVCl3bW0tPmhNaWRpLCBtbXQtPmR3RXZlbnREYXRhKTsKCSAgICB9IGVsc2UgewoJCXN3aXRjaCAoTE9CWVRFKExPV09SRChtbXQtPmR3RXZlbnREYXRhKSkgJiAweEYwKSB7CgkJY2FzZSBNSURJX05PVEVPTjoKCQljYXNlIE1JRElfTk9URU9GRjoKCQkgICAgZHdSZXQgPSAwOwoJCSAgICBicmVhazsKCQlkZWZhdWx0OgoJCSAgICBkd1JldCA9IG1pZGlPdXRTaG9ydE1zZygoSE1JRElPVVQpd21tLT5oTWlkaSwgbW10LT5kd0V2ZW50RGF0YSk7CgkJfQoJICAgIH0KCX0KCW1tdC0+ZHdJbmRleCArPSBtbXQtPndFdmVudExlbmd0aDsKCWlmIChtbXQtPmR3SW5kZXggPCBtbXQtPmR3Rmlyc3QgfHwgbW10LT5kd0luZGV4ID49IG1tdC0+ZHdMYXN0KSB7CgkgICAgbW10LT53U3RhdHVzID0gMDsKCX0KCWlmIChtbXQtPndTdGF0dXMpIHsKCSAgICBNSURJX21jaVJlYWROZXh0RXZlbnQod21tLCBtbXQpOwoJfQogICAgfQoKICAgIG1pZGlPdXRSZXNldCgoSE1JRElPVVQpd21tLT5oTWlkaSk7CgogICAgZHdSZXQgPSBtaWRpT3V0Q2xvc2UoKEhNSURJT1VUKXdtbS0+aE1pZGkpOwogICAgLyogdG8gcmVzdGFydCBwbGF5aW5nIGF0IGJlZ2lubmluZyB3aGVuIGl0J3Mgb3ZlciAqLwogICAgd21tLT5kd1Bvc2l0aW9uTVMgPSAwOwoKICAgIGlmIChscFBhcm1zICYmIChkd0ZsYWdzICYgTUNJX05PVElGWSkpIHsKCVRSQUNFKCJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CgltY2lEcml2ZXJOb3RpZnkoSFdORF8zMihMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjaykpLAoJCQl3bW0tPndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKICAgIH0KCiAgICB3bW0tPmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKICAgIHJldHVybiBkd1JldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVJlY29yZAkJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRCBNSURJX21jaVJlY29yZChVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfUkVDT1JEX1BBUk1TIGxwUGFybXMpCnsKICAgIGludAkJCXN0YXJ0LCBlbmQ7CiAgICBNSURJSERSCQltaWRpSGRyOwogICAgRFdPUkQJCWR3UmV0OwogICAgV0lORV9NQ0lNSURJKgl3bW0gPSBNSURJX21jaUdldE9wZW5EZXYod0RldklEKTsKCiAgICBUUkFDRSgiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwoKICAgIGlmICh3bW0gPT0gMCkJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKCiAgICBpZiAod21tLT5oRmlsZSA9PSAwKSB7CglXQVJOKCJDYW4ndCBmaW5kIGZpbGU9JyVzJyAhXG4iLCBkZWJ1Z3N0cl9hKHdtbS0+bHBzdHJFbGVtZW50TmFtZSkpOwoJcmV0dXJuIE1DSUVSUl9GSUxFX05PVF9GT1VORDsKICAgIH0KICAgIHN0YXJ0ID0gMTsgCQllbmQgPSA5OTk5OTsKICAgIGlmIChscFBhcm1zICYmIChkd0ZsYWdzICYgTUNJX0ZST00pKSB7CglzdGFydCA9IGxwUGFybXMtPmR3RnJvbTsKCVRSQUNFKCJNQ0lfRlJPTT0lZCBcbiIsIHN0YXJ0KTsKICAgIH0KICAgIGlmIChscFBhcm1zICYmIChkd0ZsYWdzICYgTUNJX1RPKSkgewoJZW5kID0gbHBQYXJtcy0+ZHdUbzsKCVRSQUNFKCJNQ0lfVE89JWQgXG4iLCBlbmQpOwogICAgfQogICAgbWlkaUhkci5scERhdGEgPSAoTFBTVFIpIEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCAxMjAwKTsKICAgIGlmICghbWlkaUhkci5scERhdGEpCglyZXR1cm4gTUNJRVJSX09VVF9PRl9NRU1PUlk7CiAgICBtaWRpSGRyLmR3QnVmZmVyTGVuZ3RoID0gMTAyNDsKICAgIG1pZGlIZHIuZHdVc2VyID0gMEw7CiAgICBtaWRpSGRyLmR3RmxhZ3MgPSAwTDsKICAgIGR3UmV0ID0gbWlkaUluUHJlcGFyZUhlYWRlcigoSE1JRElJTil3bW0tPmhNaWRpLCAmbWlkaUhkciwgc2l6ZW9mKE1JRElIRFIpKTsKICAgIFRSQUNFKCJBZnRlciBNSURNX1BSRVBBUkUgXG4iKTsKICAgIHdtbS0+ZHdTdGF0dXMgPSBNQ0lfTU9ERV9SRUNPUkQ7CiAgICAvKiBGSVhNRTogdGhlcmUgaXMgbm8gYnVmZmVyIGFkZGVkICovCiAgICB3aGlsZSAod21tLT5kd1N0YXR1cyAhPSBNQ0lfTU9ERV9TVE9QKSB7CglUUkFDRSgid21tLT5kd1N0YXR1cz0lcCAlZFxuIiwKCSAgICAgICZ3bW0tPmR3U3RhdHVzLCB3bW0tPmR3U3RhdHVzKTsKCW1pZGlIZHIuZHdCeXRlc1JlY29yZGVkID0gMDsKCWR3UmV0ID0gbWlkaUluU3RhcnQoKEhNSURJSU4pd21tLT5oTWlkaSk7CglUUkFDRSgibWlkaUluU3RhcnQgPT4gZHdCeXRlc1JlY29yZGVkPSVsdVxuIiwgbWlkaUhkci5kd0J5dGVzUmVjb3JkZWQpOwoJaWYgKG1pZGlIZHIuZHdCeXRlc1JlY29yZGVkID09IDApIGJyZWFrOwogICAgfQogICAgVFJBQ0UoIkJlZm9yZSBNSURNX1VOUFJFUEFSRSBcbiIpOwogICAgZHdSZXQgPSBtaWRpSW5VbnByZXBhcmVIZWFkZXIoKEhNSURJSU4pd21tLT5oTWlkaSwgJm1pZGlIZHIsIHNpemVvZihNSURJSERSKSk7CiAgICBUUkFDRSgiQWZ0ZXIgTUlETV9VTlBSRVBBUkUgXG4iKTsKICAgIGlmIChtaWRpSGRyLmxwRGF0YSAhPSBOVUxMKSB7CglIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBtaWRpSGRyLmxwRGF0YSk7CgltaWRpSGRyLmxwRGF0YSA9IE5VTEw7CiAgICB9CiAgICB3bW0tPmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKICAgIGlmIChscFBhcm1zICYmIChkd0ZsYWdzICYgTUNJX05PVElGWSkpIHsKCVRSQUNFKCJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CgltY2lEcml2ZXJOb3RpZnkoSFdORF8zMihMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjaykpLAoJCQl3bW0tPndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKICAgIH0KICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpUGF1c2UJCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lQYXVzZShVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQp7CiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfbWNpR2V0T3BlbkRldih3RGV2SUQpOwoKICAgIFRSQUNFKCIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CgogICAgaWYgKHdtbSA9PSBOVUxMKQlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwoKICAgIGlmICh3bW0tPmR3U3RhdHVzID09IE1DSV9NT0RFX1BMQVkpIHsKCS8qIHN0b3AgYWxsIG5vdGVzICovCgl1bnNpZ25lZCBjaG47Cglmb3IgKGNobiA9IDA7IGNobiA8IDE2OyBjaG4rKykKCSAgICBtaWRpT3V0U2hvcnRNc2coKEhNSURJT1VUKSh3bW0tPmhNaWRpKSwgMHg3OEIwIHwgY2huKTsKCXdtbS0+ZHdTdGF0dXMgPSBNQ0lfTU9ERV9QQVVTRTsKICAgIH0KICAgIGlmIChscFBhcm1zICYmIChkd0ZsYWdzICYgTUNJX05PVElGWSkpIHsKCVRSQUNFKCJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CgltY2lEcml2ZXJOb3RpZnkoSFdORF8zMihMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjaykpLAoJCQl3bW0tPndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVJlc3VtZQkJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRCBNSURJX21jaVJlc3VtZShVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQp7CiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfbWNpR2V0T3BlbkRldih3RGV2SUQpOwoKICAgIFRSQUNFKCIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CgogICAgaWYgKHdtbSA9PSBOVUxMKQlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwoKICAgIGlmICh3bW0tPmR3U3RhdHVzID09IE1DSV9NT0RFX1BBVVNFKSB7Cgl3bW0tPndTdGFydGVkUGxheWluZyA9IEZBTFNFOwoJd21tLT5kd1N0YXR1cyA9IE1DSV9NT0RFX1BMQVk7CiAgICB9CiAgICBpZiAobHBQYXJtcyAmJiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpKSB7CglUUkFDRSgiTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOwoJbWNpRHJpdmVyTm90aWZ5KEhXTkRfMzIoTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spKSwKCQkJd21tLT53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVNldAkJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRCBNSURJX21jaVNldChVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU0VUX1BBUk1TIGxwUGFybXMpCnsKICAgIFdJTkVfTUNJTUlESSoJd21tID0gTUlESV9tY2lHZXRPcGVuRGV2KHdEZXZJRCk7CgogICAgVFJBQ0UoIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKCiAgICBpZiAobHBQYXJtcyA9PSBOVUxMKQlyZXR1cm4gTUNJRVJSX05VTExfUEFSQU1FVEVSX0JMT0NLOwogICAgaWYgKHdtbSA9PSBOVUxMKQkJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKCiAgICBpZiAoZHdGbGFncyAmIE1DSV9TRVRfVElNRV9GT1JNQVQpIHsKCXN3aXRjaCAobHBQYXJtcy0+ZHdUaW1lRm9ybWF0KSB7CgljYXNlIE1DSV9GT1JNQVRfTUlMTElTRUNPTkRTOgoJICAgIFRSQUNFKCJNQ0lfRk9STUFUX01JTExJU0VDT05EUyAhXG4iKTsKCSAgICB3bW0tPmR3TWNpVGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfTUlMTElTRUNPTkRTOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfRk9STUFUX1NNUFRFXzI0OgoJICAgIFRSQUNFKCJNQ0lfRk9STUFUX1NNUFRFXzI0ICFcbiIpOwoJICAgIHdtbS0+ZHdNY2lUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9TTVBURV8yNDsKCSAgICBicmVhazsKCWNhc2UgTUNJX0ZPUk1BVF9TTVBURV8yNToKCSAgICBUUkFDRSgiTUNJX0ZPUk1BVF9TTVBURV8yNSAhXG4iKTsKCSAgICB3bW0tPmR3TWNpVGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfU01QVEVfMjU7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9GT1JNQVRfU01QVEVfMzA6CgkgICAgVFJBQ0UoIk1DSV9GT1JNQVRfU01QVEVfMzAgIVxuIik7CgkgICAgd21tLT5kd01jaVRpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX1NNUFRFXzMwOwoJICAgIGJyZWFrOwoJZGVmYXVsdDoKCSAgICBXQVJOKCJCYWQgdGltZSBmb3JtYXQgJWx1IVxuIiwgbHBQYXJtcy0+ZHdUaW1lRm9ybWF0KTsKCSAgICByZXR1cm4gTUNJRVJSX0JBRF9USU1FX0ZPUk1BVDsKCX0KICAgIH0KICAgIGlmIChkd0ZsYWdzICYgTUNJX1NFVF9WSURFTykgewoJVFJBQ0UoIk5vIHN1cHBvcnQgZm9yIHZpZGVvICFcbiIpOwoJcmV0dXJuIE1DSUVSUl9VTlNVUFBPUlRFRF9GVU5DVElPTjsKICAgIH0KICAgIGlmIChkd0ZsYWdzICYgTUNJX1NFVF9ET09SX09QRU4pIHsKCVRSQUNFKCJObyBzdXBwb3J0IGZvciBkb29yIG9wZW4gIVxuIik7CglyZXR1cm4gTUNJRVJSX1VOU1VQUE9SVEVEX0ZVTkNUSU9OOwogICAgfQogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX0RPT1JfQ0xPU0VEKSB7CglUUkFDRSgiTm8gc3VwcG9ydCBmb3IgZG9vciBjbG9zZSAhXG4iKTsKCXJldHVybiBNQ0lFUlJfVU5TVVBQT1JURURfRlVOQ1RJT047CiAgICB9CiAgICBpZiAoZHdGbGFncyAmIE1DSV9TRVRfQVVESU8pIHsKCWlmIChkd0ZsYWdzICYgTUNJX1NFVF9PTikgewoJICAgIFRSQUNFKCJNQ0lfU0VUX09OIGF1ZGlvICFcbiIpOwoJfSBlbHNlIGlmIChkd0ZsYWdzICYgTUNJX1NFVF9PRkYpIHsKCSAgICBUUkFDRSgiTUNJX1NFVF9PRkYgYXVkaW8gIVxuIik7Cgl9IGVsc2UgewoJICAgIFdBUk4oIk1DSV9TRVRfQVVESU8gd2l0aG91dCBTRVRfT04gb3IgU0VUX09GRlxuIik7CgkgICAgcmV0dXJuIE1DSUVSUl9CQURfSU5URUdFUjsKCX0KCglpZiAobHBQYXJtcy0+ZHdBdWRpbyAmIE1DSV9TRVRfQVVESU9fQUxMKQoJICAgIFRSQUNFKCJNQ0lfU0VUX0FVRElPX0FMTCAhXG4iKTsKCWlmIChscFBhcm1zLT5kd0F1ZGlvICYgTUNJX1NFVF9BVURJT19MRUZUKQoJICAgIFRSQUNFKCJNQ0lfU0VUX0FVRElPX0xFRlQgIVxuIik7CglpZiAobHBQYXJtcy0+ZHdBdWRpbyAmIE1DSV9TRVRfQVVESU9fUklHSFQpCgkgICAgVFJBQ0UoIk1DSV9TRVRfQVVESU9fUklHSFQgIVxuIik7CiAgICB9CgogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VRX1NFVF9NQVNURVIpCglUUkFDRSgiTUNJX1NFUV9TRVRfTUFTVEVSICFcbiIpOwogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VRX1NFVF9TTEFWRSkKCVRSQUNFKCJNQ0lfU0VRX1NFVF9TTEFWRSAhXG4iKTsKICAgIGlmIChkd0ZsYWdzICYgTUNJX1NFUV9TRVRfT0ZGU0VUKQoJVFJBQ0UoIk1DSV9TRVFfU0VUX09GRlNFVCAhXG4iKTsKICAgIGlmIChkd0ZsYWdzICYgTUNJX1NFUV9TRVRfUE9SVCkKCVRSQUNFKCJNQ0lfU0VRX1NFVF9QT1JUICFcbiIpOwogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VRX1NFVF9URU1QTykKCVRSQUNFKCJNQ0lfU0VRX1NFVF9URU1QTyAhXG4iKTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpU3RhdHVzCQkJW2ludGVybmFsXQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpU3RhdHVzKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9TVEFUVVNfUEFSTVMgbHBQYXJtcykKewogICAgV0lORV9NQ0lNSURJKgl3bW0gPSBNSURJX21jaUdldE9wZW5EZXYod0RldklEKTsKICAgIERXT1JECQlyZXQgPSAwOwoKICAgIFRSQUNFKCIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CgogICAgaWYgKGxwUGFybXMgPT0gTlVMTCkgCXJldHVybiBNQ0lFUlJfTlVMTF9QQVJBTUVURVJfQkxPQ0s7CiAgICBpZiAod21tID09IE5VTEwpCQlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwoKICAgIGlmIChkd0ZsYWdzICYgTUNJX1NUQVRVU19JVEVNKSB7Cglzd2l0Y2ggKGxwUGFybXMtPmR3SXRlbSkgewoJY2FzZSBNQ0lfU1RBVFVTX0NVUlJFTlRfVFJBQ0s6CgkgICAgLyogRklYTUUgaW4gRm9ybWF0IDIgKi8KCSAgICBscFBhcm1zLT5kd1JldHVybiA9IDE7CgkgICAgVFJBQ0UoIk1DSV9TVEFUVVNfQ1VSUkVOVF9UUkFDSyA9PiAlbHVcbiIsIGxwUGFybXMtPmR3UmV0dXJuKTsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NUQVRVU19MRU5HVEg6CgkgICAgaWYgKChkd0ZsYWdzICYgTUNJX1RSQUNLKSAmJiB3bW0tPndGb3JtYXQgPT0gMikgewoJCWlmIChscFBhcm1zLT5kd1RyYWNrID49IHdtbS0+blRyYWNrcykKCQkgICAgcmV0dXJuIE1DSUVSUl9CQURfSU5URUdFUjsKCQkvKiBGSVhNRTogdGhpcyBpcyB3cm9uZyBpZiB0aGVyZSBpcyBhIHRlbXBvIGNoYW5nZSBpbnNpZGUgdGhlIGZpbGUgKi8KCQlscFBhcm1zLT5kd1JldHVybiA9IE1JRElfQ29udmVydFB1bHNlVG9NUyh3bW0sIHdtbS0+dHJhY2tzW2xwUGFybXMtPmR3VHJhY2tdLmR3TGVuZ3RoKTsKCSAgICB9IGVsc2UgewoJCWxwUGFybXMtPmR3UmV0dXJuID0gTUlESV9HZXRNVGhkTGVuZ3RoTVMod21tKTsKCSAgICB9CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBNSURJX0NvbnZlcnRNU1RvVGltZUZvcm1hdCh3bW0sIGxwUGFybXMtPmR3UmV0dXJuKTsKCSAgICBUUkFDRSgiTUNJX1NUQVRVU19MRU5HVEggPT4gJWx1XG4iLCBscFBhcm1zLT5kd1JldHVybik7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TVEFUVVNfTU9ERToKCSAgICBUUkFDRSgiTUNJX1NUQVRVU19NT0RFID0+ICV1XG4iLCB3bW0tPmR3U3RhdHVzKTsKIAkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQUtFTUNJUkVTT1VSQ0Uod21tLT5kd1N0YXR1cywgd21tLT5kd1N0YXR1cyk7CgkgICAgcmV0ID0gTUNJX1JFU09VUkNFX1JFVFVSTkVEOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfU1RBVFVTX01FRElBX1BSRVNFTlQ6CgkgICAgVFJBQ0UoIk1DSV9TVEFUVVNfTUVESUFfUFJFU0VOVCA9PiBUUlVFXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IE1BS0VNQ0lSRVNPVVJDRShUUlVFLCBNQ0lfVFJVRSk7CgkgICAgcmV0ID0gTUNJX1JFU09VUkNFX1JFVFVSTkVEOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfU1RBVFVTX05VTUJFUl9PRl9UUkFDS1M6CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSAod21tLT53Rm9ybWF0ID09IDIpID8gd21tLT5uVHJhY2tzIDogMTsKCSAgICBUUkFDRSgiTUNJX1NUQVRVU19OVU1CRVJfT0ZfVFJBQ0tTID0+ICVsdVxuIiwgbHBQYXJtcy0+ZHdSZXR1cm4pOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfU1RBVFVTX1BPU0lUSU9OOgoJICAgIC8qIEZJWE1FOiBkbyBJIG5lZWQgdG8gdXNlIE1DSV9UUkFDSyA/ICovCgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBNSURJX0NvbnZlcnRNU1RvVGltZUZvcm1hdCh3bW0sCgkJCQkJCQkgICAoZHdGbGFncyAmIE1DSV9TVEFUVVNfU1RBUlQpID8gMCA6IHdtbS0+ZHdQb3NpdGlvbk1TKTsKCSAgICBUUkFDRSgiTUNJX1NUQVRVU19QT1NJVElPTiAlcyA9PiAlbHVcbiIsCgkJICAoZHdGbGFncyAmIE1DSV9TVEFUVVNfU1RBUlQpID8gInN0YXJ0IiA6ICJjdXJyZW50IiwgbHBQYXJtcy0+ZHdSZXR1cm4pOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfU1RBVFVTX1JFQURZOgoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gKHdtbS0+ZHdTdGF0dXMgPT0gTUNJX01PREVfTk9UX1JFQURZKSA/CgkJTUFLRU1DSVJFU09VUkNFKEZBTFNFLCBNQ0lfRkFMU0UpIDogTUFLRU1DSVJFU09VUkNFKFRSVUUsIE1DSV9UUlVFKTsKCSAgICByZXQgPSBNQ0lfUkVTT1VSQ0VfUkVUVVJORUQ7CgkgICAgVFJBQ0UoIk1DSV9TVEFUVVNfUkVBRFkgPSAldVxuIiwgTE9XT1JEKGxwUGFybXMtPmR3UmV0dXJuKSk7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TVEFUVVNfVElNRV9GT1JNQVQ6CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQUtFTUNJUkVTT1VSQ0Uod21tLT5kd01jaVRpbWVGb3JtYXQsIE1DSV9GT1JNQVRfUkVUVVJOX0JBU0UgKyB3bW0tPmR3TWNpVGltZUZvcm1hdCk7CgkgICAgVFJBQ0UoIk1DSV9TVEFUVVNfVElNRV9GT1JNQVQgPT4gJXVcbiIsIExPV09SRChscFBhcm1zLT5kd1JldHVybikpOwoJICAgIHJldCA9IE1DSV9SRVNPVVJDRV9SRVRVUk5FRDsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NFUV9TVEFUVVNfRElWVFlQRToKCSAgICBUUkFDRSgiTUNJX1NFUV9TVEFUVVNfRElWVFlQRSAhXG4iKTsKCSAgICBpZiAod21tLT5uRGl2aXNpb24gPiAweDgwMDApIHsKCQlzd2l0Y2ggKHdtbS0+bkRpdmlzaW9uKSB7CgkJY2FzZSAweEU4OglscFBhcm1zLT5kd1JldHVybiA9IE1DSV9TRVFfRElWX1NNUFRFXzI0OwlicmVhazsJLyogLTI0ICovCgkJY2FzZSAweEU3OglscFBhcm1zLT5kd1JldHVybiA9IE1DSV9TRVFfRElWX1NNUFRFXzI1OwlicmVhazsJLyogLTI1ICovCgkJY2FzZSAweEUzOglscFBhcm1zLT5kd1JldHVybiA9IE1DSV9TRVFfRElWX1NNUFRFXzMwRFJPUDsJYnJlYWs7CS8qIC0yOSAqLyAvKiBpcyB0aGUgTUNJIGNvbnN0YW50IGNvcnJlY3QgPyAqLwoJCWNhc2UgMHhFMjoJbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQ0lfU0VRX0RJVl9TTVBURV8zMDsJYnJlYWs7CS8qIC0zMCAqLwoJCWRlZmF1bHQ6CUZJWE1FKCJUaGVyZSBpcyBhIGJhZCBiYWQgcHJvZ3JhbW1lclxuIik7CgkJfQoJICAgIH0gZWxzZSB7CgkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQ0lfU0VRX0RJVl9QUFFOOwoJICAgIH0KCSAgICBscFBhcm1zLT5kd1JldHVybiA9IE1BS0VNQ0lSRVNPVVJDRShscFBhcm1zLT5kd1JldHVybixscFBhcm1zLT5kd1JldHVybik7CgkgICAgcmV0ID0gTUNJX1JFU09VUkNFX1JFVFVSTkVEOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfU0VRX1NUQVRVU19NQVNURVI6CgkgICAgVFJBQ0UoIk1DSV9TRVFfU1RBVFVTX01BU1RFUiAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IDA7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TRVFfU1RBVFVTX1NMQVZFOgoJICAgIFRSQUNFKCJNQ0lfU0VRX1NUQVRVU19TTEFWRSAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IDA7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TRVFfU1RBVFVTX09GRlNFVDoKCSAgICBUUkFDRSgiTUNJX1NFUV9TVEFUVVNfT0ZGU0VUICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gMDsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NFUV9TVEFUVVNfUE9SVDoKCSAgICBUUkFDRSgiTUNJX1NFUV9TVEFUVVNfUE9SVCAoJXUpIVxuIiwgd21tLT53RGV2SUQpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gTUlESV9NQVBQRVI7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TRVFfU1RBVFVTX1RFTVBPOgoJICAgIFRSQUNFKCJNQ0lfU0VRX1NUQVRVU19URU1QTyAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IHdtbS0+ZHdUZW1wbzsKCSAgICBicmVhazsKCWRlZmF1bHQ6CgkgICAgRklYTUUoIlVua25vd20gY29tbWFuZCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0l0ZW0pOwoJICAgIHJldHVybiBNQ0lFUlJfVU5SRUNPR05JWkVEX0NPTU1BTkQ7Cgl9CiAgICB9IGVsc2UgewoJV0FSTigiTm8gU3RhdHVzLUl0ZW0hXG4iKTsKCXJldHVybiBNQ0lFUlJfVU5SRUNPR05JWkVEX0NPTU1BTkQ7CiAgICB9CiAgICBpZiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpIHsKCVRSQUNFKCJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CgltY2lEcml2ZXJOb3RpZnkoSFdORF8zMihMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjaykpLAoJCQl3bW0tPndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKICAgIH0KICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lHZXREZXZDYXBzCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lHZXREZXZDYXBzKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLAoJCQkJTFBNQ0lfR0VUREVWQ0FQU19QQVJNUyBscFBhcm1zKQp7CiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfbWNpR2V0T3BlbkRldih3RGV2SUQpOwogICAgRFdPUkQJCXJldDsKCiAgICBUUkFDRSgiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwoKICAgIGlmIChscFBhcm1zID09IE5VTEwpIAlyZXR1cm4gTUNJRVJSX05VTExfUEFSQU1FVEVSX0JMT0NLOwogICAgaWYgKHdtbSA9PSBOVUxMKQkJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKCiAgICBpZiAoZHdGbGFncyAmIE1DSV9HRVRERVZDQVBTX0lURU0pIHsKCXN3aXRjaCAobHBQYXJtcy0+ZHdJdGVtKSB7CgljYXNlIE1DSV9HRVRERVZDQVBTX0RFVklDRV9UWVBFOgoJICAgIFRSQUNFKCJNQ0lfR0VUREVWQ0FQU19ERVZJQ0VfVFlQRSAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IE1BS0VNQ0lSRVNPVVJDRShNQ0lfREVWVFlQRV9TRVFVRU5DRVIsIE1DSV9ERVZUWVBFX1NFUVVFTkNFUik7CgkgICAgcmV0ID0gTUNJX1JFU09VUkNFX1JFVFVSTkVEOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfR0VUREVWQ0FQU19IQVNfQVVESU86CgkgICAgVFJBQ0UoIk1DSV9HRVRERVZDQVBTX0hBU19BVURJTyAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IE1BS0VNQ0lSRVNPVVJDRShUUlVFLCBNQ0lfVFJVRSk7CgkgICAgcmV0ID0gTUNJX1JFU09VUkNFX1JFVFVSTkVEOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfR0VUREVWQ0FQU19IQVNfVklERU86CgkgICAgVFJBQ0UoIk1DSV9HRVRERVZDQVBTX0hBU19WSURFTyAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IE1BS0VNQ0lSRVNPVVJDRShGQUxTRSwgTUNJX0ZBTFNFKTsKCSAgICByZXQgPSBNQ0lfUkVTT1VSQ0VfUkVUVVJORUQ7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9HRVRERVZDQVBTX1VTRVNfRklMRVM6CgkgICAgVFJBQ0UoIk1DSV9HRVRERVZDQVBTX1VTRVNfRklMRVMgIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQUtFTUNJUkVTT1VSQ0UoVFJVRSwgTUNJX1RSVUUpOwoJICAgIHJldCA9IE1DSV9SRVNPVVJDRV9SRVRVUk5FRDsKCSAgICBicmVhazsKCWNhc2UgTUNJX0dFVERFVkNBUFNfQ09NUE9VTkRfREVWSUNFOgoJICAgIFRSQUNFKCJNQ0lfR0VUREVWQ0FQU19DT01QT1VORF9ERVZJQ0UgIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQUtFTUNJUkVTT1VSQ0UoVFJVRSwgTUNJX1RSVUUpOwoJICAgIHJldCA9IE1DSV9SRVNPVVJDRV9SRVRVUk5FRDsKCSAgICBicmVhazsKCWNhc2UgTUNJX0dFVERFVkNBUFNfQ0FOX0VKRUNUOgoJICAgIFRSQUNFKCJNQ0lfR0VUREVWQ0FQU19DQU5fRUpFQ1QgIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQUtFTUNJUkVTT1VSQ0UoRkFMU0UsIE1DSV9GQUxTRSk7CgkgICAgcmV0ID0gTUNJX1JFU09VUkNFX1JFVFVSTkVEOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfR0VUREVWQ0FQU19DQU5fUExBWToKCSAgICBUUkFDRSgiTUNJX0dFVERFVkNBUFNfQ0FOX1BMQVkgIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQUtFTUNJUkVTT1VSQ0UoVFJVRSwgTUNJX1RSVUUpOwoJICAgIHJldCA9IE1DSV9SRVNPVVJDRV9SRVRVUk5FRDsKCSAgICBicmVhazsKCWNhc2UgTUNJX0dFVERFVkNBUFNfQ0FOX1JFQ09SRDoKCSAgICBUUkFDRSgiTUNJX0dFVERFVkNBUFNfQ0FOX1JFQ09SRCAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IE1BS0VNQ0lSRVNPVVJDRShUUlVFLCBNQ0lfVFJVRSk7CgkgICAgcmV0ID0gTUNJX1JFU09VUkNFX1JFVFVSTkVEOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfR0VUREVWQ0FQU19DQU5fU0FWRToKCSAgICBUUkFDRSgiTUNJX0dFVERFVkNBUFNfQ0FOX1NBVkUgIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQUtFTUNJUkVTT1VSQ0UoRkFMU0UsIE1DSV9GQUxTRSk7CgkgICAgcmV0ID0gTUNJX1JFU09VUkNFX1JFVFVSTkVEOwoJICAgIGJyZWFrOwoJZGVmYXVsdDoKCSAgICBGSVhNRSgiVW5rbm93biBjYXBhYmlsaXR5ICglMDhseCkgIVxuIiwgbHBQYXJtcy0+ZHdJdGVtKTsKCSAgICByZXR1cm4gTUNJRVJSX1VOUkVDT0dOSVpFRF9DT01NQU5EOwoJfQogICAgfSBlbHNlIHsKCVdBUk4oIk5vIEdldERldkNhcHMtSXRlbSAhXG4iKTsKCXJldHVybiBNQ0lFUlJfVU5SRUNPR05JWkVEX0NPTU1BTkQ7CiAgICB9CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpSW5mbwkJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRCBNSURJX21jaUluZm8oVUlOVCB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0lORk9fUEFSTVNBIGxwUGFybXMpCnsKICAgIExQQ1NUUgkJc3RyID0gMDsKICAgIFdJTkVfTUNJTUlESSoJd21tID0gTUlESV9tY2lHZXRPcGVuRGV2KHdEZXZJRCk7CiAgICBEV09SRAkJcmV0ID0gMDsKCiAgICBUUkFDRSgiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwoKICAgIGlmIChscFBhcm1zID09IE5VTEwgfHwgbHBQYXJtcy0+bHBzdHJSZXR1cm4gPT0gTlVMTCkKCXJldHVybiBNQ0lFUlJfTlVMTF9QQVJBTUVURVJfQkxPQ0s7CiAgICBpZiAod21tID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfSUQ7CgogICAgVFJBQ0UoImJ1Zj0lcCwgbGVuPSVsdVxuIiwgbHBQYXJtcy0+bHBzdHJSZXR1cm4sIGxwUGFybXMtPmR3UmV0U2l6ZSk7CgogICAgc3dpdGNoIChkd0ZsYWdzICYgfihNQ0lfV0FJVHxNQ0lfTk9USUZZKSkgewogICAgY2FzZSBNQ0lfSU5GT19QUk9EVUNUOgoJc3RyID0gIldpbmUncyBNSURJIHNlcXVlbmNlciI7CglicmVhazsKICAgIGNhc2UgTUNJX0lORk9fRklMRToKCXN0ciA9IHdtbS0+bHBzdHJFbGVtZW50TmFtZTsKCWJyZWFrOwogICAgY2FzZSBNQ0lfSU5GT19DT1BZUklHSFQ6CglzdHIgPSB3bW0tPmxwc3RyQ29weXJpZ2h0OwoJYnJlYWs7CiAgICBjYXNlIE1DSV9JTkZPX05BTUU6CglzdHIgPSB3bW0tPmxwc3RyTmFtZTsKCWJyZWFrOwogICAgZGVmYXVsdDoKCVdBUk4oIkRvbid0IGtub3cgdGhpcyBpbmZvIGNvbW1hbmQgKCVsdSlcbiIsIGR3RmxhZ3MpOwoJcmV0dXJuIE1DSUVSUl9VTlJFQ09HTklaRURfQ09NTUFORDsKICAgIH0KICAgIGlmIChzdHIpIHsKCWlmIChscFBhcm1zLT5kd1JldFNpemUgPD0gc3RybGVuKHN0cikpIHsKCSAgICBsc3RyY3B5bkEobHBQYXJtcy0+bHBzdHJSZXR1cm4sIHN0ciwgbHBQYXJtcy0+ZHdSZXRTaXplIC0gMSk7CgkgICAgcmV0ID0gTUNJRVJSX1BBUkFNX09WRVJGTE9XOwoJfSBlbHNlIHsKCSAgICBzdHJjcHkobHBQYXJtcy0+bHBzdHJSZXR1cm4sIHN0cik7Cgl9CiAgICB9IGVsc2UgewoJKmxwUGFybXMtPmxwc3RyUmV0dXJuID0gMDsKICAgIH0KICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lTZWVrCQkJW2ludGVybmFsXQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpU2VlayhVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU0VFS19QQVJNUyBscFBhcm1zKQp7CiAgICBEV09SRAkJcmV0ID0gMDsKICAgIFdJTkVfTUNJTUlESSoJd21tID0gTUlESV9tY2lHZXRPcGVuRGV2KHdEZXZJRCk7CgogICAgVFJBQ0UoIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKCiAgICBpZiAobHBQYXJtcyA9PSBOVUxMKSB7CglyZXQgPSBNQ0lFUlJfTlVMTF9QQVJBTUVURVJfQkxPQ0s7CiAgICB9IGVsc2UgaWYgKHdtbSA9PSBOVUxMKSB7CglyZXQgPSBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfSUQ7CiAgICB9IGVsc2UgewoJTUlESV9tY2lTdG9wKHdEZXZJRCwgTUNJX1dBSVQsIDApOwoKCWlmIChkd0ZsYWdzICYgTUNJX1NFRUtfVE9fU1RBUlQpIHsKCSAgICB3bW0tPmR3UG9zaXRpb25NUyA9IDA7Cgl9IGVsc2UgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VFS19UT19FTkQpIHsKCSAgICB3bW0tPmR3UG9zaXRpb25NUyA9IDB4RkZGRkZGRkY7IC8qIEZJWE1FICovCgl9IGVsc2UgaWYgKGR3RmxhZ3MgJiBNQ0lfVE8pIHsKCSAgICB3bW0tPmR3UG9zaXRpb25NUyA9IE1JRElfQ29udmVydFRpbWVGb3JtYXRUb01TKHdtbSwgbHBQYXJtcy0+ZHdUbyk7Cgl9IGVsc2UgewoJICAgIFdBUk4oImR3RmxhZyBkb2Vzbid0IHRlbGwgd2hlcmUgdG8gc2VlayB0by4uLlxuIik7CgkgICAgcmV0dXJuIE1DSUVSUl9NSVNTSU5HX1BBUkFNRVRFUjsKCX0KCglUUkFDRSgiU2Vla2luZyB0byBwb3NpdGlvbj0lbHUgbXNcbiIsIHdtbS0+ZHdQb3NpdGlvbk1TKTsKCglpZiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpIHsKCSAgICBUUkFDRSgiTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOwoJICAgIG1jaURyaXZlck5vdGlmeShIV05EXzMyKExPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSksCgkJCSAgICB3bW0tPndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKCX0KICAgIH0KICAgIHJldHVybiByZXQ7Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSoKICogICAgICAgICAgICAgICAgICAJICAgIE1JREkgZW50cnkgcG9pbnRzIAkJCQkqCiAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCURyaXZlclByb2MgKE1DSVNFUS5AKQogKi8KTE9ORyBDQUxMQkFDSwlNQ0lNSURJX0RyaXZlclByb2MoRFdPUkQgZHdEZXZJRCwgSERSVlIgaERyaXYsIERXT1JEIHdNc2csCgkJCQkgICBEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCnsKICAgIHN3aXRjaCAod01zZykgewogICAgY2FzZSBEUlZfTE9BRDoJCXJldHVybiAxOwogICAgY2FzZSBEUlZfRlJFRToJCXJldHVybiAxOwogICAgY2FzZSBEUlZfRU5BQkxFOgkJcmV0dXJuIDE7CiAgICBjYXNlIERSVl9ESVNBQkxFOgkJcmV0dXJuIDE7CiAgICBjYXNlIERSVl9RVUVSWUNPTkZJR1VSRToJcmV0dXJuIDE7CiAgICBjYXNlIERSVl9DT05GSUdVUkU6CQlNZXNzYWdlQm94QSgwLCAiU2FtcGxlIE1pZGkgRHJpdmVyICEiLCAiT1NTIERyaXZlciIsIE1CX09LKTsgcmV0dXJuIDE7CiAgICBjYXNlIERSVl9JTlNUQUxMOgkJcmV0dXJuIERSVkNORl9SRVNUQVJUOwogICAgY2FzZSBEUlZfUkVNT1ZFOgkJcmV0dXJuIERSVkNORl9SRVNUQVJUOwogICAgY2FzZSBEUlZfT1BFTjoJCXJldHVybiBNSURJX2Rydk9wZW4oKExQU1RSKWR3UGFyYW0xLCAoTFBNQ0lfT1BFTl9EUklWRVJfUEFSTVNBKWR3UGFyYW0yKTsKICAgIGNhc2UgRFJWX0NMT1NFOgkJcmV0dXJuIE1JRElfZHJ2Q2xvc2UoZHdEZXZJRCk7CiAgICB9CgogICAgaWYgKGR3RGV2SUQgPT0gMHhGRkZGRkZGRikgcmV0dXJuIE1DSUVSUl9VTlNVUFBPUlRFRF9GVU5DVElPTjsKCiAgICBzd2l0Y2ggKHdNc2cpIHsKICAgIGNhc2UgTUNJX09QRU5fRFJJVkVSOglyZXR1cm4gTUlESV9tY2lPcGVuICAgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfT1BFTl9QQVJNU0EpICAgICBkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9DTE9TRV9EUklWRVI6CXJldHVybiBNSURJX21jaUNsb3NlICAgICAoZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9HRU5FUklDX1BBUk1TKSAgIGR3UGFyYW0yKTsKICAgIGNhc2UgTUNJX1BMQVk6CQlyZXR1cm4gTUlESV9tY2lQbGF5ICAgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfUExBWV9QQVJNUykgICAgICBkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9SRUNPUkQ6CQlyZXR1cm4gTUlESV9tY2lSZWNvcmQgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfUkVDT1JEX1BBUk1TKSAgICBkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9TVE9QOgkJcmV0dXJuIE1JRElfbWNpU3RvcCAgICAgIChkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX0dFTkVSSUNfUEFSTVMpICAgZHdQYXJhbTIpOwogICAgY2FzZSBNQ0lfU0VUOgkJcmV0dXJuIE1JRElfbWNpU2V0ICAgICAgIChkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX1NFVF9QQVJNUykgICAgICAgZHdQYXJhbTIpOwogICAgY2FzZSBNQ0lfUEFVU0U6CQlyZXR1cm4gTUlESV9tY2lQYXVzZSAgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfR0VORVJJQ19QQVJNUykgICBkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9SRVNVTUU6CQlyZXR1cm4gTUlESV9tY2lSZXN1bWUgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfR0VORVJJQ19QQVJNUykgICBkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9TVEFUVVM6CQlyZXR1cm4gTUlESV9tY2lTdGF0dXMgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfU1RBVFVTX1BBUk1TKSAgICBkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9HRVRERVZDQVBTOglyZXR1cm4gTUlESV9tY2lHZXREZXZDYXBzKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfR0VUREVWQ0FQU19QQVJNUylkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9JTkZPOgkJcmV0dXJuIE1JRElfbWNpSW5mbyAgICAgIChkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX0lORk9fUEFSTVNBKSAgICAgZHdQYXJhbTIpOwogICAgY2FzZSBNQ0lfU0VFSzoJCXJldHVybiBNSURJX21jaVNlZWsgICAgICAoZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9TRUVLX1BBUk1TKSAgICAgIGR3UGFyYW0yKTsKICAgIC8qIGNvbW1hbmRzIHRoYXQgc2hvdWxkIGJlIHN1cHBvcnRlZCAqLwogICAgY2FzZSBNQ0lfTE9BRDoKICAgIGNhc2UgTUNJX1NBVkU6CiAgICBjYXNlIE1DSV9GUkVFWkU6CiAgICBjYXNlIE1DSV9QVVQ6CiAgICBjYXNlIE1DSV9SRUFMSVpFOgogICAgY2FzZSBNQ0lfVU5GUkVFWkU6CiAgICBjYXNlIE1DSV9VUERBVEU6CiAgICBjYXNlIE1DSV9XSEVSRToKICAgIGNhc2UgTUNJX1NURVA6CiAgICBjYXNlIE1DSV9TUElOOgogICAgY2FzZSBNQ0lfRVNDQVBFOgogICAgY2FzZSBNQ0lfQ09QWToKICAgIGNhc2UgTUNJX0NVVDoKICAgIGNhc2UgTUNJX0RFTEVURToKICAgIGNhc2UgTUNJX1BBU1RFOgoJV0FSTigiVW5zdXBwb3J0ZWQgY29tbWFuZCBbJWx1XVxuIiwgd01zZyk7CglicmVhazsKICAgIC8qIGNvbW1hbmRzIHRoYXQgc2hvdWxkIHJlcG9ydCBhbiBlcnJvciAqLwogICAgY2FzZSBNQ0lfV0lORE9XOgoJVFJBQ0UoIlVuc3VwcG9ydGVkIGNvbW1hbmQgWyVsdV1cbiIsIHdNc2cpOwoJYnJlYWs7CiAgICBjYXNlIE1DSV9PUEVOOgogICAgY2FzZSBNQ0lfQ0xPU0U6CglGSVhNRSgiU2hvdWxkbid0IHJlY2VpdmUgYSBNQ0lfT1BFTiBvciBDTE9TRSBtZXNzYWdlXG4iKTsKCWJyZWFrOwogICAgZGVmYXVsdDoKCVRSQUNFKCJTZW5kaW5nIG1zZyBbJWx1XSB0byBkZWZhdWx0IGRyaXZlciBwcm9jXG4iLCB3TXNnKTsKCXJldHVybiBEZWZEcml2ZXJQcm9jKGR3RGV2SUQsIGhEcml2LCB3TXNnLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwogICAgfQogICAgcmV0dXJuIE1DSUVSUl9VTlJFQ09HTklaRURfQ09NTUFORDsKfQo=