LyoKICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkudGFncy5pbnRlcmFjdGlvbjsKCmltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwppbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CgppbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmplbGx5LlRhZ1N1cHBvcnQ7CmltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuWE1MT3V0cHV0OwoKLyoqCiAqIEplbGx5IFRhZyB0aGF0IGFza3MgdGhlIHVzZXIgYSBxdWVzdGlvbiwgYW5kIHB1dHMgaGlzIGFuc3dlciBpbnRvCiAqIGEgdmFyaWFibGUsIHdpdGggdGhlIGF0dHJpYnV0ZSAiYW5zd2VyIi4KICogVGhpcyB2YXJpYWJsZSBtYXkgYmUgcmV1c2VkIGZ1cnRoZXIgYXMgYW55IG90aGVyIEplbGx5IHZhcmlhYmxlLgogKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzbW9yQGhhc2dhcmQubmV0Ij5TdOlwaGFuZSBNb3I8L2E+CiAqLwpwdWJsaWMgY2xhc3MgQXNrVGFnIGV4dGVuZHMgVGFnU3VwcG9ydAp7CiAgICAvKiogVGhlIHF1ZXN0aW9uIHRvIGFzayB0byB0aGUgdXNlciAqLwogICAgcHJpdmF0ZSBTdHJpbmcgcXVlc3Rpb247CgogICAgLyoqCiAgICAgKiBUaGUgdmFyaWFibGUgaW4gd2hpY2ggd2Ugd2lsbCBzdG9jayB0aGUgdXNlcidzIGlucHV0LgogICAgICogVGhpcyBkZWZhdWx0cyB0byAiaW50ZXJhY3QuYW5zd2VyIi4KICAgICAqLwogICAgcHJpdmF0ZSBTdHJpbmcgYW5zd2VyID0gImludGVyYWN0LmFuc3dlciI7CgogICAgLyoqIFRoZSBkZWZhdWx0IHZhbHVlLCBpZiB0aGUgdXNlciBkb2Vzbid0IGFuc3dlciAqLwogICAgcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdElucHV0OwoKICAgIC8qKiBUaGUgdXNlcidzIGlucHV0ICovCiAgICBwcml2YXRlIFN0cmluZyBpbnB1dCA9ICIiOwoKICAgIC8qKiBUaGUgcHJvbXB0IHRvIGRpc3BsYXkgYmVmb3JlIHRoZSB1c2VyIGlucHV0ICovCiAgICBwcml2YXRlIFN0cmluZyBwcm9tcHQgPSAiPiI7CgogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBxdWVzdGlvbiB0byBhc2sgdG8gdGhlIHVzZXIuIElmIGEgImRlZmF1bHQiIGF0dHJpYnV0ZQogICAgICogaXMgcHJlc2VudCwgaXQgd2lsbCBhcHBlYXIgaW5zaWRlIFtdLgogICAgICogQHBhcmFtIHF1ZXN0aW9uIFRoZSBxdWVzdGlvbiB0byBhc2sgdG8gdGhlIHVzZXIKICAgICAqLwogICAgcHVibGljIHZvaWQgc2V0UXVlc3Rpb24oU3RyaW5nIHF1ZXN0aW9uKQogICAgewogICAgICAgIHRoaXMucXVlc3Rpb24gPSBxdWVzdGlvbjsKICAgIH0KCiAgICAvKioKICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRoYXQgd2lsbCBob2xkIHRoZSBhbnN3ZXIKICAgICAqIFRoaXMgZGVmYXVsdHMgdG8gImludGVyYWN0LmFuc3dlciIuCiAgICAgKiBAcGFyYW0gYW5zd2VyIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0aGF0IHdpbGwgaG9sZCB0aGUgYW5zd2VyCiAgICAgKi8KICAgIHB1YmxpYyB2b2lkIHNldEFuc3dlcihTdHJpbmcgYW5zd2VyKQogICAgewogICAgICAgIHRoaXMuYW5zd2VyID0gYW5zd2VyOwogICAgfQoKICAgIC8qKgogICAgICogU2V0cyB0aGUgZGVmYXVsdCBhbnN3ZXIgdG8gdGhlIHF1ZXN0aW9uLgogICAgICogSWYgaXQgaXMgcHJlc2VudCwgaXQgd2lsbCBhcHBlYXIgaW5zaWRlIFtdLgogICAgICogQHBhcmFtIGRlZmF1bHQgdGhlIGRlZmF1bHQgYW5zd2VyIHRvIHRoZSBxdWVzdGlvbgogICAgICovCiAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBkZWZhdWx0SW5wdXQpCiAgICB7CiAgICAgICAgdGhpcy5kZWZhdWx0SW5wdXQgPSBkZWZhdWx0SW5wdXQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBwcm9tcHQgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBiZWZvcmUgdGhlIHVzZXIncyBpbnB1dC4KICAgICAqIEBwYXJhbSBwcm9tdCB0aGUgcHJvbXB0IHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgYmVmb3JlIHRoZSB1c2VyJ3MgaW5wdXQuCiAgICAgKi8KICAgIHB1YmxpYyB2b2lkIHNldFByb21wdChTdHJpbmcgcHJvbXB0KQogICAgewogICAgICAgIHRoaXMucHJvbXB0ID0gcHJvbXB0OwogICAgfQoKCiAgICAvKioKICAgICAqIFBlcmZvcm0gZnVuY3Rpb25hbGl0eSBwcm92aWRlZCBieSB0aGUgdGFnCiAgICAgKiBAcGFyYW0gb3V0cHV0IHRoZSBwbGFjZSB0byB3cml0ZSBvdXRwdXQKICAgICAqLwogICAgcHVibGljIHZvaWQgZG9UYWcoWE1MT3V0cHV0IG91dHB1dCkKICAgIHsKICAgICAgICBpZiAocXVlc3Rpb24gIT0gbnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChkZWZhdWx0SW5wdXQgIT0gbnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHF1ZXN0aW9uICsgIiBbIiArIGRlZmF1bHRJbnB1dCArICJdIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocXVlc3Rpb24pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFRoZSBwcm9tcHQgc2hvdWxkIGJlIGp1c3QgYmVmb3JlIHRoZSB1c2VyJ3MgaW5wdXQsCiAgICAgICAgICAgIC8vIGJ1dCBpdCBkb2Vzbid0IHdvcmsgLi4uCiAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludChwcm9tcHQgKyAiICIpOwogICAgICAgIH0KCiAgICAgICAgQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKFN5c3RlbS5pbikpOwoKICAgICAgICB0cnkgewogICAgICAgICAgICBpbnB1dCA9IGJyLnJlYWRMaW5lKCk7CiAgICAgICAgICAgIGlmIChkZWZhdWx0SW5wdXQgIT0gbnVsbCAmJiBpbnB1dC50cmltKCkuZXF1YWxzKCIiKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaW5wdXQgPSBkZWZhdWx0SW5wdXQ7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKICAgICAgICB9CiAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZShhbnN3ZXIsIGlucHV0KTsKICAgIH0KfQo=