LyoKICogVGhlIHBhcmFtZXRlcnMgb2YgbWFueSBmdW5jdGlvbnMgY2hhbmdlcyBiZXR3ZWVuIGRpZmZlcmVudCBPUyB2ZXJzaW9ucwogKiAoTlQgdXNlcyBVbmljb2RlIHN0cmluZ3MsIDk1IHVzZXMgQVNDSUkgc3RyaW5ncykKICogCiAqIENvcHlyaWdodCAxOTk3IE1hcmN1cyBNZWlzc25lcgogKiAgICAgICAgICAgMTk5OCBK/HJnZW4gU2NobWllZAogKi8KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgIndpbmVycm9yLmgiCiNpbmNsdWRlICJ3aW5yZWcuaCIKI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKI2luY2x1ZGUgIndpbm5scy5oIgojaW5jbHVkZSAid2ludmVyc2lvbi5oIgojaW5jbHVkZSAiaGVhcC5oIgoKI2luY2x1ZGUgInNoZWxsYXBpLmgiCiNpbmNsdWRlICJzaGxvYmouaCIKI2luY2x1ZGUgInNoZWxsMzJfbWFpbi5oIgojaW5jbHVkZSAid2luZS91bmRvY3NoZWxsLmgiCgpERUZBVUxUX0RFQlVHX0NIQU5ORUwoc2hlbGwpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGFyc2VGaWVsZEEJCQkJCVtpbnRlcm5hbF0KICoKICogY29weXMgYSBmaWVsZCBmcm9tIGEgJywnIGRlbGltaXRlZCBzdHJpbmcKICogCiAqIGZpcnN0IGZpZWxkIGlzIG5GaWVsZCA9IDEKICovCkRXT1JEIFdJTkFQSSBQYXJzZUZpZWxkQSgKCUxQQ1NUUiBzcmMsCglEV09SRCBuRmllbGQsCglMUFNUUiBkc3QsCglEV09SRCBsZW4pIAp7CglXQVJOKCIoJyVzJywweCUwOGx4LCVwLCVsZCkgc2VtaS1zdHViLlxuIixzcmMsbkZpZWxkLGRzdCxsZW4pOwoKCWlmICghc3JjIHx8ICFzcmNbMF0gfHwgIWRzdCB8fCAhbGVuKQoJICByZXR1cm4gMDsKCgkvKiBza2lwIG4gZmllbGRzIGRlbGltaXRlZCBieSAnLCcgKi8KCXdoaWxlIChuRmllbGQgPiAxKQoJewoJICBpZiAoKnNyYz09J1wwJykgcmV0dXJuIEZBTFNFOwoJICBpZiAoKihzcmMrKyk9PScsJykgbkZpZWxkLS07Cgl9CgoJLyogY29weSBwYXJ0IHRpbGwgdGhlIG5leHQgJywnIHRvIGRzdCAqLwoJd2hpbGUgKCAqc3JjIT0nXDAnICYmICpzcmMhPScsJyAmJiAobGVuLS0pPjAgKSAqKGRzdCsrKT0qKHNyYysrKTsKCQoJLyogZmluYWxpemUgdGhlIHN0cmluZyAqLwoJKmRzdD0weDA7CgkKCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQYXJzZUZpZWxkVwkJCVtpbnRlcm5hbF0KICoKICogY29weXMgYSBmaWVsZCBmcm9tIGEgJywnIGRlbGltaXRlZCBzdHJpbmcKICogCiAqIGZpcnN0IGZpZWxkIGlzIG5GaWVsZCA9IDEKICovCkRXT1JEIFdJTkFQSSBQYXJzZUZpZWxkVyhMUENXU1RSIHNyYywgRFdPUkQgbkZpZWxkLCBMUFdTVFIgZHN0LCBEV09SRCBsZW4pIAp7CglGSVhNRSgiKCclcycsMHglMDhseCwlcCwlbGQpIHN0dWIuXG4iLAoJICBkZWJ1Z3N0cl93KHNyYyksIG5GaWVsZCwgZHN0LCBsZW4pOwoJcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQYXJzZUZpZWxkQVcJCQlbU0hFTEwzMi41OF0KICovCkRXT1JEIFdJTkFQSSBQYXJzZUZpZWxkQVcoTFBDVk9JRCBzcmMsIERXT1JEIG5GaWVsZCwgTFBWT0lEIGRzdCwgRFdPUkQgbGVuKSAKewoJaWYgKFZFUlNJT05fT3NJc1VuaWNvZGUoKSkKCSAgcmV0dXJuIFBhcnNlRmllbGRXKHNyYywgbkZpZWxkLCBkc3QsIGxlbik7CglyZXR1cm4gUGFyc2VGaWVsZEEoc3JjLCBuRmllbGQsIGRzdCwgbGVuKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogR2V0RmlsZU5hbWVGcm9tQnJvd3NlCQkJW1NIRUxMMzIuNjNdCiAqIAogKi8KQk9PTCBXSU5BUEkgR2V0RmlsZU5hbWVGcm9tQnJvd3NlKAoJSFdORCBod25kT3duZXIsCglMUFNUUiBscHN0ckZpbGUsCglEV09SRCBuTWF4RmlsZSwKCUxQQ1NUUiBscHN0ckluaXRpYWxEaXIsCglMUENTVFIgbHBzdHJEZWZFeHQsCglMUENTVFIgbHBzdHJGaWx0ZXIsCglMUENTVFIgbHBzdHJUaXRsZSkKewoJRklYTUUoIiglMDR4LCVzLCVsZCwlcywlcywlcywlcyk6c3R1Yi5cbiIsCgkgIGh3bmRPd25lciwgbHBzdHJGaWxlLCBuTWF4RmlsZSwgbHBzdHJJbml0aWFsRGlyLCBscHN0ckRlZkV4dCwKCSAgbHBzdHJGaWx0ZXIsIGxwc3RyVGl0bGUpOwoKICAgIC8qIHB1dHMgdXAgYSBPcGVuIERpYWxvZyBhbmQgcmVxdWVzdHMgaW5wdXQgaW50byB0YXJnZXRidWYgKi8KICAgIC8qIE9GTl9ISURFUkVBRE9OTFl8T0ZOX05PQ0hBTkdFRElSfE9GTl9GSUxFTVVTVEVYSVNUfE9GTl91bmtub3duICovCiAgICBsc3RyY3B5QShscHN0ckZpbGUsIng6XFxkdW1teS5leGUiKTsKICAgIHJldHVybiAxOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEdldFNldHRpbmdzCQkJCVtTSEVMTDMyLjY4XQogKiAKICogTk9URVMKICogIHRoZSByZWdpc3RyeSBwYXRoIGFyZSBmb3Igd2luOTggKHRlc3RlZCkKICogIGFuZCBwb3NzaWJseSBhcmUgdGhlIHNhbWUgaW4gbnQ0MAogKi8Kdm9pZCBXSU5BUEkgU0hHZXRTZXR0aW5ncyhMUFNIRUxMRkxBR1NUQVRFIGxwc2ZzLCBEV09SRCBkd01hc2ssIERXT1JEIGR3eCkKewoJSEtFWQloS2V5OwoJRFdPUkQJZHdEYXRhOwoJRFdPUkQJZHdEYXRhU2l6ZSA9IHNpemVvZiAoRFdPUkQpOwoKCVRSQUNFKCIoJXAgMHglMDhseCAweCUwOGx4KVxuIixscHNmcyxkd01hc2ssIGR3eCk7CgkKCWlmIChSZWdDcmVhdGVLZXlFeEEoSEtFWV9DVVJSRU5UX1VTRVIsICJTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcRXhwbG9yZXJcXEFkdmFuY2VkIiwKCQkJCSAwLCAwLCAwLCBLRVlfQUxMX0FDQ0VTUywgMCwgJmhLZXksIDApKQoJICByZXR1cm47CgkKCWlmICggKFNTRl9TSE9XRVhURU5TSU9OUyAmIGR3TWFzaykgJiYgIVJlZ1F1ZXJ5VmFsdWVFeEEoaEtleSwgIkhpZGVGaWxlRXh0IiwgMCwgMCwgKExQQllURSkmZHdEYXRhLCAmZHdEYXRhU2l6ZSkpCgkgIGxwc2ZzLT5mU2hvd0V4dGVuc2lvbnMgID0gKChkd0RhdGEgPT0gMCkgPyAgMCA6IDEpOwoKCWlmICggKFNTRl9TSE9XSU5GT1RJUCAmIGR3TWFzaykgJiYgIVJlZ1F1ZXJ5VmFsdWVFeEEoaEtleSwgIlNob3dJbmZvVGlwIiwgMCwgMCwgKExQQllURSkmZHdEYXRhLCAmZHdEYXRhU2l6ZSkpCgkgIGxwc2ZzLT5mU2hvd0luZm9UaXAgID0gKChkd0RhdGEgPT0gMCkgPyAgMCA6IDEpOwoKCWlmICggKFNTRl9ET05UUFJFVFRZUEFUSCAmIGR3TWFzaykgJiYgIVJlZ1F1ZXJ5VmFsdWVFeEEoaEtleSwgIkRvbnRQcmV0dHlQYXRoIiwgMCwgMCwgKExQQllURSkmZHdEYXRhLCAmZHdEYXRhU2l6ZSkpCgkgIGxwc2ZzLT5mRG9udFByZXR0eVBhdGggID0gKChkd0RhdGEgPT0gMCkgPyAgMCA6IDEpOwoKCWlmICggKFNTRl9ISURFSUNPTlMgJiBkd01hc2spICYmICFSZWdRdWVyeVZhbHVlRXhBKGhLZXksICJIaWRlSWNvbnMiLCAwLCAwLCAoTFBCWVRFKSZkd0RhdGEsICZkd0RhdGFTaXplKSkKCSAgbHBzZnMtPmZIaWRlSWNvbnMgID0gKChkd0RhdGEgPT0gMCkgPyAgMCA6IDEpOwoKCWlmICggKFNTRl9NQVBORVREUlZCVVRUT04gJiBkd01hc2spICYmICFSZWdRdWVyeVZhbHVlRXhBKGhLZXksICJNYXBOZXREcnZCdG4iLCAwLCAwLCAoTFBCWVRFKSZkd0RhdGEsICZkd0RhdGFTaXplKSkKCSAgbHBzZnMtPmZNYXBOZXREcnZCdG4gID0gKChkd0RhdGEgPT0gMCkgPyAgMCA6IDEpOwoKCWlmICggKFNTRl9TSE9XQVRUUklCQ09MICYgZHdNYXNrKSAmJiAhUmVnUXVlcnlWYWx1ZUV4QShoS2V5LCAiU2hvd0F0dHJpYkNvbCIsIDAsIDAsIChMUEJZVEUpJmR3RGF0YSwgJmR3RGF0YVNpemUpKQoJICBscHNmcy0+ZlNob3dBdHRyaWJDb2wgID0gKChkd0RhdGEgPT0gMCkgPyAgMCA6IDEpOwoKCWlmICgoKFNTRl9TSE9XQUxMT0JKRUNUUyB8IFNTRl9TSE9XU1lTRklMRVMpICYgZHdNYXNrKSAmJiAhUmVnUXVlcnlWYWx1ZUV4QShoS2V5LCAiSGlkZGVuIiwgMCwgMCwgKExQQllURSkmZHdEYXRhLCAmZHdEYXRhU2l6ZSkpCgl7IGlmIChkd0RhdGEgPT0gMCkKCSAgeyBpZiAoU1NGX1NIT1dBTExPQkpFQ1RTICYgZHdNYXNrKQlscHNmcy0+ZlNob3dBbGxPYmplY3RzICA9IDA7CgkgICAgaWYgKFNTRl9TSE9XU1lTRklMRVMgJiBkd01hc2spCWxwc2ZzLT5mU2hvd1N5c0ZpbGVzICA9IDA7CgkgIH0KCSAgZWxzZSBpZiAoZHdEYXRhID09IDEpCgkgIHsgaWYgKFNTRl9TSE9XQUxMT0JKRUNUUyAmIGR3TWFzaykJbHBzZnMtPmZTaG93QWxsT2JqZWN0cyAgPSAxOwoJICAgIGlmIChTU0ZfU0hPV1NZU0ZJTEVTICYgZHdNYXNrKQlscHNmcy0+ZlNob3dTeXNGaWxlcyAgPSAwOwoJICB9CgkgIGVsc2UgaWYgKGR3RGF0YSA9PSAyKQoJICB7IGlmIChTU0ZfU0hPV0FMTE9CSkVDVFMgJiBkd01hc2spCWxwc2ZzLT5mU2hvd0FsbE9iamVjdHMgID0gMDsKCSAgICBpZiAoU1NGX1NIT1dTWVNGSUxFUyAmIGR3TWFzaykJbHBzZnMtPmZTaG93U3lzRmlsZXMgID0gMTsKCSAgfQoJfQoJUmVnQ2xvc2VLZXkgKGhLZXkpOwoKCVRSQUNFKCItLSAweCUwNHhcbiIsICooV09SRCopbHBzZnMpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFNoZWxsRm9sZGVyVmlld19NZXNzYWdlCQkJW1NIRUxMMzIuNzNdCiAqCiAqIFBBUkFNRVRFUlMKICogIGh3bmRDYWJpbmV0IGRlZmluZXMgdGhlIGV4cGxvcmVyIGNhYmluZXQgd2luZG93IHRoYXQgY29udGFpbnMgdGhlIAogKiAgICAgICAgICAgICAgc2hlbGx2aWV3IHlvdSBuZWVkIHRvIGNvbW11bmljYXRlIHdpdGgKICogIHVNc2cgICAgICAgIGlkZW50aWZ5aW5nIHRoZSBTRlZNIGVudW0gdG8gcGVyZm9ybQogKiAgbFBhcmFtCiAqCiAqIE5PVEVTCiAqICBNZXNzYWdlIFNGVk1fUkVBUlJBTkdFID0gMQogKiAgICBUaGlzIG1lc3NhZ2UgZ2V0cyBzZW50IHdoZW4gYSBjb2x1bW4gZ2V0cyBjbGlja2VkIHRvIGluc3RydWN0IHRoZQogKiAgICBzaGVsbCB2aWV3IHRvIHJlLXNvcnQgdGhlIGl0ZW0gbGlzdC4gbFBhcmFtIGlkZW50aWZpZXMgdGhlIGNvbHVtbgogKiAgICB0aGF0IHdhcyBjbGlja2VkLgogKi8KaW50IFdJTkFQSSBTSFNoZWxsRm9sZGVyVmlld19NZXNzYWdlKAoJSFdORCBod25kQ2FiaW5ldCwgCglEV09SRCBkd01lc3NhZ2UsCglEV09SRCBkd1BhcmFtKQp7CglGSVhNRSgiJTA0eCAlMDhseCAlMDhseCBzdHViXG4iLGh3bmRDYWJpbmV0LCBkd01lc3NhZ2UsIGR3UGFyYW0pOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFJlZ2lzdGVyU2hlbGxIb29rCQkJCVtTSEVMTDMyLjE4MV0KICoKICogUEFSQU1TCiAqICAgICAgaHduZCBbSV0gIHdpbmRvdyBoYW5kbGUKICogICAgICB5ICAgIFtJXSAgZmxhZyA/Pz8/CiAqIAogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KQk9PTCBXSU5BUEkgUmVnaXN0ZXJTaGVsbEhvb2soCglIV05EIGhXbmQsCglEV09SRCBkd1R5cGUpCnsKCUZJWE1FKCIoMHglMDh4LDB4JTA4bHgpOnN0dWIuXG4iLGhXbmQsIGR3VHlwZSk7CglyZXR1cm4gVFJVRTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaGVsbE1lc3NhZ2VCb3hXCQkJCVtTSEVMTDMyLjE4Ml0KICoKICogRm9ybWF0IGFuZCBvdXRwdXQgZXJyb3JtZXNzYWdlLgogKgogKiBpZFRleHQJcmVzb3VyY2UgSUQgb2YgdGl0bGUgb3IgTFBTVFIKICogaWRUaXRsZQlyZXNvdXJjZSBJRCBvZiB0aXRsZSBvciBMUFNUUgogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KaW50IFdJTkFQSVYgU2hlbGxNZXNzYWdlQm94VygKCUhJTlNUQU5DRSBoSW5zdGFuY2UsCglIV05EIGhXbmQsCglMUENXU1RSIGxwVGV4dCwKCUxQQ1dTVFIgbHBDYXB0aW9uLAoJVUlOVCB1VHlwZSwKCS4uLikKewoJV0NIQVIJc3pUZXh0WzEwMF0sc3pUaXRsZVsxMDBdLHN6VGVtcFsyNTZdOwoJTFBDV1NUUiAgIHBzelRleHQgPSBzelRleHQsIHBzelRpdGxlID0gc3pUaXRsZTsKCXZhX2xpc3QgYXJnczsKCXZhX3N0YXJ0KGFyZ3MsIHVUeXBlKTsKCS8qIHd2c3ByaW50ZkEoYnVmLGZtdCwgYXJncyk7ICovCgoJVFJBQ0UoIiglMDhseCwlMDhseCwlcCwlcCwlMDh4KVxuIiwKCShEV09SRCloSW5zdGFuY2UsKERXT1JEKWhXbmQsbHBUZXh0LGxwQ2FwdGlvbix1VHlwZSk7CgoJaWYgKCFISVdPUkQobHBDYXB0aW9uKSkKCSAgTG9hZFN0cmluZ1coaEluc3RhbmNlLCAoRFdPUkQpbHBDYXB0aW9uLCBzelRpdGxlLCAxMDApOwoJZWxzZQoJICBwc3pUaXRsZSA9IGxwQ2FwdGlvbjsKCglpZiAoIUhJV09SRChscFRleHQpKQoJICBMb2FkU3RyaW5nVyhoSW5zdGFuY2UsIChEV09SRClscFRleHQsIHN6VGV4dCwgMTAwKTsKCWVsc2UKCSAgcHN6VGV4dCA9IGxwVGV4dDsKCglGb3JtYXRNZXNzYWdlVyhGT1JNQVRfTUVTU0FHRV9GUk9NX1NUUklORyB8IEZPUk1BVF9NRVNTQUdFX0FSR1VNRU5UX0FSUkFZLAoJCSAgICAgICBzelRleHQsIDAsIDAsIHN6VGVtcCwgMjU2LCAoTFBEV09SRCkgYXJncyk7CgoJdmFfZW5kKGFyZ3MpOwoKCXJldHVybiBNZXNzYWdlQm94VyhoV25kLHN6VGVtcCxzelRpdGxlLHVUeXBlKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU2hlbGxNZXNzYWdlQm94QQkJCQlbU0hFTEwzMi4xODNdCiAqLwppbnQgV0lOQVBJViBTaGVsbE1lc3NhZ2VCb3hBKAoJSElOU1RBTkNFIGhJbnN0YW5jZSwKCUhXTkQgaFduZCwKCUxQQ1NUUiBscFRleHQsCglMUENTVFIgbHBDYXB0aW9uLAoJVUlOVCB1VHlwZSwKCS4uLikKewoJY2hhcglzelRleHRbMTAwXSxzelRpdGxlWzEwMF0sc3pUZW1wWzI1Nl07CglMUENTVFIgICBwc3pUZXh0ID0gc3pUZXh0LCBwc3pUaXRsZSA9IHN6VGl0bGU7Cgl2YV9saXN0IGFyZ3M7Cgl2YV9zdGFydChhcmdzLCB1VHlwZSk7CgkvKiB3dnNwcmludGZBKGJ1ZixmbXQsIGFyZ3MpOyAqLwoKCVRSQUNFKCIoJTA4bHgsJTA4bHgsJXAsJXAsJTA4eClcbiIsCgkoRFdPUkQpaEluc3RhbmNlLChEV09SRCloV25kLGxwVGV4dCxscENhcHRpb24sdVR5cGUpOwoKCWlmICghSElXT1JEKGxwQ2FwdGlvbikpCgkgIExvYWRTdHJpbmdBKGhJbnN0YW5jZSwgKERXT1JEKWxwQ2FwdGlvbiwgc3pUaXRsZSwgMTAwKTsKCWVsc2UKCSAgcHN6VGl0bGUgPSBscENhcHRpb247CgoJaWYgKCFISVdPUkQobHBUZXh0KSkKCSAgTG9hZFN0cmluZ0EoaEluc3RhbmNlLCAoRFdPUkQpbHBUZXh0LCBzelRleHQsIDEwMCk7CgllbHNlCgkgIHBzelRleHQgPSBscFRleHQ7CgoJRm9ybWF0TWVzc2FnZUEoRk9STUFUX01FU1NBR0VfRlJPTV9TVFJJTkcgfCBGT1JNQVRfTUVTU0FHRV9BUkdVTUVOVF9BUlJBWSwKCQkgICAgICAgc3pUZXh0LCAwLCAwLCBzelRlbXAsIDI1NiwgKExQRFdPUkQpIGFyZ3MpOwoKCXZhX2VuZChhcmdzKTsKCglyZXR1cm4gTWVzc2FnZUJveEEoaFduZCxzelRlbXAsc3pUaXRsZSx1VHlwZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIRnJlZQkJCQkJW1NIRUxMMzIuMTk1XQogKgogKiBOT1RFUwogKiAgICAgZnJlZV9wdHIoKSAtIGZyZWVzIG1lbW9yeSB1c2luZyBJTWFsbG9jCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwojZGVmaW5lIE1FTV9ERUJVRyAwCnZvaWQgV0lOQVBJIFNIRnJlZShMUFZPSUQgeCkgCnsKI2lmIE1FTV9ERUJVRwoJV09SRCBsZW4gPSAqKExQV09SRCkoKExQQllURSl4LTIpOwoKCWlmICggKihMUFdPUkQpKChMUEJZVEUpeCtsZW4pICE9IDB4NzM4NCkKCSAgRVJSKCJNQUdJQzIhXG4iKTsKCglpZiAoICgqKExQV09SRCkoKExQQllURSl4LTQpKSAhPSAweDgyNzEpCgkgIEVSUigiTUFHSUMxIVxuIik7CgllbHNlCgkgIG1lbXNldCgoTFBCWVRFKXgtNCwgMHhkZSwgbGVuKzYpOwoKCVRSQUNFKCIlcCBsZW49JXVcbiIseCwgbGVuKTsKCgl4ID0gKExQQllURSkgeCAtIDQ7CiNlbHNlCglUUkFDRSgiJXBcbiIseCk7CiNlbmRpZgoJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgeCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQWxsb2MJCQkJCVtTSEVMTDMyLjE5Nl0KICoKICogTk9URVMKICogICAgIHZvaWQgKnRhc2tfYWxsb2MoRFdPUkQgbGVuKSwgdXNlcyBTSE1hbGxvYyBhbGxvY2F0b3IKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCkxQVk9JRCBXSU5BUEkgU0hBbGxvYyhEV09SRCBsZW4pIAp7CglMUEJZVEUgcmV0OwoKI2lmIE1FTV9ERUJVRwoJcmV0ID0gKExQVk9JRCkgSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxsZW4rNik7CiNlbHNlCglyZXQgPSAoTFBWT0lEKSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLGxlbik7CiNlbmRpZgoKI2lmIE1FTV9ERUJVRwoJKihMUFdPUkQpKHJldCkgPSAweDgyNzE7CgkqKExQV09SRCkocmV0KzIpID0gKFdPUkQpbGVuOwoJKihMUFdPUkQpKHJldCs0K2xlbikgPSAweDczODQ7CglyZXQgKz0gNDsKCW1lbXNldChyZXQsIDB4ZGYsIGxlbik7CiNlbmRpZgoJVFJBQ0UoIiVsdSBieXRlcyBhdCAlcFxuIixsZW4sIHJldCk7CglyZXR1cm4gKExQVk9JRClyZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIUmVnaXN0ZXJEcmFnRHJvcAkJCQlbU0hFTEwzMi44Nl0KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCkhSRVNVTFQgV0lOQVBJIFNIUmVnaXN0ZXJEcmFnRHJvcCgKCUhXTkQgaFduZCwKCUxQRFJPUFRBUkdFVCBwRHJvcFRhcmdldCkKewoJRklYTUUoIigweCUwOHgsJXApOnN0dWIuXG4iLCBoV25kLCBwRHJvcFRhcmdldCk7CglpZiAoR2V0U2hlbGxPbGUoKSkgcmV0dXJuIHBSZWdpc3RlckRyYWdEcm9wKGhXbmQsIHBEcm9wVGFyZ2V0KTsKICAgICAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hSZXZva2VEcmFnRHJvcAkJCQlbU0hFTEwzMi44N10KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCkhSRVNVTFQgV0lOQVBJIFNIUmV2b2tlRHJhZ0Ryb3AoSFdORCBoV25kKQp7CiAgICBGSVhNRSgiKDB4JTA4eCk6c3R1Yi5cbiIsaFduZCk7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hEb0RyYWdEcm9wCQkJCQlbU0hFTEwzMi44OF0KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCkhSRVNVTFQgV0lOQVBJIFNIRG9EcmFnRHJvcCgKCUhXTkQgaFduZCwKCUxQREFUQU9CSkVDVCBscERhdGFPYmplY3QsCglMUERST1BTT1VSQ0UgbHBEcm9wU291cmNlLAoJRFdPUkQgZHdPS0VmZmVjdCwKCUxQRFdPUkQgcGR3RWZmZWN0KQp7CiAgICBGSVhNRSgiKDB4JTA0eCAlcCAlcCAweCUwOGx4ICVwKTpzdHViLlxuIiwKICAgIGhXbmQsIGxwRGF0YU9iamVjdCwgbHBEcm9wU291cmNlLCBkd09LRWZmZWN0LCBwZHdFZmZlY3QpOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEFycmFuZ2VXaW5kb3dzCQkJCVtTSEVMTDMyLjE4NF0KICogCiAqLwpXT1JEIFdJTkFQSSBBcnJhbmdlV2luZG93cygKCUhXTkQgaHduZFBhcmVudCwKCURXT1JEIGR3UmVzZXJ2ZWQsCglMUENSRUNUIGxwUmVjdCwKCVdPUkQgY0tpZHMsCglDT05TVCBIV05EICogbHBLaWRzKQp7CiAgICBGSVhNRSgiKDB4JTA4eCAweCUwOGx4ICVwIDB4JTA0eCAlcCk6c3R1Yi5cbiIsCgkgICBod25kUGFyZW50LCBkd1Jlc2VydmVkLCBscFJlY3QsIGNLaWRzLCBscEtpZHMpOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNpZ25hbEZpbGVPcGVuCQkJCVtTSEVMTDMyLjEwM10KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCkRXT1JEIFdJTkFQSQpTaWduYWxGaWxlT3BlbiAoRFdPUkQgZHdQYXJhbTEpCnsKICAgIEZJWE1FKCIoMHglMDhseCk6c3R1Yi5cbiIsIGR3UGFyYW0xKTsKCiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hBZGRUb1JlY2VudERvY3MJCQkJW1NIRUxMMzIuMjM0XQogKgogKiBQQVJBTUVURVJTCiAqICAgdUZsYWdzICBbSU5dIFNIQVJEX1BBVEggb3IgU0hBUkRfUElETAogKiAgIHB2ICAgICAgW0lOXSBzdHJpbmcgb3IgcGlkbCwgTlVMTCBjbGVhcnMgdGhlIGxpc3QKICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG5hbWUKICovCkRXT1JEIFdJTkFQSSBTSEFkZFRvUmVjZW50RG9jcyAoVUlOVCB1RmxhZ3MsTFBDVk9JRCBwdikgICAKeyBpZiAoU0hBUkRfUElETD09dUZsYWdzKQogIHsgRklYTUUoIigweCUwOHgscGlkbD0lcCk6c3R1Yi5cbiIsIHVGbGFncyxwdik7Cgl9CgllbHNlCgl7IEZJWE1FKCIoMHglMDh4LCVzKTpzdHViLlxuIiwgdUZsYWdzLChjaGFyKilwdik7Cgl9CiAgcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hDcmVhdGVTaGVsbEZvbGRlclZpZXdFeAkJCVtTSEVMTDMyLjE3NF0KICoKICogTk9URVMKICogIHNlZSBJU2hlbGxGb2xkZXI6OkNyZWF0ZVZpZXdPYmplY3QKICovCkhSRVNVTFQgV0lOQVBJIFNIQ3JlYXRlU2hlbGxGb2xkZXJWaWV3RXgoCglMUENTSEVMTEZPTERFUlZJRVdJTkZPIHBzdmNiaSwgLypbaW4gXSBzaGVsbHRlbXBsYXRlIHN0cnVjdCovCglMUFNIRUxMVklFVyogcHB2KSAgICAgICAgICAgICAgLypbb3V0XSBJU2hlbGxWaWV3IHBvaW50ZXIqLwp7CglJU2hlbGxWaWV3ICogcHNmOwoJSFJFU1VMVCBoUmVzOwoJCglUUkFDRSgic2Y9JXAgcGlkbD0lcCBjYj0lcCBtb2RlPTB4JTA4eCBwYXJtPTB4JTA4bHhcbiIsIAoJICBwc3ZjYmktPnBzaGYsIHBzdmNiaS0+cGlkbEZvbGRlciwgcHN2Y2JpLT5scGZuQ2FsbGJhY2ssCgkgIHBzdmNiaS0+dVZpZXdNb2RlLCBwc3ZjYmktPmR3VXNlcik7CgoJcHNmID0gSVNoZWxsVmlld19Db25zdHJ1Y3Rvcihwc3ZjYmktPnBzaGYpOwoJCglpZiAoIXBzZikKCSAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CgoJSVNoZWxsVmlld19BZGRSZWYocHNmKTsKCWhSZXMgPSBJU2hlbGxWaWV3X1F1ZXJ5SW50ZXJmYWNlKHBzZiwgJklJRF9JU2hlbGxWaWV3LCAoTFBWT0lEICopcHB2KTsKCUlTaGVsbFZpZXdfUmVsZWFzZShwc2YpOwoKCXJldHVybiBoUmVzOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBTSFdpbkhlbHAJCQkJCVtTSEVMTDMyLjEyN10KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIV2luSGVscCAoRFdPUkQgdiwgRFdPUkQgdywgRFdPUkQgeCwgRFdPUkQgeikKewlGSVhNRSgiMHglMDhseCAweCUwOGx4IDB4JTA4bHggMHglMDhseCBzdHViXG4iLHYsdyx4LHopOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIFNIUnVuQ29udHJvbFBhbmVsIFtTSEVMTDMyLjE2MV0KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIUnVuQ29udHJvbFBhbmVsIChEV09SRCB4LCBEV09SRCB6KQp7CUZJWE1FKCIweCUwOGx4IDB4JTA4bHggc3R1YlxuIix4LHopOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU2hlbGxFeGVjdXRlRXgJCQkJW1NIRUxMMzIuMjkxXQogKgogKi8KQk9PTCBXSU5BUEkgU2hlbGxFeGVjdXRlRXhBVyAoTFBWT0lEIHNlaSkKewlpZiAoVkVSU0lPTl9Pc0lzVW5pY29kZSgpKQoJICByZXR1cm4gU2hlbGxFeGVjdXRlRXhXIChzZWkpOwoJcmV0dXJuIFNoZWxsRXhlY3V0ZUV4QSAoc2VpKTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaGVsbEV4ZWN1dGVFeEEJCQkJW1NIRUxMMzIuMjkyXQogKgogKiBwbGFjZWhvbGRlciBpbiB0aGUgY29tbWFuZGxpbmU6CiAqCSUxIGZpbGUKICoJJTIgcHJpbnRlcgogKgklMyBkcml2ZXIKICoJJTQgcG9ydAogKgklSSBhZHJlc3Mgb2YgYSBnbG9iYWwgaXRlbSBJRCAoZXhwbG9yZXIgc3dpdGNoIC9pZGxpc3QpCiAqCSVMID8/PyBwYXRoL3VybC9jdXJyZW50IGZpbGUgPz8/CiAqCSVTID8/PwogKgklKiBhbGwgZm9sbG93aW5nIHBhcmFtZXRlcnMgKHNlZSBiYXRmaWxlKQogKi8KI2luY2x1ZGUgInByb2Nlc3MuaCIgLyogd2UgY2FuIGdldCByaWQgb2YgaXQgaG9wZWZ1bGx5ICovCiNpbmNsdWRlICJ0YXNrLmgiCkJPT0wgV0lOQVBJIFNoZWxsRXhlY3V0ZUV4QSAoTFBTSEVMTEVYRUNVVEVJTkZPQSBzZWkpCnsgCUNIQVIgc3pBcHBsaWNhdGlvbk5hbWVbTUFYX1BBVEhdLHN6Q29tbWFuZGxpbmVbTUFYX1BBVEhdLHN6UGlkbFsyMF07CglMUFNUUiBwb3M7CglpbnQgZ2FwLCBsZW47CglTVEFSVFVQSU5GT0EgIHN0YXJ0dXA7CglQUk9DRVNTX0lORk9STUFUSU9OIGluZm87CgkJCQoJV0FSTigibWFzaz0weCUwOGx4IGh3bmQ9MHglMDR4IHZlcmI9JXMgZmlsZT0lcyBwYXJtPSVzIGRpcj0lcyBzaG93PTB4JTA4eCBjbGFzcz0lcyBpbmNvbXBsZXRlXG4iLAoJCXNlaS0+Zk1hc2ssIHNlaS0+aHduZCwgc2VpLT5scFZlcmIsIHNlaS0+bHBGaWxlLAoJCXNlaS0+bHBQYXJhbWV0ZXJzLCBzZWktPmxwRGlyZWN0b3J5LCBzZWktPm5TaG93LCAKCQkoc2VpLT5mTWFzayAmIFNFRV9NQVNLX0NMQVNTTkFNRSkgPyBzZWktPmxwQ2xhc3MgOiAibm90IHVzZWQiKTsKCglaZXJvTWVtb3J5KHN6QXBwbGljYXRpb25OYW1lLE1BWF9QQVRIKTsKCWlmIChzZWktPmxwRmlsZSkKCSAgc3RyY3B5KHN6QXBwbGljYXRpb25OYW1lLCBzZWktPmxwRmlsZSk7CgkKCVplcm9NZW1vcnkoc3pDb21tYW5kbGluZSxNQVhfUEFUSCk7CglpZiAoc2VpLT5scFBhcmFtZXRlcnMpCgkgIHN0cmNweShzekNvbW1hbmRsaW5lLCBzZWktPmxwUGFyYW1ldGVycyk7CgkJCQoJaWYgKHNlaS0+Zk1hc2sgJiAoU0VFX01BU0tfQ0xBU1NLRVkgfCBTRUVfTUFTS19JTlZPS0VJRExJU1QgfCBTRUVfTUFTS19JQ09OIHwgU0VFX01BU0tfSE9US0VZIHwKCQkJICBTRUVfTUFTS19DT05ORUNUTkVURFJWIHwgU0VFX01BU0tfRkxBR19EREVXQUlUIHwKCQkJICBTRUVfTUFTS19ET0VOVlNVQlNUIHwgU0VFX01BU0tfRkxBR19OT19VSSB8IFNFRV9NQVNLX1VOSUNPREUgfCAKCQkJICBTRUVfTUFTS19OT19DT05TT0xFIHwgU0VFX01BU0tfQVNZTkNPSyB8IFNFRV9NQVNLX0hNT05JVE9SICkpCgl7CgkgIEZJWE1FKCJmbGFncyBpZ25vcmVkOiAweCUwOGx4XG4iLCBzZWktPmZNYXNrKTsKCX0KCQoJLyogbGF1bmNoIGEgZG9jdW1lbnQgYnkgZmlsZWNsYXNzIGxpa2UgJ1dvcmRwYWQuRG9jdW1lbnQuMScgKi8KCWlmIChzZWktPmZNYXNrICYgU0VFX01BU0tfQ0xBU1NOQU1FKQoJewoJICAvKiB0aGUgY29tbWFuZGxpbmUgY29udGFpbnMgJ2M6XFBhdGhcd29yZHBhZC5leGUgIiUxIicgKi8KCSAgSENSX0dldEV4ZWN1dGVDb21tYW5kKHNlaS0+bHBDbGFzcywgKHNlaS0+bHBWZXJiKSA/IHNlaS0+bHBWZXJiIDogIm9wZW4iLCBzekNvbW1hbmRsaW5lLCAyNTYpOwoJICAvKiBmaXhtZTogZ2V0IHRoZSBleHRlbnNpb24gb2YgbHBGaWxlLCBjaGVjayBpZiBpdCBmaXRzIHRvIHRoZSBscENsYXNzICovCgkgIFRSQUNFKCJTRUVfTUFTS19DTEFTU05BTUUtPiclcydcbiIsIHN6Q29tbWFuZGxpbmUpOwoJfQoKCS8qIHByb2Nlc3MgdGhlIElETGlzdCAqLwoJaWYgKCAoc2VpLT5mTWFzayAmIFNFRV9NQVNLX0lOVk9LRUlETElTVCkgPT0gU0VFX01BU0tfSU5WT0tFSURMSVNUKSAvKjB4MGMqLwoJewoJICBTSEdldFBhdGhGcm9tSURMaXN0QSAoc2VpLT5scElETGlzdCxzekFwcGxpY2F0aW9uTmFtZSk7CgkgIFRSQUNFKCItLSBpZGxpc3Q9JXAgKCVzKVxuIiwgc2VpLT5scElETGlzdCwgc3pBcHBsaWNhdGlvbk5hbWUpOwoJfQoJZWxzZQoJewoJICBpZiAoc2VpLT5mTWFzayAmIFNFRV9NQVNLX0lETElTVCApCgkgIHsKCSAgICBwb3MgPSBzdHJzdHIoc3pDb21tYW5kbGluZSwgIiVJIik7CgkgICAgaWYgKHBvcykKCSAgICB7CgkgICAgICBMUFZPSUQgcHY7CgkgICAgICBIR0xPQkFMIGhtZW0gPSBTSEFsbG9jU2hhcmVkICggc2VpLT5scElETGlzdCwgSUxHZXRTaXplKHNlaS0+bHBJRExpc3QpLCAwKTsKCSAgICAgIHB2ID0gU0hMb2NrU2hhcmVkKGhtZW0sMCk7CgkgICAgICBzcHJpbnRmKHN6UGlkbCwiOiVwIixwdiApOwoJICAgICAgU0hVbmxvY2tTaGFyZWQocHYpOwoJICAgIAoJICAgICAgZ2FwID0gc3RybGVuKHN6UGlkbCk7CgkgICAgICBsZW4gPSBzdHJsZW4ocG9zKS0yOwoJICAgICAgbWVtbW92ZShwb3MrZ2FwLHBvcysyLGxlbik7CgkgICAgICBtZW1jcHkocG9zLHN6UGlkbCxnYXApOwoKCSAgICB9CgkgIH0KCX0KCglUUkFDRSgiZXhlY3V0ZTonJXMnLCclcydcbiIsc3pBcHBsaWNhdGlvbk5hbWUsIHN6Q29tbWFuZGxpbmUpOwoKCXN0cmNhdChzekFwcGxpY2F0aW9uTmFtZSwgIiAiKTsKCXN0cmNhdChzekFwcGxpY2F0aW9uTmFtZSwgc3pDb21tYW5kbGluZSk7CgoJWmVyb01lbW9yeSgmc3RhcnR1cCxzaXplb2YoU1RBUlRVUElORk9BKSk7CglzdGFydHVwLmNiID0gc2l6ZW9mKFNUQVJUVVBJTkZPQSk7CgoJaWYgKCEgQ3JlYXRlUHJvY2Vzc0EoTlVMTCwgc3pBcHBsaWNhdGlvbk5hbWUsCgkJCSBOVUxMLCBOVUxMLCBGQUxTRSwgMCwgCgkJCSBOVUxMLCBOVUxMLCAmc3RhcnR1cCwgJmluZm8pKQoJewoJICBzZWktPmhJbnN0QXBwID0gR2V0TGFzdEVycm9yKCk7CgkgIHJldHVybiBGQUxTRTsKCX0KCiAgICAgICAgc2VpLT5oSW5zdEFwcCA9IDMzOwoJCiAgICAJLyogR2l2ZSAzMCBzZWNvbmRzIHRvIHRoZSBhcHAgdG8gY29tZSB1cCAqLwoJaWYgKCBXYWl0Rm9ySW5wdXRJZGxlICggaW5mby5oUHJvY2VzcywgMzAwMDAgKSA9PSAgMHhGRkZGRkZGRiApCgkgIEVSUigiV2FpdEZvcklucHV0SWRsZSBmYWlsZWQ6IEVycm9yICVsZFxuIiwgR2V0TGFzdEVycm9yKCkgKTsKIAoJaWYoc2VpLT5mTWFzayAmIFNFRV9NQVNLX05PQ0xPU0VQUk9DRVNTKQoJICBzZWktPmhQcm9jZXNzID0gaW5mby5oUHJvY2VzczsJICAKICAgICAgICBlbHNlCiAgICAgICAgICBDbG9zZUhhbmRsZSggaW5mby5oUHJvY2VzcyApOwogICAgICAgIENsb3NlSGFuZGxlKCBpbmZvLmhUaHJlYWQgKTsKCXJldHVybiBUUlVFOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNoZWxsRXhlY3V0ZUV4VwkJCQlbU0hFTEwzMi4yOTNdCiAqCiAqLwpCT09MIFdJTkFQSSBTaGVsbEV4ZWN1dGVFeFcgKExQU0hFTExFWEVDVVRFSU5GT1cgc2VpKQp7CVNIRUxMRVhFQ1VURUlORk9BIHNlaUE7CglEV09SRCByZXQ7CgoJVFJBQ0UoIiVwXG4iLCBzZWkpOwoKCW1lbWNweSgmc2VpQSwgc2VpLCBzaXplb2YoU0hFTExFWEVDVVRFSU5GT0EpKTsKCQogICAgICAgIGlmIChzZWktPmxwVmVyYikKCSAgc2VpQS5scFZlcmIgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIHNlaS0+bHBWZXJiKTsKCiAgICAgICAgaWYgKHNlaS0+bHBGaWxlKQoJICBzZWlBLmxwRmlsZSA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2VpLT5scEZpbGUpOwoKICAgICAgICBpZiAoc2VpLT5scFBhcmFtZXRlcnMpCgkgIHNlaUEubHBQYXJhbWV0ZXJzID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzZWktPmxwUGFyYW1ldGVycyk7CgoJaWYgKHNlaS0+bHBEaXJlY3RvcnkpCgkgIHNlaUEubHBEaXJlY3RvcnkgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIHNlaS0+bHBEaXJlY3RvcnkpOwoKICAgICAgICBpZiAoKHNlaS0+Zk1hc2sgJiBTRUVfTUFTS19DTEFTU05BTUUpICYmIHNlaS0+bHBDbGFzcykKCSAgc2VpQS5scENsYXNzID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzZWktPmxwQ2xhc3MpOwoJZWxzZQoJICBzZWlBLmxwQ2xhc3MgPSBOVUxMOwoJICAJICAKCXJldCA9IFNoZWxsRXhlY3V0ZUV4QSgmc2VpQSk7CgogICAgICAgIGlmIChzZWlBLmxwVmVyYikJSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIChMUFNUUikgc2VpQS5scFZlcmIgKTsKCWlmIChzZWlBLmxwRmlsZSkJSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIChMUFNUUikgc2VpQS5scEZpbGUgKTsKCWlmIChzZWlBLmxwUGFyYW1ldGVycykJSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIChMUFNUUikgc2VpQS5scFBhcmFtZXRlcnMgKTsKCWlmIChzZWlBLmxwRGlyZWN0b3J5KQlIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKExQU1RSKSBzZWlBLmxwRGlyZWN0b3J5ICk7CglpZiAoc2VpQS5scENsYXNzKQlIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKExQU1RSKSBzZWlBLmxwQ2xhc3MgKTsKCiAJcmV0dXJuIHJldDsKfQoKc3RhdGljIExQVU5LTk9XTiBTSEVMTDMyX0lFeHBsb3JlckludGVyZmFjZT0wOwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFNldEluc3RhbmNlRXhwbG9yZXIJCQlbU0hFTEwzMi4xNzZdCiAqCiAqIE5PVEVTCiAqICBTZXRzIHRoZSBpbnRlcmZhY2UKICovCkhSRVNVTFQgV0lOQVBJIFNIU2V0SW5zdGFuY2VFeHBsb3JlciAoTFBVTktOT1dOIGxwVW5rbm93bikKewlUUkFDRSgiJXBcbiIsIGxwVW5rbm93bik7CglTSEVMTDMyX0lFeHBsb3JlckludGVyZmFjZSA9IGxwVW5rbm93bjsKCXJldHVybiAoSFJFU1VMVCkgbHBVbmtub3duOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIR2V0SW5zdGFuY2VFeHBsb3JlcgkJCVtTSEVMTDMyLjI1Nl0KICoKICogTk9URVMKICogIGdldHMgdGhlIGludGVyZmFjZSBwb2ludGVyIG9mIHRoZSBleHBsb3JlciBhbmQgYSByZWZlcmVuY2UKICovCkhSRVNVTFQgV0lOQVBJIFNIR2V0SW5zdGFuY2VFeHBsb3JlciAoTFBVTktOT1dOICogbHBVbmtub3duKQp7CVRSQUNFKCIlcFxuIiwgbHBVbmtub3duKTsKCgkqbHBVbmtub3duID0gU0hFTEwzMl9JRXhwbG9yZXJJbnRlcmZhY2U7CgoJaWYgKCFTSEVMTDMyX0lFeHBsb3JlckludGVyZmFjZSkKCSAgcmV0dXJuIEVfRkFJTDsKCglJVW5rbm93bl9BZGRSZWYoU0hFTEwzMl9JRXhwbG9yZXJJbnRlcmZhY2UpOwoJcmV0dXJuIE5PRVJST1I7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hGcmVlVW51c2VkTGlicmFyaWVzCQkJW1NIRUxMMzIuMTIzXQogKgogKiBOT1RFUwogKiAgZXhwb3J0ZWQgYnkgbmFtZQogKi8Kdm9pZCBXSU5BUEkgU0hGcmVlVW51c2VkTGlicmFyaWVzICh2b2lkKQp7CglGSVhNRSgic3R1YlxuIik7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogREFEX1NldERyYWdJbWFnZQkJCQlbU0hFTEwzMi4xMzZdCiAqCiAqIE5PVEVTCiAqICBleHBvcnRlZCBieSBuYW1lCiAqLwpCT09MIFdJTkFQSSBEQURfU2V0RHJhZ0ltYWdlKAoJSElNQUdFTElTVCBoaW1sVHJhY2ssCglMUFBPSU5UIGxwcHQpCnsKCUZJWE1FKCIlcCAlcCBzdHViXG4iLGhpbWxUcmFjaywgbHBwdCk7CiAgcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogREFEX1Nob3dEcmFnSW1hZ2UJCQkJW1NIRUxMMzIuMTM3XQogKgogKiBOT1RFUwogKiAgZXhwb3J0ZWQgYnkgbmFtZQogKi8KQk9PTCBXSU5BUEkgREFEX1Nob3dEcmFnSW1hZ2UoQk9PTCBiU2hvdykKewoJRklYTUUoIjB4JTA4eCBzdHViXG4iLGJTaG93KTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFJlYWRDYWJpbmV0U3RhdGUJCQkJW05UIDQuMDpTSEVMTDMyLjY1MV0KICoKICovCkhSRVNVTFQgV0lOQVBJIFJlYWRDYWJpbmV0U3RhdGUoRFdPUkQgdSwgRFdPUkQgdikKewlGSVhNRSgiMHglMDRseCAweCUwNGx4IHN0dWJcbiIsdSx2KTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFdyaXRlQ2FiaW5ldFN0YXRlCQkJCVtOVCA0LjA6U0hFTEwzMi42NTJdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBXcml0ZUNhYmluZXRTdGF0ZShEV09SRCB1KQp7CUZJWE1FKCIweCUwNGx4IHN0dWJcbiIsdSk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBGaWxlSWNvbkluaXQgCQkJCVtTSEVMTDMyLjY2MF0KICoKICovCkJPT0wgV0lOQVBJIEZpbGVJY29uSW5pdChCT09MIGJGdWxsSW5pdCkKewlGSVhNRSgiKCVzKVxuIiwgYkZ1bGxJbml0ID8gInRydWUiIDogImZhbHNlIik7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJc1VzZXJBZG1pbgkJCQkJW05UIDQuMDpTSEVMTDMyLjY4MF0KICoKICovCkhSRVNVTFQgV0lOQVBJIElzVXNlckFkbWluKHZvaWQpCnsJRklYTUUoInN0dWJcbiIpOwoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQWxsb2NTaGFyZWQJCQkJW1NIRUxMMzIuNTIwXQogKgogKiBOT1RFUwogKiAgcGFyYW1ldGVyMSBpcyByZXR1cm4gdmFsdWUgZnJvbSBIZWFwQWxsb2MKICogIHBhcmFtZXRlcjIgaXMgZXF1YWwgdG8gdGhlIHNpemUgYWxsb2NhdGVkIHdpdGggSGVhcEFsbG9jCiAqICBwYXJhbWV0ZXIzIGlzIHJldHVybiB2YWx1ZSBmcm9tIEdldEN1cnJlbnRQcm9jZXNzSWQKICoKICogIHRoZSByZXR1cm4gdmFsdWUgaXMgcG9zdGVkIGFzIGxQYXJhbSB3aXRoIDB4NDAyIChXTV9VU0VSKzIpIHRvIHNvbWV3aGVyZQogKiAgV01fVVNFUisyIGNvdWxkIGJlIHRoZSB1bmRvY3VtZW50ZWQgQ1dNX1NFVFBBVEgKICogIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGNvbnRhaW5zIGEgcGlkbAogKi8KSEdMT0JBTCBXSU5BUEkgU0hBbGxvY1NoYXJlZChMUFZPSUQgcHNyYywgRFdPUkQgc2l6ZSwgRFdPUkQgcHJvY0lEKQp7CUhHTE9CQUwgaG1lbTsKCUxQVk9JRCBwbWVtOwoJCglUUkFDRSgicHRyPSVwIHNpemU9MHglMDRseCBwcm9jSUQ9MHglMDRseFxuIixwc3JjLHNpemUscHJvY0lEKTsKCWhtZW0gPSBHbG9iYWxBbGxvYyhHTUVNX0ZJWEVELCBzaXplKTsKCWlmICghaG1lbSkKCSAgcmV0dXJuIDA7CgkKCXBtZW0gPSAgR2xvYmFsTG9jayAoaG1lbSk7CgoJaWYgKCEgcG1lbSkKCSAgcmV0dXJuIDA7CgkgIAoJbWVtY3B5IChwbWVtLCBwc3JjLCBzaXplKTsKCUdsb2JhbFVubG9jayhobWVtKTsgCglyZXR1cm4gaG1lbTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSExvY2tTaGFyZWQJCQkJCVtTSEVMTDMyLjUyMV0KICoKICogTk9URVMKICogIHBhcmFtZXRlcjEgaXMgcmV0dXJuIHZhbHVlIGZyb20gU0hBbGxvY1NoYXJlZAogKiAgcGFyYW1ldGVyMiBpcyByZXR1cm4gdmFsdWUgZnJvbSBHZXRDdXJyZW50UHJvY2Vzc0lkCiAqICB0aGUgcmVjZWl2ZXIgb2YgKFdNX1VTRVIrMikgdHJ5cyB0byBsb2NrIHRoZSBIQU5ETEUgKD8pIAogKiAgdGhlIHJldHVybnZhbHVlIHNlZW1zIHRvIGJlIGEgbWVtb3J5YWRyZXNzCiAqLwpMUFZPSUQgV0lOQVBJIFNITG9ja1NoYXJlZChIQU5ETEUgaG1lbSwgRFdPUkQgcHJvY0lEKQp7CVRSQUNFKCJoYW5kbGU9MHglMDR4IHByb2NJRD0weCUwNGx4XG4iLGhtZW0scHJvY0lEKTsKCXJldHVybiBHbG9iYWxMb2NrKGhtZW0pOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIVW5sb2NrU2hhcmVkCQkJCVtTSEVMTDMyLjUyMl0KICoKICogTk9URVMKICogIHBhcmFtZXRlcjEgaXMgcmV0dXJuIHZhbHVlIGZyb20gU0hMb2NrU2hhcmVkCiAqLwpCT09MIFdJTkFQSSBTSFVubG9ja1NoYXJlZChMUFZPSUQgcHYpCnsKCVRSQUNFKCIlcFxuIixwdik7CglyZXR1cm4gR2xvYmFsVW5sb2NrKChIQU5ETEUpcHYpOyAKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEZyZWVTaGFyZWQJCQkJCVtTSEVMTDMyLjUyM10KICoKICogTk9URVMKICogIHBhcmFtZXRlcjEgaXMgcmV0dXJuIHZhbHVlIGZyb20gU0hBbGxvY1NoYXJlZAogKiAgcGFyYW1ldGVyMiBpcyByZXR1cm4gdmFsdWUgZnJvbSBHZXRDdXJyZW50UHJvY2Vzc0lkCiAqLwpCT09MIFdJTkFQSSBTSEZyZWVTaGFyZWQoCglIQU5ETEUgaE1lbSwKCURXT1JEIHBpZCkKewoJVFJBQ0UoImhhbmRsZT0weCUwNHggMHglMDRseFxuIixoTWVtLHBpZCk7CglyZXR1cm4gR2xvYmFsRnJlZShoTWVtKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU2V0QXBwU3RhcnRpbmdDdXJzb3IJCQkJW1NIRUxMMzIuOTldCiAqLwpIUkVTVUxUIFdJTkFQSSBTZXRBcHBTdGFydGluZ0N1cnNvcihIV05EIHUsIERXT1JEIHYpCnsJRklYTUUoImh3bmQ9MHglMDR4IDB4JTA0bHggc3R1YlxuIix1LHYgKTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNITG9hZE9MRQkJCQkJW1NIRUxMMzIuMTUxXQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hMb2FkT0xFKERXT1JEIHUpCnsJRklYTUUoIjB4JTA0bHggc3R1YlxuIix1KTsKCXJldHVybiBTX09LOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIERyaXZlVHlwZQkJCQkJW1NIRUxMMzIuNjRdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBEcml2ZVR5cGUoRFdPUkQgdSkKewlGSVhNRSgiMHglMDRseCBzdHViXG4iLHUpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hBYm9ydEludm9rZUNvbW1hbmQJCQkJW1NIRUxMMzIuMTk4XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hBYm9ydEludm9rZUNvbW1hbmQodm9pZCkKewlGSVhNRSgic3R1YlxuIik7CglyZXR1cm4gMTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSE91dE9mTWVtb3J5TWVzc2FnZUJveAkJCVtTSEVMTDMyLjEyNl0KICoKICovCmludCBXSU5BUEkgU0hPdXRPZk1lbW9yeU1lc3NhZ2VCb3goCglIV05EIGh3bmRPd25lciwKCUxQQ1NUUiBscENhcHRpb24sCglVSU5UIHVUeXBlKQp7CglGSVhNRSgiMHglMDR4ICVzIDB4JTA4eCBzdHViXG4iLGh3bmRPd25lciwgbHBDYXB0aW9uLCB1VHlwZSk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEZsdXNoQ2xpcGJvYXJkCQkJCVtTSEVMTDMyLjEyMV0KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIRmx1c2hDbGlwYm9hcmQodm9pZCkKewlGSVhNRSgic3R1YlxuIik7CglyZXR1cm4gMTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hXYWl0Rm9yRmlsZVRvT3BlbgkJCQlbU0hFTEwzMi45N10KICoKICovCkJPT0wgV0lOQVBJIFNIV2FpdEZvckZpbGVUb09wZW4oCglMUENJVEVNSURMSVNUIHBpZGwsIAoJRFdPUkQgZHdGbGFncywKCURXT1JEIGR3VGltZW91dCkKewoJRklYTUUoIiVwIDB4JTA4bHggMHglMDhseCBzdHViXG4iLCBwaWRsLCBkd0ZsYWdzLCBkd1RpbWVvdXQpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29udHJvbF9GaWxsQ2FjaGVfUnVuRExMCQkJW1NIRUxMMzIuOF0KICoKICovCkhSRVNVTFQgV0lOQVBJIENvbnRyb2xfRmlsbENhY2hlX1J1bkRMTChIV05EIGhXbmQsIEhBTkRMRSBoTW9kdWxlLCBEV09SRCB3LCBEV09SRCB4KQp7CUZJWE1FKCIweCUwNHggMHglMDR4IDB4JTA0bHggMHglMDRseCBzdHViXG4iLGhXbmQsIGhNb2R1bGUsdyx4KTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFJ1bkRMTF9DYWxsRW50cnkxNgkJCQlbU0hFTEwzMi4xMjJdCiAqIHRoZSBuYW1lIGlzIHByb3BhYmx5IHdyb25nCiAqLwpIUkVTVUxUIFdJTkFQSSBSdW5ETExfQ2FsbEVudHJ5MTYoRFdPUkQgdiwgRFdPUkQgdywgRFdPUkQgeCwgRFdPUkQgeSwgRFdPUkQgeikKewlGSVhNRSgiMHglMDRseCAweCUwNGx4IDB4JTA0bHggMHglMDRseCAweCUwNGx4IHN0dWJcbiIsdix3LHgseSx6KTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXNoZWxsMzJfNjU0CQkJCVtTSEVMTDMyLjY1NF0KICoKICogTk9URVM6IGZpcnN0IHBhcmFtZXRlciBzZWVtcyB0byBiZSBhIHBvaW50ZXIgKHNhbWUgYXMgcGFzc2VkIHRvIFdyaXRlQ2FiaW5ldFN0YXRlKQogKiBzZWNvbmQgb25lIGNvdWxkIGJlIGEgc2l6ZSAoMHgwYykuIFRoZSBzaXplIGlzIHRoZSBzYW1lIGFzIHRoZSBzdHJ1Y3R1cmUgc2F2ZWQgdG8KICogSENVXFNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXEV4cGxvcmVyXENhYmluZXRTdGF0ZQogKiBJJ20gKGpzKSBndWVzc2luZzogdGhpcyBvbmUgaXMganVzdCBSZWFkQ2FiaW5ldFN0YXRlIDstKQogKi8KSFJFU1VMVCBXSU5BUEkgc2hlbGwzMl82NTQgKERXT1JEIHgsIERXT1JEIHkpCnsJRklYTUUoIjB4JTA4bHggMHglMDhseCBzdHViXG4iLHgseSk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglSTEJ1aWxkTGlzdE9mUGF0aHMJCQlbU0hFTEwzMi4xNDZdCiAqCiAqIE5PVEVTCiAqICAgYnVpbGRzIGEgRFBBCiAqLwpEV09SRCBXSU5BUEkgUkxCdWlsZExpc3RPZlBhdGhzICh2b2lkKQp7CUZJWE1FKCJzdHViXG4iKTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU0hWYWxpZGF0ZVVOQwkJCQlbU0hFTEwzMi4xNzNdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSFZhbGlkYXRlVU5DIChEV09SRCB4LCBEV09SRCB5LCBEV09SRCB6KQp7CglGSVhNRSgiMHglMDhseCAweCUwOGx4IDB4JTA4bHggc3R1YlxuIix4LHkseik7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglEb0Vudmlyb25tZW50U3Vic3RBCQkJW1NIRUxMMzIuMTIyMl0KICoKICovCkhSRVNVTFQgV0lOQVBJIERvRW52aXJvbm1lbnRTdWJzdEEoTFBTVFIgeCwgTFBTVFIgeSkKewoJRklYTUUoIiglcywgJXMpIHN0dWJcbiIsIGRlYnVnc3RyX2EoeCksIGRlYnVnc3RyX2EoeSkpOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJRG9FbnZpcm9ubWVudFN1YnN0VwkJCVtTSEVMTDMyLjEyMjNdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBEb0Vudmlyb25tZW50U3Vic3RXKExQV1NUUiB4LCBMUFdTVFIgeSkKewoJRklYTUUoIiglcywgJXMpOiBzdHViXG4iLCBkZWJ1Z3N0cl93KHgpLCBkZWJ1Z3N0cl93KHkpKTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCURvRW52aXJvbm1lbnRTdWJzdAkJCVtTSEVMTDMyLjUzXQogKgogKi8KSFJFU1VMVCBXSU5BUEkgRG9FbnZpcm9ubWVudFN1YnN0QVcoTFBWT0lEIHgsIExQVk9JRCB5KQp7CglpZiAoVkVSU0lPTl9Pc0lzVW5pY29kZSgpKQoJICByZXR1cm4gRG9FbnZpcm9ubWVudFN1YnN0Vyh4LCB5KTsKCXJldHVybiBEb0Vudmlyb25tZW50U3Vic3RBKHgsIHkpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIHNoZWxsMzJfMjQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0hFTEwzMi4yNDNdCiAqIAogKiBXaW45OCsgYnktb3JkaW5hbCByb3V0aW5lLiAgSW4gV2luOTggdGhpcyByb3V0aW5lIHJldHVybnMgemVybyBhbmQKICogZG9lcyBub3RoaW5nIGVsc2UuICBQb3NzaWJseSB0aGlzIGRvZXMgc29tZXRoaW5nIGluIE5UIG9yIFNIRUxMMzIgNS4wPwogKgogKi8KCkJPT0wgV0lOQVBJIHNoZWxsMzJfMjQzKERXT1JEIGEsIERXT1JEIGIpIAp7IAogIHJldHVybiBGQUxTRTsgCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgU0hDcmVhdGVTaGVsbFBhbGV0dGUKICovCkhQQUxFVFRFIFdJTkFQSSBTSENyZWF0ZVNoZWxsUGFsZXR0ZShIREMgaGRjKQp7CglGSVhNRSgic3R1YlxuIik7CglyZXR1cm4gQ3JlYXRlSGFsZnRvbmVQYWxldHRlKGhkYyk7Cn0KCi8qCiBOT1RFUzogVGhlIG1vc3QgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IG9yZGluYWwgc2VlbSB0byBiZSBzdXBlcmZsb3VzLgogVGhlIHJlYXNvbiBmb3IgdGhlc2UgZnVuY3Rpb25zIHRvIGJlIHRoZXJlIGlzIHRvIHByb3ZpZGUgYSB3cmFwZXIKIGZvciB1bmljb2RlIGZ1bmN0aW9ucyB0byBwcm92aWRpbmcgdGhlc2UgZnVuY3Rpb25zIG9uIHN5c3RlbXMgd2l0aG91dAogdW5pY29kZSBmdW5jdGlvbnMgZWcuIHdpbjk1L3dpbjk4LiBTaW5jZSB3ZSBoYXZlIHN1Y2ggZnVuY3Rpb25zIHdlIGp1c3QKIGNhbGwgdGhlc2UuCiovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIFNITFdBUElfMQlbU0hMV0FQSV0KICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzEgKAoJTFBTVFIgbHBTdHIsCglMUFZPSUQgeCkKewoJRklYTUUoIiglcCAlcyAlcCAlcylcbiIsbHBTdHIsIGRlYnVnc3RyX2EobHBTdHIpLHgsIGRlYnVnc3RyX2EoeCkpOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgU0hMV0FQSV8yMwlbU0hMV0FQSS4yM10KICoKICogTk9URVMKICoJY29udmVydHMgYSBndWlkIHRvIGEgc3RyaW5nCiAqCXJldHVybnMgc3RybGVuKHN0cikKICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzIzICgKCVJFRkdVSUQgZ3VpZCwJLyogW2luXSAgY2xzaWQgKi8KCUxQU1RSIHN0ciwJLyogW291dF0gYnVmZmVyICovCglJTlQgY21heCkJLyogW2luXSAgc2l6ZSBvZiBidWZmZXIgKi8KewoJY2hhciB4Z3VpZFs4MF07CglUUkFDRSgiKCVzICVwIDB4JTA4eClzdHViXG4iLCBkZWJ1Z3N0cl9ndWlkKGd1aWQpLCBzdHIsIGNtYXgpOwoKCWlmIChXSU5FX1N0cmluZ0Zyb21DTFNJRChndWlkLHhndWlkKSkgcmV0dXJuIDA7CglpZiAoc3RybGVuKHhndWlkKT49Y21heCkgcmV0dXJuIDA7CglzdHJjcHkoc3RyLHhndWlkKTsKCXJldHVybiBzdHJsZW4oeGd1aWQpICsgMTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBTSExXQVBJXzI0CVtTSExXQVBJLjI0XQogKgogKiBOT1RFUwogKgljb252ZXJ0cyBhIGd1aWQgdG8gYSBzdHJpbmcKICoJcmV0dXJucyBzdHJsZW4oc3RyKQogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMjQgKAoJUkVGR1VJRCBndWlkLAkvKiBbaW5dICBjbHNpZCAqLwoJTFBXU1RSIHN0ciwJLyogW291dF0gYnVmZmVyICovCglJTlQgY21heCkJLyogW2luXSAgc2l6ZSBvZiBidWZmZXIgKi8KewoJVFJBQ0UoIiglcyAlcCAweCUwOHgpc3R1YlxuIiwgZGVidWdzdHJfZ3VpZChndWlkKSwgc3RyLCBjbWF4KTsKCXJldHVybiBTdHJpbmdGcm9tR1VJRDIoZ3VpZCwgc3RyLCBjbWF4KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBTSExXQVBJXzE1NglbU0hMV0FQSV0KICoKICogRklYTUU6IGZ1bmN0aW9uIGd1ZXNzZWQKICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzE1NiAoCglMUFdTVFIgc3RyMSwJLyogInNoZWxsMzIuZGxsIiAqLwoJTFBXU1RSIHN0cjIpCS8qICJzaGVsbDMyLmRsbCIgKi8KewoJRklYTUUoIiglcyAlcylzdHViXG4iLGRlYnVnc3RyX3coc3RyMSksZGVidWdzdHJfdyhzdHIyKSk7CglyZXR1cm4gbHN0cmNtcFcoc3RyMSxzdHIyKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBTSExXQVBJXzE2OQlbU0hMV0FQSV0KICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzE2OSAoSVVua25vd24gKiBscFVua25vd24pCnsKCVRSQUNFKCIoJXApXG4iLGxwVW5rbm93bik7CiNpZiAwCglpZighbHBVbmtub3duIHx8ICEqKChMUERXT1JEKWxwVW5rbm93bikpIHJldHVybiAwOwoJcmV0dXJuIElVbmtub3duX1JlbGVhc2UobHBVbmtub3duKTsKI2VuZGlmCglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBTSExXQVBJXzE5MwlbU0hMV0FQSV0KICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzE5MyAoKQp7CglIREMgaGRjOwoJRFdPUkQgcmV0OwoKCVRSQUNFKCIoKVxuIik7CgoJaGRjID0gR2V0REMoMCk7CglyZXQgPSBHZXREZXZpY2VDYXBzKGhkYywgQklUU1BJWEVMKSAqIEdldERldmljZUNhcHMoaGRjLCBQTEFORVMpOwoJUmVsZWFzZURDKDAsIGhkYyk7CglyZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIFNITFdBUElfMjE5CVtTSExXQVBJXQogKgogKiBOT1RFUwogKiAgZXJyb3IgY29kZXM6IEVfUE9JTlRFUiwgRV9OT0lOVEVSRkFDRQogKi8KSFJFU1VMVCBXSU5BUEkgU0hMV0FQSV8yMTkgKAoJTFBWT0lEIHcsIC8qIHJldHVybmVkIGJ5IExvY2FsQWxsb2MsIDB4NDUwIGJ5dGVzLCBpZmFjZSAqLwoJTFBWT0lEIHgsCglMUFZPSUQgeSwKCUxQV1NUUiB6KSAvKiBPVVQ6IHBhdGggKi8KewoJRklYTUUoIiglcCAlcCAlcCAlcClzdHViXG4iLHcseCx5LHopOwoJcmV0dXJuIDB4YWJiYTEyNTI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgU0hMV0FQSV8yMjIJW1NITFdBUEldCiAqCiAqIE5PVEVTCiAqICBzZWN1cml0eWF0dHJpYnV0ZXMgbWlzc2luZwogKi8KSEFORExFIFdJTkFQSSBTSExXQVBJXzIyMiAoTFBDTFNJRCBndWlkKQp7CgljaGFyIGxwc3RyTmFtZVs4MF07CglzdHJjcHkoIGxwc3RyTmFtZSwic2hlbGwuIik7CglXSU5FX1N0cmluZ0Zyb21DTFNJRChndWlkLCBscHN0ck5hbWUgKyBzdHJsZW4obHBzdHJOYW1lKSk7CgoJRklYTUUoIiglcykgc3R1YlxuIiwgbHBzdHJOYW1lKTsKCXJldHVybiBDcmVhdGVTZW1hcGhvcmVBKE5VTEwsMCwgMHg3ZmZmZmZmZiwgbHBzdHJOYW1lKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBTSExXQVBJXzIyMwlbU0hMV0FQSV0KICoKICogTk9URVMKICogIGdldCB0aGUgY291bnQgb2YgdGhlIHNlbWFwaG9yZQogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMjIzIChIQU5ETEUgaGFuZGxlKQp7CglEV09SRCBvbGRDb3VudDsKCQoJRklYTUUoIigweCUwOHgpIHN0dWJcbiIsaGFuZGxlKTsKCglSZWxlYXNlU2VtYXBob3JlKCBoYW5kbGUsIDEsICZvbGRDb3VudCk7CS8qICsxICovCglXYWl0Rm9yU2luZ2xlT2JqZWN0KCBoYW5kbGUsIDAgKTsJCS8qIC0xICovCglyZXR1cm4gb2xkQ291bnQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgU0hMV0FQSV8yMzcJW1NITFdBUEldCiAqCiAqIE5PVEVTCiAqICBjaGVja3MgaWYgYSBjbGFzcyBpcyByZWdpc3RlcmVkLCBpZiBub3QgaXQgcmVnaXN0ZXJzIGl0CiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8yMzcgKFdORENMQVNTVyAqIGxwV25kQ2xhc3MpCnsKCVdORENMQVNTVyBXbmRDbGFzczsKCQoJVFJBQ0UoIigweCUwOHggJXMpXG4iLGxwV25kQ2xhc3MtPmhJbnN0YW5jZSwgZGVidWdzdHJfdyhscFduZENsYXNzLT5scHN6Q2xhc3NOYW1lKSk7CgoJaWYgKCFHZXRDbGFzc0luZm9XKGxwV25kQ2xhc3MtPmhJbnN0YW5jZSwgbHBXbmRDbGFzcy0+bHBzekNsYXNzTmFtZSwgJlduZENsYXNzKSkKCXsKCSAgcmV0dXJuIFJlZ2lzdGVyQ2xhc3NXKGxwV25kQ2xhc3MpOwoJfQoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgU0hMV0FQSV8yNDEJW1NITFdBUEldCiAqCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8yNDEgKCkKewoJRklYTUUoIigpc3R1YlxuIik7CglyZXR1cm4gMHhhYmJhMTI0MzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBTSExXQVBJXzI2NglbU0hMV0FQSV0KICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzI2NiAoCglMUFZPSUQgdywKCUxQVk9JRCB4LAoJTFBWT0lEIHksCglMUFZPSUQgeikKewoJRklYTUUoIiglcCAlcCAlcCAlcClzdHViXG4iLHcseCx5LHopOwoJcmV0dXJuIDB4YWJiYTEyNDg7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgU0hMV0FQSV8yNjcJW1NITFdBUEldCiAqLwpIUkVTVUxUIFdJTkFQSSBTSExXQVBJXzI2NyAoCglMUFZPSUQgdywgLyogc2FtZSBhcyAxdGggcGFyYW1ldGVyIG9mIFNITFdBUElfMjE5ICovCglMUFZPSUQgeCwgLyogc2FtZSBhcyAybmQgcGFyYW1ldGVyIG9mIFNITFdBUElfMjE5ICovCglMUFZPSUQgeSwKCUxQVk9JRCB6KQp7CglGSVhNRSgiKCVwICVwICVwICVwKXN0dWJcbiIsdyx4LHkseik7CgkqKChMUERXT1JEKXopID0gMHhhYmJhMTIwMDsKCXJldHVybiAweGFiYmExMjU0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIFNITFdBUElfMjY4CVtTSExXQVBJXQogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMjY4ICgKCUxQVk9JRCB3LAoJTFBWT0lEIHgpCnsKCUZJWE1FKCIoJXAgJXApXG4iLHcseCk7CglyZXR1cm4gMHhhYmJhMTI1MTsgLyogMCA9IGZhaWx1cmUgKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBTSExXQVBJXzI3NglbU0hMV0FQSV0KICoKICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzI3NiAoKQp7CglGSVhNRSgiKClzdHViXG4iKTsKCXJldHVybiAweGFiYmExMjQ0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIFNITFdBUElfMzA5CVtTSExXQVBJXQogKgogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMzA5IChMUFZPSUQgeCkKewoJRklYTUUoIiglcClzdHViXG4iLHgpOwoJcmV0dXJuIDB4YWJiYTEyNDU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgU0hMV0FQSV8zNDIJW1NITFdBUEldCiAqCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8zNDIgKAoJTFBWT0lEIHcsCglMUFZPSUQgeCwKCUxQVk9JRCB5LAoJTFBWT0lEIHopCnsKCUZJWE1FKCIoJXAgJXAgJXAgJXApc3R1YlxuIix3LHgseSx6KTsKCXJldHVybiAweGFiYmExMjQ5Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIFNITFdBUElfMzQ2CVtTSExXQVBJXQogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMzQ2ICgKCUxQQ1dTVFIgc3JjLAoJTFBXU1RSIGRlc3QsCglpbnQgbGVuKQp7CglGSVhNRSgiKCVzICVwIDB4JTA4eClzdHViXG4iLGRlYnVnc3RyX3coc3JjKSxkZXN0LGxlbik7Cglsc3RyY3B5blcoZGVzdCwgc3JjLCBsZW4pOwoJcmV0dXJuIGxzdHJsZW5XKGRlc3QpKzE7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIFNITFdBUElfMzc3CVtTSExXQVBJXQogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMzc3IChMUFZPSUQgeCwgTFBWT0lEIHksIExQVk9JRCB6KQp7CglGSVhNRSgiKCVwICVwICVwKXN0dWJcbiIsIHgseSx6KTsKCXJldHVybiAweGFiYmExMjQ2Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIFNITFdBUElfNDM3CVtTSExXQVBJXQogKgogKiBOT1RFUwogKiAgaGFzIHRvIGRvIHNvbWV0aGluZyB3aXRoIHN3aXRjaGluZyB0aGUgYXBpIGJldHdlZW4gYXNjaWkgYW5kIHVuaWNvZGUKICogIG9ic2VydmVkIHZhbHVlczogMCBhbmQgNQogKgogKiBhY2Nlc3NlcwogKiBIS0xNXFN5c3RlbVxDdXJyZW50Q29udHJvbFNldFxDb250cm9sXFByb2R1Y3RPcHRpb25zCiAqCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV80MzcgKERXT1JEIHgpCnsKCUZJWE1FKCIoMHglMDhseClzdHViXG4iLCB4KTsKCXJldHVybiAweGFiYmExMjQ3Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIHduc3ByaW50ZkEJW1NITFdBUEldCiAqLwppbnQgV0lOQVBJViB3bnNwcmludGZBKExQU1RSIGxwT3V0LCBpbnQgY2NoTGltaXRJbiwgTFBDU1RSIGxwRm10LCAuLi4pCnsKICAgIHZhX2xpc3QgdmFsaXN0OwogICAgSU5UIHJlczsKCiAgICB2YV9zdGFydCggdmFsaXN0LCBscEZtdCApOwogICAgcmVzID0gd3ZzbnByaW50ZkEoIGxwT3V0LCBjY2hMaW1pdEluLCBscEZtdCwgdmFsaXN0ICk7CiAgICB2YV9lbmQoIHZhbGlzdCApOwogICAgcmV0dXJuIHJlczsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICB3bnNwcmludGZXCVtTSExXQVBJXQogKi8KaW50IFdJTkFQSVYgd25zcHJpbnRmVyhMUFdTVFIgbHBPdXQsIGludCBjY2hMaW1pdEluLCBMUENXU1RSIGxwRm10LCAuLi4pCnsKICAgIHZhX2xpc3QgdmFsaXN0OwogICAgSU5UIHJlczsKCiAgICB2YV9zdGFydCggdmFsaXN0LCBscEZtdCApOwogICAgcmVzID0gd3ZzbnByaW50ZlcoIGxwT3V0LCBjY2hMaW1pdEluLCBscEZtdCwgdmFsaXN0ICk7CiAgICB2YV9lbmQoIHZhbGlzdCApOwogICAgcmV0dXJuIHJlczsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIFVybEVzY2FwZUEJW1NITFdBUEldCiAqLwpIUkVTVUxUIFdJTkFQSSBVcmxFc2NhcGVBKAoJTFBDU1RSIHBzelVybCwKCUxQU1RSIHBzekVzY2FwZWQsCglMUERXT1JEIHBjY2hFc2NhcGVkLAoJRFdPUkQgZHdGbGFncykKewoJRklYTUUoIiglcyAlcCAlcCAweCUwOGx4KXN0dWJcbiIsZGVidWdzdHJfYShwc3pVcmwpLAoJICBwc3pFc2NhcGVkLCBwY2NoRXNjYXBlZCwgZHdGbGFncyk7CglyZXR1cm4gMDsKfQkKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgVXJsRXNjYXBlVwlbU0hMV0FQSV0KICovCkhSRVNVTFQgV0lOQVBJIFVybEVzY2FwZVcoCglMUENXU1RSIHBzelVybCwKCUxQV1NUUiBwc3pFc2NhcGVkLAoJTFBEV09SRCBwY2NoRXNjYXBlZCwKCURXT1JEIGR3RmxhZ3MpCnsKCUZJWE1FKCIoJXMgJXAgJXAgMHglMDhseClzdHViXG4iLGRlYnVnc3RyX3cocHN6VXJsKSwKCSAgcHN6RXNjYXBlZCwgcGNjaEVzY2FwZWQsIGR3RmxhZ3MpOwoJcmV0dXJuIDA7Cn0JCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIFNIRUxMMzJfNzE0CVtTSEVMTDMyXQogKi8KRFdPUkQgV0lOQVBJIFNIRUxMMzJfNzE0KExQVk9JRCB4KQp7CiAJRklYTUUoIiglcylzdHViXG4iLCBkZWJ1Z3N0cl93KHgpKTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIFNISXNMb3dNZW1vcnlNYWNoaW5lCVtTSExXQVBJLkBdCiAqLwpEV09SRCBXSU5BUEkgU0hJc0xvd01lbW9yeU1hY2hpbmUgKERXT1JEIHgpCnsKCUZJWE1FKCIweCUwOGx4XG4iLCB4KTsKCXJldHVybiAwOwp9Cgo=