LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBDb3B5cmlnaHQgKEMpIDIwMTYgYnkgU2F2b2lyLWZhaXJlIExpbnV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqIEF1dGhvcjogSuRnZXIgTmljb2xhcyA8bmljb2xhcy5qYWdlckBzYXZvaXJmYWlyZWxpbnV4LmNvbT4gICAgICAgICAgICAgICoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAqDQoqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICoNCiogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKg0KKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKg0KKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAqDQoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAgICoNCiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgICoNCiogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAgKg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQojaW5jbHVkZSAicGNoLmgiDQoNCiNpbmNsdWRlICJDYWxsc1ZpZXdNb2RlbC5oIg0KDQp1c2luZyBuYW1lc3BhY2UgUmluZ0NsaWVudFVXUDsNCnVzaW5nIG5hbWVzcGFjZSBWaWV3TW9kZWw7DQp1c2luZyBuYW1lc3BhY2UgV2luZG93czo6VUk6OkNvcmU7DQp1c2luZyBuYW1lc3BhY2UgV2luZG93czo6QXBwbGljYXRpb25Nb2RlbDo6Q29yZTsNCg0KQ2FsbHNWaWV3TW9kZWw6OkNhbGxzVmlld01vZGVsKCkNCnsNCiAgICBDYWxsc0xpc3RfID0gcmVmIG5ldyBWZWN0b3I8Q2FsbF4+KCk7DQoNCiAgICAvKiBjb25uZWN0IHRvIGRlbGVnYXRlcy4gKi8NCg0KICAgIFJpbmdEOjppbnN0YW5jZS0+aW5jb21pbmdDYWxsICs9IHJlZiBuZXcgUmluZ0NsaWVudFVXUDo6SW5jb21pbmdDYWxsKFsmXSgNCiAgICBTdHJpbmdeIGFjY291bnRJZCwgU3RyaW5nXiBjYWxsSWQsIFN0cmluZ14gZnJvbSkgew0KICAgICAgICBhdXRvIGNhbGwgPSBhZGROZXdDYWxsKGFjY291bnRJZCwgY2FsbElkLCBmcm9tKTsNCiAgICAgICAgLy8gUkVGQUNUTyA6IGFkZCBpZiBjYWxsID09IG51bGxwdHINCiAgICAgICAgY2FsbFJlY2lldmVkKGNhbGwpOw0KICAgIH0pOw0KDQogICAgUmluZ0Q6Omluc3RhbmNlLT5zdGF0ZUNoYW5nZSArPSByZWYgbmV3IFJpbmdDbGllbnRVV1A6OlN0YXRlQ2hhbmdlKFsmXSgNCiAgICBTdHJpbmdeIGNhbGxJZCwgU3RyaW5nXiBzdGF0ZSwgaW50IGNvZGUpIHsNCiAgICAgICAgZm9yIGVhY2ggKGF1dG8gY2FsbCBpbiBDYWxsc0xpc3RfKSB7DQogICAgICAgICAgICBpZiAoY2FsbC0+Y2FsbElkID09IGNhbGxJZCkgew0KICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSAiT1ZFUiIpIHsNCiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNhbGw7DQogICAgICAgICAgICAgICAgICAgIGNhbGwtPnN0YXRlQ2hhbmdlKCIiLCBjb2RlKTsNCiAgICAgICAgICAgICAgICAgICAgY2FsbFN0YXR1c1VwZGF0ZWQoY2FsbCk7IC8vIHVzZWQgPw0KICAgICAgICAgICAgICAgICAgICBSaW5nRDo6aW5zdGFuY2UtPmhhbmdVcENhbGwoY2FsbCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgY2FsbC0+c3RhdGVDaGFuZ2Uoc3RhdGUsIGNvZGUpOw0KICAgICAgICAgICAgICAgIGNhbGxTdGF0dXNVcGRhdGVkKGNhbGwpOyAvLyBzYW1lLi4uDQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIFdOR18oIkNhbGwgbm90IGZvdW5kIik7DQogICAgfSk7DQp9DQoNCkNhbGxeDQpSaW5nQ2xpZW50VVdQOjpWaWV3TW9kZWw6OkNhbGxzVmlld01vZGVsOjphZGROZXdDYWxsKFN0cmluZ14gYWNjb3VudElkLCBTdHJpbmdeIGNhbGxJZCwgU3RyaW5nXiBwZWVyKQ0Kew0KICAgIGlmIChhY2NvdW50SWQgPT0gIiIgfCBjYWxsSWQgPT0gIiIgfCBwZWVyID09ICIiKSB7DQogICAgICAgIFdOR18oImNhbGwgY2FuJ3QgYmUgY3JlYXRlZCIpOw0KICAgIH0NCiAgICBhdXRvIGNhbGwgPSByZWYgbmV3IENhbGwoYWNjb3VudElkLCBjYWxsSWQsIHBlZXIpOw0KICAgIENhbGxzTGlzdF8tPkFwcGVuZChjYWxsKTsNCiAgICByZXR1cm4gY2FsbDsNCn0NCg0Kdm9pZCBSaW5nQ2xpZW50VVdQOjpWaWV3TW9kZWw6OkNhbGxzVmlld01vZGVsOjpjbGVhckNhbGxzTGlzdCgpDQp7DQogICAgQ2FsbHNMaXN0Xy0+Q2xlYXIoKTsNCn0NCg0KQ2FsbF4NCkNhbGxzVmlld01vZGVsOjpmaW5kQ2FsbChTdHJpbmdeIGNhbGxJZCkNCnsNCiAgICBmb3IgZWFjaCAoQ2FsbF4gY2FsbCBpbiBDYWxsc0xpc3RfKQ0KICAgICAgICBpZiAoY2FsbC0+Y2FsbElkID09IGNhbGxJZCkNCiAgICAgICAgICAgIHJldHVybiBjYWxsOw0KDQogICAgcmV0dXJuIG51bGxwdHI7DQp9DQo=