LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBDb3B5cmlnaHQgKEMpIDIwMTcgYnkgU2F2b2lyLWZhaXJlIExpbnV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAqIEF1dGhvcjogQW50aG9ueSBM6W9uYXJkIDxhbnRob255Lmxlb25hcmRAc2F2b2lyZmFpcmVsaW51eC5jb20+ICAgICAgICAgICoKICogQXV0aG9yOiBBbmRyZWFzIFRyYWN6eWsgPGFuZHJlYXMudHJhY3p5a0BzYXZvaXJmYWlyZWxpbnV4LmNvbT4gICAgICAgICAgKgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAgICoKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgKgogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgICAqCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgICAqCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICoKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgKgogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgKgogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlICJzbWFydGxpc3Rtb2RlbC5oIgoKLy8gUXQKI2luY2x1ZGUgPFFEYXRlVGltZT4KCi8vIExSQwojaW5jbHVkZSAiZ2xvYmFsaW5zdGFuY2VzLmgiCiNpbmNsdWRlICJhcGkvY29udGFjdG1vZGVsLmgiCiNpbmNsdWRlICJhcGkvY29udmVyc2F0aW9ubW9kZWwuaCIKCi8vIENsaWVudAojaW5jbHVkZSAicGl4YnVmbWFuaXB1bGF0b3IuaCIKI2luY2x1ZGUgInV0aWxzLmgiCgpTbWFydExpc3RNb2RlbDo6U21hcnRMaXN0TW9kZWwoY29uc3QgbHJjOjphcGk6OmFjY291bnQ6OkluZm8gJmFjYywgUU9iamVjdCAqcGFyZW50KQogICAgOiBRQWJzdHJhY3RJdGVtTW9kZWwocGFyZW50KSwKICAgIGFjY18oYWNjKQp7Cn0KCmludCBTbWFydExpc3RNb2RlbDo6cm93Q291bnQoY29uc3QgUU1vZGVsSW5kZXggJnBhcmVudCkgY29uc3QKewogICAgaWYgKCFwYXJlbnQuaXNWYWxpZCgpKSB7CiAgICAgICAgcmV0dXJuIGFjY18uY29udmVyc2F0aW9uTW9kZWwtPmFsbEZpbHRlcmVkQ29udmVyc2F0aW9ucygpLnNpemUoKTsKICAgIH0KICAgIHJldHVybiAwOyAvLyBBIHZhbGlkIFFNb2RlbEluZGV4IHJldHVybnMgMCBhcyBubyBlbnRyeSBoYXMgc3ViLWVsZW1lbnRzCn0KCmludCBTbWFydExpc3RNb2RlbDo6Y29sdW1uQ291bnQoY29uc3QgUU1vZGVsSW5kZXggJnBhcmVudCkgY29uc3QKewogICAgUV9VTlVTRUQocGFyZW50KTsKICAgIHJldHVybiAxOwp9CgpRVmFyaWFudCBTbWFydExpc3RNb2RlbDo6ZGF0YShjb25zdCBRTW9kZWxJbmRleCAmaW5kZXgsIGludCByb2xlKSBjb25zdAp7CiAgICBpZiAoIWluZGV4LmlzVmFsaWQoKSkgewogICAgICAgIHJldHVybiBRVmFyaWFudCgpOwogICAgfQoKICAgIGNvbnN0IGF1dG8mIGl0ZW0gPSBhY2NfLmNvbnZlcnNhdGlvbk1vZGVsLT5maWx0ZXJlZENvbnZlcnNhdGlvbihpbmRleC5yb3coKSk7CiAgICBpZiAoaXRlbS5wYXJ0aWNpcGFudHMuc2l6ZSgpID4gMCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHN3aXRjaCAocm9sZSkgewogICAgICAgICAgICBjYXNlIFJvbGU6OlBpY3R1cmU6CiAgICAgICAgICAgIGNhc2UgUXQ6OkRlY29yYXRpb25Sb2xlOgogICAgICAgICAgICAgICAgcmV0dXJuIEdsb2JhbEluc3RhbmNlczo6cGl4bWFwTWFuaXB1bGF0b3IoKS5kZWNvcmF0aW9uUm9sZShpdGVtLCBhY2NfKTsKICAgICAgICAgICAgY2FzZSBSb2xlOjpEaXNwbGF5TmFtZToKICAgICAgICAgICAgY2FzZSBRdDo6RGlzcGxheVJvbGU6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGF1dG8mIGNvbnRhY3QgPSBhY2NfLmNvbnRhY3RNb2RlbC0+Z2V0Q29udGFjdChpdGVtLnBhcnRpY2lwYW50c1swXSk7CiAgICAgICAgICAgICAgICByZXR1cm4gUVZhcmlhbnQoUVN0cmluZzo6ZnJvbVN0ZFN0cmluZyhVdGlsczo6YmVzdE5hbWVGb3JDb250YWN0KGNvbnRhY3QpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSBSb2xlOjpEaXNwbGF5SUQ6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGF1dG8mIGNvbnRhY3QgPSBhY2NfLmNvbnRhY3RNb2RlbC0+Z2V0Q29udGFjdChpdGVtLnBhcnRpY2lwYW50c1swXSk7CiAgICAgICAgICAgICAgICByZXR1cm4gUVZhcmlhbnQoUVN0cmluZzo6ZnJvbVN0ZFN0cmluZyhVdGlsczo6YmVzdElkRm9yQ29udGFjdChjb250YWN0KSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgUm9sZTo6UHJlc2VuY2U6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGF1dG8mIGNvbnRhY3QgPSBhY2NfLmNvbnRhY3RNb2RlbC0+Z2V0Q29udGFjdChpdGVtLnBhcnRpY2lwYW50c1swXSk7CiAgICAgICAgICAgICAgICByZXR1cm4gUVZhcmlhbnQoY29udGFjdC5pc1ByZXNlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgUm9sZTo6VVJJOgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhdXRvJiBjb250YWN0ID0gYWNjXy5jb250YWN0TW9kZWwtPmdldENvbnRhY3QoaXRlbS5wYXJ0aWNpcGFudHNbMF0pOwogICAgICAgICAgICAgICAgcmV0dXJuIFFWYXJpYW50KFFTdHJpbmc6OmZyb21TdGRTdHJpbmcoY29udGFjdC5wcm9maWxlSW5mby51cmkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlIFJvbGU6OlVucmVhZE1lc3NhZ2VzQ291bnQ6CiAgICAgICAgICAgICAgICByZXR1cm4gUVZhcmlhbnQoaXRlbS51bnJlYWRNZXNzYWdlcyk7CiAgICAgICAgICAgIGNhc2UgUm9sZTo6TGFzdEludGVyYWN0aW9uRGF0ZToKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYXV0byYgZGF0ZSA9IGl0ZW0uaW50ZXJhY3Rpb25zLmF0KGl0ZW0ubGFzdE1lc3NhZ2VVaWQpLnRpbWVzdGFtcDsKICAgICAgICAgICAgICAgIHJldHVybiBRVmFyaWFudChRU3RyaW5nOjpmcm9tU3RkU3RyaW5nKFV0aWxzOjpmb3JtYXRUaW1lU3RyaW5nKGRhdGUpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSBSb2xlOjpMYXN0SW50ZXJhY3Rpb246CiAgICAgICAgICAgICAgICByZXR1cm4gUVZhcmlhbnQoUVN0cmluZzo6ZnJvbVN0ZFN0cmluZyhpdGVtLmludGVyYWN0aW9ucy5hdChpdGVtLmxhc3RNZXNzYWdlVWlkKS5ib2R5KSk7CiAgICAgICAgICAgIGNhc2UgUm9sZTo6TGFzdEludGVyYWN0aW9uVHlwZToKICAgICAgICAgICAgICAgIHJldHVybiBRVmFyaWFudChVdGlsczo6dG9VbmRlcmx5aW5nVmFsdWUoaXRlbS5pbnRlcmFjdGlvbnMuYXQoaXRlbS5sYXN0TWVzc2FnZVVpZCkudHlwZSkpOwogICAgICAgICAgICBjYXNlIFJvbGU6OkNvbnRhY3RUeXBlOgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhdXRvJiBjb250YWN0ID0gYWNjXy5jb250YWN0TW9kZWwtPmdldENvbnRhY3QoaXRlbS5wYXJ0aWNpcGFudHNbMF0pOwogICAgICAgICAgICAgICAgcmV0dXJuIFFWYXJpYW50KFV0aWxzOjp0b1VuZGVybHlpbmdWYWx1ZShjb250YWN0LnByb2ZpbGVJbmZvLnR5cGUpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlIFJvbGU6OlVJRDoKICAgICAgICAgICAgICAgIHJldHVybiBRVmFyaWFudChRU3RyaW5nOjpmcm9tU3RkU3RyaW5nKGl0ZW0udWlkKSk7CiAgICAgICAgICAgIGNhc2UgUm9sZTo6Q29udGV4dE1lbnVPcGVuOgogICAgICAgICAgICAgICAgcmV0dXJuIFFWYXJpYW50KGlzQ29udGV4dE1lbnVPcGVuKTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKC4uLikge30KICAgIH0KICAgIHJldHVybiBRVmFyaWFudCgpOwp9CgpRTW9kZWxJbmRleCBTbWFydExpc3RNb2RlbDo6aW5kZXgoaW50IHJvdywgaW50IGNvbHVtbiwgY29uc3QgUU1vZGVsSW5kZXggJnBhcmVudCkgY29uc3QKewogICAgUV9VTlVTRUQocGFyZW50KTsKICAgIGlmIChjb2x1bW4gIT0gMCkgewogICAgICAgIHJldHVybiBRTW9kZWxJbmRleCgpOwogICAgfQoKICAgIGlmIChyb3cgPj0gMCAmJiByb3cgPCByb3dDb3VudCgpKSB7CiAgICAgICAgcmV0dXJuIGNyZWF0ZUluZGV4KHJvdywgY29sdW1uKTsKICAgIH0KICAgIHJldHVybiBRTW9kZWxJbmRleCgpOwp9CgpRTW9kZWxJbmRleCBTbWFydExpc3RNb2RlbDo6cGFyZW50KGNvbnN0IFFNb2RlbEluZGV4ICZjaGlsZCkgY29uc3QKewogICAgUV9VTlVTRUQoY2hpbGQpOwogICAgcmV0dXJuIFFNb2RlbEluZGV4KCk7Cn0KClF0OjpJdGVtRmxhZ3MgU21hcnRMaXN0TW9kZWw6OmZsYWdzKGNvbnN0IFFNb2RlbEluZGV4ICZpbmRleCkgY29uc3QKewogICAgYXV0byBmbGFncyA9IFFBYnN0cmFjdEl0ZW1Nb2RlbDo6ZmxhZ3MoaW5kZXgpIHwgUXQ6Okl0ZW1OZXZlckhhc0NoaWxkcmVuIHwgUXQ6Okl0ZW1Jc1NlbGVjdGFibGU7CiAgICBhdXRvIHR5cGUgPSBVdGlsczo6dG9FbnVtPGxyYzo6YXBpOjpwcm9maWxlOjpUeXBlPihkYXRhKGluZGV4LCBSb2xlOjpDb250YWN0VHlwZSkudmFsdWU8aW50PigpKTsKICAgIGF1dG8gZGlzcGxheU5hbWUgPSBkYXRhKGluZGV4LCBSb2xlOjpEaXNwbGF5TmFtZSkudmFsdWU8UVN0cmluZz4oKTsKICAgIGF1dG8gdWlkID0gZGF0YShpbmRleCwgUm9sZTo6VUlEKS52YWx1ZTxRU3RyaW5nPigpOwogICAgaWYgKCFpbmRleC5pc1ZhbGlkKCkpIHsKICAgICAgICByZXR1cm4gUUFic3RyYWN0SXRlbU1vZGVsOjpmbGFncyhpbmRleCk7CiAgICB9IGVsc2UgaWYgKCB0eXBlID09IGxyYzo6YXBpOjpwcm9maWxlOjpUeXBlOjpURU1QT1JBUlkgJiYKICAgICAgICAgICAgICAgIHVpZC5pc0VtcHR5KCkpIHsKICAgICAgICBmbGFncyAmPSB+KFF0OjpJdGVtSXNTZWxlY3RhYmxlKTsKICAgIH0KICAgIHJldHVybiBmbGFnczsKfQo=