LyoKICogVGhlIHBhcmFtZXRlcnMgb2YgbWFueSBmdW5jdGlvbnMgY2hhbmdlcyBiZXR3ZWVuIGRpZmZlcmVudCBPUyB2ZXJzaW9ucwogKiAoTlQgdXNlcyBVbmljb2RlIHN0cmluZ3MsIDk1IHVzZXMgQVNDSUkgc3RyaW5ncykKICogCiAqIENvcHlyaWdodCAxOTk3IE1hcmN1cyBNZWlzc25lcgogKiAgICAgICAgICAgMTk5OCBK/HJnZW4gU2NobWllZAogKi8KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgIndpbmVycm9yLmgiCiNpbmNsdWRlICJ3aW5yZWcuaCIKI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKI2luY2x1ZGUgIndpbm5scy5oIgojaW5jbHVkZSAid2ludmVyc2lvbi5oIgojaW5jbHVkZSAiaGVhcC5oIgojaW5jbHVkZSAiY3J0ZGxsLmgiCgojaW5jbHVkZSAic2hlbGxhcGkuaCIKI2luY2x1ZGUgInNobG9iai5oIgojaW5jbHVkZSAic2hlbGwzMl9tYWluLmgiCiNpbmNsdWRlICJ3aW5lL3VuZG9jc2hlbGwuaCIKCkRFRkFVTFRfREVCVUdfQ0hBTk5FTChzaGVsbCk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQYXJzZUZpZWxkQQkJCQkJW2ludGVybmFsXQogKgogKiBjb3B5cyBhIGZpZWxkIGZyb20gYSAnLCcgZGVsaW1pdGVkIHN0cmluZwogKiAKICogZmlyc3QgZmllbGQgaXMgbkZpZWxkID0gMQogKi8KRFdPUkQgV0lOQVBJIFBhcnNlRmllbGRBKAoJTFBDU1RSIHNyYywKCURXT1JEIG5GaWVsZCwKCUxQU1RSIGRzdCwKCURXT1JEIGxlbikgCnsKCVdBUk4oIignJXMnLDB4JTA4bHgsJXAsJWxkKSBzZW1pLXN0dWIuXG4iLHNyYyxuRmllbGQsZHN0LGxlbik7CgoJaWYgKCFzcmMgfHwgIXNyY1swXSB8fCAhZHN0IHx8ICFsZW4pCgkgIHJldHVybiAwOwoKCS8qIHNraXAgbiBmaWVsZHMgZGVsaW1pdGVkIGJ5ICcsJyAqLwoJd2hpbGUgKG5GaWVsZCA+IDEpCgl7CgkgIGlmICgqc3JjPT0nXDAnKSByZXR1cm4gRkFMU0U7CgkgIGlmICgqKHNyYysrKT09JywnKSBuRmllbGQtLTsKCX0KCgkvKiBjb3B5IHBhcnQgdGlsbCB0aGUgbmV4dCAnLCcgdG8gZHN0ICovCgl3aGlsZSAoICpzcmMhPSdcMCcgJiYgKnNyYyE9JywnICYmIChsZW4tLSk+MCApICooZHN0KyspPSooc3JjKyspOwoJCgkvKiBmaW5hbGl6ZSB0aGUgc3RyaW5nICovCgkqZHN0PTB4MDsKCQoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBhcnNlRmllbGRXCQkJW2ludGVybmFsXQogKgogKiBjb3B5cyBhIGZpZWxkIGZyb20gYSAnLCcgZGVsaW1pdGVkIHN0cmluZwogKiAKICogZmlyc3QgZmllbGQgaXMgbkZpZWxkID0gMQogKi8KRFdPUkQgV0lOQVBJIFBhcnNlRmllbGRXKExQQ1dTVFIgc3JjLCBEV09SRCBuRmllbGQsIExQV1NUUiBkc3QsIERXT1JEIGxlbikgCnsKCUZJWE1FKCIoJyVzJywweCUwOGx4LCVwLCVsZCkgc3R1Yi5cbiIsCgkgIGRlYnVnc3RyX3coc3JjKSwgbkZpZWxkLCBkc3QsIGxlbik7CglyZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBhcnNlRmllbGRBVwkJCVtTSEVMTDMyLjU4XQogKi8KRFdPUkQgV0lOQVBJIFBhcnNlRmllbGRBVyhMUENWT0lEIHNyYywgRFdPUkQgbkZpZWxkLCBMUFZPSUQgZHN0LCBEV09SRCBsZW4pIAp7CglpZiAoVkVSU0lPTl9Pc0lzVW5pY29kZSgpKQoJICByZXR1cm4gUGFyc2VGaWVsZFcoc3JjLCBuRmllbGQsIGRzdCwgbGVuKTsKCXJldHVybiBQYXJzZUZpZWxkQShzcmMsIG5GaWVsZCwgZHN0LCBsZW4pOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBHZXRGaWxlTmFtZUZyb21Ccm93c2UJCQlbU0hFTEwzMi42M10KICogCiAqLwpCT09MIFdJTkFQSSBHZXRGaWxlTmFtZUZyb21Ccm93c2UoCglIV05EIGh3bmRPd25lciwKCUxQU1RSIGxwc3RyRmlsZSwKCURXT1JEIG5NYXhGaWxlLAoJTFBDU1RSIGxwc3RySW5pdGlhbERpciwKCUxQQ1NUUiBscHN0ckRlZkV4dCwKCUxQQ1NUUiBscHN0ckZpbHRlciwKCUxQQ1NUUiBscHN0clRpdGxlKQp7CglGSVhNRSgiKCUwNHgsJXMsJWxkLCVzLCVzLCVzLCVzKTpzdHViLlxuIiwKCSAgaHduZE93bmVyLCBscHN0ckZpbGUsIG5NYXhGaWxlLCBscHN0ckluaXRpYWxEaXIsIGxwc3RyRGVmRXh0LAoJICBscHN0ckZpbHRlciwgbHBzdHJUaXRsZSk7CgogICAgLyogcHV0cyB1cCBhIE9wZW4gRGlhbG9nIGFuZCByZXF1ZXN0cyBpbnB1dCBpbnRvIHRhcmdldGJ1ZiAqLwogICAgLyogT0ZOX0hJREVSRUFET05MWXxPRk5fTk9DSEFOR0VESVJ8T0ZOX0ZJTEVNVVNURVhJU1R8T0ZOX3Vua25vd24gKi8KICAgIGxzdHJjcHlBKGxwc3RyRmlsZSwieDpcXGR1bW15LmV4ZSIpOwogICAgcmV0dXJuIDE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIR2V0U2V0dGluZ3MJCQkJW1NIRUxMMzIuNjhdCiAqIAogKiBOT1RFUwogKiAgdGhlIHJlZ2lzdHJ5IHBhdGggYXJlIGZvciB3aW45OCAodGVzdGVkKQogKiAgYW5kIHBvc3NpYmx5IGFyZSB0aGUgc2FtZSBpbiBudDQwCiAqLwp2b2lkIFdJTkFQSSBTSEdldFNldHRpbmdzKExQU0hFTExGTEFHU1RBVEUgbHBzZnMsIERXT1JEIGR3TWFzaywgRFdPUkQgZHd4KQp7CglIS0VZCWhLZXk7CglEV09SRAlkd0RhdGE7CglEV09SRAlkd0RhdGFTaXplID0gc2l6ZW9mIChEV09SRCk7CgoJVFJBQ0UoIiglcCAweCUwOGx4IDB4JTA4bHgpXG4iLGxwc2ZzLGR3TWFzaywgZHd4KTsKCQoJaWYgKFJlZ0NyZWF0ZUtleUV4QShIS0VZX0NVUlJFTlRfVVNFUiwgIlNvZnR3YXJlXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxFeHBsb3JlclxcQWR2YW5jZWQiLAoJCQkJIDAsIDAsIDAsIEtFWV9BTExfQUNDRVNTLCAwLCAmaEtleSwgMCkpCgkgIHJldHVybjsKCQoJaWYgKCAoU1NGX1NIT1dFWFRFTlNJT05TICYgZHdNYXNrKSAmJiAhUmVnUXVlcnlWYWx1ZUV4QShoS2V5LCAiSGlkZUZpbGVFeHQiLCAwLCAwLCAoTFBCWVRFKSZkd0RhdGEsICZkd0RhdGFTaXplKSkKCSAgbHBzZnMtPmZTaG93RXh0ZW5zaW9ucyAgPSAoKGR3RGF0YSA9PSAwKSA/ICAwIDogMSk7CgoJaWYgKCAoU1NGX1NIT1dJTkZPVElQICYgZHdNYXNrKSAmJiAhUmVnUXVlcnlWYWx1ZUV4QShoS2V5LCAiU2hvd0luZm9UaXAiLCAwLCAwLCAoTFBCWVRFKSZkd0RhdGEsICZkd0RhdGFTaXplKSkKCSAgbHBzZnMtPmZTaG93SW5mb1RpcCAgPSAoKGR3RGF0YSA9PSAwKSA/ICAwIDogMSk7CgoJaWYgKCAoU1NGX0RPTlRQUkVUVFlQQVRIICYgZHdNYXNrKSAmJiAhUmVnUXVlcnlWYWx1ZUV4QShoS2V5LCAiRG9udFByZXR0eVBhdGgiLCAwLCAwLCAoTFBCWVRFKSZkd0RhdGEsICZkd0RhdGFTaXplKSkKCSAgbHBzZnMtPmZEb250UHJldHR5UGF0aCAgPSAoKGR3RGF0YSA9PSAwKSA/ICAwIDogMSk7CgoJaWYgKCAoU1NGX0hJREVJQ09OUyAmIGR3TWFzaykgJiYgIVJlZ1F1ZXJ5VmFsdWVFeEEoaEtleSwgIkhpZGVJY29ucyIsIDAsIDAsIChMUEJZVEUpJmR3RGF0YSwgJmR3RGF0YVNpemUpKQoJICBscHNmcy0+ZkhpZGVJY29ucyAgPSAoKGR3RGF0YSA9PSAwKSA/ICAwIDogMSk7CgoJaWYgKCAoU1NGX01BUE5FVERSVkJVVFRPTiAmIGR3TWFzaykgJiYgIVJlZ1F1ZXJ5VmFsdWVFeEEoaEtleSwgIk1hcE5ldERydkJ0biIsIDAsIDAsIChMUEJZVEUpJmR3RGF0YSwgJmR3RGF0YVNpemUpKQoJICBscHNmcy0+Zk1hcE5ldERydkJ0biAgPSAoKGR3RGF0YSA9PSAwKSA/ICAwIDogMSk7CgoJaWYgKCAoU1NGX1NIT1dBVFRSSUJDT0wgJiBkd01hc2spICYmICFSZWdRdWVyeVZhbHVlRXhBKGhLZXksICJTaG93QXR0cmliQ29sIiwgMCwgMCwgKExQQllURSkmZHdEYXRhLCAmZHdEYXRhU2l6ZSkpCgkgIGxwc2ZzLT5mU2hvd0F0dHJpYkNvbCAgPSAoKGR3RGF0YSA9PSAwKSA/ICAwIDogMSk7CgoJaWYgKCgoU1NGX1NIT1dBTExPQkpFQ1RTIHwgU1NGX1NIT1dTWVNGSUxFUykgJiBkd01hc2spICYmICFSZWdRdWVyeVZhbHVlRXhBKGhLZXksICJIaWRkZW4iLCAwLCAwLCAoTFBCWVRFKSZkd0RhdGEsICZkd0RhdGFTaXplKSkKCXsgaWYgKGR3RGF0YSA9PSAwKQoJICB7IGlmIChTU0ZfU0hPV0FMTE9CSkVDVFMgJiBkd01hc2spCWxwc2ZzLT5mU2hvd0FsbE9iamVjdHMgID0gMDsKCSAgICBpZiAoU1NGX1NIT1dTWVNGSUxFUyAmIGR3TWFzaykJbHBzZnMtPmZTaG93U3lzRmlsZXMgID0gMDsKCSAgfQoJICBlbHNlIGlmIChkd0RhdGEgPT0gMSkKCSAgeyBpZiAoU1NGX1NIT1dBTExPQkpFQ1RTICYgZHdNYXNrKQlscHNmcy0+ZlNob3dBbGxPYmplY3RzICA9IDE7CgkgICAgaWYgKFNTRl9TSE9XU1lTRklMRVMgJiBkd01hc2spCWxwc2ZzLT5mU2hvd1N5c0ZpbGVzICA9IDA7CgkgIH0KCSAgZWxzZSBpZiAoZHdEYXRhID09IDIpCgkgIHsgaWYgKFNTRl9TSE9XQUxMT0JKRUNUUyAmIGR3TWFzaykJbHBzZnMtPmZTaG93QWxsT2JqZWN0cyAgPSAwOwoJICAgIGlmIChTU0ZfU0hPV1NZU0ZJTEVTICYgZHdNYXNrKQlscHNmcy0+ZlNob3dTeXNGaWxlcyAgPSAxOwoJICB9Cgl9CglSZWdDbG9zZUtleSAoaEtleSk7CgoJVFJBQ0UoIi0tIDB4JTA0eFxuIiwgKihXT1JEKilscHNmcyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIU2hlbGxGb2xkZXJWaWV3X01lc3NhZ2UJCQlbU0hFTEwzMi43M10KICoKICogUEFSQU1FVEVSUwogKiAgaHduZENhYmluZXQgZGVmaW5lcyB0aGUgZXhwbG9yZXIgY2FiaW5ldCB3aW5kb3cgdGhhdCBjb250YWlucyB0aGUgCiAqICAgICAgICAgICAgICBzaGVsbHZpZXcgeW91IG5lZWQgdG8gY29tbXVuaWNhdGUgd2l0aAogKiAgdU1zZyAgICAgICAgaWRlbnRpZnlpbmcgdGhlIFNGVk0gZW51bSB0byBwZXJmb3JtCiAqICBsUGFyYW0KICoKICogTk9URVMKICogIE1lc3NhZ2UgU0ZWTV9SRUFSUkFOR0UgPSAxCiAqICAgIFRoaXMgbWVzc2FnZSBnZXRzIHNlbnQgd2hlbiBhIGNvbHVtbiBnZXRzIGNsaWNrZWQgdG8gaW5zdHJ1Y3QgdGhlCiAqICAgIHNoZWxsIHZpZXcgdG8gcmUtc29ydCB0aGUgaXRlbSBsaXN0LiBsUGFyYW0gaWRlbnRpZmllcyB0aGUgY29sdW1uCiAqICAgIHRoYXQgd2FzIGNsaWNrZWQuCiAqLwppbnQgV0lOQVBJIFNIU2hlbGxGb2xkZXJWaWV3X01lc3NhZ2UoCglIV05EIGh3bmRDYWJpbmV0LCAKCURXT1JEIGR3TWVzc2FnZSwKCURXT1JEIGR3UGFyYW0pCnsKCUZJWE1FKCIlMDR4ICUwOGx4ICUwOGx4IHN0dWJcbiIsaHduZENhYmluZXQsIGR3TWVzc2FnZSwgZHdQYXJhbSk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT2xlU3RyVG9TdHJOCQkJCQlbU0hFTEwzMi43OF0KICovCkJPT0wgV0lOQVBJIE9sZVN0clRvU3RyTkEgKExQU1RSIGxwU3RyLCBJTlQgblN0ciwgTFBDV1NUUiBscE9sZSwgSU5UIG5PbGUpIAp7CglUUkFDRSgiKCVwLCAleCwgJXMsICV4KVxuIiwgbHBTdHIsIG5TdHIsIGRlYnVnc3RyX3duKGxwT2xlLG5PbGUpLCBuT2xlKTsKCXJldHVybiBXaWRlQ2hhclRvTXVsdGlCeXRlICgwLCAwLCBscE9sZSwgbk9sZSwgbHBTdHIsIG5TdHIsIE5VTEwsIE5VTEwpOwp9CgpCT09MIFdJTkFQSSBPbGVTdHJUb1N0ck5XIChMUFdTVFIgbHB3U3RyLCBJTlQgbndTdHIsIExQQ1dTVFIgbHBPbGUsIElOVCBuT2xlKSAKewoJVFJBQ0UoIiglcCwgJXgsICVzLCAleClcbiIsIGxwd1N0ciwgbndTdHIsIGRlYnVnc3RyX3duKGxwT2xlLG5PbGUpLCBuT2xlKTsKCglpZiAobHN0cmNweW5XICggbHB3U3RyLCBscE9sZSwgbndTdHIpKQoJeyByZXR1cm4gbHN0cmxlblcgKGxwd1N0cik7Cgl9CglyZXR1cm4gMDsKfQoKQk9PTCBXSU5BUEkgT2xlU3RyVG9TdHJOQVcgKExQVk9JRCBscE91dCwgSU5UIG5PdXQsIExQQ1ZPSUQgbHBJbiwgSU5UIG5JbikgCnsKCWlmIChWRVJTSU9OX09zSXNVbmljb2RlKCkpCgkgIHJldHVybiBPbGVTdHJUb1N0ck5XIChscE91dCwgbk91dCwgbHBJbiwgbkluKTsKCXJldHVybiBPbGVTdHJUb1N0ck5BIChscE91dCwgbk91dCwgbHBJbiwgbkluKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU3RyVG9PbGVTdHJOCQkJCQlbU0hFTEwzMi43OV0KICogIGxwTXVsdGksIG5NdWx0aSwgbldpZGUgW0lOXQogKiAgbHBXaWRlIFtPVVRdCiAqLwpCT09MIFdJTkFQSSBTdHJUb09sZVN0ck5BIChMUFdTVFIgbHBXaWRlLCBJTlQgbldpZGUsIExQQ1NUUiBscFN0ckEsIElOVCBuU3RyKSAKewoJVFJBQ0UoIiglcCwgJXgsICVzLCAleClcbiIsIGxwV2lkZSwgbldpZGUsIGRlYnVnc3RyX2FuKGxwU3RyQSxuU3RyKSwgblN0cik7CglyZXR1cm4gTXVsdGlCeXRlVG9XaWRlQ2hhciAoMCwgMCwgbHBTdHJBLCBuU3RyLCBscFdpZGUsIG5XaWRlKTsKfQpCT09MIFdJTkFQSSBTdHJUb09sZVN0ck5XIChMUFdTVFIgbHBXaWRlLCBJTlQgbldpZGUsIExQQ1dTVFIgbHBTdHJXLCBJTlQgblN0cikgCnsKCVRSQUNFKCIoJXAsICV4LCAlcywgJXgpXG4iLCBscFdpZGUsIG5XaWRlLCBkZWJ1Z3N0cl93bihscFN0clcsIG5TdHIpLCBuU3RyKTsKCglpZiAobHN0cmNweW5XIChscFdpZGUsIGxwU3RyVywgbldpZGUpKQoJeyByZXR1cm4gbHN0cmxlblcgKGxwV2lkZSk7Cgl9CglyZXR1cm4gMDsKfQoKQk9PTCBXSU5BUEkgU3RyVG9PbGVTdHJOQVcgKExQV1NUUiBscFdpZGUsIElOVCBuV2lkZSwgTFBDVk9JRCBscFN0ciwgSU5UIG5TdHIpIAp7CglpZiAoVkVSU0lPTl9Pc0lzVW5pY29kZSgpKQoJICByZXR1cm4gU3RyVG9PbGVTdHJOVyAobHBXaWRlLCBuV2lkZSwgbHBTdHIsIG5TdHIpOwoJcmV0dXJuIFN0clRvT2xlU3RyTkEgKGxwV2lkZSwgbldpZGUsIGxwU3RyLCBuU3RyKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUmVnaXN0ZXJTaGVsbEhvb2sJCQkJW1NIRUxMMzIuMTgxXQogKgogKiBQQVJBTVMKICogICAgICBod25kIFtJXSAgd2luZG93IGhhbmRsZQogKiAgICAgIHkgICAgW0ldICBmbGFnID8/Pz8KICogCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpCT09MIFdJTkFQSSBSZWdpc3RlclNoZWxsSG9vaygKCUhXTkQgaFduZCwKCURXT1JEIGR3VHlwZSkKewoJRklYTUUoIigweCUwOHgsMHglMDhseCk6c3R1Yi5cbiIsaFduZCwgZHdUeXBlKTsKCXJldHVybiBUUlVFOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNoZWxsTWVzc2FnZUJveFcJCQkJW1NIRUxMMzIuMTgyXQogKgogKiBGb3JtYXQgYW5kIG91dHB1dCBlcnJvcm1lc3NhZ2UuCiAqCiAqIGlkVGV4dAlyZXNvdXJjZSBJRCBvZiB0aXRsZSBvciBMUFNUUgogKiBpZFRpdGxlCXJlc291cmNlIElEIG9mIHRpdGxlIG9yIExQU1RSCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwppbnQgV0lOQVBJViBTaGVsbE1lc3NhZ2VCb3hXKAoJSElOU1RBTkNFIGhJbnN0YW5jZSwKCUhXTkQgaFduZCwKCUxQQ1dTVFIgbHBUZXh0LAoJTFBDV1NUUiBscENhcHRpb24sCglVSU5UIHVUeXBlLAoJLi4uKQp7CglXQ0hBUglzelRleHRbMTAwXSxzelRpdGxlWzEwMF0sc3pUZW1wWzI1Nl07CglMUENXU1RSICAgcHN6VGV4dCA9IHN6VGV4dCwgcHN6VGl0bGUgPSBzelRpdGxlOwoJdmFfbGlzdCBhcmdzOwoJdmFfc3RhcnQoYXJncywgdVR5cGUpOwoJLyogd3ZzcHJpbnRmQShidWYsZm10LCBhcmdzKTsgKi8KCglUUkFDRSgiKCUwOGx4LCUwOGx4LCVwLCVwLCUwOHgpXG4iLAoJKERXT1JEKWhJbnN0YW5jZSwoRFdPUkQpaFduZCxscFRleHQsbHBDYXB0aW9uLHVUeXBlKTsKCglpZiAoIUhJV09SRChscENhcHRpb24pKQoJICBMb2FkU3RyaW5nVyhoSW5zdGFuY2UsIChEV09SRClscENhcHRpb24sIHN6VGl0bGUsIDEwMCk7CgllbHNlCgkgIHBzelRpdGxlID0gbHBDYXB0aW9uOwoKCWlmICghSElXT1JEKGxwVGV4dCkpCgkgIExvYWRTdHJpbmdXKGhJbnN0YW5jZSwgKERXT1JEKWxwVGV4dCwgc3pUZXh0LCAxMDApOwoJZWxzZQoJICBwc3pUZXh0ID0gbHBUZXh0OwoKCUZvcm1hdE1lc3NhZ2VXKEZPUk1BVF9NRVNTQUdFX0ZST01fU1RSSU5HIHwgRk9STUFUX01FU1NBR0VfQVJHVU1FTlRfQVJSQVksCgkJICAgICAgIHN6VGV4dCwgMCwgMCwgc3pUZW1wLCAyNTYsIChMUERXT1JEKSBhcmdzKTsKCgl2YV9lbmQoYXJncyk7CgoJcmV0dXJuIE1lc3NhZ2VCb3hXKGhXbmQsc3pUZW1wLHN6VGl0bGUsdVR5cGUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaGVsbE1lc3NhZ2VCb3hBCQkJCVtTSEVMTDMyLjE4M10KICovCmludCBXSU5BUElWIFNoZWxsTWVzc2FnZUJveEEoCglISU5TVEFOQ0UgaEluc3RhbmNlLAoJSFdORCBoV25kLAoJTFBDU1RSIGxwVGV4dCwKCUxQQ1NUUiBscENhcHRpb24sCglVSU5UIHVUeXBlLAoJLi4uKQp7CgljaGFyCXN6VGV4dFsxMDBdLHN6VGl0bGVbMTAwXSxzelRlbXBbMjU2XTsKCUxQQ1NUUiAgIHBzelRleHQgPSBzelRleHQsIHBzelRpdGxlID0gc3pUaXRsZTsKCXZhX2xpc3QgYXJnczsKCXZhX3N0YXJ0KGFyZ3MsIHVUeXBlKTsKCS8qIHd2c3ByaW50ZkEoYnVmLGZtdCwgYXJncyk7ICovCgoJVFJBQ0UoIiglMDhseCwlMDhseCwlcCwlcCwlMDh4KVxuIiwKCShEV09SRCloSW5zdGFuY2UsKERXT1JEKWhXbmQsbHBUZXh0LGxwQ2FwdGlvbix1VHlwZSk7CgoJaWYgKCFISVdPUkQobHBDYXB0aW9uKSkKCSAgTG9hZFN0cmluZ0EoaEluc3RhbmNlLCAoRFdPUkQpbHBDYXB0aW9uLCBzelRpdGxlLCAxMDApOwoJZWxzZQoJICBwc3pUaXRsZSA9IGxwQ2FwdGlvbjsKCglpZiAoIUhJV09SRChscFRleHQpKQoJICBMb2FkU3RyaW5nQShoSW5zdGFuY2UsIChEV09SRClscFRleHQsIHN6VGV4dCwgMTAwKTsKCWVsc2UKCSAgcHN6VGV4dCA9IGxwVGV4dDsKCglGb3JtYXRNZXNzYWdlQShGT1JNQVRfTUVTU0FHRV9GUk9NX1NUUklORyB8IEZPUk1BVF9NRVNTQUdFX0FSR1VNRU5UX0FSUkFZLAoJCSAgICAgICBzelRleHQsIDAsIDAsIHN6VGVtcCwgMjU2LCAoTFBEV09SRCkgYXJncyk7CgoJdmFfZW5kKGFyZ3MpOwoKCXJldHVybiBNZXNzYWdlQm94QShoV25kLHN6VGVtcCxzelRpdGxlLHVUeXBlKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hGcmVlCQkJCQlbU0hFTEwzMi4xOTVdCiAqCiAqIE5PVEVTCiAqICAgICBmcmVlX3B0cigpIC0gZnJlZXMgbWVtb3J5IHVzaW5nIElNYWxsb2MKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCiNkZWZpbmUgTUVNX0RFQlVHIDEKdm9pZCBXSU5BUEkgU0hGcmVlKExQVk9JRCB4KSAKewojaWYgTUVNX0RFQlVHCglXT1JEIGxlbiA9ICooTFBXT1JEKSgoTFBCWVRFKXgtMik7CgoJaWYgKCAqKExQV09SRCkoKExQQllURSl4K2xlbikgIT0gMHg3Mzg0KQoJICBFUlIoIk1BR0lDMiFcbiIpOwoKCWlmICggKCooTFBXT1JEKSgoTFBCWVRFKXgtNCkpICE9IDB4ODI3MSkKCSAgRVJSKCJNQUdJQzEhXG4iKTsKCWVsc2UKCSAgbWVtc2V0KChMUEJZVEUpeC00LCAweGRlLCBsZW4rNik7CgoJVFJBQ0UoIiVwIGxlbj0ldVxuIix4LCBsZW4pOwoKCXggPSAoTFBCWVRFKSB4IC0gNDsKI2Vsc2UKCVRSQUNFKCIlcFxuIix4KTsKI2VuZGlmCglIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCB4KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hBbGxvYwkJCQkJW1NIRUxMMzIuMTk2XQogKgogKiBOT1RFUwogKiAgICAgdm9pZCAqdGFza19hbGxvYyhEV09SRCBsZW4pLCB1c2VzIFNITWFsbG9jIGFsbG9jYXRvcgogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KTFBWT0lEIFdJTkFQSSBTSEFsbG9jKERXT1JEIGxlbikgCnsKCUxQQllURSByZXQ7CgojaWYgTUVNX0RFQlVHCglyZXQgPSAoTFBWT0lEKSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLGxlbis2KTsKI2Vsc2UKCXJldCA9IChMUFZPSUQpIEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsbGVuKTsKI2VuZGlmCgojaWYgTUVNX0RFQlVHCgkqKExQV09SRCkocmV0KSA9IDB4ODI3MTsKCSooTFBXT1JEKShyZXQrMikgPSAoV09SRClsZW47CgkqKExQV09SRCkocmV0KzQrbGVuKSA9IDB4NzM4NDsKCXJldCArPSA0OwoJbWVtc2V0KHJldCwgMHhkZiwgbGVuKTsKI2VuZGlmCglUUkFDRSgiJWx1IGJ5dGVzIGF0ICVwXG4iLGxlbiwgcmV0KTsKCXJldHVybiAoTFBWT0lEKXJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hSZWdpc3RlckRyYWdEcm9wCQkJCVtTSEVMTDMyLjg2XQogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KSFJFU1VMVCBXSU5BUEkgU0hSZWdpc3RlckRyYWdEcm9wKAoJSFdORCBoV25kLAoJTFBEUk9QVEFSR0VUIHBEcm9wVGFyZ2V0KQp7CglGSVhNRSgiKDB4JTA4eCwlcCk6c3R1Yi5cbiIsIGhXbmQsIHBEcm9wVGFyZ2V0KTsKCWlmIChHZXRTaGVsbE9sZSgpKSByZXR1cm4gcFJlZ2lzdGVyRHJhZ0Ryb3AoaFduZCwgcERyb3BUYXJnZXQpOwogICAgICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJldm9rZURyYWdEcm9wCQkJCVtTSEVMTDMyLjg3XQogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KSFJFU1VMVCBXSU5BUEkgU0hSZXZva2VEcmFnRHJvcChIV05EIGhXbmQpCnsKICAgIEZJWE1FKCIoMHglMDh4KTpzdHViLlxuIixoV25kKTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSERvRHJhZ0Ryb3AJCQkJCVtTSEVMTDMyLjg4XQogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KSFJFU1VMVCBXSU5BUEkgU0hEb0RyYWdEcm9wKAoJSFdORCBoV25kLAoJTFBEQVRBT0JKRUNUIGxwRGF0YU9iamVjdCwKCUxQRFJPUFNPVVJDRSBscERyb3BTb3VyY2UsCglEV09SRCBkd09LRWZmZWN0LAoJTFBEV09SRCBwZHdFZmZlY3QpCnsKICAgIEZJWE1FKCIoMHglMDR4ICVwICVwIDB4JTA4bHggJXApOnN0dWIuXG4iLAogICAgaFduZCwgbHBEYXRhT2JqZWN0LCBscERyb3BTb3VyY2UsIGR3T0tFZmZlY3QsIHBkd0VmZmVjdCk7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQXJyYW5nZVdpbmRvd3MJCQkJW1NIRUxMMzIuMTg0XQogKiAKICovCldPUkQgV0lOQVBJIEFycmFuZ2VXaW5kb3dzKAoJSFdORCBod25kUGFyZW50LAoJRFdPUkQgZHdSZXNlcnZlZCwKCUxQQ1JFQ1QgbHBSZWN0LAoJV09SRCBjS2lkcywKCUNPTlNUIEhXTkQgKiBscEtpZHMpCnsKICAgIEZJWE1FKCIoMHglMDh4IDB4JTA4bHggJXAgMHglMDR4ICVwKTpzdHViLlxuIiwKCSAgIGh3bmRQYXJlbnQsIGR3UmVzZXJ2ZWQsIGxwUmVjdCwgY0tpZHMsIGxwS2lkcyk7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU2lnbmFsRmlsZU9wZW4JCQkJW1NIRUxMMzIuMTAzXQogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KRFdPUkQgV0lOQVBJClNpZ25hbEZpbGVPcGVuIChEV09SRCBkd1BhcmFtMSkKewogICAgRklYTUUoIigweCUwOGx4KTpzdHViLlxuIiwgZHdQYXJhbTEpOwoKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEFkZFRvUmVjZW50RG9jcwkJCQlbU0hFTEwzMi4yMzRdCiAqCiAqIFBBUkFNRVRFUlMKICogICB1RmxhZ3MgIFtJTl0gU0hBUkRfUEFUSCBvciBTSEFSRF9QSURMCiAqICAgcHYgICAgICBbSU5dIHN0cmluZyBvciBwaWRsLCBOVUxMIGNsZWFycyB0aGUgbGlzdAogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgbmFtZQogKi8KRFdPUkQgV0lOQVBJIFNIQWRkVG9SZWNlbnREb2NzIChVSU5UIHVGbGFncyxMUENWT0lEIHB2KSAgIAp7IGlmIChTSEFSRF9QSURMPT11RmxhZ3MpCiAgeyBGSVhNRSgiKDB4JTA4eCxwaWRsPSVwKTpzdHViLlxuIiwgdUZsYWdzLHB2KTsKCX0KCWVsc2UKCXsgRklYTUUoIigweCUwOHgsJXMpOnN0dWIuXG4iLCB1RmxhZ3MsKGNoYXIqKXB2KTsKCX0KICByZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSENyZWF0ZVNoZWxsRm9sZGVyVmlld0V4CQkJW1NIRUxMMzIuMTc0XQogKgogKiBOT1RFUwogKiAgc2VlIElTaGVsbEZvbGRlcjo6Q3JlYXRlVmlld09iamVjdAogKi8KSFJFU1VMVCBXSU5BUEkgU0hDcmVhdGVTaGVsbEZvbGRlclZpZXdFeCgKCUxQQ1NIRUxMRk9MREVSVklFV0lORk8gcHN2Y2JpLCAvKltpbiBdIHNoZWxsdGVtcGxhdGUgc3RydWN0Ki8KCUxQU0hFTExWSUVXKiBwcHYpICAgICAgICAgICAgICAvKltvdXRdIElTaGVsbFZpZXcgcG9pbnRlciovCnsKCUlTaGVsbFZpZXcgKiBwc2Y7CglIUkVTVUxUIGhSZXM7CgkKCVRSQUNFKCJzZj0lcCBwaWRsPSVwIGNiPSVwIG1vZGU9MHglMDh4IHBhcm09MHglMDhseFxuIiwgCgkgIHBzdmNiaS0+cHNoZiwgcHN2Y2JpLT5waWRsRm9sZGVyLCBwc3ZjYmktPmxwZm5DYWxsYmFjaywKCSAgcHN2Y2JpLT51Vmlld01vZGUsIHBzdmNiaS0+ZHdVc2VyKTsKCglwc2YgPSBJU2hlbGxWaWV3X0NvbnN0cnVjdG9yKHBzdmNiaS0+cHNoZik7CgkKCWlmICghcHNmKQoJICByZXR1cm4gRV9PVVRPRk1FTU9SWTsKCglJU2hlbGxWaWV3X0FkZFJlZihwc2YpOwoJaFJlcyA9IElTaGVsbFZpZXdfUXVlcnlJbnRlcmZhY2UocHNmLCAmSUlEX0lTaGVsbFZpZXcsIChMUFZPSUQgKilwcHYpOwoJSVNoZWxsVmlld19SZWxlYXNlKHBzZik7CgoJcmV0dXJuIGhSZXM7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIFNIV2luSGVscAkJCQkJW1NIRUxMMzIuMTI3XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hXaW5IZWxwIChEV09SRCB2LCBEV09SRCB3LCBEV09SRCB4LCBEV09SRCB6KQp7CUZJWE1FKCIweCUwOGx4IDB4JTA4bHggMHglMDhseCAweCUwOGx4IHN0dWJcbiIsdix3LHgseik7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgU0hSdW5Db250cm9sUGFuZWwgW1NIRUxMMzIuMTYxXQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hSdW5Db250cm9sUGFuZWwgKERXT1JEIHgsIERXT1JEIHopCnsJRklYTUUoIjB4JTA4bHggMHglMDhseCBzdHViXG4iLHgseik7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaGVsbEV4ZWN1dGVFeAkJCQlbU0hFTEwzMi4yOTFdCiAqCiAqLwpCT09MIFdJTkFQSSBTaGVsbEV4ZWN1dGVFeEFXIChMUFZPSUQgc2VpKQp7CWlmIChWRVJTSU9OX09zSXNVbmljb2RlKCkpCgkgIHJldHVybiBTaGVsbEV4ZWN1dGVFeFcgKHNlaSk7CglyZXR1cm4gU2hlbGxFeGVjdXRlRXhBIChzZWkpOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNoZWxsRXhlY3V0ZUV4QQkJCQlbU0hFTEwzMi4yOTJdCiAqCiAqIHBsYWNlaG9sZGVyIGluIHRoZSBjb21tYW5kbGluZToKICoJJTEgZmlsZQogKgklMiBwcmludGVyCiAqCSUzIGRyaXZlcgogKgklNCBwb3J0CiAqCSVJIGFkcmVzcyBvZiBhIGdsb2JhbCBpdGVtIElEIChleHBsb3JlciBzd2l0Y2ggL2lkbGlzdCkKICoJJUwgPz8/IHBhdGgvdXJsL2N1cnJlbnQgZmlsZSA/Pz8KICoJJVMgPz8/CiAqCSUqIGFsbCBmb2xsb3dpbmcgcGFyYW1ldGVycyAoc2VlIGJhdGZpbGUpCiAqLwojaW5jbHVkZSAicHJvY2Vzcy5oIiAvKiB3ZSBjYW4gZ2V0IHJpZCBvZiBpdCBob3BlZnVsbHkgKi8KI2luY2x1ZGUgInRhc2suaCIKQk9PTCBXSU5BUEkgU2hlbGxFeGVjdXRlRXhBIChMUFNIRUxMRVhFQ1VURUlORk9BIHNlaSkKeyAJQ0hBUiBzekFwcGxpY2F0aW9uTmFtZVtNQVhfUEFUSF0sc3pDb21tYW5kbGluZVtNQVhfUEFUSF0sc3pQaWRsWzIwXTsKCUxQU1RSIHBvczsKCWludCBnYXAsIGxlbjsKCVNUQVJUVVBJTkZPQSAgc3RhcnR1cDsKCVBST0NFU1NfSU5GT1JNQVRJT04gaW5mbzsKCQkJCglXQVJOKCJtYXNrPTB4JTA4bHggaHduZD0weCUwNHggdmVyYj0lcyBmaWxlPSVzIHBhcm09JXMgZGlyPSVzIHNob3c9MHglMDh4IGNsYXNzPSVzIGluY29tcGxldGVcbiIsCgkJc2VpLT5mTWFzaywgc2VpLT5od25kLCBzZWktPmxwVmVyYiwgc2VpLT5scEZpbGUsCgkJc2VpLT5scFBhcmFtZXRlcnMsIHNlaS0+bHBEaXJlY3RvcnksIHNlaS0+blNob3csIAoJCShzZWktPmZNYXNrICYgU0VFX01BU0tfQ0xBU1NOQU1FKSA/IHNlaS0+bHBDbGFzcyA6ICJub3QgdXNlZCIpOwoKCVplcm9NZW1vcnkoc3pBcHBsaWNhdGlvbk5hbWUsTUFYX1BBVEgpOwoJaWYgKHNlaS0+bHBGaWxlKQoJICBzdHJjcHkoc3pBcHBsaWNhdGlvbk5hbWUsIHNlaS0+bHBGaWxlKTsKCQoJWmVyb01lbW9yeShzekNvbW1hbmRsaW5lLE1BWF9QQVRIKTsKCWlmIChzZWktPmxwUGFyYW1ldGVycykKCSAgc3RyY3B5KHN6Q29tbWFuZGxpbmUsIHNlaS0+bHBQYXJhbWV0ZXJzKTsKCQkJCglpZiAoc2VpLT5mTWFzayAmIChTRUVfTUFTS19DTEFTU0tFWSB8IFNFRV9NQVNLX0lOVk9LRUlETElTVCB8IFNFRV9NQVNLX0lDT04gfCBTRUVfTUFTS19IT1RLRVkgfAoJCQkgIFNFRV9NQVNLX0NPTk5FQ1RORVREUlYgfCBTRUVfTUFTS19GTEFHX0RERVdBSVQgfAoJCQkgIFNFRV9NQVNLX0RPRU5WU1VCU1QgfCBTRUVfTUFTS19GTEFHX05PX1VJIHwgU0VFX01BU0tfVU5JQ09ERSB8IAoJCQkgIFNFRV9NQVNLX05PX0NPTlNPTEUgfCBTRUVfTUFTS19BU1lOQ09LIHwgU0VFX01BU0tfSE1PTklUT1IgKSkKCXsKCSAgRklYTUUoImZsYWdzIGlnbm9yZWQ6IDB4JTA4bHhcbiIsIHNlaS0+Zk1hc2spOwoJfQoJCgkvKiBsYXVuY2ggYSBkb2N1bWVudCBieSBmaWxlY2xhc3MgbGlrZSAnV29yZHBhZC5Eb2N1bWVudC4xJyAqLwoJaWYgKHNlaS0+Zk1hc2sgJiBTRUVfTUFTS19DTEFTU05BTUUpCgl7CgkgIC8qIHRoZSBjb21tYW5kbGluZSBjb250YWlucyAnYzpcUGF0aFx3b3JkcGFkLmV4ZSAiJTEiJyAqLwoJICBIQ1JfR2V0RXhlY3V0ZUNvbW1hbmQoc2VpLT5scENsYXNzLCAoc2VpLT5scFZlcmIpID8gc2VpLT5scFZlcmIgOiAib3BlbiIsIHN6Q29tbWFuZGxpbmUsIDI1Nik7CgkgIC8qIGZpeG1lOiBnZXQgdGhlIGV4dGVuc2lvbiBvZiBscEZpbGUsIGNoZWNrIGlmIGl0IGZpdHMgdG8gdGhlIGxwQ2xhc3MgKi8KCSAgVFJBQ0UoIlNFRV9NQVNLX0NMQVNTTkFNRS0+JyVzJ1xuIiwgc3pDb21tYW5kbGluZSk7Cgl9CgoJLyogcHJvY2VzcyB0aGUgSURMaXN0ICovCglpZiAoIChzZWktPmZNYXNrICYgU0VFX01BU0tfSU5WT0tFSURMSVNUKSA9PSBTRUVfTUFTS19JTlZPS0VJRExJU1QpIC8qMHgwYyovCgl7CgkgIFNIR2V0UGF0aEZyb21JRExpc3RBIChzZWktPmxwSURMaXN0LHN6QXBwbGljYXRpb25OYW1lKTsKCSAgVFJBQ0UoIi0tIGlkbGlzdD0lcCAoJXMpXG4iLCBzZWktPmxwSURMaXN0LCBzekFwcGxpY2F0aW9uTmFtZSk7Cgl9CgllbHNlCgl7CgkgIGlmIChzZWktPmZNYXNrICYgU0VFX01BU0tfSURMSVNUICkKCSAgewoJICAgIHBvcyA9IHN0cnN0cihzekNvbW1hbmRsaW5lLCAiJUkiKTsKCSAgICBpZiAocG9zKQoJICAgIHsKCSAgICAgIExQVk9JRCBwdjsKCSAgICAgIEhHTE9CQUwgaG1lbSA9IFNIQWxsb2NTaGFyZWQgKCBzZWktPmxwSURMaXN0LCBJTEdldFNpemUoc2VpLT5scElETGlzdCksIDApOwoJICAgICAgcHYgPSBTSExvY2tTaGFyZWQoaG1lbSwwKTsKCSAgICAgIHNwcmludGYoc3pQaWRsLCI6JXAiLHB2ICk7CgkgICAgICBTSFVubG9ja1NoYXJlZChwdik7CgkgICAgCgkgICAgICBnYXAgPSBzdHJsZW4oc3pQaWRsKTsKCSAgICAgIGxlbiA9IHN0cmxlbihwb3MpLTI7CgkgICAgICBtZW1tb3ZlKHBvcytnYXAscG9zKzIsbGVuKTsKCSAgICAgIG1lbWNweShwb3Msc3pQaWRsLGdhcCk7CgoJICAgIH0KCSAgfQoJfQoKCVRSQUNFKCJleGVjdXRlOiclcycsJyVzJ1xuIixzekFwcGxpY2F0aW9uTmFtZSwgc3pDb21tYW5kbGluZSk7CgoJc3RyY2F0KHN6QXBwbGljYXRpb25OYW1lLCAiICIpOwoJc3RyY2F0KHN6QXBwbGljYXRpb25OYW1lLCBzekNvbW1hbmRsaW5lKTsKCglaZXJvTWVtb3J5KCZzdGFydHVwLHNpemVvZihTVEFSVFVQSU5GT0EpKTsKCXN0YXJ0dXAuY2IgPSBzaXplb2YoU1RBUlRVUElORk9BKTsKCglpZiAoISBDcmVhdGVQcm9jZXNzQShOVUxMLCBzekFwcGxpY2F0aW9uTmFtZSwKCQkJIE5VTEwsIE5VTEwsIEZBTFNFLCAwLCAKCQkJIE5VTEwsIE5VTEwsICZzdGFydHVwLCAmaW5mbykpCgl7CgkgIHNlaS0+aEluc3RBcHAgPSBHZXRMYXN0RXJyb3IoKTsKCSAgcmV0dXJuIEZBTFNFOwoJfQoKICAgICAgICBzZWktPmhJbnN0QXBwID0gMzM7CgkKICAgIAkvKiBHaXZlIDMwIHNlY29uZHMgdG8gdGhlIGFwcCB0byBjb21lIHVwICovCglpZiAoIFdhaXRGb3JJbnB1dElkbGUgKCBpbmZvLmhQcm9jZXNzLCAzMDAwMCApID09ICAweEZGRkZGRkZGICkKCSAgRVJSKCJXYWl0Rm9ySW5wdXRJZGxlIGZhaWxlZDogRXJyb3IgJWxkXG4iLCBHZXRMYXN0RXJyb3IoKSApOwogCglpZihzZWktPmZNYXNrICYgU0VFX01BU0tfTk9DTE9TRVBST0NFU1MpCgkgIHNlaS0+aFByb2Nlc3MgPSBpbmZvLmhQcm9jZXNzOwkgIAogICAgICAgIGVsc2UKICAgICAgICAgIENsb3NlSGFuZGxlKCBpbmZvLmhQcm9jZXNzICk7CiAgICAgICAgQ2xvc2VIYW5kbGUoIGluZm8uaFRocmVhZCApOwoJcmV0dXJuIFRSVUU7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU2hlbGxFeGVjdXRlRXhXCQkJCVtTSEVMTDMyLjI5M10KICoKICovCkJPT0wgV0lOQVBJIFNoZWxsRXhlY3V0ZUV4VyAoTFBTSEVMTEVYRUNVVEVJTkZPVyBzZWkpCnsJU0hFTExFWEVDVVRFSU5GT0Egc2VpQTsKCURXT1JEIHJldDsKCglUUkFDRSgiJXBcbiIsIHNlaSk7CgoJbWVtY3B5KCZzZWlBLCBzZWksIHNpemVvZihTSEVMTEVYRUNVVEVJTkZPQSkpOwoJCiAgICAgICAgaWYgKHNlaS0+bHBWZXJiKQoJICBzZWlBLmxwVmVyYiA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2VpLT5scFZlcmIpOwoKICAgICAgICBpZiAoc2VpLT5scEZpbGUpCgkgIHNlaUEubHBGaWxlID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzZWktPmxwRmlsZSk7CgogICAgICAgIGlmIChzZWktPmxwUGFyYW1ldGVycykKCSAgc2VpQS5scFBhcmFtZXRlcnMgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIHNlaS0+bHBQYXJhbWV0ZXJzKTsKCglpZiAoc2VpLT5scERpcmVjdG9yeSkKCSAgc2VpQS5scERpcmVjdG9yeSA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2VpLT5scERpcmVjdG9yeSk7CgogICAgICAgIGlmICgoc2VpLT5mTWFzayAmIFNFRV9NQVNLX0NMQVNTTkFNRSkgJiYgc2VpLT5scENsYXNzKQoJICBzZWlBLmxwQ2xhc3MgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIHNlaS0+bHBDbGFzcyk7CgllbHNlCgkgIHNlaUEubHBDbGFzcyA9IE5VTEw7CgkgIAkgIAoJcmV0ID0gU2hlbGxFeGVjdXRlRXhBKCZzZWlBKTsKCiAgICAgICAgaWYgKHNlaUEubHBWZXJiKQlIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKExQU1RSKSBzZWlBLmxwVmVyYiApOwoJaWYgKHNlaUEubHBGaWxlKQlIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKExQU1RSKSBzZWlBLmxwRmlsZSApOwoJaWYgKHNlaUEubHBQYXJhbWV0ZXJzKQlIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKExQU1RSKSBzZWlBLmxwUGFyYW1ldGVycyApOwoJaWYgKHNlaUEubHBEaXJlY3RvcnkpCUhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCAoTFBTVFIpIHNlaUEubHBEaXJlY3RvcnkgKTsKCWlmIChzZWlBLmxwQ2xhc3MpCUhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCAoTFBTVFIpIHNlaUEubHBDbGFzcyApOwoKIAlyZXR1cm4gcmV0Owp9CgpzdGF0aWMgTFBVTktOT1dOIFNIRUxMMzJfSUV4cGxvcmVySW50ZXJmYWNlPTA7Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIU2V0SW5zdGFuY2VFeHBsb3JlcgkJCVtTSEVMTDMyLjE3Nl0KICoKICogTk9URVMKICogIFNldHMgdGhlIGludGVyZmFjZQogKi8KSFJFU1VMVCBXSU5BUEkgU0hTZXRJbnN0YW5jZUV4cGxvcmVyIChMUFVOS05PV04gbHBVbmtub3duKQp7CVRSQUNFKCIlcFxuIiwgbHBVbmtub3duKTsKCVNIRUxMMzJfSUV4cGxvcmVySW50ZXJmYWNlID0gbHBVbmtub3duOwoJcmV0dXJuIChIUkVTVUxUKSBscFVua25vd247Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hHZXRJbnN0YW5jZUV4cGxvcmVyCQkJW1NIRUxMMzIuMjU2XQogKgogKiBOT1RFUwogKiAgZ2V0cyB0aGUgaW50ZXJmYWNlIHBvaW50ZXIgb2YgdGhlIGV4cGxvcmVyIGFuZCBhIHJlZmVyZW5jZQogKi8KSFJFU1VMVCBXSU5BUEkgU0hHZXRJbnN0YW5jZUV4cGxvcmVyIChMUFVOS05PV04gKiBscFVua25vd24pCnsJVFJBQ0UoIiVwXG4iLCBscFVua25vd24pOwoKCSpscFVua25vd24gPSBTSEVMTDMyX0lFeHBsb3JlckludGVyZmFjZTsKCglpZiAoIVNIRUxMMzJfSUV4cGxvcmVySW50ZXJmYWNlKQoJICByZXR1cm4gRV9GQUlMOwoKCUlVbmtub3duX0FkZFJlZihTSEVMTDMyX0lFeHBsb3JlckludGVyZmFjZSk7CglyZXR1cm4gTk9FUlJPUjsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEZyZWVVbnVzZWRMaWJyYXJpZXMJCQlbU0hFTEwzMi4xMjNdCiAqCiAqIE5PVEVTCiAqICBleHBvcnRlZCBieSBuYW1lCiAqLwp2b2lkIFdJTkFQSSBTSEZyZWVVbnVzZWRMaWJyYXJpZXMgKHZvaWQpCnsKCUZJWE1FKCJzdHViXG4iKTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBEQURfU2V0RHJhZ0ltYWdlCQkJCVtTSEVMTDMyLjEzNl0KICoKICogTk9URVMKICogIGV4cG9ydGVkIGJ5IG5hbWUKICovCkJPT0wgV0lOQVBJIERBRF9TZXREcmFnSW1hZ2UoCglISU1BR0VMSVNUIGhpbWxUcmFjaywKCUxQUE9JTlQgbHBwdCkKewoJRklYTUUoIiVwICVwIHN0dWJcbiIsaGltbFRyYWNrLCBscHB0KTsKICByZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBEQURfU2hvd0RyYWdJbWFnZQkJCQlbU0hFTEwzMi4xMzddCiAqCiAqIE5PVEVTCiAqICBleHBvcnRlZCBieSBuYW1lCiAqLwpCT09MIFdJTkFQSSBEQURfU2hvd0RyYWdJbWFnZShCT09MIGJTaG93KQp7CglGSVhNRSgiMHglMDh4IHN0dWJcbiIsYlNob3cpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hSZWdDbG9zZUtleQkJCVtOVDQuMDpTSEVMTDMyLjUwNV0KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIUmVnQ2xvc2VLZXkgKEhLRVkgaGtleSkKewlUUkFDRSgiMHglMDR4XG4iLGhrZXkpOwoJcmV0dXJuIFJlZ0Nsb3NlS2V5KCBoa2V5ICk7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hSZWdPcGVuS2V5QQkJCQlbU0hFTEwzMi41MDZdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSFJlZ09wZW5LZXlBKEhLRVkgaEtleSwgTFBTVFIgbHBTdWJLZXksIExQSEtFWSBwaGtSZXN1bHQpCnsKCVRSQUNFKCIoMHglMDh4LCAlcywgJXApXG4iLCBoS2V5LCBkZWJ1Z3N0cl9hKGxwU3ViS2V5KSwgcGhrUmVzdWx0KTsKCXJldHVybiBSZWdPcGVuS2V5QShoS2V5LCBscFN1YktleSwgcGhrUmVzdWx0KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hSZWdPcGVuS2V5VwkJCQlbTlQ0LjA6U0hFTEwzMi41MDddCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSFJlZ09wZW5LZXlXIChIS0VZIGhrZXksIExQQ1dTVFIgbHBzelN1YktleSwgTFBIS0VZIHJldGtleSkKewlXQVJOKCIweCUwNHggJXMgJXBcbiIsaGtleSxkZWJ1Z3N0cl93KGxwc3pTdWJLZXkpLHJldGtleSk7CglyZXR1cm4gUmVnT3BlbktleVcoIGhrZXksIGxwc3pTdWJLZXksIHJldGtleSApOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIUmVnUXVlcnlWYWx1ZUV4QQkJCQlbU0hFTEwzMi41MDldCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSFJlZ1F1ZXJ5VmFsdWVFeEEoCglIS0VZIGhrZXksCglMUFNUUiBscFZhbHVlTmFtZSwKCUxQRFdPUkQgbHBSZXNlcnZlZCwKCUxQRFdPUkQgbHBUeXBlLAoJTFBCWVRFIGxwRGF0YSwKCUxQRFdPUkQgbHBjYkRhdGEpCnsKCVRSQUNFKCIweCUwNHggJXMgJXAgJXAgJXAgJXBcbiIsIGhrZXksIGxwVmFsdWVOYW1lLCBscFJlc2VydmVkLCBscFR5cGUsIGxwRGF0YSwgbHBjYkRhdGEpOwoJcmV0dXJuIFJlZ1F1ZXJ5VmFsdWVFeEEgKGhrZXksIGxwVmFsdWVOYW1lLCBscFJlc2VydmVkLCBscFR5cGUsIGxwRGF0YSwgbHBjYkRhdGEpOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIUmVnUXVlcnlWYWx1ZVcJCQkJW05UNC4wOlNIRUxMMzIuNTEwXQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hSZWdRdWVyeVZhbHVlVyAoSEtFWSBoa2V5LCBMUFdTVFIgbHBzelN1YktleSwKCQkJCSBMUFdTVFIgbHBzekRhdGEsIExQRFdPUkQgbHBjYkRhdGEgKQp7CVdBUk4oIjB4JTA0eCAlcyAlcCAlcCBzZW1pLXN0dWJcbiIsCgkJaGtleSwgZGVidWdzdHJfdyhscHN6U3ViS2V5KSwgbHBzekRhdGEsIGxwY2JEYXRhKTsKCXJldHVybiBSZWdRdWVyeVZhbHVlVyggaGtleSwgbHBzelN1YktleSwgbHBzekRhdGEsIGxwY2JEYXRhICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIUmVnUXVlcnlWYWx1ZUV4VwkJCQlbTlQ0LjA6U0hFTEwzMi41MTFdCiAqCiAqIEZJWE1FIAogKiAgaWYgdGhlIGRhdGF0eXBlIFJFR19FWFBBTkRfU1ogdGhlbiBleHBhbmQgdGhlIHN0cmluZyBhbmQgY2hhbmdlCiAqICAqcGR3VHlwZSB0byBSRUdfU1ouIAogKi8KSFJFU1VMVCBXSU5BUEkgU0hSZWdRdWVyeVZhbHVlRXhXIChIS0VZIGhrZXksIExQV1NUUiBwc3pWYWx1ZSwgTFBEV09SRCBwZHdSZXNlcnZlZCwKCQkgTFBEV09SRCBwZHdUeXBlLCBMUFZPSUQgcHZEYXRhLCBMUERXT1JEIHBjYkRhdGEpCnsJRFdPUkQgcmV0OwoJV0FSTigiMHglMDR4ICVzICVwICVwICVwICVwIHNlbWktc3R1YlxuIiwKCQloa2V5LCBkZWJ1Z3N0cl93KHBzelZhbHVlKSwgcGR3UmVzZXJ2ZWQsIHBkd1R5cGUsIHB2RGF0YSwgcGNiRGF0YSk7CglyZXQgPSBSZWdRdWVyeVZhbHVlRXhXICggaGtleSwgcHN6VmFsdWUsIHBkd1Jlc2VydmVkLCBwZHdUeXBlLCBwdkRhdGEsIHBjYkRhdGEpOwoJcmV0dXJuIHJldDsKfQoKIC8qIFNIR2V0VmFsdWU6IEdldHMgYSB2YWx1ZSBmcm9tIHRoZSByZWdpc3RyeSAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hHZXRWYWx1ZUEKICoKICogR2V0cyBhIHZhbHVlIGZyb20gdGhlIHJlZ2lzdHJ5CiAqLwpEV09SRCBXSU5BUEkgU0hHZXRWYWx1ZUEoCiAgICBIS0VZICAgICBoa2V5LAogICAgTFBDU1RSICAgcFN1YktleSwKICAgIExQQ1NUUiAgIHBWYWx1ZSwKICAgIExQRFdPUkQgIHB3VHlwZSwKICAgIExQVk9JRCAgIHB2RGF0YSwKICAgIExQRFdPUkQgIHBiRGF0YQogICAgKQp7CiAgICBGSVhNRSgiKCVwKSxzdHViIVxuIiwgcFN1YktleSk7CgoJcmV0dXJuIEVSUk9SX1NVQ0NFU1M7ICAvKiByZXR1cm4gc3VjY2VzcyAqLwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEdldFZhbHVlVwogKgogKiBHZXRzIGEgdmFsdWUgZnJvbSB0aGUgcmVnaXN0cnkKICovCkRXT1JEIFdJTkFQSSBTSEdldFZhbHVlVygKICAgIEhLRVkgICAgIGhrZXksCiAgICBMUENXU1RSICBwU3ViS2V5LAogICAgTFBDV1NUUiAgcFZhbHVlLAogICAgTFBEV09SRCAgcHdUeXBlLAogICAgTFBWT0lEICAgcHZEYXRhLAogICAgTFBEV09SRCAgcGJEYXRhCiAgICApCnsKICAgIEZJWE1FKCIoJXApLHN0dWIhXG4iLCBwU3ViS2V5KTsKCglyZXR1cm4gRVJST1JfU1VDQ0VTUzsgIC8qIHJldHVybiBzdWNjZXNzICovCn0KCi8qIGdldHMgYSB1c2VyLXNwZWNpZmljIHJlZ2lzdHJ5IHZhbHVlLiAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hSZWdHZXRVU1ZhbHVlQQogKgogKiBHZXRzIGEgdXNlci1zcGVjaWZpYyByZWdpc3RyeSB2YWx1ZQogKi8KTE9ORyBXSU5BUEkgU0hSZWdHZXRVU1ZhbHVlQSgKICAgIExQQ1NUUiAgIHBTdWJLZXksCiAgICBMUENTVFIgICBwVmFsdWUsCiAgICBMUERXT1JEICBwd1R5cGUsCiAgICBMUFZPSUQgICBwdkRhdGEsCiAgICBMUERXT1JEICBwYkRhdGEsCiAgICBCT09MICAgICBmSWdub3JlSEtDVSwKICAgIExQVk9JRCAgIHBEZWZhdWx0RGF0YSwKICAgIERXT1JEICAgIHdEZWZhdWx0RGF0YVNpemUKICAgICkKewogICAgRklYTUUoIiglcCksc3R1YiFcbiIsIHBTdWJLZXkpOwoKCXJldHVybiBFUlJPUl9TVUNDRVNTOyAgLyogcmV0dXJuIHN1Y2Nlc3MgKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hSZWdHZXRVU1ZhbHVlVwogKgogKiBHZXRzIGEgdXNlci1zcGVjaWZpYyByZWdpc3RyeSB2YWx1ZQogKi8KTE9ORyBXSU5BUEkgU0hSZWdHZXRVU1ZhbHVlVygKICAgIExQQ1dTVFIgIHBTdWJLZXksCiAgICBMUENXU1RSICBwVmFsdWUsCiAgICBMUERXT1JEICBwd1R5cGUsCiAgICBMUFZPSUQgICBwdkRhdGEsCiAgICBMUERXT1JEICBwYkRhdGEsCiAgICBCT09MICAgICBmbGFnSWdub3JlSEtDVSwKICAgIExQVk9JRCAgIHBEZWZhdWx0RGF0YSwKICAgIERXT1JEICAgIHdEZWZhdWx0RGF0YVNpemUKICAgICkKewogICAgRklYTUUoIiglcCksc3R1YiFcbiIsIHBTdWJLZXkpOwoKCXJldHVybiBFUlJPUl9TVUNDRVNTOyAgLyogcmV0dXJuIHN1Y2Nlc3MgKi8KfQogIAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJlZ0RlbGV0ZUtleUEgYW5kIFNIRGVsZXRlS2V5QQogKi8KSFJFU1VMVCBXSU5BUEkgU0hSZWdEZWxldGVLZXlBKEhLRVkgaGtleSwgTFBDU1RSIHBzelN1YktleSkKewoJRklYTUUoImhrZXk9MHglMDh4LCAlc1xuIiwgaGtleSwgZGVidWdzdHJfYShwc3pTdWJLZXkpKTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJlZ0RlbGV0ZUtleVcgYW5kIFNIRGVsZXRlS2V5QQogKi8KSFJFU1VMVCBXSU5BUEkgU0hSZWdEZWxldGVLZXlXKEhLRVkgaGtleSwgTFBDV1NUUiBwc3pTdWJLZXkpCnsKCUZJWE1FKCJoa2V5PTB4JTA4eCwgJXNcbiIsIGhrZXksIGRlYnVnc3RyX3cocHN6U3ViS2V5KSk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBSZWFkQ2FiaW5ldFN0YXRlCQkJCVtOVCA0LjA6U0hFTEwzMi42NTFdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBSZWFkQ2FiaW5ldFN0YXRlKERXT1JEIHUsIERXT1JEIHYpCnsJRklYTUUoIjB4JTA0bHggMHglMDRseCBzdHViXG4iLHUsdik7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBXcml0ZUNhYmluZXRTdGF0ZQkJCQlbTlQgNC4wOlNIRUxMMzIuNjUyXQogKgogKi8KSFJFU1VMVCBXSU5BUEkgV3JpdGVDYWJpbmV0U3RhdGUoRFdPUkQgdSkKewlGSVhNRSgiMHglMDRseCBzdHViXG4iLHUpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRmlsZUljb25Jbml0IAkJCQlbU0hFTEwzMi42NjBdCiAqCiAqLwpCT09MIFdJTkFQSSBGaWxlSWNvbkluaXQoQk9PTCBiRnVsbEluaXQpCnsJRklYTUUoIiglcylcbiIsIGJGdWxsSW5pdCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSXNVc2VyQWRtaW4JCQkJCVtOVCA0LjA6U0hFTEwzMi42ODBdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBJc1VzZXJBZG1pbih2b2lkKQp7CUZJWE1FKCJzdHViXG4iKTsKCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTdHJSZXRUb0J1ZkEJCQkJCVtTSExXQVBJLkBdCiAqIAogKiBjb252ZXJ0cyBhIFNUUlJFVCB0byBhIG5vcm1hbCBzdHJpbmcKICoKICogTk9URVMKICogIHRoZSBwaWRsIGlzIGZvciBTVFJSRVQgT0ZGU0VUCiAqLwpIUkVTVUxUIFdJTkFQSSBTdHJSZXRUb0J1ZkEgKExQU1RSUkVUIHNyYywgTFBJVEVNSURMSVNUIHBpZGwsIExQU1RSIGRlc3QsIERXT1JEIGxlbikKewoJcmV0dXJuIFN0clJldFRvU3RyTkEoZGVzdCwgbGVuLCBzcmMsIHBpZGwpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTdHJSZXRUb0J1ZlcJCQkJCVtTSExXQVBJLkBdCiAqIAogKiBjb252ZXJ0cyBhIFNUUlJFVCB0byBhIG5vcm1hbCBzdHJpbmcKICoKICogTk9URVMKICogIHRoZSBwaWRsIGlzIGZvciBTVFJSRVQgT0ZGU0VUCiAqLwpIUkVTVUxUIFdJTkFQSSBTdHJSZXRUb0J1ZlcgKExQU1RSUkVUIHNyYywgTFBJVEVNSURMSVNUIHBpZGwsIExQV1NUUiBkZXN0LCBEV09SRCBsZW4pCnsKCXJldHVybiBTdHJSZXRUb1N0ck5XKGRlc3QsIGxlbiwgc3JjLCBwaWRsKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU3RyUmV0VG9TdHJOCQkJCQlbU0hFTEwzMi45Nl0KICogCiAqIGNvbnZlcnRzIGEgU1RSUkVUIHRvIGEgbm9ybWFsIHN0cmluZwogKgogKiBOT1RFUwogKiAgdGhlIHBpZGwgaXMgZm9yIFNUUlJFVCBPRkZTRVQKICovCkhSRVNVTFQgV0lOQVBJIFN0clJldFRvU3RyTkEgKExQVk9JRCBkZXN0LCBEV09SRCBsZW4sIExQU1RSUkVUIHNyYywgTFBJVEVNSURMSVNUIHBpZGwpCnsKCVRSQUNFKCJkZXN0PTB4JXAgbGVuPTB4JWx4IHN0cnJldD0weCVwIHBpZGw9JXAgc3R1YlxuIixkZXN0LGxlbixzcmMscGlkbCk7CgoJc3dpdGNoIChzcmMtPnVUeXBlKQoJewoJICBjYXNlIFNUUlJFVF9XU1RSOgoJICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCBzcmMtPnUucE9sZVN0ciwgLTEsIChMUFNUUilkZXN0LCBsZW4sIE5VTEwsIE5VTEwpOwoJICAgIFNIRnJlZShzcmMtPnUucE9sZVN0cik7CgkgICAgYnJlYWs7CgoJICBjYXNlIFNUUlJFVF9DU1RSQToKCSAgICBsc3RyY3B5bkEoKExQU1RSKWRlc3QsIHNyYy0+dS5jU3RyLCBsZW4pOwoJICAgIGJyZWFrOwoKCSAgY2FzZSBTVFJSRVRfT0ZGU0VUQToKCSAgICBsc3RyY3B5bkEoKExQU1RSKWRlc3QsICgoTFBDU1RSKSZwaWRsLT5ta2lkKStzcmMtPnUudU9mZnNldCwgbGVuKTsKCSAgICBicmVhazsKCgkgIGRlZmF1bHQ6CgkgICAgRklYTUUoInVua25vd24gdHlwZSFcbiIpOwoJICAgIGlmIChsZW4pCgkgICAgewoJICAgICAgKihMUFNUUilkZXN0ID0gJ1wwJzsKCSAgICB9CgkgICAgcmV0dXJuKEZBTFNFKTsKCX0KCXJldHVybiBTX09LOwp9CgpIUkVTVUxUIFdJTkFQSSBTdHJSZXRUb1N0ck5XIChMUFZPSUQgZGVzdCwgRFdPUkQgbGVuLCBMUFNUUlJFVCBzcmMsIExQSVRFTUlETElTVCBwaWRsKQp7CglUUkFDRSgiZGVzdD0weCVwIGxlbj0weCVseCBzdHJyZXQ9MHglcCBwaWRsPSVwIHN0dWJcbiIsZGVzdCxsZW4sc3JjLHBpZGwpOwoKCXN3aXRjaCAoc3JjLT51VHlwZSkKCXsKCSAgY2FzZSBTVFJSRVRfV1NUUjoKCSAgICBsc3RyY3B5blcoKExQV1NUUilkZXN0LCBzcmMtPnUucE9sZVN0ciwgbGVuKTsKCSAgICBTSEZyZWUoc3JjLT51LnBPbGVTdHIpOwoJICAgIGJyZWFrOwoKCSAgY2FzZSBTVFJSRVRfQ1NUUkE6CgkgICAgbHN0cmNweW5BdG9XKChMUFdTVFIpZGVzdCwgc3JjLT51LmNTdHIsIGxlbik7CgkgICAgYnJlYWs7CgoJICBjYXNlIFNUUlJFVF9PRkZTRVRBOgoJICAgIGlmIChwaWRsKQoJICAgIHsKCSAgICAgIGxzdHJjcHluQXRvVygoTFBXU1RSKWRlc3QsICgoTFBDU1RSKSZwaWRsLT5ta2lkKStzcmMtPnUudU9mZnNldCwgbGVuKTsKCSAgICB9CgkgICAgYnJlYWs7CgoJICBkZWZhdWx0OgoJICAgIEZJWE1FKCJ1bmtub3duIHR5cGUhXG4iKTsKCSAgICBpZiAobGVuKQoJICAgIHsgKihMUFNUUilkZXN0ID0gJ1wwJzsKCSAgICB9CgkgICAgcmV0dXJuKEZBTFNFKTsKCX0KCXJldHVybiBTX09LOwp9CkhSRVNVTFQgV0lOQVBJIFN0clJldFRvU3RyTkFXIChMUFZPSUQgZGVzdCwgRFdPUkQgbGVuLCBMUFNUUlJFVCBzcmMsIExQSVRFTUlETElTVCBwaWRsKQp7CglpZihWRVJTSU9OX09zSXNVbmljb2RlKCkpCgkgIHJldHVybiBTdHJSZXRUb1N0ck5XIChkZXN0LCBsZW4sIHNyYywgcGlkbCk7CglyZXR1cm4gU3RyUmV0VG9TdHJOQSAoZGVzdCwgbGVuLCBzcmMsIHBpZGwpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTdHJDaHJXCQkJCQlbTlQgNC4wOlNIRUxMMzIuNjUxXQogKgogKi8KTFBXU1RSIFdJTkFQSSBTdHJDaHJXIChMUFdTVFIgc3RyLCBXQ0hBUiB4ICkKewoJVFJBQ0UoIiVzIDB4JTA0eFxuIixkZWJ1Z3N0cl93KHN0cikseCk7CglyZXR1cm4gQ1JURExMX3djc2NocihzdHIsIHgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTdHJDbXBOSVcJCQkJCVtOVCA0LjA6U0hFTEwzMi4qXQogKgogKi8KSU5UIFdJTkFQSSBTdHJDbXBOSVcgKCBMUFdTVFIgd3N0cjEsIExQV1NUUiB3c3RyMiwgSU5UIGxlbikKewoJVFJBQ0UoIiVzICVzICVpIHN0dWJcbiIsIGRlYnVnc3RyX3cod3N0cjEpLGRlYnVnc3RyX3cod3N0cjIpLGxlbik7CglyZXR1cm4gQ1JURExMX193Y3NuaWNtcCh3c3RyMSwgd3N0cjIsIGxlbik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQWxsb2NTaGFyZWQJCQkJW1NIRUxMMzIuNTIwXQogKgogKiBOT1RFUwogKiAgcGFyYW1ldGVyMSBpcyByZXR1cm4gdmFsdWUgZnJvbSBIZWFwQWxsb2MKICogIHBhcmFtZXRlcjIgaXMgZXF1YWwgdG8gdGhlIHNpemUgYWxsb2NhdGVkIHdpdGggSGVhcEFsbG9jCiAqICBwYXJhbWV0ZXIzIGlzIHJldHVybiB2YWx1ZSBmcm9tIEdldEN1cnJlbnRQcm9jZXNzSWQKICoKICogIHRoZSByZXR1cm4gdmFsdWUgaXMgcG9zdGVkIGFzIGxQYXJhbSB3aXRoIDB4NDAyIChXTV9VU0VSKzIpIHRvIHNvbWV3aGVyZQogKiAgV01fVVNFUisyIGNvdWxkIGJlIHRoZSB1bmRvY3VtZW50ZWQgQ1dNX1NFVFBBVEgKICogIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGNvbnRhaW5zIGEgcGlkbAogKi8KSEdMT0JBTCBXSU5BUEkgU0hBbGxvY1NoYXJlZChMUFZPSUQgcHNyYywgRFdPUkQgc2l6ZSwgRFdPUkQgcHJvY0lEKQp7CUhHTE9CQUwgaG1lbTsKCUxQVk9JRCBwbWVtOwoJCglUUkFDRSgicHRyPSVwIHNpemU9MHglMDRseCBwcm9jSUQ9MHglMDRseFxuIixwc3JjLHNpemUscHJvY0lEKTsKCWhtZW0gPSBHbG9iYWxBbGxvYyhHTUVNX0ZJWEVELCBzaXplKTsKCWlmICghaG1lbSkKCSAgcmV0dXJuIDA7CgkKCXBtZW0gPSAgR2xvYmFsTG9jayAoaG1lbSk7CgoJaWYgKCEgcG1lbSkKCSAgcmV0dXJuIDA7CgkgIAoJbWVtY3B5IChwbWVtLCBwc3JjLCBzaXplKTsKCUdsb2JhbFVubG9jayhobWVtKTsgCglyZXR1cm4gaG1lbTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSExvY2tTaGFyZWQJCQkJCVtTSEVMTDMyLjUyMV0KICoKICogTk9URVMKICogIHBhcmFtZXRlcjEgaXMgcmV0dXJuIHZhbHVlIGZyb20gU0hBbGxvY1NoYXJlZAogKiAgcGFyYW1ldGVyMiBpcyByZXR1cm4gdmFsdWUgZnJvbSBHZXRDdXJyZW50UHJvY2Vzc0lkCiAqICB0aGUgcmVjZWl2ZXIgb2YgKFdNX1VTRVIrMikgdHJ5cyB0byBsb2NrIHRoZSBIQU5ETEUgKD8pIAogKiAgdGhlIHJldHVybnZhbHVlIHNlZW1zIHRvIGJlIGEgbWVtb3J5YWRyZXNzCiAqLwpMUFZPSUQgV0lOQVBJIFNITG9ja1NoYXJlZChIQU5ETEUgaG1lbSwgRFdPUkQgcHJvY0lEKQp7CVRSQUNFKCJoYW5kbGU9MHglMDR4IHByb2NJRD0weCUwNGx4XG4iLGhtZW0scHJvY0lEKTsKCXJldHVybiBHbG9iYWxMb2NrKGhtZW0pOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIVW5sb2NrU2hhcmVkCQkJCVtTSEVMTDMyLjUyMl0KICoKICogTk9URVMKICogIHBhcmFtZXRlcjEgaXMgcmV0dXJuIHZhbHVlIGZyb20gU0hMb2NrU2hhcmVkCiAqLwpCT09MIFdJTkFQSSBTSFVubG9ja1NoYXJlZChMUFZPSUQgcHYpCnsKCVRSQUNFKCIlcFxuIixwdik7CglyZXR1cm4gR2xvYmFsVW5sb2NrKChIQU5ETEUpcHYpOyAKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEZyZWVTaGFyZWQJCQkJCVtTSEVMTDMyLjUyM10KICoKICogTk9URVMKICogIHBhcmFtZXRlcjEgaXMgcmV0dXJuIHZhbHVlIGZyb20gU0hBbGxvY1NoYXJlZAogKiAgcGFyYW1ldGVyMiBpcyByZXR1cm4gdmFsdWUgZnJvbSBHZXRDdXJyZW50UHJvY2Vzc0lkCiAqLwpCT09MIFdJTkFQSSBTSEZyZWVTaGFyZWQoCglIQU5ETEUgaE1lbSwKCURXT1JEIHBpZCkKewoJVFJBQ0UoImhhbmRsZT0weCUwNHggMHglMDRseFxuIixoTWVtLHBpZCk7CglyZXR1cm4gR2xvYmFsRnJlZShoTWVtKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU2V0QXBwU3RhcnRpbmdDdXJzb3IJCQkJW1NIRUxMMzIuOTldCiAqLwpIUkVTVUxUIFdJTkFQSSBTZXRBcHBTdGFydGluZ0N1cnNvcihIV05EIHUsIERXT1JEIHYpCnsJRklYTUUoImh3bmQ9MHglMDR4IDB4JTA0bHggc3R1YlxuIix1LHYgKTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNITG9hZE9MRQkJCQkJW1NIRUxMMzIuMTUxXQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hMb2FkT0xFKERXT1JEIHUpCnsJRklYTUUoIjB4JTA0bHggc3R1YlxuIix1KTsKCXJldHVybiBTX09LOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIERyaXZlVHlwZQkJCQkJW1NIRUxMMzIuNjRdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBEcml2ZVR5cGUoRFdPUkQgdSkKewlGSVhNRSgiMHglMDRseCBzdHViXG4iLHUpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hBYm9ydEludm9rZUNvbW1hbmQJCQkJW1NIRUxMMzIuMTk4XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hBYm9ydEludm9rZUNvbW1hbmQodm9pZCkKewlGSVhNRSgic3R1YlxuIik7CglyZXR1cm4gMTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSE91dE9mTWVtb3J5TWVzc2FnZUJveAkJCVtTSEVMTDMyLjEyNl0KICoKICovCmludCBXSU5BUEkgU0hPdXRPZk1lbW9yeU1lc3NhZ2VCb3goCglIV05EIGh3bmRPd25lciwKCUxQQ1NUUiBscENhcHRpb24sCglVSU5UIHVUeXBlKQp7CglGSVhNRSgiMHglMDR4ICVzIDB4JTA4eCBzdHViXG4iLGh3bmRPd25lciwgbHBDYXB0aW9uLCB1VHlwZSk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEZsdXNoQ2xpcGJvYXJkCQkJCVtTSEVMTDMyLjEyMV0KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIRmx1c2hDbGlwYm9hcmQodm9pZCkKewlGSVhNRSgic3R1YlxuIik7CglyZXR1cm4gMTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU3RyRm9ybWF0Qnl0ZVNpemVBCQkJCVtTSExXQVBJXQogKi8KTFBTVFIgV0lOQVBJIFN0ckZvcm1hdEJ5dGVTaXplQSAoIERXT1JEIGR3LCBMUFNUUiBwc3pCdWYsIFVJTlQgY2NoQnVmICkKewljaGFyIGJ1Zls2NF07CglUUkFDRSgiJWx4ICVwICVpXG4iLCBkdywgcHN6QnVmLCBjY2hCdWYpOwoJaWYgKCBkdzwxMDI0TCApCgl7IHNwcmludGYgKGJ1ZiwiJTMuMWYgYnl0ZXMiLCAoRkxPQVQpZHcpOwoJfQoJZWxzZSBpZiAoIGR3PDEwNDg1NzZMKQoJeyBzcHJpbnRmIChidWYsIiUzLjFmIEtCIiwgKEZMT0FUKWR3LzEwMjQpOwoJfQoJZWxzZSBpZiAoIGR3IDwgMTA3Mzc0MTgyNEwpCgl7IHNwcmludGYgKGJ1ZiwiJTMuMWYgTUIiLCAoRkxPQVQpZHcvMTA0ODU3NkwpOwoJfQoJZWxzZQoJeyBzcHJpbnRmIChidWYsIiUzLjFmIEdCIiwgKEZMT0FUKWR3LzEwNzM3NDE4MjRMKTsKCX0KCWxzdHJjcHluQSAocHN6QnVmLCBidWYsIGNjaEJ1Zik7CglyZXR1cm4gcHN6QnVmOwkKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU3RyRm9ybWF0Qnl0ZVNpemVXCQkJCVtTSExXQVBJXQogKi8KTFBXU1RSIFdJTkFQSSBTdHJGb3JtYXRCeXRlU2l6ZVcgKCBEV09SRCBkdywgTFBXU1RSIHBzekJ1ZiwgVUlOVCBjY2hCdWYgKQp7CWNoYXIgYnVmWzY0XTsKCVRSQUNFKCIlbHggJXAgJWlcbiIsIGR3LCBwc3pCdWYsIGNjaEJ1Zik7CglpZiAoIGR3PDEwMjRMICkKCXsgc3ByaW50ZiAoYnVmLCIlMy4xZiBieXRlcyIsIChGTE9BVClkdyk7Cgl9CgllbHNlIGlmICggZHc8MTA0ODU3NkwpCgl7IHNwcmludGYgKGJ1ZiwiJTMuMWYgS0IiLCAoRkxPQVQpZHcvMTAyNCk7Cgl9CgllbHNlIGlmICggZHcgPCAxMDczNzQxODI0TCkKCXsgc3ByaW50ZiAoYnVmLCIlMy4xZiBNQiIsIChGTE9BVClkdy8xMDQ4NTc2TCk7Cgl9CgllbHNlCgl7IHNwcmludGYgKGJ1ZiwiJTMuMWYgR0IiLCAoRkxPQVQpZHcvMTA3Mzc0MTgyNEwpOwoJfQoJbHN0cmNweW5BdG9XIChwc3pCdWYsIGJ1ZiwgY2NoQnVmKTsKCXJldHVybiBwc3pCdWY7CQp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIV2FpdEZvckZpbGVUb09wZW4JCQkJW1NIRUxMMzIuOTddCiAqCiAqLwpCT09MIFdJTkFQSSBTSFdhaXRGb3JGaWxlVG9PcGVuKAoJTFBDSVRFTUlETElTVCBwaWRsLCAKCURXT1JEIGR3RmxhZ3MsCglEV09SRCBkd1RpbWVvdXQpCnsKCUZJWE1FKCIlcCAweCUwOGx4IDB4JTA4bHggc3R1YlxuIiwgcGlkbCwgZHdGbGFncywgZHdUaW1lb3V0KTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENvbnRyb2xfRmlsbENhY2hlX1J1bkRMTAkJCVtTSEVMTDMyLjhdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBDb250cm9sX0ZpbGxDYWNoZV9SdW5ETEwoSFdORCBoV25kLCBIQU5ETEUgaE1vZHVsZSwgRFdPUkQgdywgRFdPUkQgeCkKewlGSVhNRSgiMHglMDR4IDB4JTA0eCAweCUwNGx4IDB4JTA0bHggc3R1YlxuIixoV25kLCBoTW9kdWxlLHcseCk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBSdW5ETExfQ2FsbEVudHJ5MTYJCQkJW1NIRUxMMzIuMTIyXQogKiB0aGUgbmFtZSBpcyBwcm9wYWJseSB3cm9uZwogKi8KSFJFU1VMVCBXSU5BUEkgUnVuRExMX0NhbGxFbnRyeTE2KERXT1JEIHYsIERXT1JEIHcsIERXT1JEIHgsIERXT1JEIHksIERXT1JEIHopCnsJRklYTUUoIjB4JTA0bHggMHglMDRseCAweCUwNGx4IDB4JTA0bHggMHglMDRseCBzdHViXG4iLHYsdyx4LHkseik7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglzaGVsbDMyXzY1NAkJCQlbU0hFTEwzMi42NTRdCiAqCiAqIE5PVEVTOiBmaXJzdCBwYXJhbWV0ZXIgc2VlbXMgdG8gYmUgYSBwb2ludGVyIChzYW1lIGFzIHBhc3NlZCB0byBXcml0ZUNhYmluZXRTdGF0ZSkKICogc2Vjb25kIG9uZSBjb3VsZCBiZSBhIHNpemUgKDB4MGMpLiBUaGUgc2l6ZSBpcyB0aGUgc2FtZSBhcyB0aGUgc3RydWN0dXJlIHNhdmVkIHRvCiAqIEhDVVxTb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93c1xDdXJyZW50VmVyc2lvblxFeHBsb3JlclxDYWJpbmV0U3RhdGUKICogSSdtIChqcykgZ3Vlc3Npbmc6IHRoaXMgb25lIGlzIGp1c3QgUmVhZENhYmluZXRTdGF0ZSA7LSkKICovCkhSRVNVTFQgV0lOQVBJIHNoZWxsMzJfNjU0IChEV09SRCB4LCBEV09SRCB5KQp7CUZJWE1FKCIweCUwOGx4IDB4JTA4bHggc3R1YlxuIix4LHkpOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJUkxCdWlsZExpc3RPZlBhdGhzCQkJW1NIRUxMMzIuMTQ2XQogKgogKiBOT1RFUwogKiAgIGJ1aWxkcyBhIERQQQogKi8KRFdPUkQgV0lOQVBJIFJMQnVpbGRMaXN0T2ZQYXRocyAodm9pZCkKewlGSVhNRSgic3R1YlxuIik7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVN0clRvT2xlU3RyCQkJW1NIRUxMMzIuMTYzXQogKgogKi8KaW50IFdJTkFQSSBTdHJUb09sZVN0ckEgKExQV1NUUiBscFdpZGVDaGFyU3RyLCBMUENTVFIgbHBNdWx0aUJ5dGVTdHJpbmcpCnsKCVRSQUNFKCIoJXAsICVwICVzKVxuIiwKCWxwV2lkZUNoYXJTdHIsIGxwTXVsdGlCeXRlU3RyaW5nLCBkZWJ1Z3N0cl9hKGxwTXVsdGlCeXRlU3RyaW5nKSk7CgoJcmV0dXJuIE11bHRpQnl0ZVRvV2lkZUNoYXIoMCwgMCwgbHBNdWx0aUJ5dGVTdHJpbmcsIC0xLCBscFdpZGVDaGFyU3RyLCBNQVhfUEFUSCk7Cgp9CmludCBXSU5BUEkgU3RyVG9PbGVTdHJXIChMUFdTVFIgbHBXaWRlQ2hhclN0ciwgTFBDV1NUUiBscFdTdHJpbmcpCnsKCVRSQUNFKCIoJXAsICVwICVzKVxuIiwKCWxwV2lkZUNoYXJTdHIsIGxwV1N0cmluZywgZGVidWdzdHJfdyhscFdTdHJpbmcpKTsKCglpZiAobHN0cmNweVcgKGxwV2lkZUNoYXJTdHIsIGxwV1N0cmluZyApKQoJeyByZXR1cm4gbHN0cmxlblcgKGxwV2lkZUNoYXJTdHIpOwoJfQoJcmV0dXJuIDA7Cn0KCkJPT0wgV0lOQVBJIFN0clRvT2xlU3RyQVcgKExQV1NUUiBscFdpZGVDaGFyU3RyLCBMUENWT0lEIGxwU3RyaW5nKQp7CglpZiAoVkVSU0lPTl9Pc0lzVW5pY29kZSgpKQoJICByZXR1cm4gU3RyVG9PbGVTdHJXIChscFdpZGVDaGFyU3RyLCBscFN0cmluZyk7CglyZXR1cm4gU3RyVG9PbGVTdHJBIChscFdpZGVDaGFyU3RyLCBscFN0cmluZyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU0hWYWxpZGF0ZVVOQwkJCQlbU0hFTEwzMi4xNzNdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSFZhbGlkYXRlVU5DIChEV09SRCB4LCBEV09SRCB5LCBEV09SRCB6KQp7CglGSVhNRSgiMHglMDhseCAweCUwOGx4IDB4JTA4bHggc3R1YlxuIix4LHkseik7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglEb0Vudmlyb25tZW50U3Vic3RBCQkJW1NIRUxMMzIuMTIyMl0KICoKICovCkhSRVNVTFQgV0lOQVBJIERvRW52aXJvbm1lbnRTdWJzdEEoTFBTVFIgeCwgTFBTVFIgeSkKewoJRklYTUUoIiglcywgJXMpIHN0dWJcbiIsIGRlYnVnc3RyX2EoeCksIGRlYnVnc3RyX2EoeSkpOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJRG9FbnZpcm9ubWVudFN1YnN0VwkJCVtTSEVMTDMyLjEyMjNdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBEb0Vudmlyb25tZW50U3Vic3RXKExQV1NUUiB4LCBMUFdTVFIgeSkKewoJRklYTUUoIiglcywgJXMpOiBzdHViXG4iLCBkZWJ1Z3N0cl93KHgpLCBkZWJ1Z3N0cl93KHkpKTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCURvRW52aXJvbm1lbnRTdWJzdAkJCVtTSEVMTDMyLjUzXQogKgogKi8KSFJFU1VMVCBXSU5BUEkgRG9FbnZpcm9ubWVudFN1YnN0QVcoTFBWT0lEIHgsIExQVk9JRCB5KQp7CglpZiAoVkVSU0lPTl9Pc0lzVW5pY29kZSgpKQoJICByZXR1cm4gRG9FbnZpcm9ubWVudFN1YnN0Vyh4LCB5KTsKCXJldHVybiBEb0Vudmlyb25tZW50U3Vic3RBKHgsIHkpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIHNoZWxsMzJfMjQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0hFTEwzMi4yNDNdCiAqIAogKiBXaW45OCsgYnktb3JkaW5hbCByb3V0aW5lLiAgSW4gV2luOTggdGhpcyByb3V0aW5lIHJldHVybnMgemVybyBhbmQKICogZG9lcyBub3RoaW5nIGVsc2UuICBQb3NzaWJseSB0aGlzIGRvZXMgc29tZXRoaW5nIGluIE5UIG9yIFNIRUxMMzIgNS4wPwogKgogKi8KCkJPT0wgV0lOQVBJIHNoZWxsMzJfMjQzKERXT1JEIGEsIERXT1JEIGIpIAp7IAogIHJldHVybiBGQUxTRTsgCn0KCg==