LyoKICogVXNlciBJbnRlcmZhY2UgRnVuY3Rpb25zCiAqCiAqIENvcHlyaWdodCAxOTk3IERpbWl0cmllIE8uIFBhdW4KICogQ29weXJpZ2h0IDE5OTcgQmVydGhvIEEuIFN0dWx0aWVucwogKi8KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgojaW5jbHVkZSAid2luZS93aW51c2VyMTYuaCIKI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgInVzZXIuaCIKI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKCkRFRkFVTFRfREVCVUdfQ0hBTk5FTChncmFwaGljcyk7CgpzdGF0aWMgY29uc3QgV09SRCB3UGF0dGVybl9BQTU1WzhdID0geyAweGFhYWEsIDB4NTU1NSwgMHhhYWFhLCAweDU1NTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWFhYSwgMHg1NTU1LCAweGFhYWEsIDB4NTU1NSB9OwoKLyogVGhlc2UgdGFibGVzIGFyZSB1c2VkIGluOgogKiBVSVRPT0xTX0RyYXdEaWFnRWRnZSgpCiAqIFVJVE9PTFNfRHJhd1JlY3RFZGdlKCkKICovCnN0YXRpYyBjb25zdCBzaWduZWQgY2hhciBMVElubmVyTm9ybWFsW10gPSB7CiAgICAtMSwgICAgICAgICAgIC0xLCAgICAgICAgICAgICAgICAgLTEsICAgICAgICAgICAgICAgICAtMSwKICAgIC0xLCAgICAgICAgICAgQ09MT1JfQlROSElHSExJR0hULCBDT0xPUl9CVE5ISUdITElHSFQsIC0xLAogICAgLTEsICAgICAgICAgICBDT0xPUl8zRERLU0hBRE9XLCAgIENPTE9SXzNEREtTSEFET1csICAgLTEsCiAgICAtMSwgICAgICAgICAgIC0xLCAgICAgICAgICAgICAgICAgLTEsICAgICAgICAgICAgICAgICAtMQp9OwoKc3RhdGljIGNvbnN0IHNpZ25lZCBjaGFyIExUT3V0ZXJOb3JtYWxbXSA9IHsKICAgIC0xLCAgICAgICAgICAgICAgICAgQ09MT1JfM0RMSUdIVCwgICAgIENPTE9SX0JUTlNIQURPVywgLTEsCiAgICBDT0xPUl9CVE5ISUdITElHSFQsIENPTE9SXzNETElHSFQsICAgICBDT0xPUl9CVE5TSEFET1csIC0xLAogICAgQ09MT1JfM0RES1NIQURPVywgICBDT0xPUl8zRExJR0hULCAgICAgQ09MT1JfQlROU0hBRE9XLCAtMSwKICAgIC0xLCAgICAgICAgICAgICAgICAgQ09MT1JfM0RMSUdIVCwgICAgIENPTE9SX0JUTlNIQURPVywgLTEKfTsKCnN0YXRpYyBjb25zdCBzaWduZWQgY2hhciBSQklubmVyTm9ybWFsW10gPSB7CiAgICAtMSwgICAgICAgICAgIC0xLCAgICAgICAgICAgICAgICAtMSwgICAgICAgICAgICAgIC0xLAogICAgLTEsICAgICAgICAgICBDT0xPUl9CVE5TSEFET1csICAgQ09MT1JfQlROU0hBRE9XLCAtMSwKICAgIC0xLCAgICAgICAgICAgQ09MT1JfM0RMSUdIVCwgICAgIENPTE9SXzNETElHSFQsICAgLTEsCiAgICAtMSwgICAgICAgICAgIC0xLCAgICAgICAgICAgICAgICAtMSwgICAgICAgICAgICAgIC0xCn07CgpzdGF0aWMgY29uc3Qgc2lnbmVkIGNoYXIgUkJPdXRlck5vcm1hbFtdID0gewogICAgLTEsICAgICAgICAgICAgICBDT0xPUl8zRERLU0hBRE9XLCAgQ09MT1JfQlROSElHSExJR0hULCAtMSwKICAgIENPTE9SX0JUTlNIQURPVywgQ09MT1JfM0RES1NIQURPVywgIENPTE9SX0JUTkhJR0hMSUdIVCwgLTEsCiAgICBDT0xPUl8zRExJR0hULCAgIENPTE9SXzNEREtTSEFET1csICBDT0xPUl9CVE5ISUdITElHSFQsIC0xLAogICAgLTEsICAgICAgICAgICAgICBDT0xPUl8zRERLU0hBRE9XLCAgQ09MT1JfQlROSElHSExJR0hULCAtMQp9OwoKc3RhdGljIGNvbnN0IHNpZ25lZCBjaGFyIExUSW5uZXJTb2Z0W10gPSB7CiAgICAtMSwgICAgICAgICAgICAgICAgICAtMSwgICAgICAgICAgICAgICAgLTEsICAgICAgICAgICAgICAtMSwKICAgIC0xLCAgICAgICAgICAgICAgICAgIENPTE9SXzNETElHSFQsICAgICBDT0xPUl8zRExJR0hULCAgIC0xLAogICAgLTEsICAgICAgICAgICAgICAgICAgQ09MT1JfQlROU0hBRE9XLCAgIENPTE9SX0JUTlNIQURPVywgLTEsCiAgICAtMSwgICAgICAgICAgICAgICAgICAtMSwgICAgICAgICAgICAgICAgLTEsICAgICAgICAgICAgICAtMQp9OwoKc3RhdGljIGNvbnN0IHNpZ25lZCBjaGFyIExUT3V0ZXJTb2Z0W10gPSB7CiAgICAtMSwgICAgICAgICAgICAgIENPTE9SX0JUTkhJR0hMSUdIVCwgQ09MT1JfM0RES1NIQURPVywgLTEsCiAgICBDT0xPUl8zRExJR0hULCAgIENPTE9SX0JUTkhJR0hMSUdIVCwgQ09MT1JfM0RES1NIQURPVywgLTEsCiAgICBDT0xPUl9CVE5TSEFET1csIENPTE9SX0JUTkhJR0hMSUdIVCwgQ09MT1JfM0RES1NIQURPVywgLTEsCiAgICAtMSwgICAgICAgICAgICAgIENPTE9SX0JUTkhJR0hMSUdIVCwgQ09MT1JfM0RES1NIQURPVywgLTEKfTsKCiNkZWZpbmUgUkJJbm5lclNvZnQgUkJJbm5lck5vcm1hbCAgIC8qIFRoZXNlIGFyZSB0aGUgc2FtZSAqLwojZGVmaW5lIFJCT3V0ZXJTb2Z0IFJCT3V0ZXJOb3JtYWwKCnN0YXRpYyBjb25zdCBzaWduZWQgY2hhciBMVFJCT3V0ZXJNb25vW10gPSB7CiAgICAtMSwgICAgICAgICAgIENPTE9SX1dJTkRPV0ZSQU1FLCBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfV0lORE9XRlJBTUUsCiAgICBDT0xPUl9XSU5ET1csIENPTE9SX1dJTkRPV0ZSQU1FLCBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfV0lORE9XRlJBTUUsCiAgICBDT0xPUl9XSU5ET1csIENPTE9SX1dJTkRPV0ZSQU1FLCBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfV0lORE9XRlJBTUUsCiAgICBDT0xPUl9XSU5ET1csIENPTE9SX1dJTkRPV0ZSQU1FLCBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfV0lORE9XRlJBTUUsCn07CgpzdGF0aWMgY29uc3Qgc2lnbmVkIGNoYXIgTFRSQklubmVyTW9ub1tdID0gewogICAgLTEsIC0xLCAgICAgICAgICAgLTEsICAgICAgICAgICAtMSwKICAgIC0xLCBDT0xPUl9XSU5ET1csIENPTE9SX1dJTkRPVywgQ09MT1JfV0lORE9XLAogICAgLTEsIENPTE9SX1dJTkRPVywgQ09MT1JfV0lORE9XLCBDT0xPUl9XSU5ET1csCiAgICAtMSwgQ09MT1JfV0lORE9XLCBDT0xPUl9XSU5ET1csIENPTE9SX1dJTkRPVywKfTsKCnN0YXRpYyBjb25zdCBzaWduZWQgY2hhciBMVFJCT3V0ZXJGbGF0W10gPSB7CiAgICAtMSwgICAgICAgICAgICAgICAgQ09MT1JfQlROU0hBRE9XLCBDT0xPUl9CVE5TSEFET1csIENPTE9SX0JUTlNIQURPVywKICAgIENPTE9SX1dJTkRPV0ZSQU1FLCBDT0xPUl9CVE5TSEFET1csIENPTE9SX0JUTlNIQURPVywgQ09MT1JfQlROU0hBRE9XLAogICAgQ09MT1JfV0lORE9XRlJBTUUsIENPTE9SX0JUTlNIQURPVywgQ09MT1JfQlROU0hBRE9XLCBDT0xPUl9CVE5TSEFET1csCiAgICBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfQlROU0hBRE9XLCBDT0xPUl9CVE5TSEFET1csIENPTE9SX0JUTlNIQURPVywKfTsKCnN0YXRpYyBjb25zdCBzaWduZWQgY2hhciBMVFJCSW5uZXJGbGF0W10gPSB7CiAgICAtMSwgLTEsICAgICAgICAgICAgICAtMSwgICAgICAgICAgICAgIC0xLAogICAgLTEsIENPTE9SX1dJTkRPV0ZSQU1FLCBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfV0lORE9XRlJBTUUsCiAgICAtMSwgQ09MT1JfV0lORE9XRlJBTUUsIENPTE9SX1dJTkRPV0ZSQU1FLCBDT0xPUl9XSU5ET1dGUkFNRSwKICAgIC0xLCBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfV0lORE9XRlJBTUUsIENPTE9SX1dJTkRPV0ZSQU1FLAp9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBVSVRPT0xTX0RyYXdEaWFnRWRnZQogKgogKiBTYW1lIGFzIERyYXdFZGdlIGludm9rZWQgd2l0aCBCRl9ESUFHT05BTAogKgogKiAwMy1EZWMtMTk5NzogQ2hhbmdlZCBieSBCZXJ0aG8gU3R1bHRpZW5zCiAqCiAqIFNlZSBhbHNvIGNvbW1lbnRzIHdpdGggVUlUT09MU19EcmF3UmVjdEVkZ2UoKQogKi8Kc3RhdGljIEJPT0wgVUlUT09MUzk1X0RyYXdEaWFnRWRnZShIREMgaGRjLCBMUFJFQ1QgcmMsIAoJCQkJICAgICBVSU5UIHVUeXBlLCBVSU5UIHVGbGFncykKewogICAgUE9JTlQgUG9pbnRzWzRdOwogICAgc2lnbmVkIGNoYXIgSW5uZXJJLCBPdXRlckk7CiAgICBIUEVOIElubmVyUGVuLCBPdXRlclBlbjsKICAgIFBPSU5UIFNhdmVQb2ludDsKICAgIEhQRU4gU2F2ZVBlbjsKICAgIGludCBzcHgsIHNweTsKICAgIGludCBlcHgsIGVweTsKICAgIGludCBXaWR0aCA9IHJjLT5yaWdodCAtIHJjLT5sZWZ0OwogICAgaW50IEhlaWdodD0gcmMtPmJvdHRvbSAtIHJjLT50b3A7CiAgICBpbnQgU21hbGxEaWFtID0gV2lkdGggPiBIZWlnaHQgPyBIZWlnaHQgOiBXaWR0aDsKICAgIEJPT0wgcmV0dmFsID0gISggICAoKHVUeXBlICYgQkRSX0lOTkVSKSA9PSBCRFJfSU5ORVIKICAgICAgICAgICAgICAgICAgICAgICB8fCAodVR5cGUgJiBCRFJfT1VURVIpID09IEJEUl9PVVRFUikKICAgICAgICAgICAgICAgICAgICAgICYmICEodUZsYWdzICYgKEJGX0ZMQVR8QkZfTU9OTykpICk7CiAgICBpbnQgYWRkID0gKExUUkJJbm5lck1vbm9bdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildICE9IC0xID8gMSA6IDApCiAgICAgICAgICAgICsgKExUUkJPdXRlck1vbm9bdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildICE9IC0xID8gMSA6IDApOwoKICAgIC8qIEluaXQgc29tZSB2YXJzICovCiAgICBPdXRlclBlbiA9IElubmVyUGVuID0gKEhQRU4pR2V0U3RvY2tPYmplY3QoTlVMTF9QRU4pOwogICAgU2F2ZVBlbiA9IChIUEVOKVNlbGVjdE9iamVjdChoZGMsIElubmVyUGVuKTsKICAgIHNweCA9IHNweSA9IGVweCA9IGVweSA9IDA7IC8qIFNhdGlzZnkgdGhlIGNvbXBpbGVyLi4uICovCiAgICAKICAgIC8qIERldGVybWluZSB0aGUgY29sb3JzIG9mIHRoZSBlZGdlcyAqLwogICAgaWYodUZsYWdzICYgQkZfTU9OTykKICAgIHsKICAgICAgICBJbm5lckkgPSBMVFJCSW5uZXJNb25vW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgICAgICBPdXRlckkgPSBMVFJCT3V0ZXJNb25vW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgIH0KICAgIGVsc2UgaWYodUZsYWdzICYgQkZfRkxBVCkKICAgIHsKICAgICAgICBJbm5lckkgPSBMVFJCSW5uZXJGbGF0W3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgICAgICBPdXRlckkgPSBMVFJCT3V0ZXJGbGF0W3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgIH0KICAgIGVsc2UgaWYodUZsYWdzICYgQkZfU09GVCkKICAgIHsKICAgICAgICBpZih1RmxhZ3MgJiBCRl9CT1RUT00pCiAgICAgICAgewogICAgICAgICAgICBJbm5lckkgPSBSQklubmVyU29mdFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICAgICAgICAgIE91dGVySSA9IFJCT3V0ZXJTb2Z0W3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgSW5uZXJJID0gTFRJbm5lclNvZnRbdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOwogICAgICAgICAgICBPdXRlckkgPSBMVE91dGVyU29mdFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGlmKHVGbGFncyAmIEJGX0JPVFRPTSkKICAgICAgICB7CiAgICAgICAgICAgIElubmVySSA9IFJCSW5uZXJOb3JtYWxbdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOwogICAgICAgICAgICBPdXRlckkgPSBSQk91dGVyTm9ybWFsW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgSW5uZXJJID0gTFRJbm5lck5vcm1hbFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICAgICAgICAgIE91dGVySSA9IExUT3V0ZXJOb3JtYWxbdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOwogICAgICAgIH0KICAgIH0KCiAgICBpZihJbm5lckkgIT0gLTEpIElubmVyUGVuID0gR2V0U3lzQ29sb3JQZW4oSW5uZXJJKTsKICAgIGlmKE91dGVySSAhPSAtMSkgT3V0ZXJQZW4gPSBHZXRTeXNDb2xvclBlbihPdXRlckkpOwoKICAgIE1vdmVUb0V4KGhkYywgMCwgMCwgJlNhdmVQb2ludCk7CgogICAgLyogRG9uJ3QgYXNrIG1lIHdoeSwgYnV0IHRoaXMgaXMgd2hhdCBpcyB2aXNpYmxlLi4uICovCiAgICAvKiBUaGlzIG11c3QgYmUgcG9zc2libGUgdG8gZG8gbXVjaCBzaW1wbGVyLCBidXQgSSBmYWlsIHRvICovCiAgICAvKiBzZWUgdGhlIGxvZ2ljIGluIHRoZSBNUyBpbXBsZW1lbnRhdGlvbiAoc2lnaC4uLikuICovCiAgICAvKiBTbywgdGhpcyBtaWdodCBsb29rIGEgYml0IGJydXRlIGZvcmNlIGhlcmUgKGFuZCBpdCBpcyksIGJ1dCAqLwogICAgLyogaXQgZ2V0cyB0aGUgam9iIGRvbmU7KSAqLwoKICAgIHN3aXRjaCh1RmxhZ3MgJiBCRl9SRUNUKQogICAgewogICAgY2FzZSAwOgogICAgY2FzZSBCRl9MRUZUOgogICAgY2FzZSBCRl9CT1RUT006CiAgICBjYXNlIEJGX0JPVFRPTUxFRlQ6CiAgICAgICAgLyogTGVmdCBib3R0b20gZW5kcG9pbnQgKi8KICAgICAgICBlcHggPSByYy0+bGVmdC0xOwogICAgICAgIHNweCA9IGVweCArIFNtYWxsRGlhbTsKICAgICAgICBlcHkgPSByYy0+Ym90dG9tOwogICAgICAgIHNweSA9IGVweSAtIFNtYWxsRGlhbTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEJGX1RPUExFRlQ6CiAgICBjYXNlIEJGX0JPVFRPTVJJR0hUOgogICAgICAgIC8qIExlZnQgdG9wIGVuZHBvaW50ICovCiAgICAgICAgZXB4ID0gcmMtPmxlZnQtMTsKICAgICAgICBzcHggPSBlcHggKyBTbWFsbERpYW07CiAgICAgICAgZXB5ID0gcmMtPnRvcC0xOwogICAgICAgIHNweSA9IGVweSArIFNtYWxsRGlhbTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEJGX1RPUDoKICAgIGNhc2UgQkZfUklHSFQ6CiAgICBjYXNlIEJGX1RPUFJJR0hUOgogICAgY2FzZSBCRl9SSUdIVHxCRl9MRUZUOgogICAgY2FzZSBCRl9SSUdIVHxCRl9MRUZUfEJGX1RPUDoKICAgIGNhc2UgQkZfQk9UVE9NfEJGX1RPUDoKICAgIGNhc2UgQkZfQk9UVE9NfEJGX1RPUHxCRl9MRUZUOgogICAgY2FzZSBCRl9CT1RUT01SSUdIVHxCRl9MRUZUOgogICAgY2FzZSBCRl9CT1RUT01SSUdIVHxCRl9UT1A6CiAgICBjYXNlIEJGX1JFQ1Q6CiAgICAgICAgLyogUmlnaHQgdG9wIGVuZHBvaW50ICovCiAgICAgICAgc3B4ID0gcmMtPmxlZnQ7CiAgICAgICAgZXB4ID0gc3B4ICsgU21hbGxEaWFtOwogICAgICAgIHNweSA9IHJjLT5ib3R0b20tMTsKICAgICAgICBlcHkgPSBzcHkgLSBTbWFsbERpYW07CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgTW92ZVRvRXgoaGRjLCBzcHgsIHNweSwgTlVMTCk7CiAgICBTZWxlY3RPYmplY3QoaGRjLCBPdXRlclBlbik7CiAgICBMaW5lVG8oaGRjLCBlcHgsIGVweSk7CgogICAgU2VsZWN0T2JqZWN0KGhkYywgSW5uZXJQZW4pOwoKICAgIHN3aXRjaCh1RmxhZ3MgJiAoQkZfUkVDVHxCRl9ESUFHT05BTCkpCiAgICB7CiAgICBjYXNlIEJGX0RJQUdPTkFMX0VOREJPVFRPTUxFRlQ6CiAgICBjYXNlIChCRl9ESUFHT05BTHxCRl9CT1RUT00pOgogICAgY2FzZSBCRl9ESUFHT05BTDoKICAgIGNhc2UgKEJGX0RJQUdPTkFMfEJGX0xFRlQpOgogICAgICAgIE1vdmVUb0V4KGhkYywgc3B4LTEsIHNweSwgTlVMTCk7CiAgICAgICAgTGluZVRvKGhkYywgZXB4LCBlcHktMSk7CiAgICAgICAgUG9pbnRzWzBdLnggPSBzcHgtYWRkOwogICAgICAgIFBvaW50c1swXS55ID0gc3B5OwogICAgICAgIFBvaW50c1sxXS54ID0gcmMtPmxlZnQ7CiAgICAgICAgUG9pbnRzWzFdLnkgPSByYy0+dG9wOwogICAgICAgIFBvaW50c1syXS54ID0gZXB4KzE7CiAgICAgICAgUG9pbnRzWzJdLnkgPSBlcHktMS1hZGQ7CiAgICAgICAgUG9pbnRzWzNdID0gUG9pbnRzWzJdOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQkZfRElBR09OQUxfRU5EQk9UVE9NUklHSFQ6CiAgICAgICAgTW92ZVRvRXgoaGRjLCBzcHgtMSwgc3B5LCBOVUxMKTsKICAgICAgICBMaW5lVG8oaGRjLCBlcHgsIGVweSsxKTsKICAgICAgICBQb2ludHNbMF0ueCA9IHNweC1hZGQ7CiAgICAgICAgUG9pbnRzWzBdLnkgPSBzcHk7CiAgICAgICAgUG9pbnRzWzFdLnggPSByYy0+bGVmdDsKICAgICAgICBQb2ludHNbMV0ueSA9IHJjLT5ib3R0b20tMTsKICAgICAgICBQb2ludHNbMl0ueCA9IGVweCsxOwogICAgICAgIFBvaW50c1syXS55ID0gZXB5KzErYWRkOwogICAgICAgIFBvaW50c1szXSA9IFBvaW50c1syXTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIChCRl9ESUFHT05BTHxCRl9CT1RUT018QkZfUklHSFR8QkZfVE9QKToKICAgIGNhc2UgKEJGX0RJQUdPTkFMfEJGX0JPVFRPTXxCRl9SSUdIVHxCRl9UT1B8QkZfTEVGVCk6CiAgICBjYXNlIEJGX0RJQUdPTkFMX0VORFRPUFJJR0hUOgogICAgY2FzZSAoQkZfRElBR09OQUx8QkZfUklHSFR8QkZfVE9QfEJGX0xFRlQpOgogICAgICAgIE1vdmVUb0V4KGhkYywgc3B4KzEsIHNweSwgTlVMTCk7CiAgICAgICAgTGluZVRvKGhkYywgZXB4LCBlcHkrMSk7CiAgICAgICAgUG9pbnRzWzBdLnggPSBlcHgtMTsKICAgICAgICBQb2ludHNbMF0ueSA9IGVweSsxK2FkZDsKICAgICAgICBQb2ludHNbMV0ueCA9IHJjLT5yaWdodC0xOwogICAgICAgIFBvaW50c1sxXS55ID0gcmMtPnRvcCthZGQ7CiAgICAgICAgUG9pbnRzWzJdLnggPSByYy0+cmlnaHQtMTsKICAgICAgICBQb2ludHNbMl0ueSA9IHJjLT5ib3R0b20tMTsKICAgICAgICBQb2ludHNbM10ueCA9IHNweCthZGQ7CiAgICAgICAgUG9pbnRzWzNdLnkgPSBzcHk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBCRl9ESUFHT05BTF9FTkRUT1BMRUZUOgogICAgICAgIE1vdmVUb0V4KGhkYywgc3B4LCBzcHktMSwgTlVMTCk7CiAgICAgICAgTGluZVRvKGhkYywgZXB4KzEsIGVweSk7CiAgICAgICAgUG9pbnRzWzBdLnggPSBlcHgrMSthZGQ7CiAgICAgICAgUG9pbnRzWzBdLnkgPSBlcHkrMTsKICAgICAgICBQb2ludHNbMV0ueCA9IHJjLT5yaWdodC0xOwogICAgICAgIFBvaW50c1sxXS55ID0gcmMtPnRvcDsKICAgICAgICBQb2ludHNbMl0ueCA9IHJjLT5yaWdodC0xOwogICAgICAgIFBvaW50c1syXS55ID0gcmMtPmJvdHRvbS0xLWFkZDsKICAgICAgICBQb2ludHNbM10ueCA9IHNweDsKICAgICAgICBQb2ludHNbM10ueSA9IHNweS1hZGQ7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAoQkZfRElBR09OQUx8QkZfVE9QKToKICAgIGNhc2UgKEJGX0RJQUdPTkFMfEJGX0JPVFRPTXxCRl9UT1ApOgogICAgY2FzZSAoQkZfRElBR09OQUx8QkZfQk9UVE9NfEJGX1RPUHxCRl9MRUZUKToKICAgICAgICBNb3ZlVG9FeChoZGMsIHNweCsxLCBzcHktMSwgTlVMTCk7CiAgICAgICAgTGluZVRvKGhkYywgZXB4LCBlcHkpOwogICAgICAgIFBvaW50c1swXS54ID0gZXB4LTE7CiAgICAgICAgUG9pbnRzWzBdLnkgPSBlcHkrMTsKICAgICAgICBQb2ludHNbMV0ueCA9IHJjLT5yaWdodC0xOwogICAgICAgIFBvaW50c1sxXS55ID0gcmMtPnRvcDsKICAgICAgICBQb2ludHNbMl0ueCA9IHJjLT5yaWdodC0xOwogICAgICAgIFBvaW50c1syXS55ID0gcmMtPmJvdHRvbS0xLWFkZDsKICAgICAgICBQb2ludHNbM10ueCA9IHNweCthZGQ7CiAgICAgICAgUG9pbnRzWzNdLnkgPSBzcHktYWRkOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgKEJGX0RJQUdPTkFMfEJGX1JJR0hUKToKICAgIGNhc2UgKEJGX0RJQUdPTkFMfEJGX1JJR0hUfEJGX0xFRlQpOgogICAgY2FzZSAoQkZfRElBR09OQUx8QkZfUklHSFR8QkZfTEVGVHxCRl9CT1RUT00pOgogICAgICAgIE1vdmVUb0V4KGhkYywgc3B4LCBzcHksIE5VTEwpOwogICAgICAgIExpbmVUbyhoZGMsIGVweC0xLCBlcHkrMSk7CiAgICAgICAgUG9pbnRzWzBdLnggPSBzcHg7CiAgICAgICAgUG9pbnRzWzBdLnkgPSBzcHk7CiAgICAgICAgUG9pbnRzWzFdLnggPSByYy0+bGVmdDsKICAgICAgICBQb2ludHNbMV0ueSA9IHJjLT50b3ArYWRkOwogICAgICAgIFBvaW50c1syXS54ID0gZXB4LTEtYWRkOwogICAgICAgIFBvaW50c1syXS55ID0gZXB5KzErYWRkOwogICAgICAgIFBvaW50c1szXSA9IFBvaW50c1syXTsKICAgICAgICBicmVhazsKICAgIH0KCiAgICAvKiBGaWxsIHRoZSBpbnRlcmlvciBpZiBhc2tlZCAqLwogICAgaWYoKHVGbGFncyAmIEJGX01JRERMRSkgJiYgcmV0dmFsKQogICAgewogICAgICAgIEhCUlVTSCBoYnNhdmU7CiAgICAgICAgSEJSVVNIIGhiID0gR2V0U3lzQ29sb3JCcnVzaCh1RmxhZ3MgJiBCRl9NT05PID8gQ09MT1JfV0lORE9XCgkJCQkJIDpDT0xPUl9CVE5GQUNFKTsKICAgICAgICBIUEVOIGhwc2F2ZTsKICAgICAgICBIUEVOIGhwID0gR2V0U3lzQ29sb3JQZW4odUZsYWdzICYgQkZfTU9OTyA/IENPTE9SX1dJTkRPVwoJCQkJICAgICA6IENPTE9SX0JUTkZBQ0UpOwogICAgICAgIGhic2F2ZSA9IChIQlJVU0gpU2VsZWN0T2JqZWN0KGhkYywgaGIpOwogICAgICAgIGhwc2F2ZSA9IChIUEVOKVNlbGVjdE9iamVjdChoZGMsIGhwKTsKICAgICAgICBQb2x5Z29uKGhkYywgUG9pbnRzLCA0KTsKICAgICAgICBTZWxlY3RPYmplY3QoaGRjLCBoYnNhdmUpOwogICAgICAgIFNlbGVjdE9iamVjdChoZGMsIGhwc2F2ZSk7CiAgICB9CgogICAgLyogQWRqdXN0IHJlY3RhbmdsZSBpZiBhc2tlZCAqLwogICAgaWYodUZsYWdzICYgQkZfQURKVVNUKQogICAgewogICAgICAgIGlmKHVGbGFncyAmIEJGX0xFRlQpICAgcmMtPmxlZnQgICArPSBhZGQ7CiAgICAgICAgaWYodUZsYWdzICYgQkZfUklHSFQpICByYy0+cmlnaHQgIC09IGFkZDsKICAgICAgICBpZih1RmxhZ3MgJiBCRl9UT1ApICAgIHJjLT50b3AgICAgKz0gYWRkOwogICAgICAgIGlmKHVGbGFncyAmIEJGX0JPVFRPTSkgcmMtPmJvdHRvbSAtPSBhZGQ7CiAgICB9CgogICAgLyogQ2xlYW51cCAqLwogICAgU2VsZWN0T2JqZWN0KGhkYywgU2F2ZVBlbik7CiAgICBNb3ZlVG9FeChoZGMsIFNhdmVQb2ludC54LCBTYXZlUG9pbnQueSwgTlVMTCk7CgogICAgcmV0dXJuIHJldHZhbDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBVSVRPT0xTX0RyYXdSZWN0RWRnZQogKgogKiBTYW1lIGFzIERyYXdFZGdlIGludm9rZWQgd2l0aG91dCBCRl9ESUFHT05BTAogKgogKiAyMy1Ob3YtMTk5NzogQ2hhbmdlZCBieSBCZXJ0aG8gU3R1bHRpZW5zCiAqCiAqIFdlbGwsIEkgc3RhcnRlZCB0ZXN0aW5nIHRoaXMgYW5kIGZvdW5kIG91dCB0aGF0IHRoZXJlIGFyZSBhIGZldyB0aGluZ3MKICogdGhhdCB3ZXJlbid0IHF1aXRlIGFzIHdpbjk1LiBUaGUgZm9sbG93aW5nIHJld3JpdGUgc2hvdWxkIHJlcHJvZHVjZQogKiB3aW45NSByZXN1bHRzIGNvbXBsZXRlbHkuCiAqIFRoZSBjb2xvcnNlbGVjdGlvbiBpcyB0YWJsZS1kcml2ZW4gdG8gYXZvaWQgYXdmdWxsIGlmLXN0YXRlbWVudHMuCiAqIFRoZSB0YWJsZSBiZWxvdyBzaG93IHRoZSBjb2xvciBzZXR0aW5ncy4KICoKICogUGVuIHNlbGVjdGlvbiB0YWJsZSBmb3IgdUZsYWdzID0gMAogKgogKiB1VHlwZSB8ICBMVEkgIHwgIExUTyAgfCAgUkJJICB8ICBSQk8KICogLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0KICogIDAwMDAgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICogIDAwMDEgfCAgIHggICB8ICAyMiAgIHwgICB4ICAgfCAgMjEKICogIDAwMTAgfCAgIHggICB8ICAxNiAgIHwgICB4ICAgfCAgMjAKICogIDAwMTEgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICogLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0KICogIDAxMDAgfCAgIHggICB8ICAyMCAgIHwgICB4ICAgfCAgMTYKICogIDAxMDEgfCAgMjAgICB8ICAyMiAgIHwgIDE2ICAgfCAgMjEKICogIDAxMTAgfCAgMjAgICB8ICAxNiAgIHwgIDE2ICAgfCAgMjAKICogIDAxMTEgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICogLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0KICogIDEwMDAgfCAgIHggICB8ICAyMSAgIHwgICB4ICAgfCAgMjIKICogIDEwMDEgfCAgMjEgICB8ICAyMiAgIHwgIDIyICAgfCAgMjEKICogIDEwMTAgfCAgMjEgICB8ICAxNiAgIHwgIDIyICAgfCAgMjAKICogIDEwMTEgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICogLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0KICogIDExMDAgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICogIDExMDEgfCAgIHggICB8IHggKDIyKXwgICB4ICAgfCB4ICgyMSkKICogIDExMTAgfCAgIHggICB8IHggKDE2KXwgICB4ICAgfCB4ICgyMCkKICogIDExMTEgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICoKICogUGVuIHNlbGVjdGlvbiB0YWJsZSBmb3IgdUZsYWdzID0gQkZfU09GVAogKgogKiB1VHlwZSB8ICBMVEkgIHwgIExUTyAgfCAgUkJJICB8ICBSQk8KICogLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0KICogIDAwMDAgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICogIDAwMDEgfCAgIHggICB8ICAyMCAgIHwgICB4ICAgfCAgMjEKICogIDAwMTAgfCAgIHggICB8ICAyMSAgIHwgICB4ICAgfCAgMjAKICogIDAwMTEgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICogLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0KICogIDAxMDAgfCAgIHggICB8ICAyMiAgIHwgICB4ICAgfCAgMTYKICogIDAxMDEgfCAgMjIgICB8ICAyMCAgIHwgIDE2ICAgfCAgMjEKICogIDAxMTAgfCAgMjIgICB8ICAyMSAgIHwgIDE2ICAgfCAgMjAKICogIDAxMTEgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICogLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0KICogIDEwMDAgfCAgIHggICB8ICAxNiAgIHwgICB4ICAgfCAgMjIKICogIDEwMDEgfCAgMTYgICB8ICAyMCAgIHwgIDIyICAgfCAgMjEKICogIDEwMTAgfCAgMTYgICB8ICAyMSAgIHwgIDIyICAgfCAgMjAKICogIDEwMTEgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICogLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0KICogIDExMDAgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICogIDExMDEgfCAgIHggICB8IHggKDIwKXwgICB4ICAgfCB4ICgyMSkKICogIDExMTAgfCAgIHggICB8IHggKDIxKXwgICB4ICAgfCB4ICgyMCkKICogIDExMTEgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICoKICogeCA9IGRvbid0IGNhcmU7IChuKSA9IGlzIHdoYXQgd2luOTUgYWN0dWFsbHkgdXNlcwogKiBMVEkgPSBsZWZ0IFRvcCBJbm5lciBsaW5lCiAqIExUTyA9IGxlZnQgVG9wIE91dGVyIGxpbmUKICogUkJJID0gUmlnaHQgQm90dG9tIElubmVyIGxpbmUKICogUkJPID0gUmlnaHQgQm90dG9tIE91dGVyIGxpbmUKICogMTUgPSBDT0xPUl9CVE5GQUNFCiAqIDE2ID0gQ09MT1JfQlROU0hBRE9XCiAqIDIwID0gQ09MT1JfQlROSElHSExJR0hUCiAqIDIxID0gQ09MT1JfM0RES1NIQURPVwogKiAyMiA9IENPTE9SXzNETElHSFQKICovCgoKc3RhdGljIEJPT0wgVUlUT09MUzk1X0RyYXdSZWN0RWRnZShIREMgaGRjLCBMUFJFQ1QgcmMsIAoJCQkJICAgICBVSU5UIHVUeXBlLCBVSU5UIHVGbGFncykKewogICAgc2lnbmVkIGNoYXIgTFRJbm5lckksIExUT3V0ZXJJOwogICAgc2lnbmVkIGNoYXIgUkJJbm5lckksIFJCT3V0ZXJJOwogICAgSFBFTiBMVElubmVyUGVuLCBMVE91dGVyUGVuOwogICAgSFBFTiBSQklubmVyUGVuLCBSQk91dGVyUGVuOwogICAgUkVDVCBJbm5lclJlY3QgPSAqcmM7CiAgICBQT0lOVCBTYXZlUG9pbnQ7CiAgICBIUEVOIFNhdmVQZW47CiAgICBpbnQgTEJwZW5wbHVzID0gMDsKICAgIGludCBMVHBlbnBsdXMgPSAwOwogICAgaW50IFJUcGVucGx1cyA9IDA7CiAgICBpbnQgUkJwZW5wbHVzID0gMDsKICAgIEJPT0wgcmV0dmFsID0gISggICAoKHVUeXBlICYgQkRSX0lOTkVSKSA9PSBCRFJfSU5ORVIKICAgICAgICAgICAgICAgICAgICAgICB8fCAodVR5cGUgJiBCRFJfT1VURVIpID09IEJEUl9PVVRFUikKICAgICAgICAgICAgICAgICAgICAgICYmICEodUZsYWdzICYgKEJGX0ZMQVR8QkZfTU9OTykpICk7CiAgICAgICAgCiAgICAvKiBJbml0IHNvbWUgdmFycyAqLwogICAgTFRJbm5lclBlbiA9IExUT3V0ZXJQZW4gPSBSQklubmVyUGVuID0gUkJPdXRlclBlbiA9IChIUEVOKUdldFN0b2NrT2JqZWN0KE5VTExfUEVOKTsKICAgIFNhdmVQZW4gPSAoSFBFTilTZWxlY3RPYmplY3QoaGRjLCBMVElubmVyUGVuKTsKCiAgICAvKiBEZXRlcm1pbmUgdGhlIGNvbG9ycyBvZiB0aGUgZWRnZXMgKi8KICAgIGlmKHVGbGFncyAmIEJGX01PTk8pCiAgICB7CiAgICAgICAgTFRJbm5lckkgPSBSQklubmVySSA9IExUUkJJbm5lck1vbm9bdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOwogICAgICAgIExUT3V0ZXJJID0gUkJPdXRlckkgPSBMVFJCT3V0ZXJNb25vW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgIH0KICAgIGVsc2UgaWYodUZsYWdzICYgQkZfRkxBVCkKICAgIHsKICAgICAgICBMVElubmVySSA9IFJCSW5uZXJJID0gTFRSQklubmVyRmxhdFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICAgICAgTFRPdXRlckkgPSBSQk91dGVySSA9IExUUkJPdXRlckZsYXRbdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOwoKICAgICAgICAvKiBCZXJ0aG8gU3R1bHRpZW5zIHN0YXRlcyBhYm92ZSB0aGF0IHRoaXMgZnVuY3Rpb24gZXhhY3RseSBtYXRjaGVzIHdpbjk1CiAgICAgICAgICogSW4gd2luOTggQkZfRkxBVCByZWN0YW5nbGVzIGhhdmUgYW4gaW5uZXIgYm9yZGVyIHNhbWUgY29sb3IgYXMgdGhlCgkgKiBtaWRkbGUgKENPTE9SX0JUTkZBQ0UpLiBJIGJlbGlldmUgaXQncyB0aGUgc2FtZSBmb3Igd2luOTUgYnV0IHNpbmNlCgkgKiBJIGRvbid0IGtub3cgSSBnbyB3aXRoIEJlcnRobyBhbmQganVzdCBzZXRzIGl0IGZvciB3aW45OCB1bnRpbCBwcm92ZW4KCSAqIG90aGVyd2lzZS4KCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVubmlzIEJq9nJrbHVuZCwgMTAgSnVuZSwgOTkKCSAqLwoJaWYoIFRXRUFLX1dpbmVMb29rID09IFdJTjk4X0xPT0sgJiYgTFRJbm5lckkgIT0gLTEgKQkgIAogICAgICAgICAgICBMVElubmVySSA9IFJCSW5uZXJJID0gQ09MT1JfQlRORkFDRTsKICAgIH0KICAgIGVsc2UgaWYodUZsYWdzICYgQkZfU09GVCkKICAgIHsKICAgICAgICBMVElubmVySSA9IExUSW5uZXJTb2Z0W3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgICAgICBMVE91dGVySSA9IExUT3V0ZXJTb2Z0W3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgICAgICBSQklubmVySSA9IFJCSW5uZXJTb2Z0W3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgICAgICBSQk91dGVySSA9IFJCT3V0ZXJTb2Z0W3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBMVElubmVySSA9IExUSW5uZXJOb3JtYWxbdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOwogICAgICAgIExUT3V0ZXJJID0gTFRPdXRlck5vcm1hbFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICAgICAgUkJJbm5lckkgPSBSQklubmVyTm9ybWFsW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgICAgICBSQk91dGVySSA9IFJCT3V0ZXJOb3JtYWxbdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOwogICAgfQoKICAgIGlmKCh1RmxhZ3MgJiBCRl9CT1RUT01MRUZUKSA9PSBCRl9CT1RUT01MRUZUKSAgIExCcGVucGx1cyA9IDE7CiAgICBpZigodUZsYWdzICYgQkZfVE9QUklHSFQpID09IEJGX1RPUFJJR0hUKSAgICAgICBSVHBlbnBsdXMgPSAxOwogICAgaWYoKHVGbGFncyAmIEJGX0JPVFRPTVJJR0hUKSA9PSBCRl9CT1RUT01SSUdIVCkgUkJwZW5wbHVzID0gMTsKICAgIGlmKCh1RmxhZ3MgJiBCRl9UT1BMRUZUKSA9PSBCRl9UT1BMRUZUKSAgICAgICAgIExUcGVucGx1cyA9IDE7CgogICAgaWYoTFRJbm5lckkgIT0gLTEpIExUSW5uZXJQZW4gPSBHZXRTeXNDb2xvclBlbihMVElubmVySSk7CiAgICBpZihMVE91dGVySSAhPSAtMSkgTFRPdXRlclBlbiA9IEdldFN5c0NvbG9yUGVuKExUT3V0ZXJJKTsKICAgIGlmKFJCSW5uZXJJICE9IC0xKSBSQklubmVyUGVuID0gR2V0U3lzQ29sb3JQZW4oUkJJbm5lckkpOwogICAgaWYoUkJPdXRlckkgIT0gLTEpIFJCT3V0ZXJQZW4gPSBHZXRTeXNDb2xvclBlbihSQk91dGVySSk7CgogICAgTW92ZVRvRXgoaGRjLCAwLCAwLCAmU2F2ZVBvaW50KTsKCiAgICAvKiBEcmF3IHRoZSBvdXRlciBlZGdlICovCiAgICBTZWxlY3RPYmplY3QoaGRjLCBMVE91dGVyUGVuKTsKICAgIGlmKHVGbGFncyAmIEJGX1RPUCkKICAgIHsKICAgICAgICBNb3ZlVG9FeChoZGMsIElubmVyUmVjdC5sZWZ0LCBJbm5lclJlY3QudG9wLCBOVUxMKTsKICAgICAgICBMaW5lVG8oaGRjLCBJbm5lclJlY3QucmlnaHQsIElubmVyUmVjdC50b3ApOwogICAgfQogICAgaWYodUZsYWdzICYgQkZfTEVGVCkKICAgIHsKICAgICAgICBNb3ZlVG9FeChoZGMsIElubmVyUmVjdC5sZWZ0LCBJbm5lclJlY3QudG9wLCBOVUxMKTsKICAgICAgICBMaW5lVG8oaGRjLCBJbm5lclJlY3QubGVmdCwgSW5uZXJSZWN0LmJvdHRvbSk7CiAgICB9CiAgICBTZWxlY3RPYmplY3QoaGRjLCBSQk91dGVyUGVuKTsKICAgIGlmKHVGbGFncyAmIEJGX0JPVFRPTSkKICAgIHsKICAgICAgICBNb3ZlVG9FeChoZGMsIElubmVyUmVjdC5yaWdodC0xLCBJbm5lclJlY3QuYm90dG9tLTEsIE5VTEwpOwogICAgICAgIExpbmVUbyhoZGMsIElubmVyUmVjdC5sZWZ0LTEsIElubmVyUmVjdC5ib3R0b20tMSk7CiAgICB9CiAgICBpZih1RmxhZ3MgJiBCRl9SSUdIVCkKICAgIHsKICAgICAgICBNb3ZlVG9FeChoZGMsIElubmVyUmVjdC5yaWdodC0xLCBJbm5lclJlY3QuYm90dG9tLTEsIE5VTEwpOwogICAgICAgIExpbmVUbyhoZGMsIElubmVyUmVjdC5yaWdodC0xLCBJbm5lclJlY3QudG9wLTEpOwogICAgfQoKICAgIC8qIERyYXcgdGhlIGlubmVyIGVkZ2UgKi8KICAgIFNlbGVjdE9iamVjdChoZGMsIExUSW5uZXJQZW4pOwogICAgaWYodUZsYWdzICYgQkZfVE9QKQogICAgewogICAgICAgIE1vdmVUb0V4KGhkYywgSW5uZXJSZWN0LmxlZnQrTFRwZW5wbHVzLCBJbm5lclJlY3QudG9wKzEsIE5VTEwpOwogICAgICAgIExpbmVUbyhoZGMsIElubmVyUmVjdC5yaWdodC1SVHBlbnBsdXMsIElubmVyUmVjdC50b3ArMSk7CiAgICB9CiAgICBpZih1RmxhZ3MgJiBCRl9MRUZUKQogICAgewogICAgICAgIE1vdmVUb0V4KGhkYywgSW5uZXJSZWN0LmxlZnQrMSwgSW5uZXJSZWN0LnRvcCtMVHBlbnBsdXMsIE5VTEwpOwogICAgICAgIExpbmVUbyhoZGMsIElubmVyUmVjdC5sZWZ0KzEsIElubmVyUmVjdC5ib3R0b20tTEJwZW5wbHVzKTsKICAgIH0KICAgIFNlbGVjdE9iamVjdChoZGMsIFJCSW5uZXJQZW4pOwogICAgaWYodUZsYWdzICYgQkZfQk9UVE9NKQogICAgewogICAgICAgIE1vdmVUb0V4KGhkYywgSW5uZXJSZWN0LnJpZ2h0LTEtUkJwZW5wbHVzLCBJbm5lclJlY3QuYm90dG9tLTIsIE5VTEwpOwogICAgICAgIExpbmVUbyhoZGMsIElubmVyUmVjdC5sZWZ0LTErTEJwZW5wbHVzLCBJbm5lclJlY3QuYm90dG9tLTIpOwogICAgfQogICAgaWYodUZsYWdzICYgQkZfUklHSFQpCiAgICB7CiAgICAgICAgTW92ZVRvRXgoaGRjLCBJbm5lclJlY3QucmlnaHQtMiwgSW5uZXJSZWN0LmJvdHRvbS0xLVJCcGVucGx1cywgTlVMTCk7CiAgICAgICAgTGluZVRvKGhkYywgSW5uZXJSZWN0LnJpZ2h0LTIsIElubmVyUmVjdC50b3AtMStSVHBlbnBsdXMpOwogICAgfQoKICAgIGlmKCAoKHVGbGFncyAmIEJGX01JRERMRSkgJiYgcmV0dmFsKSB8fCAodUZsYWdzICYgQkZfQURKVVNUKSApCiAgICB7CiAgICAgICAgaW50IGFkZCA9IChMVFJCSW5uZXJNb25vW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXSAhPSAtMSA/IDEgOiAwKQogICAgICAgICAgICAgICAgKyAoTFRSQk91dGVyTW9ub1t1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV0gIT0gLTEgPyAxIDogMCk7CgogICAgICAgIGlmKHVGbGFncyAmIEJGX0xFRlQpICAgSW5uZXJSZWN0LmxlZnQgICArPSBhZGQ7CiAgICAgICAgaWYodUZsYWdzICYgQkZfUklHSFQpICBJbm5lclJlY3QucmlnaHQgIC09IGFkZDsKICAgICAgICBpZih1RmxhZ3MgJiBCRl9UT1ApICAgIElubmVyUmVjdC50b3AgICAgKz0gYWRkOwogICAgICAgIGlmKHVGbGFncyAmIEJGX0JPVFRPTSkgSW5uZXJSZWN0LmJvdHRvbSAtPSBhZGQ7CgogICAgICAgIGlmKCh1RmxhZ3MgJiBCRl9NSURETEUpICYmIHJldHZhbCkKCXsgCiAgICAgICAgICAgIEZpbGxSZWN0KGhkYywgJklubmVyUmVjdCwgR2V0U3lzQ29sb3JCcnVzaCh1RmxhZ3MgJiBCRl9NT05PID8gCgkJCQkJCSAgICAgICBDT0xPUl9XSU5ET1cgOiBDT0xPUl9CVE5GQUNFKSk7Cgl9CgoJaWYodUZsYWdzICYgQkZfQURKVVNUKQoJICAgICpyYyA9IElubmVyUmVjdDsKICAgIH0KCiAgICAvKiBDbGVhbnVwICovCiAgICBTZWxlY3RPYmplY3QoaGRjLCBTYXZlUGVuKTsKICAgIE1vdmVUb0V4KGhkYywgU2F2ZVBvaW50LngsIFNhdmVQb2ludC55LCBOVUxMKTsKICAgIHJldHVybiByZXR2YWw7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICBEcmF3RWRnZSAgIChVU0VSLjY1OSkKICovCkJPT0wxNiBXSU5BUEkgRHJhd0VkZ2UxNiggSERDMTYgaGRjLCBMUFJFQ1QxNiByYywgVUlOVDE2IGVkZ2UsIFVJTlQxNiBmbGFncyApCnsKICAgIFJFQ1QgcmVjdDMyOwogICAgQk9PTCByZXQ7CgogICAgQ09OVl9SRUNUMTZUTzMyKCByYywgJnJlY3QzMiApOwogICAgcmV0ID0gRHJhd0VkZ2UoIGhkYywgJnJlY3QzMiwgZWRnZSwgZmxhZ3MgKTsKICAgIENPTlZfUkVDVDMyVE8xNiggJnJlY3QzMiwgcmMgKTsKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgIERyYXdFZGdlICAgKFVTRVIzMi5AKQogKi8KQk9PTCBXSU5BUEkgRHJhd0VkZ2UoIEhEQyBoZGMsIExQUkVDVCByYywgVUlOVCBlZGdlLCBVSU5UIGZsYWdzICkKewogICAgVFJBQ0UoIiUwNHggJWQsJWQtJWQsJWQgJTA0eCAlMDR4XG4iLAoJICBoZGMsIHJjLT5sZWZ0LCByYy0+dG9wLCByYy0+cmlnaHQsIHJjLT5ib3R0b20sIGVkZ2UsIGZsYWdzICk7CgogICAgaWYoZmxhZ3MgJiBCRl9ESUFHT05BTCkKICAgICAgcmV0dXJuIFVJVE9PTFM5NV9EcmF3RGlhZ0VkZ2UoaGRjLCByYywgZWRnZSwgZmxhZ3MpOwogICAgZWxzZQogICAgICByZXR1cm4gVUlUT09MUzk1X0RyYXdSZWN0RWRnZShoZGMsIHJjLCBlZGdlLCBmbGFncyk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVVJVE9PTFNfTWFrZVNxdWFyZVJlY3QKICoKICogVXRpbGl0eSB0byBjcmVhdGUgYSBzcXVhcmUgcmVjdGFuZ2xlIGFuZCByZXR1cm5pbmcgdGhlIHdpZHRoCiAqLwpzdGF0aWMgaW50IFVJVE9PTFNfTWFrZVNxdWFyZVJlY3QoTFBSRUNUIHNyYywgTFBSRUNUIGRzdCkKewogICAgaW50IFdpZHRoICA9IHNyYy0+cmlnaHQgLSBzcmMtPmxlZnQ7CiAgICBpbnQgSGVpZ2h0ID0gc3JjLT5ib3R0b20gLSBzcmMtPnRvcDsKICAgIGludCBTbWFsbERpYW0gPSBXaWR0aCA+IEhlaWdodCA/IEhlaWdodCA6IFdpZHRoOwoKICAgICpkc3QgPSAqc3JjOwoKICAgIC8qIE1ha2UgaXQgYSBzcXVhcmUgYm94ICovCiAgICBpZihXaWR0aCA8IEhlaWdodCkgICAgICAvKiBTbWFsbERpYW0gPT0gV2lkdGggKi8KICAgIHsKICAgICAgICBkc3QtPnRvcCArPSAoSGVpZ2h0LVdpZHRoKS8yOwogICAgICAgIGRzdC0+Ym90dG9tID0gZHN0LT50b3AgKyBTbWFsbERpYW07CiAgICB9CiAgICBlbHNlIGlmKFdpZHRoID4gSGVpZ2h0KSAvKiBTbWFsbERpYW0gPT0gSGVpZ2h0ICovCiAgICB7CiAgICAgICAgZHN0LT5sZWZ0ICs9IChXaWR0aC1IZWlnaHQpLzI7CiAgICAgICAgZHN0LT5yaWdodCA9IGRzdC0+bGVmdCArIFNtYWxsRGlhbTsKICAgIH0KCiAgIHJldHVybiBTbWFsbERpYW07Cn0KCnN0YXRpYyB2b2lkIFVJVE9PTFNfRHJhd0NoZWNrZWRSZWN0KCBIREMgZGMsIExQUkVDVCByZWN0ICkKewogICAgaWYoR2V0U3lzQ29sb3IoQ09MT1JfQlROSElHSExJR0hUKSA9PSBSR0IoMjU1LCAyNTUsIDI1NSkpCiAgICB7CiAgICAgIEhCSVRNQVAgaGJtID0gQ3JlYXRlQml0bWFwKDgsIDgsIDEsIDEsIHdQYXR0ZXJuX0FBNTUpOwogICAgICBIQlJVU0ggaGJzYXZlOwogICAgICBIQlJVU0ggaGIgPSBDcmVhdGVQYXR0ZXJuQnJ1c2goaGJtKTsKICAgICAgQ09MT1JSRUYgYmc7CgogICAgICBGaWxsUmVjdChkYywgcmVjdCwgR2V0U3lzQ29sb3JCcnVzaChDT0xPUl9CVE5GQUNFKSk7CiAgICAgIGJnID0gU2V0QmtDb2xvcihkYywgUkdCKDI1NSwgMjU1LCAyNTUpKTsKICAgICAgaGJzYXZlID0gKEhCUlVTSClTZWxlY3RPYmplY3QoZGMsIGhiKTsKICAgICAgUGF0Qmx0KGRjLCByZWN0LT5sZWZ0LCByZWN0LT50b3AsIHJlY3QtPnJpZ2h0LXJlY3QtPmxlZnQsIHJlY3QtPmJvdHRvbS1yZWN0LT50b3AsIDB4MDBGQTAwODkpOwogICAgICBTZWxlY3RPYmplY3QoZGMsIGhic2F2ZSk7CiAgICAgIFNldEJrQ29sb3IoZGMsIGJnKTsKICAgICAgRGVsZXRlT2JqZWN0KGhiKTsKICAgICAgRGVsZXRlT2JqZWN0KGhibSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgRmlsbFJlY3QoZGMsIHJlY3QsIEdldFN5c0NvbG9yQnJ1c2goQ09MT1JfQlROSElHSExJR0hUKSk7CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJVUlUT09MU19ERkNfQnV0dG9uUHVzaAogKgogKiBEcmF3IGEgcHVzaCBidXR0b24gY29taW5nIGZyb20gRHJhd0ZyYW1lQ29udHJvbCgpCiAqCiAqIERvZXMgYSBwcmV0dHkgZ29vZCBqb2IgaW4gZW11bGF0aW5nIE1TIGJlaGF2aW9yLiBTb21lIHF1aXJrcyBhcmUKICogaG93ZXZlciB0aGVyZSBiZWNhdXNlIE1TIHVzZXMgYSBUcnVlVHlwZSBmb250IChNYXJsZXR0KSB0byBkcmF3CiAqIHRoZSBidXR0b25zLgogKi8Kc3RhdGljIEJPT0wgVUlUT09MUzk1X0RGQ19CdXR0b25QdXNoKEhEQyBkYywgTFBSRUNUIHIsIFVJTlQgdUZsYWdzKQp7CiAgICBVSU5UIGVkZ2U7CiAgICBSRUNUIG15ciA9ICpyOwoKICAgIGlmKHVGbGFncyAmIChERkNTX1BVU0hFRCB8IERGQ1NfQ0hFQ0tFRCB8IERGQ1NfRkxBVCkpCiAgICAgICAgZWRnZSA9IEVER0VfU1VOS0VOOwogICAgZWxzZQogICAgICAgIGVkZ2UgPSBFREdFX1JBSVNFRDsKCiAgICBpZih1RmxhZ3MgJiBERkNTX0NIRUNLRUQpCiAgICB7CiAgICAgICAgaWYodUZsYWdzICYgREZDU19NT05PKQogICAgICAgICAgICBVSVRPT0xTOTVfRHJhd1JlY3RFZGdlKGRjLCAmbXlyLCBlZGdlLCBCRl9NT05PfEJGX1JFQ1R8QkZfQURKVVNUKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIFVJVE9PTFM5NV9EcmF3UmVjdEVkZ2UoZGMsICZteXIsIGVkZ2UsICh1RmxhZ3MmREZDU19GTEFUKXxCRl9SRUNUfEJGX1NPRlR8QkZfQURKVVNUKTsKCglVSVRPT0xTX0RyYXdDaGVja2VkUmVjdCggZGMsICZteXIgKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICBpZih1RmxhZ3MgJiBERkNTX01PTk8pCiAgICAgICAgewogICAgICAgICAgICBVSVRPT0xTOTVfRHJhd1JlY3RFZGdlKGRjLCAmbXlyLCBlZGdlLCBCRl9NT05PfEJGX1JFQ1R8QkZfQURKVVNUKTsKICAgICAgICAgICAgRmlsbFJlY3QoZGMsICZteXIsIEdldFN5c0NvbG9yQnJ1c2goQ09MT1JfQlRORkFDRSkpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBVSVRPT0xTOTVfRHJhd1JlY3RFZGdlKGRjLCByLCBlZGdlLCAodUZsYWdzJkRGQ1NfRkxBVCkgfCBCRl9NSURETEUgfEJGX1NPRlR8IEJGX1JFQ1QpOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBBZGp1c3QgcmVjdGFuZ2xlIGlmIGFza2VkICovCiAgICBpZih1RmxhZ3MgJiBERkNTX0FESlVTVFJFQ1QpCiAgICB7CiAgICAgICAgci0+bGVmdCAgICs9IDI7CiAgICAgICAgci0+cmlnaHQgIC09IDI7CiAgICAgICAgci0+dG9wICAgICs9IDI7CiAgICAgICAgci0+Ym90dG9tIC09IDI7CiAgICB9CgogICAgcmV0dXJuIFRSVUU7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVVJVE9PTFNfREZDX0J1dHRvbkNoY2VrCiAqCiAqIERyYXcgYSBjaGVjay8zc3RhdGUgYnV0dG9uIGNvbWluZyBmcm9tIERyYXdGcmFtZUNvbnRyb2woKQogKgogKiBEb2VzIGEgcHJldHR5IGdvb2Qgam9iIGluIGVtdWxhdGluZyBNUyBiZWhhdmlvci4gU29tZSBxdWlya3MgYXJlCiAqIGhvd2V2ZXIgdGhlcmUgYmVjYXVzZSBNUyB1c2VzIGEgVHJ1ZVR5cGUgZm9udCAoTWFybGV0dCkgdG8gZHJhdwogKiB0aGUgYnV0dG9ucy4KICovCgpzdGF0aWMgQk9PTCBVSVRPT0xTOTVfREZDX0J1dHRvbkNoZWNrKEhEQyBkYywgTFBSRUNUIHIsIFVJTlQgdUZsYWdzKQp7CiAgICBSRUNUIG15ciwgYmFyOwogICAgVUlOVCBmbGFncyA9IEJGX1JFQ1QgfCBCRl9BREpVU1Q7CiAgICBVSVRPT0xTX01ha2VTcXVhcmVSZWN0KHIsICZteXIpOwoKICAgIGlmKHVGbGFncyAmIERGQ1NfRkxBVCkgZmxhZ3MgfD0gQkZfRkxBVDsKICAgIGVsc2UgaWYodUZsYWdzICYgREZDU19NT05PKSBmbGFncyB8PSBCRl9NT05POwoKICAgIFVJVE9PTFM5NV9EcmF3UmVjdEVkZ2UoIGRjLCAmbXlyLCBFREdFX1NVTktFTiwgZmxhZ3MgKTsKCiAgICBpZih1RmxhZ3MgJiAoREZDU19JTkFDVElWRXxERkNTX1BVU0hFRCkpCiAgICAgICAgRmlsbFJlY3QoZGMsICZteXIsIEdldFN5c0NvbG9yQnJ1c2goQ09MT1JfQlRORkFDRSkpOwogICAgZWxzZSBpZiggKHVGbGFncyAmIERGQ1NfQlVUVE9OM1NUQVRFKSAmJiAodUZsYWdzICYgREZDU19DSEVDS0VEKSApCiAgICAgICAgVUlUT09MU19EcmF3Q2hlY2tlZFJlY3QoIGRjLCAmbXlyICk7CiAgICBlbHNlCiAgICB7CiAgICAgICAgRmlsbFJlY3QoZGMsICZteXIsIEdldFN5c0NvbG9yQnJ1c2goQ09MT1JfV0lORE9XKSk7CiAgICB9CgogICAgaWYodUZsYWdzICYgREZDU19DSEVDS0VEKQogICAgewogICAgICAgIGludCBpLCBrOwogICAgICAgIGkgPSAodUZsYWdzICYgREZDU19JTkFDVElWRSkgfHwgKHVGbGFncyAmIDB4ZmYpID09IERGQ1NfQlVUVE9OM1NUQVRFID8KCQlDT0xPUl9CVE5TSEFET1cgOiBDT0xPUl9XSU5ET1dURVhUOwoKICAgICAgICAvKiBkcmF3IDcgYmFycywgd2l0aCBoPTN3IHRvIGZvcm0gdGhlIGNoZWNrICovCiAgICAgICAgYmFyLmxlZnQgPSBteXIubGVmdDsKCWJhci50b3AgPSBteXIudG9wICsgMjsKICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNzsgaysrKSB7CiAgICAgICAgICAgIGJhci5sZWZ0ID0gYmFyLmxlZnQgKyAxOwoJICAgIGJhci50b3AgPSAoayA8IDMpID8gYmFyLnRvcCArIDEgOiBiYXIudG9wIC0gMTsKCSAgICBiYXIuYm90dG9tID0gYmFyLnRvcCArIDM7CiAgIAkgICAgYmFyLnJpZ2h0ID0gYmFyLmxlZnQgKyAxOwogICAgICAgICAgICBGaWxsUmVjdChkYywgJmJhciwgR2V0U3lzQ29sb3JCcnVzaChpKSk7Cgl9CiAgICB9CiAgICByZXR1cm4gVFJVRTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJVUlUT09MU19ERkNfQnV0dG9uUmFkaW8KICoKICogRHJhdyBhIHJhZGlvL3JhZGlvaW1hZ2UvcmFkaW9tYXNrIGJ1dHRvbiBjb21pbmcgZnJvbSBEcmF3RnJhbWVDb250cm9sKCkKICoKICogRG9lcyBhIHByZXR0eSBnb29kIGpvYiBpbiBlbXVsYXRpbmcgTVMgYmVoYXZpb3IuIFNvbWUgcXVpcmtzIGFyZQogKiBob3dldmVyIHRoZXJlIGJlY2F1c2UgTVMgdXNlcyBhIFRydWVUeXBlIGZvbnQgKE1hcmxldHQpIHRvIGRyYXcKICogdGhlIGJ1dHRvbnMuCiAqLwpzdGF0aWMgQk9PTCBVSVRPT0xTOTVfREZDX0J1dHRvblJhZGlvKEhEQyBkYywgTFBSRUNUIHIsIFVJTlQgdUZsYWdzKQp7CiAgICBSRUNUIG15cjsKICAgIGludCBpOwogICAgaW50IFNtYWxsRGlhbSA9IFVJVE9PTFNfTWFrZVNxdWFyZVJlY3QociwgJm15cik7CiAgICBpbnQgQm9yZGVyU2hyaW5rID0gU21hbGxEaWFtIC8gMTY7CiAgICBIUEVOIGhwc2F2ZTsKICAgIEhCUlVTSCBoYnNhdmU7CiAgICBpbnQgeGMsIHljOwoKICAgIGlmKEJvcmRlclNocmluayA8IDEpIEJvcmRlclNocmluayA9IDE7CgogICAgaWYoKHVGbGFncyAmIDB4ZmYpID09IERGQ1NfQlVUVE9OUkFESU9JTUFHRSkKICAgIHsKICAgICAgICBGaWxsUmVjdChkYywgciwgKEhCUlVTSClHZXRTdG9ja09iamVjdChCTEFDS19CUlVTSCkpOwogICAgfQoKICAgIHhjID0gbXlyLmxlZnQgKyBTbWFsbERpYW0gLSBTbWFsbERpYW0vMjsKICAgIHljID0gbXlyLnRvcCAgKyBTbWFsbERpYW0gLSBTbWFsbERpYW0vMjsKCiAgICAvKiBEZWZpbmUgYm91bmRpbmcgYm94ICovCiAgICBpID0gMTQqU21hbGxEaWFtLzE2OwogICAgbXlyLmxlZnQgICA9IHhjIC0gaStpLzI7CiAgICBteXIucmlnaHQgID0geGMgKyBpLzI7CiAgICBteXIudG9wICAgID0geWMgLSBpK2kvMjsKICAgIG15ci5ib3R0b20gPSB5YyArIGkvMjsKCiAgICBpZigodUZsYWdzICYgMHhmZikgPT0gREZDU19CVVRUT05SQURJT01BU0spCiAgICB7CiAgICAgICAgaGJzYXZlID0gKEhCUlVTSClTZWxlY3RPYmplY3QoZGMsIEdldFN0b2NrT2JqZWN0KEJMQUNLX0JSVVNIKSk7CiAgICAgICAgRWxsaXBzZShkYywgbXlyLmxlZnQsIG15ci50b3AsIG15ci5yaWdodCwgbXlyLmJvdHRvbSk7CiAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBoYnNhdmUpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGlmKHVGbGFncyAmIChERkNTX0ZMQVR8REZDU19NT05PKSkKICAgICAgICB7CiAgICAgICAgICAgIGhwc2F2ZSA9IChIUEVOKVNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JQZW4oQ09MT1JfV0lORE9XRlJBTUUpKTsKICAgICAgICAgICAgaGJzYXZlID0gKEhCUlVTSClTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yQnJ1c2goQ09MT1JfV0lORE9XRlJBTUUpKTsKICAgICAgICAgICAgRWxsaXBzZShkYywgbXlyLmxlZnQsIG15ci50b3AsIG15ci5yaWdodCwgbXlyLmJvdHRvbSk7CiAgICAgICAgICAgIFNlbGVjdE9iamVjdChkYywgaGJzYXZlKTsKICAgICAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBocHNhdmUpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBocHNhdmUgPSAoSFBFTilTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yUGVuKENPTE9SX0JUTkhJR0hMSUdIVCkpOwogICAgICAgICAgICBoYnNhdmUgPSAoSEJSVVNIKVNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JCcnVzaChDT0xPUl9CVE5ISUdITElHSFQpKTsKICAgICAgICAgICAgUGllKGRjLCBteXIubGVmdCwgbXlyLnRvcCwgbXlyLnJpZ2h0KzEsIG15ci5ib3R0b20rMSwgbXlyLmxlZnQtMSwgbXlyLmJvdHRvbSwgbXlyLnJpZ2h0KzEsIG15ci50b3ApOwoKICAgICAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBHZXRTeXNDb2xvclBlbihDT0xPUl9CVE5TSEFET1cpKTsKICAgICAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBHZXRTeXNDb2xvckJydXNoKENPTE9SX0JUTlNIQURPVykpOwogICAgICAgICAgICBQaWUoZGMsIG15ci5sZWZ0LCBteXIudG9wLCBteXIucmlnaHQrMSwgbXlyLmJvdHRvbSsxLCBteXIucmlnaHQrMSwgbXlyLnRvcCwgbXlyLmxlZnQtMSwgbXlyLmJvdHRvbSk7CgogICAgICAgICAgICBteXIubGVmdCAgICs9IEJvcmRlclNocmluazsKICAgICAgICAgICAgbXlyLnJpZ2h0ICAtPSBCb3JkZXJTaHJpbms7CiAgICAgICAgICAgIG15ci50b3AgICAgKz0gQm9yZGVyU2hyaW5rOwogICAgICAgICAgICBteXIuYm90dG9tIC09IEJvcmRlclNocmluazsKCiAgICAgICAgICAgIFNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JQZW4oQ09MT1JfM0RMSUdIVCkpOwogICAgICAgICAgICBTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yQnJ1c2goQ09MT1JfM0RMSUdIVCkpOwogICAgICAgICAgICBQaWUoZGMsIG15ci5sZWZ0LCBteXIudG9wLCBteXIucmlnaHQrMSwgbXlyLmJvdHRvbSsxLCBteXIubGVmdC0xLCBteXIuYm90dG9tLCBteXIucmlnaHQrMSwgbXlyLnRvcCk7CgogICAgICAgICAgICBTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yUGVuKENPTE9SXzNEREtTSEFET1cpKTsKICAgICAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBHZXRTeXNDb2xvckJydXNoKENPTE9SXzNEREtTSEFET1cpKTsKICAgICAgICAgICAgUGllKGRjLCBteXIubGVmdCwgbXlyLnRvcCwgbXlyLnJpZ2h0KzEsIG15ci5ib3R0b20rMSwgbXlyLnJpZ2h0KzEsIG15ci50b3AsIG15ci5sZWZ0LTEsIG15ci5ib3R0b20pOwogICAgICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhic2F2ZSk7CiAgICAgICAgICAgIFNlbGVjdE9iamVjdChkYywgaHBzYXZlKTsKICAgICAgICB9CgogICAgICAgIGkgPSAxMCpTbWFsbERpYW0vMTY7CiAgICAgICAgbXlyLmxlZnQgICA9IHhjIC0gaStpLzI7CiAgICAgICAgbXlyLnJpZ2h0ICA9IHhjICsgaS8yOwogICAgICAgIG15ci50b3AgICAgPSB5YyAtIGkraS8yOwogICAgICAgIG15ci5ib3R0b20gPSB5YyArIGkvMjsKICAgICAgICBpPSAhKHVGbGFncyAmIChERkNTX0lOQUNUSVZFfERGQ1NfUFVTSEVEKSkgPyBDT0xPUl9XSU5ET1cgOiBDT0xPUl9CVE5GQUNFOwogICAgICAgIGhwc2F2ZSA9IChIUEVOKVNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JQZW4oaSkpOwogICAgICAgIGhic2F2ZSA9IChIQlJVU0gpU2VsZWN0T2JqZWN0KGRjLCBHZXRTeXNDb2xvckJydXNoKGkpKTsKICAgICAgICBFbGxpcHNlKGRjLCBteXIubGVmdCwgbXlyLnRvcCwgbXlyLnJpZ2h0LCBteXIuYm90dG9tKTsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhic2F2ZSk7CiAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBocHNhdmUpOwogICAgfQoKICAgIGlmKHVGbGFncyAmIERGQ1NfQ0hFQ0tFRCkKICAgIHsKICAgICAgICBpID0gNipTbWFsbERpYW0vMTY7CiAgICAgICAgaSA9IGkgPCAxID8gMSA6IGk7CiAgICAgICAgbXlyLmxlZnQgICA9IHhjIC0gaStpLzI7CiAgICAgICAgbXlyLnJpZ2h0ICA9IHhjICsgaS8yOwogICAgICAgIG15ci50b3AgICAgPSB5YyAtIGkraS8yOwogICAgICAgIG15ci5ib3R0b20gPSB5YyArIGkvMjsKCiAgICAgICAgaSA9IHVGbGFncyAmIERGQ1NfSU5BQ1RJVkUgPyBDT0xPUl9CVE5TSEFET1cgOiBDT0xPUl9XSU5ET1dURVhUOwogICAgICAgIGhic2F2ZSA9IChIQlJVU0gpU2VsZWN0T2JqZWN0KGRjLCBHZXRTeXNDb2xvckJydXNoKGkpKTsKICAgICAgICBocHNhdmUgPSAoSFBFTilTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yUGVuKGkpKTsKICAgICAgICBFbGxpcHNlKGRjLCBteXIubGVmdCwgbXlyLnRvcCwgbXlyLnJpZ2h0LCBteXIuYm90dG9tKTsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhwc2F2ZSk7CiAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBoYnNhdmUpOwogICAgfQoKICAgIC8qIEZJWE1FOiBNJCBoYXMgYSBwb2x5Z29uIGluIHRoZSBjZW50ZXIgYXQgcmVsYXRpdmUgcG9pbnRzOiAqLwogICAgLyogMC40NzYsIDAuNDc2ICh0aW1lcyBTbWFsbERpYW0sIFNtYWxsRGlhbSkgKi8KICAgIC8qIDAuNDc2LCAwLjUyNSAqLwogICAgLyogMC41MDAsIDAuNTAwICovCiAgICAvKiAwLjUwMCwgMC40OTkgKi8KICAgIC8qIHdoZW4gdGhlIGJ1dHRvbiBpcyB1bmNoZWNrZWQuIFRoZSByZWFzb24gZm9yIGl0IGlzIHVua25vd24uIFRoZSAqLwogICAgLyogY29sb3IgaXMgQ09MT1JfQlROSElHSExJR0hULCBhbHRob3VnaCB0aGUgcG9seWdvbiBnZXRzIHBhaW50ZWQgYXQgKi8KICAgIC8qIGxlYXN0IDMgdGltZXMgKGl0IGxvb2tzIGxpa2UgYSBjbGlwLXJlZ2lvbiB3aGVuIHlvdSBzZWUgaXQgaGFwcGVuKS4gKi8KICAgIC8qIEkgZG8gbm90IHJlYWxseSBzZWUgYSByZWFzb24gd2h5IHRoaXMgc2hvdWxkIGJlIGltcGxlbWVudGVkLiBJZiB5b3UgKi8KICAgIC8qIGhhdmUgYSBnb29kIHJlYXNvbiwgbGV0IG1lIGtub3cuIE1heWJlIHRoaXMgaXMgYSBxdWlyayBpbiB0aGUgTWFybGV0dCAqLwogICAgLyogZm9udC4gKi8KCiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBVSVRPT0xTX0RyYXdGcmFtZUJ1dHRvbgogKi8Kc3RhdGljIEJPT0wgVUlUT09MUzk1X0RyYXdGcmFtZUJ1dHRvbihIREMgaGRjLCBMUFJFQ1QgcmMsIFVJTlQgdVN0YXRlKQp7CiAgICBzd2l0Y2godVN0YXRlICYgMHhmZikKICAgIHsKICAgIGNhc2UgREZDU19CVVRUT05QVVNIOgogICAgICAgIHJldHVybiBVSVRPT0xTOTVfREZDX0J1dHRvblB1c2goaGRjLCByYywgdVN0YXRlKTsKCiAgICBjYXNlIERGQ1NfQlVUVE9OQ0hFQ0s6CiAgICBjYXNlIERGQ1NfQlVUVE9OM1NUQVRFOgogICAgICAgIHJldHVybiBVSVRPT0xTOTVfREZDX0J1dHRvbkNoZWNrKGhkYywgcmMsIHVTdGF0ZSk7CgogICAgY2FzZSBERkNTX0JVVFRPTlJBRElPSU1BR0U6CiAgICBjYXNlIERGQ1NfQlVUVE9OUkFESU9NQVNLOgogICAgY2FzZSBERkNTX0JVVFRPTlJBRElPOgogICAgICAgIHJldHVybiBVSVRPT0xTOTVfREZDX0J1dHRvblJhZGlvKGhkYywgcmMsIHVTdGF0ZSk7CgogICAgZGVmYXVsdDoKICAgICAgICBXQVJOKCJJbnZhbGlkIGJ1dHRvbiBzdGF0ZT0weCUwNHhcbiIsIHVTdGF0ZSk7CiAgICB9CgogICAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFVJVE9PTFNfRHJhd0ZyYW1lQ2FwdGlvbgogKgogKiBEcmF3IGNhcHRpb24gYnV0dG9ucyAod2luOTUpLCBjb21pbmcgZnJvbSBEcmF3RnJhbWVDb250cm9sKCkKICovCgpzdGF0aWMgQk9PTCBVSVRPT0xTOTVfRHJhd0ZyYW1lQ2FwdGlvbihIREMgZGMsIExQUkVDVCByLCBVSU5UIHVGbGFncykKewogICAgUE9JTlQgTGluZTFbMTBdOwogICAgUE9JTlQgTGluZTJbMTBdOwogICAgaW50IExpbmUxTjsKICAgIGludCBMaW5lMk47CiAgICBSRUNUIG15cjsKICAgIGludCBTbWFsbERpYW0gPSBVSVRPT0xTX01ha2VTcXVhcmVSZWN0KHIsICZteXIpLTI7CiAgICBpbnQgaTsKICAgIEhCUlVTSCBoYnNhdmU7CiAgICBIUEVOIGhwc2F2ZTsKICAgIEhGT05UIGhmc2F2ZSwgaGY7CiAgICBpbnQgeGMgPSAobXlyLmxlZnQrbXlyLnJpZ2h0KS8yOwogICAgaW50IHljID0gKG15ci50b3ArbXlyLmJvdHRvbSkvMjsKICAgIGludCBlZGdlLCBtb3ZlOwogICAgY2hhciBzdHJbMl0gPSAiPyI7CiAgICBVSU5UIGFsaWduc2F2ZTsKICAgIGludCBia3NhdmU7CiAgICBDT0xPUlJFRiBjbHJzYXZlOwogICAgU0laRSBzaXplOwoKICAgIFVJVE9PTFM5NV9ERkNfQnV0dG9uUHVzaChkYywgciwgdUZsYWdzICYgMHhmZjAwKTsKCiAgICBzd2l0Y2godUZsYWdzICYgMHhmZikKICAgIHsKICAgIGNhc2UgREZDU19DQVBUSU9OQ0xPU0U6CiAgICAgICAgZWRnZSA9IDMyOCpTbWFsbERpYW0vMTAwMDsKICAgICAgICBtb3ZlID0gOTUqU21hbGxEaWFtLzEwMDA7CiAgICAgICAgTGluZTFbMF0ueCA9IExpbmUyWzBdLnggPSBMaW5lMVsxXS54ID0gTGluZTJbMV0ueCA9IHhjIC0gZWRnZTsKICAgICAgICBMaW5lMVsyXS55ID0gTGluZTJbNV0ueSA9IExpbmUxWzFdLnkgPSBMaW5lMls0XS55ID0geWMgLSBlZGdlOwogICAgICAgIExpbmUxWzNdLnggPSBMaW5lMlszXS54ID0gTGluZTFbNF0ueCA9IExpbmUyWzRdLnggPSB4YyArIGVkZ2U7CiAgICAgICAgTGluZTFbNV0ueSA9IExpbmUyWzJdLnkgPSBMaW5lMVs0XS55ID0gTGluZTJbMV0ueSA9IHljICsgZWRnZTsKICAgICAgICBMaW5lMVsyXS54ID0gTGluZTJbMl0ueCA9IExpbmUxWzFdLnggKyBtb3ZlOwogICAgICAgIExpbmUxWzBdLnkgPSBMaW5lMlszXS55ID0gTGluZTFbMV0ueSArIG1vdmU7CiAgICAgICAgTGluZTFbNV0ueCA9IExpbmUyWzVdLnggPSBMaW5lMVs0XS54IC0gbW92ZTsKICAgICAgICBMaW5lMVszXS55ID0gTGluZTJbMF0ueSA9IExpbmUxWzRdLnkgLSBtb3ZlOwogICAgICAgIExpbmUxTiA9IDY7CiAgICAgICAgTGluZTJOID0gNjsKICAgICAgICBicmVhazsKCiAgICBjYXNlIERGQ1NfQ0FQVElPTkhFTFA6CiAgICAgICAgLyogVGhpcyBvbmUgYnJlYWtzIHRoZSBmbG93ICovCiAgICAgICAgLyogRklYTUU6IFdlIG5lZWQgdGhlIE1hcmxldHQgZm9udCBpbiBvcmRlciB0byBnZXQgdGhpcyByaWdodC4gKi8KCiAgICAgICAgaGYgPSBDcmVhdGVGb250QSgtU21hbGxEaWFtLCAwLCAwLCAwLCBGV19OT1JNQUwsIEZBTFNFLCBGQUxTRSwgRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgIEFOU0lfQ0hBUlNFVCwgT1VUX0RFRkFVTFRfUFJFQ0lTLCBDTElQX0RFRkFVTFRfUFJFQ0lTLAogICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1FVQUxJVFksIEZJWEVEX1BJVENIfEZGX0RPTlRDQVJFLCAiU3lzdGVtIik7CiAgICAgICAgYWxpZ25zYXZlID0gU2V0VGV4dEFsaWduKGRjLCBUQV9UT1B8VEFfTEVGVCk7CiAgICAgICAgYmtzYXZlID0gU2V0QmtNb2RlKGRjLCBUUkFOU1BBUkVOVCk7CiAgICAgICAgY2xyc2F2ZSA9IEdldFRleHRDb2xvcihkYyk7CiAgICAgICAgaGZzYXZlID0gKEhGT05UKVNlbGVjdE9iamVjdChkYywgaGYpOwogICAgICAgIEdldFRleHRFeHRlbnRQb2ludDMyQShkYywgc3RyLCAxLCAmc2l6ZSk7CgogICAgICAgIGlmKHVGbGFncyAmIERGQ1NfSU5BQ1RJVkUpCiAgICAgICAgewogICAgICAgICAgICBTZXRUZXh0Q29sb3IoZGMsIEdldFN5c0NvbG9yKENPTE9SX0JUTkhJR0hMSUdIVCkpOwogICAgICAgICAgICBUZXh0T3V0QShkYywgeGMtc2l6ZS5jeC8yKzEsIHljLXNpemUuY3kvMisxLCBzdHIsIDEpOwogICAgICAgIH0KICAgICAgICBTZXRUZXh0Q29sb3IoZGMsIEdldFN5c0NvbG9yKHVGbGFncyAmIERGQ1NfSU5BQ1RJVkUgPyBDT0xPUl9CVE5TSEFET1cgOiBDT0xPUl9CVE5URVhUKSk7CiAgICAgICAgVGV4dE91dEEoZGMsIHhjLXNpemUuY3gvMiwgeWMtc2l6ZS5jeS8yLCBzdHIsIDEpOwoKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhmc2F2ZSk7CiAgICAgICAgU2V0VGV4dENvbG9yKGRjLCBjbHJzYXZlKTsKICAgICAgICBTZXRCa01vZGUoZGMsIGJrc2F2ZSk7CiAgICAgICAgU2V0VGV4dEFsaWduKGRjLCBhbGlnbnNhdmUpOwogICAgICAgIERlbGV0ZU9iamVjdChoZik7CiAgICAgICAgcmV0dXJuIFRSVUU7CgogICAgY2FzZSBERkNTX0NBUFRJT05NSU46CiAgICAgICAgTGluZTFbMF0ueCA9IExpbmUxWzNdLnggPSBteXIubGVmdCAgICsgIDk2KlNtYWxsRGlhbS83NTArMjsKICAgICAgICBMaW5lMVsxXS54ID0gTGluZTFbMl0ueCA9IExpbmUxWzBdLnggKyAzNzIqU21hbGxEaWFtLzc1MDsKICAgICAgICBMaW5lMVswXS55ID0gTGluZTFbMV0ueSA9IG15ci50b3AgICAgKyA1NjMqU21hbGxEaWFtLzc1MCsxOwogICAgICAgIExpbmUxWzJdLnkgPSBMaW5lMVszXS55ID0gTGluZTFbMF0ueSArICA5MipTbWFsbERpYW0vNzUwOwogICAgICAgIExpbmUxTiA9IDQ7CiAgICAgICAgTGluZTJOID0gMDsKICAgICAgICBicmVhazsKCiAgICBjYXNlIERGQ1NfQ0FQVElPTk1BWDoKICAgICAgICBlZGdlID0gNDcqU21hbGxEaWFtLzc1MDsKICAgICAgICBMaW5lMVswXS54ID0gTGluZTFbNV0ueCA9IG15ci5sZWZ0ICsgIDU3KlNtYWxsRGlhbS83NTArMzsKICAgICAgICBMaW5lMVswXS55ID0gTGluZTFbMV0ueSA9IG15ci50b3AgICsgMTQzKlNtYWxsRGlhbS83NTArMTsKICAgICAgICBMaW5lMVsxXS54ID0gTGluZTFbMl0ueCA9IExpbmUxWzBdLnggKyA1NjIqU21hbGxEaWFtLzc1MDsKICAgICAgICBMaW5lMVs1XS55ID0gTGluZTFbNF0ueSA9IExpbmUxWzBdLnkgKyAgOTMqU21hbGxEaWFtLzc1MDsKICAgICAgICBMaW5lMVsyXS55ID0gTGluZTFbM10ueSA9IExpbmUxWzBdLnkgKyA1MTMqU21hbGxEaWFtLzc1MDsKICAgICAgICBMaW5lMVszXS54ID0gTGluZTFbNF0ueCA9IExpbmUxWzFdLnggLSAgZWRnZTsKCiAgICAgICAgTGluZTJbMF0ueCA9IExpbmUyWzVdLnggPSBMaW5lMVswXS54OwogICAgICAgIExpbmUyWzNdLnggPSBMaW5lMls0XS54ID0gTGluZTFbMV0ueDsKICAgICAgICBMaW5lMlsxXS54ID0gTGluZTJbMl0ueCA9IExpbmUxWzBdLnggKyBlZGdlOwogICAgICAgIExpbmUyWzBdLnkgPSBMaW5lMlsxXS55ID0gTGluZTFbMF0ueTsKICAgICAgICBMaW5lMls0XS55ID0gTGluZTJbNV0ueSA9IExpbmUxWzJdLnk7CiAgICAgICAgTGluZTJbMl0ueSA9IExpbmUyWzNdLnkgPSBMaW5lMVsyXS55IC0gZWRnZTsKICAgICAgICBMaW5lMU4gPSA2OwogICAgICAgIExpbmUyTiA9IDY7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBERkNTX0NBUFRJT05SRVNUT1JFOgogICAgICAgIC8qIEZJWE1FOiB0aGlzIG9uZSBsb29rcyBiYWQgYXQgc21hbGwgc2l6ZXMgPCAxNXgxNSA6KCAqLwogICAgICAgIGVkZ2UgPSA0NypTbWFsbERpYW0vNzUwOwogICAgICAgIG1vdmUgPSA0MjAqU21hbGxEaWFtLzc1MDsKICAgICAgICBMaW5lMVswXS54ID0gTGluZTFbOV0ueCA9IG15ci5sZWZ0ICsgMTk4KlNtYWxsRGlhbS83NTArMjsKICAgICAgICBMaW5lMVswXS55ID0gTGluZTFbMV0ueSA9IG15ci50b3AgICsgMTY5KlNtYWxsRGlhbS83NTArMTsKICAgICAgICBMaW5lMVs2XS55ID0gTGluZTFbN10ueSA9IExpbmUxWzBdLnkgKyA5MypTbWFsbERpYW0vNzUwOwogICAgICAgIExpbmUxWzddLnggPSBMaW5lMVs4XS54ID0gTGluZTFbMF0ueCArIGVkZ2U7CiAgICAgICAgTGluZTFbMV0ueCA9IExpbmUxWzJdLnggPSBMaW5lMVswXS54ICsgbW92ZTsKICAgICAgICBMaW5lMVs1XS54ID0gTGluZTFbNl0ueCA9IExpbmUxWzFdLnggLSBlZGdlOwogICAgICAgIExpbmUxWzldLnkgPSBMaW5lMVs4XS55ID0gTGluZTFbMF0ueSArIDE4NypTbWFsbERpYW0vNzUwOwogICAgICAgIExpbmUxWzJdLnkgPSBMaW5lMVszXS55ID0gTGluZTFbMF0ueSArIDMyNypTbWFsbERpYW0vNzUwOwogICAgICAgIExpbmUxWzRdLnkgPSBMaW5lMVs1XS55ID0gTGluZTFbMl0ueSAtIGVkZ2U7CiAgICAgICAgTGluZTFbM10ueCA9IExpbmUxWzRdLnggPSBMaW5lMVsyXS54IC0gMTQwKlNtYWxsRGlhbS83NTA7CgogICAgICAgIExpbmUyWzFdLnggPSBMaW5lMlsyXS54ID0gTGluZTFbM10ueDsKICAgICAgICBMaW5lMls3XS54ID0gTGluZTJbOF0ueCA9IExpbmUyWzFdLnggLSBlZGdlOwogICAgICAgIExpbmUyWzBdLnggPSBMaW5lMls5XS54ID0gTGluZTJbM10ueCA9IExpbmUyWzRdLnggPSBMaW5lMlsxXS54IC0gbW92ZTsKICAgICAgICBMaW5lMls1XS54ID0gTGluZTJbNl0ueCA9IExpbmUyWzBdLnggKyBlZGdlOwogICAgICAgIExpbmUyWzBdLnkgPSBMaW5lMlsxXS55ID0gTGluZTFbOV0ueTsKICAgICAgICBMaW5lMls0XS55ID0gTGluZTJbNV0ueSA9IExpbmUyWzhdLnkgPSBMaW5lMls5XS55ID0gTGluZTJbMF0ueSArIDkzKlNtYWxsRGlhbS83NTA7CiAgICAgICAgTGluZTJbMl0ueSA9IExpbmUyWzNdLnkgPSBMaW5lMlswXS55ICsgMzI3KlNtYWxsRGlhbS83NTA7CiAgICAgICAgTGluZTJbNl0ueSA9IExpbmUyWzddLnkgPSBMaW5lMlsyXS55IC0gZWRnZTsKICAgICAgICBMaW5lMU4gPSAxMDsKICAgICAgICBMaW5lMk4gPSAxMDsKICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIFdBUk4oIkludmFsaWQgY2FwdGlvbjsgZmxhZ3M9MHglMDR4XG4iLCB1RmxhZ3MpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICAvKiBIZXJlIHRoZSBkcmF3aW5nIHRha2VzIHBsYWNlICovCiAgICBpZih1RmxhZ3MgJiBERkNTX0lOQUNUSVZFKQogICAgewogICAgICAgIC8qIElmIHdlIGhhdmUgYW4gaW5hY3RpdmUgYnV0dG9uLCB0aGVuIHlvdSBzZWUgYSBzaGFkb3cgKi8KICAgICAgICBoYnNhdmUgPSAoSEJSVVNIKVNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JCcnVzaChDT0xPUl9CVE5ISUdITElHSFQpKTsKICAgICAgICBocHNhdmUgPSAoSFBFTilTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yUGVuKENPTE9SX0JUTkhJR0hMSUdIVCkpOwogICAgICAgIFBvbHlnb24oZGMsIExpbmUxLCBMaW5lMU4pOwogICAgICAgIGlmKExpbmUyTiA+IDApCiAgICAgICAgICAgIFBvbHlnb24oZGMsIExpbmUyLCBMaW5lMk4pOwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaHBzYXZlKTsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhic2F2ZSk7CiAgICB9CgogICAgLyogQ29ycmVjdCBmb3IgdGhlIHNoYWRvdyBzaGlmdCAqLwogICAgaWYgKCEodUZsYWdzICYgREZDU19QVVNIRUQpKQogICAgewogICAgICAgIGZvcihpID0gMDsgaSA8IExpbmUxTjsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgTGluZTFbaV0ueC0tOwogICAgICAgICAgICBMaW5lMVtpXS55LS07CiAgICAgICAgfQogICAgICAgIGZvcihpID0gMDsgaSA8IExpbmUyTjsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgTGluZTJbaV0ueC0tOwogICAgICAgICAgICBMaW5lMltpXS55LS07CiAgICAgICAgfQogICAgfQoKICAgIC8qIE1ha2UgdGhlIGZpbmFsIHBpY3R1cmUgKi8KICAgIGkgPSB1RmxhZ3MgJiBERkNTX0lOQUNUSVZFID8gQ09MT1JfQlROU0hBRE9XIDogQ09MT1JfQlROVEVYVDsKICAgIGhic2F2ZSA9IChIQlJVU0gpU2VsZWN0T2JqZWN0KGRjLCBHZXRTeXNDb2xvckJydXNoKGkpKTsKICAgIGhwc2F2ZSA9IChIUEVOKVNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JQZW4oaSkpOwoKICAgIFBvbHlnb24oZGMsIExpbmUxLCBMaW5lMU4pOwogICAgaWYoTGluZTJOID4gMCkKICAgICAgICBQb2x5Z29uKGRjLCBMaW5lMiwgTGluZTJOKTsKICAgIFNlbGVjdE9iamVjdChkYywgaHBzYXZlKTsKICAgIFNlbGVjdE9iamVjdChkYywgaGJzYXZlKTsKCiAgICByZXR1cm4gVFJVRTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBVSVRPT0xTX0RyYXdGcmFtZVNjcm9sbAogKgogKiBEcmF3IGEgc2Nyb2xsLWJhciBjb250cm9sIGNvbWluZyBmcm9tIERyYXdGcmFtZUNvbnRyb2woKQogKi8Kc3RhdGljIEJPT0wgVUlUT09MUzk1X0RyYXdGcmFtZVNjcm9sbChIREMgZGMsIExQUkVDVCByLCBVSU5UIHVGbGFncykKewogICAgUE9JTlQgTGluZVs0XTsKICAgIFJFQ1QgbXlyOwogICAgaW50IFNtYWxsRGlhbSA9IFVJVE9PTFNfTWFrZVNxdWFyZVJlY3QociwgJm15cikgLSAyOwogICAgaW50IGk7CiAgICBIQlJVU0ggaGJzYXZlLCBoYiwgaGIyOwogICAgSFBFTiBocHNhdmUsIGhwLCBocDI7CiAgICBpbnQgdHJpID0gMjkwKlNtYWxsRGlhbS8xMDAwIC0gMTsKICAgIGludCBkNDYsIGQ5MzsKCiAgICAvKgogICAgICogVGhpcyBmaXhlcyBhIHByb2JsZW0gd2l0aCByZWFsbHkgdGlueSAic2Nyb2xsIiBidXR0b25zLiBJbiBwYXJ0aWN1bGFyCiAgICAgKiB3aXRoIHRoZSB1cGRvd24gY29udHJvbC4gCiAgICAgKiBNYWtpbmcgc3VyZSB0aGF0IHRoZSBhcnJvdyBpcyBhcyBsZWFzdCAzIHBpeGVscyB3aWRlIChvciBoaWdoKS4KICAgICAqLwogICAgaWYgKHRyaSA9PSAwKQogICAgICB0cmkgPSAxOwoKICAgIHN3aXRjaCh1RmxhZ3MgJiAweGZmKQogICAgewogICAgY2FzZSBERkNTX1NDUk9MTENPTUJPQk9YOgogICAgY2FzZSBERkNTX1NDUk9MTERPV046CiAgICAgICAgTGluZVsyXS54ID0gbXlyLmxlZnQgKyA0NzAqU21hbGxEaWFtLzEwMDAgKyAyOwogICAgICAgIExpbmVbMl0ueSA9IG15ci50b3AgICsgNjg3KlNtYWxsRGlhbS8xMDAwICsgMTsKICAgICAgICBMaW5lWzBdLnggPSBMaW5lWzJdLnggLSB0cmk7CiAgICAgICAgTGluZVsxXS54ID0gTGluZVsyXS54ICsgdHJpOwogICAgICAgIExpbmVbMF0ueSA9IExpbmVbMV0ueSA9IExpbmVbMl0ueSAtIHRyaTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIERGQ1NfU0NST0xMVVA6CiAgICAgICAgTGluZVsyXS54ID0gbXlyLmxlZnQgKyA0NzAqU21hbGxEaWFtLzEwMDAgKyAyOwogICAgICAgIExpbmVbMl0ueSA9IG15ci5ib3R0b20gLSAoNjg3KlNtYWxsRGlhbS8xMDAwICsgMSk7CiAgICAgICAgTGluZVswXS54ID0gTGluZVsyXS54IC0gdHJpOwogICAgICAgIExpbmVbMV0ueCA9IExpbmVbMl0ueCArIHRyaTsKICAgICAgICBMaW5lWzBdLnkgPSBMaW5lWzFdLnkgPSBMaW5lWzJdLnkgKyB0cmk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBERkNTX1NDUk9MTExFRlQ6CiAgICAgICAgTGluZVsyXS54ID0gbXlyLnJpZ2h0IC0gKDY4NypTbWFsbERpYW0vMTAwMCArIDEpOwogICAgICAgIExpbmVbMl0ueSA9IG15ci50b3AgICsgNDcwKlNtYWxsRGlhbS8xMDAwICsgMjsKICAgICAgICBMaW5lWzBdLnkgPSBMaW5lWzJdLnkgLSB0cmk7CiAgICAgICAgTGluZVsxXS55ID0gTGluZVsyXS55ICsgdHJpOwogICAgICAgIExpbmVbMF0ueCA9IExpbmVbMV0ueCA9IExpbmVbMl0ueCArIHRyaTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIERGQ1NfU0NST0xMUklHSFQ6CiAgICAgICAgTGluZVsyXS54ID0gbXlyLmxlZnQgKyA2ODcqU21hbGxEaWFtLzEwMDAgKyAxOwogICAgICAgIExpbmVbMl0ueSA9IG15ci50b3AgICsgNDcwKlNtYWxsRGlhbS8xMDAwICsgMjsKICAgICAgICBMaW5lWzBdLnkgPSBMaW5lWzJdLnkgLSB0cmk7CiAgICAgICAgTGluZVsxXS55ID0gTGluZVsyXS55ICsgdHJpOwogICAgICAgIExpbmVbMF0ueCA9IExpbmVbMV0ueCA9IExpbmVbMl0ueCAtIHRyaTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIERGQ1NfU0NST0xMU0laRUdSSVA6CiAgICAgICAgLyogVGhpcyBvbmUgYnJlYWtzIHRoZSBmbG93Li4uICovCiAgICAgICAgVUlUT09MUzk1X0RyYXdSZWN0RWRnZShkYywgciwgRURHRV9CVU1QLCBCRl9NSURETEUgfCAoKHVGbGFncyYoREZDU19NT05PfERGQ1NfRkxBVCkpID8gQkZfTU9OTyA6IDApKTsKICAgICAgICBocHNhdmUgPSAoSFBFTilTZWxlY3RPYmplY3QoZGMsIEdldFN0b2NrT2JqZWN0KE5VTExfUEVOKSk7CiAgICAgICAgaGJzYXZlID0gKEhCUlVTSClTZWxlY3RPYmplY3QoZGMsIEdldFN0b2NrT2JqZWN0KE5VTExfQlJVU0gpKTsKICAgICAgICBpZih1RmxhZ3MgJiAoREZDU19NT05PfERGQ1NfRkxBVCkpCiAgICAgICAgewogICAgICAgICAgICBocCA9IGhwMiA9IEdldFN5c0NvbG9yUGVuKENPTE9SX1dJTkRPV0ZSQU1FKTsKICAgICAgICAgICAgaGIgPSBoYjIgPSBHZXRTeXNDb2xvckJydXNoKENPTE9SX1dJTkRPV0ZSQU1FKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaHAgID0gR2V0U3lzQ29sb3JQZW4oQ09MT1JfQlROSElHSExJR0hUKTsKICAgICAgICAgICAgaHAyID0gR2V0U3lzQ29sb3JQZW4oQ09MT1JfQlROU0hBRE9XKTsKICAgICAgICAgICAgaGIgID0gR2V0U3lzQ29sb3JCcnVzaChDT0xPUl9CVE5ISUdITElHSFQpOwogICAgICAgICAgICBoYjIgPSBHZXRTeXNDb2xvckJydXNoKENPTE9SX0JUTlNIQURPVyk7CiAgICAgICAgfQogICAgICAgIExpbmVbMF0ueCA9IExpbmVbMV0ueCA9IHItPnJpZ2h0LTE7CiAgICAgICAgTGluZVsyXS55ID0gTGluZVszXS55ID0gci0+Ym90dG9tLTE7CiAgICAgICAgZDQ2ID0gNDYqU21hbGxEaWFtLzc1MDsKICAgICAgICBkOTMgPSA5MypTbWFsbERpYW0vNzUwOwoKICAgICAgICBpID0gNTg2KlNtYWxsRGlhbS83NTA7CiAgICAgICAgTGluZVswXS55ID0gci0+Ym90dG9tIC0gaSAtIDE7CiAgICAgICAgTGluZVszXS54ID0gci0+cmlnaHQgLSBpIC0gMTsKICAgICAgICBMaW5lWzFdLnkgPSBMaW5lWzBdLnkgKyBkNDY7CiAgICAgICAgTGluZVsyXS54ID0gTGluZVszXS54ICsgZDQ2OwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaGIpOwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaHApOwogICAgICAgIFBvbHlnb24oZGMsIExpbmUsIDQpOwoKICAgICAgICBMaW5lWzFdLnkrKzsgTGluZVsyXS54Kys7CiAgICAgICAgTGluZVswXS55ID0gTGluZVsxXS55ICsgZDkzOwogICAgICAgIExpbmVbM10ueCA9IExpbmVbMl0ueCArIGQ5MzsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhiMik7CiAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBocDIpOwogICAgICAgIFBvbHlnb24oZGMsIExpbmUsIDQpOwoKICAgICAgICBpID0gMzk4KlNtYWxsRGlhbS83NTA7CiAgICAgICAgTGluZVswXS55ID0gci0+Ym90dG9tIC0gaSAtIDE7CiAgICAgICAgTGluZVszXS54ID0gci0+cmlnaHQgLSBpIC0gMTsKICAgICAgICBMaW5lWzFdLnkgPSBMaW5lWzBdLnkgKyBkNDY7CiAgICAgICAgTGluZVsyXS54ID0gTGluZVszXS54ICsgZDQ2OwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaGIpOwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaHApOwogICAgICAgIFBvbHlnb24oZGMsIExpbmUsIDQpOwoKICAgICAgICBMaW5lWzFdLnkrKzsgTGluZVsyXS54Kys7CiAgICAgICAgTGluZVswXS55ID0gTGluZVsxXS55ICsgZDkzOwogICAgICAgIExpbmVbM10ueCA9IExpbmVbMl0ueCArIGQ5MzsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhiMik7CiAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBocDIpOwogICAgICAgIFBvbHlnb24oZGMsIExpbmUsIDQpOwoKICAgICAgICBpID0gMjEwKlNtYWxsRGlhbS83NTA7CiAgICAgICAgTGluZVswXS55ID0gci0+Ym90dG9tIC0gaSAtIDE7CiAgICAgICAgTGluZVszXS54ID0gci0+cmlnaHQgLSBpIC0gMTsKICAgICAgICBMaW5lWzFdLnkgPSBMaW5lWzBdLnkgKyBkNDY7CiAgICAgICAgTGluZVsyXS54ID0gTGluZVszXS54ICsgZDQ2OwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaGIpOwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaHApOwogICAgICAgIFBvbHlnb24oZGMsIExpbmUsIDQpOwoKICAgICAgICBMaW5lWzFdLnkrKzsgTGluZVsyXS54Kys7CiAgICAgICAgTGluZVswXS55ID0gTGluZVsxXS55ICsgZDkzOwogICAgICAgIExpbmVbM10ueCA9IExpbmVbMl0ueCArIGQ5MzsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhiMik7CiAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBocDIpOwogICAgICAgIFBvbHlnb24oZGMsIExpbmUsIDQpOwoKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhwc2F2ZSk7CiAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBoYnNhdmUpOwogICAgICAgIHJldHVybiBUUlVFOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgV0FSTigiSW52YWxpZCBzY3JvbGw7IGZsYWdzPTB4JTA0eFxuIiwgdUZsYWdzKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgLyogSGVyZSBkbyB0aGUgcmVhbCBzY3JvbGwtYmFyIGNvbnRyb2xzIGVuZCB1cCAqLwogICAgaWYoICEgKHVGbGFncyAmICgweGZmMDAgJiB+REZDU19BREpVU1RSRUNUKSkgKQogICAgICAvKiBVSVRPT0xTOTVfREZDX0J1dHRvblB1c2ggYWx3YXlzIHVzZXMgQkZfU09GVCB3aGljaCB3ZSBkb24ndCAqLwogICAgICAvKiB3YW50IGZvciB0aGUgbm9ybWFsIHNjcm9sbC1hcnJvdyBidXR0b24uICovCiAgICAgIFVJVE9PTFM5NV9EcmF3UmVjdEVkZ2UoIGRjLCByLCBFREdFX1JBSVNFRCwgKHVGbGFncyZERkNTX0FESlVTVFJFQ1QpIHwgQkZfTUlERExFIHwgQkZfUkVDVCk7CiAgICBlbHNlCiAgICAgIFVJVE9PTFM5NV9ERkNfQnV0dG9uUHVzaChkYywgciwgKHVGbGFncyAmIDB4ZmYwMCkgKTsKCiAgICBpZih1RmxhZ3MgJiBERkNTX0lOQUNUSVZFKQogICAgewogICAgICAgIGhic2F2ZSA9IChIQlJVU0gpU2VsZWN0T2JqZWN0KGRjLCBHZXRTeXNDb2xvckJydXNoKENPTE9SX0JUTkhJR0hMSUdIVCkpOwogICAgICAgIGhwc2F2ZSA9IChIUEVOKVNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JQZW4oQ09MT1JfQlROSElHSExJR0hUKSk7CiAgICAgICAgUG9seWdvbihkYywgTGluZSwgMyk7CiAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBocHNhdmUpOwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaGJzYXZlKTsKICAgIH0KCiAgICBpZiggKHVGbGFncyAmIERGQ1NfSU5BQ1RJVkUpIHx8ICEodUZsYWdzICYgREZDU19QVVNIRUQpICkKICAgICAgZm9yKGkgPSAwOyBpIDwgMzsgaSsrKQogICAgICB7CiAgICAgICAgTGluZVtpXS54LS07CiAgICAgICAgTGluZVtpXS55LS07CiAgICAgIH0KCiAgICBpID0gdUZsYWdzICYgREZDU19JTkFDVElWRSA/IENPTE9SX0JUTlNIQURPVyA6IENPTE9SX0JUTlRFWFQ7CiAgICBoYnNhdmUgPSAoSEJSVVNIKVNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JCcnVzaChpKSk7CiAgICBocHNhdmUgPSAoSFBFTilTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yUGVuKGkpKTsKICAgIFBvbHlnb24oZGMsIExpbmUsIDMpOwogICAgU2VsZWN0T2JqZWN0KGRjLCBocHNhdmUpOwogICAgU2VsZWN0T2JqZWN0KGRjLCBoYnNhdmUpOwoKICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgVUlUT09MU19EcmF3RnJhbWVNZW51CiAqCiAqIERyYXcgYSBtZW51IGNvbnRyb2wgY29taW5nIGZyb20gRHJhd0ZyYW1lQ29udHJvbCgpCiAqLwpzdGF0aWMgQk9PTCBVSVRPT0xTOTVfRHJhd0ZyYW1lTWVudShIREMgZGMsIExQUkVDVCByLCBVSU5UIHVGbGFncykKewogICAgUE9JTlQgUG9pbnRzWzZdOwogICAgUkVDVCBteXI7CiAgICBpbnQgU21hbGxEaWFtID0gVUlUT09MU19NYWtlU3F1YXJlUmVjdChyLCAmbXlyKTsKICAgIGludCBpOwogICAgSEJSVVNIIGhic2F2ZTsKICAgIEhQRU4gaHBzYXZlOwogICAgaW50IHhlLCB5ZTsKICAgIGludCB4YywgeWM7CiAgICBCT09MIHJldHZhbCA9IFRSVUU7CgogICAgLyogVXNpbmcgYmxhY2sgYW5kIHdoaXRlIHNlZW1zIHRvIGJlIHV0dGVybHkgd3JvbmcsIGJ1dCB3aW45NSBkb2Vzbid0ICovCiAgICAvKiB1c2UgYW55dGhpbmcgZWxzZS4gSSB0aGluayBJIHRyaWVkIGFsbCBzeXMtY29sb3JzIHRvIGNoYW5nZSB0aGluZ3MgKi8KICAgIC8qIHdpdGhvdXQgbHVjay4gSXQgc2VlbXMgYXMgaWYgdGhpcyBiZWhhdmlvciBpcyBpbmhlcml0ZWQgZnJvbSB0aGUgKi8KICAgIC8qIHdpbjMxIERGQygpIGltcGxlbWVudGF0aW9uLi4uICh5b3UgcmVtZW1iZXIsIEIvVyBtZW51cykuICovCgogICAgRmlsbFJlY3QoZGMsIHIsIChIQlJVU0gpR2V0U3RvY2tPYmplY3QoV0hJVEVfQlJVU0gpKTsKCiAgICBoYnNhdmUgPSAoSEJSVVNIKVNlbGVjdE9iamVjdChkYywgR2V0U3RvY2tPYmplY3QoQkxBQ0tfQlJVU0gpKTsKICAgIGhwc2F2ZSA9IChIUEVOKVNlbGVjdE9iamVjdChkYywgR2V0U3RvY2tPYmplY3QoQkxBQ0tfUEVOKSk7CgogICAgc3dpdGNoKHVGbGFncyAmIDB4ZmYpCiAgICB7CiAgICBjYXNlIERGQ1NfTUVOVUFSUk9XOgogICAgICAgIGkgPSAxODcqU21hbGxEaWFtLzc1MDsKICAgICAgICBQb2ludHNbMl0ueCA9IG15ci5sZWZ0ICsgNDY4KlNtYWxsRGlhbS83NTA7CiAgICAgICAgUG9pbnRzWzJdLnkgPSBteXIudG9wICArIDM1MipTbWFsbERpYW0vNzUwKzE7CiAgICAgICAgUG9pbnRzWzBdLnkgPSBQb2ludHNbMl0ueSAtIGk7CiAgICAgICAgUG9pbnRzWzFdLnkgPSBQb2ludHNbMl0ueSArIGk7CiAgICAgICAgUG9pbnRzWzBdLnggPSBQb2ludHNbMV0ueCA9IFBvaW50c1syXS54IC0gaTsKICAgICAgICBQb2x5Z29uKGRjLCBQb2ludHMsIDMpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgREZDU19NRU5VQlVMTEVUOgogICAgICAgIHhlID0gbXlyLmxlZnQ7CiAgICAgICAgeWUgPSBteXIudG9wICArIFNtYWxsRGlhbSAtIFNtYWxsRGlhbS8yOwogICAgICAgIHhjID0gbXlyLmxlZnQgKyBTbWFsbERpYW0gLSBTbWFsbERpYW0vMjsKICAgICAgICB5YyA9IG15ci50b3AgICsgU21hbGxEaWFtIC0gU21hbGxEaWFtLzI7CiAgICAgICAgaSA9IDIzNCpTbWFsbERpYW0vNzUwOwogICAgICAgIGkgPSBpIDwgMSA/IDEgOiBpOwogICAgICAgIG15ci5sZWZ0ICAgPSB4YyAtIGkraS8yOwogICAgICAgIG15ci5yaWdodCAgPSB4YyArIGkvMjsKICAgICAgICBteXIudG9wICAgID0geWMgLSBpK2kvMjsKICAgICAgICBteXIuYm90dG9tID0geWMgKyBpLzI7CiAgICAgICAgUGllKGRjLCBteXIubGVmdCwgbXlyLnRvcCwgbXlyLnJpZ2h0LCBteXIuYm90dG9tLCB4ZSwgeWUsIHhlLCB5ZSk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBERkNTX01FTlVDSEVDSzoKICAgICAgICBQb2ludHNbMF0ueCA9IG15ci5sZWZ0ICsgMjUzKlNtYWxsRGlhbS8xMDAwOwogICAgICAgIFBvaW50c1swXS55ID0gbXlyLnRvcCAgKyA0NDUqU21hbGxEaWFtLzEwMDA7CiAgICAgICAgUG9pbnRzWzFdLnggPSBteXIubGVmdCArIDQwOSpTbWFsbERpYW0vMTAwMDsKICAgICAgICBQb2ludHNbMV0ueSA9IFBvaW50c1swXS55ICsgKFBvaW50c1sxXS54LVBvaW50c1swXS54KTsKICAgICAgICBQb2ludHNbMl0ueCA9IG15ci5sZWZ0ICsgNjkwKlNtYWxsRGlhbS8xMDAwOwogICAgICAgIFBvaW50c1syXS55ID0gUG9pbnRzWzFdLnkgLSAoUG9pbnRzWzJdLngtUG9pbnRzWzFdLngpOwogICAgICAgIFBvaW50c1szXS54ID0gUG9pbnRzWzJdLng7CiAgICAgICAgUG9pbnRzWzNdLnkgPSBQb2ludHNbMl0ueSArIDMqU21hbGxEaWFtLzE2OwogICAgICAgIFBvaW50c1s0XS54ID0gUG9pbnRzWzFdLng7CiAgICAgICAgUG9pbnRzWzRdLnkgPSBQb2ludHNbMV0ueSArIDMqU21hbGxEaWFtLzE2OwogICAgICAgIFBvaW50c1s1XS54ID0gUG9pbnRzWzBdLng7CiAgICAgICAgUG9pbnRzWzVdLnkgPSBQb2ludHNbMF0ueSArIDMqU21hbGxEaWFtLzE2OwogICAgICAgIFBvbHlnb24oZGMsIFBvaW50cywgNik7CiAgICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgICBXQVJOKCJJbnZhbGlkIG1lbnU7IGZsYWdzPTB4JTA0eFxuIiwgdUZsYWdzKTsKICAgICAgICByZXR2YWwgPSBGQUxTRTsKICAgICAgICBicmVhazsKICAgIH0KCiAgICBTZWxlY3RPYmplY3QoZGMsIGhwc2F2ZSk7CiAgICBTZWxlY3RPYmplY3QoZGMsIGhic2F2ZSk7CiAgICByZXR1cm4gcmV0dmFsOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgRHJhd0ZyYW1lQ29udHJvbCAgKFVTRVIuNjU2KQogKi8KQk9PTDE2IFdJTkFQSSBEcmF3RnJhbWVDb250cm9sMTYoIEhEQzE2IGhkYywgTFBSRUNUMTYgcmMsIFVJTlQxNiB1VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiB1U3RhdGUgKQp7CiAgICBSRUNUIHJlY3QzMjsKICAgIEJPT0wgcmV0OwoKICAgIENPTlZfUkVDVDE2VE8zMiggcmMsICZyZWN0MzIgKTsKICAgIHJldCA9IERyYXdGcmFtZUNvbnRyb2woIGhkYywgJnJlY3QzMiwgdVR5cGUsIHVTdGF0ZSApOwogICAgQ09OVl9SRUNUMzJUTzE2KCAmcmVjdDMyLCByYyApOwogICAgcmV0dXJuIHJldDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgIERyYXdGcmFtZUNvbnRyb2wgIChVU0VSMzIuQCkKICovCkJPT0wgV0lOQVBJIERyYXdGcmFtZUNvbnRyb2woIEhEQyBoZGMsIExQUkVDVCByYywgVUlOVCB1VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgdVN0YXRlICkKewogICAgLyogV2luOTUgZG9lc24ndCBzdXBwb3J0IGRyYXdpbmcgaW4gb3RoZXIgbWFwcGluZyBtb2RlcyAqLwogICAgaWYoR2V0TWFwTW9kZShoZGMpICE9IE1NX1RFWFQpCiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgIAogICAgc3dpdGNoKHVUeXBlKQogICAgewogICAgY2FzZSBERkNfQlVUVE9OOgogICAgICByZXR1cm4gVUlUT09MUzk1X0RyYXdGcmFtZUJ1dHRvbihoZGMsIHJjLCB1U3RhdGUpOwogICAgY2FzZSBERkNfQ0FQVElPTjoKICAgICAgcmV0dXJuIFVJVE9PTFM5NV9EcmF3RnJhbWVDYXB0aW9uKGhkYywgcmMsIHVTdGF0ZSk7CiAgICBjYXNlIERGQ19NRU5VOgogICAgICByZXR1cm4gVUlUT09MUzk1X0RyYXdGcmFtZU1lbnUoaGRjLCByYywgdVN0YXRlKTsKICAgIGNhc2UgREZDX1NDUk9MTDoKICAgICAgcmV0dXJuIFVJVE9PTFM5NV9EcmF3RnJhbWVTY3JvbGwoaGRjLCByYywgdVN0YXRlKTsKICAgIGRlZmF1bHQ6CiAgICAgIFdBUk4oIigleCwlcCwlZCwleCksIGJhZCB0eXBlIVxuIiwKCSAgIGhkYyxyYyx1VHlwZSx1U3RhdGUgKTsKICAgIH0KICAgIHJldHVybiBGQUxTRTsKfQoK