LyogU2ltcGxlIEFKQVggQ29kZS1LaXQgKFNBQ0spIHYxLjYuMSAqLwovKiCpMjAwNSBHcmVnb3J5IFdpbGQtU21pdGggKi8KLyogd3d3LnR3aWxpZ2h0dW5pdmVyc2UuY29tICovCi8qIFNvZnR3YXJlIGxpY2VuY2VkIHVuZGVyIGEgbW9kaWZpZWQgWDExIGxpY2VuY2UsCiAgIHNlZSBkb2N1bWVudGF0aW9uIG9yIGF1dGhvcnMgd2Vic2l0ZSBmb3IgbW9yZSBkZXRhaWxzICovCgpmdW5jdGlvbiBzYWNrKGZpbGUpIHsKCXRoaXMueG1saHR0cCA9IG51bGw7CgoJdGhpcy5yZXNldERhdGEgPSBmdW5jdGlvbigpIHsKCQl0aGlzLm1ldGhvZCA9ICJQT1NUIjsKICAJCXRoaXMucXVlcnlTdHJpbmdTZXBhcmF0b3IgPSAiPyI7CgkJdGhpcy5hcmd1bWVudFNlcGFyYXRvciA9ICImIjsKCQl0aGlzLlVSTFN0cmluZyA9ICIiOwoJCXRoaXMuZW5jb2RlVVJJU3RyaW5nID0gdHJ1ZTsKICAJCXRoaXMuZXhlY3V0ZSA9IGZhbHNlOwogIAkJdGhpcy5lbGVtZW50ID0gbnVsbDsKCQl0aGlzLmVsZW1lbnRPYmogPSBudWxsOwoJCXRoaXMucmVxdWVzdEZpbGUgPSBmaWxlOwoJCXRoaXMudmFycyA9IG5ldyBPYmplY3QoKTsKCQl0aGlzLnJlc3BvbnNlU3RhdHVzID0gbmV3IEFycmF5KDIpOwogIAl9OwoKCXRoaXMucmVzZXRGdW5jdGlvbnMgPSBmdW5jdGlvbigpIHsKICAJCXRoaXMub25Mb2FkaW5nID0gZnVuY3Rpb24oKSB7IH07CiAgCQl0aGlzLm9uTG9hZGVkID0gZnVuY3Rpb24oKSB7IH07CiAgCQl0aGlzLm9uSW50ZXJhY3RpdmUgPSBmdW5jdGlvbigpIHsgfTsKICAJCXRoaXMub25Db21wbGV0aW9uID0gZnVuY3Rpb24oKSB7IH07CiAgCQl0aGlzLm9uRXJyb3IgPSBmdW5jdGlvbigpIHsgfTsKCQl0aGlzLm9uRmFpbCA9IGZ1bmN0aW9uKCkgeyB9OwoJfTsKCgl0aGlzLnJlc2V0ID0gZnVuY3Rpb24oKSB7CgkJdGhpcy5yZXNldEZ1bmN0aW9ucygpOwoJCXRoaXMucmVzZXREYXRhKCk7Cgl9OwoKCXRoaXMuY3JlYXRlQUpBWCA9IGZ1bmN0aW9uKCkgewoJCXRyeSB7CgkJCXRoaXMueG1saHR0cCA9IG5ldyBBY3RpdmVYT2JqZWN0KCJNc3htbDIuWE1MSFRUUCIpOwoJCX0gY2F0Y2ggKGUxKSB7CgkJCXRyeSB7CgkJCQl0aGlzLnhtbGh0dHAgPSBuZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKTsKCQkJfSBjYXRjaCAoZTIpIHsKCQkJCXRoaXMueG1saHR0cCA9IG51bGw7CgkJCX0KCQl9CgoJCWlmICghIHRoaXMueG1saHR0cCkgewoJCQlpZiAodHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9ICJ1bmRlZmluZWQiKSB7CgkJCQl0aGlzLnhtbGh0dHAgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKCQkJfSBlbHNlIHsKCQkJCXRoaXMuZmFpbGVkID0gdHJ1ZTsKCQkJfQoJCX0KCX07CgoJdGhpcy5zZXRWYXIgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSl7CgkJdGhpcy52YXJzW25hbWVdID0gQXJyYXkodmFsdWUsIGZhbHNlKTsKCX07CgoJdGhpcy5lbmNWYXIgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcmV0dXJudmFycykgewoJCWlmICh0cnVlID09IHJldHVybnZhcnMpIHsKCQkJcmV0dXJuIEFycmF5KGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSwgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKSk7CgkJfSBlbHNlIHsKCQkJdGhpcy52YXJzW2VuY29kZVVSSUNvbXBvbmVudChuYW1lKV0gPSBBcnJheShlbmNvZGVVUklDb21wb25lbnQodmFsdWUpLCB0cnVlKTsKCQl9Cgl9CgoJdGhpcy5wcm9jZXNzVVJMU3RyaW5nID0gZnVuY3Rpb24oc3RyaW5nLCBlbmNvZGUpIHsKCQllbmNvZGVkID0gZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuYXJndW1lbnRTZXBhcmF0b3IpOwoJCXJlZ2V4cCA9IG5ldyBSZWdFeHAodGhpcy5hcmd1bWVudFNlcGFyYXRvciArICJ8IiArIGVuY29kZWQpOwoJCXZhckFycmF5ID0gc3RyaW5nLnNwbGl0KHJlZ2V4cCk7CgkJZm9yIChpID0gMDsgaSA8IHZhckFycmF5Lmxlbmd0aDsgaSsrKXsKCQkJdXJsVmFycyA9IHZhckFycmF5W2ldLnNwbGl0KCI9Iik7CgkJCWlmICh0cnVlID09IGVuY29kZSl7CgkJCQl0aGlzLmVuY1Zhcih1cmxWYXJzWzBdLCB1cmxWYXJzWzFdKTsKCQkJfSBlbHNlIHsKCQkJCXRoaXMuc2V0VmFyKHVybFZhcnNbMF0sIHVybFZhcnNbMV0pOwoJCQl9CgkJfQoJfQoKCXRoaXMuY3JlYXRlVVJMU3RyaW5nID0gZnVuY3Rpb24odXJsc3RyaW5nKSB7CgkJaWYgKHRoaXMuZW5jb2RlVVJJU3RyaW5nICYmIHRoaXMuVVJMU3RyaW5nLmxlbmd0aCkgewoJCQl0aGlzLnByb2Nlc3NVUkxTdHJpbmcodGhpcy5VUkxTdHJpbmcsIHRydWUpOwoJCX0KCgkJaWYgKHVybHN0cmluZykgewoJCQlpZiAodGhpcy5VUkxTdHJpbmcubGVuZ3RoKSB7CgkJCQl0aGlzLlVSTFN0cmluZyArPSB0aGlzLmFyZ3VtZW50U2VwYXJhdG9yICsgdXJsc3RyaW5nOwoJCQl9IGVsc2UgewoJCQkJdGhpcy5VUkxTdHJpbmcgPSB1cmxzdHJpbmc7CgkJCX0KCQl9CgoJCS8vIHByZXZlbnRzIGNhY2hpbmcgb2YgVVJMU3RyaW5nCgkJdGhpcy5zZXRWYXIoInJuZHZhbCIsIG5ldyBEYXRlKCkuZ2V0VGltZSgpKTsKCgkJdXJsc3RyaW5ndGVtcCA9IG5ldyBBcnJheSgpOwoJCWZvciAoa2V5IGluIHRoaXMudmFycykgewoJCQlpZiAoZmFsc2UgPT0gdGhpcy52YXJzW2tleV1bMV0gJiYgdHJ1ZSA9PSB0aGlzLmVuY29kZVVSSVN0cmluZykgewoJCQkJZW5jb2RlZCA9IHRoaXMuZW5jVmFyKGtleSwgdGhpcy52YXJzW2tleV1bMF0sIHRydWUpOwoJCQkJZGVsZXRlIHRoaXMudmFyc1trZXldOwoJCQkJdGhpcy52YXJzW2VuY29kZWRbMF1dID0gQXJyYXkoZW5jb2RlZFsxXSwgdHJ1ZSk7CgkJCQlrZXkgPSBlbmNvZGVkWzBdOwoJCQl9CgoJCQl1cmxzdHJpbmd0ZW1wW3VybHN0cmluZ3RlbXAubGVuZ3RoXSA9IGtleSArICI9IiArIHRoaXMudmFyc1trZXldWzBdOwoJCX0KCQlpZiAodXJsc3RyaW5nKXsKCQkJdGhpcy5VUkxTdHJpbmcgKz0gdGhpcy5hcmd1bWVudFNlcGFyYXRvciArIHVybHN0cmluZ3RlbXAuam9pbih0aGlzLmFyZ3VtZW50U2VwYXJhdG9yKTsKCQl9IGVsc2UgewoJCQl0aGlzLlVSTFN0cmluZyArPSB1cmxzdHJpbmd0ZW1wLmpvaW4odGhpcy5hcmd1bWVudFNlcGFyYXRvcik7CgkJfQoJfQoKCXRoaXMucnVuUmVzcG9uc2UgPSBmdW5jdGlvbigpIHsKCQlldmFsKHRoaXMucmVzcG9uc2UpOwoJfQoKCXRoaXMucnVuQUpBWCA9IGZ1bmN0aW9uKHVybHN0cmluZykgewoJCWlmICh0aGlzLmZhaWxlZCkgewoJCQl0aGlzLm9uRmFpbCgpOwoJCX0gZWxzZSB7CgkJCXRoaXMuY3JlYXRlVVJMU3RyaW5nKHVybHN0cmluZyk7CgkJCWlmICh0aGlzLmVsZW1lbnQpIHsKCQkJCXRoaXMuZWxlbWVudE9iaiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZWxlbWVudCk7CgkJCX0KCQkJaWYgKHRoaXMueG1saHR0cCkgewoJCQkJdmFyIHNlbGYgPSB0aGlzOwoJCQkJaWYgKHRoaXMubWV0aG9kID09ICJHRVQiKSB7CgkJCQkJdG90YWx1cmxzdHJpbmcgPSB0aGlzLnJlcXVlc3RGaWxlICsgdGhpcy5xdWVyeVN0cmluZ1NlcGFyYXRvciArIHRoaXMuVVJMU3RyaW5nOwoJCQkJCXRoaXMueG1saHR0cC5vcGVuKHRoaXMubWV0aG9kLCB0b3RhbHVybHN0cmluZywgdHJ1ZSk7CgkJCQl9IGVsc2UgewoJCQkJCXRoaXMueG1saHR0cC5vcGVuKHRoaXMubWV0aG9kLCB0aGlzLnJlcXVlc3RGaWxlLCB0cnVlKTsKCQkJCQl0cnkgewoJCQkJCQl0aGlzLnhtbGh0dHAuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpCgkJCQkJfSBjYXRjaCAoZSkgeyB9CgkJCQl9CgoJCQkJdGhpcy54bWxodHRwLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkgewoJCQkJCXN3aXRjaCAoc2VsZi54bWxodHRwLnJlYWR5U3RhdGUpIHsKCQkJCQkJY2FzZSAxOgoJCQkJCQkJc2VsZi5vbkxvYWRpbmcoKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlIDI6CgkJCQkJCQlzZWxmLm9uTG9hZGVkKCk7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAzOgoJCQkJCQkJc2VsZi5vbkludGVyYWN0aXZlKCk7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSA0OgoJCQkJCQkJc2VsZi5yZXNwb25zZSA9IHNlbGYueG1saHR0cC5yZXNwb25zZVRleHQ7CgkJCQkJCQlzZWxmLnJlc3BvbnNlWE1MID0gc2VsZi54bWxodHRwLnJlc3BvbnNlWE1MOwoJCQkJCQkJc2VsZi5yZXNwb25zZVN0YXR1c1swXSA9IHNlbGYueG1saHR0cC5zdGF0dXM7CgkJCQkJCQlzZWxmLnJlc3BvbnNlU3RhdHVzWzFdID0gc2VsZi54bWxodHRwLnN0YXR1c1RleHQ7CgoJCQkJCQkJaWYgKHNlbGYuZXhlY3V0ZSkgewoJCQkJCQkJCXNlbGYucnVuUmVzcG9uc2UoKTsKCQkJCQkJCX0KCgkJCQkJCQlpZiAoc2VsZi5lbGVtZW50T2JqKSB7CgkJCQkJCQkJZWxlbU5vZGVOYW1lID0gc2VsZi5lbGVtZW50T2JqLm5vZGVOYW1lOwoJCQkJCQkJCWVsZW1Ob2RlTmFtZS50b0xvd2VyQ2FzZSgpOwoJCQkJCQkJCWlmIChlbGVtTm9kZU5hbWUgPT0gImlucHV0IgoJCQkJCQkJCXx8IGVsZW1Ob2RlTmFtZSA9PSAic2VsZWN0IgoJCQkJCQkJCXx8IGVsZW1Ob2RlTmFtZSA9PSAib3B0aW9uIgoJCQkJCQkJCXx8IGVsZW1Ob2RlTmFtZSA9PSAidGV4dGFyZWEiKSB7CgkJCQkJCQkJCXNlbGYuZWxlbWVudE9iai52YWx1ZSA9IHNlbGYucmVzcG9uc2U7CgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJc2VsZi5lbGVtZW50T2JqLmlubmVySFRNTCA9IHNlbGYucmVzcG9uc2U7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJaWYgKHNlbGYucmVzcG9uc2VTdGF0dXNbMF0gPT0gIjIwMCIpIHsKCQkJCQkJCQlzZWxmLm9uQ29tcGxldGlvbigpOwoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQlzZWxmLm9uRXJyb3IoKTsKCQkJCQkJCX0KCgkJCQkJCQlzZWxmLlVSTFN0cmluZyA9ICIiOwoJCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfTsKCgkJCQl0aGlzLnhtbGh0dHAuc2VuZCh0aGlzLlVSTFN0cmluZyk7CgkJCX0KCQl9Cgl9OwoKCXRoaXMucmVzZXQoKTsKCXRoaXMuY3JlYXRlQUpBWCgpOwp9Cg==