LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3JwLiBhbmQgb3RoZXJzLgpBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUKd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKoApDb250cmlidXRvcnM6CiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbDsKCmltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDb25zdGFudFBvb2w7CmltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDb25zdGFudFBvb2xDb25zdGFudDsKaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNvbnN0YW50UG9vbEVudHJ5OwoKLyoqCiAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgSUNvbnN0YW50UG9vbC4KICovCnB1YmxpYyBjbGFzcyBDb25zdGFudFBvb2wgZXh0ZW5kcyBDbGFzc0ZpbGVTdHJ1Y3QgaW1wbGVtZW50cyBJQ29uc3RhbnRQb29sIHsKCQoJcHJpdmF0ZSBpbnQgY29uc3RhbnRQb29sQ291bnQ7Cglwcml2YXRlIGludFtdIGNvbnN0YW50UG9vbE9mZnNldDsKCXByaXZhdGUgYnl0ZVtdIGNsYXNzRmlsZUJ5dGVzOwoJcHJpdmF0ZSBDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudFBvb2xFbnRyeTsKCQoJQ29uc3RhbnRQb29sKGJ5dGVbXSByZWZlcmVuY2UsIGludFtdIGNvbnN0YW50UG9vbE9mZnNldCkgewoJCXRoaXMuY29uc3RhbnRQb29sQ291bnQgPSBjb25zdGFudFBvb2xPZmZzZXQubGVuZ3RoOwoJCXRoaXMuY29uc3RhbnRQb29sT2Zmc2V0ID0gY29uc3RhbnRQb29sT2Zmc2V0OwoJCXRoaXMuY2xhc3NGaWxlQnl0ZXMgPSByZWZlcmVuY2U7CgkJdGhpcy5jb25zdGFudFBvb2xFbnRyeSA9IG5ldyBDb25zdGFudFBvb2xFbnRyeSgpOwoJfQoKCS8qKgoJICogQHNlZSBJQ29uc3RhbnRQb29sI2RlY29kZUVudHJ5KGludCkKCSAqLwoJcHVibGljIElDb25zdGFudFBvb2xFbnRyeSBkZWNvZGVFbnRyeShpbnQgaW5kZXgpIHsKCQl0aGlzLmNvbnN0YW50UG9vbEVudHJ5LnJlc2V0KCk7CgkJaW50IGtpbmQgPSBnZXRFbnRyeUtpbmQoaW5kZXgpOwoJCXRoaXMuY29uc3RhbnRQb29sRW50cnkuc2V0S2luZChraW5kKTsKCQlzd2l0Y2goa2luZCkgewoJCQljYXNlIElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9DbGFzcyA6CgkJCQl0aGlzLmNvbnN0YW50UG9vbEVudHJ5LnNldENsYXNzSW5mb05hbWVJbmRleCh1MkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsICAxLCB0aGlzLmNvbnN0YW50UG9vbE9mZnNldFtpbmRleF0pKTsKCQkJCXRoaXMuY29uc3RhbnRQb29sRW50cnkuc2V0Q2xhc3NJbmZvTmFtZShnZXRVdGY4VmFsdWVBdCh0aGlzLmNvbnN0YW50UG9vbEVudHJ5LmdldENsYXNzSW5mb05hbWVJbmRleCgpKSk7CgkJCQlicmVhazsKCQkJY2FzZSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfRG91YmxlIDoKCQkJCXRoaXMuY29uc3RhbnRQb29sRW50cnkuc2V0RG91YmxlVmFsdWUoZG91YmxlQXQoY2xhc3NGaWxlQnl0ZXMsIDEsIHRoaXMuY29uc3RhbnRQb29sT2Zmc2V0W2luZGV4XSkpOwoJCQkJYnJlYWs7CgkJCWNhc2UgSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0ZpZWxkcmVmIDoKCQkJCXRoaXMuY29uc3RhbnRQb29sRW50cnkuc2V0Q2xhc3NJbmRleCh1MkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsICAxLCB0aGlzLmNvbnN0YW50UG9vbE9mZnNldFtpbmRleF0pKTsKCQkJCWludCBkZWNsYXJpbmdDbGFzc0luZGV4ID0gdTJBdCh0aGlzLmNsYXNzRmlsZUJ5dGVzLCAgMSwgdGhpcy5jb25zdGFudFBvb2xPZmZzZXRbdGhpcy5jb25zdGFudFBvb2xFbnRyeS5nZXRDbGFzc0luZGV4KCldKTsKCQkJCXRoaXMuY29uc3RhbnRQb29sRW50cnkuc2V0Q2xhc3NOYW1lKGdldFV0ZjhWYWx1ZUF0KGRlY2xhcmluZ0NsYXNzSW5kZXgpKTsKCQkJCXRoaXMuY29uc3RhbnRQb29sRW50cnkuc2V0TmFtZUFuZFR5cGVJbmRleCh1MkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsICAzLCB0aGlzLmNvbnN0YW50UG9vbE9mZnNldFtpbmRleF0pKTsKCQkJCWludCBmaWVsZE5hbWVJbmRleCA9IHUyQXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgIDEsIHRoaXMuY29uc3RhbnRQb29sT2Zmc2V0W3RoaXMuY29uc3RhbnRQb29sRW50cnkuZ2V0TmFtZUFuZFR5cGVJbmRleCgpXSk7CgkJCQlpbnQgZmllbGREZXNjcmlwdG9ySW5kZXggPSB1MkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsICAzLCB0aGlzLmNvbnN0YW50UG9vbE9mZnNldFt0aGlzLmNvbnN0YW50UG9vbEVudHJ5LmdldE5hbWVBbmRUeXBlSW5kZXgoKV0pOwoJCQkJdGhpcy5jb25zdGFudFBvb2xFbnRyeS5zZXRGaWVsZE5hbWUoZ2V0VXRmOFZhbHVlQXQoZmllbGROYW1lSW5kZXgpKTsKCQkJCXRoaXMuY29uc3RhbnRQb29sRW50cnkuc2V0RmllbGREZXNjcmlwdG9yKGdldFV0ZjhWYWx1ZUF0KGZpZWxkRGVzY3JpcHRvckluZGV4KSk7CgkJCQlicmVhazsKCQkJY2FzZSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfTWV0aG9kcmVmIDoKCQkJY2FzZSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfSW50ZXJmYWNlTWV0aG9kcmVmIDoKCQkJCXRoaXMuY29uc3RhbnRQb29sRW50cnkuc2V0Q2xhc3NJbmRleCh1MkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsICAxLCB0aGlzLmNvbnN0YW50UG9vbE9mZnNldFtpbmRleF0pKTsKCQkJCWRlY2xhcmluZ0NsYXNzSW5kZXggPSB1MkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsICAxLCB0aGlzLmNvbnN0YW50UG9vbE9mZnNldFt0aGlzLmNvbnN0YW50UG9vbEVudHJ5LmdldENsYXNzSW5kZXgoKV0pOwoJCQkJdGhpcy5jb25zdGFudFBvb2xFbnRyeS5zZXRDbGFzc05hbWUoZ2V0VXRmOFZhbHVlQXQoZGVjbGFyaW5nQ2xhc3NJbmRleCkpOwoJCQkJdGhpcy5jb25zdGFudFBvb2xFbnRyeS5zZXROYW1lQW5kVHlwZUluZGV4KHUyQXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgIDMsIHRoaXMuY29uc3RhbnRQb29sT2Zmc2V0W2luZGV4XSkpOwoJCQkJaW50IG1ldGhvZE5hbWVJbmRleCA9IHUyQXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgIDEsIHRoaXMuY29uc3RhbnRQb29sT2Zmc2V0W3RoaXMuY29uc3RhbnRQb29sRW50cnkuZ2V0TmFtZUFuZFR5cGVJbmRleCgpXSk7CgkJCQlpbnQgbWV0aG9kRGVzY3JpcHRvckluZGV4ID0gdTJBdCh0aGlzLmNsYXNzRmlsZUJ5dGVzLCAgMywgdGhpcy5jb25zdGFudFBvb2xPZmZzZXRbdGhpcy5jb25zdGFudFBvb2xFbnRyeS5nZXROYW1lQW5kVHlwZUluZGV4KCldKTsKCQkJCXRoaXMuY29uc3RhbnRQb29sRW50cnkuc2V0TWV0aG9kTmFtZShnZXRVdGY4VmFsdWVBdChtZXRob2ROYW1lSW5kZXgpKTsKCQkJCXRoaXMuY29uc3RhbnRQb29sRW50cnkuc2V0TWV0aG9kRGVzY3JpcHRvcihnZXRVdGY4VmFsdWVBdChtZXRob2REZXNjcmlwdG9ySW5kZXgpKTsKCQkJCWJyZWFrOwoJCQljYXNlIElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9GbG9hdCA6CgkJCQl0aGlzLmNvbnN0YW50UG9vbEVudHJ5LnNldEZsb2F0VmFsdWUoZmxvYXRBdChjbGFzc0ZpbGVCeXRlcywgMSwgdGhpcy5jb25zdGFudFBvb2xPZmZzZXRbaW5kZXhdKSk7CgkJCQlicmVhazsKCQkJY2FzZSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfSW50ZWdlciA6CgkJCQl0aGlzLmNvbnN0YW50UG9vbEVudHJ5LnNldEludGVnZXJWYWx1ZShpNEF0KGNsYXNzRmlsZUJ5dGVzLCAxLCB0aGlzLmNvbnN0YW50UG9vbE9mZnNldFtpbmRleF0pKTsKCQkJCWJyZWFrOwoJCQljYXNlIElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9Mb25nIDoKCQkJCXRoaXMuY29uc3RhbnRQb29sRW50cnkuc2V0TG9uZ1ZhbHVlKGk4QXQoY2xhc3NGaWxlQnl0ZXMsIDEsIHRoaXMuY29uc3RhbnRQb29sT2Zmc2V0W2luZGV4XSkpOwoJCQkJYnJlYWs7CgkJCWNhc2UgSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX05hbWVBbmRUeXBlIDoKCQkJCXRoaXMuY29uc3RhbnRQb29sRW50cnkuc2V0TmFtZUFuZFR5cGVOYW1lSW5kZXgodTJBdCh0aGlzLmNsYXNzRmlsZUJ5dGVzLCAgMSwgdGhpcy5jb25zdGFudFBvb2xPZmZzZXRbaW5kZXhdKSk7CgkJCQl0aGlzLmNvbnN0YW50UG9vbEVudHJ5LnNldE5hbWVBbmRUeXBlRGVzY3JpcHRvckluZGV4KHUyQXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgIDMsIHRoaXMuY29uc3RhbnRQb29sT2Zmc2V0W2luZGV4XSkpOwoJCQkJYnJlYWs7CgkJCWNhc2UgSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX1N0cmluZyA6CgkJCQl0aGlzLmNvbnN0YW50UG9vbEVudHJ5LnNldFN0cmluZ0luZGV4KHUyQXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgIDEsIHRoaXMuY29uc3RhbnRQb29sT2Zmc2V0W2luZGV4XSkpOwoJCQkJdGhpcy5jb25zdGFudFBvb2xFbnRyeS5zZXRTdHJpbmdWYWx1ZShnZXRVdGY4VmFsdWVBdCh0aGlzLmNvbnN0YW50UG9vbEVudHJ5LmdldFN0cmluZ0luZGV4KCkpKTsKCQkJCWJyZWFrOwoJCQljYXNlIElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9VdGY4IDoKCQkJCXRoaXMuY29uc3RhbnRQb29sRW50cnkuc2V0VXRmOExlbmd0aCh1MkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsICAxLCB0aGlzLmNvbnN0YW50UG9vbE9mZnNldFtpbmRleF0pKTsKCQkJCXRoaXMuY29uc3RhbnRQb29sRW50cnkuc2V0VXRmOFZhbHVlKGdldFV0ZjhWYWx1ZUF0KGluZGV4KSk7CgkJfQoJCXJldHVybiB0aGlzLmNvbnN0YW50UG9vbEVudHJ5OwoJfQoKCS8qKgoJICogQHNlZSBJQ29uc3RhbnRQb29sI2dldENvbnN0YW50UG9vbENvdW50KCkKCSAqLwoJcHVibGljIGludCBnZXRDb25zdGFudFBvb2xDb3VudCgpIHsKCQlyZXR1cm4gdGhpcy5jb25zdGFudFBvb2xDb3VudDsKCX0KCgkvKioKCSAqIEBzZWUgSUNvbnN0YW50UG9vbCNnZXRFbnRyeUtpbmQoaW50KQoJICovCglwdWJsaWMgaW50IGdldEVudHJ5S2luZChpbnQgaW5kZXgpIHsKCQlyZXR1cm4gdGhpcy51MUF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDAsIHRoaXMuY29uc3RhbnRQb29sT2Zmc2V0W2luZGV4XSk7Cgl9CgoJcHJpdmF0ZSBjaGFyW10gZ2V0VXRmOFZhbHVlQXQoaW50IHV0ZjhJbmRleCkgewoJCWludCB1dGY4T2Zmc2V0ID0gdGhpcy5jb25zdGFudFBvb2xPZmZzZXRbdXRmOEluZGV4XTsKCQlyZXR1cm4gdXRmOEF0KGNsYXNzRmlsZUJ5dGVzLCAwLCB1dGY4T2Zmc2V0ICsgMywgdTJBdChjbGFzc0ZpbGVCeXRlcywgMCwgdXRmOE9mZnNldCArIDEpKTsKCX0KfQo=