LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAogKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgogKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIAogKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKiAKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICogdW5kZXIgdGhlIExpY2Vuc2UuCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8vIE1BUktFUih1cGRhdGVfcHJlY29tcC5weSk6IGF1dG9nZW4gaW5jbHVkZSBzdGF0ZW1lbnQsIGRvIG5vdCByZW1vdmUKI2luY2x1ZGUgInByZWNvbXBpbGVkX3N2Z2lvLmh4eCIKCiNpbmNsdWRlIDxzdmdpby9zdmdyZWFkZXIvc3ZnY2xpcHBhdGhub2RlLmh4eD4KI2luY2x1ZGUgPGRyYXdpbmdsYXllci9wcmltaXRpdmUyZC90cmFuc2Zvcm1wcmltaXRpdmUyZC5oeHg+CiNpbmNsdWRlIDxkcmF3aW5nbGF5ZXIvcHJpbWl0aXZlMmQvbWFza3ByaW1pdGl2ZTJkLmh4eD4KI2luY2x1ZGUgPGJhc2VnZngvbWF0cml4L2IyZGhvbW1hdHJpeHRvb2xzLmh4eD4KI2luY2x1ZGUgPGRyYXdpbmdsYXllci9nZW9tZXRyeS92aWV3aW5mb3JtYXRpb24yZC5oeHg+CiNpbmNsdWRlIDxkcmF3aW5nbGF5ZXIvcHJvY2Vzc29yMmQvY29udG91cmV4dHJhY3RvcjJkLmh4eD4KI2luY2x1ZGUgPGJhc2VnZngvcG9seWdvbi9iMmRwb2x5cG9seWdvbmN1dHRlci5oeHg+CiNpbmNsdWRlIDxiYXNlZ2Z4L3BvbHlnb24vYjJkcG9seWdvbnRvb2xzLmh4eD4KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKbmFtZXNwYWNlIHN2Z2lvCnsKICAgIG5hbWVzcGFjZSBzdmdyZWFkZXIKICAgIHsKICAgICAgICBTdmdDbGlwUGF0aE5vZGU6OlN2Z0NsaXBQYXRoTm9kZSgKICAgICAgICAgICAgU3ZnRG9jdW1lbnQmIHJEb2N1bWVudCwKICAgICAgICAgICAgU3ZnTm9kZSogcFBhcmVudCkKICAgICAgICA6ICAgU3ZnTm9kZShTVkdUb2tlbkNsaXBQYXRoTm9kZSwgckRvY3VtZW50LCBwUGFyZW50KSwKICAgICAgICAgICAgbWFTdmdTdHlsZUF0dHJpYnV0ZXMoKnRoaXMpLAogICAgICAgICAgICBtcGFUcmFuc2Zvcm0oMCksCiAgICAgICAgICAgIG1hQ2xpcFBhdGhVbml0cyh1c2VyU3BhY2VPblVzZSkKICAgICAgICB7CiAgICAgICAgfQoKICAgICAgICBTdmdDbGlwUGF0aE5vZGU6On5TdmdDbGlwUGF0aE5vZGUoKQogICAgICAgIHsKICAgICAgICAgICAgaWYobXBhVHJhbnNmb3JtKSBkZWxldGUgbXBhVHJhbnNmb3JtOwogICAgICAgIH0KCiAgICAgICAgY29uc3QgU3ZnU3R5bGVBdHRyaWJ1dGVzKiBTdmdDbGlwUGF0aE5vZGU6OmdldFN2Z1N0eWxlQXR0cmlidXRlcygpIGNvbnN0CiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gJm1hU3ZnU3R5bGVBdHRyaWJ1dGVzOwogICAgICAgIH0KCiAgICAgICAgdm9pZCBTdmdDbGlwUGF0aE5vZGU6OnBhcnNlQXR0cmlidXRlKGNvbnN0IHJ0bDo6T1VTdHJpbmcmIHJUb2tlbk5hbWUsIFNWR1Rva2VuIGFTVkdUb2tlbiwgY29uc3QgcnRsOjpPVVN0cmluZyYgYUNvbnRlbnQpCiAgICAgICAgewogICAgICAgICAgICAvLyBjYWxsIHBhcmVudAogICAgICAgICAgICBTdmdOb2RlOjpwYXJzZUF0dHJpYnV0ZShyVG9rZW5OYW1lLCBhU1ZHVG9rZW4sIGFDb250ZW50KTsKCiAgICAgICAgICAgIC8vIHJlYWQgc3R5bGUgYXR0cmlidXRlcwogICAgICAgICAgICBtYVN2Z1N0eWxlQXR0cmlidXRlcy5wYXJzZVN0eWxlQXR0cmlidXRlKHJUb2tlbk5hbWUsIGFTVkdUb2tlbiwgYUNvbnRlbnQpOwoKICAgICAgICAgICAgLy8gcGFyc2Ugb3duCiAgICAgICAgICAgIHN3aXRjaChhU1ZHVG9rZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgU1ZHVG9rZW5TdHlsZToKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtYVN2Z1N0eWxlQXR0cmlidXRlcy5yZWFkU3R5bGUoYUNvbnRlbnQpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2FzZSBTVkdUb2tlblRyYW5zZm9ybToKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlZ2Z4OjpCMkRIb21NYXRyaXggYU1hdHJpeChyZWFkVHJhbnNmb3JtKGFDb250ZW50LCAqdGhpcykpOwoKICAgICAgICAgICAgICAgICAgICBpZighYU1hdHJpeC5pc0lkZW50aXR5KCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZXRUcmFuc2Zvcm0oJmFNYXRyaXgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhc2UgU1ZHVG9rZW5DbGlwUGF0aFVuaXRzOgogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmKGFDb250ZW50LmdldExlbmd0aCgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoYUNvbnRlbnQubWF0Y2goY29tbW9uU3RyaW5nczo6YVN0clVzZXJTcGFjZU9uVXNlLCAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2xpcFBhdGhVbml0cyh1c2VyU3BhY2VPblVzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihhQ29udGVudC5tYXRjaChjb21tb25TdHJpbmdzOjphU3RyT2JqZWN0Qm91bmRpbmdCb3gsIDApKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDbGlwUGF0aFVuaXRzKG9iamVjdEJvdW5kaW5nQm94KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHZvaWQgU3ZnQ2xpcFBhdGhOb2RlOjpkZWNvbXBvc2VTdmdOb2RlKGRyYXdpbmdsYXllcjo6cHJpbWl0aXZlMmQ6OlByaW1pdGl2ZTJEU2VxdWVuY2UmIHJUYXJnZXQsIGJvb2wgYlJlZmVyZW5jZWQpIGNvbnN0CiAgICAgICAgewogICAgICAgICAgICBkcmF3aW5nbGF5ZXI6OnByaW1pdGl2ZTJkOjpQcmltaXRpdmUyRFNlcXVlbmNlIGFOZXdUYXJnZXQ7CgogICAgICAgICAgICAvLyBkZWNvbXBvc2UgY2hpbGRzCiAgICAgICAgICAgIFN2Z05vZGU6OmRlY29tcG9zZVN2Z05vZGUoYU5ld1RhcmdldCwgYlJlZmVyZW5jZWQpOwoKICAgICAgICAgICAgaWYoYU5ld1RhcmdldC5oYXNFbGVtZW50cygpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZihnZXRUcmFuc2Zvcm0oKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZW1iZWRkaW5nIGdyb3VwIGVsZW1lbnQgd2l0aCB0cmFuc2Zvcm1hdGlvbgogICAgICAgICAgICAgICAgICAgIGNvbnN0IGRyYXdpbmdsYXllcjo6cHJpbWl0aXZlMmQ6OlByaW1pdGl2ZTJEUmVmZXJlbmNlIHhSZWYoCiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBkcmF3aW5nbGF5ZXI6OnByaW1pdGl2ZTJkOjpUcmFuc2Zvcm1QcmltaXRpdmUyRCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICpnZXRUcmFuc2Zvcm0oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFOZXdUYXJnZXQpKTsKCiAgICAgICAgICAgICAgICAgICAgZHJhd2luZ2xheWVyOjpwcmltaXRpdmUyZDo6YXBwZW5kUHJpbWl0aXZlMkRSZWZlcmVuY2VUb1ByaW1pdGl2ZTJEU2VxdWVuY2UoclRhcmdldCwgeFJlZik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYXBwZW5kIHRvIGN1cnJlbnQgdGFyZ2V0CiAgICAgICAgICAgICAgICAgICAgZHJhd2luZ2xheWVyOjpwcmltaXRpdmUyZDo6YXBwZW5kUHJpbWl0aXZlMkRTZXF1ZW5jZVRvUHJpbWl0aXZlMkRTZXF1ZW5jZShyVGFyZ2V0LCBhTmV3VGFyZ2V0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdm9pZCBTdmdDbGlwUGF0aE5vZGU6OmFwcGx5KAogICAgICAgICAgICBkcmF3aW5nbGF5ZXI6OnByaW1pdGl2ZTJkOjpQcmltaXRpdmUyRFNlcXVlbmNlJiByQ29udGVudCwKICAgICAgICAgICAgY29uc3QgYmFzZWdmeDo6QjJESG9tTWF0cml4KiBwVHJhbnNmb3JtKSBjb25zdAogICAgICAgIHsKICAgICAgICAgICAgaWYockNvbnRlbnQuaGFzRWxlbWVudHMoKSAmJiBEaXNwbGF5X25vbmUgIT0gZ2V0RGlzcGxheSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb25zdCBkcmF3aW5nbGF5ZXI6Omdlb21ldHJ5OjpWaWV3SW5mb3JtYXRpb24yRCBhVmlld0luZm9ybWF0aW9uMkQ7CiAgICAgICAgICAgICAgICBkcmF3aW5nbGF5ZXI6OnByaW1pdGl2ZTJkOjpQcmltaXRpdmUyRFNlcXVlbmNlIGFDbGlwVGFyZ2V0OwogICAgICAgICAgICAgICAgYmFzZWdmeDo6QjJEUG9seVBvbHlnb24gYUNsaXBQb2x5UG9seWdvbjsKCiAgICAgICAgICAgICAgICAvLyBnZXQgY2xpcFBhdGggZGVmaW5pdGlvbiBhcyBwcmltaXRpdmVzCiAgICAgICAgICAgICAgICBkZWNvbXBvc2VTdmdOb2RlKGFDbGlwVGFyZ2V0LCB0cnVlKTsKCiAgICAgICAgICAgICAgICBpZihhQ2xpcFRhcmdldC5oYXNFbGVtZW50cygpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGV4dHJhY3QgZmlsbGVkIHBseWdvbnMgYXMgYmFzZSBmb3IgYSBtYXNrIFBvbHlQb2x5Z29uCiAgICAgICAgICAgICAgICAgICAgZHJhd2luZ2xheWVyOjpwcm9jZXNzb3IyZDo6Q29udG91ckV4dHJhY3RvcjJEIGFFeHRyYWN0b3IoYVZpZXdJbmZvcm1hdGlvbjJELCB0cnVlKTsKCiAgICAgICAgICAgICAgICAgICAgYUV4dHJhY3Rvci5wcm9jZXNzKGFDbGlwVGFyZ2V0KTsKCiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZWdmeDo6QjJEUG9seVBvbHlnb25WZWN0b3ImIHJSZXN1bHQoYUV4dHJhY3Rvci5nZXRFeHRyYWN0ZWRDb250b3VyKCkpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHNhbF91SW50MzIgblNpemUoclJlc3VsdC5zaXplKCkpOwoKICAgICAgICAgICAgICAgICAgICBpZihuU2l6ZSA+IDEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXJnZSB0byBzaW5nbGUgY2xpcFBvbHlQb2x5Z29uCiAgICAgICAgICAgICAgICAgICAgICAgIGFDbGlwUG9seVBvbHlnb24gPSBiYXNlZ2Z4Ojp0b29sczo6bWVyZ2VUb1NpbmdsZVBvbHlQb2x5Z29uKHJSZXN1bHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBhQ2xpcFBvbHlQb2x5Z29uID0gclJlc3VsdFswXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYoYUNsaXBQb2x5UG9seWdvbi5jb3VudCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmKG9iamVjdEJvdW5kaW5nQm94ID09IGdldENsaXBQYXRoVW5pdHMoKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsaXAgaXMgb2JqZWN0LXJlbGF0aXZlLCB0cmFuc2Zvcm0gdXNpbmcgY29udGVudCB0cmFuc2Zvcm1hdGlvbgogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlZ2Z4OjpCMkRSYW5nZSBhQ29udGVudFJhbmdlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd2luZ2xheWVyOjpwcmltaXRpdmUyZDo6Z2V0QjJEUmFuZ2VGcm9tUHJpbWl0aXZlMkRTZXF1ZW5jZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByQ29udGVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmlld0luZm9ybWF0aW9uMkQpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGFDbGlwUG9seVBvbHlnb24udHJhbnNmb3JtKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWdmeDo6dG9vbHM6OmNyZWF0ZVNjYWxlVHJhbnNsYXRlQjJESG9tTWF0cml4KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDb250ZW50UmFuZ2UuZ2V0UmFuZ2UoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhQ29udGVudFJhbmdlLmdldE1pbmltdW0oKSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIC8vIHVzZXJTcGFjZU9uVXNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyAjaTEyNDg1MiMKICAgICAgICAgICAgICAgICAgICAgICAgaWYocFRyYW5zZm9ybSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYUNsaXBQb2x5UG9seWdvbi50cmFuc2Zvcm0oKnBUcmFuc2Zvcm0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyAjMTI0MzEzIyB0cnkgdG8gYXZvaWQgY3JlYXRpbmcgYW4gZW1iZWRkaW5nIHRvIGEgTWFza1ByaW1pdGl2ZTJEIGlmCiAgICAgICAgICAgICAgICAgICAgLy8gcG9zc2libGU7IE1hc2tQcmltaXRpdmUyRCBwcm9jZXNzaW5nIGlzIHBvdGVudGlhbGx5IGV4cGVuc2l2ZQogICAgICAgICAgICAgICAgICAgIGJvb2wgYkNyZWF0ZUVtYmVkZGluZyh0cnVlKTsKICAgICAgICAgICAgICAgICAgICBib29sIGJBZGRDb250ZW50KHRydWUpOwoKICAgICAgICAgICAgICAgICAgICBpZihiYXNlZ2Z4Ojp0b29sczo6aXNSZWN0YW5nbGUoYUNsaXBQb2x5UG9seWdvbikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGlwUmVnaW9uIGlzIGEgcmVjdGFuZ2xlLCB0aHVzIGl0IGlzIG5vdCBleHBlbnNpdmUgdG8gdGVsbAogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY29udGVudCBpcyBjb21wbGV0ZWx5IGluc2lkZSBvciBvdXRzaWRlIG9mIGl0OyBnZXQgcmFuZ2VzCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2VnZng6OkIyRFJhbmdlIGFDbGlwUmFuZ2UoYUNsaXBQb2x5UG9seWdvbi5nZXRCMkRSYW5nZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZWdmeDo6QjJEUmFuZ2UgYUNvbnRlbnRSYW5nZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdpbmdsYXllcjo6cHJpbWl0aXZlMmQ6OmdldEIyRFJhbmdlRnJvbVByaW1pdGl2ZTJEU2VxdWVuY2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgckNvbnRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZpZXdJbmZvcm1hdGlvbjJEKSk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihhQ2xpcFJhbmdlLmlzSW5zaWRlKGFDb250ZW50UmFuZ2UpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wbGV0ZWx5IGNvbnRhaW5lZCwgbm8gbmVlZCB0byBjbGlwIGF0IGFsbCwgc28gbm8gbmVlZCBmb3IgZW1iZWRkaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ3JlYXRlRW1iZWRkaW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihhQ2xpcFJhbmdlLm92ZXJsYXBzKGFDb250ZW50UmFuZ2UpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdmVybGFwOyBlbWJlZGRpbmcgbmVlZGVkLiBDbGlwUmVnaW9uIGNhbiBiZSBtaW5pbWl6ZWQgYnkgdXNpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIENsaXBSYW5nZSBhbmQgdGhlIENvbnRlbnRSYW5nZS4gTWluaW1pemluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIENsaXBSZWdpb24gcG90ZW50aWFsbHkgZW5oYW5jZXMgZnVydGhlciBwcm9jZXNzaW5nIHNpbmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c3VhbGx5IGNsaXAgb3BlcmF0aW9ucyBhcmUgZXhwZW5zaXZlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWdmeDo6QjJEUmFuZ2UgYUNvbW1vblJhbmdlKGFDb250ZW50UmFuZ2UpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDb21tb25SYW5nZS5pbnRlcnNlY3QoYUNsaXBSYW5nZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhQ2xpcFBvbHlQb2x5Z29uID0gYmFzZWdmeDo6QjJEUG9seVBvbHlnb24oYmFzZWdmeDo6dG9vbHM6OmNyZWF0ZVBvbHlnb25Gcm9tUmVjdChhQ29tbW9uUmFuZ2UpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBpbnNpZGUgYW5kIG5vIG92ZXJsYXAgLT4gY29tcGxldGVseSBvdXRzaWRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBuZWVkIGZvciBlbWJlZGRpbmcsIG5vIG5lZWQgZm9yIGNvbnRlbnQgYXQgYWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ3JlYXRlRW1iZWRkaW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQWRkQ29udGVudCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsaXBSZWdpb24gaXMgbm90IGEgc2ltcGxlIHJlY3RhbmdsZSwgaXQgd291bGQgYmUgcG9zc2libGUgYnV0IGV4cGVuc2l2ZSB0bwogICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZWxsIGlmIHRoZSBjb250ZW50IG5lZWRzIGNsaXBwaW5nIG9yIG5vdC4gSXQgaXMgYWxzbyBkZXBlbmRlbnQgb2YKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGNvbnRlbnQncyBkZWNvbXBvc2l0aW9uLiBUbyBkbyB0aGlzLCBhIHByb2Nlc3NvciB3b3VsZCBiZSBuZWVkZWQgdGhhdAogICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBjYXBhYmxlIGlmIHByb2Nlc3NpbmcgdGhlIGdpdmVuIHNlcXVlbmNlIG9mIHByaW1pdGl2ZXMgYW5kIGRlY2lkZQogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBhbGwgaXMgaW5zaWRlIG9yIGFsbCBpcyBvdXRzaWRlLiBTdWNoIGEgQ2xpcFByb2Nlc3NvciBjb3VsZCBiZSB3cml0dGVuLAogICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgZm9yIG5vdyBqdXN0IGNyZWF0ZSB0aGUgZW1iZWRkaW5nCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZihiQ3JlYXRlRW1iZWRkaW5nKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVkZWZpbmUgdGFyZ2V0LiBVc2UgTWFza1ByaW1pdGl2ZTJEIHdpdGggY3JlYXRlZCBjbGlwCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdlb21ldHJ5LiBVc2luZyB0aGUgYXV0b21hdGljYWxseSBzZXQgbWJJc0NsaXBQYXRoQ29udGVudCBhdCAKICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3ZnU3R5bGVBdHRyaWJ1dGVzIHRoZSBjbGlwIGRlZmluaXRpb24gaXMgd2l0aG91dCBmaWxsLCBzdHJva2UsIAogICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgc3Ryb2tlV2lkdGggYW5kIGZvcmNlZCB0byBibGFjawogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkcmF3aW5nbGF5ZXI6OnByaW1pdGl2ZTJkOjpQcmltaXRpdmUyRFJlZmVyZW5jZSB4RW1iZWRUcmFuc3BhcmVuY2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgZHJhd2luZ2xheWVyOjpwcmltaXRpdmUyZDo6TWFza1ByaW1pdGl2ZTJEKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDbGlwUG9seVBvbHlnb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgckNvbnRlbnQpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHJDb250ZW50ID0gZHJhd2luZ2xheWVyOjpwcmltaXRpdmUyZDo6UHJpbWl0aXZlMkRTZXF1ZW5jZSgmeEVtYmVkVHJhbnNwYXJlbmNlLCAxKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWJBZGRDb250ZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByQ29udGVudC5yZWFsbG9jKDApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIEFuIGVtcHR5IGNsaXBwaW5nIHBhdGggd2lsbCBjb21wbGV0ZWx5IGNsaXAgYXdheSB0aGUgZWxlbWVudCB0aGF0IGhhZCAKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgkWNsaXAtcGF0aJIgcHJvcGVydHkgYXBwbGllZC4gKFN2ZyBzcGVjKQogICAgICAgICAgICAgICAgICAgIHJDb250ZW50LnJlYWxsb2MoMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgfSAvLyBlbmQgb2YgbmFtZXNwYWNlIHN2Z3JlYWRlcgp9IC8vIGVuZCBvZiBuYW1lc3BhY2Ugc3ZnaW8KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBlb2YK