LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDE2IFJheW1vbmQgQXVn6SBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogKgogKiBDb250cmlidXRvcnM6CiAqICAgICBSYXltb25kIEF1Z+kgPHJheW1vbmQuYXVnZUBsaWZlcmF5LmNvbT4gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5zZXJ2bGV0LnRlc3RzLnV0aWw7CgppbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwppbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwppbXBvcnQgamF2YS51dGlsLk1hcDsKCnB1YmxpYyBjbGFzcyBFdmVudEhhbmRsZXIgewoKCXB1YmxpYyB2b2lkIGNsb3NlKCkgewoJCXRyeSB7CgkJCXRocmVhZC5qb2luKCk7CgkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewoJCQllLnByaW50U3RhY2tUcmFjZSgpOwoJCX0KCX0KCglwdWJsaWMgdm9pZCBoYW5kbGUoTWFwPFN0cmluZywgU3RyaW5nPiBldmVudE1hcCkgewoJCVN5c3RlbS5vdXQucHJpbnRsbigiPT1ldmVudD09XG4iICsgZXZlbnRNYXAuZ2V0KCJkYXRhIikpOwoJfQoKCXB1YmxpYyB2b2lkIG9wZW4oZmluYWwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKCQlSdW5uYWJsZSBzdHJlYW1Qcm9jZXNzb3JUaHJlYWQgPSBuZXcgUnVubmFibGUoKSB7CgoJCQlAT3ZlcnJpZGUKCQkJcHVibGljIHZvaWQgcnVuKCkgewoJCQkJU3lzdGVtLm91dC5wcmludGxuKCI9PWV2ZW50IHN0cmVhbSBvcGVuZWQ9PSIpOwoKCQkJCS8vIFJlZjogaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvY29tbXMuaHRtbCNzZXJ2ZXItc2VudC1ldmVudHMKCgkJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGV2ZW50TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CgoJCQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbnB1dFN0cmVhbSkpOwoKCQkJCVN0cmluZyBjdXJyZW50OwoKCQkJCXRyeSB7CgkJCQkJd2hpbGUgKChjdXJyZW50ID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKCQkJCQkJaWYgKGN1cnJlbnQubGVuZ3RoKCkgPT0gMCkgewoJCQkJCQkJaGFuZGxlKGV2ZW50TWFwKTsKCgkJCQkJCQlldmVudE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwoKCQkJCQkJCWNvbnRpbnVlOwoJCQkJCQl9CgoJCQkJCQlpbnQgY29sb24gPSBjdXJyZW50LmluZGV4T2YoJ1x1MDAzQScpOwoKCQkJCQkJaWYgKGNvbG9uID09IDApIHsKCQkJCQkJCS8vIGlnbm9yZSBjb21tZW50IGxpbmVzCgoJCQkJCQkJY29udGludWU7CgkJCQkJCX0KCQkJCQkJZWxzZSBpZiAoY29sb24gPCAwKSB7CgkJCQkJCQkvLyBObyBjb2xvbj8gRW50aXJlIGxpbmUgbXVzdCBiZSB0cmVhdGVkIGFzIHRoZSBrZXkgd2l0aCBibGFuayB2YWx1ZQoKCQkJCQkJCWV2ZW50TWFwLnB1dChjdXJyZW50LCAiIik7CgoJCQkJCQkJY29udGludWU7CgkJCQkJCX0KCgkJCQkJCVN0cmluZyBrZXkgPSBjdXJyZW50LnN1YnN0cmluZygwLCBjb2xvbik7CgkJCQkJCVN0cmluZyB2YWx1ZSA9IGN1cnJlbnQuc3Vic3RyaW5nKGNvbG9uICsgMSk7CgoJCQkJCQlpZiAodmFsdWUuc3RhcnRzV2l0aCgiXHUwMDIwIikpIHsKCQkJCQkJCXZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDEpOwoJCQkJCQl9CgoJCQkJCQlpZiAoZXZlbnRNYXAuY29udGFpbnNLZXkoa2V5KSkgewoJCQkJCQkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IGV2ZW50TWFwLmdldChrZXkpOwoKCQkJCQkJCXZhbHVlID0gY3VycmVudFZhbHVlICsgJ1xuJyArIHZhbHVlOwoJCQkJCQl9CgoJCQkJCQlldmVudE1hcC5wdXQoa2V5LCB2YWx1ZSk7CgkJCQkJfQoJCQkJfQoJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwoJCQkJfQoJCQkJZmluYWxseSB7CgkJCQkJdHJ5IHsKCQkJCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKCQkJCQl9CgkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKCQkJCQl9CgkJCQl9CgoJCQkJLy8gSWdub3JlIHJlbWFpbmluZyBjb250ZW50IHdoaWNoIGlzIG5vdCBhIHdlbGwgZm9ybWVkIGV2ZW50CgoJCQkJU3lzdGVtLm91dC5wcmludGxuKCI9PWV2ZW50IHN0cmVhbSBjbG9zZWQ9PSIpOwoJCQl9CgoJCX07CgoJCXRocmVhZCA9IG5ldyBUaHJlYWQoc3RyZWFtUHJvY2Vzc29yVGhyZWFkKTsKCgkJdGhyZWFkLnN0YXJ0KCk7Cgl9CgoJcHJpdmF0ZSBUaHJlYWQgdGhyZWFkOwoKfQ==