mtrl-addons 0.6.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -862,7 +862,7 @@ var withScrolling = (config = {}) => {
862
862
  }
863
863
  lastScrollTime = Date.now();
864
864
  component.viewport.renderItems();
865
- } else {}
865
+ }
866
866
  };
867
867
  const scrollToIndex = (index, alignment = "start") => {
868
868
  if (!viewportState) {
@@ -3667,17 +3667,17 @@ var createViewport = (config = {}) => {
3667
3667
  };
3668
3668
  };
3669
3669
  export {
3670
- withVirtual,
3671
- withScrolling,
3672
- withScrollbar,
3673
- withRendering,
3674
- withPlaceholders,
3675
- withEvents,
3676
- withCollection,
3677
- withBase,
3670
+ withVirtual2 as withVirtual,
3671
+ withScrolling2 as withScrolling,
3672
+ withScrollbar2 as withScrollbar,
3673
+ withRendering2 as withRendering,
3674
+ withPlaceholders2 as withPlaceholders,
3675
+ withEvents2 as withEvents,
3676
+ withCollection2 as withCollection,
3677
+ withBase2 as withBase,
3678
3678
  createViewport,
3679
- VIEWPORT_CONSTANTS
3679
+ VIEWPORT_CONSTANTS2 as VIEWPORT_CONSTANTS
3680
3680
  };
3681
3681
 
3682
- //# debugId=AFCEF0E39C2254B164756E2164756E21
3683
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvcmUvdmlld3BvcnQvdmlld3BvcnQudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvdXRpbHMudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvYmFzZS50cyIsICIuLi8uLi8uLi9zcmMvY29yZS92aWV3cG9ydC9jb25zdGFudHMudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvdmlydHVhbC50cyIsICIuLi8uLi8uLi9zcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9zY3JvbGxpbmcudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvbW9tZW50dW0udHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvc2Nyb2xsYmFyLnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL2NvbGxlY3Rpb24udHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvcGxhY2Vob2xkZXJzLnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3JlbmRlcmluZy50cyIsICIuLi8uLi8uLi9zcmMvY29yZS9sYXlvdXQvc2NoZW1hLnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL2V2ZW50cy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIvKipcbiAqIFZpZXdwb3J0IC0gQ29yZSB2aXJ0dWFsIHNjcm9sbGluZyBlbmdpbmVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIFZpZXdwb3J0Q29uZmlnLFxuICBWaWV3cG9ydENvbnRleHQsXG4gIFZpZXdwb3J0Q29tcG9uZW50LFxuICBJdGVtUmFuZ2UsXG4gIFZpZXdwb3J0SW5mbyxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IHBpcGUgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgd2l0aEJhc2UgfSBmcm9tIFwiLi9mZWF0dXJlcy9iYXNlXCI7XG5pbXBvcnQgeyB3aXRoVmlydHVhbCB9IGZyb20gXCIuL2ZlYXR1cmVzL3ZpcnR1YWxcIjtcbmltcG9ydCB7IHdpdGhTY3JvbGxpbmcgfSBmcm9tIFwiLi9mZWF0dXJlcy9zY3JvbGxpbmdcIjtcbmltcG9ydCB7IHdpdGhNb21lbnR1bSB9IGZyb20gXCIuL2ZlYXR1cmVzL21vbWVudHVtXCI7XG5pbXBvcnQgeyB3aXRoU2Nyb2xsYmFyIH0gZnJvbSBcIi4vZmVhdHVyZXMvc2Nyb2xsYmFyXCI7XG5pbXBvcnQgeyB3aXRoQ29sbGVjdGlvbiB9IGZyb20gXCIuL2ZlYXR1cmVzL2NvbGxlY3Rpb25cIjtcbmltcG9ydCB7IHdpdGhQbGFjZWhvbGRlcnMgfSBmcm9tIFwiLi9mZWF0dXJlcy9wbGFjZWhvbGRlcnNcIjtcbmltcG9ydCB7IHdpdGhSZW5kZXJpbmcgfSBmcm9tIFwiLi9mZWF0dXJlcy9yZW5kZXJpbmdcIjtcbmltcG9ydCB7IHdpdGhFdmVudHMgfSBmcm9tIFwiLi9mZWF0dXJlcy9ldmVudHNcIjtcblxuLy8gSW50ZXJuYWwgdmlld3BvcnQgc3RhdGVcbmludGVyZmFjZSBWaWV3cG9ydFN0YXRlIHtcbiAgc2Nyb2xsUG9zaXRpb246IG51bWJlcjtcbiAgdG90YWxJdGVtczogbnVtYmVyO1xuICBpdGVtU2l6ZTogbnVtYmVyO1xuICBjb250YWluZXJTaXplOiBudW1iZXI7XG4gIHZpcnR1YWxUb3RhbFNpemU6IG51bWJlcjtcbiAgdmlzaWJsZVJhbmdlOiBJdGVtUmFuZ2U7XG4gIGl0ZW1zQ29udGFpbmVyOiBIVE1MRWxlbWVudCB8IG51bGw7XG4gIHZlbG9jaXR5OiBudW1iZXI7XG4gIHNjcm9sbERpcmVjdGlvbjogXCJmb3J3YXJkXCIgfCBcImJhY2t3YXJkXCI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHZpZXdwb3J0LWVuaGFuY2VkIGNvbXBvbmVudCB1c2luZyBjb21wb3NpdGlvblxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBWaWV3cG9ydCBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBGdW5jdGlvbiB0aGF0IGVuaGFuY2VzIGEgY29tcG9uZW50IHdpdGggdmlld3BvcnQgY2FwYWJpbGl0aWVzXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVWaWV3cG9ydCA9IChjb25maWc6IFZpZXdwb3J0Q29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0Pihjb21wb25lbnQ6IFQpOiBUICYgVmlld3BvcnRDb21wb25lbnQgPT4ge1xuICAgIC8vIFRyYWNrIGlmIHZpZXdwb3J0IGhhcyBiZWVuIGluaXRpYWxpemVkIHRvIHByZXZlbnQgbXVsdGlwbGUgaW5pdGlhbGl6YXRpb25zXG4gICAgbGV0IGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAgIC8vIE5vIG5vcm1hbGl6YXRpb24gbmVlZGVkIC0gd2UnbGwgdXNlIHRoZSBuZXN0ZWQgc3RydWN0dXJlIGRpcmVjdGx5XG5cbiAgICAvLyBDcmVhdGUgc2hhcmVkIHZpZXdwb3J0IHN0YXRlXG4gICAgY29uc3Qgc3RhdGU6IFZpZXdwb3J0U3RhdGUgPSB7XG4gICAgICBzY3JvbGxQb3NpdGlvbjogMCxcbiAgICAgIHRvdGFsSXRlbXM6IGNvbXBvbmVudC50b3RhbEl0ZW1zIHx8IDAsXG4gICAgICBpdGVtU2l6ZTogY29uZmlnLnZpcnR1YWw/Lml0ZW1TaXplIHx8IDUwLFxuICAgICAgY29udGFpbmVyU2l6ZTogMCxcbiAgICAgIHZpcnR1YWxUb3RhbFNpemU6IDAsXG4gICAgICB2aXNpYmxlUmFuZ2U6IHsgc3RhcnQ6IDAsIGVuZDogMCB9LFxuICAgICAgaXRlbXNDb250YWluZXI6IG51bGwsXG4gICAgICB2ZWxvY2l0eTogMCxcbiAgICAgIHNjcm9sbERpcmVjdGlvbjogXCJmb3J3YXJkXCIsXG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSBiYXNlIHZpZXdwb3J0IEFQSVxuICAgIGNvbnN0IHZpZXdwb3J0QVBJID0ge1xuICAgICAgLy8gQ29yZSBBUElcbiAgICAgIGluaXRpYWxpemU6ICgpID0+IHtcbiAgICAgICAgLy8gUHJldmVudCBtdWx0aXBsZSBpbml0aWFsaXphdGlvbnNcbiAgICAgICAgaWYgKGlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaXNJbml0aWFsaXplZCA9IHRydWU7XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJbVmlld3BvcnRdIEluaXRpYWxpemluZyB3aXRoIHN0YXRlOlwiLCB7XG4gICAgICAgIC8vICAgZWxlbWVudDogISFjb21wb25lbnQuZWxlbWVudCxcbiAgICAgICAgLy8gICB0b3RhbEl0ZW1zOiBjb21wb25lbnQudG90YWxJdGVtcyxcbiAgICAgICAgLy8gICBpdGVtU2l6ZTogY29uZmlnLnZpcnR1YWw/Lml0ZW1TaXplLFxuICAgICAgICAvLyB9KTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIGNvbnRhaW5lciBzaXplXG4gICAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICAgIHN0YXRlLmNvbnRhaW5lclNpemUgPVxuICAgICAgICAgICAgY29uZmlnLnNjcm9sbGluZz8ub3JpZW50YXRpb24gPT09IFwiaG9yaXpvbnRhbFwiXG4gICAgICAgICAgICAgID8gY29tcG9uZW50LmVsZW1lbnQub2Zmc2V0V2lkdGhcbiAgICAgICAgICAgICAgOiBjb21wb25lbnQuZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG5cbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltWaWV3cG9ydF0gQ29udGFpbmVyIHNpemU6XCIsIHN0YXRlLmNvbnRhaW5lclNpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIGluaXRpYWwgdmlydHVhbCBzaXplXG4gICAgICAgIHN0YXRlLnZpcnR1YWxUb3RhbFNpemUgPSBzdGF0ZS50b3RhbEl0ZW1zICogc3RhdGUuaXRlbVNpemU7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIGluaXRpYWwgdmlzaWJsZSByYW5nZVxuICAgICAgICBzdGF0ZS52aXNpYmxlUmFuZ2UgPSBjYWxjdWxhdGVWaXNpYmxlUmFuZ2Uoc3RhdGUuc2Nyb2xsUG9zaXRpb24pO1xuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1ZpZXdwb3J0XSBJbml0aWFsIHN0YXRlOlwiLCB7XG4gICAgICAgIC8vICAgY29udGFpbmVyU2l6ZTogc3RhdGUuY29udGFpbmVyU2l6ZSxcbiAgICAgICAgLy8gICB2aXJ0dWFsVG90YWxTaXplOiBzdGF0ZS52aXJ0dWFsVG90YWxTaXplLFxuICAgICAgICAvLyAgIHZpc2libGVSYW5nZTogc3RhdGUudmlzaWJsZVJhbmdlLFxuICAgICAgICAvLyB9KTtcbiAgICAgIH0sXG5cbiAgICAgIGRlc3Ryb3k6ICgpID0+IHtcbiAgICAgICAgLy8gQ2xlYW51cCB3aWxsIGJlIGhhbmRsZWQgYnkgZmVhdHVyZXNcbiAgICAgIH0sXG5cbiAgICAgIHVwZGF0ZVZpZXdwb3J0OiAoKSA9PiB7XG4gICAgICAgIC8vIFdpbGwgYmUgaW1wbGVtZW50ZWQgYnkgcmVuZGVyaW5nIGZlYXR1cmVcbiAgICAgIH0sXG5cbiAgICAgIC8vIENoZWNrIGlmIGFscmVhZHkgaW5pdGlhbGl6ZWRcbiAgICAgIGlzSW5pdGlhbGl6ZWQ6ICgpID0+IGlzSW5pdGlhbGl6ZWQsXG5cbiAgICAgIC8vIFJlc2V0IGluaXRpYWxpemF0aW9uIHN0YXRlIChmb3IgcmVsb2FkIGZ1bmN0aW9uYWxpdHkpXG4gICAgICByZXNldEluaXRpYWxpemF0aW9uOiAoKSA9PiB7XG4gICAgICAgIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIEFsbG93IGZlYXR1cmVzIHRvIGNoZWNrIGlmIGluaXQgc2hvdWxkIHByb2NlZWRcbiAgICAgIF9zaG91bGRJbml0OiAoKSA9PiAhaXNJbml0aWFsaXplZCxcblxuICAgICAgLy8gU2Nyb2xsaW5nIEFQSSAod2lsbCBiZSBvdmVycmlkZGVuIGJ5IHNjcm9sbGluZyBmZWF0dXJlKVxuICAgICAgc2Nyb2xsVG9JbmRleDogKFxuICAgICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgICBhbGlnbm1lbnQ/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIixcbiAgICAgICkgPT4ge1xuICAgICAgICAvLyBQbGFjZWhvbGRlciAtIHdpbGwgYmUgaW1wbGVtZW50ZWQgYnkgc2Nyb2xsaW5nIGZlYXR1cmVcbiAgICAgIH0sXG5cbiAgICAgIHNjcm9sbFRvUG9zaXRpb246IChwb3NpdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgICAgIC8vIFdpbGwgYmUgaW1wbGVtZW50ZWQgYnkgc2Nyb2xsaW5nIGZlYXR1cmVcbiAgICAgIH0sXG5cbiAgICAgIGdldFNjcm9sbFBvc2l0aW9uOiAoKSA9PiBzdGF0ZS5zY3JvbGxQb3NpdGlvbixcblxuICAgICAgLy8gSW5mbyBBUElcbiAgICAgIGdldFZpc2libGVSYW5nZTogKCkgPT4gc3RhdGUudmlzaWJsZVJhbmdlLFxuXG4gICAgICBnZXRWaWV3cG9ydEluZm86ICgpOiBWaWV3cG9ydEluZm8gPT4gKHtcbiAgICAgICAgY29udGFpbmVyU2l6ZTogc3RhdGUuY29udGFpbmVyU2l6ZSxcbiAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZTogc3RhdGUudmlydHVhbFRvdGFsU2l6ZSxcbiAgICAgICAgdmlzaWJsZVJhbmdlOiBzdGF0ZS52aXNpYmxlUmFuZ2UsXG4gICAgICAgIHZpcnR1YWxTY3JvbGxQb3NpdGlvbjogc3RhdGUuc2Nyb2xsUG9zaXRpb24sXG4gICAgICB9KSxcblxuICAgICAgLy8gUmVuZGVyaW5nIEFQSVxuICAgICAgcmVuZGVySXRlbXM6ICgpID0+IHtcbiAgICAgICAgLy8gV2lsbCBiZSBpbXBsZW1lbnRlZCBieSByZW5kZXJpbmcgZmVhdHVyZVxuICAgICAgfSxcblxuICAgICAgLy8gSW50ZXJuYWwgc3RhdGUgKGZvciBmZWF0dXJlcyB0byBhY2Nlc3MpXG4gICAgICBzdGF0ZSxcbiAgICB9O1xuXG4gICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB2aXNpYmxlIHJhbmdlXG4gICAgY29uc3QgY2FsY3VsYXRlVmlzaWJsZVJhbmdlID0gKHNjcm9sbFBvczogbnVtYmVyKTogSXRlbVJhbmdlID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1TaXplID0gc3RhdGUuaXRlbVNpemU7XG4gICAgICBjb25zdCBzdGFydCA9IE1hdGguZmxvb3Ioc2Nyb2xsUG9zIC8gaXRlbVNpemUpO1xuICAgICAgY29uc3QgdmlzaWJsZUNvdW50ID0gTWF0aC5jZWlsKHN0YXRlLmNvbnRhaW5lclNpemUgLyBpdGVtU2l6ZSk7XG4gICAgICBjb25zdCBlbmQgPSBNYXRoLm1pbihzdGFydCArIHZpc2libGVDb3VudCwgc3RhdGUudG90YWxJdGVtcyAtIDEpO1xuXG4gICAgICByZXR1cm4geyBzdGFydDogTWF0aC5tYXgoMCwgc3RhcnQpLCBlbmQ6IE1hdGgubWF4KDAsIGVuZCkgfTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIHZpZXdwb3J0IEFQSSB0byBjb21wb25lbnRcbiAgICBjb25zdCBiYXNlQ29tcG9uZW50ID0ge1xuICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgdmlld3BvcnQ6IHZpZXdwb3J0QVBJLFxuICAgIH07XG5cbiAgICAvLyBCdWlsZCB0aGUgZW5oYW5jZW1lbnQgcGlwZWxpbmVcbiAgICBjb25zdCBlbmhhbmNlcnM6IEFycmF5PChjOiBhbnkpID0+IGFueT4gPSBbXTtcblxuICAgIC8vIEV2ZW50cyBzeXN0ZW0gKGFsd2F5cyBmaXJzdCAtIHByb3ZpZGVzIGNvbW11bmljYXRpb24gZm9yIG90aGVyIGZlYXR1cmVzKVxuICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgd2l0aEV2ZW50cyh7XG4gICAgICAgIGRlYnVnOiBjb25maWcuZGVidWcsXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gQmFzZSBzZXR1cCAoY3JlYXRlcyBET00gc3RydWN0dXJlKVxuICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgd2l0aEJhc2Uoe1xuICAgICAgICBjbGFzc05hbWU6IGNvbmZpZy5jbGFzc05hbWUsXG4gICAgICAgIG9yaWVudGF0aW9uOiBjb25maWcuc2Nyb2xsaW5nPy5vcmllbnRhdGlvbixcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBWaXJ0dWFsIHNjcm9sbGluZyAocmVxdWlyZWQgZm9yIG1vc3QgZmVhdHVyZXMpXG4gICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICB3aXRoVmlydHVhbCh7XG4gICAgICAgIGl0ZW1TaXplOiBjb25maWcudmlydHVhbD8uaXRlbVNpemUsXG4gICAgICAgIG92ZXJzY2FuOiBjb25maWcudmlydHVhbD8ub3ZlcnNjYW4sXG4gICAgICAgIG9yaWVudGF0aW9uOiBjb25maWcuc2Nyb2xsaW5nPy5vcmllbnRhdGlvbixcbiAgICAgICAgYXV0b0RldGVjdEl0ZW1TaXplOiBjb25maWcudmlydHVhbD8uYXV0b0RldGVjdEl0ZW1TaXplLFxuICAgICAgICBpbml0aWFsU2Nyb2xsSW5kZXg6IChjb25maWcgYXMgYW55KS5pbml0aWFsU2Nyb2xsSW5kZXgsXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gU2Nyb2xsaW5nIGJlaGF2aW9yXG4gICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICB3aXRoU2Nyb2xsaW5nKHtcbiAgICAgICAgb3JpZW50YXRpb246IGNvbmZpZy5zY3JvbGxpbmc/Lm9yaWVudGF0aW9uLFxuICAgICAgICBzZW5zaXRpdml0eTogY29uZmlnLnNjcm9sbGluZz8uc2Vuc2l0aXZpdHksXG4gICAgICAgIHNtb290aGluZzogY29uZmlnLnNjcm9sbGluZz8uYW5pbWF0aW9uLFxuICAgICAgICBzdG9wT25DbGljazogY29uZmlnLnNjcm9sbGluZz8uc3RvcE9uQ2xpY2ssXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gTW9tZW50dW0gc2Nyb2xsaW5nICh0b3VjaC9kcmFnIHN1cHBvcnQgZm9yIG1vYmlsZSlcbiAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgIHdpdGhNb21lbnR1bSh7XG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIHN0b3BPbkNsaWNrOiBjb25maWcuc2Nyb2xsaW5nPy5zdG9wT25DbGljayxcbiAgICAgICAgZGVjZWxlcmF0aW9uOiBjb25maWcuc2Nyb2xsaW5nPy5tb21lbnR1bT8uZGVjZWxlcmF0aW9uLFxuICAgICAgICBtaW5WZWxvY2l0eTogY29uZmlnLnNjcm9sbGluZz8ubW9tZW50dW0/Lm1pblZlbG9jaXR5LFxuICAgICAgICBtaW5EdXJhdGlvbjogY29uZmlnLnNjcm9sbGluZz8ubW9tZW50dW0/Lm1heER1cmF0aW9uLFxuICAgICAgICBtaW5WZWxvY2l0eVRocmVzaG9sZDogY29uZmlnLnNjcm9sbGluZz8ubW9tZW50dW0/LnZlbG9jaXR5VGhyZXNob2xkLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIFNjcm9sbGJhciAob3B0aW9uYWwpXG4gICAgaWYgKGNvbmZpZy5zY3JvbGxiYXI/LmVuYWJsZWQgIT09IGZhbHNlKSB7XG4gICAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgICAgd2l0aFNjcm9sbGJhcih7XG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBhdXRvSGlkZTogY29uZmlnLnNjcm9sbGJhcj8uYXV0b0hpZGUsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgY29sbGVjdGlvbiBpZiBjb25maWd1cmVkXG4gICAgaWYgKGNvbmZpZy5jb2xsZWN0aW9uPy5hZGFwdGVyKSB7XG4gICAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgICAgd2l0aENvbGxlY3Rpb24oe1xuICAgICAgICAgIGNvbGxlY3Rpb246IGNvbmZpZy5jb2xsZWN0aW9uLmFkYXB0ZXIsXG4gICAgICAgICAgcmFuZ2VTaXplOiBjb25maWcucGFnaW5hdGlvbj8ubGltaXQsXG4gICAgICAgICAgc3RyYXRlZ3k6IGNvbmZpZy5wYWdpbmF0aW9uPy5zdHJhdGVneSBhc1xuICAgICAgICAgICAgfCBcIm9mZnNldFwiXG4gICAgICAgICAgICB8IFwicGFnZVwiXG4gICAgICAgICAgICB8IFwiY3Vyc29yXCJcbiAgICAgICAgICAgIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHRyYW5zZm9ybTogY29uZmlnLmNvbGxlY3Rpb24/LnRyYW5zZm9ybSxcbiAgICAgICAgICBjYW5jZWxMb2FkVGhyZXNob2xkOiBjb25maWcucGVyZm9ybWFuY2U/LmNhbmNlbExvYWRUaHJlc2hvbGQsXG4gICAgICAgICAgbWF4Q29uY3VycmVudFJlcXVlc3RzOiBjb25maWcucGVyZm9ybWFuY2U/Lm1heENvbmN1cnJlbnRSZXF1ZXN0cyxcbiAgICAgICAgICBlbmFibGVSZXF1ZXN0UXVldWU6IGNvbmZpZy5wZXJmb3JtYW5jZT8uZW5hYmxlUmVxdWVzdFF1ZXVlICE9PSBmYWxzZSxcbiAgICAgICAgICBpbml0aWFsU2Nyb2xsSW5kZXg6IChjb25maWcgYXMgYW55KS5pbml0aWFsU2Nyb2xsSW5kZXgsXG4gICAgICAgICAgc2VsZWN0SWQ6IChjb25maWcgYXMgYW55KS5zZWxlY3RJZCxcbiAgICAgICAgICBhdXRvTG9hZDogKGNvbmZpZyBhcyBhbnkpLmF1dG9Mb2FkICE9PSBmYWxzZSxcbiAgICAgICAgICBhdXRvU2VsZWN0Rmlyc3Q6IChjb25maWcgYXMgYW55KS5hdXRvU2VsZWN0Rmlyc3QsXG4gICAgICAgICAgbWF4Q2FjaGVkSXRlbXM6IGNvbmZpZy5jYWNoZT8ubWF4SXRlbXMsXG4gICAgICAgICAgZXZpY3Rpb25CdWZmZXI6IGNvbmZpZy5jYWNoZT8uZXZpY3Rpb25CdWZmZXIsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBQbGFjZWhvbGRlcnMgKG9wdGlvbmFsLCByZXF1aXJlcyBjb2xsZWN0aW9uKVxuICAgIGlmIChjb25maWcuY29sbGVjdGlvbj8uYWRhcHRlciAmJiBjb25maWcucGxhY2Vob2xkZXJzPy5lbmFibGVkICE9PSBmYWxzZSkge1xuICAgICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICAgIHdpdGhQbGFjZWhvbGRlcnMoe1xuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgYW5hbHl6ZUZpcnN0TG9hZDogY29uZmlnLnBsYWNlaG9sZGVycz8uYW5hbHl6ZUZpcnN0TG9hZCA/PyB0cnVlLFxuICAgICAgICAgIG1hc2tDaGFyYWN0ZXI6IGNvbmZpZy5wbGFjZWhvbGRlcnM/Lm1hc2tDaGFyYWN0ZXIsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBSZW5kZXJpbmcgKGFsd2F5cyBsYXN0IHRvIGhhdmUgYWNjZXNzIHRvIGFsbCBmZWF0dXJlcylcbiAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgIHdpdGhSZW5kZXJpbmcoe1xuICAgICAgICB0ZW1wbGF0ZTogY29uZmlnLnRlbXBsYXRlLFxuICAgICAgICBvdmVyc2NhbjogY29uZmlnLnZpcnR1YWw/Lm92ZXJzY2FuLFxuICAgICAgICBtYWludGFpbkRvbU9yZGVyOiBjb25maWcucmVuZGVyaW5nPy5tYWludGFpbkRvbU9yZGVyLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIENvbXBvc2UgYWxsIGVuaGFuY2Vyc1xuICAgIGNvbnN0IGVuaGFuY2UgPSBwaXBlKC4uLmVuaGFuY2Vycyk7XG5cbiAgICAvLyBBcHBseSBlbmhhbmNlbWVudHNcbiAgICBjb25zdCBlbmhhbmNlZCA9IGVuaGFuY2UoYmFzZUNvbXBvbmVudCk7XG5cbiAgICAvLyBBdXRvLWluaXRpYWxpemUgaWYgZWxlbWVudCBpcyBwcm92aWRlZFxuICAgIGlmIChlbmhhbmNlZC5lbGVtZW50KSB7XG4gICAgICBlbmhhbmNlZC52aWV3cG9ydC5pbml0aWFsaXplKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVuaGFuY2VkIGFzIFQgJiBWaWV3cG9ydENvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3V0aWxzLnRzXG5cbi8qKlxuICogU2hhcmVkIHV0aWxpdGllcyBmb3Igdmlld3BvcnQgZmVhdHVyZXNcbiAqIEVsaW1pbmF0ZXMgY29kZSBkdXBsaWNhdGlvbiBhY3Jvc3MgZmVhdHVyZXNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBXcmFwcyB2aWV3cG9ydCBpbml0aWFsaXphdGlvbiB3aXRoIGZlYXR1cmUtc3BlY2lmaWMgbG9naWNcbiAqIEVsaW1pbmF0ZXMgdGhlIHJlcGVhdGVkIGluaXRpYWxpemF0aW9uIGhvb2sgcGF0dGVyblxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JhcEluaXRpYWxpemU8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50PihcbiAgY29tcG9uZW50OiBULFxuICBmZWF0dXJlSW5pdDogKCkgPT4gdm9pZCxcbik6IHZvaWQge1xuICBjb25zdCBvcmlnaW5hbEluaXRpYWxpemUgPSBjb21wb25lbnQudmlld3BvcnQuaW5pdGlhbGl6ZTtcbiAgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBpbml0aWFsaXplZCAocmV0dXJucyBmYWxzZSBpZiBhbHJlYWR5IGRvbmUpXG4gICAgY29uc3QgcmVzdWx0ID0gb3JpZ2luYWxJbml0aWFsaXplKCk7XG4gICAgLy8gT25seSBydW4gZmVhdHVyZSBpbml0IGlmIGJhc2UgaW5pdCBhY3R1YWxseSByYW4gKGRpZG4ndCByZXR1cm4gZmFsc2UpXG4gICAgaWYgKHJlc3VsdCAhPT0gZmFsc2UpIHtcbiAgICAgIGZlYXR1cmVJbml0KCk7XG4gICAgfVxuICAgIC8vIFByb3BhZ2F0ZSB0aGUgcmVzdWx0IHRocm91Z2ggdGhlIGNoYWluIHNvIG91dGVyIHdyYXBwZXJzIGtub3cgdG8gc2tpcFxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbi8qKlxuICogV3JhcHMgY29tcG9uZW50IGRlc3Ryb3kgd2l0aCBjbGVhbnVwIGxvZ2ljXG4gKiBFbGltaW5hdGVzIHRoZSByZXBlYXRlZCBkZXN0cm95IGhvb2sgcGF0dGVyblxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JhcERlc3Ryb3k8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICBjb21wb25lbnQ6IFQsXG4gIGNsZWFudXA6ICgpID0+IHZvaWQsXG4pOiB2b2lkIHtcbiAgaWYgKFwiZGVzdHJveVwiIGluIGNvbXBvbmVudCAmJiB0eXBlb2YgY29tcG9uZW50LmRlc3Ryb3kgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IGNvbXBvbmVudC5kZXN0cm95O1xuICAgIChjb21wb25lbnQgYXMgYW55KS5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgY2xlYW51cCgpO1xuICAgICAgb3JpZ2luYWxEZXN0cm95Py4oKTtcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogR2V0cyB2aWV3cG9ydCBzdGF0ZSB3aXRoIHByb3BlciB0eXBpbmdcbiAqIEVsaW1pbmF0ZXMgcmVwZWF0ZWQgKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLnN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWaWV3cG9ydFN0YXRlKGNvbXBvbmVudDogVmlld3BvcnRDb21wb25lbnQpOiBhbnkge1xuICByZXR1cm4gKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLnN0YXRlO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhbiBpdGVtIGlzIGEgcGxhY2Vob2xkZXJcbiAqIEVsaW1pbmF0ZXMgZHVwbGljYXRlZCBwbGFjZWhvbGRlciBkZXRlY3Rpb24gbG9naWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGxhY2Vob2xkZXIoaXRlbTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgaXRlbSAmJlxuICAgIHR5cGVvZiBpdGVtID09PSBcIm9iamVjdFwiICYmXG4gICAgKGl0ZW0uX3BsYWNlaG9sZGVyID09PSB0cnVlIHx8IGl0ZW1bXCJfcGxhY2Vob2xkZXJcIl0gPT09IHRydWUpIC8vIFN1cHBvcnQgYm90aCBhY2Nlc3MgcGF0dGVybnNcbiAgKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcmFuZ2Uga2V5IGZvciBkZWR1cGxpY2F0aW9uXG4gKiBVc2VkIGJ5IG11bHRpcGxlIGZlYXR1cmVzIGZvciB0cmFja2luZyByYW5nZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJhbmdlS2V5KHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7cmFuZ2Uuc3RhcnR9LSR7cmFuZ2UuZW5kfWA7XG59XG5cbi8qKlxuICogQ2xhbXBzIGEgdmFsdWUgYmV0d2VlbiBtaW4gYW5kIG1heFxuICogVXNlZCBieSBtdWx0aXBsZSBmZWF0dXJlcyBmb3IgYm91bmRhcnkgY2hlY2tpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYW1wKHZhbHVlOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLm1heChtaW4sIE1hdGgubWluKG1heCwgdmFsdWUpKTtcbn1cblxuLyoqXG4gKiBTdG9yZXMgYSBmdW5jdGlvbiByZWZlcmVuY2Ugb24gdGhlIGNvbXBvbmVudCBmb3IgbGF0ZXIgYWNjZXNzXG4gKiBFbGltaW5hdGVzIHBhdHRlcm4gbGlrZSAoY29tcG9uZW50IGFzIGFueSkuX2ZlYXR1cmVGdW5jdGlvbiA9IGZuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdG9yZUZlYXR1cmVGdW5jdGlvbjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gIGNvbXBvbmVudDogVCxcbiAgbmFtZTogc3RyaW5nLFxuICBmbjogRnVuY3Rpb24sXG4pOiB2b2lkIHtcbiAgKGNvbXBvbmVudCBhcyBhbnkpW25hbWVdID0gZm47XG59XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL2Jhc2UudHNcblxuLyoqXG4gKiBCYXNlIFZpZXdwb3J0IEZlYXR1cmUgLSBTZXRzIHVwIGNvcmUgdmlld3BvcnQgc3RydWN0dXJlXG4gKiBQcm92aWRlcyB0aGUgZm91bmRhdGlvbiBmb3Igb3RoZXIgdmlld3BvcnQgZmVhdHVyZXNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IHdyYXBJbml0aWFsaXplLCBnZXRWaWV3cG9ydFN0YXRlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBCYXNlQ29uZmlnIHtcbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xuICBvcmllbnRhdGlvbj86IFwidmVydGljYWxcIiB8IFwiaG9yaXpvbnRhbFwiO1xufVxuXG4vKipcbiAqIEJhc2UgZmVhdHVyZSBmb3Igdmlld3BvcnRcbiAqIFNldHMgdXAgdGhlIERPTSBzdHJ1Y3R1cmUgYW5kIGNvcmUgc3R5bGVzXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoQmFzZSA9IChjb25maWc6IEJhc2VDb25maWcgPSB7fSkgPT4ge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBWaWV3cG9ydENvbXBvbmVudD4oY29tcG9uZW50OiBUKTogVCA9PiB7XG4gICAgY29uc3QgeyBjbGFzc05hbWUgPSBcIm10cmwtdmlld3BvcnRcIiwgb3JpZW50YXRpb24gPSBcInZlcnRpY2FsXCIgfSA9IGNvbmZpZztcblxuICAgIC8vIFVzZSB0aGUgc2hhcmVkIHdyYXBwZXIgdXRpbGl0eVxuICAgIHdyYXBJbml0aWFsaXplKGNvbXBvbmVudCwgKCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGNvbXBvbmVudC5lbGVtZW50O1xuICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm47XG5cbiAgICAgIC8vIENyZWF0ZSB2aWV3cG9ydCBzdHJ1Y3R1cmVcbiAgICAgIGxldCB2aWV3cG9ydEVsZW1lbnQgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIFwiLm10cmwtdmlld3BvcnRcIlxuICAgICAgKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgaWYgKCF2aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LnN0eWxlLmNzc1RleHQgPSBgXG4gICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICBgO1xuXG4gICAgICAgIC8vIFNldCBvcmllbnRhdGlvblxuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1vcmllbnRhdGlvblwiLCBvcmllbnRhdGlvbik7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGl0ZW1zIGNvbnRhaW5lclxuICAgICAgICBjb25zdCBpdGVtc0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGl0ZW1zQ29udGFpbmVyLmNsYXNzTmFtZSA9IFwibXRybC12aWV3cG9ydC1pdGVtc1wiO1xuICAgICAgICBpdGVtc0NvbnRhaW5lci5zdHlsZS5jc3NUZXh0ID0gYFxuICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgYDtcblxuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYXBwZW5kQ2hpbGQoaXRlbXNDb250YWluZXIpO1xuICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKHZpZXdwb3J0RWxlbWVudCk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHZpZXdwb3J0IHN0YXRlIHdpdGggY29udGFpbmVycyB1c2luZyB1dGlsaXR5XG4gICAgICAgIGNvbnN0IHN0YXRlID0gZ2V0Vmlld3BvcnRTdGF0ZShjb21wb25lbnQpO1xuICAgICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgICBzdGF0ZS52aWV3cG9ydEVsZW1lbnQgPSB2aWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgICAgc3RhdGUuaXRlbXNDb250YWluZXIgPSBpdGVtc0NvbnRhaW5lcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0b3JlIHJlZmVyZW5jZXMgb24gY29tcG9uZW50XG4gICAgICAgIChjb21wb25lbnQgYXMgYW55KS52aWV3cG9ydEVsZW1lbnQgPSB2aWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgIChjb21wb25lbnQgYXMgYW55KS5pdGVtc0NvbnRhaW5lciA9IGl0ZW1zQ29udGFpbmVyO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2NvbnN0YW50cy50c1xuXG4vKipcbiAqIFZpZXdwb3J0IENvbnN0YW50c1xuICogQ2VudHJhbGl6ZWQgY29uc3RhbnRzIGZvciBhbGwgdmlld3BvcnQgZnVuY3Rpb25hbGl0eVxuICogQ29uc29saWRhdGVkIGZyb20gdmlld3BvcnQsIHZpZXdwb3J0L2ZlYXR1cmVzLCBhbmQgbGlzdC1tYW5hZ2VyIGNvbnN0YW50c1xuICovXG5cbmV4cG9ydCBjb25zdCBWSUVXUE9SVF9DT05TVEFOVFMgPSB7XG4gIC8vIFZpcnR1YWwgc2Nyb2xsaW5nIGRlZmF1bHRzXG4gIFZJUlRVQUxfU0NST0xMOiB7XG4gICAgREVGQVVMVF9JVEVNX1NJWkU6IDQ4LFxuICAgIE9WRVJTQ0FOX0JVRkZFUjogMixcbiAgICBTQ1JPTExfU0VOU0lUSVZJVFk6IDAuNyxcbiAgICBNQVhfVklSVFVBTF9TSVpFOiAxMDAgKiAxMDAwICogMTAwMCwgLy8gMTAwTSBwaXhlbHMgLSBtb2Rlcm4gYnJvd3NlcnMgY2FuIGhhbmRsZSB0aGlzXG4gICAgQVVUT19ERVRFQ1RfSVRFTV9TSVpFOiB0cnVlLCAvLyBFbmFibGUgYXV0b21hdGljIGl0ZW0gc2l6ZSBkZXRlY3Rpb25cbiAgfSxcblxuICAvLyBTY3JvbGxpbmcgc2V0dGluZ3NcbiAgU0NST0xMSU5HOiB7XG4gICAgT1ZFUlNDQU46IDEsIC8vIEZyb20gZmVhdHVyZXMvY29uc3RhbnRzXG4gIH0sXG5cbiAgLy8gUmVuZGVyaW5nIHNldHRpbmdzXG4gIFJFTkRFUklORzoge1xuICAgIC8vIEVsZW1lbnQgcmVjeWNsaW5nXG4gICAgREVGQVVMVF9NQVhfUE9PTF9TSVpFOiAxMDAsXG4gICAgQ0xBU1NFUzoge1xuICAgICAgSVRFTTogXCJ2aWV3cG9ydC1pdGVtXCIsXG4gICAgfSxcbiAgfSxcblxuICAvLyBMb2FkaW5nIHNldHRpbmdzXG4gIExPQURJTkc6IHtcbiAgICBDQU5DRUxfVEhSRVNIT0xEOiAyNSwgLy8gcHgvbXMgLSB2ZWxvY2l0eSBhYm92ZSB3aGljaCBsb2FkcyBjYW5jZWxcbiAgICBNQVhfQ09OQ1VSUkVOVF9SRVFVRVNUUzogMSwgLy8gUGFyYWxsZWwgcmVxdWVzdHMgYWxsb3dlZFxuICAgIERFRkFVTFRfUkFOR0VfU0laRTogMjAsIC8vIEl0ZW1zIHBlciByZXF1ZXN0XG4gICAgREVCT1VOQ0VfTE9BRElORzogMTUwLCAvLyBEZWJvdW5jZSBkZWxheSAobXMpXG4gICAgTUlOX1JBTkdFX1NJWkU6IDEwLCAvLyBNaW5pbXVtIGl0ZW1zIHBlciBsb2FkXG4gICAgTUFYX1JBTkdFX1NJWkU6IDEwMCwgLy8gTWF4aW11bSBpdGVtcyBwZXIgbG9hZFxuICAgIFJFUVVFU1RfVElNRU9VVDogNTAwMCwgLy8gUmVxdWVzdCB0aW1lb3V0IChtcylcbiAgICBSRVRSWV9BVFRFTVBUUzogMiwgLy8gRmFpbGVkIHJlcXVlc3QgcmV0cmllc1xuICAgIFJFVFJZX0RFTEFZOiAxMDAwLCAvLyBEZWxheSBiZXR3ZWVuIHJldHJpZXMgKG1zKVxuICB9LFxuXG4gIC8vIFJlcXVlc3QgcXVldWUgY29uZmlndXJhdGlvbiAoZnJvbSBmZWF0dXJlcy9jb25zdGFudHMpXG4gIFJFUVVFU1RfUVVFVUU6IHtcbiAgICBFTkFCTEVEOiB0cnVlLCAvLyBFbmFibGUgcmVxdWVzdCBxdWV1aW5nXG4gICAgTUFYX1FVRVVFX1NJWkU6IDEsIC8vIE1heCBxdWV1ZWQgcmVxdWVzdHNcbiAgICBNQVhfQUNUSVZFX1JFUVVFU1RTOiAyLCAvLyBNYXggY29uY3VycmVudCBhY3RpdmUgcmVxdWVzdHNcbiAgfSxcblxuICAvLyBQbGFjZWhvbGRlciBzZXR0aW5nc1xuICBQTEFDRUhPTERFUjoge1xuICAgIE1BU0tfQ0hBUkFDVEVSOiBcIlhcIiwgLy8gVXBkYXRlZCBmcm9tIGxpc3QtbWFuYWdlclxuICAgIENMQVNTOiBcInZpZXdwb3J0LWl0ZW0tLXBsYWNlaG9sZGVyXCIsXG4gICAgTUFYX1NBTVBMRV9TSVpFOiAyMCxcbiAgICBQTEFDRUhPTERFUl9GTEFHOiBcIl9wbGFjZWhvbGRlclwiLFxuICAgIFJBTkRPTV9MRU5HVEhfVkFSSUFOQ0U6IHRydWUsXG4gIH0sXG5cbiAgLy8gU3BlZWQgdHJhY2tpbmcgKGZyb20gbGlzdC1tYW5hZ2VyKVxuICBTUEVFRF9UUkFDS0lORzoge1xuICAgIC8vIFZlbG9jaXR5IGNhbGN1bGF0aW9uXG4gICAgREVDRUxFUkFUSU9OX0ZBQ1RPUjogMC44NSwgLy8gdmVsb2NpdHkgZGVjYXkgcGVyIGZyYW1lXG4gIH0sXG5cbiAgLy8gTW9tZW50dW0gc2V0dGluZ3NcbiAgTU9NRU5UVU06IHtcbiAgICBFTkFCTEVEOiBmYWxzZSwgLy8gRW5hYmxlIG1vbWVudHVtIGJ5IGRlZmF1bHRcbiAgICBERUNFTEVSQVRJT05fRkFDVE9SOiAwLjk1LCAvLyBIb3cgcXVpY2tseSB2ZWxvY2l0eSBkZWNyZWFzZXMgcGVyIGZyYW1lIChoaWdoZXIgPSBsb25nZXIgY29hc3QpXG4gICAgTUlOX1ZFTE9DSVRZOiAwLjEsIC8vIE1pbmltdW0gdmVsb2NpdHkgYmVmb3JlIHN0b3BwaW5nIChweC9tcylcbiAgICBNSU5fRFVSQVRJT046IDc1MCwgLy8gTWF4aW11bSBnZXN0dXJlIGR1cmF0aW9uIHRvIHRyaWdnZXIgbW9tZW50dW0gKG1zKVxuICAgIE1JTl9WRUxPQ0lUWV9USFJFU0hPTEQ6IDAuNCwgLy8gTWluaW11bSB2ZWxvY2l0eSB0byB0cmlnZ2VyIG1vbWVudHVtIChweC9tcylcbiAgICBGUkFNRV9USU1FOiAxNiwgLy8gQXNzdW1lZCBmcmFtZSB0aW1lIGZvciBjYWxjdWxhdGlvbnMgKG1zKVxuICB9LFxuXG4gIC8vIEluaXRpYWwgbG9hZCBjb25maWd1cmF0aW9uIChmcm9tIGxpc3QtbWFuYWdlcilcbiAgSU5JVElBTF9MT0FEOiB7XG4gICAgU1RSQVRFR1k6IFwicGxhY2Vob2xkZXJzXCIsIC8vIFwicGxhY2Vob2xkZXJzXCIgfCBcImRpcmVjdFwiIHwgXCJwcm9ncmVzc2l2ZVwiXG4gICAgVklFV1BPUlRfTVVMVElQTElFUjogMS41LCAvLyBsb2FkIDEuNXggdmlld3BvcnQgY2FwYWNpdHlcbiAgICBNSU5fSVRFTVM6IDEwLFxuICAgIE1BWF9JVEVNUzogMTAwLFxuICAgIFBMQUNFSE9MREVSX0NPVU5UOiAyMCwgLy8gZGVmYXVsdCBwbGFjZWhvbGRlciBjb3VudFxuICAgIFNIT1dfTE9BRElOR19TVEFURTogdHJ1ZSxcbiAgICBMT0FESU5HX0RFTEFZOiAxMDAsIC8vIG1zIC0gZGVsYXkgYmVmb3JlIHNob3dpbmcgbG9hZGluZyBzdGF0ZVxuICB9LFxuXG4gIC8vIFNlbGVjdGlvbiBzZXR0aW5nc1xuICBTRUxFQ1RJT046IHtcbiAgICBTRUxFQ1RFRF9DTEFTUzogXCJ2aWV3cG9ydC1pdGVtLS1zZWxlY3RlZFwiLFxuICB9LFxuXG4gIC8vIFNjcm9sbGJhciBzZXR0aW5ncyAoZnJvbSBsaXN0LW1hbmFnZXIpXG4gIFNDUk9MTEJBUjoge1xuICAgIC8vIENTUyBjbGFzc2VzXG4gICAgQ0xBU1NFUzoge1xuICAgICAgU0NST0xMQkFSOiBcInZpZXdwb3J0X19zY3JvbGxiYXJcIixcbiAgICAgIFNDUk9MTEJBUl9UUkFDSzogXCJ2aWV3cG9ydF9fc2Nyb2xsYmFyLXRyYWNrXCIsXG4gICAgICBTQ1JPTExCQVJfVEhVTUI6IFwidmlld3BvcnRfX3Njcm9sbGJhci10aHVtYlwiLFxuICAgICAgU0NST0xMQkFSX1ZJU0lCTEU6IFwidmlld3BvcnRfX3Njcm9sbGJhci0tdmlzaWJsZVwiLFxuICAgICAgU0NST0xMQkFSX0RSQUdHSU5HOiBcInZpZXdwb3J0X19zY3JvbGxiYXItLWRyYWdnaW5nXCIsXG4gICAgICBTQ1JPTExCQVJfVEhVTUJfRFJBR0dJTkc6IFwidmlld3BvcnRfX3Njcm9sbGJhci10aHVtYi0tZHJhZ2dpbmdcIixcbiAgICB9LFxuICB9LFxuXG4gIC8vIE9yaWVudGF0aW9uIChmcm9tIGxpc3QtbWFuYWdlcilcbiAgT1JJRU5UQVRJT046IHtcbiAgICBERUZBVUxUX09SSUVOVEFUSU9OOiBcInZlcnRpY2FsXCIsXG4gICAgREVGQVVMVF9DUk9TU19BWElTX0FMSUdOTUVOVDogXCJzdHJldGNoXCIsXG4gICAgUkVWRVJTRV9ESVJFQ1RJT046IGZhbHNlLFxuICB9LFxuXG4gIFBBR0lOQVRJT046IHtcbiAgICBERUZBVUxUX1NUUkFURUdZOiBcIm9mZnNldFwiIGFzIFwib2Zmc2V0XCIgfCBcInBhZ2VcIiB8IFwiY3Vyc29yXCIsXG4gICAgREVGQVVMVF9MSU1JVDogMjAsXG4gICAgU1RSQVRFR0lFUzoge1xuICAgICAgUEFHRTogXCJwYWdlXCIgYXMgY29uc3QsXG4gICAgICBPRkZTRVQ6IFwib2Zmc2V0XCIgYXMgY29uc3QsXG4gICAgICBDVVJTT1I6IFwiY3Vyc29yXCIgYXMgY29uc3QsXG4gICAgfSxcbiAgICBDVVJTT1JfQ0xFQU5VUF9JTlRFUlZBTDogNjAwMDAsIC8vIENsZWFuIHVwIG9sZCBjdXJzb3JzIGV2ZXJ5IG1pbnV0ZVxuICAgIE1BWF9DVVJTT1JfTUFQX1NJWkU6IDEwMDAsIC8vIE1heGltdW0gbnVtYmVyIG9mIGN1cnNvcnMgdG8ga2VlcCBpbiBtZW1vcnlcbiAgICAvLyBDdXJzb3Itc3BlY2lmaWMgdmlydHVhbCBzaXppbmdcbiAgICBDVVJTT1JfU0NST0xMX01BUkdJTl9NVUxUSVBMSUVSOiAzLCAvLyBNdWx0aXBseSByYW5nZVNpemUgYnkgdGhpcyBmb3Igc2Nyb2xsIG1hcmdpblxuICAgIENVUlNPUl9NSU5fVklSVFVBTF9TSVpFX01VTFRJUExJRVI6IDMsIC8vIE1pbmltdW0gdmlydHVhbCBzaXplIGFzIG11bHRpcGxpZXIgb2YgcmFuZ2VTaXplXG4gIH0sXG59O1xuXG4vKipcbiAqIFR5cGUgZm9yIG92ZXJyaWRpbmcgY29uc3RhbnRzIGF0IHJ1bnRpbWVcbiAqL1xuZXhwb3J0IHR5cGUgVmlld3BvcnRDb25zdGFudHMgPSB0eXBlb2YgVklFV1BPUlRfQ09OU1RBTlRTO1xuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBtZXJnZSB1c2VyIGNvbnN0YW50cyB3aXRoIGRlZmF1bHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUNvbnN0YW50cyhcbiAgdXNlckNvbnN0YW50czogUGFydGlhbDxWaWV3cG9ydENvbnN0YW50cz4gPSB7fSxcbik6IFZpZXdwb3J0Q29uc3RhbnRzIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5WSUVXUE9SVF9DT05TVEFOVFMsXG4gICAgLi4udXNlckNvbnN0YW50cyxcbiAgfTtcbn1cbiIsCiAgICAiLyoqXG4gKiBWaXJ0dWFsIEZlYXR1cmUgLSBDb3JlIHZpcnR1YWwgc2Nyb2xsaW5nIGNhbGN1bGF0aW9uc1xuICogSGFuZGxlcyB2aXNpYmxlIHJhbmdlIGNhbGN1bGF0aW9uIGFuZCB0b3RhbCB2aXJ0dWFsIHNpemUgbWFuYWdlbWVudFxuICovXG5cbmltcG9ydCB0eXBlIHsgVmlld3BvcnRDb250ZXh0LCBWaWV3cG9ydENvbXBvbmVudCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVklFV1BPUlRfQ09OU1RBTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgd3JhcEluaXRpYWxpemUsIHdyYXBEZXN0cm95LCBnZXRWaWV3cG9ydFN0YXRlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBWaXJ0dWFsQ29uZmlnIHtcbiAgaXRlbVNpemU/OiBudW1iZXI7XG4gIG92ZXJzY2FuPzogbnVtYmVyO1xuICBvcmllbnRhdGlvbj86IFwidmVydGljYWxcIiB8IFwiaG9yaXpvbnRhbFwiO1xuICBhdXRvRGV0ZWN0SXRlbVNpemU/OiBib29sZWFuO1xuICBkZWJ1Zz86IGJvb2xlYW47XG4gIGluaXRpYWxTY3JvbGxJbmRleD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBWaXJ0dWFsIHNjcm9sbGluZyBmZWF0dXJlIGZvciB2aWV3cG9ydFxuICogSGFuZGxlcyB2aXNpYmxlIHJhbmdlIGNhbGN1bGF0aW9ucyB3aXRoIGNvbXByZXNzaW9uIGZvciBsYXJnZSBkYXRhc2V0c1xuICovXG5leHBvcnQgY29uc3Qgd2l0aFZpcnR1YWwgPSAoY29uZmlnOiBWaXJ0dWFsQ29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KGNvbXBvbmVudDogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGl0ZW1TaXplLFxuICAgICAgb3ZlcnNjYW4gPSBWSUVXUE9SVF9DT05TVEFOVFMuVklSVFVBTF9TQ1JPTEwuT1ZFUlNDQU5fQlVGRkVSLFxuICAgICAgb3JpZW50YXRpb24gPSBcInZlcnRpY2FsXCIsXG4gICAgICBhdXRvRGV0ZWN0SXRlbVNpemUgPSBpdGVtU2l6ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gVklFV1BPUlRfQ09OU1RBTlRTLlZJUlRVQUxfU0NST0xMLkFVVE9fREVURUNUX0lURU1fU0laRVxuICAgICAgICA6IGZhbHNlLFxuICAgICAgZGVidWcgPSBmYWxzZSxcbiAgICAgIGluaXRpYWxTY3JvbGxJbmRleCA9IDAsXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIFVzZSBwcm92aWRlZCBpdGVtU2l6ZSBvciBkZWZhdWx0LCBidXQgbWFyayBpZiB3ZSBzaG91bGQgYXV0by1kZXRlY3RcbiAgICBjb25zdCBpbml0aWFsSXRlbVNpemUgPVxuICAgICAgaXRlbVNpemUgfHwgVklFV1BPUlRfQ09OU1RBTlRTLlZJUlRVQUxfU0NST0xMLkRFRkFVTFRfSVRFTV9TSVpFO1xuXG4gICAgY29uc3QgTUFYX1ZJUlRVQUxfU0laRSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5WSVJUVUFMX1NDUk9MTC5NQVhfVklSVFVBTF9TSVpFO1xuICAgIGxldCB2aWV3cG9ydFN0YXRlOiBhbnk7XG4gICAgbGV0IGhhc0NhbGN1bGF0ZWRJdGVtU2l6ZSA9IGZhbHNlO1xuICAgIGxldCBoYXNSZWNhbGN1bGF0ZWRTY3JvbGxGb3JDb21wcmVzc2lvbiA9IGZhbHNlOyAvLyBUcmFjayBpZiB3ZSd2ZSByZWNhbGN1bGF0ZWQgc2Nyb2xsIHBvc2l0aW9uIGZvciBjb21wcmVzc2lvblxuICAgIGxldCByZXNpemVPYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXIgfCBudWxsID0gbnVsbDtcblxuICAgIC8vIENhY2hlIHZhcmlhYmxlcyBmb3IgcmFuZ2UgY2FsY3VsYXRpb25zIChkZWNsYXJlZCBoZXJlLCBpbml0aWFsaXplZCBsYXRlcilcbiAgICBsZXQgbGFzdFNjcm9sbFBvc2l0aW9uID0gLTE7XG4gICAgbGV0IGxhc3RWaXNpYmxlUmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAgIGxldCBsYXN0QWN0dWFsVmlzaWJsZVJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcblxuICAgIC8vIExpc3RlbiBmb3IgcmVsb2FkOnN0YXJ0IHRvIHJlc2V0IGZlYXR1cmUtc3BlY2lmaWMgc3RhdGVcbiAgICAvLyBOT1RFOiBXZSBkbyBOT1QgcmVzZXQgc2Nyb2xsUG9zaXRpb24gaGVyZSAtIHRoZSBjYWxsZXIgKHJlbG9hZCBvciByZWxvYWRBdClcbiAgICAvLyBpcyByZXNwb25zaWJsZSBmb3Igc2V0dGluZyB0aGUgc2Nyb2xsIHBvc2l0aW9uLiBUaGlzIHByZXZlbnRzIHJhY2UgY29uZGl0aW9uc1xuICAgIC8vIHdoZXJlIHJlbG9hZEF0IHNldHMgYSBwb3NpdGlvbiBidXQgd2UgcmVzZXQgaXQgdG8gMCBiZWZvcmUgdGhlIGxvYWQgY29tcGxldGVzLlxuICAgIGNvbXBvbmVudC5vbj8uKFwicmVsb2FkOnN0YXJ0XCIsICgpID0+IHtcbiAgICAgIGhhc0NhbGN1bGF0ZWRJdGVtU2l6ZSA9IGZhbHNlO1xuICAgICAgaGFzUmVjYWxjdWxhdGVkU2Nyb2xsRm9yQ29tcHJlc3Npb24gPSBmYWxzZTtcbiAgICAgIC8vIFJlc2V0IGNhY2hlXG4gICAgICBsYXN0U2Nyb2xsUG9zaXRpb24gPSAtMTtcbiAgICAgIGxhc3RWaXNpYmxlUmFuZ2UgPSBudWxsO1xuICAgICAgbGFzdEFjdHVhbFZpc2libGVSYW5nZSA9IG51bGw7XG4gICAgICAvLyBSZXNldCB2aWV3cG9ydFN0YXRlIGlmIGl0IGV4aXN0cywgYnV0IHByZXNlcnZlIHNjcm9sbFBvc2l0aW9uXG4gICAgICAvLyBUaGUgY2FsbGVyIChyZWxvYWQvcmVsb2FkQXQpIGlzIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIHNjcm9sbFBvc2l0aW9uXG4gICAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgICAvLyBEb24ndCByZXNldCBzY3JvbGxQb3NpdGlvbiAtIGNhbGxlciBjb250cm9scyBpdFxuICAgICAgICAvLyB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID0gMDtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zID0gMDtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplID0gMDtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS52aXNpYmxlUmFuZ2UgPSB7IHN0YXJ0OiAwLCBlbmQ6IDAgfTtcbiAgICAgICAgZGVsZXRlICh2aWV3cG9ydFN0YXRlIGFzIGFueSkudGFyZ2V0U2Nyb2xsSW5kZXg7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBJbml0aWFsaXplIHVzaW5nIHNoYXJlZCB3cmFwcGVyXG4gICAgd3JhcEluaXRpYWxpemUoY29tcG9uZW50LCAoKSA9PiB7XG4gICAgICB2aWV3cG9ydFN0YXRlID0gZ2V0Vmlld3BvcnRTdGF0ZShjb21wb25lbnQpO1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlKSByZXR1cm47XG5cbiAgICAgIE9iamVjdC5hc3NpZ24odmlld3BvcnRTdGF0ZSwge1xuICAgICAgICBpdGVtU2l6ZTogaW5pdGlhbEl0ZW1TaXplLFxuICAgICAgICBvdmVyc2NhbixcbiAgICAgICAgY29udGFpbmVyU2l6ZTpcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnZpZXdwb3J0RWxlbWVudD8uW1xuICAgICAgICAgICAgb3JpZW50YXRpb24gPT09IFwiaG9yaXpvbnRhbFwiID8gXCJvZmZzZXRXaWR0aFwiIDogXCJvZmZzZXRIZWlnaHRcIlxuICAgICAgICAgIF0gfHwgNjAwLFxuICAgICAgfSk7XG5cbiAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUodmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zKTtcblxuICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBpbml0aWFsIHNjcm9sbCBpbmRleCwgY2FsY3VsYXRlIGluaXRpYWwgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAvLyBOb3RlOiBXZSBzdG9yZSB0aGUgaW5pdGlhbFNjcm9sbEluZGV4IHRvIHVzZSBkaXJlY3RseSBpbiByYW5nZSBjYWxjdWxhdGlvbnNcbiAgICAgIC8vIGJlY2F1c2Ugc2Nyb2xsIHBvc2l0aW9uIG1heSBiZSBjb21wcmVzc2VkIGZvciBsYXJnZSBsaXN0c1xuICAgICAgbGV0IGluaXRpYWxTY3JvbGxQb3NpdGlvbiA9IHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gfHwgMDtcblxuICAgICAgaWYgKGluaXRpYWxTY3JvbGxJbmRleCA+IDApIHtcbiAgICAgICAgLy8gU3RvcmUgdGhlIHRhcmdldCBpbmRleCBmb3IgdXNlIGluIHJhbmdlIGNhbGN1bGF0aW9uc1xuICAgICAgICAodmlld3BvcnRTdGF0ZSBhcyBhbnkpLnRhcmdldFNjcm9sbEluZGV4ID0gaW5pdGlhbFNjcm9sbEluZGV4O1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBzY3JvbGwgcG9zaXRpb24gKG1heSBiZSBjb21wcmVzc2VkIGZvciBsYXJnZSBsaXN0cylcbiAgICAgICAgaW5pdGlhbFNjcm9sbFBvc2l0aW9uID1cbiAgICAgICAgICBpbml0aWFsU2Nyb2xsSW5kZXggKiAodmlld3BvcnRTdGF0ZS5pdGVtU2l6ZSB8fCBpbml0aWFsSXRlbVNpemUpO1xuICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID0gaW5pdGlhbFNjcm9sbFBvc2l0aW9uO1xuXG4gICAgICAgIC8vIE5vdGlmeSBzY3JvbGxpbmcgZmVhdHVyZSB0byBzeW5jIGl0cyBsb2NhbCBzY3JvbGwgcG9zaXRpb25cbiAgICAgICAgLy8gVXNlIHNldFRpbWVvdXQgdG8gZW5zdXJlIHNjcm9sbGluZyBmZWF0dXJlIGhhcyBpbml0aWFsaXplZFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6c2Nyb2xsLXBvc2l0aW9uLXN5bmNcIiwge1xuICAgICAgICAgICAgcG9zaXRpb246IGluaXRpYWxTY3JvbGxQb3NpdGlvbixcbiAgICAgICAgICAgIHNvdXJjZTogXCJpbml0aWFsLXNjcm9sbC1pbmRleFwiLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH1cblxuICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKGluaXRpYWxTY3JvbGxQb3NpdGlvbik7XG5cbiAgICAgIC8vIEVuc3VyZSBjb250YWluZXIgc2l6ZSBpcyBtZWFzdXJlZCBhZnRlciBET00gaXMgcmVhZHlcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHVwZGF0ZUNvbnRhaW5lclNpemUoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTZXQgdXAgUmVzaXplT2JzZXJ2ZXIgdG8gaGFuZGxlIHZpZXdwb3J0IGNvbnRhaW5lciByZXNpemVcbiAgICAgIGlmIChcbiAgICAgICAgdmlld3BvcnRTdGF0ZS52aWV3cG9ydEVsZW1lbnQgJiZcbiAgICAgICAgdHlwZW9mIFJlc2l6ZU9ic2VydmVyICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICApIHtcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIC8vIFVzZSBjb250ZW50Qm94U2l6ZSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gY29udGVudFJlY3RcbiAgICAgICAgICAgIGNvbnN0IHNpemUgPVxuICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9PT0gXCJob3Jpem9udGFsXCJcbiAgICAgICAgICAgICAgICA/IGVudHJ5LmNvbnRlbnRSZWN0LndpZHRoXG4gICAgICAgICAgICAgICAgOiBlbnRyeS5jb250ZW50UmVjdC5oZWlnaHQ7XG5cbiAgICAgICAgICAgIGlmIChzaXplID4gMCAmJiBzaXplICE9PSB2aWV3cG9ydFN0YXRlPy5jb250YWluZXJTaXplKSB7XG4gICAgICAgICAgICAgIHVwZGF0ZUNvbnRhaW5lclNpemUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKHZpZXdwb3J0U3RhdGUudmlld3BvcnRFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEhlbHBlciBmdW5jdGlvbnNcbiAgICBjb25zdCBnZXRDb21wcmVzc2lvblJhdGlvID0gKCk6IG51bWJlciA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGU/LnZpcnR1YWxUb3RhbFNpemUpIHJldHVybiAxO1xuICAgICAgY29uc3QgYWN0dWFsU2l6ZSA9IHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyAqIHZpZXdwb3J0U3RhdGUuaXRlbVNpemU7XG4gICAgICByZXR1cm4gYWN0dWFsU2l6ZSA8PSBNQVhfVklSVFVBTF9TSVpFID8gMSA6IE1BWF9WSVJUVUFMX1NJWkUgLyBhY3R1YWxTaXplO1xuICAgIH07XG5cbiAgICBjb25zdCBsb2cgPSAobWVzc2FnZTogc3RyaW5nLCBkYXRhPzogYW55KSA9PiB7XG4gICAgICBpZiAoZGVidWcpIGNvbnNvbGUubG9nKGBbVmlydHVhbF0gJHttZXNzYWdlfWAsIGRhdGEpO1xuICAgIH07XG5cbiAgICAvLyBDYWxjdWxhdGUgdmlzaWJsZSByYW5nZVxuICAgIGNvbnN0IGNhbGN1bGF0ZVZpc2libGVSYW5nZSA9IChcbiAgICAgIHNjcm9sbFBvc2l0aW9uOiBudW1iZXIsXG4gICAgKTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9ID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbVmlydHVhbF0gTm8gdmlld3BvcnQgc3RhdGUsIHJldHVybmluZyBlbXB0eSByYW5nZVwiKTtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGNvbnRhaW5lclNpemUsIHRvdGFsSXRlbXMgfSA9IHZpZXdwb3J0U3RhdGU7XG5cbiAgICAgIC8vIEVhcmx5IHJldHVybnMgZm9yIGludmFsaWQgc3RhdGVzXG4gICAgICBpZiAoXG4gICAgICAgICFjb250YWluZXJTaXplIHx8XG4gICAgICAgIGNvbnRhaW5lclNpemUgPD0gMCB8fFxuICAgICAgICAhdG90YWxJdGVtcyB8fFxuICAgICAgICB0b3RhbEl0ZW1zIDw9IDBcbiAgICAgICkge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIGFuIGluaXRpYWxTY3JvbGxJbmRleCwgdXNlIGl0IHRvIGNhbGN1bGF0ZSB0aGUgcmFuZ2VcbiAgICAgICAgLy8gZXZlbiB3aGVuIHRvdGFsSXRlbXMgaXMgMCAobm90IHlldCBsb2FkZWQgZnJvbSBBUEkpXG4gICAgICAgIGlmIChpbml0aWFsU2Nyb2xsSW5kZXggPiAwKSB7XG4gICAgICAgICAgY29uc3QgdmlzaWJsZUNvdW50ID0gTWF0aC5jZWlsKFxuICAgICAgICAgICAgKGNvbnRhaW5lclNpemUgfHwgNjAwKSAvXG4gICAgICAgICAgICAgICh2aWV3cG9ydFN0YXRlLml0ZW1TaXplIHx8IGluaXRpYWxJdGVtU2l6ZSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBzdGFydCA9IE1hdGgubWF4KDAsIGluaXRpYWxTY3JvbGxJbmRleCAtIG92ZXJzY2FuKTtcbiAgICAgICAgICBjb25zdCBlbmQgPSBpbml0aWFsU2Nyb2xsSW5kZXggKyB2aXNpYmxlQ291bnQgKyBvdmVyc2NhbjtcbiAgICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgICAgIH1cbiAgICAgICAgbG9nKGBJbnZhbGlkIHN0YXRlOiBjb250YWluZXI9JHtjb250YWluZXJTaXplfSwgaXRlbXM9JHt0b3RhbEl0ZW1zfWApO1xuICAgICAgICByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZpcnR1YWxTaXplID1cbiAgICAgICAgdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplIHx8IHRvdGFsSXRlbXMgKiB2aWV3cG9ydFN0YXRlLml0ZW1TaXplO1xuICAgICAgY29uc3QgdmlzaWJsZUNvdW50ID0gTWF0aC5jZWlsKGNvbnRhaW5lclNpemUgLyB2aWV3cG9ydFN0YXRlLml0ZW1TaXplKTtcbiAgICAgIGNvbnN0IGNvbXByZXNzaW9uUmF0aW8gPSBnZXRDb21wcmVzc2lvblJhdGlvKCk7XG5cbiAgICAgIGxldCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcjtcblxuICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIHRhcmdldCBzY3JvbGwgaW5kZXggKGZvciBpbml0aWFsU2Nyb2xsSW5kZXggd2l0aCBjb21wcmVzc2lvbilcbiAgICAgIGNvbnN0IHRhcmdldFNjcm9sbEluZGV4ID0gKHZpZXdwb3J0U3RhdGUgYXMgYW55KS50YXJnZXRTY3JvbGxJbmRleDtcblxuICAgICAgaWYgKGNvbXByZXNzaW9uUmF0aW8gPCAxKSB7XG4gICAgICAgIC8vIENvbXByZXNzZWQgc3BhY2UgY2FsY3VsYXRpb25cbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHRhcmdldFNjcm9sbEluZGV4LCB1c2UgaXQgZGlyZWN0bHkgaW5zdGVhZCBvZiBjYWxjdWxhdGluZyBmcm9tIHNjcm9sbCBwb3NpdGlvblxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgd2Ugc2hvdyB0aGUgY29ycmVjdCBpdGVtcyBldmVuIHdoZW4gdmlydHVhbCBzcGFjZSBpcyBjb21wcmVzc2VkXG4gICAgICAgIGlmICh0YXJnZXRTY3JvbGxJbmRleCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldFNjcm9sbEluZGV4ID4gMCkge1xuICAgICAgICAgIHN0YXJ0ID0gTWF0aC5tYXgoMCwgdGFyZ2V0U2Nyb2xsSW5kZXggLSBvdmVyc2Nhbik7XG4gICAgICAgICAgZW5kID0gTWF0aC5taW4oXG4gICAgICAgICAgICB0b3RhbEl0ZW1zIC0gMSxcbiAgICAgICAgICAgIHRhcmdldFNjcm9sbEluZGV4ICsgdmlzaWJsZUNvdW50ICsgb3ZlcnNjYW4sXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBDbGVhciB0YXJnZXRTY3JvbGxJbmRleCBhZnRlciBmaXJzdCB1c2Ugc28gbm9ybWFsIHNjcm9sbGluZyB3b3Jrc1xuICAgICAgICAgIGRlbGV0ZSAodmlld3BvcnRTdGF0ZSBhcyBhbnkpLnRhcmdldFNjcm9sbEluZGV4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsU2l6ZTtcbiAgICAgICAgICBjb25zdCBleGFjdEluZGV4ID0gc2Nyb2xsUmF0aW8gKiB0b3RhbEl0ZW1zO1xuICAgICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihleGFjdEluZGV4KTtcbiAgICAgICAgICBlbmQgPSBNYXRoLmNlaWwoZXhhY3RJbmRleCkgKyB2aXNpYmxlQ291bnQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOZWFyLWJvdHRvbSBoYW5kbGluZ1xuICAgICAgICBjb25zdCBtYXhTY3JvbGwgPSB2aXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemU7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlRnJvbUJvdHRvbSA9IG1heFNjcm9sbCAtIHNjcm9sbFBvc2l0aW9uO1xuXG4gICAgICAgIGlmIChkaXN0YW5jZUZyb21Cb3R0b20gPD0gY29udGFpbmVyU2l6ZSAmJiBkaXN0YW5jZUZyb21Cb3R0b20gPj0gLTEpIHtcbiAgICAgICAgICBjb25zdCBpdGVtc0F0Qm90dG9tID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgIGNvbnRhaW5lclNpemUgLyB2aWV3cG9ydFN0YXRlLml0ZW1TaXplLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgZmlyc3RWaXNpYmxlQXRCb3R0b20gPSBNYXRoLm1heCgwLCB0b3RhbEl0ZW1zIC0gaXRlbXNBdEJvdHRvbSk7XG4gICAgICAgICAgY29uc3QgaW50ZXJwb2xhdGlvbiA9IE1hdGgubWF4KFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIE1hdGgubWluKDEsIDEgLSBkaXN0YW5jZUZyb21Cb3R0b20gLyBjb250YWluZXJTaXplKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgc3RhcnQgPSBNYXRoLmZsb29yKFxuICAgICAgICAgICAgc3RhcnQgKyAoZmlyc3RWaXNpYmxlQXRCb3R0b20gLSBzdGFydCkgKiBpbnRlcnBvbGF0aW9uLFxuICAgICAgICAgICk7XG4gICAgICAgICAgZW5kID1cbiAgICAgICAgICAgIGRpc3RhbmNlRnJvbUJvdHRvbSA8PSAxXG4gICAgICAgICAgICAgID8gdG90YWxJdGVtcyAtIDFcbiAgICAgICAgICAgICAgOiBNYXRoLm1pbih0b3RhbEl0ZW1zIC0gMSwgc3RhcnQgKyB2aXNpYmxlQ291bnQgKyBvdmVyc2Nhbik7XG5cbiAgICAgICAgICBsb2coXCJOZWFyIGJvdHRvbSBjYWxjdWxhdGlvbjpcIiwge1xuICAgICAgICAgICAgZGlzdGFuY2VGcm9tQm90dG9tLFxuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbixcbiAgICAgICAgICAgIHN0YXJ0LFxuICAgICAgICAgICAgZW5kLFxuICAgICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwbHkgb3ZlcnNjYW5cbiAgICAgICAgc3RhcnQgPSBNYXRoLm1heCgwLCBzdGFydCAtIG92ZXJzY2FuKTtcbiAgICAgICAgZW5kID0gTWF0aC5taW4odG90YWxJdGVtcyAtIDEsIGVuZCArIG92ZXJzY2FuKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpcmVjdCBjYWxjdWxhdGlvblxuICAgICAgICBzdGFydCA9IE1hdGgubWF4KFxuICAgICAgICAgIDAsXG4gICAgICAgICAgTWF0aC5mbG9vcihzY3JvbGxQb3NpdGlvbiAvIHZpZXdwb3J0U3RhdGUuaXRlbVNpemUpIC0gb3ZlcnNjYW4sXG4gICAgICAgICk7XG4gICAgICAgIGVuZCA9IE1hdGgubWluKHRvdGFsSXRlbXMgLSAxLCBzdGFydCArIHZpc2libGVDb3VudCArIG92ZXJzY2FuICogMik7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIG91dHB1dFxuICAgICAgaWYgKGlzTmFOKHN0YXJ0KSB8fCBpc05hTihlbmQpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbVmlydHVhbF0gTmFOIGluIHJhbmdlIGNhbGN1bGF0aW9uOlwiLCB7XG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgY29udGFpbmVyU2l6ZSxcbiAgICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICAgIGl0ZW1TaXplOiB2aWV3cG9ydFN0YXRlLml0ZW1TaXplLFxuICAgICAgICAgIGNvbXByZXNzaW9uUmF0aW8sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgICB9XG5cbiAgICAgIC8vIFN0cmF0ZWdpYyBsb2cgZm9yIGxhc3QgcmFuZ2VcbiAgICAgIC8vIGlmIChlbmQgPj0gdG90YWxJdGVtcyAtIDEwKSB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICAgIGBbVmlydHVhbF0gTmVhciBlbmQgcmFuZ2U6ICR7c3RhcnR9LSR7ZW5kfSwgdG90YWxJdGVtcz0ke3RvdGFsSXRlbXN9LCBsYXN0SXRlbVBvcz0ke1xuICAgICAgLy8gICAgICAgZW5kICogdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZVxuICAgICAgLy8gICAgIH1weCwgdmlydHVhbFNpemU9JHt2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemV9cHhgXG4gICAgICAvLyAgICk7XG4gICAgICAvLyB9XG5cbiAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICB9O1xuXG4gICAgLy8gQ2FsY3VsYXRlIGFjdHVhbCB2aXNpYmxlIHJhbmdlICh3aXRob3V0IG92ZXJzY2FuIGJ1ZmZlcilcbiAgICBjb25zdCBjYWxjdWxhdGVBY3R1YWxWaXNpYmxlUmFuZ2UgPSAoc2Nyb2xsUG9zaXRpb246IG51bWJlcikgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlKSByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG5cbiAgICAgIGNvbnN0IHsgY29udGFpbmVyU2l6ZSwgdG90YWxJdGVtcyB9ID0gdmlld3BvcnRTdGF0ZTtcblxuICAgICAgaWYgKCFjb250YWluZXJTaXplIHx8ICF0b3RhbEl0ZW1zKSByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG5cbiAgICAgIGNvbnN0IGl0ZW1TaXplID0gdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZTtcbiAgICAgIGNvbnN0IHZpc2libGVDb3VudCA9IE1hdGguY2VpbChjb250YWluZXJTaXplIC8gaXRlbVNpemUpO1xuICAgICAgY29uc3QgYWN0dWFsU2l6ZSA9IHRvdGFsSXRlbXMgKiBpdGVtU2l6ZTtcbiAgICAgIGNvbnN0IHZpcnR1YWxTaXplID0gdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplIHx8IGFjdHVhbFNpemU7XG4gICAgICAvLyBjb21wcmVzc2lvblJhdGlvIDwgMSBtZWFucyBsaXN0IGlzIGNvbXByZXNzZWQgKHZpcnR1YWxTaXplIDwgYWN0dWFsU2l6ZSlcbiAgICAgIGNvbnN0IGNvbXByZXNzaW9uUmF0aW8gPSBhY3R1YWxTaXplID4gMCA/IHZpcnR1YWxTaXplIC8gYWN0dWFsU2l6ZSA6IDE7XG5cbiAgICAgIGxldCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcjtcblxuICAgICAgaWYgKGNvbXByZXNzaW9uUmF0aW8gPCAxKSB7XG4gICAgICAgIC8vIENvbXByZXNzZWQgc3BhY2UgLSBjYWxjdWxhdGUgYmFzZWQgb24gc2Nyb2xsIHJhdGlvXG4gICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsU2l6ZTtcbiAgICAgICAgc3RhcnQgPSBNYXRoLmZsb29yKHNjcm9sbFJhdGlvICogdG90YWxJdGVtcyk7XG4gICAgICAgIGVuZCA9IE1hdGgubWluKHRvdGFsSXRlbXMgLSAxLCBzdGFydCArIHZpc2libGVDb3VudCAtIDEpO1xuXG4gICAgICAgIC8vIE5lYXItYm90dG9tIGhhbmRsaW5nIC0gZW5zdXJlIHdlIHNob3cgdGhlIGFjdHVhbCBsYXN0IGl0ZW1zIGF0IGJvdHRvbVxuICAgICAgICBjb25zdCBtYXhTY3JvbGwgPSB2aXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemU7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlRnJvbUJvdHRvbSA9IG1heFNjcm9sbCAtIHNjcm9sbFBvc2l0aW9uO1xuXG4gICAgICAgIGlmIChkaXN0YW5jZUZyb21Cb3R0b20gPD0gY29udGFpbmVyU2l6ZSAmJiBkaXN0YW5jZUZyb21Cb3R0b20gPj0gLTEpIHtcbiAgICAgICAgICBjb25zdCBpdGVtc0F0Qm90dG9tID0gTWF0aC5mbG9vcihjb250YWluZXJTaXplIC8gaXRlbVNpemUpO1xuICAgICAgICAgIGNvbnN0IGZpcnN0VmlzaWJsZUF0Qm90dG9tID0gTWF0aC5tYXgoMCwgdG90YWxJdGVtcyAtIGl0ZW1zQXRCb3R0b20pO1xuICAgICAgICAgIGNvbnN0IGludGVycG9sYXRpb24gPSBNYXRoLm1heChcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBNYXRoLm1pbigxLCAxIC0gZGlzdGFuY2VGcm9tQm90dG9tIC8gY29udGFpbmVyU2l6ZSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgIHN0YXJ0ICsgKGZpcnN0VmlzaWJsZUF0Qm90dG9tIC0gc3RhcnQpICogaW50ZXJwb2xhdGlvbixcbiAgICAgICAgICApO1xuICAgICAgICAgIGVuZCA9XG4gICAgICAgICAgICBkaXN0YW5jZUZyb21Cb3R0b20gPD0gMVxuICAgICAgICAgICAgICA/IHRvdGFsSXRlbXMgLSAxXG4gICAgICAgICAgICAgIDogTWF0aC5taW4odG90YWxJdGVtcyAtIDEsIHN0YXJ0ICsgdmlzaWJsZUNvdW50IC0gMSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpcmVjdCBjYWxjdWxhdGlvblxuICAgICAgICBzdGFydCA9IE1hdGguZmxvb3Ioc2Nyb2xsUG9zaXRpb24gLyBpdGVtU2l6ZSk7XG4gICAgICAgIGVuZCA9IE1hdGgubWluKHRvdGFsSXRlbXMgLSAxLCBzdGFydCArIHZpc2libGVDb3VudCAtIDEpO1xuICAgICAgfVxuXG4gICAgICAvLyBFbnN1cmUgdmFsaWQgcmFuZ2VcbiAgICAgIHN0YXJ0ID0gTWF0aC5tYXgoMCwgc3RhcnQpO1xuICAgICAgZW5kID0gTWF0aC5tYXgoc3RhcnQsIGVuZCk7XG5cbiAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIGZ1bmN0aW9uc1xuICAgIGNvbnN0IHVwZGF0ZVZpc2libGVSYW5nZSA9IChzY3JvbGxQb3NpdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUpIHJldHVybjtcblxuICAgICAgLy8gU2tpcCBpZiBzY3JvbGwgcG9zaXRpb24gaGFzbid0IGNoYW5nZWQgc2lnbmlmaWNhbnRseSAod2l0aGluIDFweClcbiAgICAgIGlmIChcbiAgICAgICAgbGFzdFNjcm9sbFBvc2l0aW9uID49IDAgJiZcbiAgICAgICAgTWF0aC5hYnMoc2Nyb2xsUG9zaXRpb24gLSBsYXN0U2Nyb2xsUG9zaXRpb24pIDwgMVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGFzdFNjcm9sbFBvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICB2aWV3cG9ydFN0YXRlLnZpc2libGVSYW5nZSA9IGNhbGN1bGF0ZVZpc2libGVSYW5nZShzY3JvbGxQb3NpdGlvbik7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBhY3R1YWwgdmlzaWJsZSByYW5nZSAod2l0aG91dCBvdmVyc2NhbikgZm9yIFVJIGRpc3BsYXlcbiAgICAgIGNvbnN0IGFjdHVhbFZpc2libGVSYW5nZSA9IGNhbGN1bGF0ZUFjdHVhbFZpc2libGVSYW5nZShzY3JvbGxQb3NpdGlvbik7XG5cbiAgICAgIC8vIFNraXAgZW1pdCBpZiByYW5nZXMgaGF2ZW4ndCBjaGFuZ2VkXG4gICAgICBpZiAoXG4gICAgICAgIGxhc3RWaXNpYmxlUmFuZ2UgJiZcbiAgICAgICAgbGFzdEFjdHVhbFZpc2libGVSYW5nZSAmJlxuICAgICAgICBsYXN0VmlzaWJsZVJhbmdlLnN0YXJ0ID09PSB2aWV3cG9ydFN0YXRlLnZpc2libGVSYW5nZS5zdGFydCAmJlxuICAgICAgICBsYXN0VmlzaWJsZVJhbmdlLmVuZCA9PT0gdmlld3BvcnRTdGF0ZS52aXNpYmxlUmFuZ2UuZW5kICYmXG4gICAgICAgIGxhc3RBY3R1YWxWaXNpYmxlUmFuZ2Uuc3RhcnQgPT09IGFjdHVhbFZpc2libGVSYW5nZS5zdGFydCAmJlxuICAgICAgICBsYXN0QWN0dWFsVmlzaWJsZVJhbmdlLmVuZCA9PT0gYWN0dWFsVmlzaWJsZVJhbmdlLmVuZFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGFzdFZpc2libGVSYW5nZSA9IHsgLi4udmlld3BvcnRTdGF0ZS52aXNpYmxlUmFuZ2UgfTtcbiAgICAgIGxhc3RBY3R1YWxWaXNpYmxlUmFuZ2UgPSB7IC4uLmFjdHVhbFZpc2libGVSYW5nZSB9O1xuXG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6cmFuZ2UtY2hhbmdlZFwiLCB7XG4gICAgICAgIHJhbmdlOiB2aWV3cG9ydFN0YXRlLnZpc2libGVSYW5nZSxcbiAgICAgICAgdmlzaWJsZVJhbmdlOiBhY3R1YWxWaXNpYmxlUmFuZ2UsXG4gICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSB0b3RhbCB2aXJ0dWFsIHNpemVcbiAgICBjb25zdCB1cGRhdGVUb3RhbFZpcnR1YWxTaXplID0gKHRvdGFsSXRlbXM6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG9sZFNpemUgPSB2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemU7XG4gICAgICB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgPSB0b3RhbEl0ZW1zO1xuICAgICAgY29uc3QgYWN0dWFsU2l6ZSA9IHRvdGFsSXRlbXMgKiB2aWV3cG9ydFN0YXRlLml0ZW1TaXplO1xuXG4gICAgICAvLyBHZXQgcGFkZGluZyBmcm9tIHRoZSBpdGVtcyBjb250YWluZXIgaWYgYXZhaWxhYmxlXG4gICAgICBsZXQgdG90YWxQYWRkaW5nID0gMDtcbiAgICAgIGlmICh2aWV3cG9ydFN0YXRlLml0ZW1zQ29udGFpbmVyKSB7XG4gICAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLml0ZW1zQ29udGFpbmVyLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBwYWRkaW5nVG9wID0gcGFyc2VGbG9hdChjb21wdXRlZFN0eWxlLnBhZGRpbmdUb3ApIHx8IDA7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdCb3R0b20gPSBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUucGFkZGluZ0JvdHRvbSkgfHwgMDtcbiAgICAgICAgdG90YWxQYWRkaW5nID0gcGFkZGluZ1RvcCArIHBhZGRpbmdCb3R0b207XG4gICAgICB9XG5cbiAgICAgIC8vIEluY2x1ZGUgcGFkZGluZyBpbiB0aGUgdmlydHVhbCBzaXplXG4gICAgICB2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemUgPSBNYXRoLm1pbihcbiAgICAgICAgYWN0dWFsU2l6ZSArIHRvdGFsUGFkZGluZyxcbiAgICAgICAgTUFYX1ZJUlRVQUxfU0laRSxcbiAgICAgICk7XG5cbiAgICAgIC8vIFN0cmF0ZWdpYyBsb2cgZm9yIGRlYnVnZ2luZyBnYXAgaXNzdWVcbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1ZpcnR1YWxdIFRvdGFsIHNpemUgdXBkYXRlOiBpdGVtcz0ke3RvdGFsSXRlbXN9LCBpdGVtU2l6ZT0ke3ZpZXdwb3J0U3RhdGUuaXRlbVNpemV9cHgsIHBhZGRpbmc9JHt0b3RhbFBhZGRpbmd9cHgsIHZpcnR1YWxTaXplPSR7dmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplfXB4ICh3YXMgJHtvbGRTaXplfXB4KWBcbiAgICAgIC8vICk7XG5cbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDp2aXJ0dWFsLXNpemUtY2hhbmdlZFwiLCB7XG4gICAgICAgIHRvdGFsVmlydHVhbFNpemU6IHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZSxcbiAgICAgICAgdG90YWxJdGVtczogdG90YWxJdGVtcyxcbiAgICAgICAgY29tcHJlc3Npb25SYXRpbzogZ2V0Q29tcHJlc3Npb25SYXRpbygpLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSBjb250YWluZXIgc2l6ZVxuICAgIGNvbnN0IHVwZGF0ZUNvbnRhaW5lclNpemUgPSAoKSA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUgfHwgIXZpZXdwb3J0U3RhdGUudmlld3BvcnRFbGVtZW50KSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHNpemUgPVxuICAgICAgICB2aWV3cG9ydFN0YXRlLnZpZXdwb3J0RWxlbWVudFtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLm9yaWVudGF0aW9uID09PSBcImhvcml6b250YWxcIlxuICAgICAgICAgICAgPyBcIm9mZnNldFdpZHRoXCJcbiAgICAgICAgICAgIDogXCJvZmZzZXRIZWlnaHRcIlxuICAgICAgICBdO1xuXG4gICAgICAvLyBMb2cgdGhlIGFjdHVhbCBtZWFzdXJlbWVudFxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbVmlydHVhbF0gQ29udGFpbmVyIHNpemUgbWVhc3VyZWQ6ICR7c2l6ZX1weCBmcm9tIHZpZXdwb3J0IGVsZW1lbnRgXG4gICAgICAvLyApO1xuXG4gICAgICBpZiAoc2l6ZSAhPT0gdmlld3BvcnRTdGF0ZS5jb250YWluZXJTaXplKSB7XG4gICAgICAgIHZpZXdwb3J0U3RhdGUuY29udGFpbmVyU2l6ZSA9IHNpemU7XG4gICAgICAgIHVwZGF0ZVZpc2libGVSYW5nZSh2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uIHx8IDApO1xuICAgICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplKHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyk7IC8vIEFsc28gdXBkYXRlIHZpcnR1YWwgc2l6ZVxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6Y29udGFpbmVyLXNpemUtY2hhbmdlZFwiLCB7XG4gICAgICAgICAgY29udGFpbmVyU2l6ZTogc2l6ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIE92ZXJyaWRlIHZpZXdwb3J0IG1ldGhvZHNcbiAgICBjb21wb25lbnQudmlld3BvcnQuZ2V0VmlzaWJsZVJhbmdlID0gKCkgPT5cbiAgICAgIHZpZXdwb3J0U3RhdGU/LnZpc2libGVSYW5nZSB8fFxuICAgICAgY2FsY3VsYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGU/LnNjcm9sbFBvc2l0aW9uIHx8IDApO1xuXG4gICAgLy8gRXZlbnQgbGlzdGVuZXJzXG4gICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpzY3JvbGxcIiwgKGRhdGE6IGFueSkgPT5cbiAgICAgIHVwZGF0ZVZpc2libGVSYW5nZShkYXRhLnBvc2l0aW9uKSxcbiAgICApO1xuXG4gICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDppdGVtcy1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgIGlmIChkYXRhLnRvdGFsSXRlbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplKGRhdGEudG90YWxJdGVtcyk7XG4gICAgICAgIHVwZGF0ZVZpc2libGVSYW5nZSh2aWV3cG9ydFN0YXRlPy5zY3JvbGxQb3NpdGlvbiB8fCAwKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIExpc3RlbiBmb3IgdG90YWwgaXRlbXMgY2hhbmdlcyAoaW1wb3J0YW50IGZvciBjdXJzb3IgcGFnaW5hdGlvbilcbiAgICAvLyBOb3RlOiBzZXRUb3RhbEl0ZW1zKCkgdXBkYXRlcyB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgQkVGT1JFIGVtaXR0aW5nIHRoaXMgZXZlbnQsXG4gICAgLy8gc28gd2UgY2FuJ3QgcmVseSBvbiB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgdG8gZGV0ZWN0IHRoZSBmaXJzdCB0b3RhbC5cbiAgICAvLyBJbnN0ZWFkIHdlIHVzZSB0aGUgaGFzUmVjYWxjdWxhdGVkU2Nyb2xsRm9yQ29tcHJlc3Npb24gZmxhZy5cbiAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnRvdGFsLWl0ZW1zLWNoYW5nZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKGRhdGEudG90YWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG4gICAgICAvLyBGSVg6IFdoZW4gd2UgZmlyc3QgcmVjZWl2ZSB0b3RhbEl0ZW1zIHdpdGggaW5pdGlhbFNjcm9sbEluZGV4IGFuZCBjb21wcmVzc2lvbixcbiAgICAgIC8vIHJlY2FsY3VsYXRlIHNjcm9sbCBwb3NpdGlvbiB0byBhY2NvdW50IGZvciBjb21wcmVzc2lvbi5cbiAgICAgIC8vIFdpdGhvdXQgdGhpcywgaW5pdGlhbFNjcm9sbEluZGV4IGNhbGN1bGF0ZXMgcG9zaXRpb24gYXMgaW5kZXggKiBpdGVtU2l6ZSxcbiAgICAgIC8vIGJ1dCByZW5kZXJpbmcgdXNlcyBjb21wcmVzc2VkIHNwYWNlLCBjYXVzaW5nIGl0ZW1zIHRvIGFwcGVhciBvZmYtc2NyZWVuLlxuICAgICAgLy9cbiAgICAgIC8vIFdlIGNoZWNrIHRoaXMgQkVGT1JFIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUgYmVjYXVzZSB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlXG4gICAgICAvLyBzY3JvbGwgcG9zaXRpb24gYmFzZWQgb24gdGhlIG5ldyB0b3RhbCwgYW5kIHRoZSBmbGFnIGVuc3VyZXMgd2Ugb25seSBkbyB0aGlzIG9uY2UuXG4gICAgICBpZiAoXG4gICAgICAgIGluaXRpYWxTY3JvbGxJbmRleCA+IDAgJiZcbiAgICAgICAgIWhhc1JlY2FsY3VsYXRlZFNjcm9sbEZvckNvbXByZXNzaW9uICYmXG4gICAgICAgIGRhdGEudG90YWwgPiAwXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgYWN0dWFsVG90YWxTaXplID0gZGF0YS50b3RhbCAqIHZpZXdwb3J0U3RhdGUuaXRlbVNpemU7XG4gICAgICAgIGNvbnN0IGlzQ29tcHJlc3NlZCA9IGFjdHVhbFRvdGFsU2l6ZSA+IE1BWF9WSVJUVUFMX1NJWkU7XG5cbiAgICAgICAgaWYgKGlzQ29tcHJlc3NlZCkge1xuICAgICAgICAgIC8vIFJlY2FsY3VsYXRlIHNjcm9sbCBwb3NpdGlvbiB1c2luZyBjb21wcmVzc2lvbi1hd2FyZSBmb3JtdWxhXG4gICAgICAgICAgLy8gU2FtZSBmb3JtdWxhIHVzZWQgaW4gc2Nyb2xsVG9JbmRleFxuICAgICAgICAgIGNvbnN0IHJhdGlvID0gaW5pdGlhbFNjcm9sbEluZGV4IC8gZGF0YS50b3RhbDtcbiAgICAgICAgICBjb25zdCBjb21wcmVzc2VkUG9zaXRpb24gPSByYXRpbyAqIE1BWF9WSVJUVUFMX1NJWkU7XG5cbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID0gY29tcHJlc3NlZFBvc2l0aW9uO1xuXG4gICAgICAgICAgLy8gTm90aWZ5IHNjcm9sbGluZyBmZWF0dXJlIHRvIHN5bmMgaXRzIGxvY2FsIHNjcm9sbCBwb3NpdGlvblxuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpzY3JvbGwtcG9zaXRpb24tc3luY1wiLCB7XG4gICAgICAgICAgICBwb3NpdGlvbjogY29tcHJlc3NlZFBvc2l0aW9uLFxuICAgICAgICAgICAgc291cmNlOiBcImNvbXByZXNzaW9uLXJlY2FsY3VsYXRpb25cIixcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIENsZWFyIHRhcmdldFNjcm9sbEluZGV4IHNpbmNlIHdlJ3ZlIG5vdyBjb3JyZWN0bHkgY2FsY3VsYXRlZCB0aGUgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgICAgLy8gVGhlIG5vcm1hbCBjb21wcmVzc2VkIHNjcm9sbGluZyBmb3JtdWxhIHdpbGwgbm93IHdvcmsgY29ycmVjdGx5XG4gICAgICAgICAgZGVsZXRlICh2aWV3cG9ydFN0YXRlIGFzIGFueSkudGFyZ2V0U2Nyb2xsSW5kZXg7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYXJrIGFzIGRvbmUgZXZlbiBpZiBub3QgY29tcHJlc3NlZCAtIHdlIG9ubHkgd2FudCB0byBkbyB0aGlzIGNoZWNrIG9uY2VcbiAgICAgICAgaGFzUmVjYWxjdWxhdGVkU2Nyb2xsRm9yQ29tcHJlc3Npb24gPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplKGRhdGEudG90YWwpO1xuICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGU/LnNjcm9sbFBvc2l0aW9uIHx8IDApO1xuXG4gICAgICAvLyBUcmlnZ2VyIGEgcmVuZGVyIHRvIHVwZGF0ZSB0aGUgdmlld1xuICAgICAgY29tcG9uZW50LnZpZXdwb3J0Py5yZW5kZXJJdGVtcz8uKCk7XG4gICAgfSk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIGNvbnRhaW5lciBzaXplIGNoYW5nZXMgdG8gcmVjYWxjdWxhdGUgdmlydHVhbCBzaXplXG4gICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpjb250YWluZXItc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgIGlmICh2aWV3cG9ydFN0YXRlICYmIGRhdGEuY29udGFpbmVyU2l6ZSAhPT0gdmlld3BvcnRTdGF0ZS5jb250YWluZXJTaXplKSB7XG4gICAgICAgIHZpZXdwb3J0U3RhdGUuY29udGFpbmVyU2l6ZSA9IGRhdGEuY29udGFpbmVyU2l6ZTtcbiAgICAgICAgLy8gUmVjYWxjdWxhdGUgdmlydHVhbCBzaXplIHdpdGggbmV3IGNvbnRhaW5lciBzaXplXG4gICAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUodmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zKTtcbiAgICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb21wb25lbnQub24/LihcImNvbGxlY3Rpb246cmFuZ2UtbG9hZGVkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgZGF0YS50b3RhbCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIGRhdGEudG90YWwgIT09IHZpZXdwb3J0U3RhdGU/LnRvdGFsSXRlbXNcbiAgICAgICkge1xuICAgICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplKGRhdGEudG90YWwpO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3JjZSB2aXNpYmxlIHJhbmdlIHJlY2FsY3VsYXRpb24gYWZ0ZXIgZGF0YSBsb2Fkc1xuICAgICAgLy8gVGhpcyBpcyBjcml0aWNhbDogdG90YWxJdGVtcyBtYXkgaGF2ZSBiZWVuIHVwZGF0ZWQgYnkgY29sbGVjdGlvbi5zZXRUb3RhbEl0ZW1zKClcbiAgICAgIC8vIHdoaWNoIGJ5cGFzc2VzIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUsIHNvIGxhc3RTY3JvbGxQb3NpdGlvbiB3YXNuJ3QgcmVzZXQuXG4gICAgICAvLyBXZSBtdXN0IHJlY2FsY3VsYXRlIHRvIGVuc3VyZSB2aXNpYmxlUmFuZ2UgcmVmbGVjdHMgdGhlIG5ldyB0b3RhbEl0ZW1zLlxuICAgICAgbGFzdFNjcm9sbFBvc2l0aW9uID0gLTE7XG5cbiAgICAgIHVwZGF0ZVZpc2libGVSYW5nZSh2aWV3cG9ydFN0YXRlPy5zY3JvbGxQb3NpdGlvbiB8fCAwKTtcbiAgICAgIGNvbXBvbmVudC52aWV3cG9ydD8ucmVuZGVySXRlbXM/LigpO1xuICAgIH0pO1xuXG4gICAgLy8gTGlzdGVuIGZvciBmaXJzdCBpdGVtcyByZW5kZXJlZCB0byBjYWxjdWxhdGUgaXRlbSBzaXplIChpZiBhdXRvLWRldGVjdGlvbiBpcyBlbmFibGVkKVxuICAgIGlmIChhdXRvRGV0ZWN0SXRlbVNpemUpIHtcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6aXRlbXMtcmVuZGVyZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIWhhc0NhbGN1bGF0ZWRJdGVtU2l6ZSAmJlxuICAgICAgICAgIGRhdGEuZWxlbWVudHM/Lmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIENhbGN1bGF0ZSBhdmVyYWdlIGl0ZW0gc2l6ZSBmcm9tIGZpcnN0IHJlbmRlcmVkIGJhdGNoXG4gICAgICAgICAgY29uc3Qgc2l6ZXM6IG51bWJlcltdID0gW107XG4gICAgICAgICAgY29uc3Qgc2l6ZVByb3BlcnR5ID1cbiAgICAgICAgICAgIG9yaWVudGF0aW9uID09PSBcImhvcml6b250YWxcIiA/IFwib2Zmc2V0V2lkdGhcIiA6IFwib2Zmc2V0SGVpZ2h0XCI7XG5cbiAgICAgICAgICBkYXRhLmVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzaXplID0gZWxlbWVudFtzaXplUHJvcGVydHldO1xuICAgICAgICAgICAgaWYgKHNpemUgPiAwKSB7XG4gICAgICAgICAgICAgIHNpemVzLnB1c2goc2l6ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoc2l6ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgYXZnU2l6ZSA9IE1hdGgucm91bmQoXG4gICAgICAgICAgICAgIHNpemVzLnJlZHVjZSgoc3VtLCBzaXplKSA9PiBzdW0gKyBzaXplLCAwKSAvIHNpemVzLmxlbmd0aCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c0l0ZW1TaXplID0gdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZTtcbiAgICAgICAgICAgIHZpZXdwb3J0U3RhdGUuaXRlbVNpemUgPSBhdmdTaXplO1xuXG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGFuIGluaXRpYWxTY3JvbGxJbmRleCwgcmVjYWxjdWxhdGUgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgICAgICAvLyBiYXNlZCBvbiB0aGUgbmV3bHkgZGV0ZWN0ZWQgaXRlbSBzaXplXG4gICAgICAgICAgICBpZiAoaW5pdGlhbFNjcm9sbEluZGV4ID4gMCAmJiBhdmdTaXplICE9PSBwcmV2aW91c0l0ZW1TaXplKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG5ld1Njcm9sbFBvc2l0aW9uID0gaW5pdGlhbFNjcm9sbEluZGV4ICogYXZnU2l6ZTtcbiAgICAgICAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiA9IG5ld1Njcm9sbFBvc2l0aW9uO1xuXG4gICAgICAgICAgICAgIC8vIE5vdGlmeSBzY3JvbGxpbmcgZmVhdHVyZSB0byBzeW5jIGl0cyBsb2NhbCBzY3JvbGwgcG9zaXRpb25cbiAgICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnNjcm9sbC1wb3NpdGlvbi1zeW5jXCIsIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogbmV3U2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgICAgICAgc291cmNlOiBcIml0ZW0tc2l6ZS1kZXRlY3RlZFwiLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmVjYWxjdWxhdGUgZXZlcnl0aGluZyB3aXRoIG5ldyBzaXplXG4gICAgICAgICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplKHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyk7XG4gICAgICAgICAgICB1cGRhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiB8fCAwKTtcblxuICAgICAgICAgICAgLy8gUmUtcmVuZGVyIHRvIGFkanVzdCBwb3NpdGlvbnNcbiAgICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydD8ucmVuZGVySXRlbXM/LigpO1xuXG4gICAgICAgICAgICAvLyBFbWl0IGV2ZW50IGZvciBzaXplIGNoYW5nZVxuICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0Oml0ZW0tc2l6ZS1kZXRlY3RlZFwiLCB7XG4gICAgICAgICAgICAgIHByZXZpb3VzU2l6ZTogaW5pdGlhbEl0ZW1TaXplLFxuICAgICAgICAgICAgICBkZXRlY3RlZFNpemU6IGF2Z1NpemUsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaGFzQ2FsY3VsYXRlZEl0ZW1TaXplID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENsZWFuIHVwIFJlc2l6ZU9ic2VydmVyIG9uIGRlc3Ryb3lcbiAgICB3cmFwRGVzdHJveShjb21wb25lbnQsICgpID0+IHtcbiAgICAgIGlmIChyZXNpemVPYnNlcnZlcikge1xuICAgICAgICByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIHJlc2l6ZU9ic2VydmVyID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEV4cG9zZSB2aXJ0dWFsIEFQSVxuICAgIGNvbnN0IGNvbXByZXNzaW9uUmF0aW8gPSBnZXRDb21wcmVzc2lvblJhdGlvKCk7XG4gICAgKGNvbXBvbmVudCBhcyBhbnkpLnZpcnR1YWwgPSB7XG4gICAgICBjYWxjdWxhdGVWaXNpYmxlUmFuZ2UsXG4gICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplLFxuICAgICAgZ2V0VG90YWxWaXJ0dWFsU2l6ZTogKCkgPT4gdmlld3BvcnRTdGF0ZT8udmlydHVhbFRvdGFsU2l6ZSB8fCAwLFxuICAgICAgZ2V0Q29udGFpbmVyU2l6ZTogKCkgPT4gdmlld3BvcnRTdGF0ZT8uY29udGFpbmVyU2l6ZSB8fCAwLFxuICAgICAgdXBkYXRlQ29udGFpbmVyU2l6ZTogKHNpemU6IG51bWJlcikgPT4ge1xuICAgICAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuY29udGFpbmVyU2l6ZSA9IHNpemU7XG4gICAgICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBnZXRJdGVtU2l6ZTogKCkgPT4gdmlld3BvcnRTdGF0ZT8uaXRlbVNpemUgfHwgaW5pdGlhbEl0ZW1TaXplLFxuICAgICAgY2FsY3VsYXRlSW5kZXhGcm9tUG9zaXRpb246IChwb3NpdGlvbjogbnVtYmVyKSA9PlxuICAgICAgICBNYXRoLmZsb29yKFxuICAgICAgICAgIHBvc2l0aW9uIC9cbiAgICAgICAgICAgICgodmlld3BvcnRTdGF0ZT8uaXRlbVNpemUgfHwgaW5pdGlhbEl0ZW1TaXplKSAqIGNvbXByZXNzaW9uUmF0aW8pLFxuICAgICAgICApLFxuICAgICAgY2FsY3VsYXRlUG9zaXRpb25Gb3JJbmRleDogKGluZGV4OiBudW1iZXIpID0+XG4gICAgICAgIGluZGV4ICogKHZpZXdwb3J0U3RhdGU/Lml0ZW1TaXplIHx8IGluaXRpYWxJdGVtU2l6ZSkgKiBjb21wcmVzc2lvblJhdGlvLFxuICAgIH07XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9O1xufTtcbiIsCiAgICAiLyoqXG4gKiBTY3JvbGxpbmcgRmVhdHVyZSAtIFZpcnR1YWwgc2Nyb2xsaW5nIHdpdGggaW50ZWdyYXRlZCB2ZWxvY2l0eSB0cmFja2luZ1xuICogSGFuZGxlcyB3aGVlbCBldmVudHMsIHRvdWNoL21vdXNlIGV2ZW50cywgc2Nyb2xsIHBvc2l0aW9uIG1hbmFnZW1lbnQsIHZlbG9jaXR5IG1lYXN1cmVtZW50LCBhbmQgbW9tZW50dW0gc2Nyb2xsaW5nXG4gKi9cblxuaW1wb3J0IHsgUFJFRklYIH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB0eXBlIHsgVmlld3BvcnRDb250ZXh0LCBWaWV3cG9ydENvbXBvbmVudCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVklFV1BPUlRfQ09OU1RBTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgd3JhcEluaXRpYWxpemUsIGdldFZpZXdwb3J0U3RhdGUsIGNsYW1wIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTY3JvbGxpbmdDb25maWcge1xuICBvcmllbnRhdGlvbj86IFwidmVydGljYWxcIiB8IFwiaG9yaXpvbnRhbFwiO1xuICBzZW5zaXRpdml0eT86IG51bWJlcjtcbiAgc21vb3RoaW5nPzogYm9vbGVhbjtcbiAgaWRsZVRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKiBTdG9wIHNjcm9sbGluZyB3aGVuIGNsaWNraW5nIG9uIHRoZSB2aWV3cG9ydCAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgc3RvcE9uQ2xpY2s/OiBib29sZWFuO1xufVxuXG4vLyBTcGVlZCB0cmFja2VyIGludGVyZmFjZVxuaW50ZXJmYWNlIFNwZWVkVHJhY2tlciB7XG4gIHZlbG9jaXR5OiBudW1iZXI7XG4gIGxhc3RQb3NpdGlvbjogbnVtYmVyO1xuICBsYXN0VGltZTogbnVtYmVyO1xuICBkaXJlY3Rpb246IFwiZm9yd2FyZFwiIHwgXCJiYWNrd2FyZFwiO1xuICBzYW1wbGVzOiBBcnJheTx7IHBvc2l0aW9uOiBudW1iZXI7IHRpbWU6IG51bWJlciB9Pjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHNwZWVkIHRyYWNrZXJcbiAqL1xuY29uc3QgY3JlYXRlU3BlZWRUcmFja2VyID0gKCk6IFNwZWVkVHJhY2tlciA9PiAoe1xuICB2ZWxvY2l0eTogMCxcbiAgbGFzdFBvc2l0aW9uOiAwLFxuICBsYXN0VGltZTogRGF0ZS5ub3coKSxcbiAgZGlyZWN0aW9uOiBcImZvcndhcmRcIixcbiAgc2FtcGxlczogW10sXG59KTtcblxuLyoqXG4gKiBVcGRhdGVzIHNwZWVkIHRyYWNrZXIgd2l0aCBuZXcgcG9zaXRpb25cbiAqL1xuY29uc3QgdXBkYXRlU3BlZWRUcmFja2VyID0gKFxuICB0cmFja2VyOiBTcGVlZFRyYWNrZXIsXG4gIG5ld1Bvc2l0aW9uOiBudW1iZXIsXG4gIHByZXZpb3VzUG9zaXRpb246IG51bWJlcixcbik6IFNwZWVkVHJhY2tlciA9PiB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IHRpbWVEZWx0YSA9IG5vdyAtIHRyYWNrZXIubGFzdFRpbWU7XG5cbiAgaWYgKHRpbWVEZWx0YSA9PT0gMCkgcmV0dXJuIHRyYWNrZXI7XG5cbiAgY29uc3QgcG9zaXRpb25EZWx0YSA9IG5ld1Bvc2l0aW9uIC0gcHJldmlvdXNQb3NpdGlvbjtcbiAgLy8gS2VlcCB2ZWxvY2l0eSBzaWduZWQgKHBvc2l0aXZlID0gZm9yd2FyZC9kb3duLCBuZWdhdGl2ZSA9IGJhY2t3YXJkL3VwKVxuICBjb25zdCBpbnN0YW50VmVsb2NpdHkgPSBwb3NpdGlvbkRlbHRhIC8gdGltZURlbHRhO1xuXG4gIC8vIEFkZCBuZXcgc2FtcGxlXG4gIGNvbnN0IHNhbXBsZXMgPSBbLi4udHJhY2tlci5zYW1wbGVzLCB7IHBvc2l0aW9uOiBuZXdQb3NpdGlvbiwgdGltZTogbm93IH1dO1xuXG4gIC8vIEtlZXAgb25seSByZWNlbnQgc2FtcGxlcyAobGFzdCAxMDBtcylcbiAgY29uc3QgcmVjZW50U2FtcGxlcyA9IHNhbXBsZXMuZmlsdGVyKChzKSA9PiBub3cgLSBzLnRpbWUgPCAxMDApO1xuXG4gIC8vIENhbGN1bGF0ZSBhdmVyYWdlIHZlbG9jaXR5IGZyb20gcmVjZW50IHNhbXBsZXMgKHByZXNlcnZpbmcgc2lnbi9kaXJlY3Rpb24pXG4gIGxldCBhdmdWZWxvY2l0eSA9IGluc3RhbnRWZWxvY2l0eTtcbiAgaWYgKHJlY2VudFNhbXBsZXMubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IG9sZGVzdFNhbXBsZSA9IHJlY2VudFNhbXBsZXNbMF07XG4gICAgY29uc3QgdG90YWxEaXN0YW5jZSA9IG5ld1Bvc2l0aW9uIC0gb2xkZXN0U2FtcGxlLnBvc2l0aW9uOyAvLyBTaWduZWQgZGlzdGFuY2VcbiAgICBjb25zdCB0b3RhbFRpbWUgPSBub3cgLSBvbGRlc3RTYW1wbGUudGltZTtcbiAgICBhdmdWZWxvY2l0eSA9IHRvdGFsVGltZSA+IDAgPyB0b3RhbERpc3RhbmNlIC8gdG90YWxUaW1lIDogaW5zdGFudFZlbG9jaXR5O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB2ZWxvY2l0eTogYXZnVmVsb2NpdHksXG4gICAgbGFzdFBvc2l0aW9uOiBuZXdQb3NpdGlvbixcbiAgICBsYXN0VGltZTogbm93LFxuICAgIGRpcmVjdGlvbjogcG9zaXRpb25EZWx0YSA+PSAwID8gXCJmb3J3YXJkXCIgOiBcImJhY2t3YXJkXCIsXG4gICAgc2FtcGxlczogcmVjZW50U2FtcGxlcyxcbiAgfTtcbn07XG5cbi8qKlxuICogU2Nyb2xsaW5nIGZlYXR1cmUgZm9yIHZpZXdwb3J0XG4gKiBIYW5kbGVzIHdoZWVsIGV2ZW50cywgdmVsb2NpdHkgdHJhY2tpbmcsIGFuZCBpZGxlIGRldGVjdGlvblxuICovXG5leHBvcnQgY29uc3Qgd2l0aFNjcm9sbGluZyA9IChjb25maWc6IFNjcm9sbGluZ0NvbmZpZyA9IHt9KSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50Pihjb21wb25lbnQ6IFQpOiBUID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBvcmllbnRhdGlvbiA9IFwidmVydGljYWxcIixcbiAgICAgIHNlbnNpdGl2aXR5ID0gVklFV1BPUlRfQ09OU1RBTlRTLlZJUlRVQUxfU0NST0xMLlNDUk9MTF9TRU5TSVRJVklUWSxcbiAgICAgIHNtb290aGluZyA9IGZhbHNlLFxuICAgICAgaWRsZVRpbWVvdXQgPSAxMDAsIC8vIERlZmF1bHQgaWRsZSB0aW1lb3V0IGluIG1zXG4gICAgICBzdG9wT25DbGljayA9IHRydWUsIC8vIFN0b3Agc2Nyb2xsaW5nIG9uIGNsaWNrIGJ5IGRlZmF1bHRcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gU3RhdGVcbiAgICBsZXQgc2Nyb2xsUG9zaXRpb24gPSAwO1xuICAgIGxldCB0b3RhbFZpcnR1YWxTaXplID0gMDtcbiAgICBsZXQgY29udGFpbmVyU2l6ZSA9IDA7XG4gICAgbGV0IGlzU2Nyb2xsaW5nID0gZmFsc2U7XG4gICAgbGV0IGlzU2Nyb2xsZWRGcm9tVG9wID0gZmFsc2U7IC8vIFRyYWNrIGlmIHNjcm9sbGVkIGF3YXkgZnJvbSB0b3BcbiAgICBsZXQgbGFzdFNjcm9sbFRpbWUgPSAwO1xuXG4gICAgLyoqXG4gICAgICogSGVscGVyIHRvIHJlbW92ZSB0aGUgLS1zY3JvbGxlZCBjbGFzcyBmcm9tIHRoZSB2bGlzdCBjb250YWluZXJcbiAgICAgKi9cbiAgICBjb25zdCByZW1vdmVTY3JvbGxlZENsYXNzID0gKCkgPT4ge1xuICAgICAgY29uc3Qgdmlld3BvcnRFbCA9XG4gICAgICAgIChjb21wb25lbnQgYXMgYW55KS52aWV3cG9ydEVsZW1lbnQgfHxcbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLl9zY3JvbGxpbmdWaWV3cG9ydEVsZW1lbnQ7XG4gICAgICBpZiAodmlld3BvcnRFbCkge1xuICAgICAgICBjb25zdCB2bGlzdENvbnRhaW5lciA9IHZpZXdwb3J0RWwuY2xvc2VzdChgLiR7UFJFRklYfS12bGlzdGApO1xuICAgICAgICBpZiAodmxpc3RDb250YWluZXIpIHtcbiAgICAgICAgICB2bGlzdENvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKGAke1BSRUZJWH0tdmxpc3QtLXNjcm9sbGVkYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gTGlzdGVuIGZvciByZWxvYWQ6c3RhcnQgdG8gcmVzZXQgZmVhdHVyZS1zcGVjaWZpYyBzdGF0ZVxuICAgIGNvbXBvbmVudC5vbj8uKFwicmVsb2FkOnN0YXJ0XCIsICgpID0+IHtcbiAgICAgIHNjcm9sbFBvc2l0aW9uID0gMDtcbiAgICAgIHRvdGFsVmlydHVhbFNpemUgPSAwO1xuICAgICAgaXNTY3JvbGxpbmcgPSBmYWxzZTtcbiAgICAgIGlzU2Nyb2xsZWRGcm9tVG9wID0gZmFsc2U7XG4gICAgICBsYXN0U2Nyb2xsVGltZSA9IDA7XG4gICAgICBzcGVlZFRyYWNrZXIgPSBjcmVhdGVTcGVlZFRyYWNrZXIoKTtcbiAgICAgIGhhc0VtaXR0ZWRJZGxlID0gZmFsc2U7XG4gICAgICBhbmNob3JQb3NpdGlvbiA9IG51bGw7XG4gICAgICBhbmNob3JUaW1lID0gMDtcbiAgICAgIGxhc3RXaGVlbFRpbWUgPSAwO1xuICAgICAgYW5jaG9ySW5pdGlhbERlbHRhID0gMDtcbiAgICAgIGFuY2hvckxhc3REZWx0YSA9IDA7XG4gICAgICBhbmNob3JNaW5EZWx0YSA9IEluZmluaXR5O1xuICAgICAgY29uc2VjdXRpdmVJbmNyZWFzZXMgPSAwO1xuICAgICAgc3VzdGFpbmVkSGlnaENvdW50ID0gMDtcbiAgICAgIHJlbmRlclNjaGVkdWxlZCA9IGZhbHNlO1xuICAgICAgcGVuZGluZ1Njcm9sbERhdGEgPSBudWxsO1xuXG4gICAgICAvLyBDbGVhciBhbnkgcGVuZGluZyB0aW1lb3V0c1xuICAgICAgaWYgKGlkbGVUaW1lb3V0SWQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGlkbGVUaW1lb3V0SWQpO1xuICAgICAgICBpZGxlVGltZW91dElkID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHN0b3BJZGxlRGV0ZWN0aW9uKCk7XG5cbiAgICAgIC8vIFJlbW92ZSAtLXNjcm9sbGVkIGNsYXNzIGZyb20gRE9NIHNpbmNlIHdlJ3JlIHJlc2V0dGluZyB0byB0b3BcbiAgICAgIHJlbW92ZVNjcm9sbGVkQ2xhc3MoKTtcbiAgICB9KTtcblxuICAgIC8vIExpc3RlbiBmb3IgY2xlYXJlZCBldmVudCAoZnJvbSB2bGlzdC5jbGVhcigpKSB0byByZXNldCBzY3JvbGxlZCBzdGF0ZVxuICAgIGNvbXBvbmVudC5vbj8uKFwiY2xlYXJlZFwiLCAoKSA9PiB7XG4gICAgICBzY3JvbGxQb3NpdGlvbiA9IDA7XG4gICAgICB0b3RhbFZpcnR1YWxTaXplID0gMDtcbiAgICAgIGlzU2Nyb2xsZWRGcm9tVG9wID0gZmFsc2U7XG4gICAgICByZW1vdmVTY3JvbGxlZENsYXNzKCk7XG4gICAgfSk7XG4gICAgbGV0IHNwZWVkVHJhY2tlciA9IGNyZWF0ZVNwZWVkVHJhY2tlcigpO1xuICAgIGxldCBpZGxlVGltZW91dElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaWRsZUNoZWNrRnJhbWU6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGxldCBsYXN0SWRsZUNoZWNrUG9zaXRpb24gPSAwO1xuICAgIGxldCBoYXNFbWl0dGVkSWRsZSA9IGZhbHNlOyAvLyBUcmFjayBpZiB3ZSd2ZSBhbHJlYWR5IGVtaXR0ZWQgaWRsZVxuICAgIGxldCBhbmNob3JQb3NpdGlvbjogbnVtYmVyIHwgbnVsbCA9IG51bGw7IC8vIEFuY2hvciBwb3NpdGlvbiB0byBtYWludGFpbiBvbiBjbGljayAoZm9yIHN0b3BPbkNsaWNrKVxuICAgIGxldCBhbmNob3JUaW1lID0gMDsgLy8gVGltZXN0YW1wIHdoZW4gYW5jaG9yIHdhcyBzZXRcbiAgICBsZXQgbGFzdFdoZWVsVGltZSA9IDA7IC8vIFRpbWVzdGFtcCBvZiBsYXN0IHdoZWVsIGV2ZW50IChmb3IgZGV0ZWN0aW5nIGdhcHMpXG4gICAgbGV0IGFuY2hvckluaXRpYWxEZWx0YSA9IDA7IC8vIEluaXRpYWwgd2hlZWwgZGVsdGEgd2hlbiBhbmNob3Igd2FzIHNldCAodG8gZGV0ZWN0IGRlY2F5KVxuICAgIGxldCBhbmNob3JMYXN0RGVsdGEgPSAwOyAvLyBQcmV2aW91cyB3aGVlbCBkZWx0YSAodG8gZGV0ZWN0IGluY3JlYXNpbmcgZGVsdGEgPSBuZXcgc2Nyb2xsKVxuICAgIGxldCBhbmNob3JNaW5EZWx0YSA9IEluZmluaXR5OyAvLyBNaW5pbXVtIGRlbHRhIHNlZW4gc2luY2UgYW5jaG9yICh0byBkZXRlY3QgcmVhY2NlbGVyYXRpb24pXG4gICAgbGV0IGNvbnNlY3V0aXZlSW5jcmVhc2VzID0gMDsgLy8gQ291bnQgb2YgY29uc2VjdXRpdmUgZGVsdGEgaW5jcmVhc2VzICh0byBkZXRlY3Qgc3VzdGFpbmVkIG5ldyBzY3JvbGxpbmcpXG4gICAgbGV0IHN1c3RhaW5lZEhpZ2hDb3VudCA9IDA7IC8vIENvdW50IG9mIGV2ZW50cyB3aGVyZSBkZWx0YSBpcyBzaWduaWZpY2FudGx5IGFib3ZlIG1pbmltdW0gKHN1c3RhaW5lZCBuZXcgc2Nyb2xsaW5nKVxuXG4gICAgLy8gUkFGLWJhc2VkIHJlbmRlciB0aHJvdHRsaW5nIC0gcHJldmVudHMgd2FzdGVkIHJlbmRlcnMgZHVyaW5nIGZhc3Qgc2Nyb2xsaW5nXG4gICAgbGV0IHJlbmRlclNjaGVkdWxlZCA9IGZhbHNlO1xuICAgIGxldCBwZW5kaW5nU2Nyb2xsRGF0YToge1xuICAgICAgcG9zaXRpb246IG51bWJlcjtcbiAgICAgIGRpcmVjdGlvbjogXCJmb3J3YXJkXCIgfCBcImJhY2t3YXJkXCI7XG4gICAgICBwcmV2aW91c1Bvc2l0aW9uOiBudW1iZXI7XG4gICAgfSB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gY29uc29sZS5sb2coYFtTY3JvbGxpbmddIEluaXRpYWwgc3RhdGUgLSBwb3NpdGlvbjogJHtzY3JvbGxQb3NpdGlvbn1gKTtcblxuICAgIC8vIFRocmVzaG9sZCBmb3IgY29uc2lkZXJpbmcgdGhlIGxpc3QgXCJzY3JvbGxlZFwiIChpbiBwaXhlbHMpXG4gICAgY29uc3QgU0NST0xMRURfVEhSRVNIT0xEID0gMTtcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIHNjcm9sbGVkIHN0YXRlIGNsYXNzIG9uIHRoZSB2bGlzdCBjb250YWluZXJcbiAgICAgKiBBZGRzIC0tc2Nyb2xsZWQgbW9kaWZpZXIgd2hlbiBsaXN0IGlzIG5vdCBhdCB0aGUgdG9wXG4gICAgICovXG4gICAgY29uc3QgdXBkYXRlU2Nyb2xsZWRTdGF0ZSA9IChcbiAgICAgIHZpZXdwb3J0RWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgICBwb3NpdGlvbjogbnVtYmVyLFxuICAgICkgPT4ge1xuICAgICAgY29uc3Qgc2hvdWxkQmVTY3JvbGxlZCA9IHBvc2l0aW9uID4gU0NST0xMRURfVEhSRVNIT0xEO1xuICAgICAgaWYgKHNob3VsZEJlU2Nyb2xsZWQgIT09IGlzU2Nyb2xsZWRGcm9tVG9wKSB7XG4gICAgICAgIGlzU2Nyb2xsZWRGcm9tVG9wID0gc2hvdWxkQmVTY3JvbGxlZDtcbiAgICAgICAgLy8gRmluZCB0aGUgdmxpc3QgY29udGFpbmVyIChwYXJlbnQgb2Ygdmlld3BvcnQpXG4gICAgICAgIGNvbnN0IHZsaXN0Q29udGFpbmVyID0gdmlld3BvcnRFbGVtZW50LmNsb3Nlc3QoYC4ke1BSRUZJWH0tdmxpc3RgKTtcbiAgICAgICAgaWYgKHZsaXN0Q29udGFpbmVyKSB7XG4gICAgICAgICAgdmxpc3RDb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZShcbiAgICAgICAgICAgIGAke1BSRUZJWH0tdmxpc3QtLXNjcm9sbGVkYCxcbiAgICAgICAgICAgIHNob3VsZEJlU2Nyb2xsZWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBHZXQgdmlld3BvcnQgc3RhdGVcbiAgICBsZXQgdmlld3BvcnRTdGF0ZTogYW55O1xuXG4gICAgLy8gVXNlIHNoYXJlZCBpbml0aWFsaXphdGlvbiB3cmFwcGVyXG4gICAgd3JhcEluaXRpYWxpemUoY29tcG9uZW50LCAoKSA9PiB7XG4gICAgICB2aWV3cG9ydFN0YXRlID0gZ2V0Vmlld3BvcnRTdGF0ZShjb21wb25lbnQpO1xuXG4gICAgICAvLyBJbml0aWFsaXplIHN0YXRlIHZhbHVlc1xuICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9IHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZSB8fCAwO1xuICAgICAgICBjb250YWluZXJTaXplID0gdmlld3BvcnRTdGF0ZS5jb250YWluZXJTaXplIHx8IDA7XG4gICAgICAgIC8vIFN5bmMgc2Nyb2xsUG9zaXRpb24gZnJvbSB2aWV3cG9ydFN0YXRlIChpbXBvcnRhbnQgZm9yIGluaXRpYWxTY3JvbGxJbmRleClcbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPiAwKSB7XG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb24gPSB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgdmlydHVhbCBzaXplIGNoYW5nZXNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6dmlydHVhbC1zaXplLWNoYW5nZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltTY3JvbGxpbmddIFZpcnR1YWwgc2l6ZSBjaGFuZ2VkOlwiLCBkYXRhKTtcbiAgICAgICAgdXBkYXRlU2Nyb2xsQm91bmRzKGRhdGEudG90YWxWaXJ0dWFsU2l6ZSwgY29udGFpbmVyU2l6ZSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBzY3JvbGwgcG9zaXRpb24gY2hhbmdlcyBmcm9tIG90aGVyIGZlYXR1cmVzIChlLmcuLCB2aXJ0dWFsLnRzIGFmdGVyIGl0ZW0gc2l6ZSBkZXRlY3Rpb24pXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnNjcm9sbC1wb3NpdGlvbi1zeW5jXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGRhdGEucG9zaXRpb24gIT09IHVuZGVmaW5lZCAmJiBkYXRhLnBvc2l0aW9uICE9PSBzY3JvbGxQb3NpdGlvbikge1xuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbjtcbiAgICAgICAgICAvLyBBbHNvIHVwZGF0ZSBsb2NhbCB0cmFja2luZyB2YXJzXG4gICAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9XG4gICAgICAgICAgICB2aWV3cG9ydFN0YXRlPy52aXJ0dWFsVG90YWxTaXplIHx8IHRvdGFsVmlydHVhbFNpemU7XG4gICAgICAgICAgY29udGFpbmVyU2l6ZSA9IHZpZXdwb3J0U3RhdGU/LmNvbnRhaW5lclNpemUgfHwgY29udGFpbmVyU2l6ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgY29udGFpbmVyIHNpemUgY2hhbmdlc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpjb250YWluZXItc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGRhdGEuY29udGFpbmVyU2l6ZSkge1xuICAgICAgICAgIGNvbnRhaW5lclNpemUgPSBkYXRhLmNvbnRhaW5lclNpemU7XG4gICAgICAgICAgdXBkYXRlU2Nyb2xsQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gQXR0YWNoIHdoZWVsIGV2ZW50IGxpc3RlbmVyIHRvIHZpZXdwb3J0IGVsZW1lbnRcbiAgICAgIGNvbnN0IHZpZXdwb3J0RWxlbWVudCA9XG4gICAgICAgIHZpZXdwb3J0U3RhdGU/LnZpZXdwb3J0RWxlbWVudCB8fCAoY29tcG9uZW50IGFzIGFueSkudmlld3BvcnRFbGVtZW50O1xuICAgICAgaWYgKHZpZXdwb3J0RWxlbWVudCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW1Njcm9sbGluZ10gQXR0YWNoaW5nIHdoZWVsIGV2ZW50IHRvIHZpZXdwb3J0IGVsZW1lbnRgKTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLCBoYW5kbGVXaGVlbCwge1xuICAgICAgICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIHNjcm9sbGVkIHN0YXRlIGJhc2VkIG9uIGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgIHVwZGF0ZVNjcm9sbGVkU3RhdGUodmlld3BvcnRFbGVtZW50LCBzY3JvbGxQb3NpdGlvbik7XG5cbiAgICAgICAgLy8gQWRkIG1vdXNlZG93biBsaXN0ZW5lciB0byBzdG9wIHNjcm9sbGluZyBvbiBjbGlja1xuICAgICAgICBpZiAoc3RvcE9uQ2xpY2spIHtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBoYW5kbGVNb3VzZURvd24pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RvcmUgcmVmZXJlbmNlIGZvciBjbGVhbnVwXG4gICAgICAgIChjb21wb25lbnQgYXMgYW55KS5fc2Nyb2xsaW5nVmlld3BvcnRFbGVtZW50ID0gdmlld3BvcnRFbGVtZW50O1xuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuX3Njcm9sbGluZ1N0b3BPbkNsaWNrID0gc3RvcE9uQ2xpY2s7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oYFtTY3JvbGxpbmddIE5vIHZpZXdwb3J0IGVsZW1lbnQgZm91bmQgZm9yIHdoZWVsIGV2ZW50c2ApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVXNlIGNsYW1wIGZyb20gdXRpbHNcblxuICAgIC8vIFN0YXJ0IGlkbGUgZGV0ZWN0aW9uXG4gICAgY29uc3Qgc3RhcnRJZGxlRGV0ZWN0aW9uID0gKCkgPT4ge1xuICAgICAgLy8gY29uc29sZS5sb2coXCJbU2Nyb2xsaW5nXSBTdGFydGluZyBpZGxlIGRldGVjdGlvblwiKTtcblxuICAgICAgLy8gU3RvcCBhbnkgZXhpc3RpbmcgaWRsZSBkZXRlY3Rpb24gZmlyc3RcbiAgICAgIGlmIChpZGxlQ2hlY2tGcmFtZSAhPT0gbnVsbCkge1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShpZGxlQ2hlY2tGcmFtZSk7XG4gICAgICAgIGlkbGVDaGVja0ZyYW1lID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaGFzRW1pdHRlZElkbGUgPSBmYWxzZTsgLy8gUmVzZXQgaWRsZSBlbWlzc2lvbiBmbGFnXG4gICAgICBjb25zdCBjaGVja0lkbGUgPSAoKSA9PiB7XG4gICAgICAgIGlmIChzY3JvbGxQb3NpdGlvbiA9PT0gbGFzdElkbGVDaGVja1Bvc2l0aW9uKSB7XG4gICAgICAgICAgLy8gUG9zaXRpb24gaGFzbid0IGNoYW5nZWQgLSB3ZSdyZSBpZGxlXG4gICAgICAgICAgaWYgKCFoYXNFbWl0dGVkSWRsZSAmJiAoc3BlZWRUcmFja2VyLnZlbG9jaXR5ID4gMCB8fCBpc1Njcm9sbGluZykpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgLy8gICBcIltTY3JvbGxpbmddIElkbGUgZGV0ZWN0ZWQgLSBwb3NpdGlvbiBzdGFibGUsIHNldHRpbmcgdmVsb2NpdHkgdG8gemVyb1wiXG4gICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgaGFzRW1pdHRlZElkbGUgPSB0cnVlOyAvLyBNYXJrIHRoYXQgd2UndmUgZW1pdHRlZCBpZGxlXG4gICAgICAgICAgICBzZXRWZWxvY2l0eVRvWmVybygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBQb3NpdGlvbiBjaGFuZ2VkLCByZXNldCB0aGUgZmxhZ1xuICAgICAgICAgIGhhc0VtaXR0ZWRJZGxlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdElkbGVDaGVja1Bvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICAgIGlkbGVDaGVja0ZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNoZWNrSWRsZSk7XG4gICAgICB9O1xuICAgICAgaWRsZUNoZWNrRnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2hlY2tJZGxlKTtcbiAgICB9O1xuXG4gICAgLy8gU3RvcCBpZGxlIGRldGVjdGlvblxuICAgIGNvbnN0IHN0b3BJZGxlRGV0ZWN0aW9uID0gKCkgPT4ge1xuICAgICAgaWYgKGlkbGVDaGVja0ZyYW1lKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1Njcm9sbGluZ10gU3RvcHBpbmcgaWRsZSBkZXRlY3Rpb25cIik7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkbGVDaGVja0ZyYW1lKTtcbiAgICAgICAgaWRsZUNoZWNrRnJhbWUgPSBudWxsO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTZXQgdmVsb2NpdHkgdG8gemVybyBhbmQgZW1pdCBpZGxlIGV2ZW50XG4gICAgY29uc3Qgc2V0VmVsb2NpdHlUb1plcm8gPSAoKSA9PiB7XG4gICAgICAvLyBTdG9wIGlkbGUgZGV0ZWN0aW9uIHNpbmNlIHdlJ3JlIG5vdyBpZGxlXG4gICAgICBzdG9wSWRsZURldGVjdGlvbigpO1xuXG4gICAgICBzcGVlZFRyYWNrZXIgPSBjcmVhdGVTcGVlZFRyYWNrZXIoKTtcbiAgICAgIGlzU2Nyb2xsaW5nID0gZmFsc2U7IC8vIFJlc2V0IHNjcm9sbGluZyBzdGF0ZVxuXG4gICAgICAvLyBFbWl0IHZlbG9jaXR5IGNoYW5nZVxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnZlbG9jaXR5LWNoYW5nZWRcIiwge1xuICAgICAgICB2ZWxvY2l0eTogMCxcbiAgICAgICAgZGlyZWN0aW9uOiBzcGVlZFRyYWNrZXIuZGlyZWN0aW9uLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIEVtaXQgaWRsZSBzdGF0ZVxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OmlkbGVcIiwge1xuICAgICAgICBwb3NpdGlvbjogc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgIGxhc3RTY3JvbGxUaW1lLFxuICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyBVcGRhdGUgY29udGFpbmVyIHBvc2l0aW9uXG4gICAgY29uc3QgdXBkYXRlQ29udGFpbmVyUG9zaXRpb24gPSAoKSA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUgfHwgIXZpZXdwb3J0U3RhdGUuaXRlbXNDb250YWluZXIpIHJldHVybjtcblxuICAgICAgLy8gSXRlbXMgY29udGFpbmVyIGRvZXNuJ3QgbW92ZSAtIGl0ZW1zIGluc2lkZSBpdCBhcmUgcG9zaXRpb25lZFxuICAgICAgLy8gVGhpcyBpcyBoYW5kbGVkIGJ5IHRoZSByZW5kZXJpbmcgZmVhdHVyZVxuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgbW91c2Vkb3duIHRvIHN0b3Agc2Nyb2xsaW5nIG9uIGNsaWNrXG4gICAgY29uc3QgaGFuZGxlTW91c2VEb3duID0gKF9lOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAvLyBBbmNob3IgdGhlIGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uIC0gYW55IHdoZWVsIGV2ZW50cyB3aWxsIGJlIGZvcmNlZCBiYWNrIHRvIHRoaXMgcG9zaXRpb25cbiAgICAgIC8vIFRoaXMgZWxlZ2FudGx5IGhhbmRsZXMgbW91c2Ugd2hlZWxzIHdpdGggcGh5c2ljYWwgaW5lcnRpYSAobGlrZSBMb2dpdGVjaCBmcmVlLXNwaW4pXG4gICAgICBhbmNob3JQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgYW5jaG9yVGltZSA9IERhdGUubm93KCk7XG4gICAgICBhbmNob3JJbml0aWFsRGVsdGEgPSAwOyAvLyBXaWxsIGJlIHNldCBieSBmaXJzdCB3aGVlbCBldmVudFxuICAgICAgYW5jaG9yTGFzdERlbHRhID0gMDtcbiAgICAgIGFuY2hvck1pbkRlbHRhID0gSW5maW5pdHk7XG4gICAgICBjb25zZWN1dGl2ZUluY3JlYXNlcyA9IDA7XG4gICAgICBzdXN0YWluZWRIaWdoQ291bnQgPSAwO1xuXG4gICAgICAvLyBPbmx5IHN0b3AgaWYgd2UncmUgY3VycmVudGx5IHNjcm9sbGluZ1xuICAgICAgaWYgKGlzU2Nyb2xsaW5nIHx8IHNwZWVkVHJhY2tlci52ZWxvY2l0eSA+IDApIHtcbiAgICAgICAgc2V0VmVsb2NpdHlUb1plcm8oKTtcbiAgICAgIH1cbiAgICAgIC8vIEFsc28gc3RvcCBtb21lbnR1bSBhbmltYXRpb24gaWYgYWN0aXZlXG4gICAgICBjb25zdCBtb21lbnR1bVN0YXRlID0gKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLm1vbWVudHVtU3RhdGU7XG4gICAgICBpZiAobW9tZW50dW1TdGF0ZT8uc3RvcE1vbWVudHVtKSB7XG4gICAgICAgIG1vbWVudHVtU3RhdGUuc3RvcE1vbWVudHVtKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSB3aGVlbCBldmVudFxuICAgIGNvbnN0IGhhbmRsZVdoZWVsID0gKGV2ZW50OiBXaGVlbEV2ZW50KSA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBjb25zdCBkZWx0YSA9IG9yaWVudGF0aW9uID09PSBcInZlcnRpY2FsXCIgPyBldmVudC5kZWx0YVkgOiBldmVudC5kZWx0YVg7XG4gICAgICBjb25zdCBzY3JvbGxEZWx0YSA9IGRlbHRhICogc2Vuc2l0aXZpdHk7XG5cbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB0aW1lU2luY2VMYXN0V2hlZWwgPSBub3cgLSBsYXN0V2hlZWxUaW1lO1xuICAgICAgbGFzdFdoZWVsVGltZSA9IG5vdztcblxuICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBhbmNob3IgcG9zaXRpb24gKHVzZXIgY2xpY2tlZCB0byBzdG9wIHNjcm9sbGluZyksXG4gICAgICAvLyBjaGVjayBpZiB0aGlzIGlzIGludGVudGlvbmFsIG5ldyBzY3JvbGxpbmcgb3IgcmVzaWR1YWwgd2hlZWwgaW5lcnRpYVxuICAgICAgaWYgKGFuY2hvclBvc2l0aW9uICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHRpbWVTaW5jZUFuY2hvciA9IG5vdyAtIGFuY2hvclRpbWU7XG4gICAgICAgIGNvbnN0IHdoZWVsRGVsdGFNYWduaXR1ZGUgPSBNYXRoLmFicyhzY3JvbGxEZWx0YSk7XG5cbiAgICAgICAgLy8gVHJhY2sgaW5pdGlhbCBkZWx0YSB0byBkZXRlY3Qgd2hlbiBpbmVydGlhIGhhcyBkZWNheWVkXG4gICAgICAgIGlmIChhbmNob3JJbml0aWFsRGVsdGEgPT09IDApIHtcbiAgICAgICAgICBhbmNob3JJbml0aWFsRGVsdGEgPSB3aGVlbERlbHRhTWFnbml0dWRlO1xuICAgICAgICAgIGFuY2hvckxhc3REZWx0YSA9IHdoZWVsRGVsdGFNYWduaXR1ZGU7XG4gICAgICAgICAgYW5jaG9yTWluRGVsdGEgPSB3aGVlbERlbHRhTWFnbml0dWRlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJhY2sgbWluaW11bSBkZWx0YSB0byBkZXRlY3QgcmVhY2NlbGVyYXRpb24gKHVzZXIgc3RhcnRlZCBzY3JvbGxpbmcgYWdhaW4pXG4gICAgICAgIGFuY2hvck1pbkRlbHRhID0gTWF0aC5taW4oYW5jaG9yTWluRGVsdGEsIHdoZWVsRGVsdGFNYWduaXR1ZGUpO1xuXG4gICAgICAgIC8vIERldGVjdCBpZiBkZWx0YSBpcyBpbmNyZWFzaW5nICh1c2VyIHN0YXJ0ZWQgbmV3IHNjcm9sbClcbiAgICAgICAgLy8gSW5lcnRpYSBvbmx5IGRlY2F5cywgc28gaW5jcmVhc2luZyBkZWx0YSA9IGludGVudGlvbmFsIG5ldyBzY3JvbGxpbmdcbiAgICAgICAgLy8gQlVUOiBmaWx0ZXIgb3V0IGJhdGNoZWQgZXZlbnRzIHdoZXJlIGRlbHRhIGlzIH4yeCB0aGUgbGFzdCAoYnJvd3NlciBiYXRjaGluZywgbm90IHJlYWwgaW5jcmVhc2UpXG4gICAgICAgIGNvbnN0IGlzQmF0Y2hlZEV2ZW50ID1cbiAgICAgICAgICB3aGVlbERlbHRhTWFnbml0dWRlID4gYW5jaG9yTGFzdERlbHRhICogMS44ICYmXG4gICAgICAgICAgd2hlZWxEZWx0YU1hZ25pdHVkZSA8IGFuY2hvckxhc3REZWx0YSAqIDIuMjtcblxuICAgICAgICAvLyBUcmFjayBjb25zZWN1dGl2ZSBpbmNyZWFzZXMgLSBzdXN0YWluZWQgaW5jcmVhc2VzIGluZGljYXRlIG5ldyBzY3JvbGxpbmdcbiAgICAgICAgLy8gVXNlIDElIHRocmVzaG9sZCB0byBjYXRjaCBncmFkdWFsIGFjY2VsZXJhdGlvblxuICAgICAgICBpZiAoIWlzQmF0Y2hlZEV2ZW50ICYmIHdoZWVsRGVsdGFNYWduaXR1ZGUgPiBhbmNob3JMYXN0RGVsdGEgKiAxLjAxKSB7XG4gICAgICAgICAgY29uc2VjdXRpdmVJbmNyZWFzZXMrKztcbiAgICAgICAgfSBlbHNlIGlmICh3aGVlbERlbHRhTWFnbml0dWRlIDwgYW5jaG9yTGFzdERlbHRhICogMC45OSkge1xuICAgICAgICAgIC8vIERlbHRhIGRlY3JlYXNpbmcgLSByZXNldCBjb3VudGVyXG4gICAgICAgICAgY29uc2VjdXRpdmVJbmNyZWFzZXMgPSAwO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIGRlbHRhIGlzIHJvdWdobHkgdGhlIHNhbWUgKHdpdGhpbiAxJSksIGRvbid0IGNoYW5nZSB0aGUgY291bnRlclxuXG4gICAgICAgIC8vIFRyYWNrIHN1c3RhaW5lZCBoaWdoIGRlbHRhIChkZWx0YSBzaWduaWZpY2FudGx5IGFib3ZlIG1pbmltdW0gZm9yIG11bHRpcGxlIGV2ZW50cylcbiAgICAgICAgLy8gVGhpcyBjYXRjaGVzIHdoZW4gdXNlciBzdGFydHMgc2Nyb2xsaW5nIGJ1dCBkZWx0YSBwbGF0ZWF1cyBpbnN0ZWFkIG9mIHN0cmljdGx5IGluY3JlYXNpbmdcbiAgICAgICAgaWYgKCFpc0JhdGNoZWRFdmVudCAmJiB3aGVlbERlbHRhTWFnbml0dWRlID4gYW5jaG9yTWluRGVsdGEgKiAxLjA1KSB7XG4gICAgICAgICAgc3VzdGFpbmVkSGlnaENvdW50Kys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3VzdGFpbmVkSGlnaENvdW50ID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbGVhc2UgaWY6IDMrIGNvbnNlY3V0aXZlIGluY3JlYXNlcywgT1Igc3VzdGFpbmVkIGhpZ2ggZGVsdGEsIE9SIHNpZ25pZmljYW50IHNpbmdsZSBpbmNyZWFzZVxuICAgICAgICBjb25zdCBzdXN0YWluZWRJbmNyZWFzZSA9IGNvbnNlY3V0aXZlSW5jcmVhc2VzID49IDM7XG4gICAgICAgIGNvbnN0IHN1c3RhaW5lZEhpZ2ggPSBzdXN0YWluZWRIaWdoQ291bnQgPj0gNTsgLy8gNSsgZXZlbnRzIGF0IDUlKyBhYm92ZSBtaW5pbXVtXG4gICAgICAgIGNvbnN0IHNpZ25pZmljYW50SW5jcmVhc2UgPVxuICAgICAgICAgICFpc0JhdGNoZWRFdmVudCAmJlxuICAgICAgICAgIHdoZWVsRGVsdGFNYWduaXR1ZGUgPiBhbmNob3JNaW5EZWx0YSAqIDEuMTUgJiYgLy8gMTUlIGluY3JlYXNlIGZyb20gbWluaW11bVxuICAgICAgICAgIHdoZWVsRGVsdGFNYWduaXR1ZGUgPiBhbmNob3JMYXN0RGVsdGEgKiAxLjA4OyAvLyBhbmQgOCUgaW5jcmVhc2luZyBmcm9tIGxhc3RcbiAgICAgICAgY29uc3QgZGVsdGFJbmNyZWFzaW5nID1cbiAgICAgICAgICBzdXN0YWluZWRJbmNyZWFzZSB8fCBzdXN0YWluZWRIaWdoIHx8IHNpZ25pZmljYW50SW5jcmVhc2U7XG5cbiAgICAgICAgLy8gUmVsZWFzZSBhbmNob3IgaWY6XG4gICAgICAgIC8vIDEuIFRoZXJlIHdhcyBhIGdhcCBpbiB3aGVlbCBldmVudHMgKD4gMjAwbXMpIC0gdXNlciBzdG9wcGVkIGFuZCBzdGFydGVkIG5ldyBzY3JvbGxcbiAgICAgICAgLy8gMi4gRGVsdGEgaXMgaW5jcmVhc2luZyBmcm9tIG1pbmltdW0gLSB1c2VyIHN0YXJ0ZWQgc2Nyb2xsaW5nIGFnYWluIGR1cmluZyBpbmVydGlhXG4gICAgICAgIC8vIDMuIERlbHRhIGhhcyBkZWNheWVkIHNpZ25pZmljYW50bHkgKDwgMzAlIG9mIGluaXRpYWwpIC0gaW5lcnRpYSBpcyB3aW5kaW5nIGRvd25cbiAgICAgICAgLy8gNC4gTG93IGFic29sdXRlIGRlbHRhICg8IDMwKSAtIGdlbnRsZSBpbnRlbnRpb25hbCBzY3JvbGxcbiAgICAgICAgY29uc3QgaGFzV2hlZWxHYXAgPSB0aW1lU2luY2VMYXN0V2hlZWwgPiAyMDA7XG4gICAgICAgIGNvbnN0IGRlbHRhRGVjYXllZCA9IHdoZWVsRGVsdGFNYWduaXR1ZGUgPCBhbmNob3JJbml0aWFsRGVsdGEgKiAwLjM7XG4gICAgICAgIGNvbnN0IGlzTG93RGVsdGEgPSB3aGVlbERlbHRhTWFnbml0dWRlIDwgMzA7XG5cbiAgICAgICAgaWYgKGhhc1doZWVsR2FwKSB7XG4gICAgICAgICAgLy8gVGltZSBnYXAgLSB1c2VyIHN0b3BwZWQgYW5kIHN0YXJ0ZWQgbmV3IHNjcm9sbFxuICAgICAgICAgIGFuY2hvclBvc2l0aW9uID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChkZWx0YUluY3JlYXNpbmcgJiYgdGltZVNpbmNlQW5jaG9yID4gMTAwKSB7XG4gICAgICAgICAgLy8gRGVsdGEgaW5jcmVhc2luZyAtIHVzZXIgc3RhcnRlZCBzY3JvbGxpbmcgYWdhaW5cbiAgICAgICAgICBhbmNob3JQb3NpdGlvbiA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNMb3dEZWx0YSkge1xuICAgICAgICAgIC8vIFZlcnkgbG93IGRlbHRhIC0gZ2VudGxlIGludGVudGlvbmFsIHNjcm9sbFxuICAgICAgICAgIGFuY2hvclBvc2l0aW9uID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChkZWx0YURlY2F5ZWQgJiYgdGltZVNpbmNlQW5jaG9yID4gMzAwKSB7XG4gICAgICAgICAgLy8gRGVsdGEgaGFzIGRlY2F5ZWQgYW5kIHNvbWUgdGltZSBwYXNzZWQgLSBpbmVydGlhIGlzIGRvbmVcbiAgICAgICAgICBhbmNob3JQb3NpdGlvbiA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU3RpbGwgaW4gaW5lcnRpYSBwaGFzZSAtIHN0YXkgYW5jaG9yZWRcbiAgICAgICAgICBpZiAoc2Nyb2xsUG9zaXRpb24gIT09IGFuY2hvclBvc2l0aW9uKSB7XG4gICAgICAgICAgICBzY3JvbGxQb3NpdGlvbiA9IGFuY2hvclBvc2l0aW9uO1xuICAgICAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnJlbmRlckl0ZW1zKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFVwZGF0ZSBsYXN0IGRlbHRhIGZvciBuZXh0IGNvbXBhcmlzb25cbiAgICAgICAgICBhbmNob3JMYXN0RGVsdGEgPSB3aGVlbERlbHRhTWFnbml0dWRlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBsYXN0IGRlbHRhIGZvciBuZXh0IGNvbXBhcmlzb25cbiAgICAgICAgYW5jaG9yTGFzdERlbHRhID0gd2hlZWxEZWx0YU1hZ25pdHVkZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJldmlvdXNQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgY29uc3QgbWF4U2Nyb2xsID0gTWF0aC5tYXgoMCwgdG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuXG4gICAgICBsZXQgbmV3UG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbiArIHNjcm9sbERlbHRhO1xuXG4gICAgICAvLyBBcHBseSBzbW9vdGhpbmcgaWYgZW5hYmxlZFxuICAgICAgaWYgKHNtb290aGluZykge1xuICAgICAgICBjb25zdCBzbW9vdGhpbmdGYWN0b3IgPSAwLjM7XG4gICAgICAgIG5ld1Bvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb24gKyBzY3JvbGxEZWx0YSAqIHNtb290aGluZ0ZhY3RvcjtcbiAgICAgIH1cblxuICAgICAgbmV3UG9zaXRpb24gPSBjbGFtcChuZXdQb3NpdGlvbiwgMCwgbWF4U2Nyb2xsKTtcblxuICAgICAgaWYgKG5ld1Bvc2l0aW9uICE9PSBzY3JvbGxQb3NpdGlvbikge1xuICAgICAgICBzY3JvbGxQb3NpdGlvbiA9IG5ld1Bvc2l0aW9uO1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzY3JvbGwgc3RhdGVcbiAgICAgICAgaWYgKCFpc1Njcm9sbGluZykge1xuICAgICAgICAgIGlzU2Nyb2xsaW5nID0gdHJ1ZTtcbiAgICAgICAgICAvLyBTdG9wIGFueSBleGlzdGluZyBpZGxlIGRldGVjdGlvbiBiZWZvcmUgc3RhcnRpbmcgbmV3IG9uZVxuICAgICAgICAgIHN0b3BJZGxlRGV0ZWN0aW9uKCk7XG4gICAgICAgICAgc3RhcnRJZGxlRGV0ZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFNjcm9sbFRpbWUgPSBub3c7XG5cbiAgICAgICAgLy8gVXBkYXRlIHNwZWVkIHRyYWNrZXJcbiAgICAgICAgc3BlZWRUcmFja2VyID0gdXBkYXRlU3BlZWRUcmFja2VyKFxuICAgICAgICAgIHNwZWVkVHJhY2tlcixcbiAgICAgICAgICBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgICBwcmV2aW91c1Bvc2l0aW9uLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFVwZGF0ZSB2aWV3cG9ydCBzdGF0ZVxuICAgICAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnZlbG9jaXR5ID0gc3BlZWRUcmFja2VyLnZlbG9jaXR5O1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsRGlyZWN0aW9uID0gc3BlZWRUcmFja2VyLmRpcmVjdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBzY3JvbGxlZCBzdGF0ZSBjbGFzc1xuICAgICAgICBjb25zdCB2aWV3cG9ydEVsID1cbiAgICAgICAgICB2aWV3cG9ydFN0YXRlPy52aWV3cG9ydEVsZW1lbnQgfHwgKGNvbXBvbmVudCBhcyBhbnkpLnZpZXdwb3J0RWxlbWVudDtcbiAgICAgICAgaWYgKHZpZXdwb3J0RWwpIHtcbiAgICAgICAgICB1cGRhdGVTY3JvbGxlZFN0YXRlKHZpZXdwb3J0RWwsIHNjcm9sbFBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0b3JlIHBlbmRpbmcgc2Nyb2xsIGRhdGEgZm9yIFJBRi1iYXRjaGVkIHJlbmRlcmluZ1xuICAgICAgICBwZW5kaW5nU2Nyb2xsRGF0YSA9IHtcbiAgICAgICAgICBwb3NpdGlvbjogc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgZGlyZWN0aW9uOiBzcGVlZFRyYWNrZXIuZGlyZWN0aW9uLFxuICAgICAgICAgIHByZXZpb3VzUG9zaXRpb24sXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gU2NoZWR1bGUgcmVuZGVyIHZpYSBSQUYgaWYgbm90IGFscmVhZHkgc2NoZWR1bGVkXG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyB3ZSByZW5kZXIgYXQgbW9zdCBvbmNlIHBlciBmcmFtZSwgZXZlbiBkdXJpbmcgZmFzdCBzY3JvbGxpbmdcbiAgICAgICAgaWYgKCFyZW5kZXJTY2hlZHVsZWQpIHtcbiAgICAgICAgICByZW5kZXJTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICByZW5kZXJTY2hlZHVsZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgLy8gVXNlIHRoZSBsYXRlc3Qgc2Nyb2xsIGRhdGEgKGNvYWxlc2NlcyBtdWx0aXBsZSB3aGVlbCBldmVudHMpXG4gICAgICAgICAgICBpZiAocGVuZGluZ1Njcm9sbERhdGEpIHtcbiAgICAgICAgICAgICAgLy8gRW1pdCBldmVudHMgd2l0aCB0aGUgbGF0ZXN0IHBvc2l0aW9uXG4gICAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpzY3JvbGxcIiwge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBwZW5kaW5nU2Nyb2xsRGF0YS5wb3NpdGlvbixcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb246IHBlbmRpbmdTY3JvbGxEYXRhLmRpcmVjdGlvbixcbiAgICAgICAgICAgICAgICBwcmV2aW91c1Bvc2l0aW9uOiBwZW5kaW5nU2Nyb2xsRGF0YS5wcmV2aW91c1Bvc2l0aW9uLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6dmVsb2NpdHktY2hhbmdlZFwiLCB7XG4gICAgICAgICAgICAgICAgdmVsb2NpdHk6IHNwZWVkVHJhY2tlci52ZWxvY2l0eSxcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb246IHNwZWVkVHJhY2tlci5kaXJlY3Rpb24sXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIC8vIFRyaWdnZXIgcmVuZGVyXG4gICAgICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcygpO1xuXG4gICAgICAgICAgICAgIHBlbmRpbmdTY3JvbGxEYXRhID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTY3JvbGwgdG8gcG9zaXRpb25cbiAgICBjb25zdCBzY3JvbGxUb1Bvc2l0aW9uID0gKHBvc2l0aW9uOiBudW1iZXIsIHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgbWF4U2Nyb2xsID0gTWF0aC5tYXgoMCwgdG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuICAgICAgY29uc3QgY2xhbXBlZFBvc2l0aW9uID0gY2xhbXAocG9zaXRpb24sIDAsIG1heFNjcm9sbCk7XG5cbiAgICAgIGlmIChjbGFtcGVkUG9zaXRpb24gIT09IHNjcm9sbFBvc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24gPSBjbGFtcGVkUG9zaXRpb247XG5cbiAgICAgICAgLy8gVXBkYXRlIHNwZWVkIHRyYWNrZXIgdG8gY2FsY3VsYXRlIHZlbG9jaXR5XG4gICAgICAgIHNwZWVkVHJhY2tlciA9IHVwZGF0ZVNwZWVkVHJhY2tlcihcbiAgICAgICAgICBzcGVlZFRyYWNrZXIsXG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgcHJldmlvdXNQb3NpdGlvbixcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBVcGRhdGUgdmlld3BvcnQgc3RhdGVcbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS52ZWxvY2l0eSA9IHNwZWVkVHJhY2tlci52ZWxvY2l0eTtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbERpcmVjdGlvbiA9IHNwZWVkVHJhY2tlci5kaXJlY3Rpb247XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPVxuICAgICAgICAgIGNsYW1wZWRQb3NpdGlvbiA+IHByZXZpb3VzUG9zaXRpb24gPyBcImZvcndhcmRcIiA6IFwiYmFja3dhcmRcIjtcblxuICAgICAgICAvLyBVcGRhdGUgc2Nyb2xsZWQgc3RhdGUgY2xhc3NcbiAgICAgICAgY29uc3Qgdmlld3BvcnRFbCA9XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZT8udmlld3BvcnRFbGVtZW50IHx8IChjb21wb25lbnQgYXMgYW55KS52aWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgIGlmICh2aWV3cG9ydEVsKSB7XG4gICAgICAgICAgdXBkYXRlU2Nyb2xsZWRTdGF0ZSh2aWV3cG9ydEVsLCBzY3JvbGxQb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IHNjcm9sbCBldmVudFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6c2Nyb2xsXCIsIHtcbiAgICAgICAgICBwb3NpdGlvbjogc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICAgIHByZXZpb3VzUG9zaXRpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEVtaXQgdmVsb2NpdHkgY2hhbmdlIGV2ZW50IHNvIGNvbGxlY3Rpb24gY2FuIHRyYWNrIGl0XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDp2ZWxvY2l0eS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgICB2ZWxvY2l0eTogc3BlZWRUcmFja2VyLnZlbG9jaXR5LFxuICAgICAgICAgIGRpcmVjdGlvbjogc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHNjcm9sbCBzdGF0ZSBhbmQgaWRsZSBkZXRlY3Rpb25cbiAgICAgICAgaWYgKCFpc1Njcm9sbGluZykge1xuICAgICAgICAgIGlzU2Nyb2xsaW5nID0gdHJ1ZTtcbiAgICAgICAgICBzdGFydElkbGVEZXRlY3Rpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0U2Nyb2xsVGltZSA9IERhdGUubm93KCk7XG5cbiAgICAgICAgLy8gVHJpZ2dlciByZW5kZXJcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnJlbmRlckl0ZW1zKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW1Njcm9sbGluZ10gUG9zaXRpb24gdW5jaGFuZ2VkOiAke3Njcm9sbFBvc2l0aW9ufWApO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW1Njcm9sbGluZ10gUG9zaXRpb24gdW5jaGFuZ2VkOiAke3Njcm9sbFBvc2l0aW9ufSwgbm90IHJlc2V0dGluZyBpZGxlIHRpbWVvdXRgXG4gICAgICAgIC8vICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFNjcm9sbCB0byBpbmRleFxuICAgIGNvbnN0IHNjcm9sbFRvSW5kZXggPSAoXG4gICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgYWxpZ25tZW50OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiA9IFwic3RhcnRcIixcbiAgICApID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGluZ10gc2Nyb2xsVG9JbmRleCBjYWxsZWQ6IGluZGV4PSR7aW5kZXh9LCBhbGlnbm1lbnQ9JHthbGlnbm1lbnR9YFxuICAgICAgLy8gKTtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSkge1xuICAgICAgICAvL2NvbnNvbGUubG9nKGBbU2Nyb2xsaW5nXSBzY3JvbGxUb0luZGV4IGFib3J0ZWQ6IG5vIHZpZXdwb3J0IHN0YXRlYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXRlbVNpemUgPSB2aWV3cG9ydFN0YXRlLml0ZW1TaXplIHx8IDUwO1xuICAgICAgY29uc3QgdG90YWxJdGVtcyA9IHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyB8fCAwO1xuICAgICAgY29uc3QgYWN0dWFsVG90YWxTaXplID0gdG90YWxJdGVtcyAqIGl0ZW1TaXplO1xuICAgICAgY29uc3QgTUFYX1ZJUlRVQUxfU0laRSA9XG4gICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5WSVJUVUFMX1NDUk9MTC5NQVhfVklSVFVBTF9TSVpFO1xuICAgICAgY29uc3QgaXNDb21wcmVzc2VkID0gYWN0dWFsVG90YWxTaXplID4gTUFYX1ZJUlRVQUxfU0laRTtcblxuICAgICAgbGV0IHRhcmdldFBvc2l0aW9uOiBudW1iZXI7XG5cbiAgICAgIGlmIChpc0NvbXByZXNzZWQpIHtcbiAgICAgICAgLy8gSW4gY29tcHJlc3NlZCBzcGFjZSwgbWFwIGluZGV4IHRvIHZpcnR1YWwgcG9zaXRpb25cbiAgICAgICAgY29uc3QgcmF0aW8gPSBpbmRleCAvIHRvdGFsSXRlbXM7XG4gICAgICAgIHRhcmdldFBvc2l0aW9uID0gcmF0aW8gKiBNYXRoLm1pbihhY3R1YWxUb3RhbFNpemUsIE1BWF9WSVJUVUFMX1NJWkUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRGlyZWN0IGNhbGN1bGF0aW9uIHdoZW4gbm90IGNvbXByZXNzZWRcbiAgICAgICAgdGFyZ2V0UG9zaXRpb24gPSBpbmRleCAqIGl0ZW1TaXplO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGp1c3QgcG9zaXRpb24gYmFzZWQgb24gYWxpZ25tZW50XG4gICAgICBzd2l0Y2ggKGFsaWdubWVudCkge1xuICAgICAgICBjYXNlIFwiY2VudGVyXCI6XG4gICAgICAgICAgdGFyZ2V0UG9zaXRpb24gLT0gY29udGFpbmVyU2l6ZSAvIDIgLSBpdGVtU2l6ZSAvIDI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICB0YXJnZXRQb3NpdGlvbiAtPSBjb250YWluZXJTaXplIC0gaXRlbVNpemU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGluZ10gVGFyZ2V0IHBvc2l0aW9uOiAke3RhcmdldFBvc2l0aW9ufSwgaXNDb21wcmVzc2VkOiAke2lzQ29tcHJlc3NlZH1gXG4gICAgICAvLyApO1xuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtTY3JvbGxpbmddIFNjcm9sbFRvSW5kZXg6IGluZGV4PSR7aW5kZXh9LCBwb3NpdGlvbj0ke3RhcmdldFBvc2l0aW9ufSwgYWxpZ25tZW50PSR7YWxpZ25tZW50fWBcbiAgICAgIC8vICk7XG5cbiAgICAgIHNjcm9sbFRvUG9zaXRpb24odGFyZ2V0UG9zaXRpb24sIFwic2Nyb2xsVG9JbmRleFwiKTtcbiAgICB9O1xuXG4gICAgLy8gU2Nyb2xsIHRvIGEgc3BlY2lmaWMgcGFnZVxuICAgIGNvbnN0IHNjcm9sbFRvUGFnZSA9IChcbiAgICAgIHBhZ2U6IG51bWJlcixcbiAgICAgIGxpbWl0OiBudW1iZXIgPSAyMCxcbiAgICAgIGFsaWdubWVudDogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIsXG4gICAgKSA9PiB7XG4gICAgICAvLyBWYWxpZGF0ZSBhbGlnbm1lbnQgcGFyYW1ldGVyXG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBhbGlnbm1lbnQgIT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgIVtcInN0YXJ0XCIsIFwiY2VudGVyXCIsIFwiZW5kXCJdLmluY2x1ZGVzKGFsaWdubWVudClcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtTY3JvbGxpbmddIEludmFsaWQgYWxpZ25tZW50IFwiJHthbGlnbm1lbnR9XCIsIHVzaW5nIFwic3RhcnRcImAsXG4gICAgICAgICk7XG4gICAgICAgIGFsaWdubWVudCA9IFwic3RhcnRcIjtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgd2UncmUgaW4gY3Vyc29yIG1vZGVcbiAgICAgIGNvbnN0IHZpZXdwb3J0Q29uZmlnID0gKGNvbXBvbmVudCBhcyBhbnkpLmNvbmZpZztcbiAgICAgIGNvbnN0IGlzQ3Vyc29yTW9kZSA9IHZpZXdwb3J0Q29uZmlnPy5wYWdpbmF0aW9uPy5zdHJhdGVneSA9PT0gXCJjdXJzb3JcIjtcblxuICAgICAgaWYgKGlzQ3Vyc29yTW9kZSkge1xuICAgICAgICAvLyBJbiBjdXJzb3IgbW9kZSwgY2hlY2sgaWYgd2UgY2FuIHNjcm9sbCB0byB0aGlzIHBhZ2VcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5jb2xsZWN0aW9uO1xuICAgICAgICBpZiAoY29sbGVjdGlvbikge1xuICAgICAgICAgIGNvbnN0IGhpZ2hlc3RMb2FkZWRQYWdlID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgIGNvbGxlY3Rpb24uZ2V0TG9hZGVkUmFuZ2VzKCkuc2l6ZSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHBhZ2UgPiBoaWdoZXN0TG9hZGVkUGFnZSArIDEpIHtcbiAgICAgICAgICAgIC8vIExpbWl0IGhvdyBtYW55IHBhZ2VzIHdlJ2xsIGxvYWQgYXQgb25jZSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSBBUEkgY2FsbHNcbiAgICAgICAgICAgIGNvbnN0IG1heFBhZ2VzVG9Mb2FkID0gMTA7IC8vIFJlYXNvbmFibGUgbGltaXRcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldFBhZ2UgPSBNYXRoLm1pbihcbiAgICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgICAgaGlnaGVzdExvYWRlZFBhZ2UgKyBtYXhQYWdlc1RvTG9hZCxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgYFtTY3JvbGxpbmddIENhbm5vdCBqdW1wIGRpcmVjdGx5IHRvIHBhZ2UgJHtwYWdlfSBpbiBjdXJzb3IgbW9kZS4gYCArXG4gICAgICAgICAgICAgICAgYFBhZ2VzIG11c3QgYmUgbG9hZGVkIHNlcXVlbnRpYWxseS4gQ3VycmVudCBoaWdoZXN0IHBhZ2U6ICR7aGlnaGVzdExvYWRlZFBhZ2V9LiBgICtcbiAgICAgICAgICAgICAgICBgV2lsbCBsb2FkIHVwIHRvIHBhZ2UgJHt0YXJnZXRQYWdlfWAsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBUcmlnZ2VyIHNlcXVlbnRpYWwgbG9hZGluZyB0byB0aGUgdGFyZ2V0IHBhZ2UgKGxpbWl0ZWQpXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRPZmZzZXQgPSAodGFyZ2V0UGFnZSAtIDEpICogbGltaXQ7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50T2Zmc2V0ID0gaGlnaGVzdExvYWRlZFBhZ2UgKiBsaW1pdDtcblxuICAgICAgICAgICAgLy8gTG9hZCBwYWdlcyBzZXF1ZW50aWFsbHkgdXAgdG8gdGhlIGxpbWl0ZWQgdGFyZ2V0XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtTY3JvbGxpbmddIEluaXRpYXRpbmcgc2VxdWVudGlhbCBsb2FkIGZyb20gcGFnZSAke1xuICAgICAgICAgICAgLy8gICAgIGhpZ2hlc3RMb2FkZWRQYWdlICsgMVxuICAgICAgICAgICAgLy8gICB9IHRvICR7dGFyZ2V0UGFnZX1gLFxuICAgICAgICAgICAgLy8gKTtcblxuICAgICAgICAgICAgLy8gU2Nyb2xsIHRvIHRoZSBsYXN0IGxvYWRlZCBwb3NpdGlvbiBmaXJzdFxuICAgICAgICAgICAgY29uc3QgbGFzdExvYWRlZEluZGV4ID0gaGlnaGVzdExvYWRlZFBhZ2UgKiBsaW1pdDtcbiAgICAgICAgICAgIHNjcm9sbFRvSW5kZXgobGFzdExvYWRlZEluZGV4LCBhbGlnbm1lbnQpO1xuXG4gICAgICAgICAgICAvLyBUaGUgY29sbGVjdGlvbiBmZWF0dXJlIHdpbGwgaGFuZGxlIHNlcXVlbnRpYWwgbG9hZGluZ1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDb252ZXJ0IHBhZ2UgdG8gaW5kZXggKHBhZ2UgMSA9IGluZGV4IDApXG4gICAgICBjb25zdCBpbmRleCA9IChwYWdlIC0gMSkgKiBsaW1pdDtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbU2Nyb2xsaW5nXSBTY3JvbGxUb1BhZ2U6IHBhZ2U9JHtwYWdlfSwgbGltaXQ9JHtsaW1pdH0sIHRhcmdldEluZGV4PSR7aW5kZXh9LCBhbGlnbm1lbnQ9JHthbGlnbm1lbnR9YFxuICAgICAgLy8gKTtcblxuICAgICAgLy8gSnVzdCBzY3JvbGwgdG8gdGhlIGluZGV4IC0gbGV0IHRoZSBub3JtYWwgcmVuZGVyaW5nIGZsb3cgaGFuZGxlIGRhdGEgbG9hZGluZyBhbmQgcGxhY2Vob2xkZXJzXG4gICAgICBzY3JvbGxUb0luZGV4KGluZGV4LCBhbGlnbm1lbnQpO1xuICAgIH07XG5cbiAgICAvLyBVcGRhdGUgc2Nyb2xsIGJvdW5kc1xuICAgIGNvbnN0IHVwZGF0ZVNjcm9sbEJvdW5kcyA9IChcbiAgICAgIG5ld1RvdGFsU2l6ZTogbnVtYmVyLFxuICAgICAgbmV3Q29udGFpbmVyU2l6ZTogbnVtYmVyLFxuICAgICkgPT4ge1xuICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9IG5ld1RvdGFsU2l6ZTtcbiAgICAgIGNvbnRhaW5lclNpemUgPSBuZXdDb250YWluZXJTaXplO1xuXG4gICAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgICB2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemUgPSBuZXdUb3RhbFNpemU7XG4gICAgICAgIHZpZXdwb3J0U3RhdGUuY29udGFpbmVyU2l6ZSA9IG5ld0NvbnRhaW5lclNpemU7XG4gICAgICB9XG5cbiAgICAgIC8vIERvbid0IGNsYW1wIHNjcm9sbCBwb3NpdGlvbiB1bnRpbCB3ZSBoYXZlIHJlYWwgZGF0YSBsb2FkZWRcbiAgICAgIC8vIFRoaXMgcHJldmVudHMgcmVzZXR0aW5nIGluaXRpYWxTY3JvbGxJbmRleCBwb3NpdGlvbiBiZWZvcmUgZGF0YSBhcnJpdmVzXG4gICAgICAvLyBDaGVjayB0b3RhbEl0ZW1zIGluc3RlYWQgb2YgdG90YWxWaXJ0dWFsU2l6ZSBzaW5jZSB2aXJ0dWFsU2l6ZSBjYW4gYmUgbm9uLXplcm8gZnJvbSBwYWRkaW5nXG4gICAgICBjb25zdCB0b3RhbEl0ZW1zID0gdmlld3BvcnRTdGF0ZT8udG90YWxJdGVtcyB8fCAwO1xuICAgICAgaWYgKHRvdGFsSXRlbXMgPD0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIENsYW1wIGN1cnJlbnQgcG9zaXRpb24gdG8gbmV3IGJvdW5kc1xuICAgICAgY29uc3QgbWF4U2Nyb2xsID0gTWF0aC5tYXgoMCwgdG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuICAgICAgaWYgKHNjcm9sbFBvc2l0aW9uID4gbWF4U2Nyb2xsKSB7XG4gICAgICAgIHNjcm9sbFRvUG9zaXRpb24obWF4U2Nyb2xsKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gRXh0ZW5kIHZpZXdwb3J0IEFQSVxuICAgIGNvbnN0IG9yaWdpbmFsU2Nyb2xsVG9JbmRleCA9IGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb0luZGV4O1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb0luZGV4ID0gKFxuICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgIGFsaWdubWVudD86IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiLFxuICAgICkgPT4ge1xuICAgICAgc2Nyb2xsVG9JbmRleChpbmRleCwgYWxpZ25tZW50KTtcbiAgICAgIG9yaWdpbmFsU2Nyb2xsVG9JbmRleD8uKGluZGV4LCBhbGlnbm1lbnQpO1xuICAgIH07XG5cbiAgICAvLyBBZGQgc2Nyb2xsVG9QYWdlIHRvIHZpZXdwb3J0IEFQSSAobmV3IG1ldGhvZCwgbm8gb3JpZ2luYWwgdG8gcHJlc2VydmUpXG4gICAgKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLnNjcm9sbFRvUGFnZSA9IChcbiAgICAgIHBhZ2U6IG51bWJlcixcbiAgICAgIGxpbWl0PzogbnVtYmVyLFxuICAgICAgYWxpZ25tZW50PzogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIsXG4gICAgKSA9PiB7XG4gICAgICBzY3JvbGxUb1BhZ2UocGFnZSwgbGltaXQsIGFsaWdubWVudCk7XG4gICAgfTtcblxuICAgIGNvbnN0IG9yaWdpbmFsU2Nyb2xsVG9Qb3NpdGlvbiA9IGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb1Bvc2l0aW9uO1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb1Bvc2l0aW9uID0gKHBvc2l0aW9uOiBudW1iZXIpID0+IHtcbiAgICAgIHNjcm9sbFRvUG9zaXRpb24ocG9zaXRpb24sIFwiYXBpXCIpO1xuICAgICAgb3JpZ2luYWxTY3JvbGxUb1Bvc2l0aW9uPy4ocG9zaXRpb24pO1xuICAgIH07XG5cbiAgICBjb25zdCBvcmlnaW5hbEdldFNjcm9sbFBvc2l0aW9uID0gY29tcG9uZW50LnZpZXdwb3J0LmdldFNjcm9sbFBvc2l0aW9uO1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5nZXRTY3JvbGxQb3NpdGlvbiA9ICgpID0+IHtcbiAgICAgIHJldHVybiBzY3JvbGxQb3NpdGlvbjtcbiAgICB9O1xuXG4gICAgLy8gQWRkIHdoZWVsIGV2ZW50IGxpc3RlbmVyIG9uIGluaXRpYWxpemF0aW9uXG4gICAgLy8gVGhpcyBibG9jayBpcyByZW1vdmVkIGFzIHBlciB0aGUgZWRpdCBoaW50LlxuXG4gICAgLy8gQ2xlYW4gdXAgb24gZGVzdHJveVxuICAgIGlmIChcImRlc3Ryb3lcIiBpbiBjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IGNvbXBvbmVudC5kZXN0cm95O1xuICAgICAgY29tcG9uZW50LmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIFJlbW92ZSBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgY29uc3Qgdmlld3BvcnRFbGVtZW50ID0gKGNvbXBvbmVudCBhcyBhbnkpLl9zY3JvbGxpbmdWaWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgIGlmICh2aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIndoZWVsXCIsIGhhbmRsZVdoZWVsKTtcbiAgICAgICAgICBpZiAoKGNvbXBvbmVudCBhcyBhbnkpLl9zY3JvbGxpbmdTdG9wT25DbGljaykge1xuICAgICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgaGFuZGxlTW91c2VEb3duKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciB0aW1lb3V0c1xuICAgICAgICBpZiAoaWRsZVRpbWVvdXRJZCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dChpZGxlVGltZW91dElkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0b3BJZGxlRGV0ZWN0aW9uKCk7XG4gICAgICAgIG9yaWdpbmFsRGVzdHJveT8uKCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEFkZCBzY3JvbGxCeSBtZXRob2RcbiAgICBjb25zdCBzY3JvbGxCeSA9IChkZWx0YTogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBwcmV2aW91c1Bvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICBjb25zdCBtYXhTY3JvbGwgPSBNYXRoLm1heCgwLCB0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZSk7XG4gICAgICBjb25zdCBuZXdQb3NpdGlvbiA9IGNsYW1wKHNjcm9sbFBvc2l0aW9uICsgZGVsdGEsIDAsIG1heFNjcm9sbCk7XG5cbiAgICAgIGlmIChuZXdQb3NpdGlvbiAhPT0gcHJldmlvdXNQb3NpdGlvbikge1xuICAgICAgICBzY3JvbGxQb3NpdGlvbiA9IG5ld1Bvc2l0aW9uO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzcGVlZCB0cmFja2VyXG4gICAgICAgIHNwZWVkVHJhY2tlciA9IHVwZGF0ZVNwZWVkVHJhY2tlcihcbiAgICAgICAgICBzcGVlZFRyYWNrZXIsXG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgcHJldmlvdXNQb3NpdGlvbixcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBVcGRhdGUgdmlld3BvcnQgc3RhdGVcbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS52ZWxvY2l0eSA9IHNwZWVkVHJhY2tlci52ZWxvY2l0eTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBzY3JvbGxlZCBzdGF0ZSBjbGFzc1xuICAgICAgICBjb25zdCB2aWV3cG9ydEVsID1cbiAgICAgICAgICB2aWV3cG9ydFN0YXRlPy52aWV3cG9ydEVsZW1lbnQgfHwgKGNvbXBvbmVudCBhcyBhbnkpLnZpZXdwb3J0RWxlbWVudDtcbiAgICAgICAgaWYgKHZpZXdwb3J0RWwpIHtcbiAgICAgICAgICB1cGRhdGVTY3JvbGxlZFN0YXRlKHZpZXdwb3J0RWwsIHNjcm9sbFBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtaXQgc2Nyb2xsIGV2ZW50XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpzY3JvbGxcIiwge1xuICAgICAgICAgIHBvc2l0aW9uOiBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgICB2ZWxvY2l0eTogc3BlZWRUcmFja2VyLnZlbG9jaXR5LFxuICAgICAgICAgIGRpcmVjdGlvbjogc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVHJpZ2dlciByZW5kZXJcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnJlbmRlckl0ZW1zPy4oKTtcblxuICAgICAgICAvLyBTdGFydCBpZGxlIGRldGVjdGlvbiBpZiBub3Qgc2Nyb2xsaW5nXG4gICAgICAgIGlmICghaXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICBpc1Njcm9sbGluZyA9IHRydWU7XG4gICAgICAgICAgc3RhcnRJZGxlRGV0ZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFNjcm9sbFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBFeHBvc2Ugc2Nyb2xsaW5nIHN0YXRlIGZvciBvdGhlciBmZWF0dXJlc1xuICAgIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zY3JvbGxpbmdTdGF0ZSA9IHtcbiAgICAgIHNldFZlbG9jaXR5VG9aZXJvLFxuICAgIH07XG5cbiAgICAvLyBBZGQgc2Nyb2xsQnkgdG8gdmlld3BvcnQgQVBJXG4gICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5ID0gc2Nyb2xsQnk7XG4gICAgY29tcG9uZW50LnZpZXdwb3J0LmdldFZlbG9jaXR5ID0gKCkgPT4gc3BlZWRUcmFja2VyLnZlbG9jaXR5O1xuXG4gICAgLy8gRXhwb3NlIHNjcm9sbGluZyBBUElcbiAgICAoY29tcG9uZW50IGFzIGFueSkuc2Nyb2xsaW5nID0ge1xuICAgICAgaGFuZGxlV2hlZWwsXG4gICAgICBzY3JvbGxUb1Bvc2l0aW9uLFxuICAgICAgc2Nyb2xsVG9JbmRleCxcbiAgICAgIHNjcm9sbFRvUGFnZSxcbiAgICAgIHNjcm9sbEJ5LFxuICAgICAgZ2V0U2Nyb2xsUG9zaXRpb246ICgpID0+IHNjcm9sbFBvc2l0aW9uLFxuICAgICAgdXBkYXRlU2Nyb2xsQm91bmRzLFxuICAgICAgZ2V0VmVsb2NpdHk6ICgpID0+IHNwZWVkVHJhY2tlci52ZWxvY2l0eSxcbiAgICAgIGdldERpcmVjdGlvbjogKCkgPT4gc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgIGlzU2Nyb2xsaW5nOiAoKSA9PiBpc1Njcm9sbGluZyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL21vbWVudHVtLnRzXG5cbi8qKlxuICogTW9tZW50dW0gRmVhdHVyZSAtIEFkZHMgaW5lcnRpYWwgc2Nyb2xsaW5nIHRvIHZpZXdwb3J0XG4gKiBQcm92aWRlcyBzbW9vdGggZGVjZWxlcmF0aW9uIGFmdGVyIHRvdWNoL21vdXNlIGRyYWcgZ2VzdHVyZXNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29tcG9uZW50LCBWaWV3cG9ydENvbnRleHQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZJRVdQT1JUX0NPTlNUQU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuaW50ZXJmYWNlIE1vbWVudHVtQ29uZmlnIHtcbiAgZW5hYmxlZD86IGJvb2xlYW47XG4gIGRlY2VsZXJhdGlvbj86IG51bWJlcjtcbiAgbWluVmVsb2NpdHk/OiBudW1iZXI7XG4gIG1pbkR1cmF0aW9uPzogbnVtYmVyO1xuICBtaW5WZWxvY2l0eVRocmVzaG9sZD86IG51bWJlcjtcbiAgLyoqIFN0b3AgbW9tZW50dW0gd2hlbiBjbGlja2luZyBvbiB0aGUgdmlld3BvcnQgKGRlZmF1bHQ6IHRydWUpICovXG4gIHN0b3BPbkNsaWNrPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBZGRzIG1vbWVudHVtIHNjcm9sbGluZyB0byB2aWV3cG9ydFxuICovXG5leHBvcnQgY29uc3Qgd2l0aE1vbWVudHVtID0gKGNvbmZpZzogTW9tZW50dW1Db25maWcgPSB7fSkgPT4ge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBWaWV3cG9ydENvbXBvbmVudD4oY29tcG9uZW50OiBUKTogVCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgZW5hYmxlZCA9IFZJRVdQT1JUX0NPTlNUQU5UUy5NT01FTlRVTS5FTkFCTEVELFxuICAgICAgZGVjZWxlcmF0aW9uID0gVklFV1BPUlRfQ09OU1RBTlRTLk1PTUVOVFVNLkRFQ0VMRVJBVElPTl9GQUNUT1IsXG4gICAgICBtaW5WZWxvY2l0eSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5NT01FTlRVTS5NSU5fVkVMT0NJVFksXG4gICAgICBtaW5EdXJhdGlvbiA9IFZJRVdQT1JUX0NPTlNUQU5UUy5NT01FTlRVTS5NSU5fRFVSQVRJT04sXG4gICAgICBtaW5WZWxvY2l0eVRocmVzaG9sZCA9IFZJRVdQT1JUX0NPTlNUQU5UUy5NT01FTlRVTS5NSU5fVkVMT0NJVFlfVEhSRVNIT0xELFxuICAgICAgc3RvcE9uQ2xpY2sgPSB0cnVlLCAvLyBTdG9wIG1vbWVudHVtIG9uIGNsaWNrIGJ5IGRlZmF1bHRcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gQWx3YXlzIGFwcGx5IHRoZSBmZWF0dXJlLCBidXQgY2hlY2sgaXNFbmFibGVkIGF0IHJ1bnRpbWVcblxuICAgIC8vIE1vbWVudHVtIHN0YXRlXG4gICAgbGV0IG1vbWVudHVtQW5pbWF0aW9uSWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGxldCBpc1RvdWNoaW5nID0gZmFsc2U7XG4gICAgbGV0IGlzTW91c2VEcmFnZ2luZyA9IGZhbHNlO1xuICAgIGxldCBsYXN0VG91Y2hQb3NpdGlvbiA9IDA7XG4gICAgbGV0IGxhc3RNb3VzZVBvc2l0aW9uID0gMDtcbiAgICBsZXQgdG91Y2hTdGFydFRpbWUgPSAwO1xuICAgIGxldCB2aWV3cG9ydFN0YXRlOiBhbnk7XG4gICAgbGV0IHNjcm9sbGluZ1N0YXRlOiBhbnk7XG4gICAgbGV0IGlzRW5hYmxlZCA9IGVuYWJsZWQ7IC8vIFRyYWNrIGN1cnJlbnQgZW5hYmxlZCBzdGF0ZVxuXG4gICAgLy8gR2V0IHJlZmVyZW5jZXMgYWZ0ZXIgaW5pdGlhbGl6YXRpb25cbiAgICBjb25zdCBvcmlnaW5hbEluaXRpYWxpemUgPSBjb21wb25lbnQudmlld3BvcnQuaW5pdGlhbGl6ZTtcbiAgICBjb21wb25lbnQudmlld3BvcnQuaW5pdGlhbGl6ZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG9yaWdpbmFsSW5pdGlhbGl6ZSgpO1xuICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IGluaXRpYWxpemVkXG4gICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCB2aWV3cG9ydCBhbmQgc2Nyb2xsaW5nIHN0YXRlc1xuICAgICAgdmlld3BvcnRTdGF0ZSA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zdGF0ZTtcbiAgICAgIHNjcm9sbGluZ1N0YXRlID0gKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLnNjcm9sbGluZ1N0YXRlO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgLy8gU3RvcCBtb21lbnR1bSBhbmltYXRpb24gKGNhbiBiZSBjYWxsZWQgZXh0ZXJuYWxseSlcbiAgICBjb25zdCBzdG9wTW9tZW50dW0gPSAoKSA9PiB7XG4gICAgICBpZiAobW9tZW50dW1BbmltYXRpb25JZCkge1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShtb21lbnR1bUFuaW1hdGlvbklkKTtcbiAgICAgICAgbW9tZW50dW1BbmltYXRpb25JZCA9IG51bGw7XG4gICAgICAgIC8vIFJlc2V0IHZlbG9jaXR5IGluIHNjcm9sbGluZyBmZWF0dXJlXG4gICAgICAgIGlmIChzY3JvbGxpbmdTdGF0ZSkge1xuICAgICAgICAgIHNjcm9sbGluZ1N0YXRlLnNldFZlbG9jaXR5VG9aZXJvPy4oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTdGFydCBtb21lbnR1bSBhbmltYXRpb25cbiAgICBjb25zdCBzdGFydE1vbWVudHVtID0gKGluaXRpYWxWZWxvY2l0eTogbnVtYmVyKSA9PiB7XG4gICAgICAvLyBDYW5jZWwgYW55IGV4aXN0aW5nIG1vbWVudHVtXG4gICAgICBpZiAobW9tZW50dW1BbmltYXRpb25JZCkge1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShtb21lbnR1bUFuaW1hdGlvbklkKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHZlbG9jaXR5ID0gaW5pdGlhbFZlbG9jaXR5O1xuXG4gICAgICBjb25zdCBhbmltYXRlID0gKCkgPT4ge1xuICAgICAgICAvLyBBcHBseSBkZWNlbGVyYXRpb25cbiAgICAgICAgdmVsb2NpdHkgKj0gZGVjZWxlcmF0aW9uO1xuXG4gICAgICAgIC8vIFN0b3AgaWYgdmVsb2NpdHkgaXMgdG9vIHNtYWxsXG4gICAgICAgIGlmIChNYXRoLmFicyh2ZWxvY2l0eSkgPCBtaW5WZWxvY2l0eSkge1xuICAgICAgICAgIG1vbWVudHVtQW5pbWF0aW9uSWQgPSBudWxsO1xuICAgICAgICAgIC8vIFJlc2V0IHZlbG9jaXR5IGluIHNjcm9sbGluZyBmZWF0dXJlXG4gICAgICAgICAgaWYgKHNjcm9sbGluZ1N0YXRlKSB7XG4gICAgICAgICAgICBzY3JvbGxpbmdTdGF0ZS5zZXRWZWxvY2l0eVRvWmVybz8uKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBzY3JvbGwgZGVsdGEgKHZlbG9jaXR5IGlzIGluIHB4L21zLCBzbyBtdWx0aXBseSBieSBmcmFtZSB0aW1lKVxuICAgICAgICBjb25zdCBmcmFtZURlbHRhID0gdmVsb2NpdHkgKiBWSUVXUE9SVF9DT05TVEFOVFMuTU9NRU5UVU0uRlJBTUVfVElNRTtcblxuICAgICAgICAvLyBVc2Ugc2Nyb2xsaW5nIGZlYXR1cmUncyBBUEkgdG8gdXBkYXRlIHBvc2l0aW9uXG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsQnkpIHtcbiAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsQnkoZnJhbWVEZWx0YSk7XG5cbiAgICAgICAgICAvLyBDb250aW51ZSBhbmltYXRpb25cbiAgICAgICAgICBtb21lbnR1bUFuaW1hdGlvbklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIHNjcm9sbEJ5IG1ldGhvZCwgc3RvcCBtb21lbnR1bVxuICAgICAgICAgIG1vbWVudHVtQW5pbWF0aW9uSWQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBtb21lbnR1bUFuaW1hdGlvbklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpO1xuICAgIH07XG5cbiAgICAvLyBUb3VjaCBldmVudCBoYW5kbGVyc1xuICAgIGNvbnN0IGhhbmRsZVRvdWNoU3RhcnQgPSAoZTogVG91Y2hFdmVudCkgPT4ge1xuICAgICAgaXNUb3VjaGluZyA9IHRydWU7XG4gICAgICBjb25zdCB0b3VjaCA9IGUudG91Y2hlc1swXTtcbiAgICAgIGNvbnN0IG9yaWVudGF0aW9uID0gdmlld3BvcnRTdGF0ZT8ub3JpZW50YXRpb24gfHwgXCJ2ZXJ0aWNhbFwiO1xuICAgICAgbGFzdFRvdWNoUG9zaXRpb24gPVxuICAgICAgICBvcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiID8gdG91Y2guY2xpZW50WSA6IHRvdWNoLmNsaWVudFg7XG4gICAgICB0b3VjaFN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgICAgIC8vIENhbmNlbCBhbnkgb25nb2luZyBtb21lbnR1bVxuICAgICAgaWYgKG1vbWVudHVtQW5pbWF0aW9uSWQpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUobW9tZW50dW1BbmltYXRpb25JZCk7XG4gICAgICAgIG1vbWVudHVtQW5pbWF0aW9uSWQgPSBudWxsO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVUb3VjaE1vdmUgPSAoZTogVG91Y2hFdmVudCkgPT4ge1xuICAgICAgaWYgKCFpc1RvdWNoaW5nKSByZXR1cm47XG5cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTsgLy8gUHJldmVudCBuYXRpdmUgc2Nyb2xsaW5nXG5cbiAgICAgIGNvbnN0IHRvdWNoID0gZS50b3VjaGVzWzBdO1xuICAgICAgY29uc3Qgb3JpZW50YXRpb24gPSB2aWV3cG9ydFN0YXRlPy5vcmllbnRhdGlvbiB8fCBcInZlcnRpY2FsXCI7XG4gICAgICBjb25zdCBjdXJyZW50UG9zaXRpb24gPVxuICAgICAgICBvcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiID8gdG91Y2guY2xpZW50WSA6IHRvdWNoLmNsaWVudFg7XG4gICAgICBjb25zdCBkZWx0YSA9IGxhc3RUb3VjaFBvc2l0aW9uIC0gY3VycmVudFBvc2l0aW9uOyAvLyBJbnZlcnRlZCBmb3IgbmF0dXJhbCBzY3JvbGxpbmdcbiAgICAgIGxhc3RUb3VjaFBvc2l0aW9uID0gY3VycmVudFBvc2l0aW9uO1xuXG4gICAgICAvLyBVc2Ugc2Nyb2xsaW5nIGZlYXR1cmUncyBBUEkgKDE6MSB0b3VjaC10by1zY3JvbGwgZm9yIG5hdHVyYWwgZmVlbClcbiAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsQnkpIHtcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5KGRlbHRhKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlVG91Y2hFbmQgPSAoKSA9PiB7XG4gICAgICBpZiAoIWlzVG91Y2hpbmcpIHJldHVybjtcbiAgICAgIGlzVG91Y2hpbmcgPSBmYWxzZTtcblxuICAgICAgY29uc3QgdG91Y2hFbmRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHRvdWNoRHVyYXRpb24gPSB0b3VjaEVuZFRpbWUgLSB0b3VjaFN0YXJ0VGltZTtcblxuICAgICAgLy8gR2V0IGN1cnJlbnQgdmVsb2NpdHkgZnJvbSBzY3JvbGxpbmcgZmVhdHVyZVxuICAgICAgY29uc3QgdmVsb2NpdHkgPSBjb21wb25lbnQudmlld3BvcnQuZ2V0VmVsb2NpdHk/LigpIHx8IDA7XG5cbiAgICAgIC8vIE9ubHkgc3RhcnQgbW9tZW50dW0gaWYgdGhlIHRvdWNoIHdhcyBxdWljayBlbm91Z2ggYW5kIHdlIGhhdmUgdmVsb2NpdHlcbiAgICAgIGlmIChcbiAgICAgICAgdG91Y2hEdXJhdGlvbiA8IG1pbkR1cmF0aW9uICYmXG4gICAgICAgIE1hdGguYWJzKHZlbG9jaXR5KSA+IG1pblZlbG9jaXR5VGhyZXNob2xkXG4gICAgICApIHtcbiAgICAgICAgc3RhcnRNb21lbnR1bSh2ZWxvY2l0eSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSBjbGljayB0byBzdG9wIG1vbWVudHVtICh3aXRob3V0IHByZXZlbnRpbmcgc2VsZWN0aW9uKVxuICAgIGNvbnN0IGhhbmRsZUNsaWNrID0gKF9lOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBzdG9wTW9tZW50dW0oKTtcbiAgICB9O1xuXG4gICAgLy8gTW91c2UgZXZlbnQgaGFuZGxlcnMgZm9yIGRlc2t0b3BcbiAgICBjb25zdCBoYW5kbGVNb3VzZURvd24gPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgaXNNb3VzZURyYWdnaW5nID0gdHJ1ZTtcbiAgICAgIGNvbnN0IG9yaWVudGF0aW9uID0gdmlld3BvcnRTdGF0ZT8ub3JpZW50YXRpb24gfHwgXCJ2ZXJ0aWNhbFwiO1xuICAgICAgbGFzdE1vdXNlUG9zaXRpb24gPSBvcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiID8gZS5jbGllbnRZIDogZS5jbGllbnRYO1xuICAgICAgdG91Y2hTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAvLyBDYW5jZWwgYW55IG9uZ29pbmcgbW9tZW50dW1cbiAgICAgIHN0b3BNb21lbnR1bSgpO1xuXG4gICAgICAvLyBQcmV2ZW50IHRleHQgc2VsZWN0aW9uXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZU1vdXNlTW92ZSA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBpZiAoIWlzTW91c2VEcmFnZ2luZykgcmV0dXJuO1xuXG4gICAgICBjb25zdCBvcmllbnRhdGlvbiA9IHZpZXdwb3J0U3RhdGU/Lm9yaWVudGF0aW9uIHx8IFwidmVydGljYWxcIjtcbiAgICAgIGNvbnN0IGN1cnJlbnRQb3NpdGlvbiA9XG4gICAgICAgIG9yaWVudGF0aW9uID09PSBcInZlcnRpY2FsXCIgPyBlLmNsaWVudFkgOiBlLmNsaWVudFg7XG4gICAgICBjb25zdCBkZWx0YSA9IGxhc3RNb3VzZVBvc2l0aW9uIC0gY3VycmVudFBvc2l0aW9uO1xuICAgICAgbGFzdE1vdXNlUG9zaXRpb24gPSBjdXJyZW50UG9zaXRpb247XG5cbiAgICAgIC8vIFVzZSBzY3JvbGxpbmcgZmVhdHVyZSdzIEFQSSAoMToxIGRyYWctdG8tc2Nyb2xsIGZvciBuYXR1cmFsIGZlZWwpXG4gICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5KSB7XG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxCeShkZWx0YSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZU1vdXNlVXAgPSAoKSA9PiB7XG4gICAgICBpZiAoIWlzTW91c2VEcmFnZ2luZykgcmV0dXJuO1xuICAgICAgaXNNb3VzZURyYWdnaW5nID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IG1vdXNlVXBUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGRyYWdEdXJhdGlvbiA9IG1vdXNlVXBUaW1lIC0gdG91Y2hTdGFydFRpbWU7XG5cbiAgICAgIC8vIEdldCBjdXJyZW50IHZlbG9jaXR5IGZyb20gc2Nyb2xsaW5nIGZlYXR1cmVcbiAgICAgIGNvbnN0IHZlbG9jaXR5ID0gY29tcG9uZW50LnZpZXdwb3J0LmdldFZlbG9jaXR5Py4oKSB8fCAwO1xuXG4gICAgICAvLyBTdGFydCBtb21lbnR1bSBmb3IgcXVpY2sgZHJhZ3NcbiAgICAgIGlmIChcbiAgICAgICAgZHJhZ0R1cmF0aW9uIDwgbWluRHVyYXRpb24gJiZcbiAgICAgICAgTWF0aC5hYnModmVsb2NpdHkpID4gbWluVmVsb2NpdHlUaHJlc2hvbGRcbiAgICAgICkge1xuICAgICAgICBzdGFydE1vbWVudHVtKHZlbG9jaXR5KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gT3ZlcnJpZGUgaW5pdGlhbGl6ZSB0byBhZGQgZXZlbnQgbGlzdGVuZXJzXG4gICAgY29uc3Qgb3JpZ2luYWxJbml0ID0gY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemU7XG4gICAgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBvcmlnaW5hbEluaXQoKTtcbiAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBpbml0aWFsaXplZFxuICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2aWV3cG9ydEVsZW1lbnQgPVxuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkudmlld3BvcnRFbGVtZW50IHx8XG4gICAgICAgIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zdGF0ZT8udmlld3BvcnRFbGVtZW50O1xuXG4gICAgICBpZiAodmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgIC8vIFRvdWNoIGV2ZW50c1xuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgaGFuZGxlVG91Y2hTdGFydCwge1xuICAgICAgICAgIHBhc3NpdmU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCBoYW5kbGVUb3VjaE1vdmUsIHtcbiAgICAgICAgICBwYXNzaXZlOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiwgaGFuZGxlVG91Y2hFbmQsIHtcbiAgICAgICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBNb3VzZSBldmVudHMgZm9yIGRlc2t0b3AgZHJhZ2dpbmdcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgaGFuZGxlTW91c2VEb3duKTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGhhbmRsZU1vdXNlVXApO1xuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgaGFuZGxlTW91c2VVcCk7XG5cbiAgICAgICAgLy8gQWRkIGNsaWNrIGxpc3RlbmVyIHRvIHN0b3AgbW9tZW50dW0gb24gY2xpY2sgKHdpdGhvdXQgYmxvY2tpbmcgc2VsZWN0aW9uKVxuICAgICAgICBpZiAoc3RvcE9uQ2xpY2spIHtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNsaWNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0b3JlIHJlZmVyZW5jZSBmb3IgY2xlYW51cFxuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuX21vbWVudHVtVmlld3BvcnRFbGVtZW50ID0gdmlld3BvcnRFbGVtZW50O1xuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuX21vbWVudHVtU3RvcE9uQ2xpY2sgPSBzdG9wT25DbGljaztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQ2xlYW4gdXAgb24gZGVzdHJveVxuICAgIGlmIChcImRlc3Ryb3lcIiBpbiBjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IGNvbXBvbmVudC5kZXN0cm95O1xuICAgICAgY29tcG9uZW50LmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIFJlbW92ZSBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgY29uc3Qgdmlld3BvcnRFbGVtZW50ID0gKGNvbXBvbmVudCBhcyBhbnkpLl9tb21lbnR1bVZpZXdwb3J0RWxlbWVudDtcbiAgICAgICAgaWYgKHZpZXdwb3J0RWxlbWVudCkge1xuICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLCBoYW5kbGVUb3VjaFN0YXJ0KTtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCBoYW5kbGVUb3VjaE1vdmUpO1xuICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiwgaGFuZGxlVG91Y2hFbmQpO1xuICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGhhbmRsZU1vdXNlRG93bik7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgaGFuZGxlTW91c2VVcCk7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIGhhbmRsZU1vdXNlVXApO1xuICAgICAgICAgIGlmICgoY29tcG9uZW50IGFzIGFueSkuX21vbWVudHVtU3RvcE9uQ2xpY2spIHtcbiAgICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlQ2xpY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbmNlbCBtb21lbnR1bSBhbmltYXRpb25cbiAgICAgICAgc3RvcE1vbWVudHVtKCk7XG5cbiAgICAgICAgb3JpZ2luYWxEZXN0cm95KCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEV4cG9zZSBtb21lbnR1bSBzdGF0ZSBmb3Igb3RoZXIgZmVhdHVyZXNcbiAgICAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkubW9tZW50dW1TdGF0ZSA9IHtcbiAgICAgIHN0b3BNb21lbnR1bSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3Njcm9sbGJhci50c1xuXG4vKipcbiAqIFNjcm9sbGJhciBGZWF0dXJlIC0gQ3VzdG9tIHNjcm9sbGJhciBpbXBsZW1lbnRhdGlvblxuICogUHJvdmlkZXMgdmlzdWFsIHNjcm9sbCBpbmRpY2F0aW9uIGFuZCBkcmFnLXRvLXNjcm9sbCBmdW5jdGlvbmFsaXR5XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBWSUVXUE9SVF9DT05TVEFOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB3cmFwSW5pdGlhbGl6ZSwgd3JhcERlc3Ryb3ksIHN0b3JlRmVhdHVyZUZ1bmN0aW9uIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IFBSRUZJWCwgYWRkQ2xhc3MsIHJlbW92ZUNsYXNzIH0gZnJvbSBcIm10cmxcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTY3JvbGxiYXJDb25maWcge1xuICBlbmFibGVkPzogYm9vbGVhbjtcbiAgYXV0b0hpZGU/OiBib29sZWFuO1xuICB0aHVtYk1pbkhlaWdodD86IG51bWJlcjtcbiAgdGh1bWJDb2xvcj86IHN0cmluZztcbiAgdHJhY2tDb2xvcj86IHN0cmluZztcbiAgYm9yZGVyUmFkaXVzPzogbnVtYmVyO1xuICBmYWRlVGltZW91dD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY3JvbGxiYXJDb21wb25lbnQge1xuICBzY3JvbGxiYXI6IHtcbiAgICBzaG93OiAoKSA9PiB2b2lkO1xuICAgIGhpZGU6ICgpID0+IHZvaWQ7XG4gICAgdXBkYXRlQm91bmRzOiAodG90YWxWaXJ0dWFsU2l6ZTogbnVtYmVyLCBjb250YWluZXJTaXplOiBudW1iZXIpID0+IHZvaWQ7XG4gICAgdXBkYXRlUG9zaXRpb246IChzY3JvbGxQb3NpdGlvbjogbnVtYmVyKSA9PiB2b2lkO1xuICB9O1xufVxuXG4vKipcbiAqIEFkZHMgc2Nyb2xsYmFyIGZ1bmN0aW9uYWxpdHkgdG8gdmlld3BvcnQgY29tcG9uZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoU2Nyb2xsYmFyKGNvbmZpZzogU2Nyb2xsYmFyQ29uZmlnID0ge30pIHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KFxuICAgIGNvbXBvbmVudDogVCxcbiAgKTogVCAmIFNjcm9sbGJhckNvbXBvbmVudCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgZW5hYmxlZCA9IHRydWUsXG4gICAgICBhdXRvSGlkZSA9IHRydWUsXG4gICAgICB0aHVtYk1pbkhlaWdodCA9IDI1LFxuICAgICAgYm9yZGVyUmFkaXVzID0gNCxcbiAgICAgIGZhZGVUaW1lb3V0ID0gMTAwMCxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gUmV0dXJuIG5vLW9wIGlmIGRpc2FibGVkXG4gICAgaWYgKCFlbmFibGVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jb21wb25lbnQsXG4gICAgICAgIHNjcm9sbGJhcjoge1xuICAgICAgICAgIHNob3c6ICgpID0+IHt9LFxuICAgICAgICAgIGhpZGU6ICgpID0+IHt9LFxuICAgICAgICAgIHVwZGF0ZUJvdW5kczogKCkgPT4ge30sXG4gICAgICAgICAgdXBkYXRlUG9zaXRpb246ICgpID0+IHt9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBTdGF0ZVxuICAgIGxldCB2aWV3cG9ydEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHNjcm9sbGJhclRyYWNrOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGxldCBzY3JvbGxiYXJUaHVtYjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIGxldCBpc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgbGV0IGRyYWdTdGFydFkgPSAwO1xuICAgIGxldCBkcmFnU3RhcnRTY3JvbGxQb3NpdGlvbiA9IDA7XG4gICAgbGV0IGhpZGVUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICAgIGxldCB0b3RhbFZpcnR1YWxTaXplID0gMDtcbiAgICBsZXQgY29udGFpbmVyU2l6ZSA9IDA7XG4gICAgbGV0IHRodW1iSGVpZ2h0ID0gMDtcbiAgICBsZXQgYW5pbWF0aW9uRnJhbWVJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGlzQ3Vyc29yTW9kZSA9IGZhbHNlO1xuICAgIGxldCBsb2FkZWRJdGVtc0NvdW50ID0gMDtcblxuICAgIC8vIENyZWF0ZSBzY3JvbGxiYXIgZWxlbWVudHNcbiAgICBjb25zdCBjcmVhdGVTY3JvbGxiYXJFbGVtZW50cyA9ICgpID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRFbGVtZW50KSByZXR1cm47XG5cbiAgICAgIHNjcm9sbGJhclRyYWNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGFkZENsYXNzKHNjcm9sbGJhclRyYWNrLCBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSKTtcbiAgICAgIHNjcm9sbGJhclRyYWNrLnN0eWxlLmNzc1RleHQgPSBgXG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICB6LWluZGV4OiAxMDtcbiAgICAgIGA7XG5cbiAgICAgIHNjcm9sbGJhclRodW1iID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAgICAgYWRkQ2xhc3MoXG4gICAgICAgIHNjcm9sbGJhclRodW1iLFxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSX1RIVU1CLFxuICAgICAgKTtcblxuICAgICAgc2Nyb2xsYmFyVHJhY2suYXBwZW5kQ2hpbGQoc2Nyb2xsYmFyVGh1bWIpO1xuICAgICAgdmlld3BvcnRFbGVtZW50LmFwcGVuZENoaWxkKHNjcm9sbGJhclRyYWNrKTtcbiAgICB9O1xuXG4gICAgLy8gU2hvdy9oaWRlIGZ1bmN0aW9uc1xuICAgIGNvbnN0IHNob3cgPSAoKSA9PiB7XG4gICAgICBpZiAoIXNjcm9sbGJhclRyYWNrIHx8IHRvdGFsVmlydHVhbFNpemUgPD0gY29udGFpbmVyU2l6ZSkgcmV0dXJuO1xuXG4gICAgICBpZiAoaGlkZVRpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGhpZGVUaW1lb3V0KTtcbiAgICAgICAgaGlkZVRpbWVvdXQgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgc2Nyb2xsYmFyVHJhY2ssXG4gICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVJfVklTSUJMRSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChhdXRvSGlkZSAmJiAhaXNEcmFnZ2luZykge1xuICAgICAgICBoaWRlVGltZW91dCA9IHNldFRpbWVvdXQoaGlkZSwgZmFkZVRpbWVvdXQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoaWRlID0gKCkgPT4ge1xuICAgICAgaWYgKCFzY3JvbGxiYXJUcmFjayB8fCBpc0RyYWdnaW5nKSByZXR1cm47XG4gICAgICByZW1vdmVDbGFzcyhcbiAgICAgICAgc2Nyb2xsYmFyVHJhY2ssXG4gICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVJfVklTSUJMRSxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSBzY3JvbGxiYXIgYm91bmRzXG4gICAgY29uc3QgdXBkYXRlQm91bmRzID0gKG5ld1RvdGFsU2l6ZTogbnVtYmVyLCBuZXdDb250YWluZXJTaXplOiBudW1iZXIpID0+IHtcbiAgICAgIHRvdGFsVmlydHVhbFNpemUgPSBuZXdUb3RhbFNpemU7XG4gICAgICBjb250YWluZXJTaXplID0gbmV3Q29udGFpbmVyU2l6ZTtcblxuICAgICAgaWYgKCFzY3JvbGxiYXJUcmFjayB8fCAhc2Nyb2xsYmFyVGh1bWIpIHJldHVybjtcblxuICAgICAgY29uc3QgbmVlZHNTY3JvbGxiYXIgPSB0b3RhbFZpcnR1YWxTaXplID4gY29udGFpbmVyU2l6ZTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGJhcl0gdXBkYXRlQm91bmRzOiB0b3RhbFNpemU9JHt0b3RhbFZpcnR1YWxTaXplfSwgY29udGFpbmVyU2l6ZT0ke2NvbnRhaW5lclNpemV9LCBuZWVkc1Njcm9sbGJhcj0ke25lZWRzU2Nyb2xsYmFyfWBcbiAgICAgIC8vICk7XG4gICAgICBzY3JvbGxiYXJUcmFjay5zdHlsZS5kaXNwbGF5ID0gbmVlZHNTY3JvbGxiYXIgPyBcImJsb2NrXCIgOiBcIm5vbmVcIjtcblxuICAgICAgaWYgKG5lZWRzU2Nyb2xsYmFyKSB7XG4gICAgICAgIGxldCBzY3JvbGxSYXRpbzogbnVtYmVyO1xuXG4gICAgICAgIGlmIChpc0N1cnNvck1vZGUgJiYgbG9hZGVkSXRlbXNDb3VudCA+IDApIHtcbiAgICAgICAgICAvLyBGb3IgY3Vyc29yIG1vZGUsIHRodW1iIHNpemUgcmVwcmVzZW50cyBsb2FkZWQgY29udGVudCB2cyBlc3RpbWF0ZWQgdG90YWxcbiAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBrbm93IHRvdGFsLCB1c2UgbG9hZGVkIGl0ZW1zICogMiBhcyBlc3RpbWF0ZVxuICAgICAgICAgIGNvbnN0IGVzdGltYXRlZFRvdGFsID1cbiAgICAgICAgICAgIHRvdGFsVmlydHVhbFNpemUgPiAwID8gdG90YWxWaXJ0dWFsU2l6ZSA6IGxvYWRlZEl0ZW1zQ291bnQgKiAyO1xuICAgICAgICAgIHNjcm9sbFJhdGlvID1cbiAgICAgICAgICAgIGNvbnRhaW5lclNpemUgL1xuICAgICAgICAgICAgTWF0aC5tYXgoZXN0aW1hdGVkVG90YWwsIGxvYWRlZEl0ZW1zQ291bnQgKyBjb250YWluZXJTaXplKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBOb3JtYWwgY2FsY3VsYXRpb24gZm9yIG9mZnNldC9wYWdlIHN0cmF0ZWdpZXNcbiAgICAgICAgICBzY3JvbGxSYXRpbyA9IGNvbnRhaW5lclNpemUgLyB0b3RhbFZpcnR1YWxTaXplO1xuICAgICAgICB9XG5cbiAgICAgICAgdGh1bWJIZWlnaHQgPSBNYXRoLm1heCh0aHVtYk1pbkhlaWdodCwgc2Nyb2xsUmF0aW8gKiBjb250YWluZXJTaXplKTtcbiAgICAgICAgc2Nyb2xsYmFyVGh1bWIuc3R5bGUuaGVpZ2h0ID0gYCR7dGh1bWJIZWlnaHR9cHhgO1xuICAgICAgICB1cGRhdGVQb3NpdGlvbihjb21wb25lbnQudmlld3BvcnQ/LmdldFNjcm9sbFBvc2l0aW9uKCkgfHwgMCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSB0aHVtYiBwb3NpdGlvblxuICAgIGNvbnN0IHVwZGF0ZVBvc2l0aW9uID0gKHNjcm9sbFBvczogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoIXNjcm9sbGJhclRodW1iIHx8ICFzY3JvbGxiYXJUcmFjaykgcmV0dXJuO1xuXG4gICAgICBjb25zdCBzY3JvbGxhYmxlRGlzdGFuY2UgPSB0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZTtcbiAgICAgIGlmIChzY3JvbGxhYmxlRGlzdGFuY2UgPD0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IE1hdGgubWluKFxuICAgICAgICAxLFxuICAgICAgICBNYXRoLm1heCgwLCBzY3JvbGxQb3MgLyBzY3JvbGxhYmxlRGlzdGFuY2UpLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG1heFRodW1iUG9zaXRpb24gPVxuICAgICAgICBzY3JvbGxiYXJUcmFjay5jbGllbnRIZWlnaHQgLSBzY3JvbGxiYXJUaHVtYi5jbGllbnRIZWlnaHQ7XG4gICAgICBjb25zdCB0aHVtYlBvc2l0aW9uID0gc2Nyb2xsUmF0aW8gKiBtYXhUaHVtYlBvc2l0aW9uO1xuXG4gICAgICBzY3JvbGxiYXJUaHVtYi5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgke3RodW1iUG9zaXRpb259cHgpYDtcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIHRyYWNrIGNsaWNrXG4gICAgY29uc3QgaGFuZGxlVHJhY2tDbGljayA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBpZiAoIXNjcm9sbGJhclRyYWNrIHx8ICFzY3JvbGxiYXJUaHVtYiB8fCBlLnRhcmdldCA9PT0gc2Nyb2xsYmFyVGh1bWIpXG4gICAgICAgIHJldHVybjtcblxuICAgICAgY29uc3QgdHJhY2tSZWN0ID0gc2Nyb2xsYmFyVHJhY2suZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCBjbGlja1kgPSBlLmNsaWVudFkgLSB0cmFja1JlY3QudG9wO1xuICAgICAgY29uc3QgdGh1bWJDZW50ZXJZID0gY2xpY2tZIC0gdGh1bWJIZWlnaHQgLyAyO1xuICAgICAgY29uc3QgbWF4VGh1bWJQb3NpdGlvbiA9IGNvbnRhaW5lclNpemUgLSB0aHVtYkhlaWdodDtcbiAgICAgIGNvbnN0IHRodW1iUG9zaXRpb24gPSBNYXRoLm1heChcbiAgICAgICAgMCxcbiAgICAgICAgTWF0aC5taW4odGh1bWJDZW50ZXJZLCBtYXhUaHVtYlBvc2l0aW9uKSxcbiAgICAgICk7XG4gICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IHRodW1iUG9zaXRpb24gLyBtYXhUaHVtYlBvc2l0aW9uO1xuICAgICAgY29uc3QgdGFyZ2V0U2Nyb2xsUG9zaXRpb24gPVxuICAgICAgICBzY3JvbGxSYXRpbyAqICh0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZSk7XG5cbiAgICAgIGNvbXBvbmVudC52aWV3cG9ydD8uc2Nyb2xsVG9Qb3NpdGlvbih0YXJnZXRTY3JvbGxQb3NpdGlvbik7XG4gICAgfTtcblxuICAgIC8vIE1vdXNlIGV2ZW50IGhhbmRsZXJzXG4gICAgY29uc3QgaGFuZGxlVGh1bWJNb3VzZURvd24gPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICBkcmFnU3RhcnRZID0gZS5jbGllbnRZO1xuICAgICAgZHJhZ1N0YXJ0U2Nyb2xsUG9zaXRpb24gPSBjb21wb25lbnQudmlld3BvcnQ/LmdldFNjcm9sbFBvc2l0aW9uKCkgfHwgMDtcblxuICAgICAgaWYgKHNjcm9sbGJhclRyYWNrKSB7XG4gICAgICAgIGFkZENsYXNzKFxuICAgICAgICAgIHNjcm9sbGJhclRyYWNrLFxuICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVJfRFJBR0dJTkcsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVtaXQgZHJhZyBzdGFydCBldmVudCB0byBub3RpZnkgdmlld3BvcnRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpkcmFnLXN0YXJ0XCIsIHtcbiAgICAgICAgc291cmNlOiBcInNjcm9sbGJhclwiLFxuICAgICAgICBzdGFydFBvc2l0aW9uOiBkcmFnU3RhcnRTY3JvbGxQb3NpdGlvbixcbiAgICAgIH0pO1xuXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBoYW5kbGVNb3VzZVVwKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlTW91c2VNb3ZlID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmICghaXNEcmFnZ2luZyB8fCAhc2Nyb2xsYmFyVHJhY2sgfHwgIXNjcm9sbGJhclRodW1iKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGRlbHRhWSA9IGUuY2xpZW50WSAtIGRyYWdTdGFydFk7XG4gICAgICBjb25zdCB0cmFja0hlaWdodCA9IHNjcm9sbGJhclRyYWNrLmNsaWVudEhlaWdodDtcbiAgICAgIGNvbnN0IHRodW1iSGVpZ2h0ID0gc2Nyb2xsYmFyVGh1bWIuY2xpZW50SGVpZ2h0O1xuICAgICAgY29uc3QgbWF4VGh1bWJUcmF2ZWwgPSB0cmFja0hlaWdodCAtIHRodW1iSGVpZ2h0O1xuXG4gICAgICBpZiAobWF4VGh1bWJUcmF2ZWwgPD0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBkZWx0YVJhdGlvID0gZGVsdGFZIC8gbWF4VGh1bWJUcmF2ZWw7XG4gICAgICBjb25zdCBkcmFnU3RhcnRTY3JvbGxSYXRpbyA9XG4gICAgICAgIGRyYWdTdGFydFNjcm9sbFBvc2l0aW9uIC8gKHRvdGFsVmlydHVhbFNpemUgLSBjb250YWluZXJTaXplKTtcbiAgICAgIGNvbnN0IG5ld1Njcm9sbFJhdGlvID0gTWF0aC5tYXgoXG4gICAgICAgIDAsXG4gICAgICAgIE1hdGgubWluKDEsIGRyYWdTdGFydFNjcm9sbFJhdGlvICsgZGVsdGFSYXRpbyksXG4gICAgICApO1xuXG4gICAgICAvLyBVcGRhdGUgdGh1bWIgcG9zaXRpb24gaW1tZWRpYXRlbHlcbiAgICAgIGNvbnN0IHRodW1iUG9zaXRpb24gPSBuZXdTY3JvbGxSYXRpbyAqIG1heFRodW1iVHJhdmVsO1xuICAgICAgc2Nyb2xsYmFyVGh1bWIuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoJHt0aHVtYlBvc2l0aW9ufXB4KWA7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBuZXcgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICBjb25zdCBuZXdQb3NpdGlvbiA9IG5ld1Njcm9sbFJhdGlvICogKHRvdGFsVmlydHVhbFNpemUgLSBjb250YWluZXJTaXplKTtcbiAgICAgIGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbiA9IG5ld1Bvc2l0aW9uO1xuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtTY3JvbGxiYXJdIE1vdXNlIG1vdmU6IG5ld1Bvcz0ke25ld1Bvc2l0aW9uLnRvRml4ZWQoXG4gICAgICAvLyAgICAgMFxuICAgICAgLy8gICApfSwgYW5pbWF0aW9uRnJhbWVJZD0ke2FuaW1hdGlvbkZyYW1lSWR9YFxuICAgICAgLy8gKTtcblxuICAgICAgLy8gVGhyb3R0bGUgdmlld3BvcnQgdXBkYXRlc1xuICAgICAgaWYgKGFuaW1hdGlvbkZyYW1lSWQgPT09IG51bGwgJiYgY29tcG9uZW50LnZpZXdwb3J0KSB7XG4gICAgICAgIGFuaW1hdGlvbkZyYW1lSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtTY3JvbGxiYXJdIFJBRiBjYWxsYmFjazogc2Nyb2xsaW5nIHRvICR7bGFzdFJlcXVlc3RlZFNjcm9sbFBvc2l0aW9ufWBcbiAgICAgICAgICAvLyApO1xuICAgICAgICAgIGlmIChsYXN0UmVxdWVzdGVkU2Nyb2xsUG9zaXRpb24gIT09IG51bGwgJiYgY29tcG9uZW50LnZpZXdwb3J0KSB7XG4gICAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9Qb3NpdGlvbihsYXN0UmVxdWVzdGVkU2Nyb2xsUG9zaXRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhbmltYXRpb25GcmFtZUlkID0gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZU1vdXNlVXAgPSAoKSA9PiB7XG4gICAgICBpc0RyYWdnaW5nID0gZmFsc2U7XG5cbiAgICAgIGlmIChhbmltYXRpb25GcmFtZUlkICE9PSBudWxsKSB7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGFuaW1hdGlvbkZyYW1lSWQpO1xuICAgICAgICBhbmltYXRpb25GcmFtZUlkID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbiAhPT0gbnVsbCAmJiBjb21wb25lbnQudmlld3BvcnQpIHtcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbFRvUG9zaXRpb24obGFzdFJlcXVlc3RlZFNjcm9sbFBvc2l0aW9uKTtcbiAgICAgICAgbGFzdFJlcXVlc3RlZFNjcm9sbFBvc2l0aW9uID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHNjcm9sbGJhclRyYWNrKSB7XG4gICAgICAgIHJlbW92ZUNsYXNzKFxuICAgICAgICAgIHNjcm9sbGJhclRyYWNrLFxuICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVJfRFJBR0dJTkcsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVtaXQgZHJhZyBlbmQgZXZlbnRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpkcmFnLWVuZFwiLCB7XG4gICAgICAgIHNvdXJjZTogXCJzY3JvbGxiYXJcIixcbiAgICAgICAgZW5kUG9zaXRpb246IGNvbXBvbmVudC52aWV3cG9ydD8uZ2V0U2Nyb2xsUG9zaXRpb24oKSB8fCAwLFxuICAgICAgfSk7XG5cbiAgICAgIGhpZGUoKTtcblxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgaGFuZGxlTW91c2VVcCk7XG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgZnVuY3Rpb25cbiAgICBjb25zdCBpbml0aWFsaXplID0gKCkgPT4ge1xuICAgICAgaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjtcblxuICAgICAgdmlld3BvcnRFbGVtZW50ID0gY29tcG9uZW50LmVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIGAuJHtQUkVGSVh9LXZpZXdwb3J0YCxcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgIGlmICghdmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIltTY3JvbGxiYXJdIE5vIHZpZXdwb3J0IGVsZW1lbnQgZm91bmRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICB2aWV3cG9ydEVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICBgLiR7UFJFRklYfS0ke1ZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVJ9YCxcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNyZWF0ZVNjcm9sbGJhckVsZW1lbnRzKCk7XG4gICAgICBpc0luaXRpYWxpemVkID0gdHJ1ZTtcblxuICAgICAgaWYgKHNjcm9sbGJhclRyYWNrICYmIHZpZXdwb3J0RWxlbWVudCkge1xuICAgICAgICBzY3JvbGxiYXJUcmFjay5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlVHJhY2tDbGljayk7XG5cbiAgICAgICAgaWYgKHNjcm9sbGJhclRodW1iKSB7XG4gICAgICAgICAgc2Nyb2xsYmFyVGh1bWIuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBoYW5kbGVUaHVtYk1vdXNlRG93bik7XG4gICAgICAgIH1cblxuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZW50ZXJcIiwgc2hvdywgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICBcIm1vdXNlbGVhdmVcIixcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWlzRHJhZ2dpbmcpIGhpZGUoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgcGFzc2l2ZTogdHJ1ZSB9LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBJbml0aWFsaXplIHdpdGggY3VycmVudCB2aWV3cG9ydCBzdGF0ZVxuICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydCkge1xuICAgICAgICBjb25zdCBpbmZvID0gY29tcG9uZW50LnZpZXdwb3J0LmdldFZpZXdwb3J0SW5mbygpO1xuICAgICAgICB0b3RhbFZpcnR1YWxTaXplID0gaW5mby50b3RhbFZpcnR1YWxTaXplO1xuICAgICAgICBjb250YWluZXJTaXplID0gaW5mby5jb250YWluZXJTaXplO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluIGN1cnNvciBtb2RlXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbjtcbiAgICAgICAgY29uc3Qgdmlld3BvcnRDb25maWcgPSAoY29tcG9uZW50IGFzIGFueSkuY29uZmlnO1xuICAgICAgICBpc0N1cnNvck1vZGUgPSB2aWV3cG9ydENvbmZpZz8ucGFnaW5hdGlvbj8uc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCI7XG5cbiAgICAgICAgdXBkYXRlQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgICB1cGRhdGVQb3NpdGlvbihjb21wb25lbnQudmlld3BvcnQuZ2V0U2Nyb2xsUG9zaXRpb24oKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEV2ZW50IGxpc3RlbmVyc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpzY3JvbGxcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBpZiAoIWlzRHJhZ2dpbmcpIHtcbiAgICAgICAgICB1cGRhdGVQb3NpdGlvbihkYXRhLnBvc2l0aW9uKTtcbiAgICAgICAgICBzaG93KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnZpcnR1YWwtc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9IGRhdGEudG90YWxWaXJ0dWFsU2l6ZTtcbiAgICAgICAgdXBkYXRlQm91bmRzKGRhdGEudG90YWxWaXJ0dWFsU2l6ZSwgY29udGFpbmVyU2l6ZSk7XG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpjb250YWluZXItc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29udGFpbmVyU2l6ZSA9IGRhdGEuY29udGFpbmVyU2l6ZTtcbiAgICAgICAgdXBkYXRlQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGRhdGEuY29udGFpbmVyU2l6ZSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBpdGVtcyBsb2FkZWQgdG8gdXBkYXRlIHNjcm9sbGJhciBpbiBjdXJzb3IgbW9kZVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDppdGVtcy1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGlzQ3Vyc29yTW9kZSkge1xuICAgICAgICAgIGxvYWRlZEl0ZW1zQ291bnQgPSBkYXRhLmxvYWRlZENvdW50IHx8IDA7XG4gICAgICAgICAgdXBkYXRlQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciB0b3RhbCBpdGVtcyBjaGFuZ2VzIChpbXBvcnRhbnQgZm9yIGN1cnNvciBtb2RlKVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDp0b3RhbC1pdGVtcy1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGlzQ3Vyc29yTW9kZSAmJiBkYXRhLnRvdGFsKSB7XG4gICAgICAgICAgLy8gSW4gY3Vyc29yIG1vZGUsIHRoZSB0b3RhbCBpcyBkeW5hbWljXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgW1Njcm9sbGJhcl0gQ3Vyc29yIG1vZGU6IHVwZGF0aW5nIGJvdW5kcyBmb3IgbmV3IHRvdGFsICR7ZGF0YS50b3RhbH1gLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdXBkYXRlQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gU3RvcmUgaW5pdGlhbGl6ZSBmdW5jdGlvblxuICAgIHN0b3JlRmVhdHVyZUZ1bmN0aW9uKGNvbXBvbmVudCwgXCJfc2Nyb2xsYmFySW5pdGlhbGl6ZVwiLCBpbml0aWFsaXplKTtcblxuICAgIC8vIEhvb2sgaW50byB2aWV3cG9ydCBpbml0aWFsaXphdGlvblxuICAgIHdyYXBJbml0aWFsaXplKGNvbXBvbmVudCwgaW5pdGlhbGl6ZSk7XG5cbiAgICAvLyBDbGVhbnVwXG4gICAgY29uc3QgZGVzdHJveSA9ICgpID0+IHtcbiAgICAgIGlmIChzY3JvbGxiYXJUcmFjaykge1xuICAgICAgICBzY3JvbGxiYXJUcmFjay5yZW1vdmUoKTtcbiAgICAgICAgc2Nyb2xsYmFyVHJhY2sgPSBudWxsO1xuICAgICAgfVxuICAgICAgc2Nyb2xsYmFyVGh1bWIgPSBudWxsO1xuICAgICAgdmlld3BvcnRFbGVtZW50ID0gbnVsbDtcbiAgICAgIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAgICAgaWYgKGhpZGVUaW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dChoaWRlVGltZW91dCk7XG4gICAgICAgIGhpZGVUaW1lb3V0ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgaGFuZGxlTW91c2VVcCk7XG4gICAgfTtcblxuICAgIHN0b3JlRmVhdHVyZUZ1bmN0aW9uKGNvbXBvbmVudCwgXCJfc2Nyb2xsYmFyRGVzdHJveVwiLCBkZXN0cm95KTtcbiAgICB3cmFwRGVzdHJveShjb21wb25lbnQsIGRlc3Ryb3kpO1xuXG4gICAgLy8gUmV0dXJuIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBzY3JvbGxiYXI6IHsgc2hvdywgaGlkZSwgdXBkYXRlQm91bmRzLCB1cGRhdGVQb3NpdGlvbiB9LFxuICAgIH07XG4gIH07XG59XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL2NvbGxlY3Rpb24udHNcblxuLyoqXG4gKiBDb2xsZWN0aW9uIEZlYXR1cmUgLSBEYXRhIG1hbmFnZW1lbnQgYW5kIHJhbmdlIGxvYWRpbmdcbiAqIEhhbmRsZXMgY29sbGVjdGlvbiBpbnRlZ3JhdGlvbiwgcGFnaW5hdGlvbiwgYW5kIGRhdGEgZmV0Y2hpbmdcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBNdXRhYmxlIHJlZmVyZW5jZSBmb3IgbGF0ZSBiaW5kaW5nIGluIGZ1bmN0aW9uYWwgY29tcG9zaXRpb24uXG4gKiBVc2VkIGJ5IFZMaXN0IHRvIGFsbG93IGNvbGxlY3Rpb24gKGFwcGxpZWQgZWFybHkpIHRvIGFjY2Vzc1xuICogc2VhcmNoL2ZpbHRlciBmZWF0dXJlcyAoYXBwbGllZCBsYXRlcikuXG4gKi9cbmludGVyZmFjZSBTZWxmUmVmPFQ+IHtcbiAgY3VycmVudDogVCB8IG51bGw7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IHdpdGggb3B0aW9uYWwgc2VhcmNoL2ZpbHRlciBjYXBhYmlsaXRpZXMuXG4gKiBUaGVzZSBhcmUgYWRkZWQgYnkgd2l0aFNlYXJjaCBhbmQgd2l0aEZpbHRlciBmZWF0dXJlcy5cbiAqL1xuaW50ZXJmYWNlIFNlYXJjaEZpbHRlckNhcGFibGUge1xuICBfc2VhcmNoUXVlcnk/OiAoKSA9PiBzdHJpbmc7XG4gIF9maWx0ZXJzPzogKCkgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5pbXBvcnQgeyBWSUVXUE9SVF9DT05TVEFOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB3cmFwRGVzdHJveSB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGlvbkNvbmZpZyB7XG4gIGNvbGxlY3Rpb24/OiBhbnk7IC8vIENvbGxlY3Rpb24gYWRhcHRlclxuICByYW5nZVNpemU/OiBudW1iZXI7IC8vIERlZmF1bHQgcmFuZ2Ugc2l6ZSBmb3IgbG9hZGluZ1xuICBzdHJhdGVneT86IFwib2Zmc2V0XCIgfCBcInBhZ2VcIiB8IFwiY3Vyc29yXCI7IC8vIExvYWRpbmcgc3RyYXRlZ3lcbiAgdHJhbnNmb3JtPzogKGl0ZW06IGFueSkgPT4gYW55OyAvLyBJdGVtIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uXG4gIGNhbmNlbExvYWRUaHJlc2hvbGQ/OiBudW1iZXI7IC8vIFZlbG9jaXR5IHRocmVzaG9sZCBmb3IgY2FuY2VsbGluZyBsb2Fkc1xuICBtYXhDb25jdXJyZW50UmVxdWVzdHM/OiBudW1iZXI7XG4gIGVuYWJsZVJlcXVlc3RRdWV1ZT86IGJvb2xlYW47XG4gIG1heFF1ZXVlU2l6ZT86IG51bWJlcjtcbiAgbG9hZE9uRHJhZ0VuZD86IGJvb2xlYW47IC8vIEVuYWJsZSBsb2FkaW5nIHdoZW4gZHJhZyBlbmRzIChzYWZldHkgbWVhc3VyZSlcbiAgaW5pdGlhbFNjcm9sbEluZGV4PzogbnVtYmVyOyAvLyBJbml0aWFsIHNjcm9sbCBwb3NpdGlvbiAoMC1iYXNlZCBpbmRleClcbiAgc2VsZWN0SWQ/OiBzdHJpbmcgfCBudW1iZXI7IC8vIElEIG9mIGl0ZW0gdG8gc2VsZWN0IGFmdGVyIGluaXRpYWwgbG9hZCBjb21wbGV0ZXNcbiAgYXV0b0xvYWQ/OiBib29sZWFuOyAvLyBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgbG9hZCBkYXRhIG9uIGluaXRpYWxpemF0aW9uIChkZWZhdWx0OiB0cnVlKVxuICBhdXRvU2VsZWN0Rmlyc3Q/OiBib29sZWFuOyAvLyBBdXRvbWF0aWNhbGx5IHNlbGVjdCBmaXJzdCBpdGVtIGFmdGVyIGluaXRpYWwgbG9hZCAoZGVmYXVsdDogZmFsc2UpXG4gIC8qKiBNYXhpbXVtIGl0ZW1zIHRvIGtlZXAgaW4gbWVtb3J5IChkZWZhdWx0OiAxMDAwKSAqL1xuICBtYXhDYWNoZWRJdGVtcz86IG51bWJlcjtcbiAgLyoqIEV4dHJhIGl0ZW1zIHRvIGtlZXAgYXJvdW5kIHZpc2libGUgcmFuZ2UgZHVyaW5nIGV2aWN0aW9uIChkZWZhdWx0OiAxNTApICovXG4gIGV2aWN0aW9uQnVmZmVyPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbGxlY3Rpb25Db21wb25lbnQge1xuICBjb2xsZWN0aW9uOiB7XG4gICAgbG9hZFJhbmdlOiAob2Zmc2V0OiBudW1iZXIsIGxpbWl0OiBudW1iZXIpID0+IFByb21pc2U8YW55W10+O1xuICAgIGxvYWRNaXNzaW5nUmFuZ2VzOiAoXG4gICAgICByYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9LFxuICAgICAgY2FsbGVyPzogc3RyaW5nLFxuICAgICkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICBnZXRMb2FkZWRSYW5nZXM6ICgpID0+IFNldDxudW1iZXI+O1xuICAgIGdldFBlbmRpbmdSYW5nZXM6ICgpID0+IFNldDxudW1iZXI+O1xuICAgIGNsZWFyRmFpbGVkUmFuZ2VzOiAoKSA9PiB2b2lkO1xuICAgIGNsZWFyUXVldWU6ICgpID0+IHZvaWQ7XG4gICAgc2V0TWFudWFsbHlMb2FkZWQ6ICgpID0+IHZvaWQ7XG4gICAgc2V0UmVsb2FkSW5Qcm9ncmVzczogKFxuICAgICAgaW5Qcm9ncmVzczogYm9vbGVhbixcbiAgICAgIHRhcmdldFJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9LFxuICAgICkgPT4gdm9pZDtcbiAgICByZXRyeUZhaWxlZFJhbmdlOiAocmFuZ2VJZDogbnVtYmVyKSA9PiBQcm9taXNlPGFueVtdPjtcbiAgICBzZXRUb3RhbEl0ZW1zOiAodG90YWw6IG51bWJlcikgPT4gdm9pZDtcbiAgICBnZXRUb3RhbEl0ZW1zOiAoKSA9PiBudW1iZXI7XG4gICAgLy8gQ3Vyc29yLXNwZWNpZmljIG1ldGhvZHNcbiAgICBnZXRDdXJyZW50Q3Vyc29yOiAoKSA9PiBzdHJpbmcgfCBudWxsO1xuICAgIGdldEN1cnNvckZvclBhZ2U6IChwYWdlOiBudW1iZXIpID0+IHN0cmluZyB8IG51bGw7XG4gICAgLy8gUmVzZXQgbWV0aG9kIGZvciByZWxvYWQgZnVuY3Rpb25hbGl0eVxuICAgIHJlc2V0OiAoKSA9PiB2b2lkO1xuICB9O1xufVxuXG4vKipcbiAqIEFkZHMgY29sbGVjdGlvbiBmdW5jdGlvbmFsaXR5IHRvIHZpZXdwb3J0IGNvbXBvbmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aENvbGxlY3Rpb24oY29uZmlnOiBDb2xsZWN0aW9uQ29uZmlnID0ge30pIHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KFxuICAgIGNvbXBvbmVudDogVCxcbiAgKTogVCAmIENvbGxlY3Rpb25Db21wb25lbnQgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbGxlY3Rpb24sXG4gICAgICByYW5nZVNpemUgPSBWSUVXUE9SVF9DT05TVEFOVFMuTE9BRElORy5ERUZBVUxUX1JBTkdFX1NJWkUsXG4gICAgICBzdHJhdGVneSA9IFwib2Zmc2V0XCIsXG4gICAgICB0cmFuc2Zvcm0sXG4gICAgICBjYW5jZWxMb2FkVGhyZXNob2xkID0gVklFV1BPUlRfQ09OU1RBTlRTLkxPQURJTkcuQ0FOQ0VMX1RIUkVTSE9MRCxcbiAgICAgIG1heENvbmN1cnJlbnRSZXF1ZXN0cyA9IFZJRVdQT1JUX0NPTlNUQU5UUy5MT0FESU5HXG4gICAgICAgIC5NQVhfQ09OQ1VSUkVOVF9SRVFVRVNUUyxcbiAgICAgIGVuYWJsZVJlcXVlc3RRdWV1ZSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5SRVFVRVNUX1FVRVVFLkVOQUJMRUQsXG4gICAgICBtYXhRdWV1ZVNpemUgPSBWSUVXUE9SVF9DT05TVEFOVFMuUkVRVUVTVF9RVUVVRS5NQVhfUVVFVUVfU0laRSxcbiAgICAgIGxvYWRPbkRyYWdFbmQgPSB0cnVlLCAvLyBEZWZhdWx0IHRvIHRydWUgYXMgc2FmZXR5IG1lYXN1cmVcbiAgICAgIGluaXRpYWxTY3JvbGxJbmRleCA9IDAsIC8vIFN0YXJ0IGZyb20gYmVnaW5uaW5nIGJ5IGRlZmF1bHRcbiAgICAgIHNlbGVjdElkLCAvLyBJRCBvZiBpdGVtIHRvIHNlbGVjdCBhZnRlciBpbml0aWFsIGxvYWRcbiAgICAgIGF1dG9Mb2FkID0gdHJ1ZSwgLy8gQXV0by1sb2FkIGluaXRpYWwgZGF0YSBieSBkZWZhdWx0XG4gICAgICBhdXRvU2VsZWN0Rmlyc3QgPSBmYWxzZSwgLy8gQXV0b21hdGljYWxseSBzZWxlY3QgZmlyc3QgaXRlbSBhZnRlciBpbml0aWFsIGxvYWRcbiAgICAgIG1heENhY2hlZEl0ZW1zID0gMTAwMCwgLy8gTWF4aW11bSBpdGVtcyB0byBrZWVwIGluIG1lbW9yeVxuICAgICAgZXZpY3Rpb25CdWZmZXIgPSAxNTAsIC8vIEV4dHJhIGl0ZW1zIHRvIGtlZXAgYXJvdW5kIHZpc2libGUgcmFuZ2VcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gVHJhY2sgaWYgd2UndmUgY29tcGxldGVkIHRoZSBpbml0aWFsIGxvYWQgZm9yIGluaXRpYWxTY3JvbGxJbmRleFxuICAgIC8vIFRoaXMgcHJldmVudHMgdGhlIHZpZXdwb3J0OnJhbmdlLWNoYW5nZWQgbGlzdGVuZXIgZnJvbSBsb2FkaW5nIHBhZ2UgMVxuICAgIGxldCBoYXNDb21wbGV0ZWRJbml0aWFsUG9zaXRpb25Mb2FkID0gZmFsc2U7XG4gICAgY29uc3QgaGFzSW5pdGlhbFNjcm9sbEluZGV4ID0gaW5pdGlhbFNjcm9sbEluZGV4ID4gMDtcblxuICAgIC8vIFRyYWNrIGlmIGRhdGEgaGFzIGJlZW4gbWFudWFsbHkgbG9hZGVkIChlLmcuLCB2aWEgcmVsb2FkQXQpXG4gICAgLy8gVGhpcyBlbmFibGVzIHN1YnNlcXVlbnQgbG9hZHMgZnJvbSB2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkIGV2ZW4gd2l0aCBhdXRvTG9hZDogZmFsc2VcbiAgICBsZXQgaGFzTWFudWFsbHlMb2FkZWQgPSBmYWxzZTtcblxuICAgIC8vIFRyYWNrIGlmIGEgcmVsb2FkIGlzIGluIHByb2dyZXNzIChyZWxvYWRBdCBzZXRzIHRoaXMgdG8gcHJldmVudCBzdGFsZSBwYWdlIDEgbG9hZHMpXG4gICAgLy8gVGhpcyBpcyBzZXQgYnkgcmVsb2FkQXQgQkVGT1JFIGl0IHN0YXJ0cyBsb2FkaW5nLCBhbmQgY2xlYXJlZCB3aGVuIGxvYWRpbmcgY29tcGxldGVzXG4gICAgbGV0IHJlbG9hZEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICBsZXQgcmVsb2FkVGFyZ2V0UmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gY29uc29sZS5sb2coXCJbVmlld3BvcnQgQ29sbGVjdGlvbl0gSW5pdGlhbGl6ZWQgd2l0aCBjb25maWc6XCIsIHtcbiAgICAvLyAgIHN0cmF0ZWd5LFxuICAgIC8vICAgcmFuZ2VTaXplLFxuICAgIC8vICAgaW5pdGlhbFNjcm9sbEluZGV4LFxuICAgIC8vIH0pO1xuXG4gICAgLy8gTG9hZGluZyBtYW5hZ2VyIHN0YXRlXG4gICAgaW50ZXJmYWNlIFF1ZXVlZFJlcXVlc3Qge1xuICAgICAgcmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfTtcbiAgICAgIHByaW9yaXR5OiBcImhpZ2hcIiB8IFwibm9ybWFsXCIgfCBcImxvd1wiO1xuICAgICAgdGltZXN0YW1wOiBudW1iZXI7XG4gICAgICByZXNvbHZlOiAoKSA9PiB2b2lkO1xuICAgICAgcmVqZWN0OiAoZXJyb3I6IGFueSkgPT4gdm9pZDtcbiAgICAgIGNhbGxlcj86IHN0cmluZztcbiAgICB9XG5cbiAgICAvLyBTdGF0ZSB0cmFja2luZ1xuICAgIGxldCBjdXJyZW50VmVsb2NpdHkgPSAwO1xuICAgIGxldCBhY3RpdmVMb2FkQ291bnQgPSAwO1xuICAgIGxldCBjb21wbGV0ZWRMb2FkcyA9IDA7XG4gICAgbGV0IGZhaWxlZExvYWRzID0gMDtcbiAgICBsZXQgY2FuY2VsbGVkTG9hZHMgPSAwO1xuICAgIGxldCBpc0RyYWdnaW5nID0gZmFsc2U7IC8vIFRyYWNrIGRyYWcgc3RhdGVcblxuICAgIC8vIENhY2hlIGV2aWN0aW9uIGNvbmZpZ3VyYXRpb24gKGZyb20gY29uZmlnKVxuICAgIGNvbnN0IE1BWF9DQUNIRURfSVRFTVMgPSBtYXhDYWNoZWRJdGVtcztcbiAgICBjb25zdCBFVklDVElPTl9CVUZGRVIgPSBldmljdGlvbkJ1ZmZlcjtcblxuICAgIC8vIFRyYWNrIGFjdHVhbCBpdGVtIGNvdW50IGVmZmljaWVudGx5IChhdm9pZCBPKG4pIHNwYXJzZSBhcnJheSBpdGVyYXRpb24pXG4gICAgbGV0IGNhY2hlZEl0ZW1Db3VudCA9IDA7XG5cbiAgICAvLyBNZW1vcnkgZGlhZ25vc3RpY3NcbiAgICBjb25zdCBsb2dNZW1vcnlTdGF0cyA9IChjYWxsZXI6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgbG9hZGVkUmFuZ2VDb3VudCA9IGxvYWRlZFJhbmdlcy5zaXplO1xuICAgICAgY29uc3QgcGVuZGluZ1JhbmdlQ291bnQgPSBwZW5kaW5nUmFuZ2VzLnNpemU7XG4gICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXJDb3VudCA9IGFib3J0Q29udHJvbGxlcnMuc2l6ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRXZpY3QgaXRlbXMgZmFyIGZyb20gdGhlIGN1cnJlbnQgdmlzaWJsZSByYW5nZSB0byBwcmV2ZW50IG1lbW9yeSBibG9hdFxuICAgICAqIEtlZXBzIGl0ZW1zIHdpdGhpbiBFVklDVElPTl9CVUZGRVIgb2YgdGhlIHZpc2libGUgcmFuZ2VcbiAgICAgKlxuICAgICAqIFBFUkZPUk1BTkNFOiBVc2VzIGxvYWRlZFJhbmdlcyB0byBpdGVyYXRlIG9ubHkgbG9hZGVkIGRhdGEsIG5vdCB0aGUgZW50aXJlXG4gICAgICogc3BhcnNlIGFycmF5LiBUaGlzIGlzIGNyaXRpY2FsIGZvciBsYXJnZSBsaXN0cyAoMU0rIGl0ZW1zKSB3aGVyZSB0aGVcbiAgICAgKiBpdGVtcyBhcnJheSBpcyBzcGFyc2UgYW5kIGl0ZXJhdGluZyBpdGVtcy5sZW5ndGggd291bGQgYmUgTyhuKS5cbiAgICAgKi9cbiAgICBjb25zdCBldmljdERpc3RhbnRJdGVtcyA9ICh2aXNpYmxlU3RhcnQ6IG51bWJlciwgdmlzaWJsZUVuZDogbnVtYmVyKSA9PiB7XG4gICAgICAvLyBPbmx5IGV2aWN0IGlmIHdlIGhhdmUgbW9yZSB0aGFuIE1BWF9DQUNIRURfSVRFTVNcbiAgICAgIC8vIFVzZSBjYWNoZWQgY291bnQgaW5zdGVhZCBvZiBPKG4pIGl0ZW1zLmZpbHRlcihCb29sZWFuKS5sZW5ndGhcbiAgICAgIGlmIChjYWNoZWRJdGVtQ291bnQgPD0gTUFYX0NBQ0hFRF9JVEVNUykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtlZXBTdGFydCA9IE1hdGgubWF4KDAsIHZpc2libGVTdGFydCAtIEVWSUNUSU9OX0JVRkZFUik7XG4gICAgICBjb25zdCBrZWVwRW5kID0gdmlzaWJsZUVuZCArIEVWSUNUSU9OX0JVRkZFUjtcblxuICAgICAgLy8gQ2FsY3VsYXRlIHdoaWNoIHJhbmdlcyB0byBrZWVwIGJhc2VkIG9uIHZpc2libGUgYXJlYVxuICAgICAgY29uc3Qga2VlcFJhbmdlU3RhcnQgPSBNYXRoLmZsb29yKGtlZXBTdGFydCAvIHJhbmdlU2l6ZSk7XG4gICAgICBjb25zdCBrZWVwUmFuZ2VFbmQgPSBNYXRoLmZsb29yKGtlZXBFbmQgLyByYW5nZVNpemUpO1xuXG4gICAgICBsZXQgZXZpY3RlZENvdW50ID0gMDtcbiAgICAgIGNvbnN0IHJhbmdlc1RvUmVtb3ZlID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgICAgIC8vIEl0ZXJhdGUgb25seSBvdmVyIGxvYWRlZCByYW5nZXMsIG5vdCB0aGUgZW50aXJlIHNwYXJzZSBhcnJheVxuICAgICAgLy8gVGhpcyBpcyBPKGxvYWRlZCByYW5nZXMpIGluc3RlYWQgb2YgTyh0b3RhbCBpdGVtcylcbiAgICAgIGxvYWRlZFJhbmdlcy5mb3JFYWNoKChyYW5nZUlkKSA9PiB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgcmFuZ2UgaXMgb3V0c2lkZSB0aGUga2VlcCB6b25lXG4gICAgICAgIGlmIChyYW5nZUlkIDwga2VlcFJhbmdlU3RhcnQgfHwgcmFuZ2VJZCA+IGtlZXBSYW5nZUVuZCkge1xuICAgICAgICAgIHJhbmdlc1RvUmVtb3ZlLmFkZChyYW5nZUlkKTtcblxuICAgICAgICAgIC8vIEV2aWN0IGl0ZW1zIGluIHRoaXMgcmFuZ2VcbiAgICAgICAgICBjb25zdCByYW5nZVN0YXJ0ID0gcmFuZ2VJZCAqIHJhbmdlU2l6ZTtcbiAgICAgICAgICBjb25zdCByYW5nZUVuZCA9IHJhbmdlU3RhcnQgKyByYW5nZVNpemU7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IHJhbmdlU3RhcnQ7IGkgPCByYW5nZUVuZDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaXRlbXNbaV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBkZWxldGUgaXRlbXNbaV07XG4gICAgICAgICAgICAgIGV2aWN0ZWRDb3VudCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFJlbW92ZSBhbGwgcmFuZ2VzIHRoYXQgaGFkIGl0ZW1zIGV2aWN0ZWRcbiAgICAgIC8vIFRoaXMgaXMgY3JpdGljYWw6IGV2ZW4gaWYgb25seSBwYXJ0IG9mIGEgcmFuZ2Ugd2FzIGV2aWN0ZWQsXG4gICAgICAvLyB3ZSBtdXN0IHJlbW92ZSBpdCBmcm9tIGxvYWRlZFJhbmdlcyBzbyBpdCBnZXRzIHJlbG9hZGVkXG4gICAgICAvLyBBbHNvIHJlbW92ZSBmcm9tIHBlbmRpbmdSYW5nZXMgLSBpZiBhIHNsb3cgcmVxdWVzdCBjb21wbGV0ZXMgZm9yIGFuIGV2aWN0ZWQgcmFuZ2UsXG4gICAgICAvLyB3ZSBkb24ndCB3YW50IGl0IHRvIGJsb2NrIGZ1dHVyZSBsb2FkcyB3aGVuIHVzZXIgc2Nyb2xscyBiYWNrXG4gICAgICByYW5nZXNUb1JlbW92ZS5mb3JFYWNoKChyYW5nZUlkKSA9PiB7XG4gICAgICAgIGxvYWRlZFJhbmdlcy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgIHBlbmRpbmdSYW5nZXMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICAvLyBDbGVhbiB1cCBhY3RpdmUgcmVxdWVzdHMgdHJhY2tpbmdcbiAgICAgICAgYWN0aXZlUmVxdWVzdHMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICAvLyBBbHNvIGFib3J0IGFueSBpbi1mbGlnaHQgcmVxdWVzdCBmb3IgdGhpcyByYW5nZSB0byBmcmVlIHVwIG5ldHdvcmsgcmVzb3VyY2VzXG4gICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBhYm9ydENvbnRyb2xsZXJzLmdldChyYW5nZUlkKTtcbiAgICAgICAgaWYgKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgYWJvcnRDb250cm9sbGVycy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZXZpY3RlZENvdW50ID4gMCkge1xuICAgICAgICAvLyBVcGRhdGUgY2FjaGVkIGl0ZW0gY291bnRcbiAgICAgICAgY2FjaGVkSXRlbUNvdW50IC09IGV2aWN0ZWRDb3VudDtcblxuICAgICAgICAvLyBFbWl0IGV2ZW50IGZvciByZW5kZXJpbmcgdG8gYWxzbyBjbGVhbiB1cFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY29sbGVjdGlvbjppdGVtcy1ldmljdGVkXCIsIHtcbiAgICAgICAgICBrZWVwU3RhcnQsXG4gICAgICAgICAga2VlcEVuZCxcbiAgICAgICAgICBldmljdGVkQ291bnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBhY3RpdmVMb2FkUmFuZ2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgbGV0IGxvYWRSZXF1ZXN0UXVldWU6IFF1ZXVlZFJlcXVlc3RbXSA9IFtdO1xuXG4gICAgLy8gQWJvcnRDb250cm9sbGVyIG1hcCBmb3IgY2FuY2VsbGluZyBpbi1mbGlnaHQgcmVxdWVzdHNcbiAgICBjb25zdCBhYm9ydENvbnRyb2xsZXJzID0gbmV3IE1hcDxudW1iZXIsIEFib3J0Q29udHJvbGxlcj4oKTtcblxuICAgIC8vIFN0YXRlXG4gICAgbGV0IGl0ZW1zOiBhbnlbXSA9IFtdO1xuICAgIGxldCB0b3RhbEl0ZW1zID0gMDtcbiAgICBsZXQgbG9hZGVkUmFuZ2VzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgbGV0IHBlbmRpbmdSYW5nZXMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICBsZXQgZmFpbGVkUmFuZ2VzID0gbmV3IE1hcDxcbiAgICAgIG51bWJlcixcbiAgICAgIHtcbiAgICAgICAgYXR0ZW1wdHM6IG51bWJlcjtcbiAgICAgICAgbGFzdEVycm9yOiBFcnJvcjtcbiAgICAgICAgdGltZXN0YW1wOiBudW1iZXI7XG4gICAgICB9XG4gICAgPigpO1xuICAgIGxldCBhY3RpdmVSZXF1ZXN0cyA9IG5ldyBNYXA8bnVtYmVyLCBQcm9taXNlPGFueVtdPj4oKTtcblxuICAgIC8vIEN1cnNvciBwYWdpbmF0aW9uIHN0YXRlXG4gICAgbGV0IGN1cnJlbnRDdXJzb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjdXJzb3JNYXAgPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpOyAvLyBNYXAgcGFnZSBudW1iZXIgdG8gY3Vyc29yXG4gICAgbGV0IHBhZ2VUb09mZnNldE1hcCA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7IC8vIE1hcCBwYWdlIHRvIGFjdHVhbCBvZmZzZXRcbiAgICBsZXQgaGlnaGVzdExvYWRlZFBhZ2UgPSAwO1xuICAgIGxldCBkaXNjb3ZlcmVkVG90YWw6IG51bWJlciB8IG51bGwgPSBudWxsOyAvLyBUcmFjayBkaXNjb3ZlcmVkIHRvdGFsIGZyb20gQVBJXG4gICAgbGV0IGhhc1JlYWNoZWRFbmQgPSBmYWxzZTsgLy8gVHJhY2sgaWYgd2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIGRhdGFcblxuICAgIC8vIFNoYXJlIGl0ZW1zIGFycmF5IHdpdGggY29tcG9uZW50XG4gICAgY29tcG9uZW50Lml0ZW1zID0gaXRlbXM7XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSB1bmlxdWUgSUQgZm9yIGEgcmFuZ2UgYmFzZWQgb24gb2Zmc2V0IGFuZCB0aGUgYmFzZSByYW5nZSBzaXplXG4gICAgICovXG4gICAgY29uc3QgZ2V0UmFuZ2VJZCA9IChvZmZzZXQ6IG51bWJlciwgbGltaXQ6IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgICAvLyBBbHdheXMgdXNlIHRoZSBiYXNlIHJhbmdlU2l6ZSBmb3IgY29uc2lzdGVudCBJRHNcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBtZXJnZWQgcmFuZ2VzIGNhbiBiZSB0cmFja2VkIHByb3Blcmx5XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihvZmZzZXQgLyByYW5nZVNpemUpO1xuICAgIH07XG5cbiAgICAvLyBMb2FkaW5nIG1hbmFnZXIgaGVscGVyc1xuICAgIGNvbnN0IGdldFJhbmdlS2V5ID0gKHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pOiBzdHJpbmcgPT4ge1xuICAgICAgcmV0dXJuIGAke3JhbmdlLnN0YXJ0fS0ke3JhbmdlLmVuZH1gO1xuICAgIH07XG5cbiAgICBjb25zdCBjYW5Mb2FkID0gKCk6IGJvb2xlYW4gPT4ge1xuICAgICAgcmV0dXJuIGN1cnJlbnRWZWxvY2l0eSA8PSBjYW5jZWxMb2FkVGhyZXNob2xkO1xuICAgIH07XG5cbiAgICBjb25zdCBwcm9jZXNzUXVldWUgPSAoKSA9PiB7XG4gICAgICBpZiAoIWVuYWJsZVJlcXVlc3RRdWV1ZSB8fCBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAvLyBTb3J0IHF1ZXVlIGJ5IHByaW9yaXR5IGFuZCB0aW1lc3RhbXBcbiAgICAgIGxvYWRSZXF1ZXN0UXVldWUuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBwcmlvcml0eU9yZGVyID0geyBoaWdoOiAwLCBub3JtYWw6IDEsIGxvdzogMiB9O1xuICAgICAgICBjb25zdCBwcmlvcml0eURpZmYgPVxuICAgICAgICAgIHByaW9yaXR5T3JkZXJbYS5wcmlvcml0eV0gLSBwcmlvcml0eU9yZGVyW2IucHJpb3JpdHldO1xuICAgICAgICByZXR1cm4gcHJpb3JpdHlEaWZmICE9PSAwID8gcHJpb3JpdHlEaWZmIDogYS50aW1lc3RhbXAgLSBiLnRpbWVzdGFtcDtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBQcm9jZXNzIHJlcXVlc3RzIHVwIHRvIGNhcGFjaXR5XG4gICAgICB3aGlsZSAoXG4gICAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoID4gMCAmJlxuICAgICAgICBhY3RpdmVMb2FkQ291bnQgPCBtYXhDb25jdXJyZW50UmVxdWVzdHNcbiAgICAgICkge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gbG9hZFJlcXVlc3RRdWV1ZS5zaGlmdCgpO1xuICAgICAgICBpZiAocmVxdWVzdCkge1xuICAgICAgICAgIGV4ZWN1dGVRdWV1ZWRMb2FkKHJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGV4ZWN1dGVRdWV1ZWRMb2FkID0gKHJlcXVlc3Q6IFF1ZXVlZFJlcXVlc3QpID0+IHtcbiAgICAgIGFjdGl2ZUxvYWRDb3VudCsrO1xuICAgICAgYWN0aXZlTG9hZFJhbmdlcy5hZGQoZ2V0UmFuZ2VLZXkocmVxdWVzdC5yYW5nZSkpO1xuXG4gICAgICAvLyBDYWxsIHRoZSBhY3R1YWwgbG9hZE1pc3NpbmdSYW5nZXMgZnVuY3Rpb25cbiAgICAgIGxvYWRNaXNzaW5nUmFuZ2VzSW50ZXJuYWwocmVxdWVzdC5yYW5nZSwgcmVxdWVzdC5jYWxsZXIpXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXF1ZXN0LnJlc29sdmUoKTtcbiAgICAgICAgICBjb21wbGV0ZWRMb2FkcysrO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgIHJlcXVlc3QucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICBmYWlsZWRMb2FkcysrO1xuICAgICAgICB9KVxuICAgICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgYWN0aXZlTG9hZENvdW50LS07XG4gICAgICAgICAgYWN0aXZlTG9hZFJhbmdlcy5kZWxldGUoZ2V0UmFuZ2VLZXkocmVxdWVzdC5yYW5nZSkpO1xuICAgICAgICAgIHByb2Nlc3NRdWV1ZSgpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtIGl0ZW1zIGlmIHRyYW5zZm9ybSBmdW5jdGlvbiBwcm92aWRlZFxuICAgICAqL1xuICAgIGNvbnN0IHRyYW5zZm9ybUl0ZW1zID0gKHJhd0l0ZW1zOiBhbnlbXSk6IGFueVtdID0+IHtcbiAgICAgIGlmICghdHJhbnNmb3JtKSByZXR1cm4gcmF3SXRlbXM7XG4gICAgICByZXR1cm4gcmF3SXRlbXMubWFwKHRyYW5zZm9ybSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIExvYWQgYSByYW5nZSBvZiBkYXRhXG4gICAgICovXG4gICAgY29uc3QgbG9hZFJhbmdlID0gYXN5bmMgKFxuICAgICAgb2Zmc2V0OiBudW1iZXIsXG4gICAgICBsaW1pdDogbnVtYmVyLFxuICAgICAgY2FsbGVyPzogc3RyaW5nLFxuICAgICk6IFByb21pc2U8YW55W10+ID0+IHtcbiAgICAgIGlmICghY29sbGVjdGlvbikge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbQ29sbGVjdGlvbl0gTm8gY29sbGVjdGlvbiBhZGFwdGVyIGNvbmZpZ3VyZWRcIik7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmFuZ2VJZCA9IGdldFJhbmdlSWQob2Zmc2V0LCBsaW1pdCk7XG4gICAgICAvLyBjb25zb2xlLmxvZyhgW0NvbGxlY3Rpb25dIFJhbmdlIElEOiAke3JhbmdlSWR9YCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIGFscmVhZHkgbG9hZGVkXG4gICAgICBpZiAobG9hZGVkUmFuZ2VzLmhhcyhyYW5nZUlkKSkge1xuICAgICAgICByZXR1cm4gaXRlbXMuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBsaW1pdCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGFscmVhZHkgcGVuZGluZ1xuICAgICAgaWYgKHBlbmRpbmdSYW5nZXMuaGFzKHJhbmdlSWQpKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nUmVxdWVzdCA9IGFjdGl2ZVJlcXVlc3RzLmdldChyYW5nZUlkKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nUmVxdWVzdCkge1xuICAgICAgICAgIHJldHVybiBleGlzdGluZ1JlcXVlc3Q7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTWFyayBhcyBwZW5kaW5nXG4gICAgICBwZW5kaW5nUmFuZ2VzLmFkZChyYW5nZUlkKTtcblxuICAgICAgLy8gQ3JlYXRlIEFib3J0Q29udHJvbGxlciBmb3IgdGhpcyByZXF1ZXN0XG4gICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICBhYm9ydENvbnRyb2xsZXJzLnNldChyYW5nZUlkLCBhYm9ydENvbnRyb2xsZXIpO1xuXG4gICAgICAvLyBDcmVhdGUgcmVxdWVzdCBwcm9taXNlXG4gICAgICBjb25zdCByZXF1ZXN0UHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gQ2FsbCBjb2xsZWN0aW9uIGFkYXB0ZXIgd2l0aCBhcHByb3ByaWF0ZSBwYXJhbWV0ZXJzXG4gICAgICAgICAgY29uc3QgcGFnZSA9IE1hdGguZmxvb3Iob2Zmc2V0IC8gbGltaXQpICsgMTtcbiAgICAgICAgICBsZXQgcGFyYW1zOiBhbnk7XG5cbiAgICAgICAgICBpZiAoc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIpIHtcbiAgICAgICAgICAgIC8vIEZvciBjdXJzb3IgcGFnaW5hdGlvblxuICAgICAgICAgICAgaWYgKHBhZ2UgPT09IDEpIHtcbiAgICAgICAgICAgICAgLy8gRmlyc3QgcGFnZSAtIG5vIGN1cnNvclxuICAgICAgICAgICAgICBwYXJhbXMgPSB7IGxpbWl0IH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGN1cnNvciBmb3IgcHJldmlvdXMgcGFnZVxuICAgICAgICAgICAgICBjb25zdCBwcmV2UGFnZUN1cnNvciA9IGN1cnNvck1hcC5nZXQocGFnZSAtIDEpO1xuICAgICAgICAgICAgICBpZiAoIXByZXZQYWdlQ3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2FuJ3QgbG9hZCB0aGlzIHBhZ2Ugd2l0aG91dCBwcmV2aW91cyBjdXJzb3JcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICBgW0NvbGxlY3Rpb25dIENhbm5vdCBsb2FkIHBhZ2UgJHtwYWdlfSB3aXRob3V0IGN1cnNvciBmb3IgcGFnZSAke1xuICAgICAgICAgICAgICAgICAgICBwYWdlIC0gMVxuICAgICAgICAgICAgICAgICAgfWAsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgU2VxdWVudGlhbCBsb2FkaW5nIHJlcXVpcmVkIC0gbWlzc2luZyBjdXJzb3IgZm9yIHBhZ2UgJHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZSAtIDFcbiAgICAgICAgICAgICAgICAgIH1gLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcGFyYW1zID0geyBjdXJzb3I6IHByZXZQYWdlQ3Vyc29yLCBsaW1pdCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RyYXRlZ3kgPT09IFwicGFnZVwiKSB7XG4gICAgICAgICAgICBwYXJhbXMgPSB7IHBhZ2UsIGxpbWl0IH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG9mZnNldCBzdHJhdGVneVxuICAgICAgICAgICAgcGFyYW1zID0geyBvZmZzZXQsIGxpbWl0IH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSW5qZWN0IHNlYXJjaCBxdWVyeSBpZiBjb21wb25lbnQgaGFzIHdpdGhTZWFyY2ggZmVhdHVyZVxuICAgICAgICAgIC8vIFVzZSBfc2VsZlJlZi5jdXJyZW50IGZvciBsYXRlIGJpbmRpbmcgKHNlYXJjaC9maWx0ZXIgZmVhdHVyZXMgYXJlIGFkZGVkIGFmdGVyIHZpZXdwb3J0KVxuICAgICAgICAgIGNvbnN0IHNlbGZSZWYgPSAoXG4gICAgICAgICAgICBjb21wb25lbnQgYXMgdW5rbm93biBhcyB7IF9zZWxmUmVmPzogU2VsZlJlZjxTZWFyY2hGaWx0ZXJDYXBhYmxlPiB9XG4gICAgICAgICAgKS5fc2VsZlJlZjtcbiAgICAgICAgICBjb25zdCBzZWxmOiBQYXJ0aWFsPFNlYXJjaEZpbHRlckNhcGFibGU+ID0gc2VsZlJlZj8uY3VycmVudCA/PyB7fTtcbiAgICAgICAgICBpZiAodHlwZW9mIHNlbGYuX3NlYXJjaFF1ZXJ5ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlYXJjaFF1ZXJ5ID0gc2VsZi5fc2VhcmNoUXVlcnkoKTtcbiAgICAgICAgICAgIGlmIChzZWFyY2hRdWVyeSkge1xuICAgICAgICAgICAgICBwYXJhbXMuc2VhcmNoID0gc2VhcmNoUXVlcnk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSW5qZWN0IGZpbHRlcnMgaWYgY29tcG9uZW50IGhhcyB3aXRoRmlsdGVyIGZlYXR1cmVcbiAgICAgICAgICBpZiAodHlwZW9mIHNlbGYuX2ZpbHRlcnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVycyA9IHNlbGYuX2ZpbHRlcnMoKTtcbiAgICAgICAgICAgIGlmIChmaWx0ZXJzICYmIE9iamVjdC5rZXlzKGZpbHRlcnMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgcGFyYW1zLmZpbHRlcnMgPSBmaWx0ZXJzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtWaWV3cG9ydCBDb2xsZWN0aW9uXSBMb2FkaW5nIHJhbmdlIG9mZnNldD0ke29mZnNldH0sIGxpbWl0PSR7bGltaXR9LCBzdHJhdGVneT0ke3N0cmF0ZWd5fSwgY2FsY3VsYXRlZCBwYWdlPSR7cGFnZX0sIHBhcmFtczpgLFxuICAgICAgICAgIC8vICAgSlNPTi5zdHJpbmdpZnkocGFyYW1zKVxuICAgICAgICAgIC8vICk7XG5cbiAgICAgICAgICAvLyBQYXNzIGFib3J0IHNpZ25hbCB0byB0aGUgYWRhcHRlciBpZiBpdCBzdXBwb3J0cyBpdFxuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY29sbGVjdGlvbi5yZWFkKHtcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEV4dHJhY3QgaXRlbXMgYW5kIHRvdGFsXG4gICAgICAgICAgY29uc3QgcmF3SXRlbXMgPSByZXNwb25zZS5kYXRhIHx8IHJlc3BvbnNlLml0ZW1zIHx8IHJlc3BvbnNlO1xuICAgICAgICAgIGNvbnN0IG1ldGEgPSByZXNwb25zZS5tZXRhIHx8IHt9O1xuXG4gICAgICAgICAgLy8gRm9yIGN1cnNvciBwYWdpbmF0aW9uLCB0cmFjayB0aGUgY3Vyc29yIChjaGVjayBib3RoIGN1cnNvciBhbmQgbmV4dEN1cnNvcilcbiAgICAgICAgICBjb25zdCByZXNwb25zZUN1cnNvciA9IG1ldGEuY3Vyc29yIHx8IG1ldGEubmV4dEN1cnNvcjtcbiAgICAgICAgICBpZiAoc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIgJiYgcmVzcG9uc2VDdXJzb3IpIHtcbiAgICAgICAgICAgIGN1cnJlbnRDdXJzb3IgPSByZXNwb25zZUN1cnNvcjtcbiAgICAgICAgICAgIGN1cnNvck1hcC5zZXQocGFnZSwgcmVzcG9uc2VDdXJzb3IpO1xuICAgICAgICAgICAgcGFnZVRvT2Zmc2V0TWFwLnNldChwYWdlLCBvZmZzZXQpO1xuICAgICAgICAgICAgaGlnaGVzdExvYWRlZFBhZ2UgPSBNYXRoLm1heChoaWdoZXN0TG9hZGVkUGFnZSwgcGFnZSk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBTdG9yZWQgY3Vyc29yIGZvciBwYWdlICR7cGFnZX06ICR7cmVzcG9uc2VDdXJzb3J9YCxcbiAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgd2UndmUgcmVhY2hlZCB0aGUgZW5kXG4gICAgICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImN1cnNvclwiICYmIG1ldGEuaGFzTmV4dCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGhhc1JlYWNoZWRFbmQgPSB0cnVlO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gUmVhY2hlZCBlbmQgb2YgY3Vyc29yIHBhZ2luYXRpb24gYXQgcGFnZSAke3BhZ2V9YCxcbiAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVXBkYXRlIGRpc2NvdmVyZWQgdG90YWwgaWYgcHJvdmlkZWRcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gbWV0YS50b3RhbDogJHttZXRhLnRvdGFsfSwgZGlzY292ZXJlZFRvdGFsIGJlZm9yZTogJHtkaXNjb3ZlcmVkVG90YWx9YCxcbiAgICAgICAgICAvLyApO1xuICAgICAgICAgIGlmIChtZXRhLnRvdGFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRpc2NvdmVyZWRUb3RhbCA9IG1ldGEudG90YWw7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGBbQ29sbGVjdGlvbl0gZGlzY292ZXJlZFRvdGFsIGFmdGVyOiAke2Rpc2NvdmVyZWRUb3RhbH1gKTtcblxuICAgICAgICAgIC8vIFRyYW5zZm9ybSBpdGVtc1xuICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkSXRlbXMgPSB0cmFuc2Zvcm1JdGVtcyhyYXdJdGVtcyk7XG5cbiAgICAgICAgICAvLyBBZGQgaXRlbXMgdG8gYXJyYXkgYW5kIHRyYWNrIGNvdW50IGVmZmljaWVudGx5XG4gICAgICAgICAgbGV0IG5ld0l0ZW1zQWRkZWQgPSAwO1xuICAgICAgICAgIHRyYW5zZm9ybWVkSXRlbXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIC8vIE9ubHkgY291bnQgYXMgbmV3IGlmIHNsb3Qgd2FzIGVtcHR5XG4gICAgICAgICAgICBpZiAoaXRlbXNbb2Zmc2V0ICsgaW5kZXhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgbmV3SXRlbXNBZGRlZCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbXNbb2Zmc2V0ICsgaW5kZXhdID0gaXRlbTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjYWNoZWRJdGVtQ291bnQgKz0gbmV3SXRlbXNBZGRlZDtcblxuICAgICAgICAgIC8vIEZvciBjdXJzb3Igc3RyYXRlZ3ksIGNhbGN1bGF0ZSBkeW5hbWljIHRvdGFsIGJhc2VkIG9uIGxvYWRlZCBkYXRhXG4gICAgICAgICAgLy8gVXNlIG51bGxpc2ggY29hbGVzY2luZyAoPz8pIGluc3RlYWQgb2YgfHwgdG8gaGFuZGxlIGRpc2NvdmVyZWRUb3RhbCA9IDAgY29ycmVjdGx5XG4gICAgICAgICAgbGV0IG5ld1RvdGFsID0gZGlzY292ZXJlZFRvdGFsID8/IHRvdGFsSXRlbXM7XG5cbiAgICAgICAgICAvLyBDUklUSUNBTCBGSVg6IFdoZW4gQVBJIHJldHVybnMgMCBpdGVtcyBvbiBwYWdlIDEgKG9mZnNldCAwKSwgdGhlIGxpc3QgaXMgZW1wdHkuXG4gICAgICAgICAgLy8gV2UgbXVzdCBzZXQgdG90YWxJdGVtcyB0byAwIHJlZ2FyZGxlc3Mgb2YgbWV0YS50b3RhbCBiZWluZyB1bmRlZmluZWQuXG4gICAgICAgICAgLy8gVGhpcyBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIGNvdW50PWZhbHNlIGlzIHNlbnQgYnV0IHRoZSBsaXN0IGlzIGFjdHVhbGx5IGVtcHR5LlxuICAgICAgICAgIGlmIChvZmZzZXQgPT09IDAgJiYgdHJhbnNmb3JtZWRJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIEVtcHR5IHJlc3VsdCBvbiBwYWdlIDEgLSBmb3JjaW5nIHRvdGFsSXRlbXMgdG8gMGAsXG4gICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgbmV3VG90YWwgPSAwO1xuICAgICAgICAgICAgZGlzY292ZXJlZFRvdGFsID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIG5ld1RvdGFsIGluaXRpYWw6ICR7bmV3VG90YWx9LCB0b3RhbEl0ZW1zOiAke3RvdGFsSXRlbXN9LCBzdHJhdGVneTogJHtzdHJhdGVneX1gLFxuICAgICAgICAgIC8vICk7XG5cbiAgICAgICAgICBpZiAoc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIpIHtcbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0b3RhbCBiYXNlZCBvbiBsb2FkZWQgaXRlbXMgKyBtYXJnaW5cbiAgICAgICAgICAgIC8vIFVzZSBjYWNoZWRJdGVtQ291bnQgaW5zdGVhZCBvZiBPKG4pIGZpbHRlciBvcGVyYXRpb25cbiAgICAgICAgICAgIGNvbnN0IGxvYWRlZEl0ZW1zQ291bnQgPSBjYWNoZWRJdGVtQ291bnQ7XG4gICAgICAgICAgICBjb25zdCBtYXJnaW5JdGVtcyA9IGhhc1JlYWNoZWRFbmRcbiAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgIDogcmFuZ2VTaXplICpcbiAgICAgICAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUEFHSU5BVElPTi5DVVJTT1JfU0NST0xMX01BUkdJTl9NVUxUSVBMSUVSO1xuICAgICAgICAgICAgY29uc3QgbWluVmlydHVhbEl0ZW1zID1cbiAgICAgICAgICAgICAgcmFuZ2VTaXplICpcbiAgICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlBBR0lOQVRJT04uQ1VSU09SX01JTl9WSVJUVUFMX1NJWkVfTVVMVElQTElFUjtcblxuICAgICAgICAgICAgLy8gRHluYW1pYyB0b3RhbDogbG9hZGVkIGl0ZW1zICsgbWFyZ2luICh1bmxlc3Mgd2UndmUgcmVhY2hlZCB0aGUgZW5kKVxuICAgICAgICAgICAgbmV3VG90YWwgPSBNYXRoLm1heChcbiAgICAgICAgICAgICAgbG9hZGVkSXRlbXNDb3VudCArIG1hcmdpbkl0ZW1zLFxuICAgICAgICAgICAgICBtaW5WaXJ0dWFsSXRlbXMsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBDdXJzb3IgbW9kZSB2aXJ0dWFsIHNpemU6IGxvYWRlZD0ke2xvYWRlZEl0ZW1zQ291bnR9LCBtYXJnaW49JHttYXJnaW5JdGVtc30sIHRvdGFsPSR7bmV3VG90YWx9LCBoYXNSZWFjaGVkRW5kPSR7aGFzUmVhY2hlZEVuZH1gLFxuICAgICAgICAgICAgLy8gKTtcblxuICAgICAgICAgICAgLy8gVXBkYXRlIHRvdGFsIGlmIGl0IGhhcyBncm93blxuICAgICAgICAgICAgaWYgKG5ld1RvdGFsID4gdG90YWxJdGVtcykge1xuICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFVwZGF0aW5nIGN1cnNvciB2aXJ0dWFsIHNpemUgZnJvbSAke3RvdGFsSXRlbXN9IHRvICR7bmV3VG90YWx9YCxcbiAgICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgICAgdG90YWxJdGVtcyA9IG5ld1RvdGFsO1xuICAgICAgICAgICAgICBzZXRUb3RhbEl0ZW1zKG5ld1RvdGFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRm9yIG90aGVyIHN0cmF0ZWdpZXMsIHVzZSBkaXNjb3ZlcmVkIHRvdGFsIG9yIGN1cnJlbnQgdG90YWxcbiAgICAgICAgICAgIC8vIFVzZSBudWxsaXNoIGNvYWxlc2NpbmcgKD8/KSBpbnN0ZWFkIG9mIHx8IHRvIGhhbmRsZSBkaXNjb3ZlcmVkVG90YWwgPSAwIGNvcnJlY3RseVxuICAgICAgICAgICAgbmV3VG90YWwgPSBkaXNjb3ZlcmVkVG90YWwgPz8gdG90YWxJdGVtcztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBVcGRhdGUgc3RhdGVcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gQmVmb3JlIHN0YXRlIHVwZGF0ZTogbmV3VG90YWw9JHtuZXdUb3RhbH0sIHRvdGFsSXRlbXM9JHt0b3RhbEl0ZW1zfSwgd2lsbCB1cGRhdGU6ICR7bmV3VG90YWwgIT09IHRvdGFsSXRlbXN9YCxcbiAgICAgICAgICAvLyApO1xuICAgICAgICAgIGlmIChuZXdUb3RhbCAhPT0gdG90YWxJdGVtcykge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coYFtDb2xsZWN0aW9uXSBDYWxsaW5nIHNldFRvdGFsSXRlbXMoJHtuZXdUb3RhbH0pYCk7XG4gICAgICAgICAgICB0b3RhbEl0ZW1zID0gbmV3VG90YWw7XG4gICAgICAgICAgICBzZXRUb3RhbEl0ZW1zKG5ld1RvdGFsKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBVcGRhdGUgY29tcG9uZW50IGl0ZW1zIHJlZmVyZW5jZVxuICAgICAgICAgIGNvbXBvbmVudC5pdGVtcyA9IGl0ZW1zO1xuXG4gICAgICAgICAgLy8gRW1pdCBpdGVtcyBjaGFuZ2VkIGV2ZW50XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0Oml0ZW1zLWNoYW5nZWRcIiwge1xuICAgICAgICAgICAgdG90YWxJdGVtczogbmV3VG90YWwsXG4gICAgICAgICAgICBsb2FkZWRDb3VudDogY2FjaGVkSXRlbUNvdW50LFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gVXBkYXRlIHZpZXdwb3J0IHN0YXRlXG4gICAgICAgICAgY29uc3Qgdmlld3BvcnRTdGF0ZSA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zdGF0ZTtcbiAgICAgICAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgICAgICAgLy8gVXNlIG51bGxpc2ggY29hbGVzY2luZyAoPz8pIGluc3RlYWQgb2YgfHwgdG8gaGFuZGxlIG5ld1RvdGFsID0gMCBjb3JyZWN0bHlcbiAgICAgICAgICAgIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyA9IG5ld1RvdGFsID8/IGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBWZXJpZnkgaXRlbXMgYXJlIGFjdHVhbGx5IHN0aWxsIGluIHRoZSBhcnJheSBiZWZvcmUgbWFya2luZyBhcyBsb2FkZWRcbiAgICAgICAgICAvLyBUaGlzIHByZXZlbnRzIGEgcmFjZSBjb25kaXRpb24gd2hlcmUgZXZpY3Rpb24gaGFwcGVucyBkdXJpbmcgYXN5bmMgbG9hZDpcbiAgICAgICAgICAvLyAxLiBMb2FkIHN0YXJ0cyBmb3IgcmFuZ2UgQVxuICAgICAgICAgIC8vIDIuIFVzZXIgc2Nyb2xscyB0byByYW5nZSBCXG4gICAgICAgICAgLy8gMy4gRXZpY3Rpb24gcmVtb3ZlcyBpdGVtcyBmcm9tIHJhbmdlIEEgYW5kIHJlbW92ZXMgZnJvbSBsb2FkZWRSYW5nZXNcbiAgICAgICAgICAvLyA0LiBMb2FkIGZvciByYW5nZSBBIGNvbXBsZXRlcywgd291bGQgcmUtYWRkIHRvIGxvYWRlZFJhbmdlc1xuICAgICAgICAgIC8vIDUuIFVzZXIgc2Nyb2xscyBiYWNrIHRvIEEsIGxvYWRlZFJhbmdlcyBzYXlzIGxvYWRlZCBidXQgaXRlbXMgYXJlIGdvbmVcbiAgICAgICAgICBjb25zdCBpdGVtc0FjdHVhbGx5U3RvcmVkID1cbiAgICAgICAgICAgIHRyYW5zZm9ybWVkSXRlbXMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgdHJhbnNmb3JtZWRJdGVtcy5ldmVyeShcbiAgICAgICAgICAgICAgKF8sIGlkeCkgPT4gaXRlbXNbb2Zmc2V0ICsgaWR4XSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChpdGVtc0FjdHVhbGx5U3RvcmVkKSB7XG4gICAgICAgICAgICAvLyBNYXJrIGFzIGxvYWRlZCBvbmx5IGlmIGl0ZW1zIGFyZSBhY3R1YWxseSBwcmVzZW50XG4gICAgICAgICAgICBsb2FkZWRSYW5nZXMuYWRkKHJhbmdlSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBBbHdheXMgY2xlYW4gdXAgcGVuZGluZy9mYWlsZWQgc3RhdGVcbiAgICAgICAgICBwZW5kaW5nUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgICBmYWlsZWRSYW5nZXMuZGVsZXRlKHJhbmdlSWQpO1xuXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFJhbmdlICR7cmFuZ2VJZH0gbG9hZGVkIHN1Y2Nlc3NmdWxseSB3aXRoICR7dHJhbnNmb3JtZWRJdGVtcy5sZW5ndGh9IGl0ZW1zYFxuICAgICAgICAgIC8vICk7XG5cbiAgICAgICAgICAvLyBMb2cgbWVtb3J5IHN0YXRzIHBlcmlvZGljYWxseSAoZXZlcnkgNSBsb2FkcylcbiAgICAgICAgICBpZiAoY29tcGxldGVkTG9hZHMgJSA1ID09PSAwKSB7XG4gICAgICAgICAgICBsb2dNZW1vcnlTdGF0cyhgbG9hZDoke2NvbXBsZXRlZExvYWRzfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEVtaXQgZXZlbnRzXG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCB7XG4gICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICAgIGl0ZW1zOiB0cmFuc2Zvcm1lZEl0ZW1zLFxuICAgICAgICAgICAgdG90YWw6IG5ld1RvdGFsLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRW1pdCBjb2xsZWN0aW9uIGxvYWRlZCBldmVudCB3aXRoIG1vcmUgZGV0YWlsc1xuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJjb2xsZWN0aW9uOnJhbmdlLWxvYWRlZFwiLCB7XG4gICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICAgIGl0ZW1zOiB0cmFuc2Zvcm1lZEl0ZW1zLFxuICAgICAgICAgICAgdG90YWw6IG5ld1RvdGFsLFxuICAgICAgICAgICAgcmFuZ2VJZCxcbiAgICAgICAgICAgIGl0ZW1zSW5NZW1vcnk6IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbSAhPT0gdW5kZWZpbmVkKS5sZW5ndGgsXG4gICAgICAgICAgICBjdXJzb3I6IHN0cmF0ZWd5ID09PSBcImN1cnNvclwiID8gY3VycmVudEN1cnNvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIFRyaWdnZXIgdmlld3BvcnQgdXBkYXRlXG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0Py51cGRhdGVWaWV3cG9ydD8uKCk7XG5cbiAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWRJdGVtcztcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBIYW5kbGUgQWJvcnRFcnJvciBhbmQgXCJGYWlsZWQgdG8gZmV0Y2hcIiAod2hpY2ggY2FuIG9jY3VyIG9uIGFib3J0KSBncmFjZWZ1bGx5XG4gICAgICAgICAgY29uc3QgaXNBYm9ydEVycm9yID1cbiAgICAgICAgICAgIChlcnJvciBhcyBFcnJvcikubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIgfHxcbiAgICAgICAgICAgICgoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2UgPT09IFwiRmFpbGVkIHRvIGZldGNoXCIgJiZcbiAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKTtcblxuICAgICAgICAgIGlmIChpc0Fib3J0RXJyb3IpIHtcbiAgICAgICAgICAgIHBlbmRpbmdSYW5nZXMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICAgICAgY2FuY2VsbGVkTG9hZHMrKztcbiAgICAgICAgICAgIC8vIERvbid0IHRocm93LCBqdXN0IHJldHVybiBlbXB0eSBhcnJheVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEhhbmRsZSBvdGhlciBlcnJvcnNcbiAgICAgICAgICBwZW5kaW5nUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgICBmYWlsZWRMb2FkcysrO1xuXG4gICAgICAgICAgY29uc3QgYXR0ZW1wdHMgPSAoZmFpbGVkUmFuZ2VzLmdldChyYW5nZUlkKT8uYXR0ZW1wdHMgfHwgMCkgKyAxO1xuICAgICAgICAgIGZhaWxlZFJhbmdlcy5zZXQocmFuZ2VJZCwge1xuICAgICAgICAgICAgYXR0ZW1wdHMsXG4gICAgICAgICAgICBsYXN0RXJyb3I6IGVycm9yIGFzIEVycm9yLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRW1pdCBlcnJvciBldmVudFxuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpyYW5nZS1lcnJvclwiLCB7XG4gICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgYXR0ZW1wdHMsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBhY3RpdmVSZXF1ZXN0cy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgICAgYWJvcnRDb250cm9sbGVycy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG5cbiAgICAgIGFjdGl2ZVJlcXVlc3RzLnNldChyYW5nZUlkLCByZXF1ZXN0UHJvbWlzZSk7XG4gICAgICByZXR1cm4gcmVxdWVzdFByb21pc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIExvYWQgbWlzc2luZyByYW5nZXMgZnJvbSBjb2xsZWN0aW9uXG4gICAgICovXG4gICAgY29uc3QgbG9hZE1pc3NpbmdSYW5nZXNJbnRlcm5hbCA9IGFzeW5jIChcbiAgICAgIC8vIE5vdGU6IGNhbGxlciBpcyBhZGRlZCBieSBsb2FkTWlzc2luZ1JhbmdlcyB3cmFwcGVyXG4gICAgICByYW5nZToge1xuICAgICAgICBzdGFydDogbnVtYmVyO1xuICAgICAgICBlbmQ6IG51bWJlcjtcbiAgICAgIH0sXG4gICAgICBjYWxsZXI/OiBzdHJpbmcsXG4gICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBpZiAoIWNvbGxlY3Rpb24pIHJldHVybjtcblxuICAgICAgLy8gRm9yIGN1cnNvciBwYWdpbmF0aW9uLCB3ZSBuZWVkIHRvIGxvYWQgc2VxdWVudGlhbGx5XG4gICAgICBpZiAoc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRQYWdlID0gTWF0aC5mbG9vcihyYW5nZS5zdGFydCAvIHJhbmdlU2l6ZSkgKyAxO1xuICAgICAgICBjb25zdCBlbmRQYWdlID0gTWF0aC5mbG9vcihyYW5nZS5lbmQgLyByYW5nZVNpemUpICsgMTtcblxuICAgICAgICAvLyBMaW1pdCBob3cgbWFueSBwYWdlcyB3ZSdsbCBsb2FkIGF0IG9uY2VcbiAgICAgICAgY29uc3QgbWF4UGFnZXNUb0xvYWQgPSAxMDtcbiAgICAgICAgY29uc3QgY3VycmVudEhpZ2hlc3RQYWdlID0gaGlnaGVzdExvYWRlZFBhZ2UgfHwgMDtcbiAgICAgICAgY29uc3QgbGltaXRlZEVuZFBhZ2UgPSBNYXRoLm1pbihcbiAgICAgICAgICBlbmRQYWdlLFxuICAgICAgICAgIGN1cnJlbnRIaWdoZXN0UGFnZSArIG1heFBhZ2VzVG9Mb2FkLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gQ3Vyc29yIG1vZGU6IG5lZWQgdG8gbG9hZCBwYWdlcyAke3N0YXJ0UGFnZX0gdG8gJHtlbmRQYWdlfSwgbGltaXRlZCB0byAke2xpbWl0ZWRFbmRQYWdlfWAsXG4gICAgICAgIC8vICk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byBsb2FkIHBhZ2VzIHNlcXVlbnRpYWxseVxuICAgICAgICBmb3IgKGxldCBwYWdlID0gc3RhcnRQYWdlOyBwYWdlIDw9IGxpbWl0ZWRFbmRQYWdlOyBwYWdlKyspIHtcbiAgICAgICAgICBjb25zdCByYW5nZUlkID0gcGFnZSAtIDE7IC8vIENvbnZlcnQgdG8gMC1iYXNlZCByYW5nZUlkXG4gICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gcmFuZ2VJZCAqIHJhbmdlU2l6ZTtcblxuICAgICAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBiZWluZyBsb2FkZWRcbiAgICAgICAgICBpZiAocGVuZGluZ1Jhbmdlcy5oYXMocmFuZ2VJZCkpIHtcbiAgICAgICAgICAgIC8vIFJhbmdlIGFscmVhZHkgYmVpbmcgbG9hZGVkXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFsb2FkZWRSYW5nZXMuaGFzKHJhbmdlSWQpICYmICFwZW5kaW5nUmFuZ2VzLmhhcyhyYW5nZUlkKSkge1xuICAgICAgICAgICAgLy8gRm9yIGN1cnNvciBwYWdpbmF0aW9uLCB3ZSBtdXN0IGxvYWQgc2VxdWVudGlhbGx5XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGFsbCBwcmV2aW91cyBwYWdlcyBsb2FkZWRcbiAgICAgICAgICAgIGlmIChwYWdlID4gMSkge1xuICAgICAgICAgICAgICBsZXQgY2FuTG9hZCA9IHRydWU7XG4gICAgICAgICAgICAgIGZvciAobGV0IHByZXZQYWdlID0gMTsgcHJldlBhZ2UgPCBwYWdlOyBwcmV2UGFnZSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldlJhbmdlSWQgPSBwcmV2UGFnZSAtIDE7XG4gICAgICAgICAgICAgICAgaWYgKCFsb2FkZWRSYW5nZXMuaGFzKHByZXZSYW5nZUlkKSkge1xuICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gQ2Fubm90IGxvYWQgcGFnZSAke3BhZ2V9IC0gbmVlZCB0byBsb2FkIHBhZ2UgJHtwcmV2UGFnZX0gZmlyc3RgLFxuICAgICAgICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgICAgICAgIGNhbkxvYWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGxvYWQgdGhlIG1pc3NpbmcgcGFnZVxuICAgICAgICAgICAgICAgICAgaWYgKCFwZW5kaW5nUmFuZ2VzLmhhcyhwcmV2UmFuZ2VJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBsb2FkUmFuZ2UocHJldlJhbmdlSWQgKiByYW5nZVNpemUsIHJhbmdlU2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGBbQ29sbGVjdGlvbl0gRmFpbGVkIHRvIGxvYWQgcHJlcmVxdWlzaXRlIHBhZ2UgJHtwcmV2UGFnZX06YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBTdG9wIHRyeWluZyB0byBsb2FkIGZ1cnRoZXIgcGFnZXNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKCFjYW5Mb2FkKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7IC8vIFNraXAgdGhpcyBwYWdlIGZvciBub3dcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCBsb2FkUmFuZ2Uob2Zmc2V0LCByYW5nZVNpemUpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgW0NvbGxlY3Rpb25dIEZhaWxlZCB0byBsb2FkIHBhZ2UgJHtwYWdlfTpgLCBlcnJvcik7XG4gICAgICAgICAgICAgIGJyZWFrOyAvLyBTdG9wIHNlcXVlbnRpYWwgbG9hZGluZyBvbiBlcnJvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmRQYWdlID4gbGltaXRlZEVuZFBhZ2UpIHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gU3RvcHBlZCBhdCBwYWdlICR7bGltaXRlZEVuZFBhZ2V9IHRvIHByZXZlbnQgZXhjZXNzaXZlIGxvYWRpbmcgKHJlcXVlc3RlZCB1cCB0byAke2VuZFBhZ2V9KWAsXG4gICAgICAgICAgLy8gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gT3JpZ2luYWwgbG9naWMgZm9yIG9mZnNldC9wYWdlIHN0cmF0ZWdpZXNcbiAgICAgIC8vIENhbGN1bGF0ZSByYW5nZSBib3VuZGFyaWVzXG4gICAgICBjb25zdCBzdGFydFJhbmdlID0gTWF0aC5mbG9vcihyYW5nZS5zdGFydCAvIHJhbmdlU2l6ZSk7XG4gICAgICBjb25zdCBlbmRSYW5nZSA9IE1hdGguZmxvb3IocmFuZ2UuZW5kIC8gcmFuZ2VTaXplKTtcblxuICAgICAgLy8gQ29sbGVjdCByYW5nZXMgdGhhdCBuZWVkIGxvYWRpbmdcbiAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIFZJU0lCTEUgaW5kaWNlcyBoYXZlIGRhdGEsIG5vdCBqdXN0IGFueSBkYXRhIGluIGEgcmFuZ2VcbiAgICAgIGNvbnN0IHJhbmdlc1RvTG9hZDogbnVtYmVyW10gPSBbXTtcblxuICAgICAgLy8gQ2hlY2sgZWFjaCB2aXNpYmxlIGluZGV4IHRvIHNlZSBpZiBpdCBoYXMgZGF0YVxuICAgICAgY29uc3QgdmlzaWJsZVN0YXJ0ID0gcmFuZ2Uuc3RhcnQ7XG4gICAgICBjb25zdCB2aXNpYmxlRW5kID0gcmFuZ2UuZW5kO1xuXG4gICAgICAvLyBGaW5kIHdoaWNoIGluZGljZXMgaW4gdGhlIHZpc2libGUgcmFuZ2UgYXJlIG1pc3NpbmcgZGF0YVxuICAgICAgLy8gSWYgdG90YWxJdGVtcyBpcyAwIG9yIHdlIGhhdmUgbm8gaXRlbXMsIHdlIG5lZWQgdG8gbG9hZCAoaW5pdGlhbCBsb2FkIGNhc2UpXG4gICAgICBsZXQgaGFzTWlzc2luZ0RhdGEgPSBmYWxzZTtcblxuICAgICAgaWYgKHRvdGFsSXRlbXMgPT09IDAgfHwgaXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIEluaXRpYWwgbG9hZCAtIHdlIG5lZWQgdG8gZmV0Y2ggZGF0YVxuICAgICAgICBoYXNNaXNzaW5nRGF0YSA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDaGVjayBlYWNoIHZpc2libGUgaW5kZXggZm9yIG1pc3NpbmcgZGF0YVxuICAgICAgICBmb3IgKGxldCBpID0gdmlzaWJsZVN0YXJ0OyBpIDw9IHZpc2libGVFbmQgJiYgaSA8IHRvdGFsSXRlbXM7IGkrKykge1xuICAgICAgICAgIGlmIChpdGVtc1tpXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoYXNNaXNzaW5nRGF0YSA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGhhc01pc3NpbmdEYXRhKSB7XG4gICAgICAgIC8vIEZpbmQgd2hpY2ggcmFuZ2VzIG5lZWQgdG8gYmUgbG9hZGVkXG4gICAgICAgIGZvciAobGV0IHJhbmdlSWQgPSBzdGFydFJhbmdlOyByYW5nZUlkIDw9IGVuZFJhbmdlOyByYW5nZUlkKyspIHtcbiAgICAgICAgICBpZiAocGVuZGluZ1Jhbmdlcy5oYXMocmFuZ2VJZCkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElmIHRvdGFsSXRlbXMgaXMgMCwgd2UncmUgZG9pbmcgaW5pdGlhbCBsb2FkIC0gYWx3YXlzIGxvYWQgdGhlIHJhbmdlXG4gICAgICAgICAgaWYgKHRvdGFsSXRlbXMgPT09IDApIHtcbiAgICAgICAgICAgIGxvYWRlZFJhbmdlcy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgICAgICByYW5nZXNUb0xvYWQucHVzaChyYW5nZUlkKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgc3BlY2lmaWMgcmFuZ2UgaGFzIGFsbCBpdHMgZGF0YVxuICAgICAgICAgIGNvbnN0IHJhbmdlU3RhcnQgPSByYW5nZUlkICogcmFuZ2VTaXplO1xuICAgICAgICAgIGNvbnN0IHJhbmdlRW5kID0gTWF0aC5taW4ocmFuZ2VTdGFydCArIHJhbmdlU2l6ZSwgdG90YWxJdGVtcyk7XG4gICAgICAgICAgbGV0IHJhbmdlTWlzc2luZ0RhdGEgPSBmYWxzZTtcblxuICAgICAgICAgIGZvciAobGV0IGkgPSByYW5nZVN0YXJ0OyBpIDwgcmFuZ2VFbmQ7IGkrKykge1xuICAgICAgICAgICAgLy8gT25seSBjaGVjayBpbmRpY2VzIHRoYXQgYXJlIGluIHRoZSB2aXNpYmxlIHJhbmdlXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGkgPj0gdmlzaWJsZVN0YXJ0ICYmXG4gICAgICAgICAgICAgIGkgPD0gdmlzaWJsZUVuZCAmJlxuICAgICAgICAgICAgICBpdGVtc1tpXSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmFuZ2VNaXNzaW5nRGF0YSA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyYW5nZU1pc3NpbmdEYXRhKSB7XG4gICAgICAgICAgICBsb2FkZWRSYW5nZXMuZGVsZXRlKHJhbmdlSWQpOyAvLyBDbGVhciBzdGFsZSBsb2FkZWQgc3RhdGVcbiAgICAgICAgICAgIHJhbmdlc1RvTG9hZC5wdXNoKHJhbmdlSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocmFuZ2VzVG9Mb2FkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgcXVldWVkIHJlcXVlc3RzIHdlIHNob3VsZCBwcm9jZXNzXG4gICAgICAgIGlmIChcbiAgICAgICAgICBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICBhY3RpdmVMb2FkQ291bnQgPCBtYXhDb25jdXJyZW50UmVxdWVzdHNcbiAgICAgICAgKSB7XG4gICAgICAgICAgcHJvY2Vzc1F1ZXVlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBMb2FkaW5nICR7cmFuZ2VzVG9Mb2FkLmxlbmd0aH0gcmFuZ2VzOiBbJHtyYW5nZXNUb0xvYWQuam9pbihcIiwgXCIpfV1gLFxuICAgICAgLy8gKTtcblxuICAgICAgLy8gTG9hZCByYW5nZXMgaW5kaXZpZHVhbGx5IC0gbm8gbWVyZ2luZyB0byBhdm9pZCBsb2FkaW5nIG9sZCByYW5nZXNcbiAgICAgIGNvbnN0IHByb21pc2VzID0gcmFuZ2VzVG9Mb2FkLm1hcCgocmFuZ2VJZCkgPT5cbiAgICAgICAgbG9hZFJhbmdlKHJhbmdlSWQgKiByYW5nZVNpemUsIHJhbmdlU2l6ZSksXG4gICAgICApO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHByb21pc2VzKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVmVsb2NpdHktYXdhcmUgd3JhcHBlciBmb3IgbG9hZE1pc3NpbmdSYW5nZXNcbiAgICAgKi9cbiAgICBjb25zdCBsb2FkTWlzc2luZ1JhbmdlcyA9IChcbiAgICAgIHJhbmdlOiB7XG4gICAgICAgIHN0YXJ0OiBudW1iZXI7XG4gICAgICAgIGVuZDogbnVtYmVyO1xuICAgICAgfSxcbiAgICAgIGNhbGxlcj86IHN0cmluZyxcbiAgICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJhbmdlS2V5ID0gZ2V0UmFuZ2VLZXkocmFuZ2UpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGFscmVhZHkgbG9hZGluZ1xuICAgICAgICBpZiAoYWN0aXZlTG9hZFJhbmdlcy5oYXMocmFuZ2VLZXkpKSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNraXAgaWYgZHJhZ2dpbmcgd2l0aCBsb3cgdmVsb2NpdHkgKGJ1dCBub3QgaWYgd2UncmUgaWRsZSlcbiAgICAgICAgaWYgKGlzRHJhZ2dpbmcgJiYgY3VycmVudFZlbG9jaXR5IDwgMC41ICYmIGN1cnJlbnRWZWxvY2l0eSA+IDApIHtcbiAgICAgICAgICBjYW5jZWxsZWRMb2FkcysrO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayB2ZWxvY2l0eSAtIGlmIHRvbyBoaWdoLCBjYW5jZWwgdGhlIHJlcXVlc3QgZW50aXJlbHlcbiAgICAgICAgaWYgKCFjYW5Mb2FkKCkpIHtcbiAgICAgICAgICBjYW5jZWxsZWRMb2FkcysrO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBjYXBhY2l0eVxuICAgICAgICBpZiAoYWN0aXZlTG9hZENvdW50IDwgbWF4Q29uY3VycmVudFJlcXVlc3RzKSB7XG4gICAgICAgICAgLy8gRXhlY3V0ZSBpbW1lZGlhdGVseVxuICAgICAgICAgIGV4ZWN1dGVRdWV1ZWRMb2FkKHtcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgcHJpb3JpdHk6IFwibm9ybWFsXCIsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgICAgY2FsbGVyLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGVuYWJsZVJlcXVlc3RRdWV1ZSAmJlxuICAgICAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoIDwgbWF4UXVldWVTaXplXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIFF1ZXVlIHRoZSByZXF1ZXN0XG4gICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgcHJpb3JpdHk6IFwibm9ybWFsXCIsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgICAgY2FsbGVyLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtMb2FkaW5nTWFuYWdlcl0gUXVldWVkIHJlcXVlc3QgKGF0IGNhcGFjaXR5KSwgcXVldWUgc2l6ZTogJHtsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aH1gXG4gICAgICAgICAgLy8gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBRdWV1ZSBpcyBmdWxsIC0gYnV0IGRvbid0IGRyb3AgaWRsZS9yYW5nZS1jaGFuZ2VkIHJlcXVlc3RzLCB0aGV5J3JlIGNyaXRpY2FsIVxuICAgICAgICAgIC8vIEluc3RlYWQsIGNsZWFyIG9sZCBxdWV1ZWQgcmVxdWVzdHMgYW5kIGFkZCB0aGUgbmV3IG9uZVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGNhbGxlciA9PT0gXCJ2aWV3cG9ydDppZGxlXCIgfHxcbiAgICAgICAgICAgIGNhbGxlciA9PT0gXCJ2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkXCJcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIENsZWFyIG9sZCBxdWV1ZWQgcmVxdWVzdHMgLSB0aGV5J3JlIGZvciByYW5nZXMgdXNlciBzY3JvbGxlZCBwYXN0XG4gICAgICAgICAgICBsb2FkUmVxdWVzdFF1ZXVlLmZvckVhY2goKHIpID0+IHtcbiAgICAgICAgICAgICAgY2FuY2VsbGVkTG9hZHMrKztcbiAgICAgICAgICAgICAgci5yZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoID0gMDtcbiAgICAgICAgICAgIC8vIFF1ZXVlIHRoaXMgcHJpb3JpdHkgcmVxdWVzdFxuICAgICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICAgIHByaW9yaXR5OiBcImhpZ2hcIixcbiAgICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgICAgIGNhbGxlcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBRdWV1ZSBvdmVyZmxvdyAtIHJlc29sdmUgdG8gYXZvaWQgZXJyb3JzXG4gICAgICAgICAgICBpZiAobG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggPj0gbWF4UXVldWVTaXplKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlbW92ZWQgPSBsb2FkUmVxdWVzdFF1ZXVlLnNwbGljZShcbiAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoIC0gbWF4UXVldWVTaXplLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZW1vdmVkLmZvckVhY2goKHIpID0+IHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsZWRMb2FkcysrO1xuICAgICAgICAgICAgICAgIHIucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXRyeSBhIGZhaWxlZCByYW5nZVxuICAgICAqL1xuICAgIGNvbnN0IHJldHJ5RmFpbGVkUmFuZ2UgPSBhc3luYyAocmFuZ2VJZDogbnVtYmVyKTogUHJvbWlzZTxhbnlbXT4gPT4ge1xuICAgICAgZmFpbGVkUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgIGNvbnN0IG9mZnNldCA9IHJhbmdlSWQgKiByYW5nZVNpemU7XG4gICAgICByZXR1cm4gbG9hZFJhbmdlKG9mZnNldCwgcmFuZ2VTaXplKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0IHRvdGFsIGl0ZW1zIGNvdW50XG4gICAgICovXG4gICAgY29uc3Qgc2V0VG90YWxJdGVtcyA9ICh0b3RhbDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICB0b3RhbEl0ZW1zID0gdG90YWw7XG5cbiAgICAgIC8vIFVwZGF0ZSB2aWV3cG9ydCBzdGF0ZSdzIHRvdGFsIGl0ZW1zXG4gICAgICBjb25zdCB2aWV3cG9ydFN0YXRlID0gKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLnN0YXRlO1xuICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zID0gdG90YWw7XG4gICAgICB9XG5cbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDp0b3RhbC1pdGVtcy1jaGFuZ2VkXCIsIHsgdG90YWwgfSk7XG4gICAgfTtcblxuICAgIC8vIEhvb2sgaW50byB2aWV3cG9ydCBpbml0aWFsaXphdGlvblxuICAgIGNvbnN0IG9yaWdpbmFsSW5pdGlhbGl6ZSA9IGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplO1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplID0gKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gb3JpZ2luYWxJbml0aWFsaXplKCk7XG4gICAgICAvLyBTa2lwIGlmIGFscmVhZHkgaW5pdGlhbGl6ZWRcbiAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IGluaXRpYWwgdG90YWwgaWYgcHJvdmlkZWRcbiAgICAgIGlmIChjb21wb25lbnQudG90YWxJdGVtcykge1xuICAgICAgICB0b3RhbEl0ZW1zID0gY29tcG9uZW50LnRvdGFsSXRlbXM7XG4gICAgICB9XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgZHJhZyBldmVudHNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6ZHJhZy1zdGFydFwiLCAoKSA9PiB7XG4gICAgICAgIGlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6ZHJhZy1lbmRcIiwgKCkgPT4ge1xuICAgICAgICBpc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgIC8vIFByb2Nlc3MgYW55IHF1ZXVlZCByZXF1ZXN0cyBhZnRlciBkcmFnIGVuZHMgKHNhZmV0eSBtZWFzdXJlKVxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgcGxhY2Vob2xkZXJzIGFyZSByZXBsYWNlZCBldmVuIGlmIGlkbGUgZGV0ZWN0aW9uIGZhaWxzXG4gICAgICAgIGlmIChsb2FkT25EcmFnRW5kKSB7XG4gICAgICAgICAgcHJvY2Vzc1F1ZXVlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIHJhbmdlIGNoYW5nZXNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6cmFuZ2UtY2hhbmdlZFwiLCBhc3luYyAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIC8vIEV4dHJhY3QgcmFuZ2UgZnJvbSBldmVudCBkYXRhIC0gdmlydHVhbCBmZWF0dXJlIGVtaXRzIHsgcmFuZ2U6IHsgc3RhcnQsIGVuZCB9LCBzY3JvbGxQb3NpdGlvbiB9XG4gICAgICAgIGNvbnN0IHJhbmdlID0gZGF0YS5yYW5nZSB8fCBkYXRhO1xuXG4gICAgICAgIC8vIERvbid0IGxvYWQgZHVyaW5nIGZhc3Qgc2Nyb2xsaW5nIC0gbG9hZE1pc3NpbmdSYW5nZXMgd2lsbCBoYW5kbGUgdmVsb2NpdHkgY2hlY2tcblxuICAgICAgICAvLyBTa2lwIGlmIGF1dG9Mb2FkIGlzIGRpc2FibGVkIEFORCB3ZSBoYXZlbid0IG1hbnVhbGx5IGxvYWRlZCB5ZXRcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyB1bndhbnRlZCBwYWdlIDEgbG9hZHMgd2hlbiB1c2luZyByZWxvYWRBdCgpXG4gICAgICAgIC8vIEJ1dCBhbGxvd3Mgc3Vic2VxdWVudCBsb2FkcyBmcm9tIHNjcm9sbGluZyBhZnRlciByZWxvYWRBdCgpIGNvbXBsZXRlc1xuICAgICAgICBpZiAoIWF1dG9Mb2FkICYmICFoYXNNYW51YWxseUxvYWRlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gcmFuZ2U7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgcmFuZ2UgYmVmb3JlIGxvYWRpbmdcbiAgICAgICAgaWYgKHR5cGVvZiBzdGFydCAhPT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgZW5kICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgXCJbQ29sbGVjdGlvbl0gSW52YWxpZCByYW5nZSBpbiB2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkIGV2ZW50OlwiLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNraXAgbG9hZGluZyBwYWdlIDEgaWYgd2UgaGF2ZSBhbiBpbml0aWFsU2Nyb2xsSW5kZXggYW5kIGhhdmVuJ3QgY29tcGxldGVkIGluaXRpYWwgbG9hZCB5ZXRcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aGUgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIGluIHZpcnR1YWwudHMgZnJvbSB0cmlnZ2VyaW5nIGEgcGFnZSAxIGxvYWRcbiAgICAgICAgLy8gYWZ0ZXIgd2UndmUgYWxyZWFkeSBzdGFydGVkIGxvYWRpbmcgdGhlIGNvcnJlY3QgaW5pdGlhbCBwYWdlXG4gICAgICAgIGlmIChoYXNJbml0aWFsU2Nyb2xsSW5kZXggJiYgIWhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQpIHtcbiAgICAgICAgICBjb25zdCBwYWdlMUVuZEluZGV4ID0gcmFuZ2VTaXplIC0gMTsgLy8gZS5nLiwgMjkgZm9yIHJhbmdlU2l6ZT0zMFxuICAgICAgICAgIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPD0gcGFnZTFFbmRJbmRleCkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHJlcXVlc3QgZm9yIHBhZ2UgMSwgc2tpcCBpdFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNraXAgbG9hZGluZyBwYWdlIDEgaWYgYSByZWxvYWQgaXMgaW4gcHJvZ3Jlc3MgKGUuZy4sIHJlbG9hZEF0IGlzIGxvYWRpbmcgYSBzcGVjaWZpYyBwYWdlKVxuICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHN0YWxlIHZpZXdwb3J0OnJhbmdlLWNoYW5nZWQgZXZlbnRzIGZyb20gbG9hZGluZyBwYWdlIDFcbiAgICAgICAgLy8gd2hpbGUgcmVsb2FkQXQgaXMgbG9hZGluZyBhIGRpZmZlcmVudCBwYWdlXG4gICAgICAgIGlmIChyZWxvYWRJblByb2dyZXNzICYmIHJlbG9hZFRhcmdldFJhbmdlKSB7XG4gICAgICAgICAgY29uc3QgcGFnZTFFbmRJbmRleCA9IHJhbmdlU2l6ZSAtIDE7XG4gICAgICAgICAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA8PSBwYWdlMUVuZEluZGV4KSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEgcmVxdWVzdCBmb3IgcGFnZSAxIGR1cmluZyBhIHJlbG9hZCB0YXJnZXRpbmcgYSBkaWZmZXJlbnQgcmFuZ2VcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgcmFuZ2UgaXMgTk9UIHBhZ2UgMVxuICAgICAgICAgICAgaWYgKHJlbG9hZFRhcmdldFJhbmdlLnN0YXJ0ID4gcGFnZTFFbmRJbmRleCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG9hZCBtaXNzaW5nIHJhbmdlcyBpZiBuZWVkZWQgLSBkb24ndCBhd2FpdCB0byBhdm9pZCBibG9ja2luZyBzY3JvbGxcbiAgICAgICAgLy8gVGhlIGxvYWRpbmcgaGFwcGVucyBpbiB0aGUgYmFja2dyb3VuZCBhbmQgVUkgdXBkYXRlcyB3aGVuIGRhdGEgYXJyaXZlc1xuICAgICAgICBsb2FkTWlzc2luZ1Jhbmdlcyh7IHN0YXJ0LCBlbmQgfSwgXCJ2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkXCIpO1xuXG4gICAgICAgIC8vIEV2aWN0IGRpc3RhbnQgaXRlbXMgdG8gcHJldmVudCBtZW1vcnkgYmxvYXRcbiAgICAgICAgZXZpY3REaXN0YW50SXRlbXMoc3RhcnQsIGVuZCk7XG5cbiAgICAgICAgLy8gRm9yIGN1cnNvciBtb2RlLCBjaGVjayBpZiB3ZSBuZWVkIHRvIHVwZGF0ZSB2aXJ0dWFsIHNpemVcbiAgICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImN1cnNvclwiICYmICFoYXNSZWFjaGVkRW5kKSB7XG4gICAgICAgICAgLy8gVXNlIGNhY2hlZEl0ZW1Db3VudCBpbnN0ZWFkIG9mIE8obikgZmlsdGVyIG9wZXJhdGlvblxuICAgICAgICAgIGNvbnN0IGxvYWRlZEl0ZW1zQ291bnQgPSBjYWNoZWRJdGVtQ291bnQ7XG4gICAgICAgICAgY29uc3QgbWFyZ2luSXRlbXMgPVxuICAgICAgICAgICAgcmFuZ2VTaXplICpcbiAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QQUdJTkFUSU9OLkNVUlNPUl9TQ1JPTExfTUFSR0lOX01VTFRJUExJRVI7XG4gICAgICAgICAgY29uc3QgbWluVmlydHVhbEl0ZW1zID1cbiAgICAgICAgICAgIHJhbmdlU2l6ZSAqXG4gICAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUEFHSU5BVElPTi5DVVJTT1JfTUlOX1ZJUlRVQUxfU0laRV9NVUxUSVBMSUVSO1xuICAgICAgICAgIGNvbnN0IGR5bmFtaWNUb3RhbCA9IE1hdGgubWF4KFxuICAgICAgICAgICAgbG9hZGVkSXRlbXNDb3VudCArIG1hcmdpbkl0ZW1zLFxuICAgICAgICAgICAgbWluVmlydHVhbEl0ZW1zLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoZHluYW1pY1RvdGFsICE9PSB0b3RhbEl0ZW1zKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBVcGRhdGluZyBjdXJzb3IgdmlydHVhbCBzaXplIGZyb20gJHt0b3RhbEl0ZW1zfSB0byAke2R5bmFtaWNUb3RhbH1gLFxuICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgIHNldFRvdGFsSXRlbXMoZHluYW1pY1RvdGFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIHZlbG9jaXR5IGNoYW5nZXNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6dmVsb2NpdHktY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmVsb2NpdHkgPSBjdXJyZW50VmVsb2NpdHk7XG4gICAgICAgIGN1cnJlbnRWZWxvY2l0eSA9IE1hdGguYWJzKGRhdGEudmVsb2NpdHkgfHwgMCk7XG5cbiAgICAgICAgLy8gV2hlbiB2ZWxvY2l0eSBkcm9wcyBiZWxvdyB0aHJlc2hvbGQsIHByb2Nlc3MgcXVldWVcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByZXZpb3VzVmVsb2NpdHkgPiBjYW5jZWxMb2FkVGhyZXNob2xkICYmXG4gICAgICAgICAgY3VycmVudFZlbG9jaXR5IDw9IGNhbmNlbExvYWRUaHJlc2hvbGRcbiAgICAgICAgKSB7XG4gICAgICAgICAgcHJvY2Vzc1F1ZXVlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGlkbGUgc3RhdGUgdG8gcHJvY2VzcyBxdWV1ZVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDppZGxlXCIsIGFzeW5jIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY3VycmVudFZlbG9jaXR5ID0gMDtcblxuICAgICAgICAvLyBSZXNldCBkcmFnZ2luZyBzdGF0ZSBvbiBpZGxlIHNpbmNlIHVzZXIgaGFzIHN0b3BwZWQgbW92aW5nXG4gICAgICAgIGlmIChpc0RyYWdnaW5nKSB7XG4gICAgICAgICAgaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGN1cnJlbnQgdmlzaWJsZSByYW5nZSBmcm9tIHZpZXdwb3J0XG4gICAgICAgIGNvbnN0IHZpZXdwb3J0U3RhdGUgPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU7XG4gICAgICAgIGNvbnN0IHZpc2libGVSYW5nZSA9IHZpZXdwb3J0U3RhdGU/LnZpc2libGVSYW5nZTtcblxuICAgICAgICBpZiAodmlzaWJsZVJhbmdlKSB7XG4gICAgICAgICAgLy8gQ2xlYXIgc3RhbGUgcmVxdWVzdHMgZnJvbSBxdWV1ZSB0aGF0IGFyZSBmYXIgZnJvbSBjdXJyZW50IHZpc2libGUgcmFuZ2VcbiAgICAgICAgICBjb25zdCBidWZmZXIgPSByYW5nZVNpemUgKiAyOyAvLyBBbGxvdyBzb21lIGJ1ZmZlclxuICAgICAgICAgIGxvYWRSZXF1ZXN0UXVldWUgPSBsb2FkUmVxdWVzdFF1ZXVlLmZpbHRlcigocmVxdWVzdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdEVuZCA9IHJlcXVlc3QucmFuZ2UuZW5kO1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdFN0YXJ0ID0gcmVxdWVzdC5yYW5nZS5zdGFydDtcbiAgICAgICAgICAgIGNvbnN0IGlzUmVsZXZhbnQgPVxuICAgICAgICAgICAgICByZXF1ZXN0RW5kID49IHZpc2libGVSYW5nZS5zdGFydCAtIGJ1ZmZlciAmJlxuICAgICAgICAgICAgICByZXF1ZXN0U3RhcnQgPD0gdmlzaWJsZVJhbmdlLmVuZCArIGJ1ZmZlcjtcblxuICAgICAgICAgICAgaWYgKCFpc1JlbGV2YW50KSB7XG4gICAgICAgICAgICAgIHJlcXVlc3QucmVzb2x2ZSgpOyAvLyBSZXNvbHZlIHRvIGF2b2lkIGhhbmdpbmcgcHJvbWlzZXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpc1JlbGV2YW50O1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gTG9hZCB0aGUgY3VycmVudCB2aXNpYmxlIHJhbmdlIGlmIG5lZWRlZFxuICAgICAgICAgIGF3YWl0IGxvYWRNaXNzaW5nUmFuZ2VzKHZpc2libGVSYW5nZSwgXCJ2aWV3cG9ydDppZGxlXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxzbyBwcm9jZXNzIGFueSBxdWV1ZWQgcmVxdWVzdHNcbiAgICAgICAgcHJvY2Vzc1F1ZXVlKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBpdGVtIHJlbW92YWwgLSBET04nVCBjbGVhciBsb2FkZWRSYW5nZXMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZWxvYWRcbiAgICAgIC8vIFRoZSBkYXRhIGlzIGFscmVhZHkgc2hpZnRlZCBsb2NhbGx5IGluIGFwaS50cyBhbmQgcmVuZGVyaW5nLnRzXG4gICAgICAvLyBSZWxvYWRpbmcgd291bGQgY2F1c2UgcmFjZSBjb25kaXRpb25zIGFuZCBvdmVyd3JpdGUgdGhlIGNvcnJlY3QgdG90YWxJdGVtc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJpdGVtOnJlbW92ZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW0NvbGxlY3Rpb25dIGl0ZW06cmVtb3ZlZCBldmVudCAtIGluZGV4OiAke2RhdGEuaW5kZXh9YCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBbQ29sbGVjdGlvbl0gaXRlbXMubGVuZ3RoOiAke2l0ZW1zLmxlbmd0aH1gKTtcblxuICAgICAgICAvLyBVcGRhdGUgZGlzY292ZXJlZFRvdGFsIHRvIG1hdGNoIHRoZSBuZXcgY291bnRcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBzdGFsZSBkaXNjb3ZlcmVkVG90YWwgZnJvbSBiZWluZyB1c2VkIG9uIG5leHQgbG9hZFxuICAgICAgICBpZiAoZGlzY292ZXJlZFRvdGFsICE9PSBudWxsICYmIGRpc2NvdmVyZWRUb3RhbCA+IDApIHtcbiAgICAgICAgICBkaXNjb3ZlcmVkVG90YWwgPSBkaXNjb3ZlcmVkVG90YWwgLSAxO1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBVcGRhdGVkIGRpc2NvdmVyZWRUb3RhbCB0bzogJHtkaXNjb3ZlcmVkVG90YWx9YCxcbiAgICAgICAgICAvLyApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTk9URTogRG8gTk9UIGRlY3JlbWVudCB0b3RhbEl0ZW1zIGhlcmUhXG4gICAgICAgIC8vIGFwaS50cyBhbHJlYWR5IGNhbGxzIHNldFRvdGFsSXRlbXMoKSBhZnRlciBlbWl0dGluZyBpdGVtOnJlbW92ZS1yZXF1ZXN0LFxuICAgICAgICAvLyB3aGljaCBwcm9wZXJseSB1cGRhdGVzIHRvdGFsSXRlbXMuIERlY3JlbWVudGluZyBoZXJlIHdvdWxkIGNhdXNlIGEgZG91YmxlLWRlY3JlbWVudC5cblxuICAgICAgICAvLyBET04nVCBjbGVhciBsb2FkZWRSYW5nZXMgLSB3ZSB3YW50IHRvIGtlZXAgdXNpbmcgdGhlIGxvY2FsIGRhdGFcbiAgICAgICAgLy8gVGhlIGRhdGEgaGFzIGJlZW4gc2hpZnRlZCBsb2NhbGx5IGFuZCBpcyBzdGlsbCB2YWxpZFxuICAgICAgICAvLyBDbGVhcmluZyB3b3VsZCB0cmlnZ2VyIGEgcmVsb2FkIHdoaWNoIGNhdXNlcyByYWNlIGNvbmRpdGlvbnNcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBLZWVwaW5nIGxvYWRlZFJhbmdlcyBpbnRhY3Q6YCxcbiAgICAgICAgLy8gICBBcnJheS5mcm9tKGxvYWRlZFJhbmdlcyksXG4gICAgICAgIC8vICk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTG9hZCBpbml0aWFsIGRhdGEgaWYgY29sbGVjdGlvbiBpcyBhdmFpbGFibGUgYW5kIGF1dG9Mb2FkIGlzIGVuYWJsZWRcbiAgICAgIGlmIChjb2xsZWN0aW9uICYmIGF1dG9Mb2FkKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgYW4gaW5pdGlhbCBzY3JvbGwgaW5kZXggT1IgYSBzZWxlY3RJZCwgbG9hZCBkYXRhIGZvciB0aGF0IHBvc2l0aW9uIGRpcmVjdGx5XG4gICAgICAgIC8vIERvbid0IHVzZSBzY3JvbGxUb0luZGV4KCkgYXMgaXQgdHJpZ2dlcnMgYW5pbWF0aW9uL3ZlbG9jaXR5IHRyYWNraW5nXG4gICAgICAgIC8vIHZpcnR1YWwudHMgaGFzIGFscmVhZHkgc2V0IHRoZSBzY3JvbGwgcG9zaXRpb24gYW5kIGNhbGN1bGF0ZWQgdGhlIHZpc2libGUgcmFuZ2VcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGluaXRpYWxTY3JvbGxJbmRleCA+IDAgfHxcbiAgICAgICAgICAoc2VsZWN0SWQgIT09IHVuZGVmaW5lZCAmJiBzZWxlY3RJZCAhPT0gbnVsbClcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gR2V0IHRoZSB2aXNpYmxlIHJhbmdlIHRoYXQgd2FzIGFscmVhZHkgY2FsY3VsYXRlZCBieSB2aXJ0dWFsLnRzXG4gICAgICAgICAgLy8gV2UgbWlzc2VkIHRoZSBpbml0aWFsIHZpZXdwb3J0OnJhbmdlLWNoYW5nZWQgZXZlbnQgYmVjYXVzZSBvdXIgbGlzdGVuZXIgd2Fzbid0IHJlYWR5IHlldFxuICAgICAgICAgIGNvbnN0IHZpc2libGVSYW5nZSA9IGNvbXBvbmVudC52aWV3cG9ydD8uZ2V0VmlzaWJsZVJhbmdlPy4oKTtcblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHZpc2libGVSYW5nZSAmJlxuICAgICAgICAgICAgKHZpc2libGVSYW5nZS5zdGFydCA+IDAgfHwgdmlzaWJsZVJhbmdlLmVuZCA+IDApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBVc2UgdGhlIHByZS1jYWxjdWxhdGVkIHZpc2libGUgcmFuZ2UgZnJvbSB2aXJ0dWFsLnRzXG4gICAgICAgICAgICBsb2FkTWlzc2luZ1Jhbmdlcyh2aXNpYmxlUmFuZ2UsIFwiaW5pdGlhbC1wb3NpdGlvblwiKVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgLy8gRW1pdCBldmVudCB0byBzZWxlY3QgaXRlbSBhZnRlciBpbml0aWFsIGxvYWQgaWYgc2VsZWN0SWQgaXMgcHJvdmlkZWRcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImNvbGxlY3Rpb246aW5pdGlhbC1sb2FkLWNvbXBsZXRlXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0SWQsXG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxTY3JvbGxJbmRleCxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICBcIltDb2xsZWN0aW9uXSBGYWlsZWQgdG8gbG9hZCBpbml0aWFsIHBvc2l0aW9uIGRhdGE6XCIsXG4gICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQgPSB0cnVlOyAvLyBBbGxvdyBub3JtYWwgbG9hZGluZyBldmVuIG9uIGVycm9yXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGYWxsYmFjazogY2FsY3VsYXRlIHJhbmdlIGZyb20gaW5pdGlhbFNjcm9sbEluZGV4XG4gICAgICAgICAgICAvLyBUaGlzIGhhbmRsZXMgZWRnZSBjYXNlcyB3aGVyZSB2aXNpYmxlUmFuZ2Ugd2Fzbid0IHJlYWR5XG4gICAgICAgICAgICBjb25zdCBvdmVyc2NhbiA9IDI7XG4gICAgICAgICAgICBjb25zdCBlc3RpbWF0ZWRWaXNpYmxlQ291bnQgPSBNYXRoLmNlaWwoNjAwIC8gNTApOyAvLyB+MTIgaXRlbXNcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoMCwgaW5pdGlhbFNjcm9sbEluZGV4IC0gb3ZlcnNjYW4pO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gaW5pdGlhbFNjcm9sbEluZGV4ICsgZXN0aW1hdGVkVmlzaWJsZUNvdW50ICsgb3ZlcnNjYW47XG5cbiAgICAgICAgICAgIGxvYWRNaXNzaW5nUmFuZ2VzKHsgc3RhcnQsIGVuZCB9LCBcImluaXRpYWwtcG9zaXRpb24tZmFsbGJhY2tcIilcbiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vIEVtaXQgZXZlbnQgdG8gc2VsZWN0IGl0ZW0gYWZ0ZXIgaW5pdGlhbCBsb2FkIGlmIHNlbGVjdElkIGlzIHByb3ZpZGVkXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJjb2xsZWN0aW9uOmluaXRpYWwtbG9hZC1jb21wbGV0ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdElkLFxuICAgICAgICAgICAgICAgICAgICBpbml0aWFsU2Nyb2xsSW5kZXgsXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgXCJbQ29sbGVjdGlvbl0gRmFpbGVkIHRvIGxvYWQgaW5pdGlhbCBwb3NpdGlvbiBkYXRhIChmYWxsYmFjayk6XCIsXG4gICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQgPSB0cnVlOyAvLyBBbGxvdyBub3JtYWwgbG9hZGluZyBldmVuIG9uIGVycm9yXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyBpbml0aWFsIHNjcm9sbCBpbmRleCAtIGxvYWQgZnJvbSBiZWdpbm5pbmcgYXMgbm9ybWFsXG4gICAgICAgIGxvYWRSYW5nZSgwLCByYW5nZVNpemUsIFwiaW5pdGlhbGl6ZS1wYWdlMVwiKVxuICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBhdXRvU2VsZWN0Rmlyc3QgLSBnZXQgZmlyc3QgaXRlbSBJRCBhbmQgZW1pdCBzZWxlY3Rpb24gZXZlbnRcbiAgICAgICAgICAgIGlmIChhdXRvU2VsZWN0Rmlyc3QgJiYgaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBjb25zdCBmaXJzdEl0ZW0gPSBpdGVtc1swXTtcbiAgICAgICAgICAgICAgY29uc3QgZmlyc3RJZCA9IGZpcnN0SXRlbT8uX2lkIHx8IGZpcnN0SXRlbT8uaWQ7XG4gICAgICAgICAgICAgIGlmIChmaXJzdElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY29sbGVjdGlvbjppbml0aWFsLWxvYWQtY29tcGxldGVcIiwge1xuICAgICAgICAgICAgICAgICAgc2VsZWN0SWQ6IGZpcnN0SWQsXG4gICAgICAgICAgICAgICAgICBpbml0aWFsU2Nyb2xsSW5kZXg6IDAsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbQ29sbGVjdGlvbl0gRmFpbGVkIHRvIGxvYWQgaW5pdGlhbCBkYXRhOlwiLCBlcnJvcik7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlc2V0IGNvbGxlY3Rpb24gc3RhdGUgd2l0aG91dCBkZXN0cm95aW5nIHRoZSBjb21wb25lbnRcbiAgICAgKiBDbGVhcnMgYWxsIGxvYWRlZCBkYXRhIGFuZCBwcmVwYXJlcyBmb3IgZnJlc2ggbG9hZFxuICAgICAqL1xuICAgIGNvbnN0IHJlc2V0ID0gKCkgPT4ge1xuICAgICAgbG9nTWVtb3J5U3RhdHMoXCJyZXNldDpiZWZvcmVcIik7XG5cbiAgICAgIC8vIEFib3J0IGFsbCBpbi1mbGlnaHQgcmVxdWVzdHNcbiAgICAgIGFib3J0Q29udHJvbGxlcnMuZm9yRWFjaCgoY29udHJvbGxlcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIElnbm9yZSBhYm9ydCBlcnJvcnNcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBhYm9ydENvbnRyb2xsZXJzLmNsZWFyKCk7XG5cbiAgICAgIC8vIENsZWFyIGFsbCBkYXRhIHN0cnVjdHVyZXNcbiAgICAgIGl0ZW1zLmxlbmd0aCA9IDA7XG4gICAgICBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgICBsb2FkZWRSYW5nZXMuY2xlYXIoKTtcbiAgICAgIHBlbmRpbmdSYW5nZXMuY2xlYXIoKTtcbiAgICAgIGZhaWxlZFJhbmdlcy5jbGVhcigpO1xuICAgICAgYWN0aXZlTG9hZFJhbmdlcy5jbGVhcigpO1xuICAgICAgYWN0aXZlUmVxdWVzdHMuY2xlYXIoKTtcbiAgICAgIGN1cnNvck1hcC5jbGVhcigpO1xuICAgICAgcGFnZVRvT2Zmc2V0TWFwLmNsZWFyKCk7XG5cbiAgICAgIC8vIFJlc2V0IHN0YXRlXG4gICAgICB0b3RhbEl0ZW1zID0gMDtcbiAgICAgIGN1cnJlbnRDdXJzb3IgPSBudWxsO1xuICAgICAgaGlnaGVzdExvYWRlZFBhZ2UgPSAwO1xuICAgICAgZGlzY292ZXJlZFRvdGFsID0gbnVsbDtcbiAgICAgIGhhc1JlYWNoZWRFbmQgPSBmYWxzZTtcbiAgICAgIGhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQgPSBmYWxzZTtcbiAgICAgIGhhc01hbnVhbGx5TG9hZGVkID0gZmFsc2U7XG5cbiAgICAgIC8vIFJlc2V0IGNhY2hlZCBpdGVtIGNvdW50XG4gICAgICBjYWNoZWRJdGVtQ291bnQgPSAwO1xuXG4gICAgICAvLyBSZXNldCBjb3VudGVyc1xuICAgICAgYWN0aXZlTG9hZENvdW50ID0gMDtcbiAgICAgIGNvbXBsZXRlZExvYWRzID0gMDtcbiAgICAgIGZhaWxlZExvYWRzID0gMDtcbiAgICAgIGNhbmNlbGxlZExvYWRzID0gMDtcblxuICAgICAgLy8gVXBkYXRlIGNvbXBvbmVudCByZWZlcmVuY2VcbiAgICAgIGNvbXBvbmVudC5pdGVtcyA9IGl0ZW1zO1xuICAgICAgY29tcG9uZW50LnRvdGFsSXRlbXMgPSAwO1xuXG4gICAgICBsb2dNZW1vcnlTdGF0cyhcInJlc2V0OmFmdGVyXCIpO1xuXG4gICAgICAvLyBFbWl0IHJlc2V0IGV2ZW50XG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwiY29sbGVjdGlvbjpyZXNldFwiKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgdGhlIHJlcXVlc3QgcXVldWUgLSB1c2VkIGJ5IHJlbG9hZEF0IHRvIHByZXZlbnQgc3RhbGUgcXVldWVkIHJlcXVlc3RzXG4gICAgICovXG4gICAgY29uc3QgY2xlYXJRdWV1ZSA9ICgpID0+IHtcbiAgICAgIC8vIFJlc29sdmUgYWxsIHBlbmRpbmcgcHJvbWlzZXMgdG8gYXZvaWQgaGFuZ2luZ1xuICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5mb3JFYWNoKChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJlcXVlc3QucmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgICBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIE1hcmsgdGhhdCBkYXRhIGhhcyBiZWVuIG1hbnVhbGx5IGxvYWRlZCAoZS5nLiwgdmlhIHJlbG9hZEF0KVxuICAgICAqIFRoaXMgZW5hYmxlcyBzdWJzZXF1ZW50IGxvYWRzIGZyb20gdmlld3BvcnQ6cmFuZ2UtY2hhbmdlZFxuICAgICAqL1xuICAgIGNvbnN0IHNldE1hbnVhbGx5TG9hZGVkID0gKCkgPT4ge1xuICAgICAgaGFzTWFudWFsbHlMb2FkZWQgPSB0cnVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXQgcmVsb2FkIGluIHByb2dyZXNzIGZsYWcgd2l0aCB0YXJnZXQgcmFuZ2VcbiAgICAgKiBVc2VkIGJ5IHJlbG9hZEF0IHRvIHByZXZlbnQgdmlld3BvcnQ6cmFuZ2UtY2hhbmdlZCBmcm9tIGxvYWRpbmcgcGFnZSAxXG4gICAgICovXG4gICAgY29uc3Qgc2V0UmVsb2FkSW5Qcm9ncmVzcyA9IChcbiAgICAgIGluUHJvZ3Jlc3M6IGJvb2xlYW4sXG4gICAgICB0YXJnZXRSYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSxcbiAgICApID0+IHtcbiAgICAgIHJlbG9hZEluUHJvZ3Jlc3MgPSBpblByb2dyZXNzO1xuICAgICAgcmVsb2FkVGFyZ2V0UmFuZ2UgPSB0YXJnZXRSYW5nZSB8fCBudWxsO1xuICAgIH07XG5cbiAgICAvLyBBZGQgY29sbGVjdGlvbiBBUEkgdG8gdmlld3BvcnRcbiAgICBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbiA9IHtcbiAgICAgIGxvYWRSYW5nZTogKG9mZnNldDogbnVtYmVyLCBsaW1pdDogbnVtYmVyKSA9PiBsb2FkUmFuZ2Uob2Zmc2V0LCBsaW1pdCksXG4gICAgICBsb2FkTWlzc2luZ1JhbmdlczogKFxuICAgICAgICByYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9LFxuICAgICAgICBjYWxsZXI/OiBzdHJpbmcsXG4gICAgICApID0+IGxvYWRNaXNzaW5nUmFuZ2VzKHJhbmdlLCBjYWxsZXIgfHwgXCJ2aWV3cG9ydC5jb2xsZWN0aW9uXCIpLFxuICAgICAgZ2V0TG9hZGVkUmFuZ2VzOiAoKSA9PiBsb2FkZWRSYW5nZXMsXG4gICAgICBnZXRQZW5kaW5nUmFuZ2VzOiAoKSA9PiBwZW5kaW5nUmFuZ2VzLFxuICAgICAgY2xlYXJGYWlsZWRSYW5nZXM6ICgpID0+IGZhaWxlZFJhbmdlcy5jbGVhcigpLFxuICAgICAgY2xlYXJRdWV1ZSxcbiAgICAgIHNldE1hbnVhbGx5TG9hZGVkLFxuICAgICAgc2V0UmVsb2FkSW5Qcm9ncmVzcyxcbiAgICAgIHJldHJ5RmFpbGVkUmFuZ2UsXG4gICAgICBzZXRUb3RhbEl0ZW1zLFxuICAgICAgZ2V0VG90YWxJdGVtczogKCkgPT4gdG90YWxJdGVtcyxcbiAgICAgIC8vIEN1cnNvci1zcGVjaWZpYyBtZXRob2RzXG4gICAgICBnZXRDdXJyZW50Q3Vyc29yOiAoKSA9PiBjdXJyZW50Q3Vyc29yLFxuICAgICAgZ2V0Q3Vyc29yRm9yUGFnZTogKHBhZ2U6IG51bWJlcikgPT4gY3Vyc29yTWFwLmdldChwYWdlKSB8fCBudWxsLFxuICAgICAgLy8gUmVzZXQgbWV0aG9kIGZvciByZWxvYWQgZnVuY3Rpb25hbGl0eVxuICAgICAgcmVzZXQsXG4gICAgfTtcblxuICAgIC8vIEFkZCBjb2xsZWN0aW9uIGRhdGEgYWNjZXNzIHdpdGggZGlyZWN0IGFzc2lnbm1lbnRcbiAgICAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbiA9IHtcbiAgICAgIGl0ZW1zLFxuICAgICAgZ2V0SXRlbXM6ICgpID0+IGl0ZW1zLFxuICAgICAgZ2V0SXRlbTogKGluZGV4OiBudW1iZXIpID0+IGl0ZW1zW2luZGV4XSxcbiAgICAgIGxvYWRSYW5nZSxcbiAgICAgIGxvYWRNaXNzaW5nUmFuZ2VzOiAoXG4gICAgICAgIHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0sXG4gICAgICAgIGNhbGxlcj86IHN0cmluZyxcbiAgICAgICkgPT4gbG9hZE1pc3NpbmdSYW5nZXMocmFuZ2UsIGNhbGxlciB8fCBcImNvbXBvbmVudC5jb2xsZWN0aW9uXCIpLFxuICAgICAgZ2V0TG9hZGluZ1N0YXRzOiAoKSA9PiAoe1xuICAgICAgICBwZW5kaW5nUmVxdWVzdHM6IGFjdGl2ZUxvYWRDb3VudCxcbiAgICAgICAgY29tcGxldGVkUmVxdWVzdHM6IGNvbXBsZXRlZExvYWRzLFxuICAgICAgICBmYWlsZWRSZXF1ZXN0czogZmFpbGVkTG9hZHMsXG4gICAgICAgIGNhbmNlbGxlZFJlcXVlc3RzOiBjYW5jZWxsZWRMb2FkcyxcbiAgICAgICAgY3VycmVudFZlbG9jaXR5LFxuICAgICAgICBjYW5Mb2FkOiBjYW5Mb2FkKCksXG4gICAgICAgIHF1ZXVlZFJlcXVlc3RzOiBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCxcbiAgICAgIH0pLFxuICAgICAgLy8gVG90YWwgaXRlbXMgbWFuYWdlbWVudFxuICAgICAgZ2V0VG90YWxJdGVtczogKCkgPT4gdG90YWxJdGVtcyxcbiAgICAgIHNldFRvdGFsSXRlbXMsXG4gICAgICAvLyBDdXJzb3IgbWV0aG9kc1xuICAgICAgZ2V0Q3VycmVudEN1cnNvcjogKCkgPT4gY3VycmVudEN1cnNvcixcbiAgICAgIGdldEN1cnNvckZvclBhZ2U6IChwYWdlOiBudW1iZXIpID0+IGN1cnNvck1hcC5nZXQocGFnZSkgfHwgbnVsbCxcbiAgICAgIC8vIFJlc2V0IG1ldGhvZCBmb3IgcmVsb2FkIGZ1bmN0aW9uYWxpdHlcbiAgICAgIHJlc2V0LFxuICAgIH07XG5cbiAgICAvLyBBbHNvIGVuc3VyZSBjb21wb25lbnQuaXRlbXMgaXMgdXBkYXRlZFxuICAgIGNvbXBvbmVudC5pdGVtcyA9IGl0ZW1zO1xuXG4gICAgLy8gQ2xlYW51cCBmdW5jdGlvbiAtIGNvbXByZWhlbnNpdmUgbWVtb3J5IGNsZWFudXBcbiAgICBjb25zdCBkZXN0cm95ID0gKCkgPT4ge1xuICAgICAgbG9nTWVtb3J5U3RhdHMoXCJkZXN0cm95OmJlZm9yZVwiKTtcblxuICAgICAgLy8gQWJvcnQgYWxsIGluLWZsaWdodCByZXF1ZXN0c1xuICAgICAgYWJvcnRDb250cm9sbGVycy5mb3JFYWNoKChjb250cm9sbGVyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gSWdub3JlIGFib3J0IGVycm9yc1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGFib3J0Q29udHJvbGxlcnMuY2xlYXIoKTtcblxuICAgICAgLy8gQ2xlYXIgYWxsIGRhdGEgc3RydWN0dXJlc1xuICAgICAgaXRlbXMubGVuZ3RoID0gMDtcbiAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoID0gMDtcbiAgICAgIGxvYWRlZFJhbmdlcy5jbGVhcigpO1xuICAgICAgcGVuZGluZ1Jhbmdlcy5jbGVhcigpO1xuICAgICAgZmFpbGVkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICBhY3RpdmVMb2FkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICBhY3RpdmVSZXF1ZXN0cy5jbGVhcigpO1xuICAgICAgY3Vyc29yTWFwLmNsZWFyKCk7XG4gICAgICBwYWdlVG9PZmZzZXRNYXAuY2xlYXIoKTtcblxuICAgICAgLy8gUmVzZXQgc3RhdGVcbiAgICAgIHRvdGFsSXRlbXMgPSAwO1xuICAgICAgY3VycmVudEN1cnNvciA9IG51bGw7XG4gICAgICBoaWdoZXN0TG9hZGVkUGFnZSA9IDA7XG4gICAgICBkaXNjb3ZlcmVkVG90YWwgPSBudWxsO1xuICAgICAgaGFzUmVhY2hlZEVuZCA9IGZhbHNlO1xuXG4gICAgICAvLyBDbGVhciBjb21wb25lbnQgcmVmZXJlbmNlXG4gICAgICBpZiAoY29tcG9uZW50Lml0ZW1zID09PSBpdGVtcykge1xuICAgICAgICBjb21wb25lbnQuaXRlbXMgPSBbXTtcbiAgICAgIH1cblxuICAgICAgbG9nTWVtb3J5U3RhdHMoXCJkZXN0cm95OmFmdGVyXCIpO1xuICAgIH07XG5cbiAgICAvLyBXaXJlIGRlc3Ryb3kgaW50byB0aGUgY29tcG9uZW50J3MgZGVzdHJveSBjaGFpblxuICAgIHdyYXBEZXN0cm95KGNvbXBvbmVudCwgZGVzdHJveSk7XG5cbiAgICAvLyBSZXR1cm4gZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIGNvbGxlY3Rpb246IHtcbiAgICAgICAgLy8gRGF0YSBhY2Nlc3MgbWV0aG9kc1xuICAgICAgICBpdGVtcyxcbiAgICAgICAgZ2V0SXRlbXM6ICgpID0+IGl0ZW1zLFxuICAgICAgICBnZXRJdGVtOiAoaW5kZXg6IG51bWJlcikgPT4gaXRlbXNbaW5kZXhdLFxuICAgICAgICAvLyBMb2FkaW5nIG1ldGhvZHNcbiAgICAgICAgbG9hZFJhbmdlLFxuICAgICAgICBsb2FkTWlzc2luZ1JhbmdlczogKFxuICAgICAgICAgIHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0sXG4gICAgICAgICAgY2FsbGVyPzogc3RyaW5nLFxuICAgICAgICApID0+IGxvYWRNaXNzaW5nUmFuZ2VzKHJhbmdlLCBjYWxsZXIgfHwgXCJyZXR1cm4uY29sbGVjdGlvblwiKSxcbiAgICAgICAgZ2V0TG9hZGVkUmFuZ2VzOiAoKSA9PiBsb2FkZWRSYW5nZXMsXG4gICAgICAgIGdldFBlbmRpbmdSYW5nZXM6ICgpID0+IHBlbmRpbmdSYW5nZXMsXG4gICAgICAgIGNsZWFyRmFpbGVkUmFuZ2VzOiAoKSA9PiBmYWlsZWRSYW5nZXMuY2xlYXIoKSxcbiAgICAgICAgY2xlYXJRdWV1ZSxcbiAgICAgICAgc2V0TWFudWFsbHlMb2FkZWQsXG4gICAgICAgIHNldFJlbG9hZEluUHJvZ3Jlc3MsXG4gICAgICAgIHJldHJ5RmFpbGVkUmFuZ2UsXG4gICAgICAgIHNldFRvdGFsSXRlbXMsXG4gICAgICAgIGdldFRvdGFsSXRlbXM6ICgpID0+IHRvdGFsSXRlbXMsXG4gICAgICAgIC8vIEN1cnNvci1zcGVjaWZpYyBtZXRob2RzXG4gICAgICAgIGdldEN1cnJlbnRDdXJzb3I6ICgpID0+IGN1cnJlbnRDdXJzb3IsXG4gICAgICAgIGdldEN1cnNvckZvclBhZ2U6IChwYWdlOiBudW1iZXIpID0+IGN1cnNvck1hcC5nZXQocGFnZSkgfHwgbnVsbCxcbiAgICAgICAgLy8gUmVzZXQgbWV0aG9kIGZvciByZWxvYWQgZnVuY3Rpb25hbGl0eVxuICAgICAgICByZXNldCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbn1cbiIsCiAgICAiLy8gc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvcGxhY2Vob2xkZXJzLnRzXG5cbi8qKlxuICogUGxhY2Vob2xkZXIgRmVhdHVyZSAtIFNtYXJ0IHBsYWNlaG9sZGVyIGdlbmVyYXRpb25cbiAqIEFuYWx5emVzIGZpcnN0IGxvYWRlZCBkYXRhIHRvIGdlbmVyYXRlIHJlYWxpc3RpYyBtYXNrZWQgcGxhY2Vob2xkZXJzXG4gKiBTaG93cyBwbGFjZWhvbGRlcnMgd2hpbGUgZGF0YSBpcyBsb2FkaW5nXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgQ29sbGVjdGlvbkNvbXBvbmVudCB9IGZyb20gXCIuL2NvbGxlY3Rpb25cIjtcbmltcG9ydCB7IFZJRVdQT1JUX0NPTlNUQU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBwbGFjZWhvbGRlciBmZWF0dXJlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGxhY2Vob2xkZXJDb25maWcge1xuICBlbmFibGVkPzogYm9vbGVhbjtcbiAgYW5hbHl6ZUZpcnN0TG9hZD86IGJvb2xlYW47XG4gIG1hc2tDaGFyYWN0ZXI/OiBzdHJpbmc7XG4gIHJhbmRvbUxlbmd0aFZhcmlhbmNlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBGaWVsZCBzdHJ1Y3R1cmUgZm9yIHBsYWNlaG9sZGVyIGdlbmVyYXRpb25cbiAqL1xuaW50ZXJmYWNlIEZpZWxkU3RydWN0dXJlIHtcbiAgbWluTGVuZ3RoOiBudW1iZXI7XG4gIG1heExlbmd0aDogbnVtYmVyO1xuICBhdmdMZW5ndGg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGFjZWhvbGRlckNvbXBvbmVudCB7XG4gIHBsYWNlaG9sZGVyczoge1xuICAgIGFuYWx5emVEYXRhU3RydWN0dXJlOiAoaXRlbXM6IGFueVtdKSA9PiB2b2lkO1xuICAgIGhhc0FuYWx5emVkU3RydWN0dXJlOiAoKSA9PiBib29sZWFuO1xuICAgIGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtOiAoaW5kZXg6IG51bWJlcikgPT4gYW55O1xuICAgIGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtczogKHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pID0+IGFueVtdO1xuICAgIHNob3dQbGFjZWhvbGRlcnM6IChyYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9KSA9PiB2b2lkO1xuICAgIGlzUGxhY2Vob2xkZXI6IChpdGVtOiBhbnkpID0+IGJvb2xlYW47XG4gICAgcmVwbGFjZVBsYWNlaG9sZGVyczogKGl0ZW1zOiBhbnlbXSwgb2Zmc2V0OiBudW1iZXIpID0+IHZvaWQ7XG4gICAgY2xlYXI6ICgpID0+IHZvaWQ7XG4gIH07XG59XG5cbi8qKlxuICogQWRkcyBwbGFjZWhvbGRlciBmdW5jdGlvbmFsaXR5IHRvIHZpZXdwb3J0IGNvbXBvbmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFBsYWNlaG9sZGVycyhjb25maWc6IFBsYWNlaG9sZGVyQ29uZmlnID0ge30pIHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgQ29sbGVjdGlvbkNvbXBvbmVudD4oXG4gICAgY29tcG9uZW50OiBUXG4gICk6IFQgJiBQbGFjZWhvbGRlckNvbXBvbmVudCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgZW5hYmxlZCA9IHRydWUsXG4gICAgICBhbmFseXplRmlyc3RMb2FkID0gdHJ1ZSxcbiAgICAgIG1hc2tDaGFyYWN0ZXIgPSBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuTUFTS19DSEFSQUNURVIsXG4gICAgICByYW5kb21MZW5ndGhWYXJpYW5jZSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUlxuICAgICAgICAuUkFORE9NX0xFTkdUSF9WQVJJQU5DRSxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gU3RhdGVcbiAgICBsZXQgZmllbGRTdHJ1Y3R1cmVzOiBNYXA8c3RyaW5nLCBGaWVsZFN0cnVjdHVyZT4gfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaGFzQW5hbHl6ZWQgPSBmYWxzZTtcbiAgICBsZXQgcGxhY2Vob2xkZXJJZENvdW50ZXIgPSAwO1xuXG4gICAgLyoqXG4gICAgICogQW5hbHl6ZSBkYXRhIHN0cnVjdHVyZSBmcm9tIGZpcnN0IGxvYWRlZCBpdGVtc1xuICAgICAqL1xuICAgIGNvbnN0IGFuYWx5emVEYXRhU3RydWN0dXJlID0gKGl0ZW1zOiBhbnlbXSk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFlbmFibGVkIHx8IGhhc0FuYWx5emVkIHx8ICFpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYPCflI0gW1BMQUNFSE9MREVSU10gQW5hbHl6aW5nIGRhdGEgc3RydWN0dXJlIGZyb20gJHtpdGVtcy5sZW5ndGh9IGl0ZW1zYFxuICAgICAgLy8gKTtcblxuICAgICAgY29uc3Qgc3RydWN0dXJlcyA9IG5ldyBNYXA8c3RyaW5nLCBGaWVsZFN0cnVjdHVyZT4oKTtcbiAgICAgIGNvbnN0IHNhbXBsZVNpemUgPSBNYXRoLm1pbihcbiAgICAgICAgaXRlbXMubGVuZ3RoLFxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuTUFYX1NBTVBMRV9TSVpFXG4gICAgICApO1xuXG4gICAgICAvLyBBbmFseXplIGVhY2ggZmllbGQgYWNyb3NzIGFsbCBzYW1wbGUgaXRlbXNcbiAgICAgIGNvbnN0IGZpZWxkU3RhdHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyW10+KCk7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2FtcGxlU2l6ZTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgICAgaWYgKCFpdGVtIHx8IHR5cGVvZiBpdGVtICE9PSBcIm9iamVjdFwiKSBjb250aW51ZTtcblxuICAgICAgICBPYmplY3Qua2V5cyhpdGVtKS5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgIC8vIFNraXAgaW50ZXJuYWwgZmllbGRzXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZmllbGQuc3RhcnRzV2l0aChcIl9cIikgfHxcbiAgICAgICAgICAgIGZpZWxkID09PSBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuUExBQ0VIT0xERVJfRkxBR1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gU3RyaW5nKGl0ZW1bZmllbGRdIHx8IFwiXCIpO1xuICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcblxuICAgICAgICAgIGlmICghZmllbGRTdGF0cy5oYXMoZmllbGQpKSB7XG4gICAgICAgICAgICBmaWVsZFN0YXRzLnNldChmaWVsZCwgW10pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmaWVsZFN0YXRzLmdldChmaWVsZCkhLnB1c2gobGVuZ3RoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBzdGF0aXN0aWNzIGZvciBlYWNoIGZpZWxkXG4gICAgICBmaWVsZFN0YXRzLmZvckVhY2goKGxlbmd0aHMsIGZpZWxkKSA9PiB7XG4gICAgICAgIGlmIChsZW5ndGhzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IG1pbkxlbmd0aCA9IE1hdGgubWluKC4uLmxlbmd0aHMpO1xuICAgICAgICBjb25zdCBtYXhMZW5ndGggPSBNYXRoLm1heCguLi5sZW5ndGhzKTtcbiAgICAgICAgY29uc3QgYXZnTGVuZ3RoID0gTWF0aC5yb3VuZChcbiAgICAgICAgICBsZW5ndGhzLnJlZHVjZSgoc3VtLCBsZW4pID0+IHN1bSArIGxlbiwgMCkgLyBsZW5ndGhzLmxlbmd0aFxuICAgICAgICApO1xuXG4gICAgICAgIHN0cnVjdHVyZXMuc2V0KGZpZWxkLCB7XG4gICAgICAgICAgbWluTGVuZ3RoLFxuICAgICAgICAgIG1heExlbmd0aCxcbiAgICAgICAgICBhdmdMZW5ndGgsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGZpZWxkU3RydWN0dXJlcyA9IHN0cnVjdHVyZXM7XG4gICAgICBoYXNBbmFseXplZCA9IHRydWU7XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBg4pyFIFtQTEFDRUhPTERFUlNdIFN0cnVjdHVyZSBhbmFseXplZDpgLFxuICAgICAgLy8gICBPYmplY3QuZnJvbUVudHJpZXMoc3RydWN0dXJlcylcbiAgICAgIC8vICk7XG5cbiAgICAgIC8vIEVtaXQgZXZlbnRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpwbGFjZWhvbGRlcnMtc3RydWN0dXJlLWFuYWx5emVkXCIsIHtcbiAgICAgICAgc3RydWN0dXJlOiBPYmplY3QuZnJvbUVudHJpZXMoc3RydWN0dXJlcyksXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgYSBzaW5nbGUgcGxhY2Vob2xkZXIgaXRlbVxuICAgICAqL1xuICAgIGNvbnN0IGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtID0gKGluZGV4OiBudW1iZXIpOiBhbnkgPT4ge1xuICAgICAgY29uc3QgcGxhY2Vob2xkZXI6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICAgIGlkOiBgcGxhY2Vob2xkZXItJHtwbGFjZWhvbGRlcklkQ291bnRlcisrfWAsXG4gICAgICAgIFtWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuUExBQ0VIT0xERVJfRkxBR106IHRydWUsXG4gICAgICAgIF9pbmRleDogaW5kZXgsXG4gICAgICB9O1xuXG4gICAgICBpZiAoIWZpZWxkU3RydWN0dXJlcyB8fCBmaWVsZFN0cnVjdHVyZXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAvLyBObyBzdHJ1Y3R1cmUgYW5hbHl6ZWQgeWV0IC0gcmV0dXJuIGJhc2ljIHBsYWNlaG9sZGVyXG4gICAgICAgIHBsYWNlaG9sZGVyLmxhYmVsID0gbWFza0NoYXJhY3Rlci5yZXBlYXQoMTApO1xuICAgICAgICByZXR1cm4gcGxhY2Vob2xkZXI7XG4gICAgICB9XG5cbiAgICAgIC8vIEdlbmVyYXRlIGZpZWxkcyBiYXNlZCBvbiBhbmFseXplZCBzdHJ1Y3R1cmVcbiAgICAgIGZpZWxkU3RydWN0dXJlcy5mb3JFYWNoKChzdHJ1Y3R1cmUsIGZpZWxkKSA9PiB7XG4gICAgICAgIGxldCBsZW5ndGg6IG51bWJlcjtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgcmFuZG9tTGVuZ3RoVmFyaWFuY2UgJiZcbiAgICAgICAgICBzdHJ1Y3R1cmUubWluTGVuZ3RoICE9PSBzdHJ1Y3R1cmUubWF4TGVuZ3RoXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIFJhbmRvbSBsZW5ndGggd2l0aGluIHJhbmdlXG4gICAgICAgICAgbGVuZ3RoID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgIE1hdGgucmFuZG9tKCkgKiAoc3RydWN0dXJlLm1heExlbmd0aCAtIHN0cnVjdHVyZS5taW5MZW5ndGggKyAxKSArXG4gICAgICAgICAgICAgIHN0cnVjdHVyZS5taW5MZW5ndGhcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFVzZSBhdmVyYWdlIGxlbmd0aFxuICAgICAgICAgIGxlbmd0aCA9IHN0cnVjdHVyZS5hdmdMZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBzb21lIHZhcmlhdGlvbiB0byBtYWtlIGl0IGxvb2sgbW9yZSBuYXR1cmFsXG4gICAgICAgIGlmIChyYW5kb21MZW5ndGhWYXJpYW5jZSAmJiBNYXRoLnJhbmRvbSgpIDwgMC4zKSB7XG4gICAgICAgICAgbGVuZ3RoID0gTWF0aC5tYXgoMSwgbGVuZ3RoICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMykgLSAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBsYWNlaG9sZGVyW2ZpZWxkXSA9IG1hc2tDaGFyYWN0ZXIucmVwZWF0KGxlbmd0aCk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHBsYWNlaG9sZGVyO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBtdWx0aXBsZSBwbGFjZWhvbGRlciBpdGVtc1xuICAgICAqL1xuICAgIGNvbnN0IGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtcyA9IChyYW5nZToge1xuICAgICAgc3RhcnQ6IG51bWJlcjtcbiAgICAgIGVuZDogbnVtYmVyO1xuICAgIH0pOiBhbnlbXSA9PiB7XG4gICAgICBjb25zdCBpdGVtczogYW55W10gPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSByYW5nZS5zdGFydDsgaSA8PSByYW5nZS5lbmQ7IGkrKykge1xuICAgICAgICBpdGVtcy5wdXNoKGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtKGkpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVtcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2hvdyBwbGFjZWhvbGRlcnMgZm9yIGEgcmFuZ2VcbiAgICAgKi9cbiAgICBjb25zdCBzaG93UGxhY2Vob2xkZXJzID0gKHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pOiB2b2lkID0+IHtcbiAgICAgIGlmICghZW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBwbGFjZWhvbGRlcnMgPSBnZW5lcmF0ZVBsYWNlaG9sZGVySXRlbXMocmFuZ2UpO1xuXG4gICAgICAvLyBVcGRhdGUgaXRlbXMgYXJyYXlcbiAgICAgIGlmIChjb21wb25lbnQuaXRlbXMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbGFjZWhvbGRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHJhbmdlLnN0YXJ0ICsgaTtcbiAgICAgICAgICBpZiAoIWNvbXBvbmVudC5pdGVtc1tpbmRleF0pIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5pdGVtc1tpbmRleF0gPSBwbGFjZWhvbGRlcnNbaV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBg8J+UhCBbUExBQ0VIT0xERVJTXSBTaG93aW5nICR7cGxhY2Vob2xkZXJzLmxlbmd0aH0gcGxhY2Vob2xkZXJzIGZvciByYW5nZSAke3JhbmdlLnN0YXJ0fS0ke3JhbmdlLmVuZH1gXG4gICAgICApO1xuXG4gICAgICAvLyBFbWl0IGV2ZW50XG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6cGxhY2Vob2xkZXJzLXNob3duXCIsIHtcbiAgICAgICAgcmFuZ2UsXG4gICAgICAgIGNvdW50OiBwbGFjZWhvbGRlcnMubGVuZ3RoLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGFuIGl0ZW0gaXMgYSBwbGFjZWhvbGRlclxuICAgICAqL1xuICAgIGNvbnN0IGlzUGxhY2Vob2xkZXIgPSAoaXRlbTogYW55KTogYm9vbGVhbiA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBpdGVtICYmXG4gICAgICAgIHR5cGVvZiBpdGVtID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIGl0ZW1bVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLlBMQUNFSE9MREVSX0ZMQUddID09PSB0cnVlXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXBsYWNlIHBsYWNlaG9sZGVycyB3aXRoIHJlYWwgZGF0YVxuICAgICAqL1xuICAgIGNvbnN0IHJlcGxhY2VQbGFjZWhvbGRlcnMgPSAoaXRlbXM6IGFueVtdLCBvZmZzZXQ6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFjb21wb25lbnQuaXRlbXMpIHJldHVybjtcblxuICAgICAgbGV0IHJlcGxhY2VkQ291bnQgPSAwO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gb2Zmc2V0ICsgaTtcbiAgICAgICAgY29uc3QgY3VycmVudEl0ZW0gPSBjb21wb25lbnQuaXRlbXNbaW5kZXhdO1xuXG4gICAgICAgIGlmIChpc1BsYWNlaG9sZGVyKGN1cnJlbnRJdGVtKSkge1xuICAgICAgICAgIGNvbXBvbmVudC5pdGVtc1tpbmRleF0gPSBpdGVtc1tpXTtcbiAgICAgICAgICByZXBsYWNlZENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJlcGxhY2VkQ291bnQgPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGDinKggW1BMQUNFSE9MREVSU10gUmVwbGFjZWQgJHtyZXBsYWNlZENvdW50fSBwbGFjZWhvbGRlcnMgYXQgb2Zmc2V0ICR7b2Zmc2V0fWBcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBFbWl0IGV2ZW50XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpwbGFjZWhvbGRlcnMtcmVwbGFjZWRcIiwge1xuICAgICAgICAgIG9mZnNldCxcbiAgICAgICAgICBjb3VudDogcmVwbGFjZWRDb3VudCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENsZWFyIGFsbCBwbGFjZWhvbGRlciBzdGF0ZVxuICAgICAqL1xuICAgIGNvbnN0IGNsZWFyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgZmllbGRTdHJ1Y3R1cmVzID0gbnVsbDtcbiAgICAgIGhhc0FuYWx5emVkID0gZmFsc2U7XG4gICAgICBwbGFjZWhvbGRlcklkQ291bnRlciA9IDA7XG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgZnVuY3Rpb25cbiAgICBjb25zdCBpbml0aWFsaXplID0gKCkgPT4ge1xuICAgICAgaWYgKCFlbmFibGVkKSByZXR1cm47XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgZmlyc3QgZGF0YSBsb2FkIHRvIGFuYWx5emUgc3RydWN0dXJlXG4gICAgICBpZiAoYW5hbHl6ZUZpcnN0TG9hZCkge1xuICAgICAgICBjb25zdCBoYW5kbGVSYW5nZUxvYWRlZCA9IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoIWhhc0FuYWx5emVkICYmIGRhdGEuaXRlbXMgJiYgZGF0YS5pdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhbmFseXplRGF0YVN0cnVjdHVyZShkYXRhLml0ZW1zKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSZXBsYWNlIGFueSBwbGFjZWhvbGRlcnMgd2l0aCByZWFsIGRhdGFcbiAgICAgICAgICByZXBsYWNlUGxhY2Vob2xkZXJzKGRhdGEuaXRlbXMsIGRhdGEub2Zmc2V0KTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBoYW5kbGVSYW5nZUxvYWRlZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNob3cgaW5pdGlhbCBwbGFjZWhvbGRlcnMgaWYgY29uZmlndXJlZFxuICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGNvbXBvbmVudC5jb2xsZWN0aW9uPy5nZXRUb3RhbEl0ZW1zKCkgfHwgMDtcbiAgICAgIGlmICh0b3RhbEl0ZW1zID4gMCkge1xuICAgICAgICBjb25zdCBpbml0aWFsUmFuZ2UgPSB7XG4gICAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgICAgZW5kOiBNYXRoLm1pbihcbiAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVhfU0FNUExFX1NJWkUgLSAxLFxuICAgICAgICAgICAgdG90YWxJdGVtcyAtIDFcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgICBzaG93UGxhY2Vob2xkZXJzKGluaXRpYWxSYW5nZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIENsZWFudXAgZnVuY3Rpb25cbiAgICBjb25zdCBkZXN0cm95ID0gKCkgPT4ge1xuICAgICAgY2xlYXIoKTtcbiAgICB9O1xuXG4gICAgLy8gU3RvcmUgZnVuY3Rpb25zIGZvciB2aWV3cG9ydCB0byBjYWxsXG4gICAgKGNvbXBvbmVudCBhcyBhbnkpLl9wbGFjZWhvbGRlcnNJbml0aWFsaXplID0gaW5pdGlhbGl6ZTtcbiAgICAoY29tcG9uZW50IGFzIGFueSkuX3BsYWNlaG9sZGVyc0Rlc3Ryb3kgPSBkZXN0cm95O1xuXG4gICAgLy8gUmV0dXJuIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBwbGFjZWhvbGRlcnM6IHtcbiAgICAgICAgYW5hbHl6ZURhdGFTdHJ1Y3R1cmUsXG4gICAgICAgIGhhc0FuYWx5emVkU3RydWN0dXJlOiAoKSA9PiBoYXNBbmFseXplZCxcbiAgICAgICAgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW0sXG4gICAgICAgIGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtcyxcbiAgICAgICAgc2hvd1BsYWNlaG9sZGVycyxcbiAgICAgICAgaXNQbGFjZWhvbGRlcixcbiAgICAgICAgcmVwbGFjZVBsYWNlaG9sZGVycyxcbiAgICAgICAgY2xlYXIsXG4gICAgICB9LFxuICAgIH07XG4gIH07XG59XG4iLAogICAgIi8qKlxuICogUmVuZGVyaW5nIEZlYXR1cmUgLSBJdGVtIHJlbmRlcmluZyBhbmQgcG9zaXRpb25pbmcgZm9yIHZpZXdwb3J0XG4gKiBIYW5kbGVzIERPTSBlbGVtZW50IGNyZWF0aW9uLCBwb3NpdGlvbmluZywgcmVjeWNsaW5nLCBhbmQgdXBkYXRlc1xuICovXG5cbmltcG9ydCB7IGFkZENsYXNzLCByZW1vdmVDbGFzcywgaGFzQ2xhc3MgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBWSUVXUE9SVF9DT05TVEFOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBpc1BsYWNlaG9sZGVyLFxuICBnZXRWaWV3cG9ydFN0YXRlLFxuICB3cmFwSW5pdGlhbGl6ZSxcbiAgd3JhcERlc3Ryb3ksXG59IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBjcmVhdGVMYXlvdXQgfSBmcm9tIFwiLi4vLi4vbGF5b3V0XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyaW5nQ29uZmlnIHtcbiAgdGVtcGxhdGU/OiAoXG4gICAgaXRlbTogYW55LFxuICAgIGluZGV4OiBudW1iZXIsXG4gICkgPT4gc3RyaW5nIHwgSFRNTEVsZW1lbnQgfCBhbnlbXSB8IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIG92ZXJzY2FuPzogbnVtYmVyO1xuICBtZWFzdXJlSXRlbXM/OiBib29sZWFuO1xuICBlbmFibGVSZWN5Y2xpbmc/OiBib29sZWFuO1xuICBtYXhQb29sU2l6ZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIE1haW50YWluIERPTSBvcmRlciB0byBtYXRjaCB2aXN1YWwgaW5kZXggb3JkZXIuXG4gICAqIEVuYWJsZXMgQ1NTIHNlbGVjdG9ycyBsaWtlIDpmaXJzdC1jaGlsZCwgOm50aC1jaGlsZCgpIHRvIHdvcmsgY29ycmVjdGx5LlxuICAgKiBEZWZhdWx0OiB0cnVlXG4gICAqL1xuICBtYWludGFpbkRvbU9yZGVyPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFZpZXdwb3J0U3RhdGUge1xuICBzY3JvbGxQb3NpdGlvbjogbnVtYmVyO1xuICB0b3RhbEl0ZW1zOiBudW1iZXI7XG4gIGl0ZW1TaXplOiBudW1iZXI7XG4gIGNvbnRhaW5lclNpemU6IG51bWJlcjtcbiAgdmlydHVhbFRvdGFsU2l6ZTogbnVtYmVyO1xuICB2aXNpYmxlUmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfTtcbiAgaXRlbXNDb250YWluZXI6IEhUTUxFbGVtZW50IHwgbnVsbDtcbn1cblxuLyoqXG4gKiBSZW5kZXJpbmcgZmVhdHVyZSBmb3Igdmlld3BvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhSZW5kZXJpbmcgPSAoY29uZmlnOiBSZW5kZXJpbmdDb25maWcgPSB7fSkgPT4ge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBWaWV3cG9ydENvbXBvbmVudD4oY29tcG9uZW50OiBUKTogVCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgdGVtcGxhdGUsXG4gICAgICBvdmVyc2NhbiA9IDUsXG4gICAgICBtZWFzdXJlSXRlbXMgPSBmYWxzZSxcbiAgICAgIGVuYWJsZVJlY3ljbGluZyA9IHRydWUsXG4gICAgICBtYXhQb29sU2l6ZSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5SRU5ERVJJTkcuREVGQVVMVF9NQVhfUE9PTF9TSVpFLFxuICAgICAgbWFpbnRhaW5Eb21PcmRlciA9IHRydWUsXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIEhlbHBlciB0byBnZXQgaXRlbXMgZnJvbSBjb2xsZWN0aW9uIChzaW5nbGUgc291cmNlIG9mIHRydXRoKVxuICAgIGNvbnN0IGdldENvbGxlY3Rpb25JdGVtcyA9ICgpOiBhbnlbXSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbj8uaXRlbXMgfHwgKGNvbXBvbmVudCBhcyBhbnkpLml0ZW1zIHx8IFtdXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvLyBTdGF0ZVxuICAgIGNvbnN0IHJlbmRlcmVkRWxlbWVudHMgPSBuZXcgTWFwPG51bWJlciwgSFRNTEVsZW1lbnQ+KCk7XG4gICAgY29uc3QgZWxlbWVudFBvb2w6IEhUTUxFbGVtZW50W10gPSBbXTtcbiAgICBjb25zdCBwb29sU3RhdHMgPSB7IGNyZWF0ZWQ6IDAsIHJlY3ljbGVkOiAwLCBwb29sU2l6ZTogMCwgcmVsZWFzZWQ6IDAgfTtcblxuICAgIC8vIFN0b3JlIGxheW91dCByZXN1bHRzIGZvciBwcm9wZXIgY2xlYW51cCAocHJldmVudHMgbWVtb3J5IGxlYWspXG4gICAgY29uc3QgbGF5b3V0UmVzdWx0cyA9IG5ldyBXZWFrTWFwPEhUTUxFbGVtZW50LCB7IGRlc3Ryb3k6ICgpID0+IHZvaWQgfT4oKTtcblxuICAgIC8vIFJldXNhYmxlIHRlbXBsYXRlIGVsZW1lbnQgZm9yIEhUTUwgc3RyaW5nIHBhcnNpbmcgKG1vcmUgZWZmaWNpZW50IHRoYW4gZGl2KVxuICAgIGNvbnN0IHRlbXBsYXRlUGFyc2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuXG4gICAgbGV0IHZpZXdwb3J0U3RhdGU6IFZpZXdwb3J0U3RhdGUgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgY3VycmVudFZpc2libGVSYW5nZSA9IHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xuICAgIGxldCBsYXN0UmVuZGVyVGltZSA9IDA7XG4gICAgbGV0IGlzUmVtb3ZpbmdJdGVtID0gZmFsc2U7XG5cbiAgICAvLyBFbGVtZW50IHBvb2wgbWFuYWdlbWVudFxuICAgIGNvbnN0IGdldFBvb2xlZEVsZW1lbnQgPSAoKTogSFRNTEVsZW1lbnQgPT4ge1xuICAgICAgaWYgKGVuYWJsZVJlY3ljbGluZyAmJiBlbGVtZW50UG9vbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHBvb2xTdGF0cy5yZWN5Y2xlZCsrO1xuICAgICAgICByZXR1cm4gZWxlbWVudFBvb2wucG9wKCkhO1xuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBlbGVtZW50LmNsYXNzTmFtZSA9IFwibXRybC12aWV3cG9ydC1pdGVtXCI7XG4gICAgICBwb29sU3RhdHMuY3JlYXRlZCsrO1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlbGVhc2VFbGVtZW50ID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCA9PiB7XG4gICAgICBwb29sU3RhdHMucmVsZWFzZWQrKztcblxuICAgICAgLy8gQ1JJVElDQUw6IENhbGwgZGVzdHJveSBvbiBsYXlvdXRSZXN1bHQgdG8gY2xlYW4gdXAgY29tcG9uZW50cyBhbmQgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAvLyBUaGlzIGZpeGVzIHRoZSBtZW1vcnkgbGVhayB3aGVuIHVzaW5nIGxheW91dCB0ZW1wbGF0ZXNcbiAgICAgIGNvbnN0IGxheW91dFJlc3VsdCA9IGxheW91dFJlc3VsdHMuZ2V0KGVsZW1lbnQpO1xuICAgICAgaWYgKGxheW91dFJlc3VsdCAmJiB0eXBlb2YgbGF5b3V0UmVzdWx0LmRlc3Ryb3kgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxheW91dFJlc3VsdC5kZXN0cm95KCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBJZ25vcmUgZGVzdHJveSBlcnJvcnMgLSBlbGVtZW50IG1heSBhbHJlYWR5IGJlIGNsZWFuZWQgdXBcbiAgICAgICAgfVxuICAgICAgICBsYXlvdXRSZXN1bHRzLmRlbGV0ZShlbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbmFibGVSZWN5Y2xpbmcpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gQ2xlYW4gZWxlbWVudCBmb3IgcmV1c2UgKG5vIGNsb25pbmcgLSByZXVzZSB0aGUgYWN0dWFsIGVsZW1lbnQpXG4gICAgICBlbGVtZW50LmNsYXNzTmFtZSA9IFwibXRybC12aWV3cG9ydC1pdGVtXCI7XG4gICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShcImRhdGEtaW5kZXhcIik7XG4gICAgICBlbGVtZW50LnN0eWxlLmNzc1RleHQgPSBcIlwiO1xuICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSBcIlwiO1xuXG4gICAgICAvLyBSZW1vdmUgZnJvbSBET00gZmlyc3RcbiAgICAgIGlmIChlbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgdG8gcG9vbCBpZiBub3QgZnVsbFxuICAgICAgaWYgKGVsZW1lbnRQb29sLmxlbmd0aCA8IG1heFBvb2xTaXplKSB7XG4gICAgICAgIGVsZW1lbnRQb29sLnB1c2goZWxlbWVudCk7XG4gICAgICAgIHBvb2xTdGF0cy5wb29sU2l6ZSA9IGVsZW1lbnRQb29sLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIC8vIElmIHBvb2wgaXMgZnVsbCwgZWxlbWVudCBpcyBqdXN0IGRlcmVmZXJlbmNlZCBhbmQgR0MnZFxuICAgIH07XG5cbiAgICAvLyBJbml0aWFsaXplXG4gICAgd3JhcEluaXRpYWxpemUoY29tcG9uZW50LCAoKSA9PiB7XG4gICAgICB2aWV3cG9ydFN0YXRlID0gZ2V0Vmlld3BvcnRTdGF0ZShjb21wb25lbnQpIGFzIFZpZXdwb3J0U3RhdGU7XG5cbiAgICAgIC8vIFNldCBpbml0aWFsIGl0ZW1zIGNvbnRhaW5lciBoZWlnaHQgZnJvbSBjdXJyZW50IHZpcnR1YWwgc2l6ZVxuICAgICAgaWYgKHZpZXdwb3J0U3RhdGU/Lml0ZW1zQ29udGFpbmVyICYmIHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZSA+IDApIHtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS5pdGVtc0NvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBgJHt2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemV9cHhgO1xuICAgICAgfVxuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGl0ZW0gdXBkYXRlIHJlcXVlc3RzIGZyb20gQVBJXG4gICAgICBjb21wb25lbnQub24/LihcIml0ZW06dXBkYXRlLXJlcXVlc3RcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB7IGluZGV4LCBpdGVtLCBwcmV2aW91c0l0ZW0gfSA9IGRhdGE7XG5cbiAgICAgICAgLy8gSXRlbSBpcyBhbHJlYWR5IHVwZGF0ZWQgaW4gY29sbGVjdGlvbi5pdGVtcyBieSBhcGkudHNcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGl0ZW0gaXMgY3VycmVudGx5IHJlbmRlcmVkXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGluZGV4KTtcbiAgICAgICAgY29uc3Qgd2FzVmlzaWJsZSA9ICEhZXhpc3RpbmdFbGVtZW50O1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGl0ZW0gd2FzIHNlbGVjdGVkIGJlZm9yZSB1cGRhdGVcbiAgICAgICAgY29uc3Qgd2FzU2VsZWN0ZWQgPSBleGlzdGluZ0VsZW1lbnRcbiAgICAgICAgICA/IGhhc0NsYXNzKFxuICAgICAgICAgICAgICBleGlzdGluZ0VsZW1lbnQsXG4gICAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5TRUxFQ1RJT04uU0VMRUNURURfQ0xBU1MsXG4gICAgICAgICAgICApIHx8IGhhc0NsYXNzKGV4aXN0aW5nRWxlbWVudCwgXCJtdHJsLXZpZXdwb3J0LWl0ZW0tLXNlbGVjdGVkXCIpXG4gICAgICAgICAgOiBmYWxzZTtcblxuICAgICAgICBpZiAoZXhpc3RpbmdFbGVtZW50ICYmIGV4aXN0aW5nRWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgLy8gUmUtcmVuZGVyIHRoZSBpdGVtXG4gICAgICAgICAgY29uc3QgbmV3RWxlbWVudCA9IHJlbmRlckl0ZW0oaXRlbSwgaW5kZXgpO1xuXG4gICAgICAgICAgaWYgKG5ld0VsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIENvcHkgcG9zaXRpb24gc3R5bGVzIGZyb20gZXhpc3RpbmcgZWxlbWVudFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihuZXdFbGVtZW50LnN0eWxlLCB7XG4gICAgICAgICAgICAgIHBvc2l0aW9uOiBleGlzdGluZ0VsZW1lbnQuc3R5bGUucG9zaXRpb24sXG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogZXhpc3RpbmdFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgd2lkdGg6IGV4aXN0aW5nRWxlbWVudC5zdHlsZS53aWR0aCxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBQcmVzZXJ2ZSBzZWxlY3RlZCBzdGF0ZVxuICAgICAgICAgICAgaWYgKHdhc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgIGFkZENsYXNzKG5ld0VsZW1lbnQsIFZJRVdQT1JUX0NPTlNUQU5UUy5TRUxFQ1RJT04uU0VMRUNURURfQ0xBU1MpO1xuICAgICAgICAgICAgICBhZGRDbGFzcyhuZXdFbGVtZW50LCBcIm10cmwtdmlld3BvcnQtaXRlbS0tc2VsZWN0ZWRcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCB1cGRhdGUgYW5pbWF0aW9uIGNsYXNzIHRvIGlubmVyIGNvbnRlbnQgZm9yIHZpc2liaWxpdHlcbiAgICAgICAgICAgIGFkZENsYXNzKG5ld0VsZW1lbnQsIFwidmlld3BvcnQtaXRlbS0tdXBkYXRlZFwiKTtcbiAgICAgICAgICAgIC8vIEFsc28gdHJ5IHRvIGFkZCB0byBmaXJzdCBjaGlsZCBpZiBpdCBleGlzdHMgKHRoZSBhY3R1YWwgaXRlbSBjb250ZW50KVxuICAgICAgICAgICAgY29uc3QgaW5uZXJJdGVtID0gbmV3RWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGlmIChpbm5lckl0ZW0pIHtcbiAgICAgICAgICAgICAgYWRkQ2xhc3MoaW5uZXJJdGVtLCBcIml0ZW0tLXVwZGF0ZWRcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlcGxhY2UgaW4gRE9NXG4gICAgICAgICAgICBleGlzdGluZ0VsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoXG4gICAgICAgICAgICAgIG5ld0VsZW1lbnQsXG4gICAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNldChpbmRleCwgbmV3RWxlbWVudCk7XG4gICAgICAgICAgICByZWxlYXNlRWxlbWVudChleGlzdGluZ0VsZW1lbnQpO1xuXG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGFuaW1hdGlvbiBjbGFzcyBhZnRlciB0cmFuc2l0aW9uXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MobmV3RWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtLS11cGRhdGVkXCIpO1xuICAgICAgICAgICAgICBpZiAoaW5uZXJJdGVtKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MoaW5uZXJJdGVtLCBcIml0ZW0tLXVwZGF0ZWRcIik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDUwMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBjb21wbGV0aW9uIGV2ZW50XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtOnVwZGF0ZWRcIiwge1xuICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgcHJldmlvdXNJdGVtLFxuICAgICAgICAgIHdhc1Zpc2libGUsXG4gICAgICAgICAgd2FzU2VsZWN0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgaXRlbSByZW1vdmUgcmVxdWVzdHMgZnJvbSBBUElcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiaXRlbTpyZW1vdmUtcmVxdWVzdFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIGl0ZW0gfSA9IGRhdGE7XG4gICAgICAgIGlzUmVtb3ZpbmdJdGVtID0gdHJ1ZTtcblxuICAgICAgICAvLyBJdGVtIGlzIGFscmVhZHkgcmVtb3ZlZCBmcm9tIGNvbGxlY3Rpb24uaXRlbXMgYnkgYXBpLnRzXG4gICAgICAgIC8vIFdlIGp1c3QgbmVlZCB0byB1cGRhdGUgcmVuZGVyZWQgZWxlbWVudHNcblxuICAgICAgICAvLyBSZW1vdmUgdGhlIHJlbmRlcmVkIGVsZW1lbnQgYXQgdGhpcyBpbmRleFxuICAgICAgICBjb25zdCBleGlzdGluZ0VsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnRzLmdldChpbmRleCk7XG4gICAgICAgIGlmIChleGlzdGluZ0VsZW1lbnQgJiYgZXhpc3RpbmdFbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICByZWxlYXNlRWxlbWVudChleGlzdGluZ0VsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcmVkRWxlbWVudHMuZGVsZXRlKGluZGV4KTtcblxuICAgICAgICAvLyBTaGlmdCByZW5kZXJlZCBlbGVtZW50cyBpbmRpY2VzIGRvd25cbiAgICAgICAgY29uc3QgcmVuZGVyZWRLZXlzID0gQXJyYXkuZnJvbShyZW5kZXJlZEVsZW1lbnRzLmtleXMoKSkuc29ydChcbiAgICAgICAgICAoYSwgYikgPT4gYSAtIGIsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IG5ld1JlbmRlcmVkRWxlbWVudHMgPSBuZXcgTWFwPG51bWJlciwgSFRNTEVsZW1lbnQ+KCk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHJlbmRlcmVkS2V5cykge1xuICAgICAgICAgIGlmIChrZXkgPiBpbmRleCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAvLyBVcGRhdGUgZGF0YS1pbmRleCBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgZWxlbWVudC5kYXRhc2V0LmluZGV4ID0gU3RyaW5nKGtleSAtIDEpO1xuICAgICAgICAgICAgICBuZXdSZW5kZXJlZEVsZW1lbnRzLnNldChrZXkgLSAxLCBlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGtleSA8IGluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50cy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgIG5ld1JlbmRlcmVkRWxlbWVudHMuc2V0KGtleSwgZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlbmRlcmVkRWxlbWVudHMuY2xlYXIoKTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBlbGVtZW50XSBvZiBuZXdSZW5kZXJlZEVsZW1lbnRzKSB7XG4gICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5zZXQoa2V5LCBlbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlY3JlbWVudCB0b3RhbEl0ZW1zIE5PVyBzbyByZW5kZXJJdGVtcygpIHVzZXMgdGhlIGNvcnJlY3QgY291bnRcbiAgICAgICAgLy8gc2V0VG90YWxJdGVtcygpIHdpbGwgYmUgY2FsbGVkIGxhdGVyIGJ5IHRoZSBBUEksIHdoaWNoIHdpbGwgZW1pdFxuICAgICAgICAvLyB2aWV3cG9ydDp0b3RhbC1pdGVtcy1jaGFuZ2VkIGZvciB2aXJ0dWFsIHNpemUgcmVjYWxjdWxhdGlvblxuICAgICAgICBpZiAodmlld3BvcnRTdGF0ZSAmJiB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgPiAwKSB7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zLS07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXNldCB2aXNpYmxlIHJhbmdlIHRvIGZvcmNlIHJlLXJlbmRlclxuICAgICAgICBjdXJyZW50VmlzaWJsZVJhbmdlID0geyBzdGFydDogLTEsIGVuZDogLTEgfTtcblxuICAgICAgICAvLyBFbWl0IGNvbXBsZXRpb24gZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW06cmVtb3ZlZFwiLCB7XG4gICAgICAgICAgaXRlbSxcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTk9URTogRG8gTk9UIGNsZWFyIGxvYWRlZFJhbmdlcyBvciBjYWxsIGxvYWRNaXNzaW5nUmFuZ2VzIGhlcmUhXG4gICAgICAgIC8vIFRoZSBpdGVtcyBhcnJheSBoYXMgYmVlbiBzcGxpY2VkIGluLXBsYWNlIGJ5IGFwaS50cywgc28gdGhlIGRhdGEgaXNcbiAgICAgICAgLy8gYWxyZWFkeSBpbiBtZW1vcnkuIFdoZW4gdGhlIHVzZXIgc2Nyb2xscyBhbmQgdGhlIHZpc2libGUgcmFuZ2UgY2hhbmdlcyxcbiAgICAgICAgLy8gdGhlIG5vcm1hbCB2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkIGhhbmRsZXIgd2lsbCBmZXRjaCBtaXNzaW5nIGRhdGEgaWYgbmVlZGVkLlxuICAgICAgICAvLyBDbGVhcmluZyBsb2FkZWRSYW5nZXMgaGVyZSB3b3VsZCB0cmlnZ2VyIGFuIHVubmVjZXNzYXJ5IGZldGNoIG9uIGV2ZXJ5IHJlbW92YWwuXG5cbiAgICAgICAgLy8gVHJpZ2dlciByZS1yZW5kZXIgKHVzZXMgZGF0YSBhbHJlYWR5IGluIG1lbW9yeSlcbiAgICAgICAgcmVuZGVySXRlbXMoKTtcbiAgICAgICAgaXNSZW1vdmluZ0l0ZW0gPSBmYWxzZTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGl0ZW1zIGFkZCByZXF1ZXN0cyBmcm9tIEFQSVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJpdGVtczphZGQtcmVxdWVzdFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaXRlbXM6IG5ld0l0ZW1zLCBwb3NpdGlvbiwgcHJldmlvdXNDb3VudCB9ID0gZGF0YTtcblxuICAgICAgICBpZiAoIW5ld0l0ZW1zIHx8IG5ld0l0ZW1zLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIEl0ZW1zIGFyZSBhbHJlYWR5IGFkZGVkIHRvIGNvbGxlY3Rpb24uaXRlbXMgYnkgYXBpLnRzXG4gICAgICAgIC8vIFdlIGp1c3QgbmVlZCB0byB1cGRhdGUgcmVuZGVyZWQgZWxlbWVudHMgaW5kaWNlcyBpZiBwcmVwZW5kaW5nXG5cbiAgICAgICAgY29uc3QgaXRlbXNBZGRlZCA9IG5ld0l0ZW1zLmxlbmd0aDtcblxuICAgICAgICBpZiAocG9zaXRpb24gPT09IFwic3RhcnRcIikge1xuICAgICAgICAgIC8vIEl0ZW1zIHdlcmUgcHJlcGVuZGVkIC0gc2hpZnQgcmVuZGVyZWQgZWxlbWVudCBpbmRpY2VzXG4gICAgICAgICAgY29uc3QgcmVuZGVyZWRLZXlzID0gQXJyYXkuZnJvbShyZW5kZXJlZEVsZW1lbnRzLmtleXMoKSkuc29ydChcbiAgICAgICAgICAgIChhLCBiKSA9PiBiIC0gYSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IG5ld1JlbmRlcmVkRWxlbWVudHMgPSBuZXcgTWFwPG51bWJlciwgSFRNTEVsZW1lbnQ+KCk7XG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgcmVuZGVyZWRLZXlzKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50cy5nZXQoa2V5KSE7XG4gICAgICAgICAgICBjb25zdCBuZXdJbmRleCA9IGtleSArIGl0ZW1zQWRkZWQ7XG4gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtaW5kZXhcIiwgU3RyaW5nKG5ld0luZGV4KSk7XG4gICAgICAgICAgICBuZXdSZW5kZXJlZEVsZW1lbnRzLnNldChuZXdJbmRleCwgZWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuY2xlYXIoKTtcbiAgICAgICAgICBuZXdSZW5kZXJlZEVsZW1lbnRzLmZvckVhY2goKGVsLCBpZHgpID0+XG4gICAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNldChpZHgsIGVsKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZvciBhcHBlbmQsIG5vIGluZGV4IHNoaWZ0aW5nIG5lZWRlZFxuXG4gICAgICAgIC8vIFVwZGF0ZSB0b3RhbEl0ZW1zIGluIHZpZXdwb3J0U3RhdGVcbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgPVxuICAgICAgICAgICAgKHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyB8fCAwKSArIGl0ZW1zQWRkZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXNldCB2aXNpYmxlIHJhbmdlIHRvIGZvcmNlIHJlLXJlbmRlclxuICAgICAgICBjdXJyZW50VmlzaWJsZVJhbmdlID0geyBzdGFydDogLTEsIGVuZDogLTEgfTtcblxuICAgICAgICAvLyBDbGVhciBsb2FkZWRSYW5nZXMgdG8gZW5zdXJlIHByb3BlciByZWxvYWQgdHJhY2tpbmdcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KT8uY29sbGVjdGlvbjtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24/LmdldExvYWRlZFJhbmdlcykge1xuICAgICAgICAgIGNvbnN0IGxvYWRlZFJhbmdlcyA9IGNvbGxlY3Rpb24uZ2V0TG9hZGVkUmFuZ2VzKCk7XG4gICAgICAgICAgbG9hZGVkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmlnZ2VyIHJlLXJlbmRlclxuICAgICAgICByZW5kZXJJdGVtcygpO1xuXG4gICAgICAgIC8vIEVtaXQgY29tcGxldGlvbiBldmVudFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiaXRlbXM6cmVuZGVyLWNvbXBsZXRlXCIsIHtcbiAgICAgICAgICBpdGVtczogbmV3SXRlbXMsXG4gICAgICAgICAgcG9zaXRpb24sXG4gICAgICAgICAgdG90YWw6IHZpZXdwb3J0U3RhdGU/LnRvdGFsSXRlbXMgfHwgMCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBjb2xsZWN0aW9uIGl0ZW1zIGV2aWN0ZWQgLSBjbGVhbiB1cCByZW5kZXJlZCBlbGVtZW50c1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJjb2xsZWN0aW9uOml0ZW1zLWV2aWN0ZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB7IGtlZXBTdGFydCwga2VlcEVuZCB9ID0gZGF0YTtcblxuICAgICAgICAvLyBSZWxlYXNlIHJlbmRlcmVkIGVsZW1lbnRzIG91dHNpZGUgdGhlIGtlZXAgcmFuZ2VcbiAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmIChpbmRleCA8IGtlZXBTdGFydCB8fCBpbmRleCA+IGtlZXBFbmQpIHtcbiAgICAgICAgICAgIHJlbGVhc2VFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5kZWxldGUoaW5kZXgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciByZWxvYWQ6c3RhcnQgdG8gcmVzZXQgZmVhdHVyZS1zcGVjaWZpYyBzdGF0ZVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJyZWxvYWQ6c3RhcnRcIiwgKCkgPT4ge1xuICAgICAgICAvLyBSZXNldCB2aXNpYmxlIHJhbmdlIHRyYWNraW5nXG4gICAgICAgIGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB7IHN0YXJ0OiAtMSwgZW5kOiAtMSB9O1xuICAgICAgICBsYXN0UmVuZGVyVGltZSA9IDA7XG4gICAgICAgIGlzUmVtb3ZpbmdJdGVtID0gZmFsc2U7XG5cbiAgICAgICAgLy8gQ2xlYXIgZWxlbWVudCBwb29sIHRvIGZyZWUgbWVtb3J5XG4gICAgICAgIGVsZW1lbnRQb29sLmxlbmd0aCA9IDA7XG4gICAgICAgIHBvb2xTdGF0cy5wb29sU2l6ZSA9IDA7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBjb2xsZWN0aW9uIHJlc2V0IHRvIGNsZWFyIHJlbmRlcmluZyBzdGF0ZVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJjb2xsZWN0aW9uOnJlc2V0XCIsICgpID0+IHtcbiAgICAgICAgLy8gUmVsZWFzZSBhbmQgY2xlYXIgYWxsIHJlbmRlcmVkIGVsZW1lbnRzXG4gICAgICAgIHJlbmRlcmVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgIHJlbGVhc2VFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5jbGVhcigpO1xuXG4gICAgICAgIC8vIFJlc2V0IHZpc2libGUgcmFuZ2UgdHJhY2tpbmdcbiAgICAgICAgY3VycmVudFZpc2libGVSYW5nZSA9IHsgc3RhcnQ6IC0xLCBlbmQ6IC0xIH07XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBwb29sIGNsZWFyIHJlcXVlc3QgKG9uIHJlbG9hZClcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6Y2xlYXItcG9vbFwiLCAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFyIGVsZW1lbnQgcG9vbCB0byBmcmVlIG1lbW9yeVxuICAgICAgICBlbGVtZW50UG9vbC5sZW5ndGggPSAwO1xuICAgICAgICBwb29sU3RhdHMucG9vbFNpemUgPSAwO1xuXG4gICAgICAgIC8vIFJlc2V0IGxhc3QgcmVuZGVyIHRpbWUgdG8gYXZvaWQgc3RhbGUgY2FsY3VsYXRpb25zXG4gICAgICAgIGxhc3RSZW5kZXJUaW1lID0gMDtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGNvbGxlY3Rpb24gZGF0YSBsb2FkZWRcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiY29sbGVjdGlvbjpyYW5nZS1sb2FkZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBpZiAoIWRhdGEuaXRlbXM/Lmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIEFuYWx5emUgZGF0YSBzdHJ1Y3R1cmUgb24gZmlyc3QgbG9hZFxuICAgICAgICBjb25zdCBwbGFjZWhvbGRlcnMgPSAoY29tcG9uZW50IGFzIGFueSkucGxhY2Vob2xkZXJzO1xuICAgICAgICBpZiAocGxhY2Vob2xkZXJzICYmICFwbGFjZWhvbGRlcnMuaGFzQW5hbHl6ZWRTdHJ1Y3R1cmUoKSkge1xuICAgICAgICAgIHBsYWNlaG9sZGVycy5hbmFseXplRGF0YVN0cnVjdHVyZShkYXRhLml0ZW1zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEl0ZW1zIGFyZSBhbHJlYWR5IGluIGNvbGxlY3Rpb24uaXRlbXMgLSByZXBsYWNlIGFueSBwbGFjZWhvbGRlciBET00gZWxlbWVudHNcbiAgICAgICAgZGF0YS5pdGVtcy5mb3JFYWNoKChpdGVtOiBhbnksIGk6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gZGF0YS5vZmZzZXQgKyBpO1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnRzLmdldChpbmRleCk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiBjdXJyZW50IHJlbmRlcmVkIGVsZW1lbnQgaXMgYSBwbGFjZWhvbGRlciB0aGF0IG5lZWRzIHJlcGxhY2luZ1xuICAgICAgICAgIC8vIE5vdGU6IFRoZSBhY3R1YWwgY2xhc3MgaGFzICdtdHJsLScgcHJlZml4LCBzbyBjaGVjayBmb3IgYm90aFxuICAgICAgICAgIGNvbnN0IGlzUGxhY2Vob2xkZXJFbGVtZW50ID1cbiAgICAgICAgICAgIGVsZW1lbnQ/LmNsYXNzTGlzdC5jb250YWlucyhWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuQ0xBU1MpIHx8XG4gICAgICAgICAgICBlbGVtZW50Py5jbGFzc0xpc3QuY29udGFpbnMoXG4gICAgICAgICAgICAgIGBtdHJsLSR7VklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLkNMQVNTfWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGlmIChpc1BsYWNlaG9sZGVyRWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgbmV3RWxlbWVudCA9IHJlbmRlckl0ZW0oaXRlbSwgaW5kZXgpO1xuICAgICAgICAgICAgaWYgKG5ld0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgLy8gUmVtb3ZlIHBsYWNlaG9sZGVyIGNsYXNzZXMgZnJvbSB3cmFwcGVyXG4gICAgICAgICAgICAgIHJlbW92ZUNsYXNzKG5ld0VsZW1lbnQsIFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5DTEFTUyk7XG4gICAgICAgICAgICAgIC8vIEFsc28gcmVtb3ZlIGZyb20gaW5uZXIgZWxlbWVudCAoZm9yIHN0cmluZyB0ZW1wbGF0ZXMpXG4gICAgICAgICAgICAgIGlmIChuZXdFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MoXG4gICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLkNMQVNTLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBBZGQgcmVwbGFjZWQgY2xhc3MgZm9yIGZhZGUtaW4gYW5pbWF0aW9uXG4gICAgICAgICAgICAgIGFkZENsYXNzKG5ld0VsZW1lbnQsIFwidmlld3BvcnQtaXRlbS0tcmVwbGFjZWRcIik7XG5cbiAgICAgICAgICAgICAgLy8gQ29weSBwb3NpdGlvbiBhbmQgcmVwbGFjZVxuICAgICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obmV3RWxlbWVudC5zdHlsZSwge1xuICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGVsZW1lbnQuc3R5bGUucG9zaXRpb24sXG4gICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IGVsZW1lbnQuc3R5bGUudHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgICAgd2lkdGg6IGVsZW1lbnQuc3R5bGUud2lkdGgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5wYXJlbnROb2RlPy5yZXBsYWNlQ2hpbGQobmV3RWxlbWVudCwgZWxlbWVudCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5zZXQoaW5kZXgsIG5ld0VsZW1lbnQpO1xuICAgICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJlbGVhc2VFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSByZXBsYWNlZCBjbGFzcyBhZnRlciBhbmltYXRpb24gY29tcGxldGVzXG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzKG5ld0VsZW1lbnQsIFwidmlld3BvcnQtaXRlbS0tcmVwbGFjZWRcIik7XG4gICAgICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyByZW5kZXJJdGVtIHJldHVybmVkIG51bGwgLSBzdGlsbCByZWxlYXNlIHRoZSBvbGQgZWxlbWVudFxuICAgICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJlbGVhc2VFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuZGVsZXRlKGluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8gcmVuZGVyIG5ldyBpdGVtcyAoaXRlbXMgdGhhdCB3ZXJlbid0IHJlbmRlcmVkIGF0IGFsbClcbiAgICAgICAgY29uc3QgeyB2aXNpYmxlUmFuZ2UgfSA9IHZpZXdwb3J0U3RhdGUgfHwge307XG4gICAgICAgIGlmICh2aXNpYmxlUmFuZ2UpIHtcbiAgICAgICAgICBjb25zdCByZW5kZXJTdGFydCA9IE1hdGgubWF4KDAsIHZpc2libGVSYW5nZS5zdGFydCAtIG92ZXJzY2FuKTtcbiAgICAgICAgICBjb25zdCByZW5kZXJFbmQgPSBNYXRoLm1pbihcbiAgICAgICAgICAgIHZpZXdwb3J0U3RhdGU/LnRvdGFsSXRlbXMgPz8gMCAtIDEsXG4gICAgICAgICAgICB2aXNpYmxlUmFuZ2UuZW5kICsgb3ZlcnNjYW4sXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBsb2FkZWRTdGFydCA9IGRhdGEub2Zmc2V0O1xuICAgICAgICAgIGNvbnN0IGxvYWRlZEVuZCA9IGRhdGEub2Zmc2V0ICsgZGF0YS5pdGVtcy5sZW5ndGggLSAxO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgbG9hZGVkIGRhdGEgb3ZlcmxhcHMgd2l0aCByZW5kZXIgcmFuZ2UgYW5kIHdlJ3JlIG1pc3NpbmcgcmVuZGVyZWQgZWxlbWVudHNcbiAgICAgICAgICBjb25zdCBuZWVkc1JlbmRlciA9XG4gICAgICAgICAgICBsb2FkZWRTdGFydCA8PSByZW5kZXJFbmQgJiZcbiAgICAgICAgICAgIGxvYWRlZEVuZCA+PSByZW5kZXJTdGFydCAmJlxuICAgICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5zaXplIDwgcmVuZGVyRW5kIC0gcmVuZGVyU3RhcnQgKyAxO1xuXG4gICAgICAgICAgaWYgKG5lZWRzUmVuZGVyKSByZW5kZXJJdGVtcygpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBldmVudHNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6cmFuZ2UtY2hhbmdlZFwiLCByZW5kZXJJdGVtcyk7XG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnNjcm9sbFwiLCB1cGRhdGVJdGVtUG9zaXRpb25zKTtcblxuICAgICAgLy8gVXBkYXRlIGl0ZW1zIGNvbnRhaW5lciBoZWlnaHQgd2hlbiB2aXJ0dWFsIHNpemUgY2hhbmdlc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDp2aXJ0dWFsLXNpemUtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlPy5pdGVtc0NvbnRhaW5lciAmJlxuICAgICAgICAgIGRhdGEudG90YWxWaXJ0dWFsU2l6ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuaXRlbXNDb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gYCR7ZGF0YS50b3RhbFZpcnR1YWxTaXplfXB4YDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZW1wbGF0ZSBoZWxwZXJzXG4gICAgY29uc3QgZ2V0RGVmYXVsdFRlbXBsYXRlID0gKCkgPT4gKGl0ZW06IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgLy8gVXNlIGxheW91dCBzeXN0ZW0gZm9yIGRlZmF1bHQgdGVtcGxhdGVcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0YWc6IFwiZGl2XCIsXG4gICAgICAgICAgY2xhc3M6IFwidmlld3BvcnQtaXRlbVwiLFxuICAgICAgICAgIHRleHQ6XG4gICAgICAgICAgICB0eXBlb2YgaXRlbSA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgICA/IGl0ZW0ubmFtZSB8fCBpdGVtLmxhYmVsIHx8IGl0ZW0udGV4dCB8fCBgSXRlbSAke2luZGV4fWBcbiAgICAgICAgICAgICAgOiBTdHJpbmcoaXRlbSksXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH07XG5cbiAgICAvLyBQcm9jZXNzIGxheW91dCBzY2hlbWEgd2l0aCBpdGVtIGRhdGEgc3Vic3RpdHV0aW9uXG4gICAgY29uc3QgcHJvY2Vzc0xheW91dFNjaGVtYSA9IChcbiAgICAgIHNjaGVtYTogYW55LFxuICAgICAgaXRlbTogYW55LFxuICAgICAgaW5kZXg6IG51bWJlcixcbiAgICApOiBhbnkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBzY2hlbWEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgLy8gSGFuZGxlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbiBsaWtlIHt7bmFtZX19LCB7e2luZGV4fX1cbiAgICAgICAgcmV0dXJuIHNjaGVtYS5yZXBsYWNlKC9cXHtcXHsoW159XSspXFx9XFx9L2csIChtYXRjaCwga2V5KSA9PiB7XG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJpbmRleFwiKSByZXR1cm4gU3RyaW5nKGluZGV4KTtcbiAgICAgICAgICBpZiAoa2V5ID09PSBcIml0ZW1cIikgcmV0dXJuIFN0cmluZyhpdGVtKTtcblxuICAgICAgICAgIC8vIEhhbmRsZSBuZXN0ZWQgcHJvcGVydGllcyBsaWtlIHt7dXNlci5uYW1lfX1cbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGtleS5zcGxpdChcIi5cIikucmVkdWNlKChvYmo6IGFueSwgcHJvcDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gb2JqPy5bcHJvcC50cmltKCldO1xuICAgICAgICAgIH0sIGl0ZW0pO1xuXG4gICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgPyBTdHJpbmcodmFsdWUpIDogbWF0Y2g7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEpKSB7XG4gICAgICAgIHJldHVybiBzY2hlbWEubWFwKChjaGlsZCkgPT4gcHJvY2Vzc0xheW91dFNjaGVtYShjaGlsZCwgaXRlbSwgaW5kZXgpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBzY2hlbWEgPT09IFwib2JqZWN0XCIgJiYgc2NoZW1hICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHByb2Nlc3NlZDogYW55ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNjaGVtYSkpIHtcbiAgICAgICAgICBwcm9jZXNzZWRba2V5XSA9IHByb2Nlc3NMYXlvdXRTY2hlbWEodmFsdWUsIGl0ZW0sIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvY2Vzc2VkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2NoZW1hO1xuICAgIH07XG5cbiAgICAvLyBQb3NpdGlvbiBjYWxjdWxhdGlvblxuICAgIGNvbnN0IGNhbGN1bGF0ZUl0ZW1Qb3NpdGlvbiA9IChcbiAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICBzY3JvbGxQb3NpdGlvbjogbnVtYmVyLFxuICAgICAgdG90YWxJdGVtczogbnVtYmVyLFxuICAgICAgaXRlbVNpemU6IG51bWJlcixcbiAgICAgIHZpcnR1YWxUb3RhbFNpemU6IG51bWJlcixcbiAgICAgIGNvbnRhaW5lclNpemU6IG51bWJlcixcbiAgICAgIHRhcmdldFNjcm9sbEluZGV4PzogbnVtYmVyLFxuICAgICk6IG51bWJlciA9PiB7XG4gICAgICBjb25zdCBhY3R1YWxUb3RhbFNpemUgPSB0b3RhbEl0ZW1zICogaXRlbVNpemU7XG4gICAgICBjb25zdCBpc0NvbXByZXNzZWQgPVxuICAgICAgICBhY3R1YWxUb3RhbFNpemUgPiB2aXJ0dWFsVG90YWxTaXplICYmIHZpcnR1YWxUb3RhbFNpemUgPiAwO1xuXG4gICAgICAvLyBJZiB3ZSBoYXZlIGEgdGFyZ2V0U2Nyb2xsSW5kZXggKGZyb20gaW5pdGlhbFNjcm9sbEluZGV4KSwgdXNlIGl0IGRpcmVjdGx5XG4gICAgICAvLyBUaGlzIGVuc3VyZXMgaXRlbXMgYXJlIHBvc2l0aW9uZWQgY29ycmVjdGx5IGV2ZW4gd2l0aCBjb21wcmVzc2lvblxuICAgICAgaWYgKHRhcmdldFNjcm9sbEluZGV4ICE9PSB1bmRlZmluZWQgJiYgdGFyZ2V0U2Nyb2xsSW5kZXggPiAwKSB7XG4gICAgICAgIC8vIFBvc2l0aW9uIGl0ZW1zIHJlbGF0aXZlIHRvIHRoZSB0YXJnZXQgaW5kZXhcbiAgICAgICAgLy8gVGhlIHRhcmdldCBpbmRleCBzaG91bGQgYXBwZWFyIGF0IHRoZSB0b3Agb2YgdGhlIHZpZXdwb3J0XG4gICAgICAgIHJldHVybiAoaW5kZXggLSB0YXJnZXRTY3JvbGxJbmRleCkgKiBpdGVtU2l6ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc0NvbXByZXNzZWQgfHwgdG90YWxJdGVtcyA9PT0gMCkge1xuICAgICAgICByZXR1cm4gaW5kZXggKiBpdGVtU2l6ZSAtIHNjcm9sbFBvc2l0aW9uO1xuICAgICAgfVxuXG4gICAgICAvLyBDb21wcmVzc2VkIHNwYWNlIGhhbmRsaW5nXG4gICAgICBjb25zdCBtYXhTY3JvbGxQb3NpdGlvbiA9IHZpcnR1YWxUb3RhbFNpemUgLSBjb250YWluZXJTaXplO1xuICAgICAgY29uc3QgZGlzdGFuY2VGcm9tQm90dG9tID0gbWF4U2Nyb2xsUG9zaXRpb24gLSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgIGNvbnN0IG5lYXJCb3R0b21UaHJlc2hvbGQgPSBjb250YWluZXJTaXplO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGRpc3RhbmNlRnJvbUJvdHRvbSA8PSBuZWFyQm90dG9tVGhyZXNob2xkICYmXG4gICAgICAgIGRpc3RhbmNlRnJvbUJvdHRvbSA+PSAtMVxuICAgICAgKSB7XG4gICAgICAgIC8vIE5lYXIgYm90dG9tIGludGVycG9sYXRpb25cbiAgICAgICAgY29uc3QgaXRlbXNBdEJvdHRvbSA9IE1hdGguZmxvb3IoY29udGFpbmVyU2l6ZSAvIGl0ZW1TaXplKTtcbiAgICAgICAgY29uc3QgZmlyc3RWaXNpYmxlQXRCb3R0b20gPSBNYXRoLm1heCgwLCB0b3RhbEl0ZW1zIC0gaXRlbXNBdEJvdHRvbSk7XG4gICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsVG90YWxTaXplO1xuICAgICAgICBjb25zdCBleGFjdFNjcm9sbEluZGV4ID0gc2Nyb2xsUmF0aW8gKiB0b3RhbEl0ZW1zO1xuICAgICAgICBjb25zdCBpbnRlcnBvbGF0aW9uID0gTWF0aC5tYXgoXG4gICAgICAgICAgMCxcbiAgICAgICAgICBNYXRoLm1pbigxLCAxIC0gZGlzdGFuY2VGcm9tQm90dG9tIC8gbmVhckJvdHRvbVRocmVzaG9sZCksXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgYm90dG9tUG9zaXRpb24gPSAoaW5kZXggLSBmaXJzdFZpc2libGVBdEJvdHRvbSkgKiBpdGVtU2l6ZTtcbiAgICAgICAgY29uc3Qgbm9ybWFsUG9zaXRpb24gPSAoaW5kZXggLSBleGFjdFNjcm9sbEluZGV4KSAqIGl0ZW1TaXplO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG5vcm1hbFBvc2l0aW9uICsgKGJvdHRvbVBvc2l0aW9uIC0gbm9ybWFsUG9zaXRpb24pICogaW50ZXJwb2xhdGlvblxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBOb3JtYWwgY29tcHJlc3NlZCBzY3JvbGxpbmdcbiAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsVG90YWxTaXplO1xuICAgICAgcmV0dXJuIChpbmRleCAtIHNjcm9sbFJhdGlvICogdG90YWxJdGVtcykgKiBpdGVtU2l6ZTtcbiAgICB9O1xuXG4gICAgLy8gUmVuZGVyIHNpbmdsZSBpdGVtXG4gICAgY29uc3QgcmVuZGVySXRlbSA9IChpdGVtOiBhbnksIGluZGV4OiBudW1iZXIpOiBIVE1MRWxlbWVudCB8IG51bGwgPT4ge1xuICAgICAgY29uc3QgaXRlbVRlbXBsYXRlID0gdGVtcGxhdGUgfHwgZ2V0RGVmYXVsdFRlbXBsYXRlKCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGl0ZW1UZW1wbGF0ZShpdGVtLCBpbmRleCk7XG4gICAgICAgIGxldCBlbGVtZW50OiBIVE1MRWxlbWVudDtcblxuICAgICAgICAvLyBDaGVjayBpZiByZXN1bHQgaXMgYSBsYXlvdXQgc2NoZW1hIChhcnJheSBvciBvYmplY3QpXG4gICAgICAgIGlmIChcbiAgICAgICAgICBBcnJheS5pc0FycmF5KHJlc3VsdCkgfHxcbiAgICAgICAgICAodHlwZW9mIHJlc3VsdCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgcmVzdWx0ICE9PSBudWxsICYmXG4gICAgICAgICAgICAhKHJlc3VsdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gUHJvY2VzcyBzY2hlbWEgdG8gc3Vic3RpdHV0ZSB2YXJpYWJsZXNcbiAgICAgICAgICBjb25zdCBwcm9jZXNzZWRTY2hlbWEgPSBwcm9jZXNzTGF5b3V0U2NoZW1hKHJlc3VsdCwgaXRlbSwgaW5kZXgpO1xuXG4gICAgICAgICAgLy8gVXNlIGxheW91dCBzeXN0ZW0gdG8gY3JlYXRlIGVsZW1lbnRcbiAgICAgICAgICBjb25zdCBsYXlvdXRSZXN1bHQgPSBjcmVhdGVMYXlvdXQocHJvY2Vzc2VkU2NoZW1hKTtcbiAgICAgICAgICBlbGVtZW50ID0gbGF5b3V0UmVzdWx0LmVsZW1lbnQ7XG5cbiAgICAgICAgICAvLyBJZiB0aGUgbGF5b3V0IGNyZWF0ZWQgYSB3cmFwcGVyLCB1c2UgaXQgZGlyZWN0bHlcbiAgICAgICAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAvLyBFbGVtZW50IGlzIGFscmVhZHkgY3JlYXRlZCBieSBsYXlvdXQgc3lzdGVtXG4gICAgICAgICAgICAvLyBTdG9yZSBsYXlvdXRSZXN1bHQgZm9yIGNsZWFudXAgd2hlbiBlbGVtZW50IGlzIHJlbGVhc2VkIChwcmV2ZW50cyBtZW1vcnkgbGVhaylcbiAgICAgICAgICAgIGxheW91dFJlc3VsdHMuc2V0KGVsZW1lbnQsIGxheW91dFJlc3VsdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZhbGxiYWNrIGlmIGxheW91dCBkaWRuJ3QgY3JlYXRlIGEgcHJvcGVyIGVsZW1lbnRcbiAgICAgICAgICAgIGVsZW1lbnQgPSBnZXRQb29sZWRFbGVtZW50KCk7XG4gICAgICAgICAgICBpZiAobGF5b3V0UmVzdWx0LmVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChsYXlvdXRSZXN1bHQuZWxlbWVudCk7XG4gICAgICAgICAgICAgIC8vIFN0b3JlIGxheW91dFJlc3VsdCBvbiB3cmFwcGVyIGVsZW1lbnQgZm9yIGNsZWFudXBcbiAgICAgICAgICAgICAgbGF5b3V0UmVzdWx0cy5zZXQoZWxlbWVudCwgbGF5b3V0UmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlc3VsdCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIC8vIFBhcnNlIEhUTUwgdXNpbmcgdGVtcGxhdGUgZWxlbWVudCAtIG9wdGltaXplZCBwYXRoXG4gICAgICAgICAgLy8gTW92ZSBub2RlcyBkaXJlY3RseSBpbnN0ZWFkIG9mIGNsb25pbmcgLSBtdWNoIGZhc3Rlciwgbm8gbWVtb3J5IG92ZXJoZWFkXG4gICAgICAgICAgdGVtcGxhdGVQYXJzZXIuaW5uZXJIVE1MID0gcmVzdWx0O1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSB0ZW1wbGF0ZVBhcnNlci5jb250ZW50O1xuXG4gICAgICAgICAgaWYgKGNvbnRlbnQuY2hpbGRyZW4ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAvLyBTaW5nbGUgcm9vdCBlbGVtZW50IC0gbW92ZSBkaXJlY3RseSAoZmFzdGVyIHRoYW4gY2xvbmVOb2RlKVxuICAgICAgICAgICAgZWxlbWVudCA9IGNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBjb250ZW50LnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xuICAgICAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgXCJtdHJsLXZpZXdwb3J0LWl0ZW1cIik7XG4gICAgICAgICAgICBpZiAoaXNQbGFjZWhvbGRlcihpdGVtKSkge1xuICAgICAgICAgICAgICBhZGRDbGFzcyhlbGVtZW50LCBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuQ0xBU1MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBNdWx0aXBsZSBjaGlsZHJlbiAtIG1vdmUgYWxsIGludG8gcG9vbGVkIGVsZW1lbnRcbiAgICAgICAgICAgIGVsZW1lbnQgPSBnZXRQb29sZWRFbGVtZW50KCk7XG4gICAgICAgICAgICB3aGlsZSAoY29udGVudC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY29udGVudC5maXJzdENoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgICBlbGVtZW50ID0gZ2V0UG9vbGVkRWxlbWVudCgpO1xuICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtSZW5kZXJpbmddIEludmFsaWQgdGVtcGxhdGUgcmVzdWx0IGZvciBpdGVtICR7aW5kZXh9YCk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgY2xhc3Nlc1xuICAgICAgICBpZiAoIWhhc0NsYXNzKGVsZW1lbnQsIFwidmlld3BvcnQtaXRlbVwiKSlcbiAgICAgICAgICBhZGRDbGFzcyhlbGVtZW50LCBcInZpZXdwb3J0LWl0ZW1cIik7XG4gICAgICAgIGlmIChpc1BsYWNlaG9sZGVyKGl0ZW0pKSB7XG4gICAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLkNMQVNTKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnQuZGF0YXNldC5pbmRleCA9IFN0cmluZyhpbmRleCk7XG5cbiAgICAgICAgLy8gQ29weSBkYXRhLWlkIGZyb20gaXRlbSB0byB2aWV3cG9ydCBlbGVtZW50IGZvciBzZWxlY3Rpb24gc3VwcG9ydFxuICAgICAgICBjb25zdCBpdGVtSWQgPSBpdGVtPy5faWQgfHwgaXRlbT8uaWQ7XG4gICAgICAgIGlmIChpdGVtSWQgIT09IHVuZGVmaW5lZCAmJiBpdGVtSWQgIT09IG51bGwpIHtcbiAgICAgICAgICBlbGVtZW50LmRhdGFzZXQuaWQgPSBTdHJpbmcoaXRlbUlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFtSZW5kZXJpbmddIEVycm9yIHJlbmRlcmluZyBpdGVtICR7aW5kZXh9OmAsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSBwb3NpdGlvbnNcbiAgICBjb25zdCB1cGRhdGVJdGVtUG9zaXRpb25zID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlIHx8IHJlbmRlcmVkRWxlbWVudHMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB7XG4gICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICBpdGVtU2l6ZTogaXRlbVNpemUsXG4gICAgICAgIHRvdGFsSXRlbXMsXG4gICAgICAgIHZpcnR1YWxUb3RhbFNpemUsXG4gICAgICAgIGNvbnRhaW5lclNpemUsXG4gICAgICB9ID0gdmlld3BvcnRTdGF0ZTtcbiAgICAgIGNvbnN0IGFjdHVhbFRvdGFsU2l6ZSA9IHRvdGFsSXRlbXMgKiBpdGVtU2l6ZTtcbiAgICAgIGNvbnN0IGlzQ29tcHJlc3NlZCA9XG4gICAgICAgIGFjdHVhbFRvdGFsU2l6ZSA+IHZpcnR1YWxUb3RhbFNpemUgJiYgdmlydHVhbFRvdGFsU2l6ZSA+IDA7XG5cbiAgICAgIGNvbnN0IHNvcnRlZEluZGljZXMgPSBBcnJheS5mcm9tKHJlbmRlcmVkRWxlbWVudHMua2V5cygpKS5zb3J0KFxuICAgICAgICAoYSwgYikgPT4gYSAtIGIsXG4gICAgICApO1xuICAgICAgaWYgKCFzb3J0ZWRJbmRpY2VzLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBmaXJzdEluZGV4ID0gc29ydGVkSW5kaWNlc1swXTtcbiAgICAgIGxldCBjdXJyZW50UG9zaXRpb24gPSAwO1xuXG4gICAgICBpZiAoaXNDb21wcmVzc2VkKSB7XG4gICAgICAgIGNvbnN0IG1heFNjcm9sbCA9IHZpcnR1YWxUb3RhbFNpemUgLSBjb250YWluZXJTaXplO1xuICAgICAgICBjb25zdCBkaXN0YW5jZUZyb21Cb3R0b20gPSBtYXhTY3JvbGwgLSBzY3JvbGxQb3NpdGlvbjtcblxuICAgICAgICBpZiAoZGlzdGFuY2VGcm9tQm90dG9tIDw9IGNvbnRhaW5lclNpemUgJiYgZGlzdGFuY2VGcm9tQm90dG9tID49IC0xKSB7XG4gICAgICAgICAgLy8gTmVhciBib3R0b20gaW50ZXJwb2xhdGlvblxuICAgICAgICAgIGNvbnN0IGl0ZW1zQXRCb3R0b20gPSBNYXRoLmZsb29yKGNvbnRhaW5lclNpemUgLyBpdGVtU2l6ZSk7XG4gICAgICAgICAgY29uc3QgZmlyc3RWaXNpYmxlQXRCb3R0b20gPSBNYXRoLm1heCgwLCB0b3RhbEl0ZW1zIC0gaXRlbXNBdEJvdHRvbSk7XG4gICAgICAgICAgY29uc3Qgc2Nyb2xsUmF0aW8gPSBzY3JvbGxQb3NpdGlvbiAvIHZpcnR1YWxUb3RhbFNpemU7XG4gICAgICAgICAgY29uc3QgZXhhY3RTY3JvbGxJbmRleCA9IHNjcm9sbFJhdGlvICogdG90YWxJdGVtcztcbiAgICAgICAgICBjb25zdCBpbnRlcnBvbGF0aW9uID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgTWF0aC5taW4oMSwgMSAtIGRpc3RhbmNlRnJvbUJvdHRvbSAvIGNvbnRhaW5lclNpemUpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBib3R0b21Qb3MgPSAoZmlyc3RJbmRleCAtIGZpcnN0VmlzaWJsZUF0Qm90dG9tKSAqIGl0ZW1TaXplO1xuICAgICAgICAgIGNvbnN0IG5vcm1hbFBvcyA9IChmaXJzdEluZGV4IC0gZXhhY3RTY3JvbGxJbmRleCkgKiBpdGVtU2l6ZTtcbiAgICAgICAgICBjdXJyZW50UG9zaXRpb24gPSBub3JtYWxQb3MgKyAoYm90dG9tUG9zIC0gbm9ybWFsUG9zKSAqIGludGVycG9sYXRpb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgc2Nyb2xsUmF0aW8gPSBzY3JvbGxQb3NpdGlvbiAvIHZpcnR1YWxUb3RhbFNpemU7XG4gICAgICAgICAgY3VycmVudFBvc2l0aW9uID0gKGZpcnN0SW5kZXggLSBzY3JvbGxSYXRpbyAqIHRvdGFsSXRlbXMpICogaXRlbVNpemU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnRQb3NpdGlvbiA9IGZpcnN0SW5kZXggKiBpdGVtU2l6ZSAtIHNjcm9sbFBvc2l0aW9uO1xuICAgICAgfVxuXG4gICAgICAvLyBQb3NpdGlvbiBlYWNoIGl0ZW1cbiAgICAgIHNvcnRlZEluZGljZXMuZm9yRWFjaCgoaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGluZGV4KTtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICBlbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKCR7TWF0aC5yb3VuZChcbiAgICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbixcbiAgICAgICAgICApfXB4KWA7XG5cbiAgICAgICAgICAvLyBTdHJhdGVnaWMgbG9nIGZvciBsYXN0IGl0ZW1zXG4gICAgICAgICAgLy8gaWYgKGluZGV4ID49IHRvdGFsSXRlbXMgLSA1KSB7XG4gICAgICAgICAgLy8gICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgICAgYFtSZW5kZXJpbmddIExhc3QgaXRlbSBwb3NpdGlvbmVkOiBpbmRleD0ke2luZGV4fSwgcG9zaXRpb249JHtNYXRoLnJvdW5kKFxuICAgICAgICAgIC8vICAgICAgIGN1cnJlbnRQb3NpdGlvblxuICAgICAgICAgIC8vICAgICApfXB4LCBpdGVtU2l6ZT0ke2l0ZW1TaXplfXB4LCB0b3RhbEl0ZW1zPSR7dG90YWxJdGVtc31gXG4gICAgICAgICAgLy8gICApO1xuICAgICAgICAgIC8vIH1cblxuICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbiArPSBpdGVtU2l6ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIE1haW4gcmVuZGVyIGZ1bmN0aW9uXG4gICAgY29uc3QgcmVuZGVySXRlbXMgPSAoKSA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGU/Lml0ZW1zQ29udGFpbmVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qge1xuICAgICAgICB2aXNpYmxlUmFuZ2UsXG4gICAgICAgIGl0ZW1zQ29udGFpbmVyLFxuICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICBpdGVtU2l6ZSxcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgIGNvbnRhaW5lclNpemUsXG4gICAgICAgIHZpcnR1YWxUb3RhbFNpemUsXG4gICAgICB9ID0gdmlld3BvcnRTdGF0ZTtcblxuICAgICAgLy8gVmFsaWRhdGUgcmFuZ2UgLSBza2lwIHJlbmRlcmluZyBpZiBubyBpdGVtcyBvciByYW5nZSBpcyBpbnZhbGlkXG4gICAgICBpZiAoXG4gICAgICAgICF2aXNpYmxlUmFuZ2UgfHxcbiAgICAgICAgdG90YWxJdGVtcyA8PSAwIHx8XG4gICAgICAgIHZpc2libGVSYW5nZS5zdGFydCA8IDAgfHxcbiAgICAgICAgdmlzaWJsZVJhbmdlLnN0YXJ0ID49IHRvdGFsSXRlbXMgfHxcbiAgICAgICAgdmlzaWJsZVJhbmdlLmVuZCA8IHZpc2libGVSYW5nZS5zdGFydCB8fFxuICAgICAgICBpc05hTih2aXNpYmxlUmFuZ2Uuc3RhcnQpIHx8XG4gICAgICAgIGlzTmFOKHZpc2libGVSYW5nZS5lbmQpXG4gICAgICApIHtcbiAgICAgICAgLy8gSWYgdG90YWxJdGVtcyBpcyAwLCBjbGVhciBhbGwgcmVuZGVyZWQgZWxlbWVudHMgdG8gcmVtb3ZlIHN0YWxlIHBsYWNlaG9sZGVyc1xuICAgICAgICBpZiAodG90YWxJdGVtcyA8PSAwICYmIHJlbmRlcmVkRWxlbWVudHMuc2l6ZSA+IDApIHtcbiAgICAgICAgICBBcnJheS5mcm9tKHJlbmRlcmVkRWxlbWVudHMuZW50cmllcygpKS5mb3JFYWNoKChbaW5kZXgsIGVsZW1lbnRdKSA9PiB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5wYXJlbnROb2RlKSByZWxlYXNlRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuZGVsZXRlKGluZGV4KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjdXJyZW50VmlzaWJsZVJhbmdlID0geyBzdGFydDogLTEsIGVuZDogLTEgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHJhbmdlIGNoYW5nZWRcbiAgICAgIGlmIChcbiAgICAgICAgdmlzaWJsZVJhbmdlLnN0YXJ0ID09PSBjdXJyZW50VmlzaWJsZVJhbmdlLnN0YXJ0ICYmXG4gICAgICAgIHZpc2libGVSYW5nZS5lbmQgPT09IGN1cnJlbnRWaXNpYmxlUmFuZ2UuZW5kICYmXG4gICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2l6ZSA+IDBcbiAgICAgICkge1xuICAgICAgICB1cGRhdGVJdGVtUG9zaXRpb25zKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGFzdFJlbmRlclRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgcmVuZGVyU3RhcnQgPSBNYXRoLm1heCgwLCB2aXNpYmxlUmFuZ2Uuc3RhcnQgLSBvdmVyc2Nhbik7XG4gICAgICBjb25zdCByZW5kZXJFbmQgPSBNYXRoLm1pbih0b3RhbEl0ZW1zIC0gMSwgdmlzaWJsZVJhbmdlLmVuZCArIG92ZXJzY2FuKTtcblxuICAgICAgLy8gaWYgKGlzUmVtb3ZpbmdJdGVtKSB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICAgIGBbUkVOREVSLUZJWF0gcmVuZGVySXRlbXMgY2FsYzogdmlzaWJsZVJhbmdlPSR7SlNPTi5zdHJpbmdpZnkodmlzaWJsZVJhbmdlKX0sIG92ZXJzY2FuPSR7b3ZlcnNjYW59LCB0b3RhbEl0ZW1zPSR7dG90YWxJdGVtc31gLFxuICAgICAgLy8gICApO1xuICAgICAgLy8gICBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgICBgW1JFTkRFUi1GSVhdIHJlbmRlckl0ZW1zIGNhbGM6IHJlbmRlclN0YXJ0PSR7cmVuZGVyU3RhcnR9LCByZW5kZXJFbmQ9JHtyZW5kZXJFbmR9YCxcbiAgICAgIC8vICAgKTtcbiAgICAgIC8vIH1cblxuICAgICAgLy8gUmVtb3ZlIGl0ZW1zIG91dHNpZGUgcmFuZ2VcbiAgICAgIGNvbnN0IHRvUmVtb3ZlID0gQXJyYXkuZnJvbShyZW5kZXJlZEVsZW1lbnRzLmVudHJpZXMoKSkuZmlsdGVyKFxuICAgICAgICAoW2luZGV4XSkgPT4gaW5kZXggPCByZW5kZXJTdGFydCB8fCBpbmRleCA+IHJlbmRlckVuZCxcbiAgICAgICk7XG5cbiAgICAgIHRvUmVtb3ZlLmZvckVhY2goKFtpbmRleCwgZWxlbWVudF0pID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSkgcmVsZWFzZUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgIHJlbmRlcmVkRWxlbWVudHMuZGVsZXRlKGluZGV4KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBHZXQgaXRlbXMgZnJvbSBjb2xsZWN0aW9uIChzaW5nbGUgc291cmNlIG9mIHRydXRoKVxuICAgICAgY29uc3QgaXRlbXMgPSBnZXRDb2xsZWN0aW9uSXRlbXMoKTtcbiAgICAgIGNvbnN0IG1pc3NpbmdJdGVtczogbnVtYmVyW10gPSBbXTtcblxuICAgICAgLy8gQ29sbGVjdCBuZXcgZWxlbWVudHMgdG8gaW5zZXJ0IChpbmRleCAtPiBlbGVtZW50KVxuICAgICAgY29uc3QgbmV3RWxlbWVudHM6IEFycmF5PFtudW1iZXIsIEhUTUxFbGVtZW50XT4gPSBbXTtcblxuICAgICAgLy8gUmVuZGVyIGl0ZW1zIGluIHJhbmdlXG4gICAgICBmb3IgKGxldCBpID0gcmVuZGVyU3RhcnQ7IGkgPD0gcmVuZGVyRW5kOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPCAwIHx8IGkgPj0gdG90YWxJdGVtcyB8fCByZW5kZXJlZEVsZW1lbnRzLmhhcyhpKSkgY29udGludWU7XG5cbiAgICAgICAgbGV0IGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgICAgbWlzc2luZ0l0ZW1zLnB1c2goaSk7XG4gICAgICAgICAgLy8gR2VuZXJhdGUgcGxhY2Vob2xkZXIgKHJlbmRlcmVkIGR5bmFtaWNhbGx5LCBub3Qgc3RvcmVkKVxuICAgICAgICAgIGNvbnN0IHBsYWNlaG9sZGVycyA9IChjb21wb25lbnQgYXMgYW55KS5wbGFjZWhvbGRlcnM7XG4gICAgICAgICAgaXRlbSA9IHBsYWNlaG9sZGVycz8uZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW0oaSkgfHwge1xuICAgICAgICAgICAgX3BsYWNlaG9sZGVyOiB0cnVlLFxuICAgICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgICBpZDogYHBsYWNlaG9sZGVyLSR7aX1gLFxuICAgICAgICAgICAgbmFtZTogVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLk1BU0tfQ0hBUkFDVEVSLnJlcGVhdCgxNSksXG4gICAgICAgICAgICB0ZXh0OiBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuTUFTS19DSEFSQUNURVIucmVwZWF0KDI1KSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuTUFTS19DSEFSQUNURVIucmVwZWF0KDQwKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHJlbmRlckl0ZW0oaXRlbSwgaSk7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgLy8gR2V0IHRhcmdldFNjcm9sbEluZGV4IGZyb20gdmlld3BvcnRTdGF0ZSBpZiBhdmFpbGFibGVcbiAgICAgICAgICBjb25zdCB0YXJnZXRTY3JvbGxJbmRleCA9ICh2aWV3cG9ydFN0YXRlIGFzIGFueSk/LnRhcmdldFNjcm9sbEluZGV4O1xuICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gY2FsY3VsYXRlSXRlbVBvc2l0aW9uKFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgICAgdG90YWxJdGVtcyxcbiAgICAgICAgICAgIGl0ZW1TaXplLFxuICAgICAgICAgICAgdmlydHVhbFRvdGFsU2l6ZSxcbiAgICAgICAgICAgIGNvbnRhaW5lclNpemUsXG4gICAgICAgICAgICB0YXJnZXRTY3JvbGxJbmRleCxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCB7XG4gICAgICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlWSgke3Bvc2l0aW9ufXB4KWAsXG4gICAgICAgICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBDb2xsZWN0IGZvciBiYXRjaCBpbnNlcnRpb24gKGlmIG1haW50YWluaW5nIG9yZGVyKSBvciBqdXN0IGFwcGVuZFxuICAgICAgICAgIGlmIChtYWludGFpbkRvbU9yZGVyKSB7XG4gICAgICAgICAgICBuZXdFbGVtZW50cy5wdXNoKFtpLCBlbGVtZW50XSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGl0ZW1zQ29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNldChpLCBlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBCYXRjaCBpbnNlcnQgbmV3IGVsZW1lbnRzIGluIGNvcnJlY3QgRE9NIG9yZGVyIChvbmx5IHdoZW4gbWFpbnRhaW5Eb21PcmRlciBpcyBlbmFibGVkKVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIENTUyBzZWxlY3RvcnMgbGlrZSA6Zmlyc3QtY2hpbGQsIDpudGgtY2hpbGQoKSB3b3JrIGNvcnJlY3RseVxuICAgICAgaWYgKG1haW50YWluRG9tT3JkZXIgJiYgbmV3RWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBTb3J0IG5ldyBlbGVtZW50cyBieSBpbmRleFxuICAgICAgICBuZXdFbGVtZW50cy5zb3J0KChbYV0sIFtiXSkgPT4gYSAtIGIpO1xuXG4gICAgICAgIC8vIEdldCBleGlzdGluZyBET00gY2hpbGRyZW4gc29ydGVkIGJ5IHRoZWlyIGRhdGEtaW5kZXhcbiAgICAgICAgY29uc3QgZXhpc3RpbmdDaGlsZHJlbiA9IEFycmF5LmZyb20oXG4gICAgICAgICAgaXRlbXNDb250YWluZXIuY2hpbGRyZW4sXG4gICAgICAgICkgYXMgSFRNTEVsZW1lbnRbXTtcblxuICAgICAgICAvLyBNZXJnZSBuZXcgZWxlbWVudHMgaW50byBjb3JyZWN0IHBvc2l0aW9uc1xuICAgICAgICBsZXQgbmV3SWR4ID0gMDtcbiAgICAgICAgbGV0IGV4aXN0aW5nSWR4ID0gMDtcblxuICAgICAgICB3aGlsZSAobmV3SWR4IDwgbmV3RWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgW25ld0luZGV4LCBuZXdFbGVtZW50XSA9IG5ld0VsZW1lbnRzW25ld0lkeF07XG5cbiAgICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBleGlzdGluZyBjaGlsZCB3aXRoIGluZGV4ID4gbmV3SW5kZXhcbiAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICBleGlzdGluZ0lkeCA8IGV4aXN0aW5nQ2hpbGRyZW4ubGVuZ3RoICYmXG4gICAgICAgICAgICBwYXJzZUludChleGlzdGluZ0NoaWxkcmVuW2V4aXN0aW5nSWR4XS5kYXRhc2V0LmluZGV4IHx8IFwiLTFcIiwgMTApIDxcbiAgICAgICAgICAgICAgbmV3SW5kZXhcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGV4aXN0aW5nSWR4Kys7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGV4aXN0aW5nSWR4IDwgZXhpc3RpbmdDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIEluc2VydCBiZWZvcmUgdGhlIGV4aXN0aW5nIGNoaWxkXG4gICAgICAgICAgICBpdGVtc0NvbnRhaW5lci5pbnNlcnRCZWZvcmUoXG4gICAgICAgICAgICAgIG5ld0VsZW1lbnQsXG4gICAgICAgICAgICAgIGV4aXN0aW5nQ2hpbGRyZW5bZXhpc3RpbmdJZHhdLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQXBwZW5kIGF0IHRoZSBlbmRcbiAgICAgICAgICAgIGl0ZW1zQ29udGFpbmVyLmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXdJZHgrKztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBSZXF1ZXN0IG1pc3NpbmcgaXRlbXNcbiAgICAgIGlmIChcbiAgICAgICAgbWlzc2luZ0l0ZW1zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uPy5sb2FkTWlzc2luZ1Jhbmdlc1xuICAgICAgKSB7XG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmxvYWRNaXNzaW5nUmFuZ2VzKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHN0YXJ0OiBNYXRoLm1pbiguLi5taXNzaW5nSXRlbXMpLFxuICAgICAgICAgICAgZW5kOiBNYXRoLm1heCguLi5taXNzaW5nSXRlbXMpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZW5kZXJpbmc6bWlzc2luZy1pdGVtc1wiLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50VmlzaWJsZVJhbmdlID0gdmlzaWJsZVJhbmdlO1xuXG4gICAgICAvLyBFbWl0IGl0ZW1zIHJlbmRlcmVkIGV2ZW50IHdpdGggZWxlbWVudHMgZm9yIHNpemUgY2FsY3VsYXRpb25cbiAgICAgIGNvbnN0IHJlbmRlcmVkRWxlbWVudHNBcnJheSA9IEFycmF5LmZyb20ocmVuZGVyZWRFbGVtZW50cy52YWx1ZXMoKSk7XG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6aXRlbXMtcmVuZGVyZWRcIiwge1xuICAgICAgICBlbGVtZW50czogcmVuZGVyZWRFbGVtZW50c0FycmF5LFxuICAgICAgICByYW5nZTogdmlzaWJsZVJhbmdlLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpyZW5kZXJlZFwiLCB7XG4gICAgICAgIHJhbmdlOiB2aXNpYmxlUmFuZ2UsXG4gICAgICAgIHJlbmRlcmVkQ291bnQ6IHJlbmRlcmVkRWxlbWVudHMuc2l6ZSxcbiAgICAgIH0pO1xuICAgICAgdXBkYXRlSXRlbVBvc2l0aW9ucygpO1xuXG4gICAgICAvLyBMb2FkIGRhdGEgaWYgbm8gaXRlbXMgcmVuZGVyZWRcbiAgICAgIGlmIChcbiAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5zaXplID09PSAwICYmXG4gICAgICAgIHRvdGFsSXRlbXMgPiAwICYmXG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydD8uY29sbGVjdGlvblxuICAgICAgKSB7XG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmxvYWRNaXNzaW5nUmFuZ2VzKFxuICAgICAgICAgIHZpc2libGVSYW5nZSxcbiAgICAgICAgICBcInJlbmRlcmluZzpuby1pdGVtc1wiLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBFeHRlbmQgdmlld3BvcnQgQVBJXG4gICAgY29uc3Qgb3JpZ2luYWxSZW5kZXJJdGVtcyA9IGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcztcbiAgICBjb21wb25lbnQudmlld3BvcnQucmVuZGVySXRlbXMgPSAoKSA9PiB7XG4gICAgICByZW5kZXJJdGVtcygpO1xuICAgICAgb3JpZ2luYWxSZW5kZXJJdGVtcz8uKCk7XG4gICAgfTtcblxuICAgIC8vIENsZWFudXBcbiAgICB3cmFwRGVzdHJveShjb21wb25lbnQsICgpID0+IHtcbiAgICAgIC8vIFJlbGVhc2UgYWxsIHJlbmRlcmVkIGVsZW1lbnRzIC0gdXNlIHJlbGVhc2VFbGVtZW50IHRvIHByb3Blcmx5IGRlc3Ryb3kgbGF5b3V0UmVzdWx0c1xuICAgICAgcmVuZGVyZWRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgIHJlbGVhc2VFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgfSk7XG4gICAgICByZW5kZXJlZEVsZW1lbnRzLmNsZWFyKCk7XG5cbiAgICAgIC8vIENsZWFyIGVsZW1lbnQgcG9vbFxuICAgICAgZWxlbWVudFBvb2wubGVuZ3RoID0gMDtcblxuICAgICAgLy8gUmVzZXQgc3RhdGVcbiAgICAgIGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB7IHN0YXJ0OiAtMSwgZW5kOiAtMSB9O1xuICAgICAgdmlld3BvcnRTdGF0ZSA9IG51bGw7XG4gICAgICBsYXN0UmVuZGVyVGltZSA9IDA7XG5cbiAgICAgIC8vIFJlc2V0IHBvb2wgc3RhdHNcbiAgICAgIHBvb2xTdGF0cy5jcmVhdGVkID0gMDtcbiAgICAgIHBvb2xTdGF0cy5yZWN5Y2xlZCA9IDA7XG4gICAgICBwb29sU3RhdHMucG9vbFNpemUgPSAwO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8qKlxuICogQG1vZHVsZSBjb3JlL2xheW91dC9zY2hlbWFcbiAqIEBkZXNjcmlwdGlvbiBVbmlmaWVkIGxheW91dCBzY2hlbWEgcHJvY2Vzc29yIHdpdGggaW50ZWdyYXRlZCBvcHRpbWl6YXRpb25zXG4gKiBDb25zb2xpZGF0ZXMgYXJyYXksIG9iamVjdCwgSlNYLCBhbmQgdGVtcGxhdGUgcHJvY2Vzc2luZyB3aXRoIGJ1aWx0LWluIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50c1xuICovXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRZUEVTIChFc3NlbnRpYWwgb25seSlcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBMYXlvdXRDb25maWcge1xuICAvKiogQmFzZSBsYXlvdXQgdHlwZSAqL1xuICB0eXBlPzogXCJzdGFja1wiIHwgXCJyb3dcIiB8IFwiZ3JpZFwiIHwgc3RyaW5nO1xuICAvKiogU3BhY2luZyBiZXR3ZWVuIGVsZW1lbnRzICovXG4gIGdhcD86IG51bWJlciB8IHN0cmluZztcbiAgLyoqIEFkZGl0aW9uYWwgQ1NTIGNsYXNzZXMgKi9cbiAgY2xhc3M/OiBzdHJpbmc7XG4gIC8qKiBBbGlnbm1lbnQgb2YgaXRlbXMgYWxvbmcgdGhlIGNyb3NzIGF4aXMgKi9cbiAgYWxpZ24/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiB8IFwic3RyZXRjaFwiO1xuICAvKiogQWxpZ25tZW50IG9mIGl0ZW1zIGFsb25nIHRoZSBtYWluIGF4aXMgKi9cbiAganVzdGlmeT86IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiIHwgXCJiZXR3ZWVuXCIgfCBcImFyb3VuZFwiIHwgXCJldmVubHlcIjtcbiAgLyoqIFdoZXRoZXIgYW5kIGhvdyBpdGVtcyBzaG91bGQgd3JhcCAqL1xuICB3cmFwPzogYm9vbGVhbiB8IFwicmV2ZXJzZVwiIHwgXCJub3dyYXBcIjtcbiAgLyoqIFdoZXRoZXIgcm93IGl0ZW1zIHNob3VsZCBzdGFjayB2ZXJ0aWNhbGx5IG9uIG1vYmlsZSAqL1xuICBtb2JpbGVTdGFjaz86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHJvdyBpdGVtcyBzaG91bGQgc2Nyb2xsIGhvcml6b250YWxseSBvbiBtb2JpbGUgKi9cbiAgbW9iaWxlU2Nyb2xsPzogYm9vbGVhbjtcbiAgLyoqIE51bWJlciBvZiBjb2x1bW5zIG9yIGF1dG9tYXRpYyBzaXppbmcgbWV0aG9kICovXG4gIGNvbHVtbnM/OiBudW1iZXIgfCBcImF1dG8tZml0XCIgfCBcImF1dG8tZmlsbFwiO1xuICAvKiogV2hldGhlciB0byB1c2UgZGVuc2UgcGFja2luZyBhbGdvcml0aG0gZm9yIGdyaWQgKi9cbiAgZGVuc2U/OiBib29sZWFuO1xuICAvKiogV2hldGhlciBncmlkIGl0ZW1zIHNob3VsZCBhZGp1c3QgaGVpZ2h0IGF1dG9tYXRpY2FsbHkgKi9cbiAgYXV0b0hlaWdodD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0SXRlbUNvbmZpZyB7XG4gIC8qKiBDb2x1bW4gd2lkdGggaW4gYSAxMi1jb2x1bW4gZ3JpZCAqL1xuICB3aWR0aD86IG51bWJlcjtcbiAgLyoqIFdpZHRoIG9uIHNtYWxsIHNjcmVlbnMgKi9cbiAgc20/OiBudW1iZXI7XG4gIC8qKiBXaWR0aCBvbiBtZWRpdW0gc2NyZWVucyAqL1xuICBtZD86IG51bWJlcjtcbiAgLyoqIFdpZHRoIG9uIGxhcmdlIHNjcmVlbnMgKi9cbiAgbGc/OiBudW1iZXI7XG4gIC8qKiBXaWR0aCBvbiBleHRyYS1sYXJnZSBzY3JlZW5zICovXG4gIHhsPzogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIGdyaWQgY29sdW1ucyB0byBzcGFuICovXG4gIHNwYW4/OiBudW1iZXI7XG4gIC8qKiBOdW1iZXIgb2YgZ3JpZCByb3dzIHRvIHNwYW4gKi9cbiAgcm93U3Bhbj86IG51bWJlcjtcbiAgLyoqIERpc3BsYXkgb3JkZXIgKi9cbiAgb3JkZXI/OiBudW1iZXIgfCBcImZpcnN0XCIgfCBcImxhc3RcIjtcbiAgLyoqIFNlbGYtYWxpZ25tZW50IHdpdGhpbiBjb250YWluZXIgKi9cbiAgYWxpZ24/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiB8IFwic3RyZXRjaFwiO1xuICAvKiogV2hldGhlciBpdGVtIHNob3VsZCBhdXRvbWF0aWNhbGx5IHNpemUgKi9cbiAgYXV0bz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0T3B0aW9ucyB7XG4gIC8qKiBEZWZhdWx0IGNyZWF0b3IgZnVuY3Rpb24gdG8gdXNlIGlmIG5vdCBzcGVjaWZpZWQgaW4gc2NoZW1hICovXG4gIGNyZWF0b3I/OiBGdW5jdGlvbjtcbiAgLyoqIFdoZXRoZXIgdG8gYXBwbHkgQ1NTIGNsYXNzIHByZWZpeCBAZGVmYXVsdCB0cnVlICovXG4gIHByZWZpeD86IGJvb2xlYW47XG4gIC8qKiBBZGRpdGlvbmFsIG9wdGlvbnMgKi9cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExheW91dFJlc3VsdCB7XG4gIC8qKiBUaGUgcmF3IGxheW91dCBvYmplY3Qgd2l0aCBhbGwgY29tcG9uZW50cyAqL1xuICBsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIC8qKiBSZWZlcmVuY2UgdG8gdGhlIHJvb3QgZWxlbWVudCBmb3IgY29udmVuaWVuY2UgKi9cbiAgZWxlbWVudDogSFRNTEVsZW1lbnQgfCBhbnk7XG4gIC8qKiBGbGF0dGVuZWQgY29tcG9uZW50IG1hcCAqL1xuICBjb21wb25lbnQ6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIC8qKiBHZXRzIGEgY29tcG9uZW50IGJ5IG5hbWUgKi9cbiAgZ2V0KG5hbWU6IHN0cmluZyk6IGFueTtcbiAgLyoqIEdldHMgYWxsIGNvbXBvbmVudHMgaW4gYSBmbGF0dGVuZWQgbWFwICovXG4gIGdldEFsbCgpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAvKiogRGVzdHJveXMgdGhlIGxheW91dCwgY2xlYW5pbmcgdXAgYWxsIGNvbXBvbmVudHMgKi9cbiAgZGVzdHJveSgpOiB2b2lkO1xufVxuXG50eXBlIENvbXBvbmVudExpa2UgPSB7IGVsZW1lbnQ6IEhUTUxFbGVtZW50OyBba2V5OiBzdHJpbmddOiBhbnkgfTtcbnR5cGUgU2NoZW1hSXRlbSA9IEZ1bmN0aW9uIHwgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55PiB8IFNjaGVtYUl0ZW1bXTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQlVJTFQtSU4gT1BUSU1JWkFUSU9OU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEZyYWdtZW50IFBvb2wgZm9yIGVmZmljaWVudCBEb2N1bWVudEZyYWdtZW50IHJldXNlXG4gKiBSZWR1Y2VzIEdDIHByZXNzdXJlIGluIGhpZ2gtZnJlcXVlbmN5IGxheW91dCBjcmVhdGlvbiBzY2VuYXJpb3NcbiAqL1xuY2xhc3MgRnJhZ21lbnRQb29sIHtcbiAgcHJpdmF0ZSBwb29sOiBEb2N1bWVudEZyYWdtZW50W10gPSBbXTtcbiAgcHJpdmF0ZSBtYXhTaXplID0gODsgLy8gT3B0aW1pemVkIHNpemUgZm9yIG1lbW9yeSBlZmZpY2llbmN5XG5cbiAgZ2V0KCk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIHJldHVybiB0aGlzLnBvb2wucG9wKCkgfHwgZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICB9XG5cbiAgcmVsZWFzZShmcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBvb2wubGVuZ3RoIDwgdGhpcy5tYXhTaXplICYmIGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnBvb2wucHVzaChmcmFnbWVudCk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5wb29sLmxlbmd0aCA9IDA7XG4gIH1cbn1cblxuY29uc3QgZnJhZ21lbnRQb29sID0gbmV3IEZyYWdtZW50UG9vbCgpO1xuXG4vKipcbiAqIENsYXNzIG5hbWUgY2FjaGUgZm9yIGxheW91dCBjb25maWd1cmF0aW9uc1xuICogUmVkdWNlcyBzdHJpbmcgb3BlcmF0aW9ucyBieSBjYWNoaW5nIGdlbmVyYXRlZCBjbGFzcyBuYW1lc1xuICovXG5jb25zdCBjbGFzc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuLy8gQ29uZmlndXJhdGlvbiBjb25zdGFudHNcbmNvbnN0IFBSRUZJWCA9IFwibXRybFwiOyAvLyBUT0RPOiBNYWtlIHRoaXMgY29uZmlndXJhYmxlXG5jb25zdCBQUkVGSVhfV0lUSF9EQVNIID0gYCR7UFJFRklYfS1gO1xuXG4vKipcbiAqIEdldHMgYSBjYWNoZWQgY2xhc3MgbmFtZSBmb3IgbGF5b3V0IGNvbmZpZ3VyYXRpb25cbiAqIE9wdGltaXplZCBmb3IgZGlmZmVyZW50IGNsYXNzIG5hbWluZyBwYXR0ZXJuc1xuICovXG5mdW5jdGlvbiBnZXRDYWNoZWRDbGFzc05hbWUoXG4gIHR5cGU6IHN0cmluZyxcbiAgcHJvcGVydHk6IHN0cmluZyxcbiAgdmFsdWU6IHN0cmluZyB8IG51bWJlcixcbik6IHN0cmluZyB7XG4gIGNvbnN0IGtleSA9IGAke3R5cGV9LSR7cHJvcGVydHl9LSR7dmFsdWV9YDtcbiAgaWYgKCFjbGFzc0NhY2hlLmhhcyhrZXkpKSB7XG4gICAgaWYgKHR5cGUgPT09IFwiaXRlbVwiKSB7XG4gICAgICBjbGFzc0NhY2hlLnNldChcbiAgICAgICAga2V5LFxuICAgICAgICBwcm9wZXJ0eSA9PT0gXCJcIlxuICAgICAgICAgID8gYGxheW91dF9faXRlbS0tJHt2YWx1ZX1gXG4gICAgICAgICAgOiBgbGF5b3V0X19pdGVtLS0ke3Byb3BlcnR5fS0ke3ZhbHVlfWAsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGb3IgbGF5b3V0IGNsYXNzZXMsIGFsaWduIHVzZXMgbGF5b3V0LS17dHlwZX0te3ZhbHVlfVxuICAgICAgLy8gYnV0IGp1c3RpZnkgYW5kIG90aGVycyB1c2UgbGF5b3V0LS17dHlwZX0te3Byb3BlcnR5fS17dmFsdWV9XG4gICAgICBpZiAocHJvcGVydHkgPT09IFwiYWxpZ25cIikge1xuICAgICAgICBjbGFzc0NhY2hlLnNldChrZXksIGBsYXlvdXQtLSR7dHlwZX0tJHt2YWx1ZX1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsYXNzQ2FjaGUuc2V0KGtleSwgYGxheW91dC0tJHt0eXBlfS0ke3Byb3BlcnR5fS0ke3ZhbHVlfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY2xhc3NDYWNoZS5nZXQoa2V5KSE7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE9QVElNSVpFRCBVVElMSVRJRVNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBhIGNvbXBvbmVudCBvYmplY3QgKGhhcyBhbiBlbGVtZW50IHByb3BlcnR5KVxuICovXG5mdW5jdGlvbiBpc0NvbXBvbmVudCh2YWx1ZTogYW55KTogdmFsdWUgaXMgQ29tcG9uZW50TGlrZSB7XG4gIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgXCJlbGVtZW50XCIgaW4gdmFsdWU7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRvY3VtZW50IGZyYWdtZW50IHVzaW5nIHBvb2xpbmcgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICovXG5mdW5jdGlvbiBjcmVhdGVGcmFnbWVudCgpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgcmV0dXJuIGZyYWdtZW50UG9vbC5nZXQoKTtcbn1cblxuLyoqXG4gKiBSZWxlYXNlcyBhIGZyYWdtZW50IGJhY2sgdG8gdGhlIHBvb2wgZm9yIHJldXNlXG4gKi9cbmZ1bmN0aW9uIHJlbGVhc2VGcmFnbWVudChmcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCk6IHZvaWQge1xuICBmcmFnbWVudFBvb2wucmVsZWFzZShmcmFnbWVudCk7XG59XG5cbi8qKlxuICogT3B0aW1pemVkIGNsYXNzIHByb2Nlc3Npbmcgd2l0aCBtaW5pbWFsIHN0cmluZyBvcGVyYXRpb25zXG4gKiBIYW5kbGVzIGFycmF5cywgc3RyaW5ncywgY2xhc3NOYW1lIGFsaWFzZXMsIGFuZCByYXdDbGFzcyBlZmZpY2llbnRseVxuICovXG5mdW5jdGlvbiBwcm9jZXNzQ2xhc3NOYW1lcyhcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PixcbiAgc2tpcFByZWZpeCA9IGZhbHNlLFxuKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIGlmICghb3B0aW9ucykgcmV0dXJuIG9wdGlvbnM7XG5cbiAgY29uc3QgaGFzUmF3Q2xhc3MgPSBvcHRpb25zLnJhd0NsYXNzO1xuICBjb25zdCBoYXNSZWd1bGFyQ2xhc3MgPSBvcHRpb25zLmNsYXNzIHx8IG9wdGlvbnMuY2xhc3NOYW1lO1xuXG4gIC8vIEZhc3QgcGF0aDogbm8gY2xhc3MgcHJvcGVydGllcyBhdCBhbGxcbiAgaWYgKCFoYXNSYXdDbGFzcyAmJiAhaGFzUmVndWxhckNsYXNzKSByZXR1cm4gb3B0aW9ucztcblxuICAvLyBGYXN0IHBhdGg6IG9ubHkgcmF3Q2xhc3MgYW5kIHNraXBwaW5nIHByZWZpeCAobW9zdCBjb21tb24gcmF3Q2xhc3Mgc2NlbmFyaW8pXG4gIGlmIChoYXNSYXdDbGFzcyAmJiAhaGFzUmVndWxhckNsYXNzICYmIHNraXBQcmVmaXgpIHtcbiAgICBjb25zdCBwcm9jZXNzZWQgPSB7IC4uLm9wdGlvbnMgfTtcbiAgICBkZWxldGUgcHJvY2Vzc2VkLnJhd0NsYXNzO1xuXG4gICAgLy8gRGlyZWN0IGFzc2lnbm1lbnQgZm9yIHNpbXBsZSBzdHJpbmdcbiAgICBpZiAodHlwZW9mIGhhc1Jhd0NsYXNzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBwcm9jZXNzZWQuY2xhc3MgPSBoYXNSYXdDbGFzcztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSGFuZGxlIGFycmF5IGNhc2VcbiAgICAgIHByb2Nlc3NlZC5jbGFzcyA9IGhhc1Jhd0NsYXNzLmpvaW4oXCIgXCIpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvY2Vzc2VkO1xuICB9XG5cbiAgLy8gRnVsbCBwcm9jZXNzaW5nIHBhdGggKG9ubHkgd2hlbiBuZWVkZWQpXG4gIGNvbnN0IHByb2Nlc3NlZCA9IHsgLi4ub3B0aW9ucyB9O1xuICBsZXQgZmluYWxDbGFzc2VzID0gXCJcIjtcblxuICAvLyBIYW5kbGUgcHJlZml4ZWQgY2xhc3NlcyBvbmx5IGlmIG5vdCBza2lwcGluZyBwcmVmaXhcbiAgaWYgKCFza2lwUHJlZml4ICYmIGhhc1JlZ3VsYXJDbGFzcykge1xuICAgIGxldCBwcmVmaXhlZFN0cmluZyA9IFwiXCI7XG5cbiAgICBpZiAocHJvY2Vzc2VkLmNsYXNzKSB7XG4gICAgICBwcmVmaXhlZFN0cmluZyArPSBBcnJheS5pc0FycmF5KHByb2Nlc3NlZC5jbGFzcylcbiAgICAgICAgPyBwcm9jZXNzZWQuY2xhc3Muam9pbihcIiBcIilcbiAgICAgICAgOiBwcm9jZXNzZWQuY2xhc3M7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzZWQuY2xhc3NOYW1lKSB7XG4gICAgICBwcmVmaXhlZFN0cmluZyArPSAocHJlZml4ZWRTdHJpbmcgPyBcIiBcIiA6IFwiXCIpICsgcHJvY2Vzc2VkLmNsYXNzTmFtZTtcbiAgICB9XG5cbiAgICBpZiAocHJlZml4ZWRTdHJpbmcpIHtcbiAgICAgIGZpbmFsQ2xhc3NlcyA9IHByZWZpeGVkU3RyaW5nXG4gICAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLm1hcCgoY2xzKSA9PlxuICAgICAgICAgIGNscy5zdGFydHNXaXRoKFBSRUZJWF9XSVRIX0RBU0gpID8gY2xzIDogUFJFRklYX1dJVEhfREFTSCArIGNscyxcbiAgICAgICAgKVxuICAgICAgICAuam9pbihcIiBcIik7XG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIHJhd0NsYXNzIChhbHdheXMgcHJvY2Vzc2VkIHdoZW4gcHJlc2VudClcbiAgaWYgKGhhc1Jhd0NsYXNzKSB7XG4gICAgY29uc3QgcmF3U3RyaW5nID0gQXJyYXkuaXNBcnJheShoYXNSYXdDbGFzcylcbiAgICAgID8gaGFzUmF3Q2xhc3MuZmlsdGVyKEJvb2xlYW4pLmpvaW4oXCIgXCIpXG4gICAgICA6IGhhc1Jhd0NsYXNzO1xuXG4gICAgZmluYWxDbGFzc2VzICs9IChmaW5hbENsYXNzZXMgPyBcIiBcIiA6IFwiXCIpICsgcmF3U3RyaW5nO1xuICB9XG5cbiAgaWYgKGZpbmFsQ2xhc3Nlcykge1xuICAgIHByb2Nlc3NlZC5jbGFzcyA9IGZpbmFsQ2xhc3NlcztcbiAgfVxuXG4gIC8vIENsZWFuIHVwIGluIG9uZSBvcGVyYXRpb25cbiAgZGVsZXRlIHByb2Nlc3NlZC5jbGFzc05hbWU7XG4gIGRlbGV0ZSBwcm9jZXNzZWQucmF3Q2xhc3M7XG5cbiAgcmV0dXJuIHByb2Nlc3NlZDtcbn1cblxuLyoqXG4gKiBPcHRpbWl6ZWQgcGFyYW1ldGVyIGV4dHJhY3Rpb24gZm9yIGFycmF5IHNjaGVtYXNcbiAqIFJlZHVjZXMgbXVsdGlwbGUgYXJyYXkgbG9va3VwcyB3aXRoIGJhdGNoIHByb2Nlc3NpbmdcbiAqL1xuaW50ZXJmYWNlIEV4dHJhY3RlZFBhcmFtZXRlcnMge1xuICBjcmVhdG9yOiBGdW5jdGlvbjtcbiAgbmFtZT86IHN0cmluZztcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgY29uc3VtZWQ6IG51bWJlcjtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFBhcmFtZXRlcnMoXG4gIHNjaGVtYTogU2NoZW1hSXRlbVtdLFxuICBzdGFydEluZGV4OiBudW1iZXIsXG4gIGRlZmF1bHRDcmVhdG9yOiBGdW5jdGlvbixcbik6IEV4dHJhY3RlZFBhcmFtZXRlcnMge1xuICBjb25zdCBpdGVtcyA9IHNjaGVtYS5zbGljZShzdGFydEluZGV4LCBzdGFydEluZGV4ICsgMyk7XG4gIGxldCBjcmVhdG9yLCBuYW1lLCBvcHRpb25zO1xuICBsZXQgY29uc3VtZWQgPSAxO1xuXG4gIGNvbnN0IFtmaXJzdCwgc2Vjb25kLCB0aGlyZF0gPSBpdGVtcztcblxuICBpZiAodHlwZW9mIGZpcnN0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjcmVhdG9yID0gZmlyc3Q7XG4gICAgaWYgKHR5cGVvZiBzZWNvbmQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG5hbWUgPSBzZWNvbmQ7XG4gICAgICBjb25zdW1lZCA9IDI7XG4gICAgICBpZiAoaXNPYmplY3QodGhpcmQpKSB7XG4gICAgICAgIG9wdGlvbnMgPSB0aGlyZDtcbiAgICAgICAgY29uc3VtZWQgPSAzO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNPYmplY3Qoc2Vjb25kKSkge1xuICAgICAgb3B0aW9ucyA9IHNlY29uZDtcbiAgICAgIGNvbnN1bWVkID0gMjtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIGZpcnN0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgY3JlYXRvciA9IGRlZmF1bHRDcmVhdG9yO1xuICAgIG5hbWUgPSBmaXJzdDtcbiAgICBpZiAoaXNPYmplY3Qoc2Vjb25kKSkge1xuICAgICAgb3B0aW9ucyA9IHNlY29uZDtcbiAgICAgIGNvbnN1bWVkID0gMjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QoZmlyc3QpKSB7XG4gICAgY3JlYXRvciA9IGRlZmF1bHRDcmVhdG9yO1xuICAgIG9wdGlvbnMgPSBmaXJzdDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY3JlYXRvcjogY3JlYXRvciB8fCBkZWZhdWx0Q3JlYXRvcixcbiAgICBuYW1lLFxuICAgIG9wdGlvbnM6IChvcHRpb25zIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNvbnN1bWVkLFxuICB9O1xufVxuXG4vKipcbiAqIFNpbXBsZSBvYmplY3QgdHlwZSBjaGVja1xuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBET00gVVRJTElUSUVTIChTaW1wbGlmaWVkKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFNpbXBsZSBET00gZWxlbWVudCBjcmVhdGlvblxuICovXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSk6IEhUTUxFbGVtZW50IHtcbiAgY29uc3QgdGFnID0gb3B0aW9ucy50YWcgfHwgXCJkaXZcIjtcbiAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcblxuICBpZiAob3B0aW9ucy5jbGFzcykge1xuICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gb3B0aW9ucy5jbGFzcztcbiAgfVxuXG4gIGlmIChvcHRpb25zLnN0eWxlKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnN0eWxlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcInN0eWxlXCIsIG9wdGlvbnMuc3R5bGUpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMuc3R5bGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgb3B0aW9ucy5zdHlsZSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdGlvbnMudGV4dENvbnRlbnQpIHtcbiAgICBlbGVtZW50LnRleHRDb250ZW50ID0gb3B0aW9ucy50ZXh0Q29udGVudDtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnRleHQpIHtcbiAgICBlbGVtZW50LnRleHRDb250ZW50ID0gb3B0aW9ucy50ZXh0O1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5cbi8qKlxuICogQWRkcyBhIENTUyBjbGFzcyB0byBhbiBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGFkZENsYXNzKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjbGFzc05hbWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZWxlbWVudCAmJiBjbGFzc05hbWUpIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBlbGVtZW50IGhhcyBhIENTUyBjbGFzc1xuICovXG5mdW5jdGlvbiBoYXNDbGFzcyhlbGVtZW50OiBIVE1MRWxlbWVudCwgY2xhc3NOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGVsZW1lbnQgJiYgZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVU5JRklFRCBDT01QT05FTlQgQ1JFQVRJT04gKHdpdGggZGVzdHJ1Y3R1cmluZyBvcHRpbWl6YXRpb24pXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbXBvbmVudCBpbnN0YW5jZSB3aXRoIG9wdGltaXplZCBvcHRpb24gcHJvY2Vzc2luZ1xuICogVXNlcyBkZXN0cnVjdHVyaW5nIGZvciBjbGVhbmVyIHNlcGFyYXRpb24gb2YgY29uY2VybnNcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoXG4gIENvbXBvbmVudDogYW55LFxuICBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4pOiBhbnkge1xuICB0cnkge1xuICAgIC8vIERlc3RydWN0dXJlIHNwZWNpYWwgY29uZmlncyBpbiBvbmUgb3BlcmF0aW9uXG4gICAgY29uc3Qge1xuICAgICAgbGF5b3V0OiBsYXlvdXRDb25maWcsXG4gICAgICBsYXlvdXRJdGVtOiBsYXlvdXRJdGVtQ29uZmlnLFxuICAgICAgc3R5bGU6IHN0eWxlQ29uZmlnLFxuICAgICAgYXR0cmlidXRlczogYXR0cmlidXRlc0NvbmZpZyxcbiAgICAgIGV2ZW50czogZXZlbnRzQ29uZmlnLFxuICAgICAgZXZlbnQsIC8vIExlZ2FjeSBzdXBwb3J0XG4gICAgICAuLi5jbGVhbk9wdGlvbnNcbiAgICB9ID0gb3B0aW9ucztcblxuICAgIC8vIFVzZSBldmVudHMgb3ZlciBldmVudCAoZXZlbnRzIGlzIHByZWZlcnJlZClcbiAgICBjb25zdCBmaW5hbEV2ZW50c0NvbmZpZyA9IGV2ZW50c0NvbmZpZyB8fCBldmVudDtcblxuICAgIC8vIElmIHN0eWxlIGlzIGEgc3RyaW5nLCBhbHdheXMgcGFzcyBpdCB0aHJvdWdoIHRvIHRoZSBjb21wb25lbnRcbiAgICBpZiAoc3R5bGVDb25maWcgJiYgdHlwZW9mIHN0eWxlQ29uZmlnID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjbGVhbk9wdGlvbnMuc3R5bGUgPSBzdHlsZUNvbmZpZztcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgY29tcG9uZW50XG4gICAgY29uc3QgaXNDbGFzcyA9XG4gICAgICB0eXBlb2YgQ29tcG9uZW50ID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoQ29tcG9uZW50LCBcInByb3RvdHlwZVwiKT8ud3JpdGFibGUgPT09XG4gICAgICAgIGZhbHNlO1xuXG4gICAgY29uc3QgY29tcG9uZW50ID0gaXNDbGFzc1xuICAgICAgPyBuZXcgQ29tcG9uZW50KGNsZWFuT3B0aW9ucylcbiAgICAgIDogQ29tcG9uZW50KGNsZWFuT3B0aW9ucyk7XG5cbiAgICAvLyBBcHBseSBjb25maWd1cmF0aW9ucyBpZiBjb21wb25lbnQgaGFzIGVsZW1lbnRcbiAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICBjb25zdCBlbGVtZW50ID1cbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQgfHxcbiAgICAgICAgKGNvbXBvbmVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gY29tcG9uZW50IDogbnVsbCk7XG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAvLyBBcHBseSBsYXlvdXQgY2xhc3Nlc1xuICAgICAgICBpZiAobGF5b3V0Q29uZmlnKSBhcHBseUxheW91dENsYXNzZXMoZWxlbWVudCwgbGF5b3V0Q29uZmlnKTtcblxuICAgICAgICAvLyBBcHBseSBsYXlvdXQgaXRlbSBjbGFzc2VzXG4gICAgICAgIGlmIChsYXlvdXRJdGVtQ29uZmlnKSBhcHBseUxheW91dEl0ZW1DbGFzc2VzKGVsZW1lbnQsIGxheW91dEl0ZW1Db25maWcpO1xuXG4gICAgICAgIC8vIEFwcGx5IHN0eWxlXG4gICAgICAgIGlmIChzdHlsZUNvbmZpZyAmJiB0eXBlb2Ygc3R5bGVDb25maWcgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlQ29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGx5IGF0dHJpYnV0ZXNcbiAgICAgICAgaWYgKGF0dHJpYnV0ZXNDb25maWcgJiYgdHlwZW9mIGF0dHJpYnV0ZXNDb25maWcgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzQ29uZmlnKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBldmVudHNcbiAgICAgICAgaWYgKGZpbmFsRXZlbnRzQ29uZmlnICYmIHR5cGVvZiBmaW5hbEV2ZW50c0NvbmZpZyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpbmFsRXZlbnRzQ29uZmlnKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBldmVudERlZiBvZiBmaW5hbEV2ZW50c0NvbmZpZykge1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShldmVudERlZikgJiYgZXZlbnREZWYubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbZXZlbnROYW1lLCBoYW5kbGVyXSA9IGV2ZW50RGVmO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgIHR5cGVvZiBldmVudE5hbWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICAgIHR5cGVvZiBoYW5kbGVyID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtldmVudE5hbWUsIGhhbmRsZXJdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgICAgICAgICBmaW5hbEV2ZW50c0NvbmZpZyxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGNyZWF0aW5nIGNvbXBvbmVudCBpbnN0YW5jZTpcIiwgZXJyb3IpO1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIElOVEVHUkFURUQgTEFZT1VUIENPTkZJR1VSQVRJT04gKHdpdGggY2FjaGluZylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBBcHBsaWVzIGxheW91dCBjbGFzc2VzIGJhc2VkIG9uIGNvbmZpZ3VyYXRpb25cbiAqIFVzZXMgaW50ZWdyYXRlZCBjYWNoaW5nIGZvciBvcHRpbWFsIHBlcmZvcm1hbmNlXG4gKi9cbmZ1bmN0aW9uIGFwcGx5TGF5b3V0Q2xhc3NlcyhcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gIGxheW91dENvbmZpZzogTGF5b3V0Q29uZmlnLFxuKTogdm9pZCB7XG4gIGlmICghZWxlbWVudCB8fCAhbGF5b3V0Q29uZmlnKSByZXR1cm47XG5cbiAgLy8gQXBwbHkgYmFzZSBsYXlvdXQgdHlwZVxuICBpZiAobGF5b3V0Q29uZmlnLnR5cGUpIHtcbiAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tJHtsYXlvdXRDb25maWcudHlwZX1gKTtcbiAgfVxuXG4gIC8vIEFwcGx5IHByb3BlcnRpZXMgd2l0aCBjYWNoaW5nXG4gIGNvbnN0IGxheW91dFR5cGUgPSBsYXlvdXRDb25maWcudHlwZSB8fCBnZXRMYXlvdXRUeXBlKGVsZW1lbnQpO1xuICBpZiAobGF5b3V0VHlwZSkge1xuICAgIGlmIChsYXlvdXRDb25maWcuZ2FwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICtcbiAgICAgICAgICBnZXRDYWNoZWRDbGFzc05hbWUobGF5b3V0VHlwZSwgXCJnYXBcIiwgbGF5b3V0Q29uZmlnLmdhcCksXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobGF5b3V0Q29uZmlnLmFsaWduKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArXG4gICAgICAgICAgZ2V0Q2FjaGVkQ2xhc3NOYW1lKGxheW91dFR5cGUsIFwiYWxpZ25cIiwgbGF5b3V0Q29uZmlnLmFsaWduKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChsYXlvdXRDb25maWcuanVzdGlmeSkge1xuICAgICAgYWRkQ2xhc3MoXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIFBSRUZJWF9XSVRIX0RBU0ggK1xuICAgICAgICAgIGdldENhY2hlZENsYXNzTmFtZShsYXlvdXRUeXBlLCBcImp1c3RpZnlcIiwgbGF5b3V0Q29uZmlnLmp1c3RpZnkpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBHcmlkLXNwZWNpZmljIHByb3BlcnRpZXNcbiAgaWYgKGxheW91dENvbmZpZy50eXBlID09PSBcImdyaWRcIiB8fCBnZXRMYXlvdXRUeXBlKGVsZW1lbnQpID09PSBcImdyaWRcIikge1xuICAgIGlmICh0eXBlb2YgbGF5b3V0Q29uZmlnLmNvbHVtbnMgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICtcbiAgICAgICAgICBnZXRDYWNoZWRDbGFzc05hbWUoXCJncmlkXCIsIFwiY29sc1wiLCBsYXlvdXRDb25maWcuY29sdW1ucyksXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAobGF5b3V0Q29uZmlnLmNvbHVtbnMgPT09IFwiYXV0by1maWxsXCIpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiZ3JpZFwiLCBcImZpbGxcIiwgXCJhdXRvXCIpLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGxheW91dENvbmZpZy5jb2x1bW5zID09PSBcImF1dG8tZml0XCIpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiZ3JpZFwiLCBcImNvbHNcIiwgXCJhdXRvLWZpdFwiKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChsYXlvdXRDb25maWcuZGVuc2UpXG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tZ3JpZC1kZW5zZWApO1xuICAgIGlmIChsYXlvdXRDb25maWcuYXV0b0hlaWdodClcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1ncmlkLWF1dG8taGVpZ2h0YCk7XG4gIH1cblxuICAvLyBSb3ctc3BlY2lmaWMgcHJvcGVydGllc1xuICBpZiAobGF5b3V0Q29uZmlnLnR5cGUgPT09IFwicm93XCIgfHwgZ2V0TGF5b3V0VHlwZShlbGVtZW50KSA9PT0gXCJyb3dcIikge1xuICAgIGlmIChsYXlvdXRDb25maWcud3JhcCA9PT0gZmFsc2UgfHwgbGF5b3V0Q29uZmlnLndyYXAgPT09IFwibm93cmFwXCIpIHtcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3ctbm93cmFwYCk7XG4gICAgfSBlbHNlIGlmIChsYXlvdXRDb25maWcud3JhcCA9PT0gXCJyZXZlcnNlXCIpIHtcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3ctd3JhcC1yZXZlcnNlYCk7XG4gICAgfVxuICAgIGlmIChsYXlvdXRDb25maWcubW9iaWxlU3RhY2spXG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93LW1vYmlsZS1zdGFja2ApO1xuICAgIGlmIChsYXlvdXRDb25maWcubW9iaWxlU2Nyb2xsKVxuICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLXJvdy1tb2JpbGUtc2Nyb2xsYCk7XG4gIH1cblxuICAvLyBDdXN0b20gY2xhc3Nlc1xuICBpZiAobGF5b3V0Q29uZmlnLmNsYXNzKSB7XG4gICAgbGF5b3V0Q29uZmlnLmNsYXNzXG4gICAgICAuc3BsaXQoXCIgXCIpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuZm9yRWFjaCgoY2xzKSA9PiBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xzKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBBcHBsaWVzIGxheW91dCBpdGVtIGNsYXNzZXMgYmFzZWQgb24gY29uZmlndXJhdGlvblxuICogVXNlcyBpbnRlZ3JhdGVkIGNhY2hpbmcgZm9yIG9wdGltYWwgcGVyZm9ybWFuY2VcbiAqL1xuZnVuY3Rpb24gYXBwbHlMYXlvdXRJdGVtQ2xhc3NlcyhcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gIGl0ZW1Db25maWc6IExheW91dEl0ZW1Db25maWcsXG4pOiB2b2lkIHtcbiAgaWYgKCFlbGVtZW50IHx8ICFpdGVtQ29uZmlnKSByZXR1cm47XG5cbiAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXRfX2l0ZW1gKTtcblxuICAvLyBXaWR0aCBhbmQgcmVzcG9uc2l2ZSBjbGFzc2VzIHdpdGggY2FjaGluZ1xuICBpZiAoaXRlbUNvbmZpZy53aWR0aCAmJiBpdGVtQ29uZmlnLndpZHRoID49IDEgJiYgaXRlbUNvbmZpZy53aWR0aCA8PSAxMikge1xuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwiXCIsIGl0ZW1Db25maWcud2lkdGgpLFxuICAgICk7XG4gIH1cbiAgaWYgKGl0ZW1Db25maWcuc20pXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJzbVwiLCBpdGVtQ29uZmlnLnNtKSxcbiAgICApO1xuICBpZiAoaXRlbUNvbmZpZy5tZClcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcIm1kXCIsIGl0ZW1Db25maWcubWQpLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLmxnKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwibGdcIiwgaXRlbUNvbmZpZy5sZyksXG4gICAgKTtcbiAgaWYgKGl0ZW1Db25maWcueGwpXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJ4bFwiLCBpdGVtQ29uZmlnLnhsKSxcbiAgICApO1xuXG4gIC8vIEdyaWQgc3BhbiBjbGFzc2VzXG4gIGlmIChpdGVtQ29uZmlnLnNwYW4pXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJzcGFuXCIsIGl0ZW1Db25maWcuc3BhbiksXG4gICAgKTtcbiAgaWYgKGl0ZW1Db25maWcucm93U3BhbilcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICtcbiAgICAgICAgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcInJvdy1zcGFuXCIsIGl0ZW1Db25maWcucm93U3BhbiksXG4gICAgKTtcblxuICAvLyBPcmRlciBhbmQgYWxpZ25tZW50XG4gIGlmIChpdGVtQ29uZmlnLm9yZGVyKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwib3JkZXJcIiwgaXRlbUNvbmZpZy5vcmRlciksXG4gICAgKTtcbiAgaWYgKGl0ZW1Db25maWcuYWxpZ24pXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJzZWxmXCIsIGl0ZW1Db25maWcuYWxpZ24pLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLmF1dG8pXG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXRfX2l0ZW0tLWF1dG9gKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBsYXlvdXQgdHlwZSBmcm9tIGVsZW1lbnQgY2xhc3Nlc1xuICovXG5mdW5jdGlvbiBnZXRMYXlvdXRUeXBlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogc3RyaW5nIHtcbiAgcmV0dXJuIGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1zdGFja2ApXG4gICAgPyBcInN0YWNrXCJcbiAgICA6IGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3dgKVxuICAgICAgPyBcInJvd1wiXG4gICAgICA6IGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1ncmlkYClcbiAgICAgICAgPyBcImdyaWRcIlxuICAgICAgICA6IFwiXCI7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFVOSUZJRUQgU0NIRU1BIFBST0NFU1NPUlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBQcm9jZXNzZXMgYXJyYXktYmFzZWQgc2NoZW1hIGRlZmluaXRpb25zXG4gKiBPcHRpbWl6ZWQgd2l0aCBwYXJhbWV0ZXIgZXh0cmFjdGlvbiBhbmQgaW50ZWdyYXRlZCBjb25maWd1cmF0aW9uXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NBcnJheVNjaGVtYShcbiAgc2NoZW1hOiBTY2hlbWFJdGVtW10gfCBhbnksXG4gIHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGwsXG4gIGxldmVsOiBudW1iZXIgPSAwLFxuICBvcHRpb25zOiBMYXlvdXRPcHRpb25zID0ge30sXG4pOiBMYXlvdXRSZXN1bHQge1xuICBsZXZlbCsrO1xuICBjb25zdCBsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgY29uc3QgY29tcG9uZW50czogQXJyYXk8W3N0cmluZywgYW55XT4gPSBbXTtcbiAgY29uc3QgZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudCgpO1xuICBsZXQgY29tcG9uZW50ID0gbnVsbDtcblxuICBpZiAoIUFycmF5LmlzQXJyYXkoc2NoZW1hKSkge1xuICAgIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbiAgfVxuXG4gIGNvbnN0IGRlZmF1bHRDcmVhdG9yID0gKG9wdGlvbnMgYXMgYW55KS5jcmVhdG9yIHx8IGNyZWF0ZUVsZW1lbnQ7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlbWEubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBpdGVtID0gc2NoZW1hW2ldO1xuICAgIGlmICghaXRlbSkgY29udGludWU7XG5cbiAgICAvLyBIYW5kbGUgbmVzdGVkIGFycmF5c1xuICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBjb21wb25lbnQgfHwgcGFyZW50RWxlbWVudDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHByb2Nlc3NBcnJheVNjaGVtYShpdGVtLCBjb250YWluZXIsIGxldmVsLCBvcHRpb25zKTtcbiAgICAgIC8vIE1lcmdlIG5lc3RlZCBjb21wb25lbnRzIGFycmF5IGluc3RlYWQgb2Ygb3ZlcndyaXRpbmdcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdC5sYXlvdXQuY29tcG9uZW50cykpIHtcbiAgICAgICAgY29tcG9uZW50cy5wdXNoKC4uLnJlc3VsdC5sYXlvdXQuY29tcG9uZW50cyk7XG4gICAgICAgIGRlbGV0ZSByZXN1bHQubGF5b3V0LmNvbXBvbmVudHM7XG4gICAgICB9XG4gICAgICBPYmplY3QuYXNzaWduKGxheW91dCwgcmVzdWx0LmxheW91dCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBVc2Ugb3B0aW1pemVkIHBhcmFtZXRlciBleHRyYWN0aW9uXG4gICAgY29uc3Qge1xuICAgICAgY3JlYXRvcixcbiAgICAgIG5hbWUsXG4gICAgICBvcHRpb25zOiBpdGVtT3B0aW9ucyxcbiAgICAgIGNvbnN1bWVkLFxuICAgIH0gPSBleHRyYWN0UGFyYW1ldGVycyhzY2hlbWEsIGksIGRlZmF1bHRDcmVhdG9yKTtcblxuICAgIGlmICghY3JlYXRvcikge1xuICAgICAgY29uc29sZS53YXJuKFwiU2tpcHBpbmcgdW5zdXBwb3J0ZWQgaXRlbSB0eXBlOlwiLCBpdGVtKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgdG8gZGl2IGZvciBjcmVhdGVFbGVtZW50XG4gICAgaWYgKGNyZWF0b3IgPT09IGNyZWF0ZUVsZW1lbnQgJiYgIShcInRhZ1wiIGluIGl0ZW1PcHRpb25zKSkge1xuICAgICAgaXRlbU9wdGlvbnMudGFnID0gXCJkaXZcIjtcbiAgICB9XG5cbiAgICAvLyBBZHZhbmNlIGluZGV4IGJ5IGNvbnN1bWVkIGl0ZW1zIG1pbnVzIDEgKGxvb3AgaW5jcmVtZW50IGhhbmRsZXMgdGhlICsxKVxuICAgIGkgKz0gY29uc3VtZWQgLSAxO1xuXG4gICAgLy8gUHJvY2VzcyBvcHRpb25zIHdpdGggcHJlZml4IC0gb3B0aW1pemVkIGRlY2lzaW9uIGxvZ2ljXG4gICAgY29uc3Qgc2hvdWxkQXBwbHlQcmVmaXggPVxuICAgICAgXCJwcmVmaXhcIiBpbiBpdGVtT3B0aW9ucyA/IGl0ZW1PcHRpb25zLnByZWZpeCA6IG9wdGlvbnMucHJlZml4ICE9PSBmYWxzZTtcblxuICAgIC8vIEZhc3QgcGF0aDogcHJvY2VzcyBvbmx5IHdoZW4gbmVlZGVkXG4gICAgY29uc3QgcHJvY2Vzc2VkT3B0aW9ucyA9XG4gICAgICBzaG91bGRBcHBseVByZWZpeCB8fCBpdGVtT3B0aW9ucy5yYXdDbGFzc1xuICAgICAgICA/IHByb2Nlc3NDbGFzc05hbWVzKGl0ZW1PcHRpb25zLCAhc2hvdWxkQXBwbHlQcmVmaXgpXG4gICAgICAgIDogaXRlbU9wdGlvbnM7IC8vIE5vIGNvcHkgbmVlZGVkIGlmIG5vIHByb2Nlc3NpbmdcblxuICAgIC8vIEFkZCBuYW1lIHRvIG9wdGlvbnMgaWYgbmVlZGVkXG4gICAgaWYgKFxuICAgICAgbmFtZSAmJlxuICAgICAgIShcIm5hbWVcIiBpbiBwcm9jZXNzZWRPcHRpb25zKSAmJlxuICAgICAgIShjcmVhdG9yID09PSBjcmVhdGVFbGVtZW50IHx8IChjcmVhdG9yIGFzIGFueSkuaXNFbGVtZW50KVxuICAgICkge1xuICAgICAgcHJvY2Vzc2VkT3B0aW9ucy5uYW1lID0gbmFtZTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgY29tcG9uZW50XG4gICAgY29tcG9uZW50ID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoY3JlYXRvciwgcHJvY2Vzc2VkT3B0aW9ucyk7XG4gICAgY29uc3QgZWxlbWVudCA9IGlzQ29tcG9uZW50KGNvbXBvbmVudCkgPyBjb21wb25lbnQuZWxlbWVudCA6IGNvbXBvbmVudDtcblxuICAgIGlmIChsZXZlbCA9PT0gMSkgbGF5b3V0LmVsZW1lbnQgPSBlbGVtZW50O1xuICAgIGlmIChuYW1lKSB7XG4gICAgICBsYXlvdXRbbmFtZV0gPSBjb21wb25lbnQ7XG4gICAgICBjb21wb25lbnRzLnB1c2goW25hbWUsIGNvbXBvbmVudF0pO1xuICAgIH1cblxuICAgIC8vIEFwcGVuZCB0byBET01cbiAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICBpZiAoXCJpbnNlcnRcIiBpbiBjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudC5pbnNlcnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjb21wb25lbnQuaW5zZXJ0KGZyYWdtZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50RWxlbWVudCkge1xuICAgICAgICBjb21wb25lbnQuX2NvbnRhaW5lciA9IHBhcmVudEVsZW1lbnQ7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBcIm9uSW5zZXJ0ZWRcIiBpbiBjb21wb25lbnQgJiZcbiAgICAgICAgICB0eXBlb2YgY29tcG9uZW50Lm9uSW5zZXJ0ZWQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICApIHtcbiAgICAgICAgICBjb21wb25lbnQub25JbnNlcnRlZChwYXJlbnRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEFwcGVuZCBmcmFnbWVudCB0byBwYXJlbnRcbiAgaWYgKHBhcmVudEVsZW1lbnQgJiYgZnJhZ21lbnQuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgY29uc3Qgd3JhcHBlciA9IGlzQ29tcG9uZW50KHBhcmVudEVsZW1lbnQpXG4gICAgICA/IHBhcmVudEVsZW1lbnQuZWxlbWVudFxuICAgICAgOiBwYXJlbnRFbGVtZW50O1xuICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpO1xuICB9XG5cbiAgLy8gUmVsZWFzZSBmcmFnbWVudCBiYWNrIHRvIHBvb2xcbiAgcmVsZWFzZUZyYWdtZW50KGZyYWdtZW50KTtcblxuICBsYXlvdXQuY29tcG9uZW50cyA9IGNvbXBvbmVudHM7XG4gIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgb2JqZWN0LWJhc2VkIHNjaGVtYSBkZWZpbml0aW9uc1xuICogU2ltcGxpZmllZCBhbmQgb3B0aW1pemVkIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc09iamVjdFNjaGVtYShcbiAgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgc3RyaW5nLFxuICBwYXJlbnRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsLFxuICBvcHRpb25zOiBMYXlvdXRPcHRpb25zID0ge30sXG4pOiBMYXlvdXRSZXN1bHQge1xuICBjb25zdCBsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgY29uc3QgZGVmYXVsdENyZWF0b3IgPSBvcHRpb25zLmNyZWF0b3IgfHwgY3JlYXRlRWxlbWVudDtcblxuICAvLyBIYW5kbGUgcm9vdCBlbGVtZW50IGNyZWF0aW9uXG4gIGlmICgoc2NoZW1hIGFzIGFueSkuZWxlbWVudCAmJiAhcGFyZW50RWxlbWVudCkge1xuICAgIGNvbnN0IGVsZW1lbnREZWYgPSAoc2NoZW1hIGFzIGFueSkuZWxlbWVudDtcbiAgICBjb25zdCBjcmVhdGVFbGVtZW50Rm4gPSBlbGVtZW50RGVmLmNyZWF0b3IgfHwgZGVmYXVsdENyZWF0b3I7XG5cbiAgICBjb25zdCBlbGVtZW50T3B0aW9ucyA9IGVsZW1lbnREZWYub3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBwcm9jZXNzZWRPcHRpb25zID1cbiAgICAgIG9wdGlvbnMucHJlZml4ICE9PSBmYWxzZVxuICAgICAgICA/IHByb2Nlc3NDbGFzc05hbWVzKGVsZW1lbnRPcHRpb25zKVxuICAgICAgICA6IHsgLi4uZWxlbWVudE9wdGlvbnMgfTtcblxuICAgIGNvbnN0IHJvb3RDb21wb25lbnQgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShcbiAgICAgIGNyZWF0ZUVsZW1lbnRGbixcbiAgICAgIHByb2Nlc3NlZE9wdGlvbnMsXG4gICAgKTtcbiAgICBsYXlvdXQuZWxlbWVudCA9IHJvb3RDb21wb25lbnQ7XG4gICAgaWYgKGVsZW1lbnREZWYubmFtZSkgbGF5b3V0W2VsZW1lbnREZWYubmFtZV0gPSByb290Q29tcG9uZW50O1xuXG4gICAgLy8gUHJvY2VzcyBjaGlsZHJlblxuICAgIGlmIChlbGVtZW50RGVmLmNoaWxkcmVuKSB7XG4gICAgICBjb25zdCByb290RWxlbWVudCA9IGlzQ29tcG9uZW50KHJvb3RDb21wb25lbnQpXG4gICAgICAgID8gcm9vdENvbXBvbmVudC5lbGVtZW50XG4gICAgICAgIDogcm9vdENvbXBvbmVudDtcbiAgICAgIGNvbnN0IGNoaWxkUmVzdWx0ID0gcHJvY2Vzc09iamVjdFNjaGVtYShcbiAgICAgICAgZWxlbWVudERlZi5jaGlsZHJlbixcbiAgICAgICAgcm9vdEVsZW1lbnQsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApO1xuICAgICAgT2JqZWN0LmFzc2lnbihsYXlvdXQsIGNoaWxkUmVzdWx0LmxheW91dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUxheW91dFJlc3VsdChsYXlvdXQpO1xuICB9XG5cbiAgLy8gUHJvY2VzcyBub3JtYWwgc2NoZW1hIGVsZW1lbnRzXG4gIGNvbnN0IGZyYWdtZW50ID0gcGFyZW50RWxlbWVudCA/IGNyZWF0ZUZyYWdtZW50KCkgOiBudWxsO1xuXG4gIGZvciAoY29uc3Qga2V5IGluIHNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgY29uc3QgZGVmID0gKHNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldO1xuICAgIGlmICghZGVmKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGVsZW1lbnRDcmVhdG9yID0gZGVmLmNyZWF0b3IgfHwgZGVmYXVsdENyZWF0b3I7XG4gICAgY29uc3QgZWxlbWVudE9wdGlvbnMgPSBkZWYub3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBzaG91bGRBcHBseVByZWZpeCA9XG4gICAgICBcInByZWZpeFwiIGluIGVsZW1lbnRPcHRpb25zXG4gICAgICAgID8gZWxlbWVudE9wdGlvbnMucHJlZml4XG4gICAgICAgIDogb3B0aW9ucy5wcmVmaXggIT09IGZhbHNlO1xuICAgIGNvbnN0IHByb2Nlc3NlZE9wdGlvbnMgPSBzaG91bGRBcHBseVByZWZpeFxuICAgICAgPyBwcm9jZXNzQ2xhc3NOYW1lcyhlbGVtZW50T3B0aW9ucylcbiAgICAgIDogeyAuLi5lbGVtZW50T3B0aW9ucyB9O1xuXG4gICAgaWYgKCFkZWYubmFtZSAmJiBrZXkgIT09IFwiZWxlbWVudFwiKSB7XG4gICAgICBkZWYubmFtZSA9IGtleTtcbiAgICB9XG5cbiAgICBjb25zdCBjcmVhdGVkID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoZWxlbWVudENyZWF0b3IsIHByb2Nlc3NlZE9wdGlvbnMpO1xuICAgIGxheW91dFtrZXldID0gY3JlYXRlZDtcbiAgICBpZiAoZGVmLm5hbWUgJiYgZGVmLm5hbWUgIT09IGtleSkgbGF5b3V0W2RlZi5uYW1lXSA9IGNyZWF0ZWQ7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gaXNDb21wb25lbnQoY3JlYXRlZCkgPyBjcmVhdGVkLmVsZW1lbnQgOiBjcmVhdGVkO1xuICAgIGlmIChmcmFnbWVudCkgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG5cbiAgICAvLyBQcm9jZXNzIGNoaWxkcmVuXG4gICAgaWYgKGRlZi5jaGlsZHJlbikge1xuICAgICAgY29uc3QgY2hpbGRSZXN1bHQgPSBwcm9jZXNzT2JqZWN0U2NoZW1hKGRlZi5jaGlsZHJlbiwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICBPYmplY3QuYXNzaWduKGxheW91dCwgY2hpbGRSZXN1bHQubGF5b3V0KTtcbiAgICB9XG4gIH1cblxuICAvLyBBcHBlbmQgdG8gcGFyZW50XG4gIGlmIChwYXJlbnRFbGVtZW50ICYmIGZyYWdtZW50KSB7XG4gICAgY29uc3QgcGFyZW50RG9tID0gaXNDb21wb25lbnQocGFyZW50RWxlbWVudClcbiAgICAgID8gcGFyZW50RWxlbWVudC5lbGVtZW50XG4gICAgICA6IHBhcmVudEVsZW1lbnQ7XG4gICAgcGFyZW50RG9tLmFwcGVuZENoaWxkKGZyYWdtZW50KTtcbiAgICByZWxlYXNlRnJhZ21lbnQoZnJhZ21lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZUxheW91dFJlc3VsdChsYXlvdXQpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBMQVlPVVQgUkVTVUxUIENSRUFUSU9OXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRmxhdHRlbnMgYSBuZXN0ZWQgbGF5b3V0IGludG8gYSBzaW1wbGUgb2JqZWN0IHdpdGggZWxlbWVudCBhbmQgY29tcG9uZW50IHJlZmVyZW5jZXNcbiAqL1xuZnVuY3Rpb24gZmxhdHRlbkxheW91dChsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgY29uc3QgZmxhdHRlbmVkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cbiAgaWYgKCFsYXlvdXQgfHwgdHlwZW9mIGxheW91dCAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZsYXR0ZW5lZDtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBsYXlvdXQpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGxheW91dFtrZXldO1xuICAgIGlmIChcbiAgICAgIHZhbHVlICYmXG4gICAgICB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgKHZhbHVlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHxcbiAgICAgICAgKHR5cGVvZiBTVkdFbGVtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmIHZhbHVlIGluc3RhbmNlb2YgU1ZHRWxlbWVudCkgfHxcbiAgICAgICAgaXNDb21wb25lbnQodmFsdWUpKVxuICAgICkge1xuICAgICAgZmxhdHRlbmVkW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmxhdHRlbmVkO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsYXlvdXQgcmVzdWx0IG9iamVjdCB3aXRoIHV0aWxpdHkgZnVuY3Rpb25zXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUxheW91dFJlc3VsdChsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBMYXlvdXRSZXN1bHQge1xuICBjb25zdCBmbGF0dGVuZWRDb21wb25lbnRzID0gZmxhdHRlbkxheW91dChsYXlvdXQpO1xuXG4gIHJldHVybiB7XG4gICAgbGF5b3V0LFxuICAgIGVsZW1lbnQ6IGxheW91dC5lbGVtZW50LFxuICAgIGNvbXBvbmVudDogZmxhdHRlbmVkQ29tcG9uZW50cyxcblxuICAgIGdldChuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgICAgcmV0dXJuIGxheW91dFtuYW1lXSA/PyBudWxsO1xuICAgIH0sXG5cbiAgICBnZXRBbGwoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICByZXR1cm4gZmxhdHRlbmVkQ29tcG9uZW50cztcbiAgICB9LFxuXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAgIC8vIFRyYWNrIGRlc3Ryb3llZCBjb21wb25lbnRzIHRvIGF2b2lkIGRvdWJsZS1kZXN0cm95XG4gICAgICBjb25zdCBkZXN0cm95ZWQgPSBuZXcgU2V0PGFueT4oKTtcblxuICAgICAgLy8gSGVscGVyIHRvIHNhZmVseSBkZXN0cm95IGEgY29tcG9uZW50XG4gICAgICBjb25zdCBkZXN0cm95Q29tcG9uZW50ID0gKGNvbXBvbmVudDogYW55KTogdm9pZCA9PiB7XG4gICAgICAgIGlmICghY29tcG9uZW50IHx8IGRlc3Ryb3llZC5oYXMoY29tcG9uZW50KSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFNraXAgcGxhaW4gSFRNTCBlbGVtZW50cyBhbmQgbm9uLW9iamVjdHNcbiAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IHR5cGVvZiBjb21wb25lbnQgIT09IFwib2JqZWN0XCIpXG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGl0J3MgYSBjb21wb25lbnQgd2l0aCBkZXN0cm95IG1ldGhvZFxuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBkZXN0cm95ZWQuYWRkKGNvbXBvbmVudCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5kZXN0cm95KCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gSWdub3JlIGRlc3Ryb3kgZXJyb3JzIC0gY29tcG9uZW50IG1heSBhbHJlYWR5IGJlIGNsZWFuZWQgdXBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8vIEZpcnN0IGRlc3Ryb3kgY29tcG9uZW50cyBmcm9tIHRoZSBjb21wb25lbnRzIGFycmF5IChpZiBwcmVzZW50KVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIGFsbCBuYW1lZCBjb21wb25lbnRzIGFyZSBkZXN0cm95ZWQgZXZlbiBpZiBuZXN0ZWRcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGxheW91dC5jb21wb25lbnRzKSkge1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBjb21wb25lbnRdIG9mIGxheW91dC5jb21wb25lbnRzKSB7XG4gICAgICAgICAgZGVzdHJveUNvbXBvbmVudChjb21wb25lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZW4gaXRlcmF0ZSBvdmVyIGFsbCBsYXlvdXQga2V5cyBmb3IgYW55IG1pc3NlZCBjb21wb25lbnRzXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBsYXlvdXQpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJlbGVtZW50XCIgfHwga2V5ID09PSBcImNvbXBvbmVudHNcIikgY29udGludWU7XG4gICAgICAgIGRlc3Ryb3lDb21wb25lbnQobGF5b3V0W2tleV0pO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGVhciB0aGUgY29tcG9uZW50cyBhcnJheVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGF5b3V0LmNvbXBvbmVudHMpKSB7XG4gICAgICAgIGxheW91dC5jb21wb25lbnRzLmxlbmd0aCA9IDA7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSByb290IGVsZW1lbnQgZnJvbSBET01cbiAgICAgIGlmIChsYXlvdXQuZWxlbWVudCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gaXNDb21wb25lbnQobGF5b3V0LmVsZW1lbnQpXG4gICAgICAgICAgPyBsYXlvdXQuZWxlbWVudC5lbGVtZW50XG4gICAgICAgICAgOiBsYXlvdXQuZWxlbWVudDtcbiAgICAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFyIHJlZmVyZW5jZXMgdG8gaGVscCBHQ1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbGF5b3V0KSB7XG4gICAgICAgIGRlbGV0ZSBsYXlvdXRba2V5XTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBVTklGSUVEIEVOVFJZIFBPSU5UXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ3JlYXRlcyBhIGxheW91dCBmcm9tIHZhcmlvdXMgc2NoZW1hIGZvcm1hdHNcbiAqIFVuaWZpZWQgcHJvY2Vzc29yIGZvciBhcnJheXMsIG9iamVjdHMsIEpTWCwgYW5kIEhUTUwgc3RyaW5nc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGF5b3V0KFxuICBzY2hlbWE6IGFueSxcbiAgcGFyZW50RWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbCxcbiAgb3B0aW9uczogTGF5b3V0T3B0aW9ucyA9IHt9LFxuKTogTGF5b3V0UmVzdWx0IHtcbiAgLy8gSGFuZGxlIGZ1bmN0aW9uIHNjaGVtYXNcbiAgaWYgKHR5cGVvZiBzY2hlbWEgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHNjaGVtYSA9IHNjaGVtYSgpO1xuICB9XG5cbiAgLy8gSGFuZGxlIEhUTUwgc3RyaW5nIHNjaGVtYXNcbiAgaWYgKHR5cGVvZiBzY2hlbWEgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBzY2hlbWEudHJpbSgpO1xuICAgIGNvbnN0IGZyYWdtZW50ID0gdGVtcGxhdGUuY29udGVudDtcblxuICAgIGlmIChwYXJlbnRFbGVtZW50ICYmIGZyYWdtZW50Lmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgcGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChmcmFnbWVudCk7XG4gICAgfVxuXG4gICAgY29uc3QgbGF5b3V0ID0geyBlbGVtZW50OiBmcmFnbWVudC5maXJzdEVsZW1lbnRDaGlsZCBhcyBIVE1MRWxlbWVudCB9O1xuICAgIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBKU1gtbGlrZSBzY2hlbWFzIChhcnJheSB3aXRoIGZ1bmN0aW9uLCBzdHJpbmcsIG9iamVjdCBwYXR0ZXJuKVxuICBpZiAoXG4gICAgQXJyYXkuaXNBcnJheShzY2hlbWEpICYmXG4gICAgc2NoZW1hLmxlbmd0aCA+PSAzICYmXG4gICAgdHlwZW9mIHNjaGVtYVswXSA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgdHlwZW9mIHNjaGVtYVsxXSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgIGlzT2JqZWN0KHNjaGVtYVsyXSlcbiAgKSB7XG4gICAgcmV0dXJuIHByb2Nlc3NBcnJheVNjaGVtYShzY2hlbWEsIHBhcmVudEVsZW1lbnQsIDAsIG9wdGlvbnMpO1xuICB9XG5cbiAgLy8gUm91dGUgdG8gYXBwcm9wcmlhdGUgcHJvY2Vzc29yXG4gIHJldHVybiBBcnJheS5pc0FycmF5KHNjaGVtYSlcbiAgICA/IHByb2Nlc3NBcnJheVNjaGVtYShzY2hlbWEsIHBhcmVudEVsZW1lbnQsIDAsIG9wdGlvbnMpXG4gICAgOiBwcm9jZXNzT2JqZWN0U2NoZW1hKHNjaGVtYSwgcGFyZW50RWxlbWVudCwgb3B0aW9ucyk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEVYUE9SVFNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gQ2xlYXIgZnVuY3Rpb25zIGZvciB0aGUgdW5pZmllZCBzeXN0ZW1cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckNsYXNzQ2FjaGUoKTogdm9pZCB7XG4gIGNsYXNzQ2FjaGUuY2xlYXIoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyRnJhZ21lbnRQb29sKCk6IHZvaWQge1xuICBmcmFnbWVudFBvb2wuY2xlYXIoKTtcbn1cblxuZXhwb3J0IHtcbiAgcHJvY2Vzc0NsYXNzTmFtZXMsXG4gIGlzQ29tcG9uZW50LFxuICBmbGF0dGVuTGF5b3V0LFxuICBhcHBseUxheW91dENsYXNzZXMsXG4gIGFwcGx5TGF5b3V0SXRlbUNsYXNzZXMsXG4gIGNyZWF0ZUxheW91dFJlc3VsdCxcbn07XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL2V2ZW50cy50c1xuXG4vKipcbiAqIEV2ZW50cyBGZWF0dXJlIC0gQ2VudHJhbGl6ZWQgZXZlbnQgc3lzdGVtIGZvciB2aWV3cG9ydFxuICogUHJvdmlkZXMgZXZlbnQgZW1pc3Npb24gYW5kIHN1YnNjcmlwdGlvbiBmb3IgaW50ZXItZmVhdHVyZSBjb21tdW5pY2F0aW9uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXZlbnRzQ29uZmlnIHtcbiAgZGVidWc/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEV2ZW50cyBmZWF0dXJlIGZvciB2aWV3cG9ydFxuICogQ2VudHJhbGl6ZXMgYWxsIGV2ZW50IGhhbmRsaW5nIGZvciB2aWV3cG9ydCBmZWF0dXJlc1xuICovXG5leHBvcnQgY29uc3Qgd2l0aEV2ZW50cyA9IChjb25maWc6IEV2ZW50c0NvbmZpZyA9IHt9KSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50Pihjb21wb25lbnQ6IFQpOiBUID0+IHtcbiAgICBjb25zdCB7IGRlYnVnID0gZmFsc2UgfSA9IGNvbmZpZztcblxuICAgIC8vIEV2ZW50IGxpc3RlbmVycyBtYXBcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBuZXcgTWFwPHN0cmluZywgU2V0PEZ1bmN0aW9uPj4oKTtcblxuICAgIC8vIEVtaXQgYW4gZXZlbnRcbiAgICBjb25zdCBlbWl0ID0gKGV2ZW50OiBzdHJpbmcsIGRhdGE/OiBhbnkpID0+IHtcbiAgICAgIC8vIGlmIChkZWJ1Zykge1xuICAgICAgLy8gICBjb25zb2xlLmxvZyhgW0V2ZW50c10gRW1pdDogJHtldmVudH1gLCBkYXRhKTtcbiAgICAgIC8vIH1cblxuICAgICAgY29uc3QgZXZlbnRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZ2V0KGV2ZW50KTtcbiAgICAgIGlmIChldmVudExpc3RlbmVycykge1xuICAgICAgICBldmVudExpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsaXN0ZW5lcihkYXRhKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgW0V2ZW50c10gRXJyb3IgaW4gbGlzdGVuZXIgZm9yICR7ZXZlbnR9OmAsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTdWJzY3JpYmUgdG8gYW4gZXZlbnRcbiAgICBjb25zdCBvbiA9IChldmVudDogc3RyaW5nLCBoYW5kbGVyOiBGdW5jdGlvbik6ICgoKSA9PiB2b2lkKSA9PiB7XG4gICAgICBpZiAoIWxpc3RlbmVycy5oYXMoZXZlbnQpKSB7XG4gICAgICAgIGxpc3RlbmVycy5zZXQoZXZlbnQsIG5ldyBTZXQoKSk7XG4gICAgICB9XG5cbiAgICAgIGxpc3RlbmVycy5nZXQoZXZlbnQpIS5hZGQoaGFuZGxlcik7XG5cbiAgICAgIC8vIGlmIChkZWJ1Zykge1xuICAgICAgLy8gICBjb25zb2xlLmxvZyhgW0V2ZW50c10gU3Vic2NyaWJlZCB0bzogJHtldmVudH1gKTtcbiAgICAgIC8vIH1cblxuICAgICAgLy8gUmV0dXJuIHVuc3Vic2NyaWJlIGZ1bmN0aW9uXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb25zdCBldmVudExpc3RlbmVycyA9IGxpc3RlbmVycy5nZXQoZXZlbnQpO1xuICAgICAgICBpZiAoZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgICAgICBldmVudExpc3RlbmVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIGxpc3RlbmVycy5kZWxldGUoZXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgLy8gU3Vic2NyaWJlIHRvIGFuIGV2ZW50IG9uY2VcbiAgICBjb25zdCBvbmNlID0gKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKTogKCgpID0+IHZvaWQpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZWRIYW5kbGVyID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBoYW5kbGVyKGRhdGEpO1xuICAgICAgICBvZmYoZXZlbnQsIHdyYXBwZWRIYW5kbGVyKTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gb24oZXZlbnQsIHdyYXBwZWRIYW5kbGVyKTtcbiAgICB9O1xuXG4gICAgLy8gVW5zdWJzY3JpYmUgZnJvbSBhbiBldmVudFxuICAgIGNvbnN0IG9mZiA9IChldmVudDogc3RyaW5nLCBoYW5kbGVyOiBGdW5jdGlvbikgPT4ge1xuICAgICAgY29uc3QgZXZlbnRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZ2V0KGV2ZW50KTtcbiAgICAgIGlmIChldmVudExpc3RlbmVycykge1xuICAgICAgICBldmVudExpc3RlbmVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIGlmIChldmVudExpc3RlbmVycy5zaXplID09PSAwKSB7XG4gICAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQ2xlYXIgYWxsIGxpc3RlbmVycyBmb3IgYW4gZXZlbnRcbiAgICBjb25zdCBjbGVhciA9IChldmVudD86IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgIGxpc3RlbmVycy5kZWxldGUoZXZlbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGlzdGVuZXJzLmNsZWFyKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEFkZCBldmVudCBtZXRob2RzIHRvIGNvbXBvbmVudFxuICAgIGNvbXBvbmVudC5lbWl0ID0gZW1pdDtcbiAgICBjb21wb25lbnQub24gPSBvbjtcbiAgICBjb21wb25lbnQub25jZSA9IG9uY2U7XG4gICAgY29tcG9uZW50Lm9mZiA9IG9mZjtcblxuICAgIC8vIEFkZCBldmVudHMgQVBJIHRvIHZpZXdwb3J0XG4gICAgKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLmV2ZW50cyA9IHtcbiAgICAgIGVtaXQsXG4gICAgICBvbixcbiAgICAgIG9uY2UsXG4gICAgICBvZmYsXG4gICAgICBjbGVhcixcbiAgICAgIGdldExpc3RlbmVyQ291bnQ6IChldmVudD86IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gbGlzdGVuZXJzLmdldChldmVudCk/LnNpemUgfHwgMDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdG90YWwgPSAwO1xuICAgICAgICBsaXN0ZW5lcnMuZm9yRWFjaCgoc2V0KSA9PiAodG90YWwgKz0gc2V0LnNpemUpKTtcbiAgICAgICAgcmV0dXJuIHRvdGFsO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gQ2xlYW4gdXAgb24gZGVzdHJveVxuICAgIGlmIChcImRlc3Ryb3lcIiBpbiBjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IGNvbXBvbmVudC5kZXN0cm95O1xuICAgICAgY29tcG9uZW50LmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIGNsZWFyKCk7XG4gICAgICAgIG9yaWdpbmFsRGVzdHJveT8uKCk7XG4g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QUFBLFFBQzNDLG9CQUFvQixPQUFPLGFBQWEsdUJBQXVCO0FBQUEsUUFDL0Qsb0JBQXFCLE9BQWU7QUFBQSxRQUNwQyxVQUFXLE9BQWU7QUFBQSxRQUMxQixVQUFXLE9BQWUsYUFBYTtBQUFBLFFBQ3ZDLGlCQUFrQixPQUFlO0FBQUEsUUFDakMsZ0JBQWdCLE9BQU8sT0FBTztBQUFBLFFBQzlCLGdCQUFnQixPQUFPLE9BQU87QUFBQSxNQUNoQyxDQUFDLENBQ0g7QUFBQSxJQUNGO0FBQUEsSUFHQSxJQUFJLE9BQU8sWUFBWSxXQUFXLE9BQU8sY0FBYyxZQUFZLE9BQU87QUFBQSxNQUN4RSxVQUFVLEtBQ1IsaUJBQWlCO0FBQUEsUUFDZixTQUFTO0FBQUEsUUFDVCxrQkFBa0IsT0FBTyxjQUFjLG9CQUFvQjtBQUFBLFFBQzNELGVBQWUsT0FBTyxjQUFjO0FBQUEsTUFDdEMsQ0FBQyxDQUNIO0FBQUEsSUFDRjtBQUFBLElBR0EsVUFBVSxLQUNSLGNBQWM7QUFBQSxNQUNaLFVBQVUsT0FBTztBQUFBLE1BQ2pCLFVBQVUsT0FBTyxTQUFTO0FBQUEsTUFDMUIsa0JBQWtCLE9BQU8sV0FBVztBQUFBLElBQ3RDLENBQUMsQ0FDSDtBQUFBLElBR0EsTUFBTSxVQUFVLEtBQUssR0FBRyxTQUFTO0FBQUEsSUFHakMsTUFBTSxXQUFXLFFBQVEsYUFBYTtBQUFBLElBR3RDLElBQUksU0FBUyxTQUFTO0FBQUEsTUFDcEIsU0FBUyxTQUFTLFdBQVc7QUFBQSxJQUMvQjtBQUFBLElBRUEsT0FBTztBQUFBO0FBQUE7IiwKICAiZGVidWdJZCI6ICJBRkNFRjBFMzlDMjI1NEIxNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
3682
+ //# debugId=17F0A6683194D96064756E2164756E21
3683
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvcmUvdmlld3BvcnQvdmlld3BvcnQudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvdXRpbHMudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvYmFzZS50cyIsICIuLi8uLi8uLi9zcmMvY29yZS92aWV3cG9ydC9jb25zdGFudHMudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvdmlydHVhbC50cyIsICIuLi8uLi8uLi9zcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9zY3JvbGxpbmcudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvbW9tZW50dW0udHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvc2Nyb2xsYmFyLnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL2NvbGxlY3Rpb24udHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvcGxhY2Vob2xkZXJzLnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3JlbmRlcmluZy50cyIsICIuLi8uLi8uLi9zcmMvY29yZS9sYXlvdXQvc2NoZW1hLnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL2V2ZW50cy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIvKipcbiAqIFZpZXdwb3J0IC0gQ29yZSB2aXJ0dWFsIHNjcm9sbGluZyBlbmdpbmVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIFZpZXdwb3J0Q29uZmlnLFxuICBWaWV3cG9ydENvbnRleHQsXG4gIFZpZXdwb3J0Q29tcG9uZW50LFxuICBJdGVtUmFuZ2UsXG4gIFZpZXdwb3J0SW5mbyxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IHBpcGUgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgd2l0aEJhc2UgfSBmcm9tIFwiLi9mZWF0dXJlcy9iYXNlXCI7XG5pbXBvcnQgeyB3aXRoVmlydHVhbCB9IGZyb20gXCIuL2ZlYXR1cmVzL3ZpcnR1YWxcIjtcbmltcG9ydCB7IHdpdGhTY3JvbGxpbmcgfSBmcm9tIFwiLi9mZWF0dXJlcy9zY3JvbGxpbmdcIjtcbmltcG9ydCB7IHdpdGhNb21lbnR1bSB9IGZyb20gXCIuL2ZlYXR1cmVzL21vbWVudHVtXCI7XG5pbXBvcnQgeyB3aXRoU2Nyb2xsYmFyIH0gZnJvbSBcIi4vZmVhdHVyZXMvc2Nyb2xsYmFyXCI7XG5pbXBvcnQgeyB3aXRoQ29sbGVjdGlvbiB9IGZyb20gXCIuL2ZlYXR1cmVzL2NvbGxlY3Rpb25cIjtcbmltcG9ydCB7IHdpdGhQbGFjZWhvbGRlcnMgfSBmcm9tIFwiLi9mZWF0dXJlcy9wbGFjZWhvbGRlcnNcIjtcbmltcG9ydCB7IHdpdGhSZW5kZXJpbmcgfSBmcm9tIFwiLi9mZWF0dXJlcy9yZW5kZXJpbmdcIjtcbmltcG9ydCB7IHdpdGhFdmVudHMgfSBmcm9tIFwiLi9mZWF0dXJlcy9ldmVudHNcIjtcblxuLy8gSW50ZXJuYWwgdmlld3BvcnQgc3RhdGVcbmludGVyZmFjZSBWaWV3cG9ydFN0YXRlIHtcbiAgc2Nyb2xsUG9zaXRpb246IG51bWJlcjtcbiAgdG90YWxJdGVtczogbnVtYmVyO1xuICBpdGVtU2l6ZTogbnVtYmVyO1xuICBjb250YWluZXJTaXplOiBudW1iZXI7XG4gIHZpcnR1YWxUb3RhbFNpemU6IG51bWJlcjtcbiAgdmlzaWJsZVJhbmdlOiBJdGVtUmFuZ2U7XG4gIGl0ZW1zQ29udGFpbmVyOiBIVE1MRWxlbWVudCB8IG51bGw7XG4gIHZlbG9jaXR5OiBudW1iZXI7XG4gIHNjcm9sbERpcmVjdGlvbjogXCJmb3J3YXJkXCIgfCBcImJhY2t3YXJkXCI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHZpZXdwb3J0LWVuaGFuY2VkIGNvbXBvbmVudCB1c2luZyBjb21wb3NpdGlvblxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBWaWV3cG9ydCBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBGdW5jdGlvbiB0aGF0IGVuaGFuY2VzIGEgY29tcG9uZW50IHdpdGggdmlld3BvcnQgY2FwYWJpbGl0aWVzXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVWaWV3cG9ydCA9IChjb25maWc6IFZpZXdwb3J0Q29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0Pihjb21wb25lbnQ6IFQpOiBUICYgVmlld3BvcnRDb21wb25lbnQgPT4ge1xuICAgIC8vIFRyYWNrIGlmIHZpZXdwb3J0IGhhcyBiZWVuIGluaXRpYWxpemVkIHRvIHByZXZlbnQgbXVsdGlwbGUgaW5pdGlhbGl6YXRpb25zXG4gICAgbGV0IGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAgIC8vIE5vIG5vcm1hbGl6YXRpb24gbmVlZGVkIC0gd2UnbGwgdXNlIHRoZSBuZXN0ZWQgc3RydWN0dXJlIGRpcmVjdGx5XG5cbiAgICAvLyBDcmVhdGUgc2hhcmVkIHZpZXdwb3J0IHN0YXRlXG4gICAgY29uc3Qgc3RhdGU6IFZpZXdwb3J0U3RhdGUgPSB7XG4gICAgICBzY3JvbGxQb3NpdGlvbjogMCxcbiAgICAgIHRvdGFsSXRlbXM6IGNvbXBvbmVudC50b3RhbEl0ZW1zIHx8IDAsXG4gICAgICBpdGVtU2l6ZTogY29uZmlnLnZpcnR1YWw/Lml0ZW1TaXplIHx8IDUwLFxuICAgICAgY29udGFpbmVyU2l6ZTogMCxcbiAgICAgIHZpcnR1YWxUb3RhbFNpemU6IDAsXG4gICAgICB2aXNpYmxlUmFuZ2U6IHsgc3RhcnQ6IDAsIGVuZDogMCB9LFxuICAgICAgaXRlbXNDb250YWluZXI6IG51bGwsXG4gICAgICB2ZWxvY2l0eTogMCxcbiAgICAgIHNjcm9sbERpcmVjdGlvbjogXCJmb3J3YXJkXCIsXG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSBiYXNlIHZpZXdwb3J0IEFQSVxuICAgIGNvbnN0IHZpZXdwb3J0QVBJID0ge1xuICAgICAgLy8gQ29yZSBBUElcbiAgICAgIGluaXRpYWxpemU6ICgpID0+IHtcbiAgICAgICAgLy8gUHJldmVudCBtdWx0aXBsZSBpbml0aWFsaXphdGlvbnNcbiAgICAgICAgaWYgKGlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaXNJbml0aWFsaXplZCA9IHRydWU7XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJbVmlld3BvcnRdIEluaXRpYWxpemluZyB3aXRoIHN0YXRlOlwiLCB7XG4gICAgICAgIC8vICAgZWxlbWVudDogISFjb21wb25lbnQuZWxlbWVudCxcbiAgICAgICAgLy8gICB0b3RhbEl0ZW1zOiBjb21wb25lbnQudG90YWxJdGVtcyxcbiAgICAgICAgLy8gICBpdGVtU2l6ZTogY29uZmlnLnZpcnR1YWw/Lml0ZW1TaXplLFxuICAgICAgICAvLyB9KTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIGNvbnRhaW5lciBzaXplXG4gICAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICAgIHN0YXRlLmNvbnRhaW5lclNpemUgPVxuICAgICAgICAgICAgY29uZmlnLnNjcm9sbGluZz8ub3JpZW50YXRpb24gPT09IFwiaG9yaXpvbnRhbFwiXG4gICAgICAgICAgICAgID8gY29tcG9uZW50LmVsZW1lbnQub2Zmc2V0V2lkdGhcbiAgICAgICAgICAgICAgOiBjb21wb25lbnQuZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG5cbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltWaWV3cG9ydF0gQ29udGFpbmVyIHNpemU6XCIsIHN0YXRlLmNvbnRhaW5lclNpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIGluaXRpYWwgdmlydHVhbCBzaXplXG4gICAgICAgIHN0YXRlLnZpcnR1YWxUb3RhbFNpemUgPSBzdGF0ZS50b3RhbEl0ZW1zICogc3RhdGUuaXRlbVNpemU7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIGluaXRpYWwgdmlzaWJsZSByYW5nZVxuICAgICAgICBzdGF0ZS52aXNpYmxlUmFuZ2UgPSBjYWxjdWxhdGVWaXNpYmxlUmFuZ2Uoc3RhdGUuc2Nyb2xsUG9zaXRpb24pO1xuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1ZpZXdwb3J0XSBJbml0aWFsIHN0YXRlOlwiLCB7XG4gICAgICAgIC8vICAgY29udGFpbmVyU2l6ZTogc3RhdGUuY29udGFpbmVyU2l6ZSxcbiAgICAgICAgLy8gICB2aXJ0dWFsVG90YWxTaXplOiBzdGF0ZS52aXJ0dWFsVG90YWxTaXplLFxuICAgICAgICAvLyAgIHZpc2libGVSYW5nZTogc3RhdGUudmlzaWJsZVJhbmdlLFxuICAgICAgICAvLyB9KTtcbiAgICAgIH0sXG5cbiAgICAgIGRlc3Ryb3k6ICgpID0+IHtcbiAgICAgICAgLy8gQ2xlYW51cCB3aWxsIGJlIGhhbmRsZWQgYnkgZmVhdHVyZXNcbiAgICAgIH0sXG5cbiAgICAgIHVwZGF0ZVZpZXdwb3J0OiAoKSA9PiB7XG4gICAgICAgIC8vIFdpbGwgYmUgaW1wbGVtZW50ZWQgYnkgcmVuZGVyaW5nIGZlYXR1cmVcbiAgICAgIH0sXG5cbiAgICAgIC8vIENoZWNrIGlmIGFscmVhZHkgaW5pdGlhbGl6ZWRcbiAgICAgIGlzSW5pdGlhbGl6ZWQ6ICgpID0+IGlzSW5pdGlhbGl6ZWQsXG5cbiAgICAgIC8vIFJlc2V0IGluaXRpYWxpemF0aW9uIHN0YXRlIChmb3IgcmVsb2FkIGZ1bmN0aW9uYWxpdHkpXG4gICAgICByZXNldEluaXRpYWxpemF0aW9uOiAoKSA9PiB7XG4gICAgICAgIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIEFsbG93IGZlYXR1cmVzIHRvIGNoZWNrIGlmIGluaXQgc2hvdWxkIHByb2NlZWRcbiAgICAgIF9zaG91bGRJbml0OiAoKSA9PiAhaXNJbml0aWFsaXplZCxcblxuICAgICAgLy8gU2Nyb2xsaW5nIEFQSSAod2lsbCBiZSBvdmVycmlkZGVuIGJ5IHNjcm9sbGluZyBmZWF0dXJlKVxuICAgICAgc2Nyb2xsVG9JbmRleDogKFxuICAgICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgICBhbGlnbm1lbnQ/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIixcbiAgICAgICkgPT4ge1xuICAgICAgICAvLyBQbGFjZWhvbGRlciAtIHdpbGwgYmUgaW1wbGVtZW50ZWQgYnkgc2Nyb2xsaW5nIGZlYXR1cmVcbiAgICAgIH0sXG5cbiAgICAgIHNjcm9sbFRvUG9zaXRpb246IChwb3NpdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgICAgIC8vIFdpbGwgYmUgaW1wbGVtZW50ZWQgYnkgc2Nyb2xsaW5nIGZlYXR1cmVcbiAgICAgIH0sXG5cbiAgICAgIGdldFNjcm9sbFBvc2l0aW9uOiAoKSA9PiBzdGF0ZS5zY3JvbGxQb3NpdGlvbixcblxuICAgICAgLy8gSW5mbyBBUElcbiAgICAgIGdldFZpc2libGVSYW5nZTogKCkgPT4gc3RhdGUudmlzaWJsZVJhbmdlLFxuXG4gICAgICBnZXRWaWV3cG9ydEluZm86ICgpOiBWaWV3cG9ydEluZm8gPT4gKHtcbiAgICAgICAgY29udGFpbmVyU2l6ZTogc3RhdGUuY29udGFpbmVyU2l6ZSxcbiAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZTogc3RhdGUudmlydHVhbFRvdGFsU2l6ZSxcbiAgICAgICAgdmlzaWJsZVJhbmdlOiBzdGF0ZS52aXNpYmxlUmFuZ2UsXG4gICAgICAgIHZpcnR1YWxTY3JvbGxQb3NpdGlvbjogc3RhdGUuc2Nyb2xsUG9zaXRpb24sXG4gICAgICB9KSxcblxuICAgICAgLy8gUmVuZGVyaW5nIEFQSVxuICAgICAgcmVuZGVySXRlbXM6ICgpID0+IHtcbiAgICAgICAgLy8gV2lsbCBiZSBpbXBsZW1lbnRlZCBieSByZW5kZXJpbmcgZmVhdHVyZVxuICAgICAgfSxcblxuICAgICAgLy8gSW50ZXJuYWwgc3RhdGUgKGZvciBmZWF0dXJlcyB0byBhY2Nlc3MpXG4gICAgICBzdGF0ZSxcbiAgICB9O1xuXG4gICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB2aXNpYmxlIHJhbmdlXG4gICAgY29uc3QgY2FsY3VsYXRlVmlzaWJsZVJhbmdlID0gKHNjcm9sbFBvczogbnVtYmVyKTogSXRlbVJhbmdlID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1TaXplID0gc3RhdGUuaXRlbVNpemU7XG4gICAgICBjb25zdCBzdGFydCA9IE1hdGguZmxvb3Ioc2Nyb2xsUG9zIC8gaXRlbVNpemUpO1xuICAgICAgY29uc3QgdmlzaWJsZUNvdW50ID0gTWF0aC5jZWlsKHN0YXRlLmNvbnRhaW5lclNpemUgLyBpdGVtU2l6ZSk7XG4gICAgICBjb25zdCBlbmQgPSBNYXRoLm1pbihzdGFydCArIHZpc2libGVDb3VudCwgc3RhdGUudG90YWxJdGVtcyAtIDEpO1xuXG4gICAgICByZXR1cm4geyBzdGFydDogTWF0aC5tYXgoMCwgc3RhcnQpLCBlbmQ6IE1hdGgubWF4KDAsIGVuZCkgfTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIHZpZXdwb3J0IEFQSSB0byBjb21wb25lbnRcbiAgICBjb25zdCBiYXNlQ29tcG9uZW50ID0ge1xuICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgdmlld3BvcnQ6IHZpZXdwb3J0QVBJLFxuICAgIH07XG5cbiAgICAvLyBCdWlsZCB0aGUgZW5oYW5jZW1lbnQgcGlwZWxpbmVcbiAgICBjb25zdCBlbmhhbmNlcnM6IEFycmF5PChjOiBhbnkpID0+IGFueT4gPSBbXTtcblxuICAgIC8vIEV2ZW50cyBzeXN0ZW0gKGFsd2F5cyBmaXJzdCAtIHByb3ZpZGVzIGNvbW11bmljYXRpb24gZm9yIG90aGVyIGZlYXR1cmVzKVxuICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgd2l0aEV2ZW50cyh7XG4gICAgICAgIGRlYnVnOiBjb25maWcuZGVidWcsXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gQmFzZSBzZXR1cCAoY3JlYXRlcyBET00gc3RydWN0dXJlKVxuICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgd2l0aEJhc2Uoe1xuICAgICAgICBjbGFzc05hbWU6IGNvbmZpZy5jbGFzc05hbWUsXG4gICAgICAgIG9yaWVudGF0aW9uOiBjb25maWcuc2Nyb2xsaW5nPy5vcmllbnRhdGlvbixcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBWaXJ0dWFsIHNjcm9sbGluZyAocmVxdWlyZWQgZm9yIG1vc3QgZmVhdHVyZXMpXG4gICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICB3aXRoVmlydHVhbCh7XG4gICAgICAgIGl0ZW1TaXplOiBjb25maWcudmlydHVhbD8uaXRlbVNpemUsXG4gICAgICAgIG92ZXJzY2FuOiBjb25maWcudmlydHVhbD8ub3ZlcnNjYW4sXG4gICAgICAgIG9yaWVudGF0aW9uOiBjb25maWcuc2Nyb2xsaW5nPy5vcmllbnRhdGlvbixcbiAgICAgICAgYXV0b0RldGVjdEl0ZW1TaXplOiBjb25maWcudmlydHVhbD8uYXV0b0RldGVjdEl0ZW1TaXplLFxuICAgICAgICBpbml0aWFsU2Nyb2xsSW5kZXg6IChjb25maWcgYXMgYW55KS5pbml0aWFsU2Nyb2xsSW5kZXgsXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gU2Nyb2xsaW5nIGJlaGF2aW9yXG4gICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICB3aXRoU2Nyb2xsaW5nKHtcbiAgICAgICAgb3JpZW50YXRpb246IGNvbmZpZy5zY3JvbGxpbmc/Lm9yaWVudGF0aW9uLFxuICAgICAgICBzZW5zaXRpdml0eTogY29uZmlnLnNjcm9sbGluZz8uc2Vuc2l0aXZpdHksXG4gICAgICAgIHNtb290aGluZzogY29uZmlnLnNjcm9sbGluZz8uYW5pbWF0aW9uLFxuICAgICAgICBzdG9wT25DbGljazogY29uZmlnLnNjcm9sbGluZz8uc3RvcE9uQ2xpY2ssXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gTW9tZW50dW0gc2Nyb2xsaW5nICh0b3VjaC9kcmFnIHN1cHBvcnQgZm9yIG1vYmlsZSlcbiAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgIHdpdGhNb21lbnR1bSh7XG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIHN0b3BPbkNsaWNrOiBjb25maWcuc2Nyb2xsaW5nPy5zdG9wT25DbGljayxcbiAgICAgICAgZGVjZWxlcmF0aW9uOiBjb25maWcuc2Nyb2xsaW5nPy5tb21lbnR1bT8uZGVjZWxlcmF0aW9uLFxuICAgICAgICBtaW5WZWxvY2l0eTogY29uZmlnLnNjcm9sbGluZz8ubW9tZW50dW0/Lm1pblZlbG9jaXR5LFxuICAgICAgICBtaW5EdXJhdGlvbjogY29uZmlnLnNjcm9sbGluZz8ubW9tZW50dW0/Lm1heER1cmF0aW9uLFxuICAgICAgICBtaW5WZWxvY2l0eVRocmVzaG9sZDogY29uZmlnLnNjcm9sbGluZz8ubW9tZW50dW0/LnZlbG9jaXR5VGhyZXNob2xkLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIFNjcm9sbGJhciAob3B0aW9uYWwpXG4gICAgaWYgKGNvbmZpZy5zY3JvbGxiYXI/LmVuYWJsZWQgIT09IGZhbHNlKSB7XG4gICAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgICAgd2l0aFNjcm9sbGJhcih7XG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBhdXRvSGlkZTogY29uZmlnLnNjcm9sbGJhcj8uYXV0b0hpZGUsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgY29sbGVjdGlvbiBpZiBjb25maWd1cmVkXG4gICAgaWYgKGNvbmZpZy5jb2xsZWN0aW9uPy5hZGFwdGVyKSB7XG4gICAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgICAgd2l0aENvbGxlY3Rpb24oe1xuICAgICAgICAgIGNvbGxlY3Rpb246IGNvbmZpZy5jb2xsZWN0aW9uLmFkYXB0ZXIsXG4gICAgICAgICAgcmFuZ2VTaXplOiBjb25maWcucGFnaW5hdGlvbj8ubGltaXQsXG4gICAgICAgICAgc3RyYXRlZ3k6IGNvbmZpZy5wYWdpbmF0aW9uPy5zdHJhdGVneSBhc1xuICAgICAgICAgICAgfCBcIm9mZnNldFwiXG4gICAgICAgICAgICB8IFwicGFnZVwiXG4gICAgICAgICAgICB8IFwiY3Vyc29yXCJcbiAgICAgICAgICAgIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHRyYW5zZm9ybTogY29uZmlnLmNvbGxlY3Rpb24/LnRyYW5zZm9ybSxcbiAgICAgICAgICBjYW5jZWxMb2FkVGhyZXNob2xkOiBjb25maWcucGVyZm9ybWFuY2U/LmNhbmNlbExvYWRUaHJlc2hvbGQsXG4gICAgICAgICAgbWF4Q29uY3VycmVudFJlcXVlc3RzOiBjb25maWcucGVyZm9ybWFuY2U/Lm1heENvbmN1cnJlbnRSZXF1ZXN0cyxcbiAgICAgICAgICBlbmFibGVSZXF1ZXN0UXVldWU6IGNvbmZpZy5wZXJmb3JtYW5jZT8uZW5hYmxlUmVxdWVzdFF1ZXVlICE9PSBmYWxzZSxcbiAgICAgICAgICBpbml0aWFsU2Nyb2xsSW5kZXg6IChjb25maWcgYXMgYW55KS5pbml0aWFsU2Nyb2xsSW5kZXgsXG4gICAgICAgICAgc2VsZWN0SWQ6IChjb25maWcgYXMgYW55KS5zZWxlY3RJZCxcbiAgICAgICAgICBhdXRvTG9hZDogKGNvbmZpZyBhcyBhbnkpLmF1dG9Mb2FkICE9PSBmYWxzZSxcbiAgICAgICAgICBhdXRvU2VsZWN0Rmlyc3Q6IChjb25maWcgYXMgYW55KS5hdXRvU2VsZWN0Rmlyc3QsXG4gICAgICAgICAgbWF4Q2FjaGVkSXRlbXM6IGNvbmZpZy5jYWNoZT8ubWF4SXRlbXMsXG4gICAgICAgICAgZXZpY3Rpb25CdWZmZXI6IGNvbmZpZy5jYWNoZT8uZXZpY3Rpb25CdWZmZXIsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBQbGFjZWhvbGRlcnMgKG9wdGlvbmFsLCByZXF1aXJlcyBjb2xsZWN0aW9uKVxuICAgIGlmIChjb25maWcuY29sbGVjdGlvbj8uYWRhcHRlciAmJiBjb25maWcucGxhY2Vob2xkZXJzPy5lbmFibGVkICE9PSBmYWxzZSkge1xuICAgICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICAgIHdpdGhQbGFjZWhvbGRlcnMoe1xuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgYW5hbHl6ZUZpcnN0TG9hZDogY29uZmlnLnBsYWNlaG9sZGVycz8uYW5hbHl6ZUZpcnN0TG9hZCA/PyB0cnVlLFxuICAgICAgICAgIG1hc2tDaGFyYWN0ZXI6IGNvbmZpZy5wbGFjZWhvbGRlcnM/Lm1hc2tDaGFyYWN0ZXIsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBSZW5kZXJpbmcgKGFsd2F5cyBsYXN0IHRvIGhhdmUgYWNjZXNzIHRvIGFsbCBmZWF0dXJlcylcbiAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgIHdpdGhSZW5kZXJpbmcoe1xuICAgICAgICB0ZW1wbGF0ZTogY29uZmlnLnRlbXBsYXRlLFxuICAgICAgICBvdmVyc2NhbjogY29uZmlnLnZpcnR1YWw/Lm92ZXJzY2FuLFxuICAgICAgICBtYWludGFpbkRvbU9yZGVyOiBjb25maWcucmVuZGVyaW5nPy5tYWludGFpbkRvbU9yZGVyLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIENvbXBvc2UgYWxsIGVuaGFuY2Vyc1xuICAgIGNvbnN0IGVuaGFuY2UgPSBwaXBlKC4uLmVuaGFuY2Vycyk7XG5cbiAgICAvLyBBcHBseSBlbmhhbmNlbWVudHNcbiAgICBjb25zdCBlbmhhbmNlZCA9IGVuaGFuY2UoYmFzZUNvbXBvbmVudCk7XG5cbiAgICAvLyBBdXRvLWluaXRpYWxpemUgaWYgZWxlbWVudCBpcyBwcm92aWRlZFxuICAgIGlmIChlbmhhbmNlZC5lbGVtZW50KSB7XG4gICAgICBlbmhhbmNlZC52aWV3cG9ydC5pbml0aWFsaXplKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVuaGFuY2VkIGFzIFQgJiBWaWV3cG9ydENvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3V0aWxzLnRzXG5cbi8qKlxuICogU2hhcmVkIHV0aWxpdGllcyBmb3Igdmlld3BvcnQgZmVhdHVyZXNcbiAqIEVsaW1pbmF0ZXMgY29kZSBkdXBsaWNhdGlvbiBhY3Jvc3MgZmVhdHVyZXNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBXcmFwcyB2aWV3cG9ydCBpbml0aWFsaXphdGlvbiB3aXRoIGZlYXR1cmUtc3BlY2lmaWMgbG9naWNcbiAqIEVsaW1pbmF0ZXMgdGhlIHJlcGVhdGVkIGluaXRpYWxpemF0aW9uIGhvb2sgcGF0dGVyblxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JhcEluaXRpYWxpemU8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50PihcbiAgY29tcG9uZW50OiBULFxuICBmZWF0dXJlSW5pdDogKCkgPT4gdm9pZCxcbik6IHZvaWQge1xuICBjb25zdCBvcmlnaW5hbEluaXRpYWxpemUgPSBjb21wb25lbnQudmlld3BvcnQuaW5pdGlhbGl6ZTtcbiAgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBpbml0aWFsaXplZCAocmV0dXJucyBmYWxzZSBpZiBhbHJlYWR5IGRvbmUpXG4gICAgY29uc3QgcmVzdWx0ID0gb3JpZ2luYWxJbml0aWFsaXplKCk7XG4gICAgLy8gT25seSBydW4gZmVhdHVyZSBpbml0IGlmIGJhc2UgaW5pdCBhY3R1YWxseSByYW4gKGRpZG4ndCByZXR1cm4gZmFsc2UpXG4gICAgaWYgKHJlc3VsdCAhPT0gZmFsc2UpIHtcbiAgICAgIGZlYXR1cmVJbml0KCk7XG4gICAgfVxuICAgIC8vIFByb3BhZ2F0ZSB0aGUgcmVzdWx0IHRocm91Z2ggdGhlIGNoYWluIHNvIG91dGVyIHdyYXBwZXJzIGtub3cgdG8gc2tpcFxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbi8qKlxuICogV3JhcHMgY29tcG9uZW50IGRlc3Ryb3kgd2l0aCBjbGVhbnVwIGxvZ2ljXG4gKiBFbGltaW5hdGVzIHRoZSByZXBlYXRlZCBkZXN0cm95IGhvb2sgcGF0dGVyblxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JhcERlc3Ryb3k8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICBjb21wb25lbnQ6IFQsXG4gIGNsZWFudXA6ICgpID0+IHZvaWQsXG4pOiB2b2lkIHtcbiAgaWYgKFwiZGVzdHJveVwiIGluIGNvbXBvbmVudCAmJiB0eXBlb2YgY29tcG9uZW50LmRlc3Ryb3kgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IGNvbXBvbmVudC5kZXN0cm95O1xuICAgIChjb21wb25lbnQgYXMgYW55KS5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgY2xlYW51cCgpO1xuICAgICAgb3JpZ2luYWxEZXN0cm95Py4oKTtcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogR2V0cyB2aWV3cG9ydCBzdGF0ZSB3aXRoIHByb3BlciB0eXBpbmdcbiAqIEVsaW1pbmF0ZXMgcmVwZWF0ZWQgKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLnN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWaWV3cG9ydFN0YXRlKGNvbXBvbmVudDogVmlld3BvcnRDb21wb25lbnQpOiBhbnkge1xuICByZXR1cm4gKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLnN0YXRlO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhbiBpdGVtIGlzIGEgcGxhY2Vob2xkZXJcbiAqIEVsaW1pbmF0ZXMgZHVwbGljYXRlZCBwbGFjZWhvbGRlciBkZXRlY3Rpb24gbG9naWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGxhY2Vob2xkZXIoaXRlbTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgaXRlbSAmJlxuICAgIHR5cGVvZiBpdGVtID09PSBcIm9iamVjdFwiICYmXG4gICAgKGl0ZW0uX3BsYWNlaG9sZGVyID09PSB0cnVlIHx8IGl0ZW1bXCJfcGxhY2Vob2xkZXJcIl0gPT09IHRydWUpIC8vIFN1cHBvcnQgYm90aCBhY2Nlc3MgcGF0dGVybnNcbiAgKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcmFuZ2Uga2V5IGZvciBkZWR1cGxpY2F0aW9uXG4gKiBVc2VkIGJ5IG11bHRpcGxlIGZlYXR1cmVzIGZvciB0cmFja2luZyByYW5nZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJhbmdlS2V5KHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7cmFuZ2Uuc3RhcnR9LSR7cmFuZ2UuZW5kfWA7XG59XG5cbi8qKlxuICogQ2xhbXBzIGEgdmFsdWUgYmV0d2VlbiBtaW4gYW5kIG1heFxuICogVXNlZCBieSBtdWx0aXBsZSBmZWF0dXJlcyBmb3IgYm91bmRhcnkgY2hlY2tpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYW1wKHZhbHVlOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLm1heChtaW4sIE1hdGgubWluKG1heCwgdmFsdWUpKTtcbn1cblxuLyoqXG4gKiBTdG9yZXMgYSBmdW5jdGlvbiByZWZlcmVuY2Ugb24gdGhlIGNvbXBvbmVudCBmb3IgbGF0ZXIgYWNjZXNzXG4gKiBFbGltaW5hdGVzIHBhdHRlcm4gbGlrZSAoY29tcG9uZW50IGFzIGFueSkuX2ZlYXR1cmVGdW5jdGlvbiA9IGZuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdG9yZUZlYXR1cmVGdW5jdGlvbjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gIGNvbXBvbmVudDogVCxcbiAgbmFtZTogc3RyaW5nLFxuICBmbjogRnVuY3Rpb24sXG4pOiB2b2lkIHtcbiAgKGNvbXBvbmVudCBhcyBhbnkpW25hbWVdID0gZm47XG59XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL2Jhc2UudHNcblxuLyoqXG4gKiBCYXNlIFZpZXdwb3J0IEZlYXR1cmUgLSBTZXRzIHVwIGNvcmUgdmlld3BvcnQgc3RydWN0dXJlXG4gKiBQcm92aWRlcyB0aGUgZm91bmRhdGlvbiBmb3Igb3RoZXIgdmlld3BvcnQgZmVhdHVyZXNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IHdyYXBJbml0aWFsaXplLCBnZXRWaWV3cG9ydFN0YXRlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBCYXNlQ29uZmlnIHtcbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xuICBvcmllbnRhdGlvbj86IFwidmVydGljYWxcIiB8IFwiaG9yaXpvbnRhbFwiO1xufVxuXG4vKipcbiAqIEJhc2UgZmVhdHVyZSBmb3Igdmlld3BvcnRcbiAqIFNldHMgdXAgdGhlIERPTSBzdHJ1Y3R1cmUgYW5kIGNvcmUgc3R5bGVzXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoQmFzZSA9IChjb25maWc6IEJhc2VDb25maWcgPSB7fSkgPT4ge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBWaWV3cG9ydENvbXBvbmVudD4oY29tcG9uZW50OiBUKTogVCA9PiB7XG4gICAgY29uc3QgeyBjbGFzc05hbWUgPSBcIm10cmwtdmlld3BvcnRcIiwgb3JpZW50YXRpb24gPSBcInZlcnRpY2FsXCIgfSA9IGNvbmZpZztcblxuICAgIC8vIFVzZSB0aGUgc2hhcmVkIHdyYXBwZXIgdXRpbGl0eVxuICAgIHdyYXBJbml0aWFsaXplKGNvbXBvbmVudCwgKCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGNvbXBvbmVudC5lbGVtZW50O1xuICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm47XG5cbiAgICAgIC8vIENyZWF0ZSB2aWV3cG9ydCBzdHJ1Y3R1cmVcbiAgICAgIGxldCB2aWV3cG9ydEVsZW1lbnQgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIFwiLm10cmwtdmlld3BvcnRcIlxuICAgICAgKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgaWYgKCF2aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LnN0eWxlLmNzc1RleHQgPSBgXG4gICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICBgO1xuXG4gICAgICAgIC8vIFNldCBvcmllbnRhdGlvblxuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1vcmllbnRhdGlvblwiLCBvcmllbnRhdGlvbik7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGl0ZW1zIGNvbnRhaW5lclxuICAgICAgICBjb25zdCBpdGVtc0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGl0ZW1zQ29udGFpbmVyLmNsYXNzTmFtZSA9IFwibXRybC12aWV3cG9ydC1pdGVtc1wiO1xuICAgICAgICBpdGVtc0NvbnRhaW5lci5zdHlsZS5jc3NUZXh0ID0gYFxuICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgYDtcblxuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYXBwZW5kQ2hpbGQoaXRlbXNDb250YWluZXIpO1xuICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKHZpZXdwb3J0RWxlbWVudCk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHZpZXdwb3J0IHN0YXRlIHdpdGggY29udGFpbmVycyB1c2luZyB1dGlsaXR5XG4gICAgICAgIGNvbnN0IHN0YXRlID0gZ2V0Vmlld3BvcnRTdGF0ZShjb21wb25lbnQpO1xuICAgICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgICBzdGF0ZS52aWV3cG9ydEVsZW1lbnQgPSB2aWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgICAgc3RhdGUuaXRlbXNDb250YWluZXIgPSBpdGVtc0NvbnRhaW5lcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0b3JlIHJlZmVyZW5jZXMgb24gY29tcG9uZW50XG4gICAgICAgIChjb21wb25lbnQgYXMgYW55KS52aWV3cG9ydEVsZW1lbnQgPSB2aWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgIChjb21wb25lbnQgYXMgYW55KS5pdGVtc0NvbnRhaW5lciA9IGl0ZW1zQ29udGFpbmVyO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2NvbnN0YW50cy50c1xuXG4vKipcbiAqIFZpZXdwb3J0IENvbnN0YW50c1xuICogQ2VudHJhbGl6ZWQgY29uc3RhbnRzIGZvciBhbGwgdmlld3BvcnQgZnVuY3Rpb25hbGl0eVxuICogQ29uc29saWRhdGVkIGZyb20gdmlld3BvcnQsIHZpZXdwb3J0L2ZlYXR1cmVzLCBhbmQgbGlzdC1tYW5hZ2VyIGNvbnN0YW50c1xuICovXG5cbmV4cG9ydCBjb25zdCBWSUVXUE9SVF9DT05TVEFOVFMgPSB7XG4gIC8vIFZpcnR1YWwgc2Nyb2xsaW5nIGRlZmF1bHRzXG4gIFZJUlRVQUxfU0NST0xMOiB7XG4gICAgREVGQVVMVF9JVEVNX1NJWkU6IDQ4LFxuICAgIE9WRVJTQ0FOX0JVRkZFUjogMixcbiAgICBTQ1JPTExfU0VOU0lUSVZJVFk6IDAuNyxcbiAgICBNQVhfVklSVFVBTF9TSVpFOiAxMDAgKiAxMDAwICogMTAwMCwgLy8gMTAwTSBwaXhlbHMgLSBtb2Rlcm4gYnJvd3NlcnMgY2FuIGhhbmRsZSB0aGlzXG4gICAgQVVUT19ERVRFQ1RfSVRFTV9TSVpFOiB0cnVlLCAvLyBFbmFibGUgYXV0b21hdGljIGl0ZW0gc2l6ZSBkZXRlY3Rpb25cbiAgfSxcblxuICAvLyBTY3JvbGxpbmcgc2V0dGluZ3NcbiAgU0NST0xMSU5HOiB7XG4gICAgT1ZFUlNDQU46IDEsIC8vIEZyb20gZmVhdHVyZXMvY29uc3RhbnRzXG4gIH0sXG5cbiAgLy8gUmVuZGVyaW5nIHNldHRpbmdzXG4gIFJFTkRFUklORzoge1xuICAgIC8vIEVsZW1lbnQgcmVjeWNsaW5nXG4gICAgREVGQVVMVF9NQVhfUE9PTF9TSVpFOiAxMDAsXG4gICAgQ0xBU1NFUzoge1xuICAgICAgSVRFTTogXCJ2aWV3cG9ydC1pdGVtXCIsXG4gICAgfSxcbiAgfSxcblxuICAvLyBMb2FkaW5nIHNldHRpbmdzXG4gIExPQURJTkc6IHtcbiAgICBDQU5DRUxfVEhSRVNIT0xEOiAyNSwgLy8gcHgvbXMgLSB2ZWxvY2l0eSBhYm92ZSB3aGljaCBsb2FkcyBjYW5jZWxcbiAgICBNQVhfQ09OQ1VSUkVOVF9SRVFVRVNUUzogMSwgLy8gUGFyYWxsZWwgcmVxdWVzdHMgYWxsb3dlZFxuICAgIERFRkFVTFRfUkFOR0VfU0laRTogMjAsIC8vIEl0ZW1zIHBlciByZXF1ZXN0XG4gICAgREVCT1VOQ0VfTE9BRElORzogMTUwLCAvLyBEZWJvdW5jZSBkZWxheSAobXMpXG4gICAgTUlOX1JBTkdFX1NJWkU6IDEwLCAvLyBNaW5pbXVtIGl0ZW1zIHBlciBsb2FkXG4gICAgTUFYX1JBTkdFX1NJWkU6IDEwMCwgLy8gTWF4aW11bSBpdGVtcyBwZXIgbG9hZFxuICAgIFJFUVVFU1RfVElNRU9VVDogNTAwMCwgLy8gUmVxdWVzdCB0aW1lb3V0IChtcylcbiAgICBSRVRSWV9BVFRFTVBUUzogMiwgLy8gRmFpbGVkIHJlcXVlc3QgcmV0cmllc1xuICAgIFJFVFJZX0RFTEFZOiAxMDAwLCAvLyBEZWxheSBiZXR3ZWVuIHJldHJpZXMgKG1zKVxuICB9LFxuXG4gIC8vIFJlcXVlc3QgcXVldWUgY29uZmlndXJhdGlvbiAoZnJvbSBmZWF0dXJlcy9jb25zdGFudHMpXG4gIFJFUVVFU1RfUVVFVUU6IHtcbiAgICBFTkFCTEVEOiB0cnVlLCAvLyBFbmFibGUgcmVxdWVzdCBxdWV1aW5nXG4gICAgTUFYX1FVRVVFX1NJWkU6IDEsIC8vIE1heCBxdWV1ZWQgcmVxdWVzdHNcbiAgICBNQVhfQUNUSVZFX1JFUVVFU1RTOiAyLCAvLyBNYXggY29uY3VycmVudCBhY3RpdmUgcmVxdWVzdHNcbiAgfSxcblxuICAvLyBQbGFjZWhvbGRlciBzZXR0aW5nc1xuICBQTEFDRUhPTERFUjoge1xuICAgIE1BU0tfQ0hBUkFDVEVSOiBcIlhcIiwgLy8gVXBkYXRlZCBmcm9tIGxpc3QtbWFuYWdlclxuICAgIENMQVNTOiBcInZpZXdwb3J0LWl0ZW0tLXBsYWNlaG9sZGVyXCIsXG4gICAgTUFYX1NBTVBMRV9TSVpFOiAyMCxcbiAgICBQTEFDRUhPTERFUl9GTEFHOiBcIl9wbGFjZWhvbGRlclwiLFxuICAgIFJBTkRPTV9MRU5HVEhfVkFSSUFOQ0U6IHRydWUsXG4gIH0sXG5cbiAgLy8gU3BlZWQgdHJhY2tpbmcgKGZyb20gbGlzdC1tYW5hZ2VyKVxuICBTUEVFRF9UUkFDS0lORzoge1xuICAgIC8vIFZlbG9jaXR5IGNhbGN1bGF0aW9uXG4gICAgREVDRUxFUkFUSU9OX0ZBQ1RPUjogMC44NSwgLy8gdmVsb2NpdHkgZGVjYXkgcGVyIGZyYW1lXG4gIH0sXG5cbiAgLy8gTW9tZW50dW0gc2V0dGluZ3NcbiAgTU9NRU5UVU06IHtcbiAgICBFTkFCTEVEOiBmYWxzZSwgLy8gRW5hYmxlIG1vbWVudHVtIGJ5IGRlZmF1bHRcbiAgICBERUNFTEVSQVRJT05fRkFDVE9SOiAwLjk1LCAvLyBIb3cgcXVpY2tseSB2ZWxvY2l0eSBkZWNyZWFzZXMgcGVyIGZyYW1lIChoaWdoZXIgPSBsb25nZXIgY29hc3QpXG4gICAgTUlOX1ZFTE9DSVRZOiAwLjEsIC8vIE1pbmltdW0gdmVsb2NpdHkgYmVmb3JlIHN0b3BwaW5nIChweC9tcylcbiAgICBNSU5fRFVSQVRJT046IDc1MCwgLy8gTWF4aW11bSBnZXN0dXJlIGR1cmF0aW9uIHRvIHRyaWdnZXIgbW9tZW50dW0gKG1zKVxuICAgIE1JTl9WRUxPQ0lUWV9USFJFU0hPTEQ6IDAuNCwgLy8gTWluaW11bSB2ZWxvY2l0eSB0byB0cmlnZ2VyIG1vbWVudHVtIChweC9tcylcbiAgICBGUkFNRV9USU1FOiAxNiwgLy8gQXNzdW1lZCBmcmFtZSB0aW1lIGZvciBjYWxjdWxhdGlvbnMgKG1zKVxuICB9LFxuXG4gIC8vIEluaXRpYWwgbG9hZCBjb25maWd1cmF0aW9uIChmcm9tIGxpc3QtbWFuYWdlcilcbiAgSU5JVElBTF9MT0FEOiB7XG4gICAgU1RSQVRFR1k6IFwicGxhY2Vob2xkZXJzXCIsIC8vIFwicGxhY2Vob2xkZXJzXCIgfCBcImRpcmVjdFwiIHwgXCJwcm9ncmVzc2l2ZVwiXG4gICAgVklFV1BPUlRfTVVMVElQTElFUjogMS41LCAvLyBsb2FkIDEuNXggdmlld3BvcnQgY2FwYWNpdHlcbiAgICBNSU5fSVRFTVM6IDEwLFxuICAgIE1BWF9JVEVNUzogMTAwLFxuICAgIFBMQUNFSE9MREVSX0NPVU5UOiAyMCwgLy8gZGVmYXVsdCBwbGFjZWhvbGRlciBjb3VudFxuICAgIFNIT1dfTE9BRElOR19TVEFURTogdHJ1ZSxcbiAgICBMT0FESU5HX0RFTEFZOiAxMDAsIC8vIG1zIC0gZGVsYXkgYmVmb3JlIHNob3dpbmcgbG9hZGluZyBzdGF0ZVxuICB9LFxuXG4gIC8vIFNlbGVjdGlvbiBzZXR0aW5nc1xuICBTRUxFQ1RJT046IHtcbiAgICBTRUxFQ1RFRF9DTEFTUzogXCJ2aWV3cG9ydC1pdGVtLS1zZWxlY3RlZFwiLFxuICB9LFxuXG4gIC8vIFNjcm9sbGJhciBzZXR0aW5ncyAoZnJvbSBsaXN0LW1hbmFnZXIpXG4gIFNDUk9MTEJBUjoge1xuICAgIC8vIENTUyBjbGFzc2VzXG4gICAgQ0xBU1NFUzoge1xuICAgICAgU0NST0xMQkFSOiBcInZpZXdwb3J0X19zY3JvbGxiYXJcIixcbiAgICAgIFNDUk9MTEJBUl9UUkFDSzogXCJ2aWV3cG9ydF9fc2Nyb2xsYmFyLXRyYWNrXCIsXG4gICAgICBTQ1JPTExCQVJfVEhVTUI6IFwidmlld3BvcnRfX3Njcm9sbGJhci10aHVtYlwiLFxuICAgICAgU0NST0xMQkFSX1ZJU0lCTEU6IFwidmlld3BvcnRfX3Njcm9sbGJhci0tdmlzaWJsZVwiLFxuICAgICAgU0NST0xMQkFSX0RSQUdHSU5HOiBcInZpZXdwb3J0X19zY3JvbGxiYXItLWRyYWdnaW5nXCIsXG4gICAgICBTQ1JPTExCQVJfVEhVTUJfRFJBR0dJTkc6IFwidmlld3BvcnRfX3Njcm9sbGJhci10aHVtYi0tZHJhZ2dpbmdcIixcbiAgICB9LFxuICB9LFxuXG4gIC8vIE9yaWVudGF0aW9uIChmcm9tIGxpc3QtbWFuYWdlcilcbiAgT1JJRU5UQVRJT046IHtcbiAgICBERUZBVUxUX09SSUVOVEFUSU9OOiBcInZlcnRpY2FsXCIsXG4gICAgREVGQVVMVF9DUk9TU19BWElTX0FMSUdOTUVOVDogXCJzdHJldGNoXCIsXG4gICAgUkVWRVJTRV9ESVJFQ1RJT046IGZhbHNlLFxuICB9LFxuXG4gIFBBR0lOQVRJT046IHtcbiAgICBERUZBVUxUX1NUUkFURUdZOiBcIm9mZnNldFwiIGFzIFwib2Zmc2V0XCIgfCBcInBhZ2VcIiB8IFwiY3Vyc29yXCIsXG4gICAgREVGQVVMVF9MSU1JVDogMjAsXG4gICAgU1RSQVRFR0lFUzoge1xuICAgICAgUEFHRTogXCJwYWdlXCIgYXMgY29uc3QsXG4gICAgICBPRkZTRVQ6IFwib2Zmc2V0XCIgYXMgY29uc3QsXG4gICAgICBDVVJTT1I6IFwiY3Vyc29yXCIgYXMgY29uc3QsXG4gICAgfSxcbiAgICBDVVJTT1JfQ0xFQU5VUF9JTlRFUlZBTDogNjAwMDAsIC8vIENsZWFuIHVwIG9sZCBjdXJzb3JzIGV2ZXJ5IG1pbnV0ZVxuICAgIE1BWF9DVVJTT1JfTUFQX1NJWkU6IDEwMDAsIC8vIE1heGltdW0gbnVtYmVyIG9mIGN1cnNvcnMgdG8ga2VlcCBpbiBtZW1vcnlcbiAgICAvLyBDdXJzb3Itc3BlY2lmaWMgdmlydHVhbCBzaXppbmdcbiAgICBDVVJTT1JfU0NST0xMX01BUkdJTl9NVUxUSVBMSUVSOiAzLCAvLyBNdWx0aXBseSByYW5nZVNpemUgYnkgdGhpcyBmb3Igc2Nyb2xsIG1hcmdpblxuICAgIENVUlNPUl9NSU5fVklSVFVBTF9TSVpFX01VTFRJUExJRVI6IDMsIC8vIE1pbmltdW0gdmlydHVhbCBzaXplIGFzIG11bHRpcGxpZXIgb2YgcmFuZ2VTaXplXG4gIH0sXG59O1xuXG4vKipcbiAqIFR5cGUgZm9yIG92ZXJyaWRpbmcgY29uc3RhbnRzIGF0IHJ1bnRpbWVcbiAqL1xuZXhwb3J0IHR5cGUgVmlld3BvcnRDb25zdGFudHMgPSB0eXBlb2YgVklFV1BPUlRfQ09OU1RBTlRTO1xuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBtZXJnZSB1c2VyIGNvbnN0YW50cyB3aXRoIGRlZmF1bHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUNvbnN0YW50cyhcbiAgdXNlckNvbnN0YW50czogUGFydGlhbDxWaWV3cG9ydENvbnN0YW50cz4gPSB7fSxcbik6IFZpZXdwb3J0Q29uc3RhbnRzIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5WSUVXUE9SVF9DT05TVEFOVFMsXG4gICAgLi4udXNlckNvbnN0YW50cyxcbiAgfTtcbn1cbiIsCiAgICAiLyoqXG4gKiBWaXJ0dWFsIEZlYXR1cmUgLSBDb3JlIHZpcnR1YWwgc2Nyb2xsaW5nIGNhbGN1bGF0aW9uc1xuICogSGFuZGxlcyB2aXNpYmxlIHJhbmdlIGNhbGN1bGF0aW9uIGFuZCB0b3RhbCB2aXJ0dWFsIHNpemUgbWFuYWdlbWVudFxuICovXG5cbmltcG9ydCB0eXBlIHsgVmlld3BvcnRDb250ZXh0LCBWaWV3cG9ydENvbXBvbmVudCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVklFV1BPUlRfQ09OU1RBTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgd3JhcEluaXRpYWxpemUsIHdyYXBEZXN0cm95LCBnZXRWaWV3cG9ydFN0YXRlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBWaXJ0dWFsQ29uZmlnIHtcbiAgaXRlbVNpemU/OiBudW1iZXI7XG4gIG92ZXJzY2FuPzogbnVtYmVyO1xuICBvcmllbnRhdGlvbj86IFwidmVydGljYWxcIiB8IFwiaG9yaXpvbnRhbFwiO1xuICBhdXRvRGV0ZWN0SXRlbVNpemU/OiBib29sZWFuO1xuICBkZWJ1Zz86IGJvb2xlYW47XG4gIGluaXRpYWxTY3JvbGxJbmRleD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBWaXJ0dWFsIHNjcm9sbGluZyBmZWF0dXJlIGZvciB2aWV3cG9ydFxuICogSGFuZGxlcyB2aXNpYmxlIHJhbmdlIGNhbGN1bGF0aW9ucyB3aXRoIGNvbXByZXNzaW9uIGZvciBsYXJnZSBkYXRhc2V0c1xuICovXG5leHBvcnQgY29uc3Qgd2l0aFZpcnR1YWwgPSAoY29uZmlnOiBWaXJ0dWFsQ29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KGNvbXBvbmVudDogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGl0ZW1TaXplLFxuICAgICAgb3ZlcnNjYW4gPSBWSUVXUE9SVF9DT05TVEFOVFMuVklSVFVBTF9TQ1JPTEwuT1ZFUlNDQU5fQlVGRkVSLFxuICAgICAgb3JpZW50YXRpb24gPSBcInZlcnRpY2FsXCIsXG4gICAgICBhdXRvRGV0ZWN0SXRlbVNpemUgPSBpdGVtU2l6ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gVklFV1BPUlRfQ09OU1RBTlRTLlZJUlRVQUxfU0NST0xMLkFVVE9fREVURUNUX0lURU1fU0laRVxuICAgICAgICA6IGZhbHNlLFxuICAgICAgZGVidWcgPSBmYWxzZSxcbiAgICAgIGluaXRpYWxTY3JvbGxJbmRleCA9IDAsXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIFVzZSBwcm92aWRlZCBpdGVtU2l6ZSBvciBkZWZhdWx0LCBidXQgbWFyayBpZiB3ZSBzaG91bGQgYXV0by1kZXRlY3RcbiAgICBjb25zdCBpbml0aWFsSXRlbVNpemUgPVxuICAgICAgaXRlbVNpemUgfHwgVklFV1BPUlRfQ09OU1RBTlRTLlZJUlRVQUxfU0NST0xMLkRFRkFVTFRfSVRFTV9TSVpFO1xuXG4gICAgY29uc3QgTUFYX1ZJUlRVQUxfU0laRSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5WSVJUVUFMX1NDUk9MTC5NQVhfVklSVFVBTF9TSVpFO1xuICAgIGxldCB2aWV3cG9ydFN0YXRlOiBhbnk7XG4gICAgbGV0IGhhc0NhbGN1bGF0ZWRJdGVtU2l6ZSA9IGZhbHNlO1xuICAgIGxldCBoYXNSZWNhbGN1bGF0ZWRTY3JvbGxGb3JDb21wcmVzc2lvbiA9IGZhbHNlOyAvLyBUcmFjayBpZiB3ZSd2ZSByZWNhbGN1bGF0ZWQgc2Nyb2xsIHBvc2l0aW9uIGZvciBjb21wcmVzc2lvblxuICAgIGxldCByZXNpemVPYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXIgfCBudWxsID0gbnVsbDtcblxuICAgIC8vIENhY2hlIHZhcmlhYmxlcyBmb3IgcmFuZ2UgY2FsY3VsYXRpb25zIChkZWNsYXJlZCBoZXJlLCBpbml0aWFsaXplZCBsYXRlcilcbiAgICBsZXQgbGFzdFNjcm9sbFBvc2l0aW9uID0gLTE7XG4gICAgbGV0IGxhc3RWaXNpYmxlUmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAgIGxldCBsYXN0QWN0dWFsVmlzaWJsZVJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcblxuICAgIC8vIExpc3RlbiBmb3IgcmVsb2FkOnN0YXJ0IHRvIHJlc2V0IGZlYXR1cmUtc3BlY2lmaWMgc3RhdGVcbiAgICAvLyBOT1RFOiBXZSBkbyBOT1QgcmVzZXQgc2Nyb2xsUG9zaXRpb24gaGVyZSAtIHRoZSBjYWxsZXIgKHJlbG9hZCBvciByZWxvYWRBdClcbiAgICAvLyBpcyByZXNwb25zaWJsZSBmb3Igc2V0dGluZyB0aGUgc2Nyb2xsIHBvc2l0aW9uLiBUaGlzIHByZXZlbnRzIHJhY2UgY29uZGl0aW9uc1xuICAgIC8vIHdoZXJlIHJlbG9hZEF0IHNldHMgYSBwb3NpdGlvbiBidXQgd2UgcmVzZXQgaXQgdG8gMCBiZWZvcmUgdGhlIGxvYWQgY29tcGxldGVzLlxuICAgIGNvbXBvbmVudC5vbj8uKFwicmVsb2FkOnN0YXJ0XCIsICgpID0+IHtcbiAgICAgIGhhc0NhbGN1bGF0ZWRJdGVtU2l6ZSA9IGZhbHNlO1xuICAgICAgaGFzUmVjYWxjdWxhdGVkU2Nyb2xsRm9yQ29tcHJlc3Npb24gPSBmYWxzZTtcbiAgICAgIC8vIFJlc2V0IGNhY2hlXG4gICAgICBsYXN0U2Nyb2xsUG9zaXRpb24gPSAtMTtcbiAgICAgIGxhc3RWaXNpYmxlUmFuZ2UgPSBudWxsO1xuICAgICAgbGFzdEFjdHVhbFZpc2libGVSYW5nZSA9IG51bGw7XG4gICAgICAvLyBSZXNldCB2aWV3cG9ydFN0YXRlIGlmIGl0IGV4aXN0cywgYnV0IHByZXNlcnZlIHNjcm9sbFBvc2l0aW9uXG4gICAgICAvLyBUaGUgY2FsbGVyIChyZWxvYWQvcmVsb2FkQXQpIGlzIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIHNjcm9sbFBvc2l0aW9uXG4gICAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgICAvLyBEb24ndCByZXNldCBzY3JvbGxQb3NpdGlvbiAtIGNhbGxlciBjb250cm9scyBpdFxuICAgICAgICAvLyB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID0gMDtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zID0gMDtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplID0gMDtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS52aXNpYmxlUmFuZ2UgPSB7IHN0YXJ0OiAwLCBlbmQ6IDAgfTtcbiAgICAgICAgZGVsZXRlICh2aWV3cG9ydFN0YXRlIGFzIGFueSkudGFyZ2V0U2Nyb2xsSW5kZXg7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBJbml0aWFsaXplIHVzaW5nIHNoYXJlZCB3cmFwcGVyXG4gICAgd3JhcEluaXRpYWxpemUoY29tcG9uZW50LCAoKSA9PiB7XG4gICAgICB2aWV3cG9ydFN0YXRlID0gZ2V0Vmlld3BvcnRTdGF0ZShjb21wb25lbnQpO1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlKSByZXR1cm47XG5cbiAgICAgIE9iamVjdC5hc3NpZ24odmlld3BvcnRTdGF0ZSwge1xuICAgICAgICBpdGVtU2l6ZTogaW5pdGlhbEl0ZW1TaXplLFxuICAgICAgICBvdmVyc2NhbixcbiAgICAgICAgY29udGFpbmVyU2l6ZTpcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnZpZXdwb3J0RWxlbWVudD8uW1xuICAgICAgICAgICAgb3JpZW50YXRpb24gPT09IFwiaG9yaXpvbnRhbFwiID8gXCJvZmZzZXRXaWR0aFwiIDogXCJvZmZzZXRIZWlnaHRcIlxuICAgICAgICAgIF0gfHwgNjAwLFxuICAgICAgfSk7XG5cbiAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUodmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zKTtcblxuICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBpbml0aWFsIHNjcm9sbCBpbmRleCwgY2FsY3VsYXRlIGluaXRpYWwgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAvLyBOb3RlOiBXZSBzdG9yZSB0aGUgaW5pdGlhbFNjcm9sbEluZGV4IHRvIHVzZSBkaXJlY3RseSBpbiByYW5nZSBjYWxjdWxhdGlvbnNcbiAgICAgIC8vIGJlY2F1c2Ugc2Nyb2xsIHBvc2l0aW9uIG1heSBiZSBjb21wcmVzc2VkIGZvciBsYXJnZSBsaXN0c1xuICAgICAgbGV0IGluaXRpYWxTY3JvbGxQb3NpdGlvbiA9IHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gfHwgMDtcblxuICAgICAgaWYgKGluaXRpYWxTY3JvbGxJbmRleCA+IDApIHtcbiAgICAgICAgLy8gU3RvcmUgdGhlIHRhcmdldCBpbmRleCBmb3IgdXNlIGluIHJhbmdlIGNhbGN1bGF0aW9uc1xuICAgICAgICAodmlld3BvcnRTdGF0ZSBhcyBhbnkpLnRhcmdldFNjcm9sbEluZGV4ID0gaW5pdGlhbFNjcm9sbEluZGV4O1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBzY3JvbGwgcG9zaXRpb24gKG1heSBiZSBjb21wcmVzc2VkIGZvciBsYXJnZSBsaXN0cylcbiAgICAgICAgaW5pdGlhbFNjcm9sbFBvc2l0aW9uID1cbiAgICAgICAgICBpbml0aWFsU2Nyb2xsSW5kZXggKiAodmlld3BvcnRTdGF0ZS5pdGVtU2l6ZSB8fCBpbml0aWFsSXRlbVNpemUpO1xuICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID0gaW5pdGlhbFNjcm9sbFBvc2l0aW9uO1xuXG4gICAgICAgIC8vIE5vdGlmeSBzY3JvbGxpbmcgZmVhdHVyZSB0byBzeW5jIGl0cyBsb2NhbCBzY3JvbGwgcG9zaXRpb25cbiAgICAgICAgLy8gVXNlIHNldFRpbWVvdXQgdG8gZW5zdXJlIHNjcm9sbGluZyBmZWF0dXJlIGhhcyBpbml0aWFsaXplZFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6c2Nyb2xsLXBvc2l0aW9uLXN5bmNcIiwge1xuICAgICAgICAgICAgcG9zaXRpb246IGluaXRpYWxTY3JvbGxQb3NpdGlvbixcbiAgICAgICAgICAgIHNvdXJjZTogXCJpbml0aWFsLXNjcm9sbC1pbmRleFwiLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH1cblxuICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKGluaXRpYWxTY3JvbGxQb3NpdGlvbik7XG5cbiAgICAgIC8vIEVuc3VyZSBjb250YWluZXIgc2l6ZSBpcyBtZWFzdXJlZCBhZnRlciBET00gaXMgcmVhZHlcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHVwZGF0ZUNvbnRhaW5lclNpemUoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTZXQgdXAgUmVzaXplT2JzZXJ2ZXIgdG8gaGFuZGxlIHZpZXdwb3J0IGNvbnRhaW5lciByZXNpemVcbiAgICAgIGlmIChcbiAgICAgICAgdmlld3BvcnRTdGF0ZS52aWV3cG9ydEVsZW1lbnQgJiZcbiAgICAgICAgdHlwZW9mIFJlc2l6ZU9ic2VydmVyICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICApIHtcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIC8vIFVzZSBjb250ZW50Qm94U2l6ZSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gY29udGVudFJlY3RcbiAgICAgICAgICAgIGNvbnN0IHNpemUgPVxuICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9PT0gXCJob3Jpem9udGFsXCJcbiAgICAgICAgICAgICAgICA/IGVudHJ5LmNvbnRlbnRSZWN0LndpZHRoXG4gICAgICAgICAgICAgICAgOiBlbnRyeS5jb250ZW50UmVjdC5oZWlnaHQ7XG5cbiAgICAgICAgICAgIGlmIChzaXplID4gMCAmJiBzaXplICE9PSB2aWV3cG9ydFN0YXRlPy5jb250YWluZXJTaXplKSB7XG4gICAgICAgICAgICAgIHVwZGF0ZUNvbnRhaW5lclNpemUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKHZpZXdwb3J0U3RhdGUudmlld3BvcnRFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEhlbHBlciBmdW5jdGlvbnNcbiAgICBjb25zdCBnZXRDb21wcmVzc2lvblJhdGlvID0gKCk6IG51bWJlciA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGU/LnZpcnR1YWxUb3RhbFNpemUpIHJldHVybiAxO1xuICAgICAgY29uc3QgYWN0dWFsU2l6ZSA9IHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyAqIHZpZXdwb3J0U3RhdGUuaXRlbVNpemU7XG4gICAgICByZXR1cm4gYWN0dWFsU2l6ZSA8PSBNQVhfVklSVFVBTF9TSVpFID8gMSA6IE1BWF9WSVJUVUFMX1NJWkUgLyBhY3R1YWxTaXplO1xuICAgIH07XG5cbiAgICBjb25zdCBsb2cgPSAobWVzc2FnZTogc3RyaW5nLCBkYXRhPzogYW55KSA9PiB7XG4gICAgICBpZiAoZGVidWcpIGNvbnNvbGUubG9nKGBbVmlydHVhbF0gJHttZXNzYWdlfWAsIGRhdGEpO1xuICAgIH07XG5cbiAgICAvLyBDYWxjdWxhdGUgdmlzaWJsZSByYW5nZVxuICAgIGNvbnN0IGNhbGN1bGF0ZVZpc2libGVSYW5nZSA9IChcbiAgICAgIHNjcm9sbFBvc2l0aW9uOiBudW1iZXIsXG4gICAgKTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9ID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbVmlydHVhbF0gTm8gdmlld3BvcnQgc3RhdGUsIHJldHVybmluZyBlbXB0eSByYW5nZVwiKTtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGNvbnRhaW5lclNpemUsIHRvdGFsSXRlbXMgfSA9IHZpZXdwb3J0U3RhdGU7XG5cbiAgICAgIC8vIEVhcmx5IHJldHVybnMgZm9yIGludmFsaWQgc3RhdGVzXG4gICAgICBpZiAoXG4gICAgICAgICFjb250YWluZXJTaXplIHx8XG4gICAgICAgIGNvbnRhaW5lclNpemUgPD0gMCB8fFxuICAgICAgICAhdG90YWxJdGVtcyB8fFxuICAgICAgICB0b3RhbEl0ZW1zIDw9IDBcbiAgICAgICkge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIGFuIGluaXRpYWxTY3JvbGxJbmRleCwgdXNlIGl0IHRvIGNhbGN1bGF0ZSB0aGUgcmFuZ2VcbiAgICAgICAgLy8gZXZlbiB3aGVuIHRvdGFsSXRlbXMgaXMgMCAobm90IHlldCBsb2FkZWQgZnJvbSBBUEkpXG4gICAgICAgIGlmIChpbml0aWFsU2Nyb2xsSW5kZXggPiAwKSB7XG4gICAgICAgICAgY29uc3QgdmlzaWJsZUNvdW50ID0gTWF0aC5jZWlsKFxuICAgICAgICAgICAgKGNvbnRhaW5lclNpemUgfHwgNjAwKSAvXG4gICAgICAgICAgICAgICh2aWV3cG9ydFN0YXRlLml0ZW1TaXplIHx8IGluaXRpYWxJdGVtU2l6ZSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBzdGFydCA9IE1hdGgubWF4KDAsIGluaXRpYWxTY3JvbGxJbmRleCAtIG92ZXJzY2FuKTtcbiAgICAgICAgICBjb25zdCBlbmQgPSBpbml0aWFsU2Nyb2xsSW5kZXggKyB2aXNpYmxlQ291bnQgKyBvdmVyc2NhbjtcbiAgICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgICAgIH1cbiAgICAgICAgbG9nKGBJbnZhbGlkIHN0YXRlOiBjb250YWluZXI9JHtjb250YWluZXJTaXplfSwgaXRlbXM9JHt0b3RhbEl0ZW1zfWApO1xuICAgICAgICByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZpcnR1YWxTaXplID1cbiAgICAgICAgdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplIHx8IHRvdGFsSXRlbXMgKiB2aWV3cG9ydFN0YXRlLml0ZW1TaXplO1xuICAgICAgY29uc3QgdmlzaWJsZUNvdW50ID0gTWF0aC5jZWlsKGNvbnRhaW5lclNpemUgLyB2aWV3cG9ydFN0YXRlLml0ZW1TaXplKTtcbiAgICAgIGNvbnN0IGNvbXByZXNzaW9uUmF0aW8gPSBnZXRDb21wcmVzc2lvblJhdGlvKCk7XG5cbiAgICAgIGxldCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcjtcblxuICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIHRhcmdldCBzY3JvbGwgaW5kZXggKGZvciBpbml0aWFsU2Nyb2xsSW5kZXggd2l0aCBjb21wcmVzc2lvbilcbiAgICAgIGNvbnN0IHRhcmdldFNjcm9sbEluZGV4ID0gKHZpZXdwb3J0U3RhdGUgYXMgYW55KS50YXJnZXRTY3JvbGxJbmRleDtcblxuICAgICAgaWYgKGNvbXByZXNzaW9uUmF0aW8gPCAxKSB7XG4gICAgICAgIC8vIENvbXByZXNzZWQgc3BhY2UgY2FsY3VsYXRpb25cbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHRhcmdldFNjcm9sbEluZGV4LCB1c2UgaXQgZGlyZWN0bHkgaW5zdGVhZCBvZiBjYWxjdWxhdGluZyBmcm9tIHNjcm9sbCBwb3NpdGlvblxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgd2Ugc2hvdyB0aGUgY29ycmVjdCBpdGVtcyBldmVuIHdoZW4gdmlydHVhbCBzcGFjZSBpcyBjb21wcmVzc2VkXG4gICAgICAgIGlmICh0YXJnZXRTY3JvbGxJbmRleCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldFNjcm9sbEluZGV4ID4gMCkge1xuICAgICAgICAgIHN0YXJ0ID0gTWF0aC5tYXgoMCwgdGFyZ2V0U2Nyb2xsSW5kZXggLSBvdmVyc2Nhbik7XG4gICAgICAgICAgZW5kID0gTWF0aC5taW4oXG4gICAgICAgICAgICB0b3RhbEl0ZW1zIC0gMSxcbiAgICAgICAgICAgIHRhcmdldFNjcm9sbEluZGV4ICsgdmlzaWJsZUNvdW50ICsgb3ZlcnNjYW4sXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBDbGVhciB0YXJnZXRTY3JvbGxJbmRleCBhZnRlciBmaXJzdCB1c2Ugc28gbm9ybWFsIHNjcm9sbGluZyB3b3Jrc1xuICAgICAgICAgIGRlbGV0ZSAodmlld3BvcnRTdGF0ZSBhcyBhbnkpLnRhcmdldFNjcm9sbEluZGV4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsU2l6ZTtcbiAgICAgICAgICBjb25zdCBleGFjdEluZGV4ID0gc2Nyb2xsUmF0aW8gKiB0b3RhbEl0ZW1zO1xuICAgICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihleGFjdEluZGV4KTtcbiAgICAgICAgICBlbmQgPSBNYXRoLmNlaWwoZXhhY3RJbmRleCkgKyB2aXNpYmxlQ291bnQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOZWFyLWJvdHRvbSBoYW5kbGluZ1xuICAgICAgICBjb25zdCBtYXhTY3JvbGwgPSB2aXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemU7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlRnJvbUJvdHRvbSA9IG1heFNjcm9sbCAtIHNjcm9sbFBvc2l0aW9uO1xuXG4gICAgICAgIGlmIChkaXN0YW5jZUZyb21Cb3R0b20gPD0gY29udGFpbmVyU2l6ZSAmJiBkaXN0YW5jZUZyb21Cb3R0b20gPj0gLTEpIHtcbiAgICAgICAgICBjb25zdCBpdGVtc0F0Qm90dG9tID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgIGNvbnRhaW5lclNpemUgLyB2aWV3cG9ydFN0YXRlLml0ZW1TaXplLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgZmlyc3RWaXNpYmxlQXRCb3R0b20gPSBNYXRoLm1heCgwLCB0b3RhbEl0ZW1zIC0gaXRlbXNBdEJvdHRvbSk7XG4gICAgICAgICAgY29uc3QgaW50ZXJwb2xhdGlvbiA9IE1hdGgubWF4KFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIE1hdGgubWluKDEsIDEgLSBkaXN0YW5jZUZyb21Cb3R0b20gLyBjb250YWluZXJTaXplKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgc3RhcnQgPSBNYXRoLmZsb29yKFxuICAgICAgICAgICAgc3RhcnQgKyAoZmlyc3RWaXNpYmxlQXRCb3R0b20gLSBzdGFydCkgKiBpbnRlcnBvbGF0aW9uLFxuICAgICAgICAgICk7XG4gICAgICAgICAgZW5kID1cbiAgICAgICAgICAgIGRpc3RhbmNlRnJvbUJvdHRvbSA8PSAxXG4gICAgICAgICAgICAgID8gdG90YWxJdGVtcyAtIDFcbiAgICAgICAgICAgICAgOiBNYXRoLm1pbih0b3RhbEl0ZW1zIC0gMSwgc3RhcnQgKyB2aXNpYmxlQ291bnQgKyBvdmVyc2Nhbik7XG5cbiAgICAgICAgICBsb2coXCJOZWFyIGJvdHRvbSBjYWxjdWxhdGlvbjpcIiwge1xuICAgICAgICAgICAgZGlzdGFuY2VGcm9tQm90dG9tLFxuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbixcbiAgICAgICAgICAgIHN0YXJ0LFxuICAgICAgICAgICAgZW5kLFxuICAgICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwbHkgb3ZlcnNjYW5cbiAgICAgICAgc3RhcnQgPSBNYXRoLm1heCgwLCBzdGFydCAtIG92ZXJzY2FuKTtcbiAgICAgICAgZW5kID0gTWF0aC5taW4odG90YWxJdGVtcyAtIDEsIGVuZCArIG92ZXJzY2FuKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpcmVjdCBjYWxjdWxhdGlvblxuICAgICAgICBzdGFydCA9IE1hdGgubWF4KFxuICAgICAgICAgIDAsXG4gICAgICAgICAgTWF0aC5mbG9vcihzY3JvbGxQb3NpdGlvbiAvIHZpZXdwb3J0U3RhdGUuaXRlbVNpemUpIC0gb3ZlcnNjYW4sXG4gICAgICAgICk7XG4gICAgICAgIGVuZCA9IE1hdGgubWluKHRvdGFsSXRlbXMgLSAxLCBzdGFydCArIHZpc2libGVDb3VudCArIG92ZXJzY2FuICogMik7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIG91dHB1dFxuICAgICAgaWYgKGlzTmFOKHN0YXJ0KSB8fCBpc05hTihlbmQpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbVmlydHVhbF0gTmFOIGluIHJhbmdlIGNhbGN1bGF0aW9uOlwiLCB7XG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgY29udGFpbmVyU2l6ZSxcbiAgICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICAgIGl0ZW1TaXplOiB2aWV3cG9ydFN0YXRlLml0ZW1TaXplLFxuICAgICAgICAgIGNvbXByZXNzaW9uUmF0aW8sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgICB9XG5cbiAgICAgIC8vIFN0cmF0ZWdpYyBsb2cgZm9yIGxhc3QgcmFuZ2VcbiAgICAgIC8vIGlmIChlbmQgPj0gdG90YWxJdGVtcyAtIDEwKSB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICAgIGBbVmlydHVhbF0gTmVhciBlbmQgcmFuZ2U6ICR7c3RhcnR9LSR7ZW5kfSwgdG90YWxJdGVtcz0ke3RvdGFsSXRlbXN9LCBsYXN0SXRlbVBvcz0ke1xuICAgICAgLy8gICAgICAgZW5kICogdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZVxuICAgICAgLy8gICAgIH1weCwgdmlydHVhbFNpemU9JHt2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemV9cHhgXG4gICAgICAvLyAgICk7XG4gICAgICAvLyB9XG5cbiAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICB9O1xuXG4gICAgLy8gQ2FsY3VsYXRlIGFjdHVhbCB2aXNpYmxlIHJhbmdlICh3aXRob3V0IG92ZXJzY2FuIGJ1ZmZlcilcbiAgICBjb25zdCBjYWxjdWxhdGVBY3R1YWxWaXNpYmxlUmFuZ2UgPSAoc2Nyb2xsUG9zaXRpb246IG51bWJlcikgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlKSByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG5cbiAgICAgIGNvbnN0IHsgY29udGFpbmVyU2l6ZSwgdG90YWxJdGVtcyB9ID0gdmlld3BvcnRTdGF0ZTtcblxuICAgICAgaWYgKCFjb250YWluZXJTaXplIHx8ICF0b3RhbEl0ZW1zKSByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG5cbiAgICAgIGNvbnN0IGl0ZW1TaXplID0gdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZTtcbiAgICAgIGNvbnN0IHZpc2libGVDb3VudCA9IE1hdGguY2VpbChjb250YWluZXJTaXplIC8gaXRlbVNpemUpO1xuICAgICAgY29uc3QgYWN0dWFsU2l6ZSA9IHRvdGFsSXRlbXMgKiBpdGVtU2l6ZTtcbiAgICAgIGNvbnN0IHZpcnR1YWxTaXplID0gdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplIHx8IGFjdHVhbFNpemU7XG4gICAgICAvLyBjb21wcmVzc2lvblJhdGlvIDwgMSBtZWFucyBsaXN0IGlzIGNvbXByZXNzZWQgKHZpcnR1YWxTaXplIDwgYWN0dWFsU2l6ZSlcbiAgICAgIGNvbnN0IGNvbXByZXNzaW9uUmF0aW8gPSBhY3R1YWxTaXplID4gMCA/IHZpcnR1YWxTaXplIC8gYWN0dWFsU2l6ZSA6IDE7XG5cbiAgICAgIGxldCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcjtcblxuICAgICAgaWYgKGNvbXByZXNzaW9uUmF0aW8gPCAxKSB7XG4gICAgICAgIC8vIENvbXByZXNzZWQgc3BhY2UgLSBjYWxjdWxhdGUgYmFzZWQgb24gc2Nyb2xsIHJhdGlvXG4gICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsU2l6ZTtcbiAgICAgICAgc3RhcnQgPSBNYXRoLmZsb29yKHNjcm9sbFJhdGlvICogdG90YWxJdGVtcyk7XG4gICAgICAgIGVuZCA9IE1hdGgubWluKHRvdGFsSXRlbXMgLSAxLCBzdGFydCArIHZpc2libGVDb3VudCAtIDEpO1xuXG4gICAgICAgIC8vIE5lYXItYm90dG9tIGhhbmRsaW5nIC0gZW5zdXJlIHdlIHNob3cgdGhlIGFjdHVhbCBsYXN0IGl0ZW1zIGF0IGJvdHRvbVxuICAgICAgICBjb25zdCBtYXhTY3JvbGwgPSB2aXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemU7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlRnJvbUJvdHRvbSA9IG1heFNjcm9sbCAtIHNjcm9sbFBvc2l0aW9uO1xuXG4gICAgICAgIGlmIChkaXN0YW5jZUZyb21Cb3R0b20gPD0gY29udGFpbmVyU2l6ZSAmJiBkaXN0YW5jZUZyb21Cb3R0b20gPj0gLTEpIHtcbiAgICAgICAgICBjb25zdCBpdGVtc0F0Qm90dG9tID0gTWF0aC5mbG9vcihjb250YWluZXJTaXplIC8gaXRlbVNpemUpO1xuICAgICAgICAgIGNvbnN0IGZpcnN0VmlzaWJsZUF0Qm90dG9tID0gTWF0aC5tYXgoMCwgdG90YWxJdGVtcyAtIGl0ZW1zQXRCb3R0b20pO1xuICAgICAgICAgIGNvbnN0IGludGVycG9sYXRpb24gPSBNYXRoLm1heChcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBNYXRoLm1pbigxLCAxIC0gZGlzdGFuY2VGcm9tQm90dG9tIC8gY29udGFpbmVyU2l6ZSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgIHN0YXJ0ICsgKGZpcnN0VmlzaWJsZUF0Qm90dG9tIC0gc3RhcnQpICogaW50ZXJwb2xhdGlvbixcbiAgICAgICAgICApO1xuICAgICAgICAgIGVuZCA9XG4gICAgICAgICAgICBkaXN0YW5jZUZyb21Cb3R0b20gPD0gMVxuICAgICAgICAgICAgICA/IHRvdGFsSXRlbXMgLSAxXG4gICAgICAgICAgICAgIDogTWF0aC5taW4odG90YWxJdGVtcyAtIDEsIHN0YXJ0ICsgdmlzaWJsZUNvdW50IC0gMSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpcmVjdCBjYWxjdWxhdGlvblxuICAgICAgICBzdGFydCA9IE1hdGguZmxvb3Ioc2Nyb2xsUG9zaXRpb24gLyBpdGVtU2l6ZSk7XG4gICAgICAgIGVuZCA9IE1hdGgubWluKHRvdGFsSXRlbXMgLSAxLCBzdGFydCArIHZpc2libGVDb3VudCAtIDEpO1xuICAgICAgfVxuXG4gICAgICAvLyBFbnN1cmUgdmFsaWQgcmFuZ2VcbiAgICAgIHN0YXJ0ID0gTWF0aC5tYXgoMCwgc3RhcnQpO1xuICAgICAgZW5kID0gTWF0aC5tYXgoc3RhcnQsIGVuZCk7XG5cbiAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIGZ1bmN0aW9uc1xuICAgIGNvbnN0IHVwZGF0ZVZpc2libGVSYW5nZSA9IChzY3JvbGxQb3NpdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUpIHJldHVybjtcblxuICAgICAgLy8gU2tpcCBpZiBzY3JvbGwgcG9zaXRpb24gaGFzbid0IGNoYW5nZWQgc2lnbmlmaWNhbnRseSAod2l0aGluIDFweClcbiAgICAgIGlmIChcbiAgICAgICAgbGFzdFNjcm9sbFBvc2l0aW9uID49IDAgJiZcbiAgICAgICAgTWF0aC5hYnMoc2Nyb2xsUG9zaXRpb24gLSBsYXN0U2Nyb2xsUG9zaXRpb24pIDwgMVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGFzdFNjcm9sbFBvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICB2aWV3cG9ydFN0YXRlLnZpc2libGVSYW5nZSA9IGNhbGN1bGF0ZVZpc2libGVSYW5nZShzY3JvbGxQb3NpdGlvbik7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBhY3R1YWwgdmlzaWJsZSByYW5nZSAod2l0aG91dCBvdmVyc2NhbikgZm9yIFVJIGRpc3BsYXlcbiAgICAgIGNvbnN0IGFjdHVhbFZpc2libGVSYW5nZSA9IGNhbGN1bGF0ZUFjdHVhbFZpc2libGVSYW5nZShzY3JvbGxQb3NpdGlvbik7XG5cbiAgICAgIC8vIFNraXAgZW1pdCBpZiByYW5nZXMgaGF2ZW4ndCBjaGFuZ2VkXG4gICAgICBpZiAoXG4gICAgICAgIGxhc3RWaXNpYmxlUmFuZ2UgJiZcbiAgICAgICAgbGFzdEFjdHVhbFZpc2libGVSYW5nZSAmJlxuICAgICAgICBsYXN0VmlzaWJsZVJhbmdlLnN0YXJ0ID09PSB2aWV3cG9ydFN0YXRlLnZpc2libGVSYW5nZS5zdGFydCAmJlxuICAgICAgICBsYXN0VmlzaWJsZVJhbmdlLmVuZCA9PT0gdmlld3BvcnRTdGF0ZS52aXNpYmxlUmFuZ2UuZW5kICYmXG4gICAgICAgIGxhc3RBY3R1YWxWaXNpYmxlUmFuZ2Uuc3RhcnQgPT09IGFjdHVhbFZpc2libGVSYW5nZS5zdGFydCAmJlxuICAgICAgICBsYXN0QWN0dWFsVmlzaWJsZVJhbmdlLmVuZCA9PT0gYWN0dWFsVmlzaWJsZVJhbmdlLmVuZFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGFzdFZpc2libGVSYW5nZSA9IHsgLi4udmlld3BvcnRTdGF0ZS52aXNpYmxlUmFuZ2UgfTtcbiAgICAgIGxhc3RBY3R1YWxWaXNpYmxlUmFuZ2UgPSB7IC4uLmFjdHVhbFZpc2libGVSYW5nZSB9O1xuXG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6cmFuZ2UtY2hhbmdlZFwiLCB7XG4gICAgICAgIHJhbmdlOiB2aWV3cG9ydFN0YXRlLnZpc2libGVSYW5nZSxcbiAgICAgICAgdmlzaWJsZVJhbmdlOiBhY3R1YWxWaXNpYmxlUmFuZ2UsXG4gICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSB0b3RhbCB2aXJ0dWFsIHNpemVcbiAgICBjb25zdCB1cGRhdGVUb3RhbFZpcnR1YWxTaXplID0gKHRvdGFsSXRlbXM6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG9sZFNpemUgPSB2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemU7XG4gICAgICB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgPSB0b3RhbEl0ZW1zO1xuICAgICAgY29uc3QgYWN0dWFsU2l6ZSA9IHRvdGFsSXRlbXMgKiB2aWV3cG9ydFN0YXRlLml0ZW1TaXplO1xuXG4gICAgICAvLyBHZXQgcGFkZGluZyBmcm9tIHRoZSBpdGVtcyBjb250YWluZXIgaWYgYXZhaWxhYmxlXG4gICAgICBsZXQgdG90YWxQYWRkaW5nID0gMDtcbiAgICAgIGlmICh2aWV3cG9ydFN0YXRlLml0ZW1zQ29udGFpbmVyKSB7XG4gICAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLml0ZW1zQ29udGFpbmVyLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBwYWRkaW5nVG9wID0gcGFyc2VGbG9hdChjb21wdXRlZFN0eWxlLnBhZGRpbmdUb3ApIHx8IDA7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdCb3R0b20gPSBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUucGFkZGluZ0JvdHRvbSkgfHwgMDtcbiAgICAgICAgdG90YWxQYWRkaW5nID0gcGFkZGluZ1RvcCArIHBhZGRpbmdCb3R0b207XG4gICAgICB9XG5cbiAgICAgIC8vIEluY2x1ZGUgcGFkZGluZyBpbiB0aGUgdmlydHVhbCBzaXplXG4gICAgICB2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemUgPSBNYXRoLm1pbihcbiAgICAgICAgYWN0dWFsU2l6ZSArIHRvdGFsUGFkZGluZyxcbiAgICAgICAgTUFYX1ZJUlRVQUxfU0laRSxcbiAgICAgICk7XG5cbiAgICAgIC8vIFN0cmF0ZWdpYyBsb2cgZm9yIGRlYnVnZ2luZyBnYXAgaXNzdWVcbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1ZpcnR1YWxdIFRvdGFsIHNpemUgdXBkYXRlOiBpdGVtcz0ke3RvdGFsSXRlbXN9LCBpdGVtU2l6ZT0ke3ZpZXdwb3J0U3RhdGUuaXRlbVNpemV9cHgsIHBhZGRpbmc9JHt0b3RhbFBhZGRpbmd9cHgsIHZpcnR1YWxTaXplPSR7dmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplfXB4ICh3YXMgJHtvbGRTaXplfXB4KWBcbiAgICAgIC8vICk7XG5cbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDp2aXJ0dWFsLXNpemUtY2hhbmdlZFwiLCB7XG4gICAgICAgIHRvdGFsVmlydHVhbFNpemU6IHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZSxcbiAgICAgICAgdG90YWxJdGVtczogdG90YWxJdGVtcyxcbiAgICAgICAgY29tcHJlc3Npb25SYXRpbzogZ2V0Q29tcHJlc3Npb25SYXRpbygpLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSBjb250YWluZXIgc2l6ZVxuICAgIGNvbnN0IHVwZGF0ZUNvbnRhaW5lclNpemUgPSAoKSA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUgfHwgIXZpZXdwb3J0U3RhdGUudmlld3BvcnRFbGVtZW50KSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHNpemUgPVxuICAgICAgICB2aWV3cG9ydFN0YXRlLnZpZXdwb3J0RWxlbWVudFtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLm9yaWVudGF0aW9uID09PSBcImhvcml6b250YWxcIlxuICAgICAgICAgICAgPyBcIm9mZnNldFdpZHRoXCJcbiAgICAgICAgICAgIDogXCJvZmZzZXRIZWlnaHRcIlxuICAgICAgICBdO1xuXG4gICAgICAvLyBMb2cgdGhlIGFjdHVhbCBtZWFzdXJlbWVudFxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbVmlydHVhbF0gQ29udGFpbmVyIHNpemUgbWVhc3VyZWQ6ICR7c2l6ZX1weCBmcm9tIHZpZXdwb3J0IGVsZW1lbnRgXG4gICAgICAvLyApO1xuXG4gICAgICBpZiAoc2l6ZSAhPT0gdmlld3BvcnRTdGF0ZS5jb250YWluZXJTaXplKSB7XG4gICAgICAgIHZpZXdwb3J0U3RhdGUuY29udGFpbmVyU2l6ZSA9IHNpemU7XG4gICAgICAgIHVwZGF0ZVZpc2libGVSYW5nZSh2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uIHx8IDApO1xuICAgICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplKHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyk7IC8vIEFsc28gdXBkYXRlIHZpcnR1YWwgc2l6ZVxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6Y29udGFpbmVyLXNpemUtY2hhbmdlZFwiLCB7XG4gICAgICAgICAgY29udGFpbmVyU2l6ZTogc2l6ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIE92ZXJyaWRlIHZpZXdwb3J0IG1ldGhvZHNcbiAgICBjb21wb25lbnQudmlld3BvcnQuZ2V0VmlzaWJsZVJhbmdlID0gKCkgPT5cbiAgICAgIHZpZXdwb3J0U3RhdGU/LnZpc2libGVSYW5nZSB8fFxuICAgICAgY2FsY3VsYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGU/LnNjcm9sbFBvc2l0aW9uIHx8IDApO1xuXG4gICAgLy8gRXZlbnQgbGlzdGVuZXJzXG4gICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpzY3JvbGxcIiwgKGRhdGE6IGFueSkgPT5cbiAgICAgIHVwZGF0ZVZpc2libGVSYW5nZShkYXRhLnBvc2l0aW9uKSxcbiAgICApO1xuXG4gICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDppdGVtcy1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgIGlmIChkYXRhLnRvdGFsSXRlbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplKGRhdGEudG90YWxJdGVtcyk7XG4gICAgICAgIHVwZGF0ZVZpc2libGVSYW5nZSh2aWV3cG9ydFN0YXRlPy5zY3JvbGxQb3NpdGlvbiB8fCAwKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIExpc3RlbiBmb3IgdG90YWwgaXRlbXMgY2hhbmdlcyAoaW1wb3J0YW50IGZvciBjdXJzb3IgcGFnaW5hdGlvbilcbiAgICAvLyBOb3RlOiBzZXRUb3RhbEl0ZW1zKCkgdXBkYXRlcyB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgQkVGT1JFIGVtaXR0aW5nIHRoaXMgZXZlbnQsXG4gICAgLy8gc28gd2UgY2FuJ3QgcmVseSBvbiB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgdG8gZGV0ZWN0IHRoZSBmaXJzdCB0b3RhbC5cbiAgICAvLyBJbnN0ZWFkIHdlIHVzZSB0aGUgaGFzUmVjYWxjdWxhdGVkU2Nyb2xsRm9yQ29tcHJlc3Npb24gZmxhZy5cbiAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnRvdGFsLWl0ZW1zLWNoYW5nZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKGRhdGEudG90YWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG4gICAgICAvLyBGSVg6IFdoZW4gd2UgZmlyc3QgcmVjZWl2ZSB0b3RhbEl0ZW1zIHdpdGggaW5pdGlhbFNjcm9sbEluZGV4IGFuZCBjb21wcmVzc2lvbixcbiAgICAgIC8vIHJlY2FsY3VsYXRlIHNjcm9sbCBwb3NpdGlvbiB0byBhY2NvdW50IGZvciBjb21wcmVzc2lvbi5cbiAgICAgIC8vIFdpdGhvdXQgdGhpcywgaW5pdGlhbFNjcm9sbEluZGV4IGNhbGN1bGF0ZXMgcG9zaXRpb24gYXMgaW5kZXggKiBpdGVtU2l6ZSxcbiAgICAgIC8vIGJ1dCByZW5kZXJpbmcgdXNlcyBjb21wcmVzc2VkIHNwYWNlLCBjYXVzaW5nIGl0ZW1zIHRvIGFwcGVhciBvZmYtc2NyZWVuLlxuICAgICAgLy9cbiAgICAgIC8vIFdlIGNoZWNrIHRoaXMgQkVGT1JFIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUgYmVjYXVzZSB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlXG4gICAgICAvLyBzY3JvbGwgcG9zaXRpb24gYmFzZWQgb24gdGhlIG5ldyB0b3RhbCwgYW5kIHRoZSBmbGFnIGVuc3VyZXMgd2Ugb25seSBkbyB0aGlzIG9uY2UuXG4gICAgICBpZiAoXG4gICAgICAgIGluaXRpYWxTY3JvbGxJbmRleCA+IDAgJiZcbiAgICAgICAgIWhhc1JlY2FsY3VsYXRlZFNjcm9sbEZvckNvbXByZXNzaW9uICYmXG4gICAgICAgIGRhdGEudG90YWwgPiAwXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgYWN0dWFsVG90YWxTaXplID0gZGF0YS50b3RhbCAqIHZpZXdwb3J0U3RhdGUuaXRlbVNpemU7XG4gICAgICAgIGNvbnN0IGlzQ29tcHJlc3NlZCA9IGFjdHVhbFRvdGFsU2l6ZSA+IE1BWF9WSVJUVUFMX1NJWkU7XG5cbiAgICAgICAgaWYgKGlzQ29tcHJlc3NlZCkge1xuICAgICAgICAgIC8vIFJlY2FsY3VsYXRlIHNjcm9sbCBwb3NpdGlvbiB1c2luZyBjb21wcmVzc2lvbi1hd2FyZSBmb3JtdWxhXG4gICAgICAgICAgLy8gU2FtZSBmb3JtdWxhIHVzZWQgaW4gc2Nyb2xsVG9JbmRleFxuICAgICAgICAgIGNvbnN0IHJhdGlvID0gaW5pdGlhbFNjcm9sbEluZGV4IC8gZGF0YS50b3RhbDtcbiAgICAgICAgICBjb25zdCBjb21wcmVzc2VkUG9zaXRpb24gPSByYXRpbyAqIE1BWF9WSVJUVUFMX1NJWkU7XG5cbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID0gY29tcHJlc3NlZFBvc2l0aW9uO1xuXG4gICAgICAgICAgLy8gTm90aWZ5IHNjcm9sbGluZyBmZWF0dXJlIHRvIHN5bmMgaXRzIGxvY2FsIHNjcm9sbCBwb3NpdGlvblxuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpzY3JvbGwtcG9zaXRpb24tc3luY1wiLCB7XG4gICAgICAgICAgICBwb3NpdGlvbjogY29tcHJlc3NlZFBvc2l0aW9uLFxuICAgICAgICAgICAgc291cmNlOiBcImNvbXByZXNzaW9uLXJlY2FsY3VsYXRpb25cIixcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIENsZWFyIHRhcmdldFNjcm9sbEluZGV4IHNpbmNlIHdlJ3ZlIG5vdyBjb3JyZWN0bHkgY2FsY3VsYXRlZCB0aGUgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgICAgLy8gVGhlIG5vcm1hbCBjb21wcmVzc2VkIHNjcm9sbGluZyBmb3JtdWxhIHdpbGwgbm93IHdvcmsgY29ycmVjdGx5XG4gICAgICAgICAgZGVsZXRlICh2aWV3cG9ydFN0YXRlIGFzIGFueSkudGFyZ2V0U2Nyb2xsSW5kZXg7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYXJrIGFzIGRvbmUgZXZlbiBpZiBub3QgY29tcHJlc3NlZCAtIHdlIG9ubHkgd2FudCB0byBkbyB0aGlzIGNoZWNrIG9uY2VcbiAgICAgICAgaGFzUmVjYWxjdWxhdGVkU2Nyb2xsRm9yQ29tcHJlc3Npb24gPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplKGRhdGEudG90YWwpO1xuICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGU/LnNjcm9sbFBvc2l0aW9uIHx8IDApO1xuXG4gICAgICAvLyBUcmlnZ2VyIGEgcmVuZGVyIHRvIHVwZGF0ZSB0aGUgdmlld1xuICAgICAgY29tcG9uZW50LnZpZXdwb3J0Py5yZW5kZXJJdGVtcz8uKCk7XG4gICAgfSk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIGNvbnRhaW5lciBzaXplIGNoYW5nZXMgdG8gcmVjYWxjdWxhdGUgdmlydHVhbCBzaXplXG4gICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpjb250YWluZXItc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgIGlmICh2aWV3cG9ydFN0YXRlICYmIGRhdGEuY29udGFpbmVyU2l6ZSAhPT0gdmlld3BvcnRTdGF0ZS5jb250YWluZXJTaXplKSB7XG4gICAgICAgIHZpZXdwb3J0U3RhdGUuY29udGFpbmVyU2l6ZSA9IGRhdGEuY29udGFpbmVyU2l6ZTtcbiAgICAgICAgLy8gUmVjYWxjdWxhdGUgdmlydHVhbCBzaXplIHdpdGggbmV3IGNvbnRhaW5lciBzaXplXG4gICAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUodmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zKTtcbiAgICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb21wb25lbnQub24/LihcImNvbGxlY3Rpb246cmFuZ2UtbG9hZGVkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgZGF0YS50b3RhbCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIGRhdGEudG90YWwgIT09IHZpZXdwb3J0U3RhdGU/LnRvdGFsSXRlbXNcbiAgICAgICkge1xuICAgICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplKGRhdGEudG90YWwpO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3JjZSB2aXNpYmxlIHJhbmdlIHJlY2FsY3VsYXRpb24gYWZ0ZXIgZGF0YSBsb2Fkc1xuICAgICAgLy8gVGhpcyBpcyBjcml0aWNhbDogdG90YWxJdGVtcyBtYXkgaGF2ZSBiZWVuIHVwZGF0ZWQgYnkgY29sbGVjdGlvbi5zZXRUb3RhbEl0ZW1zKClcbiAgICAgIC8vIHdoaWNoIGJ5cGFzc2VzIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUsIHNvIGxhc3RTY3JvbGxQb3NpdGlvbiB3YXNuJ3QgcmVzZXQuXG4gICAgICAvLyBXZSBtdXN0IHJlY2FsY3VsYXRlIHRvIGVuc3VyZSB2aXNpYmxlUmFuZ2UgcmVmbGVjdHMgdGhlIG5ldyB0b3RhbEl0ZW1zLlxuICAgICAgbGFzdFNjcm9sbFBvc2l0aW9uID0gLTE7XG5cbiAgICAgIHVwZGF0ZVZpc2libGVSYW5nZSh2aWV3cG9ydFN0YXRlPy5zY3JvbGxQb3NpdGlvbiB8fCAwKTtcbiAgICAgIGNvbXBvbmVudC52aWV3cG9ydD8ucmVuZGVySXRlbXM/LigpO1xuICAgIH0pO1xuXG4gICAgLy8gTGlzdGVuIGZvciBmaXJzdCBpdGVtcyByZW5kZXJlZCB0byBjYWxjdWxhdGUgaXRlbSBzaXplIChpZiBhdXRvLWRldGVjdGlvbiBpcyBlbmFibGVkKVxuICAgIGlmIChhdXRvRGV0ZWN0SXRlbVNpemUpIHtcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6aXRlbXMtcmVuZGVyZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIWhhc0NhbGN1bGF0ZWRJdGVtU2l6ZSAmJlxuICAgICAgICAgIGRhdGEuZWxlbWVudHM/Lmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIENhbGN1bGF0ZSBhdmVyYWdlIGl0ZW0gc2l6ZSBmcm9tIGZpcnN0IHJlbmRlcmVkIGJhdGNoXG4gICAgICAgICAgY29uc3Qgc2l6ZXM6IG51bWJlcltdID0gW107XG4gICAgICAgICAgY29uc3Qgc2l6ZVByb3BlcnR5ID1cbiAgICAgICAgICAgIG9yaWVudGF0aW9uID09PSBcImhvcml6b250YWxcIiA/IFwib2Zmc2V0V2lkdGhcIiA6IFwib2Zmc2V0SGVpZ2h0XCI7XG5cbiAgICAgICAgICBkYXRhLmVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzaXplID0gZWxlbWVudFtzaXplUHJvcGVydHldO1xuICAgICAgICAgICAgaWYgKHNpemUgPiAwKSB7XG4gICAgICAgICAgICAgIHNpemVzLnB1c2goc2l6ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoc2l6ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgYXZnU2l6ZSA9IE1hdGgucm91bmQoXG4gICAgICAgICAgICAgIHNpemVzLnJlZHVjZSgoc3VtLCBzaXplKSA9PiBzdW0gKyBzaXplLCAwKSAvIHNpemVzLmxlbmd0aCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c0l0ZW1TaXplID0gdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZTtcbiAgICAgICAgICAgIHZpZXdwb3J0U3RhdGUuaXRlbVNpemUgPSBhdmdTaXplO1xuXG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGFuIGluaXRpYWxTY3JvbGxJbmRleCwgcmVjYWxjdWxhdGUgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgICAgICAvLyBiYXNlZCBvbiB0aGUgbmV3bHkgZGV0ZWN0ZWQgaXRlbSBzaXplXG4gICAgICAgICAgICBpZiAoaW5pdGlhbFNjcm9sbEluZGV4ID4gMCAmJiBhdmdTaXplICE9PSBwcmV2aW91c0l0ZW1TaXplKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG5ld1Njcm9sbFBvc2l0aW9uID0gaW5pdGlhbFNjcm9sbEluZGV4ICogYXZnU2l6ZTtcbiAgICAgICAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiA9IG5ld1Njcm9sbFBvc2l0aW9uO1xuXG4gICAgICAgICAgICAgIC8vIE5vdGlmeSBzY3JvbGxpbmcgZmVhdHVyZSB0byBzeW5jIGl0cyBsb2NhbCBzY3JvbGwgcG9zaXRpb25cbiAgICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnNjcm9sbC1wb3NpdGlvbi1zeW5jXCIsIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogbmV3U2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgICAgICAgc291cmNlOiBcIml0ZW0tc2l6ZS1kZXRlY3RlZFwiLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmVjYWxjdWxhdGUgZXZlcnl0aGluZyB3aXRoIG5ldyBzaXplXG4gICAgICAgICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplKHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyk7XG4gICAgICAgICAgICB1cGRhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiB8fCAwKTtcblxuICAgICAgICAgICAgLy8gUmUtcmVuZGVyIHRvIGFkanVzdCBwb3NpdGlvbnNcbiAgICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydD8ucmVuZGVySXRlbXM/LigpO1xuXG4gICAgICAgICAgICAvLyBFbWl0IGV2ZW50IGZvciBzaXplIGNoYW5nZVxuICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0Oml0ZW0tc2l6ZS1kZXRlY3RlZFwiLCB7XG4gICAgICAgICAgICAgIHByZXZpb3VzU2l6ZTogaW5pdGlhbEl0ZW1TaXplLFxuICAgICAgICAgICAgICBkZXRlY3RlZFNpemU6IGF2Z1NpemUsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaGFzQ2FsY3VsYXRlZEl0ZW1TaXplID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENsZWFuIHVwIFJlc2l6ZU9ic2VydmVyIG9uIGRlc3Ryb3lcbiAgICB3cmFwRGVzdHJveShjb21wb25lbnQsICgpID0+IHtcbiAgICAgIGlmIChyZXNpemVPYnNlcnZlcikge1xuICAgICAgICByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIHJlc2l6ZU9ic2VydmVyID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEV4cG9zZSB2aXJ0dWFsIEFQSVxuICAgIGNvbnN0IGNvbXByZXNzaW9uUmF0aW8gPSBnZXRDb21wcmVzc2lvblJhdGlvKCk7XG4gICAgKGNvbXBvbmVudCBhcyBhbnkpLnZpcnR1YWwgPSB7XG4gICAgICBjYWxjdWxhdGVWaXNpYmxlUmFuZ2UsXG4gICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplLFxuICAgICAgZ2V0VG90YWxWaXJ0dWFsU2l6ZTogKCkgPT4gdmlld3BvcnRTdGF0ZT8udmlydHVhbFRvdGFsU2l6ZSB8fCAwLFxuICAgICAgZ2V0Q29udGFpbmVyU2l6ZTogKCkgPT4gdmlld3BvcnRTdGF0ZT8uY29udGFpbmVyU2l6ZSB8fCAwLFxuICAgICAgdXBkYXRlQ29udGFpbmVyU2l6ZTogKHNpemU6IG51bWJlcikgPT4ge1xuICAgICAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuY29udGFpbmVyU2l6ZSA9IHNpemU7XG4gICAgICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBnZXRJdGVtU2l6ZTogKCkgPT4gdmlld3BvcnRTdGF0ZT8uaXRlbVNpemUgfHwgaW5pdGlhbEl0ZW1TaXplLFxuICAgICAgY2FsY3VsYXRlSW5kZXhGcm9tUG9zaXRpb246IChwb3NpdGlvbjogbnVtYmVyKSA9PlxuICAgICAgICBNYXRoLmZsb29yKFxuICAgICAgICAgIHBvc2l0aW9uIC9cbiAgICAgICAgICAgICgodmlld3BvcnRTdGF0ZT8uaXRlbVNpemUgfHwgaW5pdGlhbEl0ZW1TaXplKSAqIGNvbXByZXNzaW9uUmF0aW8pLFxuICAgICAgICApLFxuICAgICAgY2FsY3VsYXRlUG9zaXRpb25Gb3JJbmRleDogKGluZGV4OiBudW1iZXIpID0+XG4gICAgICAgIGluZGV4ICogKHZpZXdwb3J0U3RhdGU/Lml0ZW1TaXplIHx8IGluaXRpYWxJdGVtU2l6ZSkgKiBjb21wcmVzc2lvblJhdGlvLFxuICAgIH07XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9O1xufTtcbiIsCiAgICAiLyoqXG4gKiBTY3JvbGxpbmcgRmVhdHVyZSAtIFZpcnR1YWwgc2Nyb2xsaW5nIHdpdGggaW50ZWdyYXRlZCB2ZWxvY2l0eSB0cmFja2luZ1xuICogSGFuZGxlcyB3aGVlbCBldmVudHMsIHRvdWNoL21vdXNlIGV2ZW50cywgc2Nyb2xsIHBvc2l0aW9uIG1hbmFnZW1lbnQsIHZlbG9jaXR5IG1lYXN1cmVtZW50LCBhbmQgbW9tZW50dW0gc2Nyb2xsaW5nXG4gKi9cblxuaW1wb3J0IHsgUFJFRklYIH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB0eXBlIHsgVmlld3BvcnRDb250ZXh0LCBWaWV3cG9ydENvbXBvbmVudCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVklFV1BPUlRfQ09OU1RBTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgd3JhcEluaXRpYWxpemUsIGdldFZpZXdwb3J0U3RhdGUsIGNsYW1wIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTY3JvbGxpbmdDb25maWcge1xuICBvcmllbnRhdGlvbj86IFwidmVydGljYWxcIiB8IFwiaG9yaXpvbnRhbFwiO1xuICBzZW5zaXRpdml0eT86IG51bWJlcjtcbiAgc21vb3RoaW5nPzogYm9vbGVhbjtcbiAgaWRsZVRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKiBTdG9wIHNjcm9sbGluZyB3aGVuIGNsaWNraW5nIG9uIHRoZSB2aWV3cG9ydCAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgc3RvcE9uQ2xpY2s/OiBib29sZWFuO1xufVxuXG4vLyBTcGVlZCB0cmFja2VyIGludGVyZmFjZVxuaW50ZXJmYWNlIFNwZWVkVHJhY2tlciB7XG4gIHZlbG9jaXR5OiBudW1iZXI7XG4gIGxhc3RQb3NpdGlvbjogbnVtYmVyO1xuICBsYXN0VGltZTogbnVtYmVyO1xuICBkaXJlY3Rpb246IFwiZm9yd2FyZFwiIHwgXCJiYWNrd2FyZFwiO1xuICBzYW1wbGVzOiBBcnJheTx7IHBvc2l0aW9uOiBudW1iZXI7IHRpbWU6IG51bWJlciB9Pjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHNwZWVkIHRyYWNrZXJcbiAqL1xuY29uc3QgY3JlYXRlU3BlZWRUcmFja2VyID0gKCk6IFNwZWVkVHJhY2tlciA9PiAoe1xuICB2ZWxvY2l0eTogMCxcbiAgbGFzdFBvc2l0aW9uOiAwLFxuICBsYXN0VGltZTogRGF0ZS5ub3coKSxcbiAgZGlyZWN0aW9uOiBcImZvcndhcmRcIixcbiAgc2FtcGxlczogW10sXG59KTtcblxuLyoqXG4gKiBVcGRhdGVzIHNwZWVkIHRyYWNrZXIgd2l0aCBuZXcgcG9zaXRpb25cbiAqL1xuY29uc3QgdXBkYXRlU3BlZWRUcmFja2VyID0gKFxuICB0cmFja2VyOiBTcGVlZFRyYWNrZXIsXG4gIG5ld1Bvc2l0aW9uOiBudW1iZXIsXG4gIHByZXZpb3VzUG9zaXRpb246IG51bWJlcixcbik6IFNwZWVkVHJhY2tlciA9PiB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IHRpbWVEZWx0YSA9IG5vdyAtIHRyYWNrZXIubGFzdFRpbWU7XG5cbiAgaWYgKHRpbWVEZWx0YSA9PT0gMCkgcmV0dXJuIHRyYWNrZXI7XG5cbiAgY29uc3QgcG9zaXRpb25EZWx0YSA9IG5ld1Bvc2l0aW9uIC0gcHJldmlvdXNQb3NpdGlvbjtcbiAgLy8gS2VlcCB2ZWxvY2l0eSBzaWduZWQgKHBvc2l0aXZlID0gZm9yd2FyZC9kb3duLCBuZWdhdGl2ZSA9IGJhY2t3YXJkL3VwKVxuICBjb25zdCBpbnN0YW50VmVsb2NpdHkgPSBwb3NpdGlvbkRlbHRhIC8gdGltZURlbHRhO1xuXG4gIC8vIEFkZCBuZXcgc2FtcGxlXG4gIGNvbnN0IHNhbXBsZXMgPSBbLi4udHJhY2tlci5zYW1wbGVzLCB7IHBvc2l0aW9uOiBuZXdQb3NpdGlvbiwgdGltZTogbm93IH1dO1xuXG4gIC8vIEtlZXAgb25seSByZWNlbnQgc2FtcGxlcyAobGFzdCAxMDBtcylcbiAgY29uc3QgcmVjZW50U2FtcGxlcyA9IHNhbXBsZXMuZmlsdGVyKChzKSA9PiBub3cgLSBzLnRpbWUgPCAxMDApO1xuXG4gIC8vIENhbGN1bGF0ZSBhdmVyYWdlIHZlbG9jaXR5IGZyb20gcmVjZW50IHNhbXBsZXMgKHByZXNlcnZpbmcgc2lnbi9kaXJlY3Rpb24pXG4gIGxldCBhdmdWZWxvY2l0eSA9IGluc3RhbnRWZWxvY2l0eTtcbiAgaWYgKHJlY2VudFNhbXBsZXMubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IG9sZGVzdFNhbXBsZSA9IHJlY2VudFNhbXBsZXNbMF07XG4gICAgY29uc3QgdG90YWxEaXN0YW5jZSA9IG5ld1Bvc2l0aW9uIC0gb2xkZXN0U2FtcGxlLnBvc2l0aW9uOyAvLyBTaWduZWQgZGlzdGFuY2VcbiAgICBjb25zdCB0b3RhbFRpbWUgPSBub3cgLSBvbGRlc3RTYW1wbGUudGltZTtcbiAgICBhdmdWZWxvY2l0eSA9IHRvdGFsVGltZSA+IDAgPyB0b3RhbERpc3RhbmNlIC8gdG90YWxUaW1lIDogaW5zdGFudFZlbG9jaXR5O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB2ZWxvY2l0eTogYXZnVmVsb2NpdHksXG4gICAgbGFzdFBvc2l0aW9uOiBuZXdQb3NpdGlvbixcbiAgICBsYXN0VGltZTogbm93LFxuICAgIGRpcmVjdGlvbjogcG9zaXRpb25EZWx0YSA+PSAwID8gXCJmb3J3YXJkXCIgOiBcImJhY2t3YXJkXCIsXG4gICAgc2FtcGxlczogcmVjZW50U2FtcGxlcyxcbiAgfTtcbn07XG5cbi8qKlxuICogU2Nyb2xsaW5nIGZlYXR1cmUgZm9yIHZpZXdwb3J0XG4gKiBIYW5kbGVzIHdoZWVsIGV2ZW50cywgdmVsb2NpdHkgdHJhY2tpbmcsIGFuZCBpZGxlIGRldGVjdGlvblxuICovXG5leHBvcnQgY29uc3Qgd2l0aFNjcm9sbGluZyA9IChjb25maWc6IFNjcm9sbGluZ0NvbmZpZyA9IHt9KSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50Pihjb21wb25lbnQ6IFQpOiBUID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBvcmllbnRhdGlvbiA9IFwidmVydGljYWxcIixcbiAgICAgIHNlbnNpdGl2aXR5ID0gVklFV1BPUlRfQ09OU1RBTlRTLlZJUlRVQUxfU0NST0xMLlNDUk9MTF9TRU5TSVRJVklUWSxcbiAgICAgIHNtb290aGluZyA9IGZhbHNlLFxuICAgICAgaWRsZVRpbWVvdXQgPSAxMDAsIC8vIERlZmF1bHQgaWRsZSB0aW1lb3V0IGluIG1zXG4gICAgICBzdG9wT25DbGljayA9IHRydWUsIC8vIFN0b3Agc2Nyb2xsaW5nIG9uIGNsaWNrIGJ5IGRlZmF1bHRcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gU3RhdGVcbiAgICBsZXQgc2Nyb2xsUG9zaXRpb24gPSAwO1xuICAgIGxldCB0b3RhbFZpcnR1YWxTaXplID0gMDtcbiAgICBsZXQgY29udGFpbmVyU2l6ZSA9IDA7XG4gICAgbGV0IGlzU2Nyb2xsaW5nID0gZmFsc2U7XG4gICAgbGV0IGlzU2Nyb2xsZWRGcm9tVG9wID0gZmFsc2U7IC8vIFRyYWNrIGlmIHNjcm9sbGVkIGF3YXkgZnJvbSB0b3BcbiAgICBsZXQgbGFzdFNjcm9sbFRpbWUgPSAwO1xuXG4gICAgLyoqXG4gICAgICogSGVscGVyIHRvIHJlbW92ZSB0aGUgLS1zY3JvbGxlZCBjbGFzcyBmcm9tIHRoZSB2bGlzdCBjb250YWluZXJcbiAgICAgKi9cbiAgICBjb25zdCByZW1vdmVTY3JvbGxlZENsYXNzID0gKCkgPT4ge1xuICAgICAgY29uc3Qgdmlld3BvcnRFbCA9XG4gICAgICAgIChjb21wb25lbnQgYXMgYW55KS52aWV3cG9ydEVsZW1lbnQgfHxcbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLl9zY3JvbGxpbmdWaWV3cG9ydEVsZW1lbnQ7XG4gICAgICBpZiAodmlld3BvcnRFbCkge1xuICAgICAgICBjb25zdCB2bGlzdENvbnRhaW5lciA9IHZpZXdwb3J0RWwuY2xvc2VzdChgLiR7UFJFRklYfS12bGlzdGApO1xuICAgICAgICBpZiAodmxpc3RDb250YWluZXIpIHtcbiAgICAgICAgICB2bGlzdENvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKGAke1BSRUZJWH0tdmxpc3QtLXNjcm9sbGVkYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gTGlzdGVuIGZvciByZWxvYWQ6c3RhcnQgdG8gcmVzZXQgZmVhdHVyZS1zcGVjaWZpYyBzdGF0ZVxuICAgIGNvbXBvbmVudC5vbj8uKFwicmVsb2FkOnN0YXJ0XCIsICgpID0+IHtcbiAgICAgIHNjcm9sbFBvc2l0aW9uID0gMDtcbiAgICAgIHRvdGFsVmlydHVhbFNpemUgPSAwO1xuICAgICAgaXNTY3JvbGxpbmcgPSBmYWxzZTtcbiAgICAgIGlzU2Nyb2xsZWRGcm9tVG9wID0gZmFsc2U7XG4gICAgICBsYXN0U2Nyb2xsVGltZSA9IDA7XG4gICAgICBzcGVlZFRyYWNrZXIgPSBjcmVhdGVTcGVlZFRyYWNrZXIoKTtcbiAgICAgIGhhc0VtaXR0ZWRJZGxlID0gZmFsc2U7XG4gICAgICBhbmNob3JQb3NpdGlvbiA9IG51bGw7XG4gICAgICBhbmNob3JUaW1lID0gMDtcbiAgICAgIGxhc3RXaGVlbFRpbWUgPSAwO1xuICAgICAgYW5jaG9ySW5pdGlhbERlbHRhID0gMDtcbiAgICAgIGFuY2hvckxhc3REZWx0YSA9IDA7XG4gICAgICBhbmNob3JNaW5EZWx0YSA9IEluZmluaXR5O1xuICAgICAgY29uc2VjdXRpdmVJbmNyZWFzZXMgPSAwO1xuICAgICAgc3VzdGFpbmVkSGlnaENvdW50ID0gMDtcbiAgICAgIHJlbmRlclNjaGVkdWxlZCA9IGZhbHNlO1xuICAgICAgcGVuZGluZ1Njcm9sbERhdGEgPSBudWxsO1xuXG4gICAgICAvLyBDbGVhciBhbnkgcGVuZGluZyB0aW1lb3V0c1xuICAgICAgaWYgKGlkbGVUaW1lb3V0SWQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGlkbGVUaW1lb3V0SWQpO1xuICAgICAgICBpZGxlVGltZW91dElkID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHN0b3BJZGxlRGV0ZWN0aW9uKCk7XG5cbiAgICAgIC8vIFJlbW92ZSAtLXNjcm9sbGVkIGNsYXNzIGZyb20gRE9NIHNpbmNlIHdlJ3JlIHJlc2V0dGluZyB0byB0b3BcbiAgICAgIHJlbW92ZVNjcm9sbGVkQ2xhc3MoKTtcbiAgICB9KTtcblxuICAgIC8vIExpc3RlbiBmb3IgY2xlYXJlZCBldmVudCAoZnJvbSB2bGlzdC5jbGVhcigpKSB0byByZXNldCBzY3JvbGxlZCBzdGF0ZVxuICAgIGNvbXBvbmVudC5vbj8uKFwiY2xlYXJlZFwiLCAoKSA9PiB7XG4gICAgICBzY3JvbGxQb3NpdGlvbiA9IDA7XG4gICAgICB0b3RhbFZpcnR1YWxTaXplID0gMDtcbiAgICAgIGlzU2Nyb2xsZWRGcm9tVG9wID0gZmFsc2U7XG4gICAgICByZW1vdmVTY3JvbGxlZENsYXNzKCk7XG4gICAgfSk7XG4gICAgbGV0IHNwZWVkVHJhY2tlciA9IGNyZWF0ZVNwZWVkVHJhY2tlcigpO1xuICAgIGxldCBpZGxlVGltZW91dElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaWRsZUNoZWNrRnJhbWU6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGxldCBsYXN0SWRsZUNoZWNrUG9zaXRpb24gPSAwO1xuICAgIGxldCBoYXNFbWl0dGVkSWRsZSA9IGZhbHNlOyAvLyBUcmFjayBpZiB3ZSd2ZSBhbHJlYWR5IGVtaXR0ZWQgaWRsZVxuICAgIGxldCBhbmNob3JQb3NpdGlvbjogbnVtYmVyIHwgbnVsbCA9IG51bGw7IC8vIEFuY2hvciBwb3NpdGlvbiB0byBtYWludGFpbiBvbiBjbGljayAoZm9yIHN0b3BPbkNsaWNrKVxuICAgIGxldCBhbmNob3JUaW1lID0gMDsgLy8gVGltZXN0YW1wIHdoZW4gYW5jaG9yIHdhcyBzZXRcbiAgICBsZXQgbGFzdFdoZWVsVGltZSA9IDA7IC8vIFRpbWVzdGFtcCBvZiBsYXN0IHdoZWVsIGV2ZW50IChmb3IgZGV0ZWN0aW5nIGdhcHMpXG4gICAgbGV0IGFuY2hvckluaXRpYWxEZWx0YSA9IDA7IC8vIEluaXRpYWwgd2hlZWwgZGVsdGEgd2hlbiBhbmNob3Igd2FzIHNldCAodG8gZGV0ZWN0IGRlY2F5KVxuICAgIGxldCBhbmNob3JMYXN0RGVsdGEgPSAwOyAvLyBQcmV2aW91cyB3aGVlbCBkZWx0YSAodG8gZGV0ZWN0IGluY3JlYXNpbmcgZGVsdGEgPSBuZXcgc2Nyb2xsKVxuICAgIGxldCBhbmNob3JNaW5EZWx0YSA9IEluZmluaXR5OyAvLyBNaW5pbXVtIGRlbHRhIHNlZW4gc2luY2UgYW5jaG9yICh0byBkZXRlY3QgcmVhY2NlbGVyYXRpb24pXG4gICAgbGV0IGNvbnNlY3V0aXZlSW5jcmVhc2VzID0gMDsgLy8gQ291bnQgb2YgY29uc2VjdXRpdmUgZGVsdGEgaW5jcmVhc2VzICh0byBkZXRlY3Qgc3VzdGFpbmVkIG5ldyBzY3JvbGxpbmcpXG4gICAgbGV0IHN1c3RhaW5lZEhpZ2hDb3VudCA9IDA7IC8vIENvdW50IG9mIGV2ZW50cyB3aGVyZSBkZWx0YSBpcyBzaWduaWZpY2FudGx5IGFib3ZlIG1pbmltdW0gKHN1c3RhaW5lZCBuZXcgc2Nyb2xsaW5nKVxuXG4gICAgLy8gUkFGLWJhc2VkIHJlbmRlciB0aHJvdHRsaW5nIC0gcHJldmVudHMgd2FzdGVkIHJlbmRlcnMgZHVyaW5nIGZhc3Qgc2Nyb2xsaW5nXG4gICAgbGV0IHJlbmRlclNjaGVkdWxlZCA9IGZhbHNlO1xuICAgIGxldCBwZW5kaW5nU2Nyb2xsRGF0YToge1xuICAgICAgcG9zaXRpb246IG51bWJlcjtcbiAgICAgIGRpcmVjdGlvbjogXCJmb3J3YXJkXCIgfCBcImJhY2t3YXJkXCI7XG4gICAgICBwcmV2aW91c1Bvc2l0aW9uOiBudW1iZXI7XG4gICAgfSB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gY29uc29sZS5sb2coYFtTY3JvbGxpbmddIEluaXRpYWwgc3RhdGUgLSBwb3NpdGlvbjogJHtzY3JvbGxQb3NpdGlvbn1gKTtcblxuICAgIC8vIFRocmVzaG9sZCBmb3IgY29uc2lkZXJpbmcgdGhlIGxpc3QgXCJzY3JvbGxlZFwiIChpbiBwaXhlbHMpXG4gICAgY29uc3QgU0NST0xMRURfVEhSRVNIT0xEID0gMTtcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIHNjcm9sbGVkIHN0YXRlIGNsYXNzIG9uIHRoZSB2bGlzdCBjb250YWluZXJcbiAgICAgKiBBZGRzIC0tc2Nyb2xsZWQgbW9kaWZpZXIgd2hlbiBsaXN0IGlzIG5vdCBhdCB0aGUgdG9wXG4gICAgICovXG4gICAgY29uc3QgdXBkYXRlU2Nyb2xsZWRTdGF0ZSA9IChcbiAgICAgIHZpZXdwb3J0RWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgICBwb3NpdGlvbjogbnVtYmVyLFxuICAgICkgPT4ge1xuICAgICAgY29uc3Qgc2hvdWxkQmVTY3JvbGxlZCA9IHBvc2l0aW9uID4gU0NST0xMRURfVEhSRVNIT0xEO1xuICAgICAgaWYgKHNob3VsZEJlU2Nyb2xsZWQgIT09IGlzU2Nyb2xsZWRGcm9tVG9wKSB7XG4gICAgICAgIGlzU2Nyb2xsZWRGcm9tVG9wID0gc2hvdWxkQmVTY3JvbGxlZDtcbiAgICAgICAgLy8gRmluZCB0aGUgdmxpc3QgY29udGFpbmVyIChwYXJlbnQgb2Ygdmlld3BvcnQpXG4gICAgICAgIGNvbnN0IHZsaXN0Q29udGFpbmVyID0gdmlld3BvcnRFbGVtZW50LmNsb3Nlc3QoYC4ke1BSRUZJWH0tdmxpc3RgKTtcbiAgICAgICAgaWYgKHZsaXN0Q29udGFpbmVyKSB7XG4gICAgICAgICAgdmxpc3RDb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZShcbiAgICAgICAgICAgIGAke1BSRUZJWH0tdmxpc3QtLXNjcm9sbGVkYCxcbiAgICAgICAgICAgIHNob3VsZEJlU2Nyb2xsZWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBHZXQgdmlld3BvcnQgc3RhdGVcbiAgICBsZXQgdmlld3BvcnRTdGF0ZTogYW55O1xuXG4gICAgLy8gVXNlIHNoYXJlZCBpbml0aWFsaXphdGlvbiB3cmFwcGVyXG4gICAgd3JhcEluaXRpYWxpemUoY29tcG9uZW50LCAoKSA9PiB7XG4gICAgICB2aWV3cG9ydFN0YXRlID0gZ2V0Vmlld3BvcnRTdGF0ZShjb21wb25lbnQpO1xuXG4gICAgICAvLyBJbml0aWFsaXplIHN0YXRlIHZhbHVlc1xuICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9IHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZSB8fCAwO1xuICAgICAgICBjb250YWluZXJTaXplID0gdmlld3BvcnRTdGF0ZS5jb250YWluZXJTaXplIHx8IDA7XG4gICAgICAgIC8vIFN5bmMgc2Nyb2xsUG9zaXRpb24gZnJvbSB2aWV3cG9ydFN0YXRlIChpbXBvcnRhbnQgZm9yIGluaXRpYWxTY3JvbGxJbmRleClcbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPiAwKSB7XG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb24gPSB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgdmlydHVhbCBzaXplIGNoYW5nZXNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6dmlydHVhbC1zaXplLWNoYW5nZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltTY3JvbGxpbmddIFZpcnR1YWwgc2l6ZSBjaGFuZ2VkOlwiLCBkYXRhKTtcbiAgICAgICAgdXBkYXRlU2Nyb2xsQm91bmRzKGRhdGEudG90YWxWaXJ0dWFsU2l6ZSwgY29udGFpbmVyU2l6ZSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBzY3JvbGwgcG9zaXRpb24gY2hhbmdlcyBmcm9tIG90aGVyIGZlYXR1cmVzIChlLmcuLCB2aXJ0dWFsLnRzIGFmdGVyIGl0ZW0gc2l6ZSBkZXRlY3Rpb24pXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnNjcm9sbC1wb3NpdGlvbi1zeW5jXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGRhdGEucG9zaXRpb24gIT09IHVuZGVmaW5lZCAmJiBkYXRhLnBvc2l0aW9uICE9PSBzY3JvbGxQb3NpdGlvbikge1xuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbjtcbiAgICAgICAgICAvLyBBbHNvIHVwZGF0ZSBsb2NhbCB0cmFja2luZyB2YXJzXG4gICAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9XG4gICAgICAgICAgICB2aWV3cG9ydFN0YXRlPy52aXJ0dWFsVG90YWxTaXplIHx8IHRvdGFsVmlydHVhbFNpemU7XG4gICAgICAgICAgY29udGFpbmVyU2l6ZSA9IHZpZXdwb3J0U3RhdGU/LmNvbnRhaW5lclNpemUgfHwgY29udGFpbmVyU2l6ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgY29udGFpbmVyIHNpemUgY2hhbmdlc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpjb250YWluZXItc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGRhdGEuY29udGFpbmVyU2l6ZSkge1xuICAgICAgICAgIGNvbnRhaW5lclNpemUgPSBkYXRhLmNvbnRhaW5lclNpemU7XG4gICAgICAgICAgdXBkYXRlU2Nyb2xsQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gQXR0YWNoIHdoZWVsIGV2ZW50IGxpc3RlbmVyIHRvIHZpZXdwb3J0IGVsZW1lbnRcbiAgICAgIGNvbnN0IHZpZXdwb3J0RWxlbWVudCA9XG4gICAgICAgIHZpZXdwb3J0U3RhdGU/LnZpZXdwb3J0RWxlbWVudCB8fCAoY29tcG9uZW50IGFzIGFueSkudmlld3BvcnRFbGVtZW50O1xuICAgICAgaWYgKHZpZXdwb3J0RWxlbWVudCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW1Njcm9sbGluZ10gQXR0YWNoaW5nIHdoZWVsIGV2ZW50IHRvIHZpZXdwb3J0IGVsZW1lbnRgKTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLCBoYW5kbGVXaGVlbCwge1xuICAgICAgICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIHNjcm9sbGVkIHN0YXRlIGJhc2VkIG9uIGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgIHVwZGF0ZVNjcm9sbGVkU3RhdGUodmlld3BvcnRFbGVtZW50LCBzY3JvbGxQb3NpdGlvbik7XG5cbiAgICAgICAgLy8gQWRkIG1vdXNlZG93biBsaXN0ZW5lciB0byBzdG9wIHNjcm9sbGluZyBvbiBjbGlja1xuICAgICAgICBpZiAoc3RvcE9uQ2xpY2spIHtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBoYW5kbGVNb3VzZURvd24pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RvcmUgcmVmZXJlbmNlIGZvciBjbGVhbnVwXG4gICAgICAgIChjb21wb25lbnQgYXMgYW55KS5fc2Nyb2xsaW5nVmlld3BvcnRFbGVtZW50ID0gdmlld3BvcnRFbGVtZW50O1xuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuX3Njcm9sbGluZ1N0b3BPbkNsaWNrID0gc3RvcE9uQ2xpY2s7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oYFtTY3JvbGxpbmddIE5vIHZpZXdwb3J0IGVsZW1lbnQgZm91bmQgZm9yIHdoZWVsIGV2ZW50c2ApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVXNlIGNsYW1wIGZyb20gdXRpbHNcblxuICAgIC8vIFN0YXJ0IGlkbGUgZGV0ZWN0aW9uXG4gICAgY29uc3Qgc3RhcnRJZGxlRGV0ZWN0aW9uID0gKCkgPT4ge1xuICAgICAgLy8gY29uc29sZS5sb2coXCJbU2Nyb2xsaW5nXSBTdGFydGluZyBpZGxlIGRldGVjdGlvblwiKTtcblxuICAgICAgLy8gU3RvcCBhbnkgZXhpc3RpbmcgaWRsZSBkZXRlY3Rpb24gZmlyc3RcbiAgICAgIGlmIChpZGxlQ2hlY2tGcmFtZSAhPT0gbnVsbCkge1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShpZGxlQ2hlY2tGcmFtZSk7XG4gICAgICAgIGlkbGVDaGVja0ZyYW1lID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaGFzRW1pdHRlZElkbGUgPSBmYWxzZTsgLy8gUmVzZXQgaWRsZSBlbWlzc2lvbiBmbGFnXG4gICAgICBjb25zdCBjaGVja0lkbGUgPSAoKSA9PiB7XG4gICAgICAgIGlmIChzY3JvbGxQb3NpdGlvbiA9PT0gbGFzdElkbGVDaGVja1Bvc2l0aW9uKSB7XG4gICAgICAgICAgLy8gUG9zaXRpb24gaGFzbid0IGNoYW5nZWQgLSB3ZSdyZSBpZGxlXG4gICAgICAgICAgaWYgKCFoYXNFbWl0dGVkSWRsZSAmJiAoc3BlZWRUcmFja2VyLnZlbG9jaXR5ID4gMCB8fCBpc1Njcm9sbGluZykpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgLy8gICBcIltTY3JvbGxpbmddIElkbGUgZGV0ZWN0ZWQgLSBwb3NpdGlvbiBzdGFibGUsIHNldHRpbmcgdmVsb2NpdHkgdG8gemVyb1wiXG4gICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgaGFzRW1pdHRlZElkbGUgPSB0cnVlOyAvLyBNYXJrIHRoYXQgd2UndmUgZW1pdHRlZCBpZGxlXG4gICAgICAgICAgICBzZXRWZWxvY2l0eVRvWmVybygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBQb3NpdGlvbiBjaGFuZ2VkLCByZXNldCB0aGUgZmxhZ1xuICAgICAgICAgIGhhc0VtaXR0ZWRJZGxlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdElkbGVDaGVja1Bvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICAgIGlkbGVDaGVja0ZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNoZWNrSWRsZSk7XG4gICAgICB9O1xuICAgICAgaWRsZUNoZWNrRnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2hlY2tJZGxlKTtcbiAgICB9O1xuXG4gICAgLy8gU3RvcCBpZGxlIGRldGVjdGlvblxuICAgIGNvbnN0IHN0b3BJZGxlRGV0ZWN0aW9uID0gKCkgPT4ge1xuICAgICAgaWYgKGlkbGVDaGVja0ZyYW1lKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1Njcm9sbGluZ10gU3RvcHBpbmcgaWRsZSBkZXRlY3Rpb25cIik7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkbGVDaGVja0ZyYW1lKTtcbiAgICAgICAgaWRsZUNoZWNrRnJhbWUgPSBudWxsO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTZXQgdmVsb2NpdHkgdG8gemVybyBhbmQgZW1pdCBpZGxlIGV2ZW50XG4gICAgY29uc3Qgc2V0VmVsb2NpdHlUb1plcm8gPSAoKSA9PiB7XG4gICAgICAvLyBTdG9wIGlkbGUgZGV0ZWN0aW9uIHNpbmNlIHdlJ3JlIG5vdyBpZGxlXG4gICAgICBzdG9wSWRsZURldGVjdGlvbigpO1xuXG4gICAgICBzcGVlZFRyYWNrZXIgPSBjcmVhdGVTcGVlZFRyYWNrZXIoKTtcbiAgICAgIGlzU2Nyb2xsaW5nID0gZmFsc2U7IC8vIFJlc2V0IHNjcm9sbGluZyBzdGF0ZVxuXG4gICAgICAvLyBFbWl0IHZlbG9jaXR5IGNoYW5nZVxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnZlbG9jaXR5LWNoYW5nZWRcIiwge1xuICAgICAgICB2ZWxvY2l0eTogMCxcbiAgICAgICAgZGlyZWN0aW9uOiBzcGVlZFRyYWNrZXIuZGlyZWN0aW9uLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIEVtaXQgaWRsZSBzdGF0ZVxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OmlkbGVcIiwge1xuICAgICAgICBwb3NpdGlvbjogc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgIGxhc3RTY3JvbGxUaW1lLFxuICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyBVcGRhdGUgY29udGFpbmVyIHBvc2l0aW9uXG4gICAgY29uc3QgdXBkYXRlQ29udGFpbmVyUG9zaXRpb24gPSAoKSA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUgfHwgIXZpZXdwb3J0U3RhdGUuaXRlbXNDb250YWluZXIpIHJldHVybjtcblxuICAgICAgLy8gSXRlbXMgY29udGFpbmVyIGRvZXNuJ3QgbW92ZSAtIGl0ZW1zIGluc2lkZSBpdCBhcmUgcG9zaXRpb25lZFxuICAgICAgLy8gVGhpcyBpcyBoYW5kbGVkIGJ5IHRoZSByZW5kZXJpbmcgZmVhdHVyZVxuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgbW91c2Vkb3duIHRvIHN0b3Agc2Nyb2xsaW5nIG9uIGNsaWNrXG4gICAgY29uc3QgaGFuZGxlTW91c2VEb3duID0gKF9lOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAvLyBBbmNob3IgdGhlIGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uIC0gYW55IHdoZWVsIGV2ZW50cyB3aWxsIGJlIGZvcmNlZCBiYWNrIHRvIHRoaXMgcG9zaXRpb25cbiAgICAgIC8vIFRoaXMgZWxlZ2FudGx5IGhhbmRsZXMgbW91c2Ugd2hlZWxzIHdpdGggcGh5c2ljYWwgaW5lcnRpYSAobGlrZSBMb2dpdGVjaCBmcmVlLXNwaW4pXG4gICAgICBhbmNob3JQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgYW5jaG9yVGltZSA9IERhdGUubm93KCk7XG4gICAgICBhbmNob3JJbml0aWFsRGVsdGEgPSAwOyAvLyBXaWxsIGJlIHNldCBieSBmaXJzdCB3aGVlbCBldmVudFxuICAgICAgYW5jaG9yTGFzdERlbHRhID0gMDtcbiAgICAgIGFuY2hvck1pbkRlbHRhID0gSW5maW5pdHk7XG4gICAgICBjb25zZWN1dGl2ZUluY3JlYXNlcyA9IDA7XG4gICAgICBzdXN0YWluZWRIaWdoQ291bnQgPSAwO1xuXG4gICAgICAvLyBPbmx5IHN0b3AgaWYgd2UncmUgY3VycmVudGx5IHNjcm9sbGluZ1xuICAgICAgaWYgKGlzU2Nyb2xsaW5nIHx8IHNwZWVkVHJhY2tlci52ZWxvY2l0eSA+IDApIHtcbiAgICAgICAgc2V0VmVsb2NpdHlUb1plcm8oKTtcbiAgICAgIH1cbiAgICAgIC8vIEFsc28gc3RvcCBtb21lbnR1bSBhbmltYXRpb24gaWYgYWN0aXZlXG4gICAgICBjb25zdCBtb21lbnR1bVN0YXRlID0gKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLm1vbWVudHVtU3RhdGU7XG4gICAgICBpZiAobW9tZW50dW1TdGF0ZT8uc3RvcE1vbWVudHVtKSB7XG4gICAgICAgIG1vbWVudHVtU3RhdGUuc3RvcE1vbWVudHVtKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSB3aGVlbCBldmVudFxuICAgIGNvbnN0IGhhbmRsZVdoZWVsID0gKGV2ZW50OiBXaGVlbEV2ZW50KSA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBjb25zdCBkZWx0YSA9IG9yaWVudGF0aW9uID09PSBcInZlcnRpY2FsXCIgPyBldmVudC5kZWx0YVkgOiBldmVudC5kZWx0YVg7XG4gICAgICBjb25zdCBzY3JvbGxEZWx0YSA9IGRlbHRhICogc2Vuc2l0aXZpdHk7XG5cbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB0aW1lU2luY2VMYXN0V2hlZWwgPSBub3cgLSBsYXN0V2hlZWxUaW1lO1xuICAgICAgbGFzdFdoZWVsVGltZSA9IG5vdztcblxuICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBhbmNob3IgcG9zaXRpb24gKHVzZXIgY2xpY2tlZCB0byBzdG9wIHNjcm9sbGluZyksXG4gICAgICAvLyBjaGVjayBpZiB0aGlzIGlzIGludGVudGlvbmFsIG5ldyBzY3JvbGxpbmcgb3IgcmVzaWR1YWwgd2hlZWwgaW5lcnRpYVxuICAgICAgaWYgKGFuY2hvclBvc2l0aW9uICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHRpbWVTaW5jZUFuY2hvciA9IG5vdyAtIGFuY2hvclRpbWU7XG4gICAgICAgIGNvbnN0IHdoZWVsRGVsdGFNYWduaXR1ZGUgPSBNYXRoLmFicyhzY3JvbGxEZWx0YSk7XG5cbiAgICAgICAgLy8gVHJhY2sgaW5pdGlhbCBkZWx0YSB0byBkZXRlY3Qgd2hlbiBpbmVydGlhIGhhcyBkZWNheWVkXG4gICAgICAgIGlmIChhbmNob3JJbml0aWFsRGVsdGEgPT09IDApIHtcbiAgICAgICAgICBhbmNob3JJbml0aWFsRGVsdGEgPSB3aGVlbERlbHRhTWFnbml0dWRlO1xuICAgICAgICAgIGFuY2hvckxhc3REZWx0YSA9IHdoZWVsRGVsdGFNYWduaXR1ZGU7XG4gICAgICAgICAgYW5jaG9yTWluRGVsdGEgPSB3aGVlbERlbHRhTWFnbml0dWRlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJhY2sgbWluaW11bSBkZWx0YSB0byBkZXRlY3QgcmVhY2NlbGVyYXRpb24gKHVzZXIgc3RhcnRlZCBzY3JvbGxpbmcgYWdhaW4pXG4gICAgICAgIGFuY2hvck1pbkRlbHRhID0gTWF0aC5taW4oYW5jaG9yTWluRGVsdGEsIHdoZWVsRGVsdGFNYWduaXR1ZGUpO1xuXG4gICAgICAgIC8vIERldGVjdCBpZiBkZWx0YSBpcyBpbmNyZWFzaW5nICh1c2VyIHN0YXJ0ZWQgbmV3IHNjcm9sbClcbiAgICAgICAgLy8gSW5lcnRpYSBvbmx5IGRlY2F5cywgc28gaW5jcmVhc2luZyBkZWx0YSA9IGludGVudGlvbmFsIG5ldyBzY3JvbGxpbmdcbiAgICAgICAgLy8gQlVUOiBmaWx0ZXIgb3V0IGJhdGNoZWQgZXZlbnRzIHdoZXJlIGRlbHRhIGlzIH4yeCB0aGUgbGFzdCAoYnJvd3NlciBiYXRjaGluZywgbm90IHJlYWwgaW5jcmVhc2UpXG4gICAgICAgIGNvbnN0IGlzQmF0Y2hlZEV2ZW50ID1cbiAgICAgICAgICB3aGVlbERlbHRhTWFnbml0dWRlID4gYW5jaG9yTGFzdERlbHRhICogMS44ICYmXG4gICAgICAgICAgd2hlZWxEZWx0YU1hZ25pdHVkZSA8IGFuY2hvckxhc3REZWx0YSAqIDIuMjtcblxuICAgICAgICAvLyBUcmFjayBjb25zZWN1dGl2ZSBpbmNyZWFzZXMgLSBzdXN0YWluZWQgaW5jcmVhc2VzIGluZGljYXRlIG5ldyBzY3JvbGxpbmdcbiAgICAgICAgLy8gVXNlIDElIHRocmVzaG9sZCB0byBjYXRjaCBncmFkdWFsIGFjY2VsZXJhdGlvblxuICAgICAgICBpZiAoIWlzQmF0Y2hlZEV2ZW50ICYmIHdoZWVsRGVsdGFNYWduaXR1ZGUgPiBhbmNob3JMYXN0RGVsdGEgKiAxLjAxKSB7XG4gICAgICAgICAgY29uc2VjdXRpdmVJbmNyZWFzZXMrKztcbiAgICAgICAgfSBlbHNlIGlmICh3aGVlbERlbHRhTWFnbml0dWRlIDwgYW5jaG9yTGFzdERlbHRhICogMC45OSkge1xuICAgICAgICAgIC8vIERlbHRhIGRlY3JlYXNpbmcgLSByZXNldCBjb3VudGVyXG4gICAgICAgICAgY29uc2VjdXRpdmVJbmNyZWFzZXMgPSAwO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIGRlbHRhIGlzIHJvdWdobHkgdGhlIHNhbWUgKHdpdGhpbiAxJSksIGRvbid0IGNoYW5nZSB0aGUgY291bnRlclxuXG4gICAgICAgIC8vIFRyYWNrIHN1c3RhaW5lZCBoaWdoIGRlbHRhIChkZWx0YSBzaWduaWZpY2FudGx5IGFib3ZlIG1pbmltdW0gZm9yIG11bHRpcGxlIGV2ZW50cylcbiAgICAgICAgLy8gVGhpcyBjYXRjaGVzIHdoZW4gdXNlciBzdGFydHMgc2Nyb2xsaW5nIGJ1dCBkZWx0YSBwbGF0ZWF1cyBpbnN0ZWFkIG9mIHN0cmljdGx5IGluY3JlYXNpbmdcbiAgICAgICAgaWYgKCFpc0JhdGNoZWRFdmVudCAmJiB3aGVlbERlbHRhTWFnbml0dWRlID4gYW5jaG9yTWluRGVsdGEgKiAxLjA1KSB7XG4gICAgICAgICAgc3VzdGFpbmVkSGlnaENvdW50Kys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3VzdGFpbmVkSGlnaENvdW50ID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbGVhc2UgaWY6IDMrIGNvbnNlY3V0aXZlIGluY3JlYXNlcywgT1Igc3VzdGFpbmVkIGhpZ2ggZGVsdGEsIE9SIHNpZ25pZmljYW50IHNpbmdsZSBpbmNyZWFzZVxuICAgICAgICBjb25zdCBzdXN0YWluZWRJbmNyZWFzZSA9IGNvbnNlY3V0aXZlSW5jcmVhc2VzID49IDM7XG4gICAgICAgIGNvbnN0IHN1c3RhaW5lZEhpZ2ggPSBzdXN0YWluZWRIaWdoQ291bnQgPj0gNTsgLy8gNSsgZXZlbnRzIGF0IDUlKyBhYm92ZSBtaW5pbXVtXG4gICAgICAgIGNvbnN0IHNpZ25pZmljYW50SW5jcmVhc2UgPVxuICAgICAgICAgICFpc0JhdGNoZWRFdmVudCAmJlxuICAgICAgICAgIHdoZWVsRGVsdGFNYWduaXR1ZGUgPiBhbmNob3JNaW5EZWx0YSAqIDEuMTUgJiYgLy8gMTUlIGluY3JlYXNlIGZyb20gbWluaW11bVxuICAgICAgICAgIHdoZWVsRGVsdGFNYWduaXR1ZGUgPiBhbmNob3JMYXN0RGVsdGEgKiAxLjA4OyAvLyBhbmQgOCUgaW5jcmVhc2luZyBmcm9tIGxhc3RcbiAgICAgICAgY29uc3QgZGVsdGFJbmNyZWFzaW5nID1cbiAgICAgICAgICBzdXN0YWluZWRJbmNyZWFzZSB8fCBzdXN0YWluZWRIaWdoIHx8IHNpZ25pZmljYW50SW5jcmVhc2U7XG5cbiAgICAgICAgLy8gUmVsZWFzZSBhbmNob3IgaWY6XG4gICAgICAgIC8vIDEuIFRoZXJlIHdhcyBhIGdhcCBpbiB3aGVlbCBldmVudHMgKD4gMjAwbXMpIC0gdXNlciBzdG9wcGVkIGFuZCBzdGFydGVkIG5ldyBzY3JvbGxcbiAgICAgICAgLy8gMi4gRGVsdGEgaXMgaW5jcmVhc2luZyBmcm9tIG1pbmltdW0gLSB1c2VyIHN0YXJ0ZWQgc2Nyb2xsaW5nIGFnYWluIGR1cmluZyBpbmVydGlhXG4gICAgICAgIC8vIDMuIERlbHRhIGhhcyBkZWNheWVkIHNpZ25pZmljYW50bHkgKDwgMzAlIG9mIGluaXRpYWwpIC0gaW5lcnRpYSBpcyB3aW5kaW5nIGRvd25cbiAgICAgICAgLy8gNC4gTG93IGFic29sdXRlIGRlbHRhICg8IDMwKSAtIGdlbnRsZSBpbnRlbnRpb25hbCBzY3JvbGxcbiAgICAgICAgY29uc3QgaGFzV2hlZWxHYXAgPSB0aW1lU2luY2VMYXN0V2hlZWwgPiAyMDA7XG4gICAgICAgIGNvbnN0IGRlbHRhRGVjYXllZCA9IHdoZWVsRGVsdGFNYWduaXR1ZGUgPCBhbmNob3JJbml0aWFsRGVsdGEgKiAwLjM7XG4gICAgICAgIGNvbnN0IGlzTG93RGVsdGEgPSB3aGVlbERlbHRhTWFnbml0dWRlIDwgMzA7XG5cbiAgICAgICAgaWYgKGhhc1doZWVsR2FwKSB7XG4gICAgICAgICAgLy8gVGltZSBnYXAgLSB1c2VyIHN0b3BwZWQgYW5kIHN0YXJ0ZWQgbmV3IHNjcm9sbFxuICAgICAgICAgIGFuY2hvclBvc2l0aW9uID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChkZWx0YUluY3JlYXNpbmcgJiYgdGltZVNpbmNlQW5jaG9yID4gMTAwKSB7XG4gICAgICAgICAgLy8gRGVsdGEgaW5jcmVhc2luZyAtIHVzZXIgc3RhcnRlZCBzY3JvbGxpbmcgYWdhaW5cbiAgICAgICAgICBhbmNob3JQb3NpdGlvbiA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNMb3dEZWx0YSkge1xuICAgICAgICAgIC8vIFZlcnkgbG93IGRlbHRhIC0gZ2VudGxlIGludGVudGlvbmFsIHNjcm9sbFxuICAgICAgICAgIGFuY2hvclBvc2l0aW9uID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChkZWx0YURlY2F5ZWQgJiYgdGltZVNpbmNlQW5jaG9yID4gMzAwKSB7XG4gICAgICAgICAgLy8gRGVsdGEgaGFzIGRlY2F5ZWQgYW5kIHNvbWUgdGltZSBwYXNzZWQgLSBpbmVydGlhIGlzIGRvbmVcbiAgICAgICAgICBhbmNob3JQb3NpdGlvbiA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU3RpbGwgaW4gaW5lcnRpYSBwaGFzZSAtIHN0YXkgYW5jaG9yZWRcbiAgICAgICAgICBpZiAoc2Nyb2xsUG9zaXRpb24gIT09IGFuY2hvclBvc2l0aW9uKSB7XG4gICAgICAgICAgICBzY3JvbGxQb3NpdGlvbiA9IGFuY2hvclBvc2l0aW9uO1xuICAgICAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnJlbmRlckl0ZW1zKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFVwZGF0ZSBsYXN0IGRlbHRhIGZvciBuZXh0IGNvbXBhcmlzb25cbiAgICAgICAgICBhbmNob3JMYXN0RGVsdGEgPSB3aGVlbERlbHRhTWFnbml0dWRlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBsYXN0IGRlbHRhIGZvciBuZXh0IGNvbXBhcmlzb25cbiAgICAgICAgYW5jaG9yTGFzdERlbHRhID0gd2hlZWxEZWx0YU1hZ25pdHVkZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJldmlvdXNQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgY29uc3QgbWF4U2Nyb2xsID0gTWF0aC5tYXgoMCwgdG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuXG4gICAgICBsZXQgbmV3UG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbiArIHNjcm9sbERlbHRhO1xuXG4gICAgICAvLyBBcHBseSBzbW9vdGhpbmcgaWYgZW5hYmxlZFxuICAgICAgaWYgKHNtb290aGluZykge1xuICAgICAgICBjb25zdCBzbW9vdGhpbmdGYWN0b3IgPSAwLjM7XG4gICAgICAgIG5ld1Bvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb24gKyBzY3JvbGxEZWx0YSAqIHNtb290aGluZ0ZhY3RvcjtcbiAgICAgIH1cblxuICAgICAgbmV3UG9zaXRpb24gPSBjbGFtcChuZXdQb3NpdGlvbiwgMCwgbWF4U2Nyb2xsKTtcblxuICAgICAgaWYgKG5ld1Bvc2l0aW9uICE9PSBzY3JvbGxQb3NpdGlvbikge1xuICAgICAgICBzY3JvbGxQb3NpdGlvbiA9IG5ld1Bvc2l0aW9uO1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzY3JvbGwgc3RhdGVcbiAgICAgICAgaWYgKCFpc1Njcm9sbGluZykge1xuICAgICAgICAgIGlzU2Nyb2xsaW5nID0gdHJ1ZTtcbiAgICAgICAgICAvLyBTdG9wIGFueSBleGlzdGluZyBpZGxlIGRldGVjdGlvbiBiZWZvcmUgc3RhcnRpbmcgbmV3IG9uZVxuICAgICAgICAgIHN0b3BJZGxlRGV0ZWN0aW9uKCk7XG4gICAgICAgICAgc3RhcnRJZGxlRGV0ZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFNjcm9sbFRpbWUgPSBub3c7XG5cbiAgICAgICAgLy8gVXBkYXRlIHNwZWVkIHRyYWNrZXJcbiAgICAgICAgc3BlZWRUcmFja2VyID0gdXBkYXRlU3BlZWRUcmFja2VyKFxuICAgICAgICAgIHNwZWVkVHJhY2tlcixcbiAgICAgICAgICBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgICBwcmV2aW91c1Bvc2l0aW9uLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFVwZGF0ZSB2aWV3cG9ydCBzdGF0ZVxuICAgICAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnZlbG9jaXR5ID0gc3BlZWRUcmFja2VyLnZlbG9jaXR5O1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsRGlyZWN0aW9uID0gc3BlZWRUcmFja2VyLmRpcmVjdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBzY3JvbGxlZCBzdGF0ZSBjbGFzc1xuICAgICAgICBjb25zdCB2aWV3cG9ydEVsID1cbiAgICAgICAgICB2aWV3cG9ydFN0YXRlPy52aWV3cG9ydEVsZW1lbnQgfHwgKGNvbXBvbmVudCBhcyBhbnkpLnZpZXdwb3J0RWxlbWVudDtcbiAgICAgICAgaWYgKHZpZXdwb3J0RWwpIHtcbiAgICAgICAgICB1cGRhdGVTY3JvbGxlZFN0YXRlKHZpZXdwb3J0RWwsIHNjcm9sbFBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0b3JlIHBlbmRpbmcgc2Nyb2xsIGRhdGEgZm9yIFJBRi1iYXRjaGVkIHJlbmRlcmluZ1xuICAgICAgICBwZW5kaW5nU2Nyb2xsRGF0YSA9IHtcbiAgICAgICAgICBwb3NpdGlvbjogc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgZGlyZWN0aW9uOiBzcGVlZFRyYWNrZXIuZGlyZWN0aW9uLFxuICAgICAgICAgIHByZXZpb3VzUG9zaXRpb24sXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gU2NoZWR1bGUgcmVuZGVyIHZpYSBSQUYgaWYgbm90IGFscmVhZHkgc2NoZWR1bGVkXG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyB3ZSByZW5kZXIgYXQgbW9zdCBvbmNlIHBlciBmcmFtZSwgZXZlbiBkdXJpbmcgZmFzdCBzY3JvbGxpbmdcbiAgICAgICAgaWYgKCFyZW5kZXJTY2hlZHVsZWQpIHtcbiAgICAgICAgICByZW5kZXJTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICByZW5kZXJTY2hlZHVsZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgLy8gVXNlIHRoZSBsYXRlc3Qgc2Nyb2xsIGRhdGEgKGNvYWxlc2NlcyBtdWx0aXBsZSB3aGVlbCBldmVudHMpXG4gICAgICAgICAgICBpZiAocGVuZGluZ1Njcm9sbERhdGEpIHtcbiAgICAgICAgICAgICAgLy8gRW1pdCBldmVudHMgd2l0aCB0aGUgbGF0ZXN0IHBvc2l0aW9uXG4gICAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpzY3JvbGxcIiwge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBwZW5kaW5nU2Nyb2xsRGF0YS5wb3NpdGlvbixcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb246IHBlbmRpbmdTY3JvbGxEYXRhLmRpcmVjdGlvbixcbiAgICAgICAgICAgICAgICBwcmV2aW91c1Bvc2l0aW9uOiBwZW5kaW5nU2Nyb2xsRGF0YS5wcmV2aW91c1Bvc2l0aW9uLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6dmVsb2NpdHktY2hhbmdlZFwiLCB7XG4gICAgICAgICAgICAgICAgdmVsb2NpdHk6IHNwZWVkVHJhY2tlci52ZWxvY2l0eSxcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb246IHNwZWVkVHJhY2tlci5kaXJlY3Rpb24sXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIC8vIFRyaWdnZXIgcmVuZGVyXG4gICAgICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcygpO1xuXG4gICAgICAgICAgICAgIHBlbmRpbmdTY3JvbGxEYXRhID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTY3JvbGwgdG8gcG9zaXRpb25cbiAgICBjb25zdCBzY3JvbGxUb1Bvc2l0aW9uID0gKHBvc2l0aW9uOiBudW1iZXIsIHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgbWF4U2Nyb2xsID0gTWF0aC5tYXgoMCwgdG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuICAgICAgY29uc3QgY2xhbXBlZFBvc2l0aW9uID0gY2xhbXAocG9zaXRpb24sIDAsIG1heFNjcm9sbCk7XG5cbiAgICAgIGlmIChjbGFtcGVkUG9zaXRpb24gIT09IHNjcm9sbFBvc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24gPSBjbGFtcGVkUG9zaXRpb247XG5cbiAgICAgICAgLy8gVXBkYXRlIHNwZWVkIHRyYWNrZXIgdG8gY2FsY3VsYXRlIHZlbG9jaXR5XG4gICAgICAgIHNwZWVkVHJhY2tlciA9IHVwZGF0ZVNwZWVkVHJhY2tlcihcbiAgICAgICAgICBzcGVlZFRyYWNrZXIsXG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgcHJldmlvdXNQb3NpdGlvbixcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBVcGRhdGUgdmlld3BvcnQgc3RhdGVcbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS52ZWxvY2l0eSA9IHNwZWVkVHJhY2tlci52ZWxvY2l0eTtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbERpcmVjdGlvbiA9IHNwZWVkVHJhY2tlci5kaXJlY3Rpb247XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPVxuICAgICAgICAgIGNsYW1wZWRQb3NpdGlvbiA+IHByZXZpb3VzUG9zaXRpb24gPyBcImZvcndhcmRcIiA6IFwiYmFja3dhcmRcIjtcblxuICAgICAgICAvLyBVcGRhdGUgc2Nyb2xsZWQgc3RhdGUgY2xhc3NcbiAgICAgICAgY29uc3Qgdmlld3BvcnRFbCA9XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZT8udmlld3BvcnRFbGVtZW50IHx8IChjb21wb25lbnQgYXMgYW55KS52aWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgIGlmICh2aWV3cG9ydEVsKSB7XG4gICAgICAgICAgdXBkYXRlU2Nyb2xsZWRTdGF0ZSh2aWV3cG9ydEVsLCBzY3JvbGxQb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IHNjcm9sbCBldmVudFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6c2Nyb2xsXCIsIHtcbiAgICAgICAgICBwb3NpdGlvbjogc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICAgIHByZXZpb3VzUG9zaXRpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEVtaXQgdmVsb2NpdHkgY2hhbmdlIGV2ZW50IHNvIGNvbGxlY3Rpb24gY2FuIHRyYWNrIGl0XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDp2ZWxvY2l0eS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgICB2ZWxvY2l0eTogc3BlZWRUcmFja2VyLnZlbG9jaXR5LFxuICAgICAgICAgIGRpcmVjdGlvbjogc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHNjcm9sbCBzdGF0ZSBhbmQgaWRsZSBkZXRlY3Rpb25cbiAgICAgICAgaWYgKCFpc1Njcm9sbGluZykge1xuICAgICAgICAgIGlzU2Nyb2xsaW5nID0gdHJ1ZTtcbiAgICAgICAgICBzdGFydElkbGVEZXRlY3Rpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0U2Nyb2xsVGltZSA9IERhdGUubm93KCk7XG5cbiAgICAgICAgLy8gVHJpZ2dlciByZW5kZXJcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnJlbmRlckl0ZW1zKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW1Njcm9sbGluZ10gUG9zaXRpb24gdW5jaGFuZ2VkOiAke3Njcm9sbFBvc2l0aW9ufWApO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW1Njcm9sbGluZ10gUG9zaXRpb24gdW5jaGFuZ2VkOiAke3Njcm9sbFBvc2l0aW9ufSwgbm90IHJlc2V0dGluZyBpZGxlIHRpbWVvdXRgXG4gICAgICAgIC8vICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFNjcm9sbCB0byBpbmRleFxuICAgIGNvbnN0IHNjcm9sbFRvSW5kZXggPSAoXG4gICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgYWxpZ25tZW50OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiA9IFwic3RhcnRcIixcbiAgICApID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGluZ10gc2Nyb2xsVG9JbmRleCBjYWxsZWQ6IGluZGV4PSR7aW5kZXh9LCBhbGlnbm1lbnQ9JHthbGlnbm1lbnR9YFxuICAgICAgLy8gKTtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSkge1xuICAgICAgICAvL2NvbnNvbGUubG9nKGBbU2Nyb2xsaW5nXSBzY3JvbGxUb0luZGV4IGFib3J0ZWQ6IG5vIHZpZXdwb3J0IHN0YXRlYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXRlbVNpemUgPSB2aWV3cG9ydFN0YXRlLml0ZW1TaXplIHx8IDUwO1xuICAgICAgY29uc3QgdG90YWxJdGVtcyA9IHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyB8fCAwO1xuICAgICAgY29uc3QgYWN0dWFsVG90YWxTaXplID0gdG90YWxJdGVtcyAqIGl0ZW1TaXplO1xuICAgICAgY29uc3QgTUFYX1ZJUlRVQUxfU0laRSA9XG4gICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5WSVJUVUFMX1NDUk9MTC5NQVhfVklSVFVBTF9TSVpFO1xuICAgICAgY29uc3QgaXNDb21wcmVzc2VkID0gYWN0dWFsVG90YWxTaXplID4gTUFYX1ZJUlRVQUxfU0laRTtcblxuICAgICAgbGV0IHRhcmdldFBvc2l0aW9uOiBudW1iZXI7XG5cbiAgICAgIGlmIChpc0NvbXByZXNzZWQpIHtcbiAgICAgICAgLy8gSW4gY29tcHJlc3NlZCBzcGFjZSwgbWFwIGluZGV4IHRvIHZpcnR1YWwgcG9zaXRpb25cbiAgICAgICAgY29uc3QgcmF0aW8gPSBpbmRleCAvIHRvdGFsSXRlbXM7XG4gICAgICAgIHRhcmdldFBvc2l0aW9uID0gcmF0aW8gKiBNYXRoLm1pbihhY3R1YWxUb3RhbFNpemUsIE1BWF9WSVJUVUFMX1NJWkUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRGlyZWN0IGNhbGN1bGF0aW9uIHdoZW4gbm90IGNvbXByZXNzZWRcbiAgICAgICAgdGFyZ2V0UG9zaXRpb24gPSBpbmRleCAqIGl0ZW1TaXplO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGp1c3QgcG9zaXRpb24gYmFzZWQgb24gYWxpZ25tZW50XG4gICAgICBzd2l0Y2ggKGFsaWdubWVudCkge1xuICAgICAgICBjYXNlIFwiY2VudGVyXCI6XG4gICAgICAgICAgdGFyZ2V0UG9zaXRpb24gLT0gY29udGFpbmVyU2l6ZSAvIDIgLSBpdGVtU2l6ZSAvIDI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICB0YXJnZXRQb3NpdGlvbiAtPSBjb250YWluZXJTaXplIC0gaXRlbVNpemU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGluZ10gVGFyZ2V0IHBvc2l0aW9uOiAke3RhcmdldFBvc2l0aW9ufSwgaXNDb21wcmVzc2VkOiAke2lzQ29tcHJlc3NlZH1gXG4gICAgICAvLyApO1xuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtTY3JvbGxpbmddIFNjcm9sbFRvSW5kZXg6IGluZGV4PSR7aW5kZXh9LCBwb3NpdGlvbj0ke3RhcmdldFBvc2l0aW9ufSwgYWxpZ25tZW50PSR7YWxpZ25tZW50fWBcbiAgICAgIC8vICk7XG5cbiAgICAgIHNjcm9sbFRvUG9zaXRpb24odGFyZ2V0UG9zaXRpb24sIFwic2Nyb2xsVG9JbmRleFwiKTtcbiAgICB9O1xuXG4gICAgLy8gU2Nyb2xsIHRvIGEgc3BlY2lmaWMgcGFnZVxuICAgIGNvbnN0IHNjcm9sbFRvUGFnZSA9IChcbiAgICAgIHBhZ2U6IG51bWJlcixcbiAgICAgIGxpbWl0OiBudW1iZXIgPSAyMCxcbiAgICAgIGFsaWdubWVudDogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIsXG4gICAgKSA9PiB7XG4gICAgICAvLyBWYWxpZGF0ZSBhbGlnbm1lbnQgcGFyYW1ldGVyXG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBhbGlnbm1lbnQgIT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgIVtcInN0YXJ0XCIsIFwiY2VudGVyXCIsIFwiZW5kXCJdLmluY2x1ZGVzKGFsaWdubWVudClcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtTY3JvbGxpbmddIEludmFsaWQgYWxpZ25tZW50IFwiJHthbGlnbm1lbnR9XCIsIHVzaW5nIFwic3RhcnRcImAsXG4gICAgICAgICk7XG4gICAgICAgIGFsaWdubWVudCA9IFwic3RhcnRcIjtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgd2UncmUgaW4gY3Vyc29yIG1vZGVcbiAgICAgIGNvbnN0IHZpZXdwb3J0Q29uZmlnID0gKGNvbXBvbmVudCBhcyBhbnkpLmNvbmZpZztcbiAgICAgIGNvbnN0IGlzQ3Vyc29yTW9kZSA9IHZpZXdwb3J0Q29uZmlnPy5wYWdpbmF0aW9uPy5zdHJhdGVneSA9PT0gXCJjdXJzb3JcIjtcblxuICAgICAgaWYgKGlzQ3Vyc29yTW9kZSkge1xuICAgICAgICAvLyBJbiBjdXJzb3IgbW9kZSwgY2hlY2sgaWYgd2UgY2FuIHNjcm9sbCB0byB0aGlzIHBhZ2VcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5jb2xsZWN0aW9uO1xuICAgICAgICBpZiAoY29sbGVjdGlvbikge1xuICAgICAgICAgIGNvbnN0IGhpZ2hlc3RMb2FkZWRQYWdlID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgIGNvbGxlY3Rpb24uZ2V0TG9hZGVkUmFuZ2VzKCkuc2l6ZSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHBhZ2UgPiBoaWdoZXN0TG9hZGVkUGFnZSArIDEpIHtcbiAgICAgICAgICAgIC8vIExpbWl0IGhvdyBtYW55IHBhZ2VzIHdlJ2xsIGxvYWQgYXQgb25jZSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSBBUEkgY2FsbHNcbiAgICAgICAgICAgIGNvbnN0IG1heFBhZ2VzVG9Mb2FkID0gMTA7IC8vIFJlYXNvbmFibGUgbGltaXRcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldFBhZ2UgPSBNYXRoLm1pbihcbiAgICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgICAgaGlnaGVzdExvYWRlZFBhZ2UgKyBtYXhQYWdlc1RvTG9hZCxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgYFtTY3JvbGxpbmddIENhbm5vdCBqdW1wIGRpcmVjdGx5IHRvIHBhZ2UgJHtwYWdlfSBpbiBjdXJzb3IgbW9kZS4gYCArXG4gICAgICAgICAgICAgICAgYFBhZ2VzIG11c3QgYmUgbG9hZGVkIHNlcXVlbnRpYWxseS4gQ3VycmVudCBoaWdoZXN0IHBhZ2U6ICR7aGlnaGVzdExvYWRlZFBhZ2V9LiBgICtcbiAgICAgICAgICAgICAgICBgV2lsbCBsb2FkIHVwIHRvIHBhZ2UgJHt0YXJnZXRQYWdlfWAsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBUcmlnZ2VyIHNlcXVlbnRpYWwgbG9hZGluZyB0byB0aGUgdGFyZ2V0IHBhZ2UgKGxpbWl0ZWQpXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRPZmZzZXQgPSAodGFyZ2V0UGFnZSAtIDEpICogbGltaXQ7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50T2Zmc2V0ID0gaGlnaGVzdExvYWRlZFBhZ2UgKiBsaW1pdDtcblxuICAgICAgICAgICAgLy8gTG9hZCBwYWdlcyBzZXF1ZW50aWFsbHkgdXAgdG8gdGhlIGxpbWl0ZWQgdGFyZ2V0XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtTY3JvbGxpbmddIEluaXRpYXRpbmcgc2VxdWVudGlhbCBsb2FkIGZyb20gcGFnZSAke1xuICAgICAgICAgICAgLy8gICAgIGhpZ2hlc3RMb2FkZWRQYWdlICsgMVxuICAgICAgICAgICAgLy8gICB9IHRvICR7dGFyZ2V0UGFnZX1gLFxuICAgICAgICAgICAgLy8gKTtcblxuICAgICAgICAgICAgLy8gU2Nyb2xsIHRvIHRoZSBsYXN0IGxvYWRlZCBwb3NpdGlvbiBmaXJzdFxuICAgICAgICAgICAgY29uc3QgbGFzdExvYWRlZEluZGV4ID0gaGlnaGVzdExvYWRlZFBhZ2UgKiBsaW1pdDtcbiAgICAgICAgICAgIHNjcm9sbFRvSW5kZXgobGFzdExvYWRlZEluZGV4LCBhbGlnbm1lbnQpO1xuXG4gICAgICAgICAgICAvLyBUaGUgY29sbGVjdGlvbiBmZWF0dXJlIHdpbGwgaGFuZGxlIHNlcXVlbnRpYWwgbG9hZGluZ1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDb252ZXJ0IHBhZ2UgdG8gaW5kZXggKHBhZ2UgMSA9IGluZGV4IDApXG4gICAgICBjb25zdCBpbmRleCA9IChwYWdlIC0gMSkgKiBsaW1pdDtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbU2Nyb2xsaW5nXSBTY3JvbGxUb1BhZ2U6IHBhZ2U9JHtwYWdlfSwgbGltaXQ9JHtsaW1pdH0sIHRhcmdldEluZGV4PSR7aW5kZXh9LCBhbGlnbm1lbnQ9JHthbGlnbm1lbnR9YFxuICAgICAgLy8gKTtcblxuICAgICAgLy8gSnVzdCBzY3JvbGwgdG8gdGhlIGluZGV4IC0gbGV0IHRoZSBub3JtYWwgcmVuZGVyaW5nIGZsb3cgaGFuZGxlIGRhdGEgbG9hZGluZyBhbmQgcGxhY2Vob2xkZXJzXG4gICAgICBzY3JvbGxUb0luZGV4KGluZGV4LCBhbGlnbm1lbnQpO1xuICAgIH07XG5cbiAgICAvLyBVcGRhdGUgc2Nyb2xsIGJvdW5kc1xuICAgIGNvbnN0IHVwZGF0ZVNjcm9sbEJvdW5kcyA9IChcbiAgICAgIG5ld1RvdGFsU2l6ZTogbnVtYmVyLFxuICAgICAgbmV3Q29udGFpbmVyU2l6ZTogbnVtYmVyLFxuICAgICkgPT4ge1xuICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9IG5ld1RvdGFsU2l6ZTtcbiAgICAgIGNvbnRhaW5lclNpemUgPSBuZXdDb250YWluZXJTaXplO1xuXG4gICAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgICB2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemUgPSBuZXdUb3RhbFNpemU7XG4gICAgICAgIHZpZXdwb3J0U3RhdGUuY29udGFpbmVyU2l6ZSA9IG5ld0NvbnRhaW5lclNpemU7XG4gICAgICB9XG5cbiAgICAgIC8vIERvbid0IGNsYW1wIHNjcm9sbCBwb3NpdGlvbiB1bnRpbCB3ZSBoYXZlIHJlYWwgZGF0YSBsb2FkZWRcbiAgICAgIC8vIFRoaXMgcHJldmVudHMgcmVzZXR0aW5nIGluaXRpYWxTY3JvbGxJbmRleCBwb3NpdGlvbiBiZWZvcmUgZGF0YSBhcnJpdmVzXG4gICAgICAvLyBDaGVjayB0b3RhbEl0ZW1zIGluc3RlYWQgb2YgdG90YWxWaXJ0dWFsU2l6ZSBzaW5jZSB2aXJ0dWFsU2l6ZSBjYW4gYmUgbm9uLXplcm8gZnJvbSBwYWRkaW5nXG4gICAgICBjb25zdCB0b3RhbEl0ZW1zID0gdmlld3BvcnRTdGF0ZT8udG90YWxJdGVtcyB8fCAwO1xuICAgICAgaWYgKHRvdGFsSXRlbXMgPD0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIENsYW1wIGN1cnJlbnQgcG9zaXRpb24gdG8gbmV3IGJvdW5kc1xuICAgICAgY29uc3QgbWF4U2Nyb2xsID0gTWF0aC5tYXgoMCwgdG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuICAgICAgaWYgKHNjcm9sbFBvc2l0aW9uID4gbWF4U2Nyb2xsKSB7XG4gICAgICAgIHNjcm9sbFRvUG9zaXRpb24obWF4U2Nyb2xsKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gRXh0ZW5kIHZpZXdwb3J0IEFQSVxuICAgIGNvbnN0IG9yaWdpbmFsU2Nyb2xsVG9JbmRleCA9IGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb0luZGV4O1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb0luZGV4ID0gKFxuICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgIGFsaWdubWVudD86IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiLFxuICAgICkgPT4ge1xuICAgICAgc2Nyb2xsVG9JbmRleChpbmRleCwgYWxpZ25tZW50KTtcbiAgICAgIG9yaWdpbmFsU2Nyb2xsVG9JbmRleD8uKGluZGV4LCBhbGlnbm1lbnQpO1xuICAgIH07XG5cbiAgICAvLyBBZGQgc2Nyb2xsVG9QYWdlIHRvIHZpZXdwb3J0IEFQSSAobmV3IG1ldGhvZCwgbm8gb3JpZ2luYWwgdG8gcHJlc2VydmUpXG4gICAgKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLnNjcm9sbFRvUGFnZSA9IChcbiAgICAgIHBhZ2U6IG51bWJlcixcbiAgICAgIGxpbWl0PzogbnVtYmVyLFxuICAgICAgYWxpZ25tZW50PzogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIsXG4gICAgKSA9PiB7XG4gICAgICBzY3JvbGxUb1BhZ2UocGFnZSwgbGltaXQsIGFsaWdubWVudCk7XG4gICAgfTtcblxuICAgIGNvbnN0IG9yaWdpbmFsU2Nyb2xsVG9Qb3NpdGlvbiA9IGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb1Bvc2l0aW9uO1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb1Bvc2l0aW9uID0gKHBvc2l0aW9uOiBudW1iZXIpID0+IHtcbiAgICAgIHNjcm9sbFRvUG9zaXRpb24ocG9zaXRpb24sIFwiYXBpXCIpO1xuICAgICAgb3JpZ2luYWxTY3JvbGxUb1Bvc2l0aW9uPy4ocG9zaXRpb24pO1xuICAgIH07XG5cbiAgICBjb25zdCBvcmlnaW5hbEdldFNjcm9sbFBvc2l0aW9uID0gY29tcG9uZW50LnZpZXdwb3J0LmdldFNjcm9sbFBvc2l0aW9uO1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5nZXRTY3JvbGxQb3NpdGlvbiA9ICgpID0+IHtcbiAgICAgIHJldHVybiBzY3JvbGxQb3NpdGlvbjtcbiAgICB9O1xuXG4gICAgLy8gQWRkIHdoZWVsIGV2ZW50IGxpc3RlbmVyIG9uIGluaXRpYWxpemF0aW9uXG4gICAgLy8gVGhpcyBibG9jayBpcyByZW1vdmVkIGFzIHBlciB0aGUgZWRpdCBoaW50LlxuXG4gICAgLy8gQ2xlYW4gdXAgb24gZGVzdHJveVxuICAgIGlmIChcImRlc3Ryb3lcIiBpbiBjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IGNvbXBvbmVudC5kZXN0cm95O1xuICAgICAgY29tcG9uZW50LmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIFJlbW92ZSBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgY29uc3Qgdmlld3BvcnRFbGVtZW50ID0gKGNvbXBvbmVudCBhcyBhbnkpLl9zY3JvbGxpbmdWaWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgIGlmICh2aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIndoZWVsXCIsIGhhbmRsZVdoZWVsKTtcbiAgICAgICAgICBpZiAoKGNvbXBvbmVudCBhcyBhbnkpLl9zY3JvbGxpbmdTdG9wT25DbGljaykge1xuICAgICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgaGFuZGxlTW91c2VEb3duKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciB0aW1lb3V0c1xuICAgICAgICBpZiAoaWRsZVRpbWVvdXRJZCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dChpZGxlVGltZW91dElkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0b3BJZGxlRGV0ZWN0aW9uKCk7XG4gICAgICAgIG9yaWdpbmFsRGVzdHJveT8uKCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEFkZCBzY3JvbGxCeSBtZXRob2RcbiAgICBjb25zdCBzY3JvbGxCeSA9IChkZWx0YTogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBwcmV2aW91c1Bvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICBjb25zdCBtYXhTY3JvbGwgPSBNYXRoLm1heCgwLCB0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZSk7XG4gICAgICBjb25zdCBuZXdQb3NpdGlvbiA9IGNsYW1wKHNjcm9sbFBvc2l0aW9uICsgZGVsdGEsIDAsIG1heFNjcm9sbCk7XG5cbiAgICAgIGlmIChuZXdQb3NpdGlvbiAhPT0gcHJldmlvdXNQb3NpdGlvbikge1xuICAgICAgICBzY3JvbGxQb3NpdGlvbiA9IG5ld1Bvc2l0aW9uO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzcGVlZCB0cmFja2VyXG4gICAgICAgIHNwZWVkVHJhY2tlciA9IHVwZGF0ZVNwZWVkVHJhY2tlcihcbiAgICAgICAgICBzcGVlZFRyYWNrZXIsXG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgcHJldmlvdXNQb3NpdGlvbixcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBVcGRhdGUgdmlld3BvcnQgc3RhdGVcbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS52ZWxvY2l0eSA9IHNwZWVkVHJhY2tlci52ZWxvY2l0eTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBzY3JvbGxlZCBzdGF0ZSBjbGFzc1xuICAgICAgICBjb25zdCB2aWV3cG9ydEVsID1cbiAgICAgICAgICB2aWV3cG9ydFN0YXRlPy52aWV3cG9ydEVsZW1lbnQgfHwgKGNvbXBvbmVudCBhcyBhbnkpLnZpZXdwb3J0RWxlbWVudDtcbiAgICAgICAgaWYgKHZpZXdwb3J0RWwpIHtcbiAgICAgICAgICB1cGRhdGVTY3JvbGxlZFN0YXRlKHZpZXdwb3J0RWwsIHNjcm9sbFBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtaXQgc2Nyb2xsIGV2ZW50XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpzY3JvbGxcIiwge1xuICAgICAgICAgIHBvc2l0aW9uOiBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgICB2ZWxvY2l0eTogc3BlZWRUcmFja2VyLnZlbG9jaXR5LFxuICAgICAgICAgIGRpcmVjdGlvbjogc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVHJpZ2dlciByZW5kZXJcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnJlbmRlckl0ZW1zPy4oKTtcblxuICAgICAgICAvLyBTdGFydCBpZGxlIGRldGVjdGlvbiBpZiBub3Qgc2Nyb2xsaW5nXG4gICAgICAgIGlmICghaXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICBpc1Njcm9sbGluZyA9IHRydWU7XG4gICAgICAgICAgc3RhcnRJZGxlRGV0ZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFNjcm9sbFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBFeHBvc2Ugc2Nyb2xsaW5nIHN0YXRlIGZvciBvdGhlciBmZWF0dXJlc1xuICAgIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zY3JvbGxpbmdTdGF0ZSA9IHtcbiAgICAgIHNldFZlbG9jaXR5VG9aZXJvLFxuICAgIH07XG5cbiAgICAvLyBBZGQgc2Nyb2xsQnkgdG8gdmlld3BvcnQgQVBJXG4gICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5ID0gc2Nyb2xsQnk7XG4gICAgY29tcG9uZW50LnZpZXdwb3J0LmdldFZlbG9jaXR5ID0gKCkgPT4gc3BlZWRUcmFja2VyLnZlbG9jaXR5O1xuXG4gICAgLy8gRXhwb3NlIHNjcm9sbGluZyBBUElcbiAgICAoY29tcG9uZW50IGFzIGFueSkuc2Nyb2xsaW5nID0ge1xuICAgICAgaGFuZGxlV2hlZWwsXG4gICAgICBzY3JvbGxUb1Bvc2l0aW9uLFxuICAgICAgc2Nyb2xsVG9JbmRleCxcbiAgICAgIHNjcm9sbFRvUGFnZSxcbiAgICAgIHNjcm9sbEJ5LFxuICAgICAgZ2V0U2Nyb2xsUG9zaXRpb246ICgpID0+IHNjcm9sbFBvc2l0aW9uLFxuICAgICAgdXBkYXRlU2Nyb2xsQm91bmRzLFxuICAgICAgZ2V0VmVsb2NpdHk6ICgpID0+IHNwZWVkVHJhY2tlci52ZWxvY2l0eSxcbiAgICAgIGdldERpcmVjdGlvbjogKCkgPT4gc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgIGlzU2Nyb2xsaW5nOiAoKSA9PiBpc1Njcm9sbGluZyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL21vbWVudHVtLnRzXG5cbi8qKlxuICogTW9tZW50dW0gRmVhdHVyZSAtIEFkZHMgaW5lcnRpYWwgc2Nyb2xsaW5nIHRvIHZpZXdwb3J0XG4gKiBQcm92aWRlcyBzbW9vdGggZGVjZWxlcmF0aW9uIGFmdGVyIHRvdWNoL21vdXNlIGRyYWcgZ2VzdHVyZXNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29tcG9uZW50LCBWaWV3cG9ydENvbnRleHQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZJRVdQT1JUX0NPTlNUQU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuaW50ZXJmYWNlIE1vbWVudHVtQ29uZmlnIHtcbiAgZW5hYmxlZD86IGJvb2xlYW47XG4gIGRlY2VsZXJhdGlvbj86IG51bWJlcjtcbiAgbWluVmVsb2NpdHk/OiBudW1iZXI7XG4gIG1pbkR1cmF0aW9uPzogbnVtYmVyO1xuICBtaW5WZWxvY2l0eVRocmVzaG9sZD86IG51bWJlcjtcbiAgLyoqIFN0b3AgbW9tZW50dW0gd2hlbiBjbGlja2luZyBvbiB0aGUgdmlld3BvcnQgKGRlZmF1bHQ6IHRydWUpICovXG4gIHN0b3BPbkNsaWNrPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBZGRzIG1vbWVudHVtIHNjcm9sbGluZyB0byB2aWV3cG9ydFxuICovXG5leHBvcnQgY29uc3Qgd2l0aE1vbWVudHVtID0gKGNvbmZpZzogTW9tZW50dW1Db25maWcgPSB7fSkgPT4ge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBWaWV3cG9ydENvbXBvbmVudD4oY29tcG9uZW50OiBUKTogVCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgZW5hYmxlZCA9IFZJRVdQT1JUX0NPTlNUQU5UUy5NT01FTlRVTS5FTkFCTEVELFxuICAgICAgZGVjZWxlcmF0aW9uID0gVklFV1BPUlRfQ09OU1RBTlRTLk1PTUVOVFVNLkRFQ0VMRVJBVElPTl9GQUNUT1IsXG4gICAgICBtaW5WZWxvY2l0eSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5NT01FTlRVTS5NSU5fVkVMT0NJVFksXG4gICAgICBtaW5EdXJhdGlvbiA9IFZJRVdQT1JUX0NPTlNUQU5UUy5NT01FTlRVTS5NSU5fRFVSQVRJT04sXG4gICAgICBtaW5WZWxvY2l0eVRocmVzaG9sZCA9IFZJRVdQT1JUX0NPTlNUQU5UUy5NT01FTlRVTS5NSU5fVkVMT0NJVFlfVEhSRVNIT0xELFxuICAgICAgc3RvcE9uQ2xpY2sgPSB0cnVlLCAvLyBTdG9wIG1vbWVudHVtIG9uIGNsaWNrIGJ5IGRlZmF1bHRcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gQWx3YXlzIGFwcGx5IHRoZSBmZWF0dXJlLCBidXQgY2hlY2sgaXNFbmFibGVkIGF0IHJ1bnRpbWVcblxuICAgIC8vIE1vbWVudHVtIHN0YXRlXG4gICAgbGV0IG1vbWVudHVtQW5pbWF0aW9uSWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGxldCBpc1RvdWNoaW5nID0gZmFsc2U7XG4gICAgbGV0IGlzTW91c2VEcmFnZ2luZyA9IGZhbHNlO1xuICAgIGxldCBsYXN0VG91Y2hQb3NpdGlvbiA9IDA7XG4gICAgbGV0IGxhc3RNb3VzZVBvc2l0aW9uID0gMDtcbiAgICBsZXQgdG91Y2hTdGFydFRpbWUgPSAwO1xuICAgIGxldCB2aWV3cG9ydFN0YXRlOiBhbnk7XG4gICAgbGV0IHNjcm9sbGluZ1N0YXRlOiBhbnk7XG4gICAgbGV0IGlzRW5hYmxlZCA9IGVuYWJsZWQ7IC8vIFRyYWNrIGN1cnJlbnQgZW5hYmxlZCBzdGF0ZVxuXG4gICAgLy8gR2V0IHJlZmVyZW5jZXMgYWZ0ZXIgaW5pdGlhbGl6YXRpb25cbiAgICBjb25zdCBvcmlnaW5hbEluaXRpYWxpemUgPSBjb21wb25lbnQudmlld3BvcnQuaW5pdGlhbGl6ZTtcbiAgICBjb21wb25lbnQudmlld3BvcnQuaW5pdGlhbGl6ZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG9yaWdpbmFsSW5pdGlhbGl6ZSgpO1xuICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IGluaXRpYWxpemVkXG4gICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCB2aWV3cG9ydCBhbmQgc2Nyb2xsaW5nIHN0YXRlc1xuICAgICAgdmlld3BvcnRTdGF0ZSA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zdGF0ZTtcbiAgICAgIHNjcm9sbGluZ1N0YXRlID0gKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLnNjcm9sbGluZ1N0YXRlO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgLy8gU3RvcCBtb21lbnR1bSBhbmltYXRpb24gKGNhbiBiZSBjYWxsZWQgZXh0ZXJuYWxseSlcbiAgICBjb25zdCBzdG9wTW9tZW50dW0gPSAoKSA9PiB7XG4gICAgICBpZiAobW9tZW50dW1BbmltYXRpb25JZCkge1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShtb21lbnR1bUFuaW1hdGlvbklkKTtcbiAgICAgICAgbW9tZW50dW1BbmltYXRpb25JZCA9IG51bGw7XG4gICAgICAgIC8vIFJlc2V0IHZlbG9jaXR5IGluIHNjcm9sbGluZyBmZWF0dXJlXG4gICAgICAgIGlmIChzY3JvbGxpbmdTdGF0ZSkge1xuICAgICAgICAgIHNjcm9sbGluZ1N0YXRlLnNldFZlbG9jaXR5VG9aZXJvPy4oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTdGFydCBtb21lbnR1bSBhbmltYXRpb25cbiAgICBjb25zdCBzdGFydE1vbWVudHVtID0gKGluaXRpYWxWZWxvY2l0eTogbnVtYmVyKSA9PiB7XG4gICAgICAvLyBDYW5jZWwgYW55IGV4aXN0aW5nIG1vbWVudHVtXG4gICAgICBpZiAobW9tZW50dW1BbmltYXRpb25JZCkge1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShtb21lbnR1bUFuaW1hdGlvbklkKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHZlbG9jaXR5ID0gaW5pdGlhbFZlbG9jaXR5O1xuXG4gICAgICBjb25zdCBhbmltYXRlID0gKCkgPT4ge1xuICAgICAgICAvLyBBcHBseSBkZWNlbGVyYXRpb25cbiAgICAgICAgdmVsb2NpdHkgKj0gZGVjZWxlcmF0aW9uO1xuXG4gICAgICAgIC8vIFN0b3AgaWYgdmVsb2NpdHkgaXMgdG9vIHNtYWxsXG4gICAgICAgIGlmIChNYXRoLmFicyh2ZWxvY2l0eSkgPCBtaW5WZWxvY2l0eSkge1xuICAgICAgICAgIG1vbWVudHVtQW5pbWF0aW9uSWQgPSBudWxsO1xuICAgICAgICAgIC8vIFJlc2V0IHZlbG9jaXR5IGluIHNjcm9sbGluZyBmZWF0dXJlXG4gICAgICAgICAgaWYgKHNjcm9sbGluZ1N0YXRlKSB7XG4gICAgICAgICAgICBzY3JvbGxpbmdTdGF0ZS5zZXRWZWxvY2l0eVRvWmVybz8uKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBzY3JvbGwgZGVsdGEgKHZlbG9jaXR5IGlzIGluIHB4L21zLCBzbyBtdWx0aXBseSBieSBmcmFtZSB0aW1lKVxuICAgICAgICBjb25zdCBmcmFtZURlbHRhID0gdmVsb2NpdHkgKiBWSUVXUE9SVF9DT05TVEFOVFMuTU9NRU5UVU0uRlJBTUVfVElNRTtcblxuICAgICAgICAvLyBVc2Ugc2Nyb2xsaW5nIGZlYXR1cmUncyBBUEkgdG8gdXBkYXRlIHBvc2l0aW9uXG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsQnkpIHtcbiAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsQnkoZnJhbWVEZWx0YSk7XG5cbiAgICAgICAgICAvLyBDb250aW51ZSBhbmltYXRpb25cbiAgICAgICAgICBtb21lbnR1bUFuaW1hdGlvbklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIHNjcm9sbEJ5IG1ldGhvZCwgc3RvcCBtb21lbnR1bVxuICAgICAgICAgIG1vbWVudHVtQW5pbWF0aW9uSWQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBtb21lbnR1bUFuaW1hdGlvbklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpO1xuICAgIH07XG5cbiAgICAvLyBUb3VjaCBldmVudCBoYW5kbGVyc1xuICAgIGNvbnN0IGhhbmRsZVRvdWNoU3RhcnQgPSAoZTogVG91Y2hFdmVudCkgPT4ge1xuICAgICAgaXNUb3VjaGluZyA9IHRydWU7XG4gICAgICBjb25zdCB0b3VjaCA9IGUudG91Y2hlc1swXTtcbiAgICAgIGNvbnN0IG9yaWVudGF0aW9uID0gdmlld3BvcnRTdGF0ZT8ub3JpZW50YXRpb24gfHwgXCJ2ZXJ0aWNhbFwiO1xuICAgICAgbGFzdFRvdWNoUG9zaXRpb24gPVxuICAgICAgICBvcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiID8gdG91Y2guY2xpZW50WSA6IHRvdWNoLmNsaWVudFg7XG4gICAgICB0b3VjaFN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgICAgIC8vIENhbmNlbCBhbnkgb25nb2luZyBtb21lbnR1bVxuICAgICAgaWYgKG1vbWVudHVtQW5pbWF0aW9uSWQpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUobW9tZW50dW1BbmltYXRpb25JZCk7XG4gICAgICAgIG1vbWVudHVtQW5pbWF0aW9uSWQgPSBudWxsO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVUb3VjaE1vdmUgPSAoZTogVG91Y2hFdmVudCkgPT4ge1xuICAgICAgaWYgKCFpc1RvdWNoaW5nKSByZXR1cm47XG5cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTsgLy8gUHJldmVudCBuYXRpdmUgc2Nyb2xsaW5nXG5cbiAgICAgIGNvbnN0IHRvdWNoID0gZS50b3VjaGVzWzBdO1xuICAgICAgY29uc3Qgb3JpZW50YXRpb24gPSB2aWV3cG9ydFN0YXRlPy5vcmllbnRhdGlvbiB8fCBcInZlcnRpY2FsXCI7XG4gICAgICBjb25zdCBjdXJyZW50UG9zaXRpb24gPVxuICAgICAgICBvcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiID8gdG91Y2guY2xpZW50WSA6IHRvdWNoLmNsaWVudFg7XG4gICAgICBjb25zdCBkZWx0YSA9IGxhc3RUb3VjaFBvc2l0aW9uIC0gY3VycmVudFBvc2l0aW9uOyAvLyBJbnZlcnRlZCBmb3IgbmF0dXJhbCBzY3JvbGxpbmdcbiAgICAgIGxhc3RUb3VjaFBvc2l0aW9uID0gY3VycmVudFBvc2l0aW9uO1xuXG4gICAgICAvLyBVc2Ugc2Nyb2xsaW5nIGZlYXR1cmUncyBBUEkgKDE6MSB0b3VjaC10by1zY3JvbGwgZm9yIG5hdHVyYWwgZmVlbClcbiAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsQnkpIHtcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5KGRlbHRhKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlVG91Y2hFbmQgPSAoKSA9PiB7XG4gICAgICBpZiAoIWlzVG91Y2hpbmcpIHJldHVybjtcbiAgICAgIGlzVG91Y2hpbmcgPSBmYWxzZTtcblxuICAgICAgY29uc3QgdG91Y2hFbmRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHRvdWNoRHVyYXRpb24gPSB0b3VjaEVuZFRpbWUgLSB0b3VjaFN0YXJ0VGltZTtcblxuICAgICAgLy8gR2V0IGN1cnJlbnQgdmVsb2NpdHkgZnJvbSBzY3JvbGxpbmcgZmVhdHVyZVxuICAgICAgY29uc3QgdmVsb2NpdHkgPSBjb21wb25lbnQudmlld3BvcnQuZ2V0VmVsb2NpdHk/LigpIHx8IDA7XG5cbiAgICAgIC8vIE9ubHkgc3RhcnQgbW9tZW50dW0gaWYgdGhlIHRvdWNoIHdhcyBxdWljayBlbm91Z2ggYW5kIHdlIGhhdmUgdmVsb2NpdHlcbiAgICAgIGlmIChcbiAgICAgICAgdG91Y2hEdXJhdGlvbiA8IG1pbkR1cmF0aW9uICYmXG4gICAgICAgIE1hdGguYWJzKHZlbG9jaXR5KSA+IG1pblZlbG9jaXR5VGhyZXNob2xkXG4gICAgICApIHtcbiAgICAgICAgc3RhcnRNb21lbnR1bSh2ZWxvY2l0eSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSBjbGljayB0byBzdG9wIG1vbWVudHVtICh3aXRob3V0IHByZXZlbnRpbmcgc2VsZWN0aW9uKVxuICAgIGNvbnN0IGhhbmRsZUNsaWNrID0gKF9lOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBzdG9wTW9tZW50dW0oKTtcbiAgICB9O1xuXG4gICAgLy8gTW91c2UgZXZlbnQgaGFuZGxlcnMgZm9yIGRlc2t0b3BcbiAgICBjb25zdCBoYW5kbGVNb3VzZURvd24gPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgaXNNb3VzZURyYWdnaW5nID0gdHJ1ZTtcbiAgICAgIGNvbnN0IG9yaWVudGF0aW9uID0gdmlld3BvcnRTdGF0ZT8ub3JpZW50YXRpb24gfHwgXCJ2ZXJ0aWNhbFwiO1xuICAgICAgbGFzdE1vdXNlUG9zaXRpb24gPSBvcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiID8gZS5jbGllbnRZIDogZS5jbGllbnRYO1xuICAgICAgdG91Y2hTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAvLyBDYW5jZWwgYW55IG9uZ29pbmcgbW9tZW50dW1cbiAgICAgIHN0b3BNb21lbnR1bSgpO1xuXG4gICAgICAvLyBQcmV2ZW50IHRleHQgc2VsZWN0aW9uXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZU1vdXNlTW92ZSA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBpZiAoIWlzTW91c2VEcmFnZ2luZykgcmV0dXJuO1xuXG4gICAgICBjb25zdCBvcmllbnRhdGlvbiA9IHZpZXdwb3J0U3RhdGU/Lm9yaWVudGF0aW9uIHx8IFwidmVydGljYWxcIjtcbiAgICAgIGNvbnN0IGN1cnJlbnRQb3NpdGlvbiA9XG4gICAgICAgIG9yaWVudGF0aW9uID09PSBcInZlcnRpY2FsXCIgPyBlLmNsaWVudFkgOiBlLmNsaWVudFg7XG4gICAgICBjb25zdCBkZWx0YSA9IGxhc3RNb3VzZVBvc2l0aW9uIC0gY3VycmVudFBvc2l0aW9uO1xuICAgICAgbGFzdE1vdXNlUG9zaXRpb24gPSBjdXJyZW50UG9zaXRpb247XG5cbiAgICAgIC8vIFVzZSBzY3JvbGxpbmcgZmVhdHVyZSdzIEFQSSAoMToxIGRyYWctdG8tc2Nyb2xsIGZvciBuYXR1cmFsIGZlZWwpXG4gICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5KSB7XG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxCeShkZWx0YSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZU1vdXNlVXAgPSAoKSA9PiB7XG4gICAgICBpZiAoIWlzTW91c2VEcmFnZ2luZykgcmV0dXJuO1xuICAgICAgaXNNb3VzZURyYWdnaW5nID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IG1vdXNlVXBUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGRyYWdEdXJhdGlvbiA9IG1vdXNlVXBUaW1lIC0gdG91Y2hTdGFydFRpbWU7XG5cbiAgICAgIC8vIEdldCBjdXJyZW50IHZlbG9jaXR5IGZyb20gc2Nyb2xsaW5nIGZlYXR1cmVcbiAgICAgIGNvbnN0IHZlbG9jaXR5ID0gY29tcG9uZW50LnZpZXdwb3J0LmdldFZlbG9jaXR5Py4oKSB8fCAwO1xuXG4gICAgICAvLyBTdGFydCBtb21lbnR1bSBmb3IgcXVpY2sgZHJhZ3NcbiAgICAgIGlmIChcbiAgICAgICAgZHJhZ0R1cmF0aW9uIDwgbWluRHVyYXRpb24gJiZcbiAgICAgICAgTWF0aC5hYnModmVsb2NpdHkpID4gbWluVmVsb2NpdHlUaHJlc2hvbGRcbiAgICAgICkge1xuICAgICAgICBzdGFydE1vbWVudHVtKHZlbG9jaXR5KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gT3ZlcnJpZGUgaW5pdGlhbGl6ZSB0byBhZGQgZXZlbnQgbGlzdGVuZXJzXG4gICAgY29uc3Qgb3JpZ2luYWxJbml0ID0gY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemU7XG4gICAgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBvcmlnaW5hbEluaXQoKTtcbiAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBpbml0aWFsaXplZFxuICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2aWV3cG9ydEVsZW1lbnQgPVxuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkudmlld3BvcnRFbGVtZW50IHx8XG4gICAgICAgIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zdGF0ZT8udmlld3BvcnRFbGVtZW50O1xuXG4gICAgICBpZiAodmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgIC8vIFRvdWNoIGV2ZW50c1xuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgaGFuZGxlVG91Y2hTdGFydCwge1xuICAgICAgICAgIHBhc3NpdmU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCBoYW5kbGVUb3VjaE1vdmUsIHtcbiAgICAgICAgICBwYXNzaXZlOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiwgaGFuZGxlVG91Y2hFbmQsIHtcbiAgICAgICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBNb3VzZSBldmVudHMgZm9yIGRlc2t0b3AgZHJhZ2dpbmdcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgaGFuZGxlTW91c2VEb3duKTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGhhbmRsZU1vdXNlVXApO1xuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgaGFuZGxlTW91c2VVcCk7XG5cbiAgICAgICAgLy8gQWRkIGNsaWNrIGxpc3RlbmVyIHRvIHN0b3AgbW9tZW50dW0gb24gY2xpY2sgKHdpdGhvdXQgYmxvY2tpbmcgc2VsZWN0aW9uKVxuICAgICAgICBpZiAoc3RvcE9uQ2xpY2spIHtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNsaWNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0b3JlIHJlZmVyZW5jZSBmb3IgY2xlYW51cFxuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuX21vbWVudHVtVmlld3BvcnRFbGVtZW50ID0gdmlld3BvcnRFbGVtZW50O1xuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuX21vbWVudHVtU3RvcE9uQ2xpY2sgPSBzdG9wT25DbGljaztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQ2xlYW4gdXAgb24gZGVzdHJveVxuICAgIGlmIChcImRlc3Ryb3lcIiBpbiBjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IGNvbXBvbmVudC5kZXN0cm95O1xuICAgICAgY29tcG9uZW50LmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIFJlbW92ZSBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgY29uc3Qgdmlld3BvcnRFbGVtZW50ID0gKGNvbXBvbmVudCBhcyBhbnkpLl9tb21lbnR1bVZpZXdwb3J0RWxlbWVudDtcbiAgICAgICAgaWYgKHZpZXdwb3J0RWxlbWVudCkge1xuICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLCBoYW5kbGVUb3VjaFN0YXJ0KTtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCBoYW5kbGVUb3VjaE1vdmUpO1xuICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiwgaGFuZGxlVG91Y2hFbmQpO1xuICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGhhbmRsZU1vdXNlRG93bik7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgaGFuZGxlTW91c2VVcCk7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIGhhbmRsZU1vdXNlVXApO1xuICAgICAgICAgIGlmICgoY29tcG9uZW50IGFzIGFueSkuX21vbWVudHVtU3RvcE9uQ2xpY2spIHtcbiAgICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlQ2xpY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbmNlbCBtb21lbnR1bSBhbmltYXRpb25cbiAgICAgICAgc3RvcE1vbWVudHVtKCk7XG5cbiAgICAgICAgb3JpZ2luYWxEZXN0cm95KCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEV4cG9zZSBtb21lbnR1bSBzdGF0ZSBmb3Igb3RoZXIgZmVhdHVyZXNcbiAgICAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkubW9tZW50dW1TdGF0ZSA9IHtcbiAgICAgIHN0b3BNb21lbnR1bSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3Njcm9sbGJhci50c1xuXG4vKipcbiAqIFNjcm9sbGJhciBGZWF0dXJlIC0gQ3VzdG9tIHNjcm9sbGJhciBpbXBsZW1lbnRhdGlvblxuICogUHJvdmlkZXMgdmlzdWFsIHNjcm9sbCBpbmRpY2F0aW9uIGFuZCBkcmFnLXRvLXNjcm9sbCBmdW5jdGlvbmFsaXR5XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBWSUVXUE9SVF9DT05TVEFOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB3cmFwSW5pdGlhbGl6ZSwgd3JhcERlc3Ryb3ksIHN0b3JlRmVhdHVyZUZ1bmN0aW9uIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IFBSRUZJWCwgYWRkQ2xhc3MsIHJlbW92ZUNsYXNzIH0gZnJvbSBcIm10cmxcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTY3JvbGxiYXJDb25maWcge1xuICBlbmFibGVkPzogYm9vbGVhbjtcbiAgYXV0b0hpZGU/OiBib29sZWFuO1xuICB0aHVtYk1pbkhlaWdodD86IG51bWJlcjtcbiAgdGh1bWJDb2xvcj86IHN0cmluZztcbiAgdHJhY2tDb2xvcj86IHN0cmluZztcbiAgYm9yZGVyUmFkaXVzPzogbnVtYmVyO1xuICBmYWRlVGltZW91dD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY3JvbGxiYXJDb21wb25lbnQge1xuICBzY3JvbGxiYXI6IHtcbiAgICBzaG93OiAoKSA9PiB2b2lkO1xuICAgIGhpZGU6ICgpID0+IHZvaWQ7XG4gICAgdXBkYXRlQm91bmRzOiAodG90YWxWaXJ0dWFsU2l6ZTogbnVtYmVyLCBjb250YWluZXJTaXplOiBudW1iZXIpID0+IHZvaWQ7XG4gICAgdXBkYXRlUG9zaXRpb246IChzY3JvbGxQb3NpdGlvbjogbnVtYmVyKSA9PiB2b2lkO1xuICB9O1xufVxuXG4vKipcbiAqIEFkZHMgc2Nyb2xsYmFyIGZ1bmN0aW9uYWxpdHkgdG8gdmlld3BvcnQgY29tcG9uZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoU2Nyb2xsYmFyKGNvbmZpZzogU2Nyb2xsYmFyQ29uZmlnID0ge30pIHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KFxuICAgIGNvbXBvbmVudDogVCxcbiAgKTogVCAmIFNjcm9sbGJhckNvbXBvbmVudCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgZW5hYmxlZCA9IHRydWUsXG4gICAgICBhdXRvSGlkZSA9IHRydWUsXG4gICAgICB0aHVtYk1pbkhlaWdodCA9IDI1LFxuICAgICAgYm9yZGVyUmFkaXVzID0gNCxcbiAgICAgIGZhZGVUaW1lb3V0ID0gMTAwMCxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gUmV0dXJuIG5vLW9wIGlmIGRpc2FibGVkXG4gICAgaWYgKCFlbmFibGVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jb21wb25lbnQsXG4gICAgICAgIHNjcm9sbGJhcjoge1xuICAgICAgICAgIHNob3c6ICgpID0+IHt9LFxuICAgICAgICAgIGhpZGU6ICgpID0+IHt9LFxuICAgICAgICAgIHVwZGF0ZUJvdW5kczogKCkgPT4ge30sXG4gICAgICAgICAgdXBkYXRlUG9zaXRpb246ICgpID0+IHt9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBTdGF0ZVxuICAgIGxldCB2aWV3cG9ydEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHNjcm9sbGJhclRyYWNrOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGxldCBzY3JvbGxiYXJUaHVtYjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIGxldCBpc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgbGV0IGRyYWdTdGFydFkgPSAwO1xuICAgIGxldCBkcmFnU3RhcnRTY3JvbGxQb3NpdGlvbiA9IDA7XG4gICAgbGV0IGhpZGVUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICAgIGxldCB0b3RhbFZpcnR1YWxTaXplID0gMDtcbiAgICBsZXQgY29udGFpbmVyU2l6ZSA9IDA7XG4gICAgbGV0IHRodW1iSGVpZ2h0ID0gMDtcbiAgICBsZXQgYW5pbWF0aW9uRnJhbWVJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGlzQ3Vyc29yTW9kZSA9IGZhbHNlO1xuICAgIGxldCBsb2FkZWRJdGVtc0NvdW50ID0gMDtcblxuICAgIC8vIENyZWF0ZSBzY3JvbGxiYXIgZWxlbWVudHNcbiAgICBjb25zdCBjcmVhdGVTY3JvbGxiYXJFbGVtZW50cyA9ICgpID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRFbGVtZW50KSByZXR1cm47XG5cbiAgICAgIHNjcm9sbGJhclRyYWNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGFkZENsYXNzKHNjcm9sbGJhclRyYWNrLCBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSKTtcbiAgICAgIHNjcm9sbGJhclRyYWNrLnN0eWxlLmNzc1RleHQgPSBgXG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICB6LWluZGV4OiAxMDtcbiAgICAgIGA7XG5cbiAgICAgIHNjcm9sbGJhclRodW1iID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAgICAgYWRkQ2xhc3MoXG4gICAgICAgIHNjcm9sbGJhclRodW1iLFxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSX1RIVU1CLFxuICAgICAgKTtcblxuICAgICAgc2Nyb2xsYmFyVHJhY2suYXBwZW5kQ2hpbGQoc2Nyb2xsYmFyVGh1bWIpO1xuICAgICAgdmlld3BvcnRFbGVtZW50LmFwcGVuZENoaWxkKHNjcm9sbGJhclRyYWNrKTtcbiAgICB9O1xuXG4gICAgLy8gU2hvdy9oaWRlIGZ1bmN0aW9uc1xuICAgIGNvbnN0IHNob3cgPSAoKSA9PiB7XG4gICAgICBpZiAoIXNjcm9sbGJhclRyYWNrIHx8IHRvdGFsVmlydHVhbFNpemUgPD0gY29udGFpbmVyU2l6ZSkgcmV0dXJuO1xuXG4gICAgICBpZiAoaGlkZVRpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGhpZGVUaW1lb3V0KTtcbiAgICAgICAgaGlkZVRpbWVvdXQgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgc2Nyb2xsYmFyVHJhY2ssXG4gICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVJfVklTSUJMRSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChhdXRvSGlkZSAmJiAhaXNEcmFnZ2luZykge1xuICAgICAgICBoaWRlVGltZW91dCA9IHNldFRpbWVvdXQoaGlkZSwgZmFkZVRpbWVvdXQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoaWRlID0gKCkgPT4ge1xuICAgICAgaWYgKCFzY3JvbGxiYXJUcmFjayB8fCBpc0RyYWdnaW5nKSByZXR1cm47XG4gICAgICByZW1vdmVDbGFzcyhcbiAgICAgICAgc2Nyb2xsYmFyVHJhY2ssXG4gICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVJfVklTSUJMRSxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSBzY3JvbGxiYXIgYm91bmRzXG4gICAgY29uc3QgdXBkYXRlQm91bmRzID0gKG5ld1RvdGFsU2l6ZTogbnVtYmVyLCBuZXdDb250YWluZXJTaXplOiBudW1iZXIpID0+IHtcbiAgICAgIHRvdGFsVmlydHVhbFNpemUgPSBuZXdUb3RhbFNpemU7XG4gICAgICBjb250YWluZXJTaXplID0gbmV3Q29udGFpbmVyU2l6ZTtcblxuICAgICAgaWYgKCFzY3JvbGxiYXJUcmFjayB8fCAhc2Nyb2xsYmFyVGh1bWIpIHJldHVybjtcblxuICAgICAgY29uc3QgbmVlZHNTY3JvbGxiYXIgPSB0b3RhbFZpcnR1YWxTaXplID4gY29udGFpbmVyU2l6ZTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGJhcl0gdXBkYXRlQm91bmRzOiB0b3RhbFNpemU9JHt0b3RhbFZpcnR1YWxTaXplfSwgY29udGFpbmVyU2l6ZT0ke2NvbnRhaW5lclNpemV9LCBuZWVkc1Njcm9sbGJhcj0ke25lZWRzU2Nyb2xsYmFyfWBcbiAgICAgIC8vICk7XG4gICAgICBzY3JvbGxiYXJUcmFjay5zdHlsZS5kaXNwbGF5ID0gbmVlZHNTY3JvbGxiYXIgPyBcImJsb2NrXCIgOiBcIm5vbmVcIjtcblxuICAgICAgaWYgKG5lZWRzU2Nyb2xsYmFyKSB7XG4gICAgICAgIGxldCBzY3JvbGxSYXRpbzogbnVtYmVyO1xuXG4gICAgICAgIGlmIChpc0N1cnNvck1vZGUgJiYgbG9hZGVkSXRlbXNDb3VudCA+IDApIHtcbiAgICAgICAgICAvLyBGb3IgY3Vyc29yIG1vZGUsIHRodW1iIHNpemUgcmVwcmVzZW50cyBsb2FkZWQgY29udGVudCB2cyBlc3RpbWF0ZWQgdG90YWxcbiAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBrbm93IHRvdGFsLCB1c2UgbG9hZGVkIGl0ZW1zICogMiBhcyBlc3RpbWF0ZVxuICAgICAgICAgIGNvbnN0IGVzdGltYXRlZFRvdGFsID1cbiAgICAgICAgICAgIHRvdGFsVmlydHVhbFNpemUgPiAwID8gdG90YWxWaXJ0dWFsU2l6ZSA6IGxvYWRlZEl0ZW1zQ291bnQgKiAyO1xuICAgICAgICAgIHNjcm9sbFJhdGlvID1cbiAgICAgICAgICAgIGNvbnRhaW5lclNpemUgL1xuICAgICAgICAgICAgTWF0aC5tYXgoZXN0aW1hdGVkVG90YWwsIGxvYWRlZEl0ZW1zQ291bnQgKyBjb250YWluZXJTaXplKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBOb3JtYWwgY2FsY3VsYXRpb24gZm9yIG9mZnNldC9wYWdlIHN0cmF0ZWdpZXNcbiAgICAgICAgICBzY3JvbGxSYXRpbyA9IGNvbnRhaW5lclNpemUgLyB0b3RhbFZpcnR1YWxTaXplO1xuICAgICAgICB9XG5cbiAgICAgICAgdGh1bWJIZWlnaHQgPSBNYXRoLm1heCh0aHVtYk1pbkhlaWdodCwgc2Nyb2xsUmF0aW8gKiBjb250YWluZXJTaXplKTtcbiAgICAgICAgc2Nyb2xsYmFyVGh1bWIuc3R5bGUuaGVpZ2h0ID0gYCR7dGh1bWJIZWlnaHR9cHhgO1xuICAgICAgICB1cGRhdGVQb3NpdGlvbihjb21wb25lbnQudmlld3BvcnQ/LmdldFNjcm9sbFBvc2l0aW9uKCkgfHwgMCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSB0aHVtYiBwb3NpdGlvblxuICAgIGNvbnN0IHVwZGF0ZVBvc2l0aW9uID0gKHNjcm9sbFBvczogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoIXNjcm9sbGJhclRodW1iIHx8ICFzY3JvbGxiYXJUcmFjaykgcmV0dXJuO1xuXG4gICAgICBjb25zdCBzY3JvbGxhYmxlRGlzdGFuY2UgPSB0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZTtcbiAgICAgIGlmIChzY3JvbGxhYmxlRGlzdGFuY2UgPD0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IE1hdGgubWluKFxuICAgICAgICAxLFxuICAgICAgICBNYXRoLm1heCgwLCBzY3JvbGxQb3MgLyBzY3JvbGxhYmxlRGlzdGFuY2UpLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG1heFRodW1iUG9zaXRpb24gPVxuICAgICAgICBzY3JvbGxiYXJUcmFjay5jbGllbnRIZWlnaHQgLSBzY3JvbGxiYXJUaHVtYi5jbGllbnRIZWlnaHQ7XG4gICAgICBjb25zdCB0aHVtYlBvc2l0aW9uID0gc2Nyb2xsUmF0aW8gKiBtYXhUaHVtYlBvc2l0aW9uO1xuXG4gICAgICBzY3JvbGxiYXJUaHVtYi5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgke3RodW1iUG9zaXRpb259cHgpYDtcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIHRyYWNrIGNsaWNrXG4gICAgY29uc3QgaGFuZGxlVHJhY2tDbGljayA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBpZiAoIXNjcm9sbGJhclRyYWNrIHx8ICFzY3JvbGxiYXJUaHVtYiB8fCBlLnRhcmdldCA9PT0gc2Nyb2xsYmFyVGh1bWIpXG4gICAgICAgIHJldHVybjtcblxuICAgICAgY29uc3QgdHJhY2tSZWN0ID0gc2Nyb2xsYmFyVHJhY2suZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCBjbGlja1kgPSBlLmNsaWVudFkgLSB0cmFja1JlY3QudG9wO1xuICAgICAgY29uc3QgdGh1bWJDZW50ZXJZID0gY2xpY2tZIC0gdGh1bWJIZWlnaHQgLyAyO1xuICAgICAgY29uc3QgbWF4VGh1bWJQb3NpdGlvbiA9IGNvbnRhaW5lclNpemUgLSB0aHVtYkhlaWdodDtcbiAgICAgIGNvbnN0IHRodW1iUG9zaXRpb24gPSBNYXRoLm1heChcbiAgICAgICAgMCxcbiAgICAgICAgTWF0aC5taW4odGh1bWJDZW50ZXJZLCBtYXhUaHVtYlBvc2l0aW9uKSxcbiAgICAgICk7XG4gICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IHRodW1iUG9zaXRpb24gLyBtYXhUaHVtYlBvc2l0aW9uO1xuICAgICAgY29uc3QgdGFyZ2V0U2Nyb2xsUG9zaXRpb24gPVxuICAgICAgICBzY3JvbGxSYXRpbyAqICh0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZSk7XG5cbiAgICAgIGNvbXBvbmVudC52aWV3cG9ydD8uc2Nyb2xsVG9Qb3NpdGlvbih0YXJnZXRTY3JvbGxQb3NpdGlvbik7XG4gICAgfTtcblxuICAgIC8vIE1vdXNlIGV2ZW50IGhhbmRsZXJzXG4gICAgY29uc3QgaGFuZGxlVGh1bWJNb3VzZURvd24gPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICBkcmFnU3RhcnRZID0gZS5jbGllbnRZO1xuICAgICAgZHJhZ1N0YXJ0U2Nyb2xsUG9zaXRpb24gPSBjb21wb25lbnQudmlld3BvcnQ/LmdldFNjcm9sbFBvc2l0aW9uKCkgfHwgMDtcblxuICAgICAgaWYgKHNjcm9sbGJhclRyYWNrKSB7XG4gICAgICAgIGFkZENsYXNzKFxuICAgICAgICAgIHNjcm9sbGJhclRyYWNrLFxuICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVJfRFJBR0dJTkcsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVtaXQgZHJhZyBzdGFydCBldmVudCB0byBub3RpZnkgdmlld3BvcnRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpkcmFnLXN0YXJ0XCIsIHtcbiAgICAgICAgc291cmNlOiBcInNjcm9sbGJhclwiLFxuICAgICAgICBzdGFydFBvc2l0aW9uOiBkcmFnU3RhcnRTY3JvbGxQb3NpdGlvbixcbiAgICAgIH0pO1xuXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBoYW5kbGVNb3VzZVVwKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlTW91c2VNb3ZlID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmICghaXNEcmFnZ2luZyB8fCAhc2Nyb2xsYmFyVHJhY2sgfHwgIXNjcm9sbGJhclRodW1iKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGRlbHRhWSA9IGUuY2xpZW50WSAtIGRyYWdTdGFydFk7XG4gICAgICBjb25zdCB0cmFja0hlaWdodCA9IHNjcm9sbGJhclRyYWNrLmNsaWVudEhlaWdodDtcbiAgICAgIGNvbnN0IHRodW1iSGVpZ2h0ID0gc2Nyb2xsYmFyVGh1bWIuY2xpZW50SGVpZ2h0O1xuICAgICAgY29uc3QgbWF4VGh1bWJUcmF2ZWwgPSB0cmFja0hlaWdodCAtIHRodW1iSGVpZ2h0O1xuXG4gICAgICBpZiAobWF4VGh1bWJUcmF2ZWwgPD0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBkZWx0YVJhdGlvID0gZGVsdGFZIC8gbWF4VGh1bWJUcmF2ZWw7XG4gICAgICBjb25zdCBkcmFnU3RhcnRTY3JvbGxSYXRpbyA9XG4gICAgICAgIGRyYWdTdGFydFNjcm9sbFBvc2l0aW9uIC8gKHRvdGFsVmlydHVhbFNpemUgLSBjb250YWluZXJTaXplKTtcbiAgICAgIGNvbnN0IG5ld1Njcm9sbFJhdGlvID0gTWF0aC5tYXgoXG4gICAgICAgIDAsXG4gICAgICAgIE1hdGgubWluKDEsIGRyYWdTdGFydFNjcm9sbFJhdGlvICsgZGVsdGFSYXRpbyksXG4gICAgICApO1xuXG4gICAgICAvLyBVcGRhdGUgdGh1bWIgcG9zaXRpb24gaW1tZWRpYXRlbHlcbiAgICAgIGNvbnN0IHRodW1iUG9zaXRpb24gPSBuZXdTY3JvbGxSYXRpbyAqIG1heFRodW1iVHJhdmVsO1xuICAgICAgc2Nyb2xsYmFyVGh1bWIuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoJHt0aHVtYlBvc2l0aW9ufXB4KWA7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBuZXcgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICBjb25zdCBuZXdQb3NpdGlvbiA9IG5ld1Njcm9sbFJhdGlvICogKHRvdGFsVmlydHVhbFNpemUgLSBjb250YWluZXJTaXplKTtcbiAgICAgIGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbiA9IG5ld1Bvc2l0aW9uO1xuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtTY3JvbGxiYXJdIE1vdXNlIG1vdmU6IG5ld1Bvcz0ke25ld1Bvc2l0aW9uLnRvRml4ZWQoXG4gICAgICAvLyAgICAgMFxuICAgICAgLy8gICApfSwgYW5pbWF0aW9uRnJhbWVJZD0ke2FuaW1hdGlvbkZyYW1lSWR9YFxuICAgICAgLy8gKTtcblxuICAgICAgLy8gVGhyb3R0bGUgdmlld3BvcnQgdXBkYXRlc1xuICAgICAgaWYgKGFuaW1hdGlvbkZyYW1lSWQgPT09IG51bGwgJiYgY29tcG9uZW50LnZpZXdwb3J0KSB7XG4gICAgICAgIGFuaW1hdGlvbkZyYW1lSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtTY3JvbGxiYXJdIFJBRiBjYWxsYmFjazogc2Nyb2xsaW5nIHRvICR7bGFzdFJlcXVlc3RlZFNjcm9sbFBvc2l0aW9ufWBcbiAgICAgICAgICAvLyApO1xuICAgICAgICAgIGlmIChsYXN0UmVxdWVzdGVkU2Nyb2xsUG9zaXRpb24gIT09IG51bGwgJiYgY29tcG9uZW50LnZpZXdwb3J0KSB7XG4gICAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9Qb3NpdGlvbihsYXN0UmVxdWVzdGVkU2Nyb2xsUG9zaXRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhbmltYXRpb25GcmFtZUlkID0gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZU1vdXNlVXAgPSAoKSA9PiB7XG4gICAgICBpc0RyYWdnaW5nID0gZmFsc2U7XG5cbiAgICAgIGlmIChhbmltYXRpb25GcmFtZUlkICE9PSBudWxsKSB7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGFuaW1hdGlvbkZyYW1lSWQpO1xuICAgICAgICBhbmltYXRpb25GcmFtZUlkID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbiAhPT0gbnVsbCAmJiBjb21wb25lbnQudmlld3BvcnQpIHtcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbFRvUG9zaXRpb24obGFzdFJlcXVlc3RlZFNjcm9sbFBvc2l0aW9uKTtcbiAgICAgICAgbGFzdFJlcXVlc3RlZFNjcm9sbFBvc2l0aW9uID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHNjcm9sbGJhclRyYWNrKSB7XG4gICAgICAgIHJlbW92ZUNsYXNzKFxuICAgICAgICAgIHNjcm9sbGJhclRyYWNrLFxuICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVJfRFJBR0dJTkcsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVtaXQgZHJhZyBlbmQgZXZlbnRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpkcmFnLWVuZFwiLCB7XG4gICAgICAgIHNvdXJjZTogXCJzY3JvbGxiYXJcIixcbiAgICAgICAgZW5kUG9zaXRpb246IGNvbXBvbmVudC52aWV3cG9ydD8uZ2V0U2Nyb2xsUG9zaXRpb24oKSB8fCAwLFxuICAgICAgfSk7XG5cbiAgICAgIGhpZGUoKTtcblxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgaGFuZGxlTW91c2VVcCk7XG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgZnVuY3Rpb25cbiAgICBjb25zdCBpbml0aWFsaXplID0gKCkgPT4ge1xuICAgICAgaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjtcblxuICAgICAgdmlld3BvcnRFbGVtZW50ID0gY29tcG9uZW50LmVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIGAuJHtQUkVGSVh9LXZpZXdwb3J0YCxcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgIGlmICghdmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIltTY3JvbGxiYXJdIE5vIHZpZXdwb3J0IGVsZW1lbnQgZm91bmRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICB2aWV3cG9ydEVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICBgLiR7UFJFRklYfS0ke1ZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVJ9YCxcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNyZWF0ZVNjcm9sbGJhckVsZW1lbnRzKCk7XG4gICAgICBpc0luaXRpYWxpemVkID0gdHJ1ZTtcblxuICAgICAgaWYgKHNjcm9sbGJhclRyYWNrICYmIHZpZXdwb3J0RWxlbWVudCkge1xuICAgICAgICBzY3JvbGxiYXJUcmFjay5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlVHJhY2tDbGljayk7XG5cbiAgICAgICAgaWYgKHNjcm9sbGJhclRodW1iKSB7XG4gICAgICAgICAgc2Nyb2xsYmFyVGh1bWIuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBoYW5kbGVUaHVtYk1vdXNlRG93bik7XG4gICAgICAgIH1cblxuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZW50ZXJcIiwgc2hvdywgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICBcIm1vdXNlbGVhdmVcIixcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWlzRHJhZ2dpbmcpIGhpZGUoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgcGFzc2l2ZTogdHJ1ZSB9LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBJbml0aWFsaXplIHdpdGggY3VycmVudCB2aWV3cG9ydCBzdGF0ZVxuICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydCkge1xuICAgICAgICBjb25zdCBpbmZvID0gY29tcG9uZW50LnZpZXdwb3J0LmdldFZpZXdwb3J0SW5mbygpO1xuICAgICAgICB0b3RhbFZpcnR1YWxTaXplID0gaW5mby50b3RhbFZpcnR1YWxTaXplO1xuICAgICAgICBjb250YWluZXJTaXplID0gaW5mby5jb250YWluZXJTaXplO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluIGN1cnNvciBtb2RlXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbjtcbiAgICAgICAgY29uc3Qgdmlld3BvcnRDb25maWcgPSAoY29tcG9uZW50IGFzIGFueSkuY29uZmlnO1xuICAgICAgICBpc0N1cnNvck1vZGUgPSB2aWV3cG9ydENvbmZpZz8ucGFnaW5hdGlvbj8uc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCI7XG5cbiAgICAgICAgdXBkYXRlQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgICB1cGRhdGVQb3NpdGlvbihjb21wb25lbnQudmlld3BvcnQuZ2V0U2Nyb2xsUG9zaXRpb24oKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEV2ZW50IGxpc3RlbmVyc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpzY3JvbGxcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBpZiAoIWlzRHJhZ2dpbmcpIHtcbiAgICAgICAgICB1cGRhdGVQb3NpdGlvbihkYXRhLnBvc2l0aW9uKTtcbiAgICAgICAgICBzaG93KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnZpcnR1YWwtc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9IGRhdGEudG90YWxWaXJ0dWFsU2l6ZTtcbiAgICAgICAgdXBkYXRlQm91bmRzKGRhdGEudG90YWxWaXJ0dWFsU2l6ZSwgY29udGFpbmVyU2l6ZSk7XG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpjb250YWluZXItc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29udGFpbmVyU2l6ZSA9IGRhdGEuY29udGFpbmVyU2l6ZTtcbiAgICAgICAgdXBkYXRlQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGRhdGEuY29udGFpbmVyU2l6ZSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBpdGVtcyBsb2FkZWQgdG8gdXBkYXRlIHNjcm9sbGJhciBpbiBjdXJzb3IgbW9kZVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDppdGVtcy1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGlzQ3Vyc29yTW9kZSkge1xuICAgICAgICAgIGxvYWRlZEl0ZW1zQ291bnQgPSBkYXRhLmxvYWRlZENvdW50IHx8IDA7XG4gICAgICAgICAgdXBkYXRlQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciB0b3RhbCBpdGVtcyBjaGFuZ2VzIChpbXBvcnRhbnQgZm9yIGN1cnNvciBtb2RlKVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDp0b3RhbC1pdGVtcy1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGlzQ3Vyc29yTW9kZSAmJiBkYXRhLnRvdGFsKSB7XG4gICAgICAgICAgLy8gSW4gY3Vyc29yIG1vZGUsIHRoZSB0b3RhbCBpcyBkeW5hbWljXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgW1Njcm9sbGJhcl0gQ3Vyc29yIG1vZGU6IHVwZGF0aW5nIGJvdW5kcyBmb3IgbmV3IHRvdGFsICR7ZGF0YS50b3RhbH1gLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdXBkYXRlQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gU3RvcmUgaW5pdGlhbGl6ZSBmdW5jdGlvblxuICAgIHN0b3JlRmVhdHVyZUZ1bmN0aW9uKGNvbXBvbmVudCwgXCJfc2Nyb2xsYmFySW5pdGlhbGl6ZVwiLCBpbml0aWFsaXplKTtcblxuICAgIC8vIEhvb2sgaW50byB2aWV3cG9ydCBpbml0aWFsaXphdGlvblxuICAgIHdyYXBJbml0aWFsaXplKGNvbXBvbmVudCwgaW5pdGlhbGl6ZSk7XG5cbiAgICAvLyBDbGVhbnVwXG4gICAgY29uc3QgZGVzdHJveSA9ICgpID0+IHtcbiAgICAgIGlmIChzY3JvbGxiYXJUcmFjaykge1xuICAgICAgICBzY3JvbGxiYXJUcmFjay5yZW1vdmUoKTtcbiAgICAgICAgc2Nyb2xsYmFyVHJhY2sgPSBudWxsO1xuICAgICAgfVxuICAgICAgc2Nyb2xsYmFyVGh1bWIgPSBudWxsO1xuICAgICAgdmlld3BvcnRFbGVtZW50ID0gbnVsbDtcbiAgICAgIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAgICAgaWYgKGhpZGVUaW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dChoaWRlVGltZW91dCk7XG4gICAgICAgIGhpZGVUaW1lb3V0ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgaGFuZGxlTW91c2VVcCk7XG4gICAgfTtcblxuICAgIHN0b3JlRmVhdHVyZUZ1bmN0aW9uKGNvbXBvbmVudCwgXCJfc2Nyb2xsYmFyRGVzdHJveVwiLCBkZXN0cm95KTtcbiAgICB3cmFwRGVzdHJveShjb21wb25lbnQsIGRlc3Ryb3kpO1xuXG4gICAgLy8gUmV0dXJuIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBzY3JvbGxiYXI6IHsgc2hvdywgaGlkZSwgdXBkYXRlQm91bmRzLCB1cGRhdGVQb3NpdGlvbiB9LFxuICAgIH07XG4gIH07XG59XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL2NvbGxlY3Rpb24udHNcblxuLyoqXG4gKiBDb2xsZWN0aW9uIEZlYXR1cmUgLSBEYXRhIG1hbmFnZW1lbnQgYW5kIHJhbmdlIGxvYWRpbmdcbiAqIEhhbmRsZXMgY29sbGVjdGlvbiBpbnRlZ3JhdGlvbiwgcGFnaW5hdGlvbiwgYW5kIGRhdGEgZmV0Y2hpbmdcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBNdXRhYmxlIHJlZmVyZW5jZSBmb3IgbGF0ZSBiaW5kaW5nIGluIGZ1bmN0aW9uYWwgY29tcG9zaXRpb24uXG4gKiBVc2VkIGJ5IFZMaXN0IHRvIGFsbG93IGNvbGxlY3Rpb24gKGFwcGxpZWQgZWFybHkpIHRvIGFjY2Vzc1xuICogc2VhcmNoL2ZpbHRlciBmZWF0dXJlcyAoYXBwbGllZCBsYXRlcikuXG4gKi9cbmludGVyZmFjZSBTZWxmUmVmPFQ+IHtcbiAgY3VycmVudDogVCB8IG51bGw7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IHdpdGggb3B0aW9uYWwgc2VhcmNoL2ZpbHRlciBjYXBhYmlsaXRpZXMuXG4gKiBUaGVzZSBhcmUgYWRkZWQgYnkgd2l0aFNlYXJjaCBhbmQgd2l0aEZpbHRlciBmZWF0dXJlcy5cbiAqL1xuaW50ZXJmYWNlIFNlYXJjaEZpbHRlckNhcGFibGUge1xuICBfc2VhcmNoUXVlcnk/OiAoKSA9PiBzdHJpbmc7XG4gIF9maWx0ZXJzPzogKCkgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5pbXBvcnQgeyBWSUVXUE9SVF9DT05TVEFOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB3cmFwRGVzdHJveSB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGlvbkNvbmZpZyB7XG4gIGNvbGxlY3Rpb24/OiBhbnk7IC8vIENvbGxlY3Rpb24gYWRhcHRlclxuICByYW5nZVNpemU/OiBudW1iZXI7IC8vIERlZmF1bHQgcmFuZ2Ugc2l6ZSBmb3IgbG9hZGluZ1xuICBzdHJhdGVneT86IFwib2Zmc2V0XCIgfCBcInBhZ2VcIiB8IFwiY3Vyc29yXCI7IC8vIExvYWRpbmcgc3RyYXRlZ3lcbiAgdHJhbnNmb3JtPzogKGl0ZW06IGFueSkgPT4gYW55OyAvLyBJdGVtIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uXG4gIGNhbmNlbExvYWRUaHJlc2hvbGQ/OiBudW1iZXI7IC8vIFZlbG9jaXR5IHRocmVzaG9sZCBmb3IgY2FuY2VsbGluZyBsb2Fkc1xuICBtYXhDb25jdXJyZW50UmVxdWVzdHM/OiBudW1iZXI7XG4gIGVuYWJsZVJlcXVlc3RRdWV1ZT86IGJvb2xlYW47XG4gIG1heFF1ZXVlU2l6ZT86IG51bWJlcjtcbiAgbG9hZE9uRHJhZ0VuZD86IGJvb2xlYW47IC8vIEVuYWJsZSBsb2FkaW5nIHdoZW4gZHJhZyBlbmRzIChzYWZldHkgbWVhc3VyZSlcbiAgaW5pdGlhbFNjcm9sbEluZGV4PzogbnVtYmVyOyAvLyBJbml0aWFsIHNjcm9sbCBwb3NpdGlvbiAoMC1iYXNlZCBpbmRleClcbiAgc2VsZWN0SWQ/OiBzdHJpbmcgfCBudW1iZXI7IC8vIElEIG9mIGl0ZW0gdG8gc2VsZWN0IGFmdGVyIGluaXRpYWwgbG9hZCBjb21wbGV0ZXNcbiAgYXV0b0xvYWQ/OiBib29sZWFuOyAvLyBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgbG9hZCBkYXRhIG9uIGluaXRpYWxpemF0aW9uIChkZWZhdWx0OiB0cnVlKVxuICBhdXRvU2VsZWN0Rmlyc3Q/OiBib29sZWFuOyAvLyBBdXRvbWF0aWNhbGx5IHNlbGVjdCBmaXJzdCBpdGVtIGFmdGVyIGluaXRpYWwgbG9hZCAoZGVmYXVsdDogZmFsc2UpXG4gIC8qKiBNYXhpbXVtIGl0ZW1zIHRvIGtlZXAgaW4gbWVtb3J5IChkZWZhdWx0OiAxMDAwKSAqL1xuICBtYXhDYWNoZWRJdGVtcz86IG51bWJlcjtcbiAgLyoqIEV4dHJhIGl0ZW1zIHRvIGtlZXAgYXJvdW5kIHZpc2libGUgcmFuZ2UgZHVyaW5nIGV2aWN0aW9uIChkZWZhdWx0OiAxNTApICovXG4gIGV2aWN0aW9uQnVmZmVyPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbGxlY3Rpb25Db21wb25lbnQge1xuICBjb2xsZWN0aW9uOiB7XG4gICAgbG9hZFJhbmdlOiAob2Zmc2V0OiBudW1iZXIsIGxpbWl0OiBudW1iZXIpID0+IFByb21pc2U8YW55W10+O1xuICAgIGxvYWRNaXNzaW5nUmFuZ2VzOiAoXG4gICAgICByYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9LFxuICAgICAgY2FsbGVyPzogc3RyaW5nLFxuICAgICkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICBnZXRMb2FkZWRSYW5nZXM6ICgpID0+IFNldDxudW1iZXI+O1xuICAgIGdldFBlbmRpbmdSYW5nZXM6ICgpID0+IFNldDxudW1iZXI+O1xuICAgIGNsZWFyRmFpbGVkUmFuZ2VzOiAoKSA9PiB2b2lkO1xuICAgIGNsZWFyUXVldWU6ICgpID0+IHZvaWQ7XG4gICAgc2V0TWFudWFsbHlMb2FkZWQ6ICgpID0+IHZvaWQ7XG4gICAgc2V0UmVsb2FkSW5Qcm9ncmVzczogKFxuICAgICAgaW5Qcm9ncmVzczogYm9vbGVhbixcbiAgICAgIHRhcmdldFJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9LFxuICAgICkgPT4gdm9pZDtcbiAgICByZXRyeUZhaWxlZFJhbmdlOiAocmFuZ2VJZDogbnVtYmVyKSA9PiBQcm9taXNlPGFueVtdPjtcbiAgICBzZXRUb3RhbEl0ZW1zOiAodG90YWw6IG51bWJlcikgPT4gdm9pZDtcbiAgICBnZXRUb3RhbEl0ZW1zOiAoKSA9PiBudW1iZXI7XG4gICAgLy8gQ3Vyc29yLXNwZWNpZmljIG1ldGhvZHNcbiAgICBnZXRDdXJyZW50Q3Vyc29yOiAoKSA9PiBzdHJpbmcgfCBudWxsO1xuICAgIGdldEN1cnNvckZvclBhZ2U6IChwYWdlOiBudW1iZXIpID0+IHN0cmluZyB8IG51bGw7XG4gICAgLy8gUmVzZXQgbWV0aG9kIGZvciByZWxvYWQgZnVuY3Rpb25hbGl0eVxuICAgIHJlc2V0OiAoKSA9PiB2b2lkO1xuICB9O1xufVxuXG4vKipcbiAqIEFkZHMgY29sbGVjdGlvbiBmdW5jdGlvbmFsaXR5IHRvIHZpZXdwb3J0IGNvbXBvbmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aENvbGxlY3Rpb24oY29uZmlnOiBDb2xsZWN0aW9uQ29uZmlnID0ge30pIHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KFxuICAgIGNvbXBvbmVudDogVCxcbiAgKTogVCAmIENvbGxlY3Rpb25Db21wb25lbnQgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbGxlY3Rpb24sXG4gICAgICByYW5nZVNpemUgPSBWSUVXUE9SVF9DT05TVEFOVFMuTE9BRElORy5ERUZBVUxUX1JBTkdFX1NJWkUsXG4gICAgICBzdHJhdGVneSA9IFwib2Zmc2V0XCIsXG4gICAgICB0cmFuc2Zvcm0sXG4gICAgICBjYW5jZWxMb2FkVGhyZXNob2xkID0gVklFV1BPUlRfQ09OU1RBTlRTLkxPQURJTkcuQ0FOQ0VMX1RIUkVTSE9MRCxcbiAgICAgIG1heENvbmN1cnJlbnRSZXF1ZXN0cyA9IFZJRVdQT1JUX0NPTlNUQU5UUy5MT0FESU5HXG4gICAgICAgIC5NQVhfQ09OQ1VSUkVOVF9SRVFVRVNUUyxcbiAgICAgIGVuYWJsZVJlcXVlc3RRdWV1ZSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5SRVFVRVNUX1FVRVVFLkVOQUJMRUQsXG4gICAgICBtYXhRdWV1ZVNpemUgPSBWSUVXUE9SVF9DT05TVEFOVFMuUkVRVUVTVF9RVUVVRS5NQVhfUVVFVUVfU0laRSxcbiAgICAgIGxvYWRPbkRyYWdFbmQgPSB0cnVlLCAvLyBEZWZhdWx0IHRvIHRydWUgYXMgc2FmZXR5IG1lYXN1cmVcbiAgICAgIGluaXRpYWxTY3JvbGxJbmRleCA9IDAsIC8vIFN0YXJ0IGZyb20gYmVnaW5uaW5nIGJ5IGRlZmF1bHRcbiAgICAgIHNlbGVjdElkLCAvLyBJRCBvZiBpdGVtIHRvIHNlbGVjdCBhZnRlciBpbml0aWFsIGxvYWRcbiAgICAgIGF1dG9Mb2FkID0gdHJ1ZSwgLy8gQXV0by1sb2FkIGluaXRpYWwgZGF0YSBieSBkZWZhdWx0XG4gICAgICBhdXRvU2VsZWN0Rmlyc3QgPSBmYWxzZSwgLy8gQXV0b21hdGljYWxseSBzZWxlY3QgZmlyc3QgaXRlbSBhZnRlciBpbml0aWFsIGxvYWRcbiAgICAgIG1heENhY2hlZEl0ZW1zID0gMTAwMCwgLy8gTWF4aW11bSBpdGVtcyB0byBrZWVwIGluIG1lbW9yeVxuICAgICAgZXZpY3Rpb25CdWZmZXIgPSAxNTAsIC8vIEV4dHJhIGl0ZW1zIHRvIGtlZXAgYXJvdW5kIHZpc2libGUgcmFuZ2VcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gVHJhY2sgaWYgd2UndmUgY29tcGxldGVkIHRoZSBpbml0aWFsIGxvYWQgZm9yIGluaXRpYWxTY3JvbGxJbmRleFxuICAgIC8vIFRoaXMgcHJldmVudHMgdGhlIHZpZXdwb3J0OnJhbmdlLWNoYW5nZWQgbGlzdGVuZXIgZnJvbSBsb2FkaW5nIHBhZ2UgMVxuICAgIGxldCBoYXNDb21wbGV0ZWRJbml0aWFsUG9zaXRpb25Mb2FkID0gZmFsc2U7XG4gICAgY29uc3QgaGFzSW5pdGlhbFNjcm9sbEluZGV4ID0gaW5pdGlhbFNjcm9sbEluZGV4ID4gMDtcblxuICAgIC8vIFRyYWNrIGlmIGRhdGEgaGFzIGJlZW4gbWFudWFsbHkgbG9hZGVkIChlLmcuLCB2aWEgcmVsb2FkQXQpXG4gICAgLy8gVGhpcyBlbmFibGVzIHN1YnNlcXVlbnQgbG9hZHMgZnJvbSB2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkIGV2ZW4gd2l0aCBhdXRvTG9hZDogZmFsc2VcbiAgICBsZXQgaGFzTWFudWFsbHlMb2FkZWQgPSBmYWxzZTtcblxuICAgIC8vIFRyYWNrIGlmIGEgcmVsb2FkIGlzIGluIHByb2dyZXNzIChyZWxvYWRBdCBzZXRzIHRoaXMgdG8gcHJldmVudCBzdGFsZSBwYWdlIDEgbG9hZHMpXG4gICAgLy8gVGhpcyBpcyBzZXQgYnkgcmVsb2FkQXQgQkVGT1JFIGl0IHN0YXJ0cyBsb2FkaW5nLCBhbmQgY2xlYXJlZCB3aGVuIGxvYWRpbmcgY29tcGxldGVzXG4gICAgbGV0IHJlbG9hZEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICBsZXQgcmVsb2FkVGFyZ2V0UmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gY29uc29sZS5sb2coXCJbVmlld3BvcnQgQ29sbGVjdGlvbl0gSW5pdGlhbGl6ZWQgd2l0aCBjb25maWc6XCIsIHtcbiAgICAvLyAgIHN0cmF0ZWd5LFxuICAgIC8vICAgcmFuZ2VTaXplLFxuICAgIC8vICAgaW5pdGlhbFNjcm9sbEluZGV4LFxuICAgIC8vIH0pO1xuXG4gICAgLy8gTG9hZGluZyBtYW5hZ2VyIHN0YXRlXG4gICAgaW50ZXJmYWNlIFF1ZXVlZFJlcXVlc3Qge1xuICAgICAgcmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfTtcbiAgICAgIHByaW9yaXR5OiBcImhpZ2hcIiB8IFwibm9ybWFsXCIgfCBcImxvd1wiO1xuICAgICAgdGltZXN0YW1wOiBudW1iZXI7XG4gICAgICByZXNvbHZlOiAoKSA9PiB2b2lkO1xuICAgICAgcmVqZWN0OiAoZXJyb3I6IGFueSkgPT4gdm9pZDtcbiAgICAgIGNhbGxlcj86IHN0cmluZztcbiAgICB9XG5cbiAgICAvLyBTdGF0ZSB0cmFja2luZ1xuICAgIGxldCBjdXJyZW50VmVsb2NpdHkgPSAwO1xuICAgIGxldCBhY3RpdmVMb2FkQ291bnQgPSAwO1xuICAgIGxldCBjb21wbGV0ZWRMb2FkcyA9IDA7XG4gICAgbGV0IGZhaWxlZExvYWRzID0gMDtcbiAgICBsZXQgY2FuY2VsbGVkTG9hZHMgPSAwO1xuICAgIGxldCBpc0RyYWdnaW5nID0gZmFsc2U7IC8vIFRyYWNrIGRyYWcgc3RhdGVcblxuICAgIC8vIENhY2hlIGV2aWN0aW9uIGNvbmZpZ3VyYXRpb24gKGZyb20gY29uZmlnKVxuICAgIGNvbnN0IE1BWF9DQUNIRURfSVRFTVMgPSBtYXhDYWNoZWRJdGVtcztcbiAgICBjb25zdCBFVklDVElPTl9CVUZGRVIgPSBldmljdGlvbkJ1ZmZlcjtcblxuICAgIC8vIFRyYWNrIGFjdHVhbCBpdGVtIGNvdW50IGVmZmljaWVudGx5IChhdm9pZCBPKG4pIHNwYXJzZSBhcnJheSBpdGVyYXRpb24pXG4gICAgbGV0IGNhY2hlZEl0ZW1Db3VudCA9IDA7XG5cbiAgICAvLyBNZW1vcnkgZGlhZ25vc3RpY3NcbiAgICBjb25zdCBsb2dNZW1vcnlTdGF0cyA9IChjYWxsZXI6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgbG9hZGVkUmFuZ2VDb3VudCA9IGxvYWRlZFJhbmdlcy5zaXplO1xuICAgICAgY29uc3QgcGVuZGluZ1JhbmdlQ291bnQgPSBwZW5kaW5nUmFuZ2VzLnNpemU7XG4gICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXJDb3VudCA9IGFib3J0Q29udHJvbGxlcnMuc2l6ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRXZpY3QgaXRlbXMgZmFyIGZyb20gdGhlIGN1cnJlbnQgdmlzaWJsZSByYW5nZSB0byBwcmV2ZW50IG1lbW9yeSBibG9hdFxuICAgICAqIEtlZXBzIGl0ZW1zIHdpdGhpbiBFVklDVElPTl9CVUZGRVIgb2YgdGhlIHZpc2libGUgcmFuZ2VcbiAgICAgKlxuICAgICAqIFBFUkZPUk1BTkNFOiBVc2VzIGxvYWRlZFJhbmdlcyB0byBpdGVyYXRlIG9ubHkgbG9hZGVkIGRhdGEsIG5vdCB0aGUgZW50aXJlXG4gICAgICogc3BhcnNlIGFycmF5LiBUaGlzIGlzIGNyaXRpY2FsIGZvciBsYXJnZSBsaXN0cyAoMU0rIGl0ZW1zKSB3aGVyZSB0aGVcbiAgICAgKiBpdGVtcyBhcnJheSBpcyBzcGFyc2UgYW5kIGl0ZXJhdGluZyBpdGVtcy5sZW5ndGggd291bGQgYmUgTyhuKS5cbiAgICAgKi9cbiAgICBjb25zdCBldmljdERpc3RhbnRJdGVtcyA9ICh2aXNpYmxlU3RhcnQ6IG51bWJlciwgdmlzaWJsZUVuZDogbnVtYmVyKSA9PiB7XG4gICAgICAvLyBPbmx5IGV2aWN0IGlmIHdlIGhhdmUgbW9yZSB0aGFuIE1BWF9DQUNIRURfSVRFTVNcbiAgICAgIC8vIFVzZSBjYWNoZWQgY291bnQgaW5zdGVhZCBvZiBPKG4pIGl0ZW1zLmZpbHRlcihCb29sZWFuKS5sZW5ndGhcbiAgICAgIGlmIChjYWNoZWRJdGVtQ291bnQgPD0gTUFYX0NBQ0hFRF9JVEVNUykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtlZXBTdGFydCA9IE1hdGgubWF4KDAsIHZpc2libGVTdGFydCAtIEVWSUNUSU9OX0JVRkZFUik7XG4gICAgICBjb25zdCBrZWVwRW5kID0gdmlzaWJsZUVuZCArIEVWSUNUSU9OX0JVRkZFUjtcblxuICAgICAgLy8gQ2FsY3VsYXRlIHdoaWNoIHJhbmdlcyB0byBrZWVwIGJhc2VkIG9uIHZpc2libGUgYXJlYVxuICAgICAgY29uc3Qga2VlcFJhbmdlU3RhcnQgPSBNYXRoLmZsb29yKGtlZXBTdGFydCAvIHJhbmdlU2l6ZSk7XG4gICAgICBjb25zdCBrZWVwUmFuZ2VFbmQgPSBNYXRoLmZsb29yKGtlZXBFbmQgLyByYW5nZVNpemUpO1xuXG4gICAgICBsZXQgZXZpY3RlZENvdW50ID0gMDtcbiAgICAgIGNvbnN0IHJhbmdlc1RvUmVtb3ZlID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgICAgIC8vIEl0ZXJhdGUgb25seSBvdmVyIGxvYWRlZCByYW5nZXMsIG5vdCB0aGUgZW50aXJlIHNwYXJzZSBhcnJheVxuICAgICAgLy8gVGhpcyBpcyBPKGxvYWRlZCByYW5nZXMpIGluc3RlYWQgb2YgTyh0b3RhbCBpdGVtcylcbiAgICAgIGxvYWRlZFJhbmdlcy5mb3JFYWNoKChyYW5nZUlkKSA9PiB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgcmFuZ2UgaXMgb3V0c2lkZSB0aGUga2VlcCB6b25lXG4gICAgICAgIGlmIChyYW5nZUlkIDwga2VlcFJhbmdlU3RhcnQgfHwgcmFuZ2VJZCA+IGtlZXBSYW5nZUVuZCkge1xuICAgICAgICAgIHJhbmdlc1RvUmVtb3ZlLmFkZChyYW5nZUlkKTtcblxuICAgICAgICAgIC8vIEV2aWN0IGl0ZW1zIGluIHRoaXMgcmFuZ2VcbiAgICAgICAgICBjb25zdCByYW5nZVN0YXJ0ID0gcmFuZ2VJZCAqIHJhbmdlU2l6ZTtcbiAgICAgICAgICBjb25zdCByYW5nZUVuZCA9IHJhbmdlU3RhcnQgKyByYW5nZVNpemU7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IHJhbmdlU3RhcnQ7IGkgPCByYW5nZUVuZDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaXRlbXNbaV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBkZWxldGUgaXRlbXNbaV07XG4gICAgICAgICAgICAgIGV2aWN0ZWRDb3VudCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFJlbW92ZSBhbGwgcmFuZ2VzIHRoYXQgaGFkIGl0ZW1zIGV2aWN0ZWRcbiAgICAgIC8vIFRoaXMgaXMgY3JpdGljYWw6IGV2ZW4gaWYgb25seSBwYXJ0IG9mIGEgcmFuZ2Ugd2FzIGV2aWN0ZWQsXG4gICAgICAvLyB3ZSBtdXN0IHJlbW92ZSBpdCBmcm9tIGxvYWRlZFJhbmdlcyBzbyBpdCBnZXRzIHJlbG9hZGVkXG4gICAgICAvLyBBbHNvIHJlbW92ZSBmcm9tIHBlbmRpbmdSYW5nZXMgLSBpZiBhIHNsb3cgcmVxdWVzdCBjb21wbGV0ZXMgZm9yIGFuIGV2aWN0ZWQgcmFuZ2UsXG4gICAgICAvLyB3ZSBkb24ndCB3YW50IGl0IHRvIGJsb2NrIGZ1dHVyZSBsb2FkcyB3aGVuIHVzZXIgc2Nyb2xscyBiYWNrXG4gICAgICByYW5nZXNUb1JlbW92ZS5mb3JFYWNoKChyYW5nZUlkKSA9PiB7XG4gICAgICAgIGxvYWRlZFJhbmdlcy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgIHBlbmRpbmdSYW5nZXMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICAvLyBDbGVhbiB1cCBhY3RpdmUgcmVxdWVzdHMgdHJhY2tpbmdcbiAgICAgICAgYWN0aXZlUmVxdWVzdHMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICAvLyBBbHNvIGFib3J0IGFueSBpbi1mbGlnaHQgcmVxdWVzdCBmb3IgdGhpcyByYW5nZSB0byBmcmVlIHVwIG5ldHdvcmsgcmVzb3VyY2VzXG4gICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBhYm9ydENvbnRyb2xsZXJzLmdldChyYW5nZUlkKTtcbiAgICAgICAgaWYgKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgYWJvcnRDb250cm9sbGVycy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZXZpY3RlZENvdW50ID4gMCkge1xuICAgICAgICAvLyBVcGRhdGUgY2FjaGVkIGl0ZW0gY291bnRcbiAgICAgICAgY2FjaGVkSXRlbUNvdW50IC09IGV2aWN0ZWRDb3VudDtcblxuICAgICAgICAvLyBFbWl0IGV2ZW50IGZvciByZW5kZXJpbmcgdG8gYWxzbyBjbGVhbiB1cFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY29sbGVjdGlvbjppdGVtcy1ldmljdGVkXCIsIHtcbiAgICAgICAgICBrZWVwU3RhcnQsXG4gICAgICAgICAga2VlcEVuZCxcbiAgICAgICAgICBldmljdGVkQ291bnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBhY3RpdmVMb2FkUmFuZ2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgbGV0IGxvYWRSZXF1ZXN0UXVldWU6IFF1ZXVlZFJlcXVlc3RbXSA9IFtdO1xuXG4gICAgLy8gQWJvcnRDb250cm9sbGVyIG1hcCBmb3IgY2FuY2VsbGluZyBpbi1mbGlnaHQgcmVxdWVzdHNcbiAgICBjb25zdCBhYm9ydENvbnRyb2xsZXJzID0gbmV3IE1hcDxudW1iZXIsIEFib3J0Q29udHJvbGxlcj4oKTtcblxuICAgIC8vIFN0YXRlXG4gICAgbGV0IGl0ZW1zOiBhbnlbXSA9IFtdO1xuICAgIGxldCB0b3RhbEl0ZW1zID0gMDtcbiAgICBsZXQgbG9hZGVkUmFuZ2VzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgbGV0IHBlbmRpbmdSYW5nZXMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICBsZXQgZmFpbGVkUmFuZ2VzID0gbmV3IE1hcDxcbiAgICAgIG51bWJlcixcbiAgICAgIHtcbiAgICAgICAgYXR0ZW1wdHM6IG51bWJlcjtcbiAgICAgICAgbGFzdEVycm9yOiBFcnJvcjtcbiAgICAgICAgdGltZXN0YW1wOiBudW1iZXI7XG4gICAgICB9XG4gICAgPigpO1xuICAgIGxldCBhY3RpdmVSZXF1ZXN0cyA9IG5ldyBNYXA8bnVtYmVyLCBQcm9taXNlPGFueVtdPj4oKTtcblxuICAgIC8vIEN1cnNvciBwYWdpbmF0aW9uIHN0YXRlXG4gICAgbGV0IGN1cnJlbnRDdXJzb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjdXJzb3JNYXAgPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpOyAvLyBNYXAgcGFnZSBudW1iZXIgdG8gY3Vyc29yXG4gICAgbGV0IHBhZ2VUb09mZnNldE1hcCA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7IC8vIE1hcCBwYWdlIHRvIGFjdHVhbCBvZmZzZXRcbiAgICBsZXQgaGlnaGVzdExvYWRlZFBhZ2UgPSAwO1xuICAgIGxldCBkaXNjb3ZlcmVkVG90YWw6IG51bWJlciB8IG51bGwgPSBudWxsOyAvLyBUcmFjayBkaXNjb3ZlcmVkIHRvdGFsIGZyb20gQVBJXG4gICAgbGV0IGhhc1JlYWNoZWRFbmQgPSBmYWxzZTsgLy8gVHJhY2sgaWYgd2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIGRhdGFcblxuICAgIC8vIFNoYXJlIGl0ZW1zIGFycmF5IHdpdGggY29tcG9uZW50XG4gICAgY29tcG9uZW50Lml0ZW1zID0gaXRlbXM7XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSB1bmlxdWUgSUQgZm9yIGEgcmFuZ2UgYmFzZWQgb24gb2Zmc2V0IGFuZCB0aGUgYmFzZSByYW5nZSBzaXplXG4gICAgICovXG4gICAgY29uc3QgZ2V0UmFuZ2VJZCA9IChvZmZzZXQ6IG51bWJlciwgbGltaXQ6IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgICAvLyBBbHdheXMgdXNlIHRoZSBiYXNlIHJhbmdlU2l6ZSBmb3IgY29uc2lzdGVudCBJRHNcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBtZXJnZWQgcmFuZ2VzIGNhbiBiZSB0cmFja2VkIHByb3Blcmx5XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihvZmZzZXQgLyByYW5nZVNpemUpO1xuICAgIH07XG5cbiAgICAvLyBMb2FkaW5nIG1hbmFnZXIgaGVscGVyc1xuICAgIGNvbnN0IGdldFJhbmdlS2V5ID0gKHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pOiBzdHJpbmcgPT4ge1xuICAgICAgcmV0dXJuIGAke3JhbmdlLnN0YXJ0fS0ke3JhbmdlLmVuZH1gO1xuICAgIH07XG5cbiAgICBjb25zdCBjYW5Mb2FkID0gKCk6IGJvb2xlYW4gPT4ge1xuICAgICAgcmV0dXJuIGN1cnJlbnRWZWxvY2l0eSA8PSBjYW5jZWxMb2FkVGhyZXNob2xkO1xuICAgIH07XG5cbiAgICBjb25zdCBwcm9jZXNzUXVldWUgPSAoKSA9PiB7XG4gICAgICBpZiAoIWVuYWJsZVJlcXVlc3RRdWV1ZSB8fCBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAvLyBTb3J0IHF1ZXVlIGJ5IHByaW9yaXR5IGFuZCB0aW1lc3RhbXBcbiAgICAgIGxvYWRSZXF1ZXN0UXVldWUuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBwcmlvcml0eU9yZGVyID0geyBoaWdoOiAwLCBub3JtYWw6IDEsIGxvdzogMiB9O1xuICAgICAgICBjb25zdCBwcmlvcml0eURpZmYgPVxuICAgICAgICAgIHByaW9yaXR5T3JkZXJbYS5wcmlvcml0eV0gLSBwcmlvcml0eU9yZGVyW2IucHJpb3JpdHldO1xuICAgICAgICByZXR1cm4gcHJpb3JpdHlEaWZmICE9PSAwID8gcHJpb3JpdHlEaWZmIDogYS50aW1lc3RhbXAgLSBiLnRpbWVzdGFtcDtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBQcm9jZXNzIHJlcXVlc3RzIHVwIHRvIGNhcGFjaXR5XG4gICAgICB3aGlsZSAoXG4gICAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoID4gMCAmJlxuICAgICAgICBhY3RpdmVMb2FkQ291bnQgPCBtYXhDb25jdXJyZW50UmVxdWVzdHNcbiAgICAgICkge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gbG9hZFJlcXVlc3RRdWV1ZS5zaGlmdCgpO1xuICAgICAgICBpZiAocmVxdWVzdCkge1xuICAgICAgICAgIGV4ZWN1dGVRdWV1ZWRMb2FkKHJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGV4ZWN1dGVRdWV1ZWRMb2FkID0gKHJlcXVlc3Q6IFF1ZXVlZFJlcXVlc3QpID0+IHtcbiAgICAgIGFjdGl2ZUxvYWRDb3VudCsrO1xuICAgICAgYWN0aXZlTG9hZFJhbmdlcy5hZGQoZ2V0UmFuZ2VLZXkocmVxdWVzdC5yYW5nZSkpO1xuXG4gICAgICAvLyBDYWxsIHRoZSBhY3R1YWwgbG9hZE1pc3NpbmdSYW5nZXMgZnVuY3Rpb25cbiAgICAgIGxvYWRNaXNzaW5nUmFuZ2VzSW50ZXJuYWwocmVxdWVzdC5yYW5nZSwgcmVxdWVzdC5jYWxsZXIpXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXF1ZXN0LnJlc29sdmUoKTtcbiAgICAgICAgICBjb21wbGV0ZWRMb2FkcysrO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgIHJlcXVlc3QucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICBmYWlsZWRMb2FkcysrO1xuICAgICAgICB9KVxuICAgICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgYWN0aXZlTG9hZENvdW50LS07XG4gICAgICAgICAgYWN0aXZlTG9hZFJhbmdlcy5kZWxldGUoZ2V0UmFuZ2VLZXkocmVxdWVzdC5yYW5nZSkpO1xuICAgICAgICAgIHByb2Nlc3NRdWV1ZSgpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtIGl0ZW1zIGlmIHRyYW5zZm9ybSBmdW5jdGlvbiBwcm92aWRlZFxuICAgICAqL1xuICAgIGNvbnN0IHRyYW5zZm9ybUl0ZW1zID0gKHJhd0l0ZW1zOiBhbnlbXSk6IGFueVtdID0+IHtcbiAgICAgIGlmICghdHJhbnNmb3JtKSByZXR1cm4gcmF3SXRlbXM7XG4gICAgICByZXR1cm4gcmF3SXRlbXMubWFwKHRyYW5zZm9ybSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIExvYWQgYSByYW5nZSBvZiBkYXRhXG4gICAgICovXG4gICAgY29uc3QgbG9hZFJhbmdlID0gYXN5bmMgKFxuICAgICAgb2Zmc2V0OiBudW1iZXIsXG4gICAgICBsaW1pdDogbnVtYmVyLFxuICAgICAgY2FsbGVyPzogc3RyaW5nLFxuICAgICk6IFByb21pc2U8YW55W10+ID0+IHtcbiAgICAgIGlmICghY29sbGVjdGlvbikge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbQ29sbGVjdGlvbl0gTm8gY29sbGVjdGlvbiBhZGFwdGVyIGNvbmZpZ3VyZWRcIik7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmFuZ2VJZCA9IGdldFJhbmdlSWQob2Zmc2V0LCBsaW1pdCk7XG4gICAgICAvLyBjb25zb2xlLmxvZyhgW0NvbGxlY3Rpb25dIFJhbmdlIElEOiAke3JhbmdlSWR9YCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIGFscmVhZHkgbG9hZGVkXG4gICAgICBpZiAobG9hZGVkUmFuZ2VzLmhhcyhyYW5nZUlkKSkge1xuICAgICAgICByZXR1cm4gaXRlbXMuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBsaW1pdCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGFscmVhZHkgcGVuZGluZ1xuICAgICAgaWYgKHBlbmRpbmdSYW5nZXMuaGFzKHJhbmdlSWQpKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nUmVxdWVzdCA9IGFjdGl2ZVJlcXVlc3RzLmdldChyYW5nZUlkKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nUmVxdWVzdCkge1xuICAgICAgICAgIHJldHVybiBleGlzdGluZ1JlcXVlc3Q7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTWFyayBhcyBwZW5kaW5nXG4gICAgICBwZW5kaW5nUmFuZ2VzLmFkZChyYW5nZUlkKTtcblxuICAgICAgLy8gQ3JlYXRlIEFib3J0Q29udHJvbGxlciBmb3IgdGhpcyByZXF1ZXN0XG4gICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICBhYm9ydENvbnRyb2xsZXJzLnNldChyYW5nZUlkLCBhYm9ydENvbnRyb2xsZXIpO1xuXG4gICAgICAvLyBDcmVhdGUgcmVxdWVzdCBwcm9taXNlXG4gICAgICBjb25zdCByZXF1ZXN0UHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gQ2FsbCBjb2xsZWN0aW9uIGFkYXB0ZXIgd2l0aCBhcHByb3ByaWF0ZSBwYXJhbWV0ZXJzXG4gICAgICAgICAgY29uc3QgcGFnZSA9IE1hdGguZmxvb3Iob2Zmc2V0IC8gbGltaXQpICsgMTtcbiAgICAgICAgICBsZXQgcGFyYW1zOiBhbnk7XG5cbiAgICAgICAgICBpZiAoc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIpIHtcbiAgICAgICAgICAgIC8vIEZvciBjdXJzb3IgcGFnaW5hdGlvblxuICAgICAgICAgICAgaWYgKHBhZ2UgPT09IDEpIHtcbiAgICAgICAgICAgICAgLy8gRmlyc3QgcGFnZSAtIG5vIGN1cnNvclxuICAgICAgICAgICAgICBwYXJhbXMgPSB7IGxpbWl0IH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGN1cnNvciBmb3IgcHJldmlvdXMgcGFnZVxuICAgICAgICAgICAgICBjb25zdCBwcmV2UGFnZUN1cnNvciA9IGN1cnNvck1hcC5nZXQocGFnZSAtIDEpO1xuICAgICAgICAgICAgICBpZiAoIXByZXZQYWdlQ3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2FuJ3QgbG9hZCB0aGlzIHBhZ2Ugd2l0aG91dCBwcmV2aW91cyBjdXJzb3JcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICBgW0NvbGxlY3Rpb25dIENhbm5vdCBsb2FkIHBhZ2UgJHtwYWdlfSB3aXRob3V0IGN1cnNvciBmb3IgcGFnZSAke1xuICAgICAgICAgICAgICAgICAgICBwYWdlIC0gMVxuICAgICAgICAgICAgICAgICAgfWAsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgU2VxdWVudGlhbCBsb2FkaW5nIHJlcXVpcmVkIC0gbWlzc2luZyBjdXJzb3IgZm9yIHBhZ2UgJHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZSAtIDFcbiAgICAgICAgICAgICAgICAgIH1gLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcGFyYW1zID0geyBjdXJzb3I6IHByZXZQYWdlQ3Vyc29yLCBsaW1pdCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RyYXRlZ3kgPT09IFwicGFnZVwiKSB7XG4gICAgICAgICAgICBwYXJhbXMgPSB7IHBhZ2UsIGxpbWl0IH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG9mZnNldCBzdHJhdGVneVxuICAgICAgICAgICAgcGFyYW1zID0geyBvZmZzZXQsIGxpbWl0IH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSW5qZWN0IHNlYXJjaCBxdWVyeSBpZiBjb21wb25lbnQgaGFzIHdpdGhTZWFyY2ggZmVhdHVyZVxuICAgICAgICAgIC8vIFVzZSBfc2VsZlJlZi5jdXJyZW50IGZvciBsYXRlIGJpbmRpbmcgKHNlYXJjaC9maWx0ZXIgZmVhdHVyZXMgYXJlIGFkZGVkIGFmdGVyIHZpZXdwb3J0KVxuICAgICAgICAgIGNvbnN0IHNlbGZSZWYgPSAoXG4gICAgICAgICAgICBjb21wb25lbnQgYXMgdW5rbm93biBhcyB7IF9zZWxmUmVmPzogU2VsZlJlZjxTZWFyY2hGaWx0ZXJDYXBhYmxlPiB9XG4gICAgICAgICAgKS5fc2VsZlJlZjtcbiAgICAgICAgICBjb25zdCBzZWxmOiBQYXJ0aWFsPFNlYXJjaEZpbHRlckNhcGFibGU+ID0gc2VsZlJlZj8uY3VycmVudCA/PyB7fTtcbiAgICAgICAgICBpZiAodHlwZW9mIHNlbGYuX3NlYXJjaFF1ZXJ5ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlYXJjaFF1ZXJ5ID0gc2VsZi5fc2VhcmNoUXVlcnkoKTtcbiAgICAgICAgICAgIGlmIChzZWFyY2hRdWVyeSkge1xuICAgICAgICAgICAgICBwYXJhbXMuc2VhcmNoID0gc2VhcmNoUXVlcnk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSW5qZWN0IGZpbHRlcnMgaWYgY29tcG9uZW50IGhhcyB3aXRoRmlsdGVyIGZlYXR1cmVcbiAgICAgICAgICBpZiAodHlwZW9mIHNlbGYuX2ZpbHRlcnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVycyA9IHNlbGYuX2ZpbHRlcnMoKTtcbiAgICAgICAgICAgIGlmIChmaWx0ZXJzICYmIE9iamVjdC5rZXlzKGZpbHRlcnMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgcGFyYW1zLmZpbHRlcnMgPSBmaWx0ZXJzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtWaWV3cG9ydCBDb2xsZWN0aW9uXSBMb2FkaW5nIHJhbmdlIG9mZnNldD0ke29mZnNldH0sIGxpbWl0PSR7bGltaXR9LCBzdHJhdGVneT0ke3N0cmF0ZWd5fSwgY2FsY3VsYXRlZCBwYWdlPSR7cGFnZX0sIHBhcmFtczpgLFxuICAgICAgICAgIC8vICAgSlNPTi5zdHJpbmdpZnkocGFyYW1zKVxuICAgICAgICAgIC8vICk7XG5cbiAgICAgICAgICAvLyBQYXNzIGFib3J0IHNpZ25hbCB0byB0aGUgYWRhcHRlciBpZiBpdCBzdXBwb3J0cyBpdFxuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY29sbGVjdGlvbi5yZWFkKHtcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEV4dHJhY3QgaXRlbXMgYW5kIHRvdGFsXG4gICAgICAgICAgY29uc3QgcmF3SXRlbXMgPSByZXNwb25zZS5kYXRhIHx8IHJlc3BvbnNlLml0ZW1zIHx8IHJlc3BvbnNlO1xuICAgICAgICAgIGNvbnN0IG1ldGEgPSByZXNwb25zZS5tZXRhIHx8IHt9O1xuXG4gICAgICAgICAgLy8gRm9yIGN1cnNvciBwYWdpbmF0aW9uLCB0cmFjayB0aGUgY3Vyc29yIChjaGVjayBib3RoIGN1cnNvciBhbmQgbmV4dEN1cnNvcilcbiAgICAgICAgICBjb25zdCByZXNwb25zZUN1cnNvciA9IG1ldGEuY3Vyc29yIHx8IG1ldGEubmV4dEN1cnNvcjtcbiAgICAgICAgICBpZiAoc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIgJiYgcmVzcG9uc2VDdXJzb3IpIHtcbiAgICAgICAgICAgIGN1cnJlbnRDdXJzb3IgPSByZXNwb25zZUN1cnNvcjtcbiAgICAgICAgICAgIGN1cnNvck1hcC5zZXQocGFnZSwgcmVzcG9uc2VDdXJzb3IpO1xuICAgICAgICAgICAgcGFnZVRvT2Zmc2V0TWFwLnNldChwYWdlLCBvZmZzZXQpO1xuICAgICAgICAgICAgaGlnaGVzdExvYWRlZFBhZ2UgPSBNYXRoLm1heChoaWdoZXN0TG9hZGVkUGFnZSwgcGFnZSk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBTdG9yZWQgY3Vyc29yIGZvciBwYWdlICR7cGFnZX06ICR7cmVzcG9uc2VDdXJzb3J9YCxcbiAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgd2UndmUgcmVhY2hlZCB0aGUgZW5kXG4gICAgICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImN1cnNvclwiICYmIG1ldGEuaGFzTmV4dCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGhhc1JlYWNoZWRFbmQgPSB0cnVlO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gUmVhY2hlZCBlbmQgb2YgY3Vyc29yIHBhZ2luYXRpb24gYXQgcGFnZSAke3BhZ2V9YCxcbiAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVXBkYXRlIGRpc2NvdmVyZWQgdG90YWwgaWYgcHJvdmlkZWRcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gbWV0YS50b3RhbDogJHttZXRhLnRvdGFsfSwgZGlzY292ZXJlZFRvdGFsIGJlZm9yZTogJHtkaXNjb3ZlcmVkVG90YWx9YCxcbiAgICAgICAgICAvLyApO1xuICAgICAgICAgIGlmIChtZXRhLnRvdGFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRpc2NvdmVyZWRUb3RhbCA9IG1ldGEudG90YWw7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGBbQ29sbGVjdGlvbl0gZGlzY292ZXJlZFRvdGFsIGFmdGVyOiAke2Rpc2NvdmVyZWRUb3RhbH1gKTtcblxuICAgICAgICAgIC8vIFRyYW5zZm9ybSBpdGVtc1xuICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkSXRlbXMgPSB0cmFuc2Zvcm1JdGVtcyhyYXdJdGVtcyk7XG5cbiAgICAgICAgICAvLyBBZGQgaXRlbXMgdG8gYXJyYXkgYW5kIHRyYWNrIGNvdW50IGVmZmljaWVudGx5XG4gICAgICAgICAgbGV0IG5ld0l0ZW1zQWRkZWQgPSAwO1xuICAgICAgICAgIHRyYW5zZm9ybWVkSXRlbXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIC8vIE9ubHkgY291bnQgYXMgbmV3IGlmIHNsb3Qgd2FzIGVtcHR5XG4gICAgICAgICAgICBpZiAoaXRlbXNbb2Zmc2V0ICsgaW5kZXhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgbmV3SXRlbXNBZGRlZCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbXNbb2Zmc2V0ICsgaW5kZXhdID0gaXRlbTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjYWNoZWRJdGVtQ291bnQgKz0gbmV3SXRlbXNBZGRlZDtcblxuICAgICAgICAgIC8vIEZvciBjdXJzb3Igc3RyYXRlZ3ksIGNhbGN1bGF0ZSBkeW5hbWljIHRvdGFsIGJhc2VkIG9uIGxvYWRlZCBkYXRhXG4gICAgICAgICAgLy8gVXNlIG51bGxpc2ggY29hbGVzY2luZyAoPz8pIGluc3RlYWQgb2YgfHwgdG8gaGFuZGxlIGRpc2NvdmVyZWRUb3RhbCA9IDAgY29ycmVjdGx5XG4gICAgICAgICAgbGV0IG5ld1RvdGFsID0gZGlzY292ZXJlZFRvdGFsID8/IHRvdGFsSXRlbXM7XG5cbiAgICAgICAgICAvLyBDUklUSUNBTCBGSVg6IFdoZW4gQVBJIHJldHVybnMgMCBpdGVtcyBvbiBwYWdlIDEgKG9mZnNldCAwKSwgdGhlIGxpc3QgaXMgZW1wdHkuXG4gICAgICAgICAgLy8gV2UgbXVzdCBzZXQgdG90YWxJdGVtcyB0byAwIHJlZ2FyZGxlc3Mgb2YgbWV0YS50b3RhbCBiZWluZyB1bmRlZmluZWQuXG4gICAgICAgICAgLy8gVGhpcyBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIGNvdW50PWZhbHNlIGlzIHNlbnQgYnV0IHRoZSBsaXN0IGlzIGFjdHVhbGx5IGVtcHR5LlxuICAgICAgICAgIGlmIChvZmZzZXQgPT09IDAgJiYgdHJhbnNmb3JtZWRJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIEVtcHR5IHJlc3VsdCBvbiBwYWdlIDEgLSBmb3JjaW5nIHRvdGFsSXRlbXMgdG8gMGAsXG4gICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgbmV3VG90YWwgPSAwO1xuICAgICAgICAgICAgZGlzY292ZXJlZFRvdGFsID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIG5ld1RvdGFsIGluaXRpYWw6ICR7bmV3VG90YWx9LCB0b3RhbEl0ZW1zOiAke3RvdGFsSXRlbXN9LCBzdHJhdGVneTogJHtzdHJhdGVneX1gLFxuICAgICAgICAgIC8vICk7XG5cbiAgICAgICAgICBpZiAoc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIpIHtcbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0b3RhbCBiYXNlZCBvbiBsb2FkZWQgaXRlbXMgKyBtYXJnaW5cbiAgICAgICAgICAgIC8vIFVzZSBjYWNoZWRJdGVtQ291bnQgaW5zdGVhZCBvZiBPKG4pIGZpbHRlciBvcGVyYXRpb25cbiAgICAgICAgICAgIGNvbnN0IGxvYWRlZEl0ZW1zQ291bnQgPSBjYWNoZWRJdGVtQ291bnQ7XG4gICAgICAgICAgICBjb25zdCBtYXJnaW5JdGVtcyA9IGhhc1JlYWNoZWRFbmRcbiAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgIDogcmFuZ2VTaXplICpcbiAgICAgICAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUEFHSU5BVElPTi5DVVJTT1JfU0NST0xMX01BUkdJTl9NVUxUSVBMSUVSO1xuICAgICAgICAgICAgY29uc3QgbWluVmlydHVhbEl0ZW1zID1cbiAgICAgICAgICAgICAgcmFuZ2VTaXplICpcbiAgICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlBBR0lOQVRJT04uQ1VSU09SX01JTl9WSVJUVUFMX1NJWkVfTVVMVElQTElFUjtcblxuICAgICAgICAgICAgLy8gRHluYW1pYyB0b3RhbDogbG9hZGVkIGl0ZW1zICsgbWFyZ2luICh1bmxlc3Mgd2UndmUgcmVhY2hlZCB0aGUgZW5kKVxuICAgICAgICAgICAgbmV3VG90YWwgPSBNYXRoLm1heChcbiAgICAgICAgICAgICAgbG9hZGVkSXRlbXNDb3VudCArIG1hcmdpbkl0ZW1zLFxuICAgICAgICAgICAgICBtaW5WaXJ0dWFsSXRlbXMsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBDdXJzb3IgbW9kZSB2aXJ0dWFsIHNpemU6IGxvYWRlZD0ke2xvYWRlZEl0ZW1zQ291bnR9LCBtYXJnaW49JHttYXJnaW5JdGVtc30sIHRvdGFsPSR7bmV3VG90YWx9LCBoYXNSZWFjaGVkRW5kPSR7aGFzUmVhY2hlZEVuZH1gLFxuICAgICAgICAgICAgLy8gKTtcblxuICAgICAgICAgICAgLy8gVXBkYXRlIHRvdGFsIGlmIGl0IGhhcyBncm93blxuICAgICAgICAgICAgaWYgKG5ld1RvdGFsID4gdG90YWxJdGVtcykge1xuICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFVwZGF0aW5nIGN1cnNvciB2aXJ0dWFsIHNpemUgZnJvbSAke3RvdGFsSXRlbXN9IHRvICR7bmV3VG90YWx9YCxcbiAgICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgICAgdG90YWxJdGVtcyA9IG5ld1RvdGFsO1xuICAgICAgICAgICAgICBzZXRUb3RhbEl0ZW1zKG5ld1RvdGFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRm9yIG90aGVyIHN0cmF0ZWdpZXMsIHVzZSBkaXNjb3ZlcmVkIHRvdGFsIG9yIGN1cnJlbnQgdG90YWxcbiAgICAgICAgICAgIC8vIFVzZSBudWxsaXNoIGNvYWxlc2NpbmcgKD8/KSBpbnN0ZWFkIG9mIHx8IHRvIGhhbmRsZSBkaXNjb3ZlcmVkVG90YWwgPSAwIGNvcnJlY3RseVxuICAgICAgICAgICAgbmV3VG90YWwgPSBkaXNjb3ZlcmVkVG90YWwgPz8gdG90YWxJdGVtcztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBVcGRhdGUgc3RhdGVcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gQmVmb3JlIHN0YXRlIHVwZGF0ZTogbmV3VG90YWw9JHtuZXdUb3RhbH0sIHRvdGFsSXRlbXM9JHt0b3RhbEl0ZW1zfSwgd2lsbCB1cGRhdGU6ICR7bmV3VG90YWwgIT09IHRvdGFsSXRlbXN9YCxcbiAgICAgICAgICAvLyApO1xuICAgICAgICAgIGlmIChuZXdUb3RhbCAhPT0gdG90YWxJdGVtcykge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coYFtDb2xsZWN0aW9uXSBDYWxsaW5nIHNldFRvdGFsSXRlbXMoJHtuZXdUb3RhbH0pYCk7XG4gICAgICAgICAgICB0b3RhbEl0ZW1zID0gbmV3VG90YWw7XG4gICAgICAgICAgICBzZXRUb3RhbEl0ZW1zKG5ld1RvdGFsKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBVcGRhdGUgY29tcG9uZW50IGl0ZW1zIHJlZmVyZW5jZVxuICAgICAgICAgIGNvbXBvbmVudC5pdGVtcyA9IGl0ZW1zO1xuXG4gICAgICAgICAgLy8gRW1pdCBpdGVtcyBjaGFuZ2VkIGV2ZW50XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0Oml0ZW1zLWNoYW5nZWRcIiwge1xuICAgICAgICAgICAgdG90YWxJdGVtczogbmV3VG90YWwsXG4gICAgICAgICAgICBsb2FkZWRDb3VudDogY2FjaGVkSXRlbUNvdW50LFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gVXBkYXRlIHZpZXdwb3J0IHN0YXRlXG4gICAgICAgICAgY29uc3Qgdmlld3BvcnRTdGF0ZSA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zdGF0ZTtcbiAgICAgICAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgICAgICAgLy8gVXNlIG51bGxpc2ggY29hbGVzY2luZyAoPz8pIGluc3RlYWQgb2YgfHwgdG8gaGFuZGxlIG5ld1RvdGFsID0gMCBjb3JyZWN0bHlcbiAgICAgICAgICAgIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyA9IG5ld1RvdGFsID8/IGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBWZXJpZnkgaXRlbXMgYXJlIGFjdHVhbGx5IHN0aWxsIGluIHRoZSBhcnJheSBiZWZvcmUgbWFya2luZyBhcyBsb2FkZWRcbiAgICAgICAgICAvLyBUaGlzIHByZXZlbnRzIGEgcmFjZSBjb25kaXRpb24gd2hlcmUgZXZpY3Rpb24gaGFwcGVucyBkdXJpbmcgYXN5bmMgbG9hZDpcbiAgICAgICAgICAvLyAxLiBMb2FkIHN0YXJ0cyBmb3IgcmFuZ2UgQVxuICAgICAgICAgIC8vIDIuIFVzZXIgc2Nyb2xscyB0byByYW5nZSBCXG4gICAgICAgICAgLy8gMy4gRXZpY3Rpb24gcmVtb3ZlcyBpdGVtcyBmcm9tIHJhbmdlIEEgYW5kIHJlbW92ZXMgZnJvbSBsb2FkZWRSYW5nZXNcbiAgICAgICAgICAvLyA0LiBMb2FkIGZvciByYW5nZSBBIGNvbXBsZXRlcywgd291bGQgcmUtYWRkIHRvIGxvYWRlZFJhbmdlc1xuICAgICAgICAgIC8vIDUuIFVzZXIgc2Nyb2xscyBiYWNrIHRvIEEsIGxvYWRlZFJhbmdlcyBzYXlzIGxvYWRlZCBidXQgaXRlbXMgYXJlIGdvbmVcbiAgICAgICAgICBjb25zdCBpdGVtc0FjdHVhbGx5U3RvcmVkID1cbiAgICAgICAgICAgIHRyYW5zZm9ybWVkSXRlbXMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgdHJhbnNmb3JtZWRJdGVtcy5ldmVyeShcbiAgICAgICAgICAgICAgKF8sIGlkeCkgPT4gaXRlbXNbb2Zmc2V0ICsgaWR4XSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChpdGVtc0FjdHVhbGx5U3RvcmVkKSB7XG4gICAgICAgICAgICAvLyBNYXJrIGFzIGxvYWRlZCBvbmx5IGlmIGl0ZW1zIGFyZSBhY3R1YWxseSBwcmVzZW50XG4gICAgICAgICAgICBsb2FkZWRSYW5nZXMuYWRkKHJhbmdlSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBBbHdheXMgY2xlYW4gdXAgcGVuZGluZy9mYWlsZWQgc3RhdGVcbiAgICAgICAgICBwZW5kaW5nUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgICBmYWlsZWRSYW5nZXMuZGVsZXRlKHJhbmdlSWQpO1xuXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFJhbmdlICR7cmFuZ2VJZH0gbG9hZGVkIHN1Y2Nlc3NmdWxseSB3aXRoICR7dHJhbnNmb3JtZWRJdGVtcy5sZW5ndGh9IGl0ZW1zYFxuICAgICAgICAgIC8vICk7XG5cbiAgICAgICAgICAvLyBMb2cgbWVtb3J5IHN0YXRzIHBlcmlvZGljYWxseSAoZXZlcnkgNSBsb2FkcylcbiAgICAgICAgICBpZiAoY29tcGxldGVkTG9hZHMgJSA1ID09PSAwKSB7XG4gICAgICAgICAgICBsb2dNZW1vcnlTdGF0cyhgbG9hZDoke2NvbXBsZXRlZExvYWRzfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEVtaXQgZXZlbnRzXG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCB7XG4gICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICAgIGl0ZW1zOiB0cmFuc2Zvcm1lZEl0ZW1zLFxuICAgICAgICAgICAgdG90YWw6IG5ld1RvdGFsLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRW1pdCBjb2xsZWN0aW9uIGxvYWRlZCBldmVudCB3aXRoIG1vcmUgZGV0YWlsc1xuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJjb2xsZWN0aW9uOnJhbmdlLWxvYWRlZFwiLCB7XG4gICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICAgIGl0ZW1zOiB0cmFuc2Zvcm1lZEl0ZW1zLFxuICAgICAgICAgICAgdG90YWw6IG5ld1RvdGFsLFxuICAgICAgICAgICAgcmFuZ2VJZCxcbiAgICAgICAgICAgIGl0ZW1zSW5NZW1vcnk6IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbSAhPT0gdW5kZWZpbmVkKS5sZW5ndGgsXG4gICAgICAgICAgICBjdXJzb3I6IHN0cmF0ZWd5ID09PSBcImN1cnNvclwiID8gY3VycmVudEN1cnNvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIFRyaWdnZXIgdmlld3BvcnQgdXBkYXRlXG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0Py51cGRhdGVWaWV3cG9ydD8uKCk7XG5cbiAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWRJdGVtcztcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBIYW5kbGUgQWJvcnRFcnJvciBhbmQgXCJGYWlsZWQgdG8gZmV0Y2hcIiAod2hpY2ggY2FuIG9jY3VyIG9uIGFib3J0KSBncmFjZWZ1bGx5XG4gICAgICAgICAgY29uc3QgaXNBYm9ydEVycm9yID1cbiAgICAgICAgICAgIChlcnJvciBhcyBFcnJvcikubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIgfHxcbiAgICAgICAgICAgICgoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2UgPT09IFwiRmFpbGVkIHRvIGZldGNoXCIgJiZcbiAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKTtcblxuICAgICAgICAgIGlmIChpc0Fib3J0RXJyb3IpIHtcbiAgICAgICAgICAgIHBlbmRpbmdSYW5nZXMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICAgICAgY2FuY2VsbGVkTG9hZHMrKztcbiAgICAgICAgICAgIC8vIERvbid0IHRocm93LCBqdXN0IHJldHVybiBlbXB0eSBhcnJheVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEhhbmRsZSBvdGhlciBlcnJvcnNcbiAgICAgICAgICBwZW5kaW5nUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgICBmYWlsZWRMb2FkcysrO1xuXG4gICAgICAgICAgY29uc3QgYXR0ZW1wdHMgPSAoZmFpbGVkUmFuZ2VzLmdldChyYW5nZUlkKT8uYXR0ZW1wdHMgfHwgMCkgKyAxO1xuICAgICAgICAgIGZhaWxlZFJhbmdlcy5zZXQocmFuZ2VJZCwge1xuICAgICAgICAgICAgYXR0ZW1wdHMsXG4gICAgICAgICAgICBsYXN0RXJyb3I6IGVycm9yIGFzIEVycm9yLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRW1pdCBlcnJvciBldmVudFxuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpyYW5nZS1lcnJvclwiLCB7XG4gICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgYXR0ZW1wdHMsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBhY3RpdmVSZXF1ZXN0cy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgICAgYWJvcnRDb250cm9sbGVycy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG5cbiAgICAgIGFjdGl2ZVJlcXVlc3RzLnNldChyYW5nZUlkLCByZXF1ZXN0UHJvbWlzZSk7XG4gICAgICByZXR1cm4gcmVxdWVzdFByb21pc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIExvYWQgbWlzc2luZyByYW5nZXMgZnJvbSBjb2xsZWN0aW9uXG4gICAgICovXG4gICAgY29uc3QgbG9hZE1pc3NpbmdSYW5nZXNJbnRlcm5hbCA9IGFzeW5jIChcbiAgICAgIC8vIE5vdGU6IGNhbGxlciBpcyBhZGRlZCBieSBsb2FkTWlzc2luZ1JhbmdlcyB3cmFwcGVyXG4gICAgICByYW5nZToge1xuICAgICAgICBzdGFydDogbnVtYmVyO1xuICAgICAgICBlbmQ6IG51bWJlcjtcbiAgICAgIH0sXG4gICAgICBjYWxsZXI/OiBzdHJpbmcsXG4gICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBpZiAoIWNvbGxlY3Rpb24pIHJldHVybjtcblxuICAgICAgLy8gRm9yIGN1cnNvciBwYWdpbmF0aW9uLCB3ZSBuZWVkIHRvIGxvYWQgc2VxdWVudGlhbGx5XG4gICAgICBpZiAoc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRQYWdlID0gTWF0aC5mbG9vcihyYW5nZS5zdGFydCAvIHJhbmdlU2l6ZSkgKyAxO1xuICAgICAgICBjb25zdCBlbmRQYWdlID0gTWF0aC5mbG9vcihyYW5nZS5lbmQgLyByYW5nZVNpemUpICsgMTtcblxuICAgICAgICAvLyBMaW1pdCBob3cgbWFueSBwYWdlcyB3ZSdsbCBsb2FkIGF0IG9uY2VcbiAgICAgICAgY29uc3QgbWF4UGFnZXNUb0xvYWQgPSAxMDtcbiAgICAgICAgY29uc3QgY3VycmVudEhpZ2hlc3RQYWdlID0gaGlnaGVzdExvYWRlZFBhZ2UgfHwgMDtcbiAgICAgICAgY29uc3QgbGltaXRlZEVuZFBhZ2UgPSBNYXRoLm1pbihcbiAgICAgICAgICBlbmRQYWdlLFxuICAgICAgICAgIGN1cnJlbnRIaWdoZXN0UGFnZSArIG1heFBhZ2VzVG9Mb2FkLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gQ3Vyc29yIG1vZGU6IG5lZWQgdG8gbG9hZCBwYWdlcyAke3N0YXJ0UGFnZX0gdG8gJHtlbmRQYWdlfSwgbGltaXRlZCB0byAke2xpbWl0ZWRFbmRQYWdlfWAsXG4gICAgICAgIC8vICk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byBsb2FkIHBhZ2VzIHNlcXVlbnRpYWxseVxuICAgICAgICBmb3IgKGxldCBwYWdlID0gc3RhcnRQYWdlOyBwYWdlIDw9IGxpbWl0ZWRFbmRQYWdlOyBwYWdlKyspIHtcbiAgICAgICAgICBjb25zdCByYW5nZUlkID0gcGFnZSAtIDE7IC8vIENvbnZlcnQgdG8gMC1iYXNlZCByYW5nZUlkXG4gICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gcmFuZ2VJZCAqIHJhbmdlU2l6ZTtcblxuICAgICAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBiZWluZyBsb2FkZWRcbiAgICAgICAgICBpZiAocGVuZGluZ1Jhbmdlcy5oYXMocmFuZ2VJZCkpIHtcbiAgICAgICAgICAgIC8vIFJhbmdlIGFscmVhZHkgYmVpbmcgbG9hZGVkXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFsb2FkZWRSYW5nZXMuaGFzKHJhbmdlSWQpICYmICFwZW5kaW5nUmFuZ2VzLmhhcyhyYW5nZUlkKSkge1xuICAgICAgICAgICAgLy8gRm9yIGN1cnNvciBwYWdpbmF0aW9uLCB3ZSBtdXN0IGxvYWQgc2VxdWVudGlhbGx5XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGFsbCBwcmV2aW91cyBwYWdlcyBsb2FkZWRcbiAgICAgICAgICAgIGlmIChwYWdlID4gMSkge1xuICAgICAgICAgICAgICBsZXQgY2FuTG9hZCA9IHRydWU7XG4gICAgICAgICAgICAgIGZvciAobGV0IHByZXZQYWdlID0gMTsgcHJldlBhZ2UgPCBwYWdlOyBwcmV2UGFnZSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldlJhbmdlSWQgPSBwcmV2UGFnZSAtIDE7XG4gICAgICAgICAgICAgICAgaWYgKCFsb2FkZWRSYW5nZXMuaGFzKHByZXZSYW5nZUlkKSkge1xuICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gQ2Fubm90IGxvYWQgcGFnZSAke3BhZ2V9IC0gbmVlZCB0byBsb2FkIHBhZ2UgJHtwcmV2UGFnZX0gZmlyc3RgLFxuICAgICAgICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgICAgICAgIGNhbkxvYWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGxvYWQgdGhlIG1pc3NpbmcgcGFnZVxuICAgICAgICAgICAgICAgICAgaWYgKCFwZW5kaW5nUmFuZ2VzLmhhcyhwcmV2UmFuZ2VJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBsb2FkUmFuZ2UocHJldlJhbmdlSWQgKiByYW5nZVNpemUsIHJhbmdlU2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGBbQ29sbGVjdGlvbl0gRmFpbGVkIHRvIGxvYWQgcHJlcmVxdWlzaXRlIHBhZ2UgJHtwcmV2UGFnZX06YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBTdG9wIHRyeWluZyB0byBsb2FkIGZ1cnRoZXIgcGFnZXNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKCFjYW5Mb2FkKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7IC8vIFNraXAgdGhpcyBwYWdlIGZvciBub3dcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCBsb2FkUmFuZ2Uob2Zmc2V0LCByYW5nZVNpemUpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgW0NvbGxlY3Rpb25dIEZhaWxlZCB0byBsb2FkIHBhZ2UgJHtwYWdlfTpgLCBlcnJvcik7XG4gICAgICAgICAgICAgIGJyZWFrOyAvLyBTdG9wIHNlcXVlbnRpYWwgbG9hZGluZyBvbiBlcnJvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmRQYWdlID4gbGltaXRlZEVuZFBhZ2UpIHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gU3RvcHBlZCBhdCBwYWdlICR7bGltaXRlZEVuZFBhZ2V9IHRvIHByZXZlbnQgZXhjZXNzaXZlIGxvYWRpbmcgKHJlcXVlc3RlZCB1cCB0byAke2VuZFBhZ2V9KWAsXG4gICAgICAgICAgLy8gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gT3JpZ2luYWwgbG9naWMgZm9yIG9mZnNldC9wYWdlIHN0cmF0ZWdpZXNcbiAgICAgIC8vIENhbGN1bGF0ZSByYW5nZSBib3VuZGFyaWVzXG4gICAgICBjb25zdCBzdGFydFJhbmdlID0gTWF0aC5mbG9vcihyYW5nZS5zdGFydCAvIHJhbmdlU2l6ZSk7XG4gICAgICBjb25zdCBlbmRSYW5nZSA9IE1hdGguZmxvb3IocmFuZ2UuZW5kIC8gcmFuZ2VTaXplKTtcblxuICAgICAgLy8gQ29sbGVjdCByYW5nZXMgdGhhdCBuZWVkIGxvYWRpbmdcbiAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIFZJU0lCTEUgaW5kaWNlcyBoYXZlIGRhdGEsIG5vdCBqdXN0IGFueSBkYXRhIGluIGEgcmFuZ2VcbiAgICAgIGNvbnN0IHJhbmdlc1RvTG9hZDogbnVtYmVyW10gPSBbXTtcblxuICAgICAgLy8gQ2hlY2sgZWFjaCB2aXNpYmxlIGluZGV4IHRvIHNlZSBpZiBpdCBoYXMgZGF0YVxuICAgICAgY29uc3QgdmlzaWJsZVN0YXJ0ID0gcmFuZ2Uuc3RhcnQ7XG4gICAgICBjb25zdCB2aXNpYmxlRW5kID0gcmFuZ2UuZW5kO1xuXG4gICAgICAvLyBGaW5kIHdoaWNoIGluZGljZXMgaW4gdGhlIHZpc2libGUgcmFuZ2UgYXJlIG1pc3NpbmcgZGF0YVxuICAgICAgLy8gSWYgdG90YWxJdGVtcyBpcyAwIG9yIHdlIGhhdmUgbm8gaXRlbXMsIHdlIG5lZWQgdG8gbG9hZCAoaW5pdGlhbCBsb2FkIGNhc2UpXG4gICAgICBsZXQgaGFzTWlzc2luZ0RhdGEgPSBmYWxzZTtcblxuICAgICAgaWYgKHRvdGFsSXRlbXMgPT09IDAgfHwgaXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIEluaXRpYWwgbG9hZCAtIHdlIG5lZWQgdG8gZmV0Y2ggZGF0YVxuICAgICAgICBoYXNNaXNzaW5nRGF0YSA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDaGVjayBlYWNoIHZpc2libGUgaW5kZXggZm9yIG1pc3NpbmcgZGF0YVxuICAgICAgICBmb3IgKGxldCBpID0gdmlzaWJsZVN0YXJ0OyBpIDw9IHZpc2libGVFbmQgJiYgaSA8IHRvdGFsSXRlbXM7IGkrKykge1xuICAgICAgICAgIGlmIChpdGVtc1tpXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoYXNNaXNzaW5nRGF0YSA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGhhc01pc3NpbmdEYXRhKSB7XG4gICAgICAgIC8vIEZpbmQgd2hpY2ggcmFuZ2VzIG5lZWQgdG8gYmUgbG9hZGVkXG4gICAgICAgIGZvciAobGV0IHJhbmdlSWQgPSBzdGFydFJhbmdlOyByYW5nZUlkIDw9IGVuZFJhbmdlOyByYW5nZUlkKyspIHtcbiAgICAgICAgICBpZiAocGVuZGluZ1Jhbmdlcy5oYXMocmFuZ2VJZCkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElmIHRvdGFsSXRlbXMgaXMgMCwgd2UncmUgZG9pbmcgaW5pdGlhbCBsb2FkIC0gYWx3YXlzIGxvYWQgdGhlIHJhbmdlXG4gICAgICAgICAgaWYgKHRvdGFsSXRlbXMgPT09IDApIHtcbiAgICAgICAgICAgIGxvYWRlZFJhbmdlcy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgICAgICByYW5nZXNUb0xvYWQucHVzaChyYW5nZUlkKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgc3BlY2lmaWMgcmFuZ2UgaGFzIGFsbCBpdHMgZGF0YVxuICAgICAgICAgIGNvbnN0IHJhbmdlU3RhcnQgPSByYW5nZUlkICogcmFuZ2VTaXplO1xuICAgICAgICAgIGNvbnN0IHJhbmdlRW5kID0gTWF0aC5taW4ocmFuZ2VTdGFydCArIHJhbmdlU2l6ZSwgdG90YWxJdGVtcyk7XG4gICAgICAgICAgbGV0IHJhbmdlTWlzc2luZ0RhdGEgPSBmYWxzZTtcblxuICAgICAgICAgIGZvciAobGV0IGkgPSByYW5nZVN0YXJ0OyBpIDwgcmFuZ2VFbmQ7IGkrKykge1xuICAgICAgICAgICAgLy8gT25seSBjaGVjayBpbmRpY2VzIHRoYXQgYXJlIGluIHRoZSB2aXNpYmxlIHJhbmdlXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGkgPj0gdmlzaWJsZVN0YXJ0ICYmXG4gICAgICAgICAgICAgIGkgPD0gdmlzaWJsZUVuZCAmJlxuICAgICAgICAgICAgICBpdGVtc1tpXSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmFuZ2VNaXNzaW5nRGF0YSA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyYW5nZU1pc3NpbmdEYXRhKSB7XG4gICAgICAgICAgICBsb2FkZWRSYW5nZXMuZGVsZXRlKHJhbmdlSWQpOyAvLyBDbGVhciBzdGFsZSBsb2FkZWQgc3RhdGVcbiAgICAgICAgICAgIHJhbmdlc1RvTG9hZC5wdXNoKHJhbmdlSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocmFuZ2VzVG9Mb2FkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgcXVldWVkIHJlcXVlc3RzIHdlIHNob3VsZCBwcm9jZXNzXG4gICAgICAgIGlmIChcbiAgICAgICAgICBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICBhY3RpdmVMb2FkQ291bnQgPCBtYXhDb25jdXJyZW50UmVxdWVzdHNcbiAgICAgICAgKSB7XG4gICAgICAgICAgcHJvY2Vzc1F1ZXVlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBMb2FkaW5nICR7cmFuZ2VzVG9Mb2FkLmxlbmd0aH0gcmFuZ2VzOiBbJHtyYW5nZXNUb0xvYWQuam9pbihcIiwgXCIpfV1gLFxuICAgICAgLy8gKTtcblxuICAgICAgLy8gTG9hZCByYW5nZXMgaW5kaXZpZHVhbGx5IC0gbm8gbWVyZ2luZyB0byBhdm9pZCBsb2FkaW5nIG9sZCByYW5nZXNcbiAgICAgIGNvbnN0IHByb21pc2VzID0gcmFuZ2VzVG9Mb2FkLm1hcCgocmFuZ2VJZCkgPT5cbiAgICAgICAgbG9hZFJhbmdlKHJhbmdlSWQgKiByYW5nZVNpemUsIHJhbmdlU2l6ZSksXG4gICAgICApO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHByb21pc2VzKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVmVsb2NpdHktYXdhcmUgd3JhcHBlciBmb3IgbG9hZE1pc3NpbmdSYW5nZXNcbiAgICAgKi9cbiAgICBjb25zdCBsb2FkTWlzc2luZ1JhbmdlcyA9IChcbiAgICAgIHJhbmdlOiB7XG4gICAgICAgIHN0YXJ0OiBudW1iZXI7XG4gICAgICAgIGVuZDogbnVtYmVyO1xuICAgICAgfSxcbiAgICAgIGNhbGxlcj86IHN0cmluZyxcbiAgICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJhbmdlS2V5ID0gZ2V0UmFuZ2VLZXkocmFuZ2UpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGFscmVhZHkgbG9hZGluZ1xuICAgICAgICBpZiAoYWN0aXZlTG9hZFJhbmdlcy5oYXMocmFuZ2VLZXkpKSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNraXAgaWYgZHJhZ2dpbmcgd2l0aCBsb3cgdmVsb2NpdHkgKGJ1dCBub3QgaWYgd2UncmUgaWRsZSlcbiAgICAgICAgaWYgKGlzRHJhZ2dpbmcgJiYgY3VycmVudFZlbG9jaXR5IDwgMC41ICYmIGN1cnJlbnRWZWxvY2l0eSA+IDApIHtcbiAgICAgICAgICBjYW5jZWxsZWRMb2FkcysrO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayB2ZWxvY2l0eSAtIGlmIHRvbyBoaWdoLCBjYW5jZWwgdGhlIHJlcXVlc3QgZW50aXJlbHlcbiAgICAgICAgaWYgKCFjYW5Mb2FkKCkpIHtcbiAgICAgICAgICBjYW5jZWxsZWRMb2FkcysrO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBjYXBhY2l0eVxuICAgICAgICBpZiAoYWN0aXZlTG9hZENvdW50IDwgbWF4Q29uY3VycmVudFJlcXVlc3RzKSB7XG4gICAgICAgICAgLy8gRXhlY3V0ZSBpbW1lZGlhdGVseVxuICAgICAgICAgIGV4ZWN1dGVRdWV1ZWRMb2FkKHtcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgcHJpb3JpdHk6IFwibm9ybWFsXCIsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgICAgY2FsbGVyLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGVuYWJsZVJlcXVlc3RRdWV1ZSAmJlxuICAgICAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoIDwgbWF4UXVldWVTaXplXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIFF1ZXVlIHRoZSByZXF1ZXN0XG4gICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgcHJpb3JpdHk6IFwibm9ybWFsXCIsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgICAgY2FsbGVyLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtMb2FkaW5nTWFuYWdlcl0gUXVldWVkIHJlcXVlc3QgKGF0IGNhcGFjaXR5KSwgcXVldWUgc2l6ZTogJHtsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aH1gXG4gICAgICAgICAgLy8gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBRdWV1ZSBpcyBmdWxsIC0gYnV0IGRvbid0IGRyb3AgaWRsZS9yYW5nZS1jaGFuZ2VkIHJlcXVlc3RzLCB0aGV5J3JlIGNyaXRpY2FsIVxuICAgICAgICAgIC8vIEluc3RlYWQsIGNsZWFyIG9sZCBxdWV1ZWQgcmVxdWVzdHMgYW5kIGFkZCB0aGUgbmV3IG9uZVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGNhbGxlciA9PT0gXCJ2aWV3cG9ydDppZGxlXCIgfHxcbiAgICAgICAgICAgIGNhbGxlciA9PT0gXCJ2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkXCJcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIENsZWFyIG9sZCBxdWV1ZWQgcmVxdWVzdHMgLSB0aGV5J3JlIGZvciByYW5nZXMgdXNlciBzY3JvbGxlZCBwYXN0XG4gICAgICAgICAgICBsb2FkUmVxdWVzdFF1ZXVlLmZvckVhY2goKHIpID0+IHtcbiAgICAgICAgICAgICAgY2FuY2VsbGVkTG9hZHMrKztcbiAgICAgICAgICAgICAgci5yZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoID0gMDtcbiAgICAgICAgICAgIC8vIFF1ZXVlIHRoaXMgcHJpb3JpdHkgcmVxdWVzdFxuICAgICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICAgIHByaW9yaXR5OiBcImhpZ2hcIixcbiAgICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgICAgIGNhbGxlcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBRdWV1ZSBvdmVyZmxvdyAtIHJlc29sdmUgdG8gYXZvaWQgZXJyb3JzXG4gICAgICAgICAgICBpZiAobG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggPj0gbWF4UXVldWVTaXplKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlbW92ZWQgPSBsb2FkUmVxdWVzdFF1ZXVlLnNwbGljZShcbiAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoIC0gbWF4UXVldWVTaXplLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZW1vdmVkLmZvckVhY2goKHIpID0+IHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsZWRMb2FkcysrO1xuICAgICAgICAgICAgICAgIHIucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXRyeSBhIGZhaWxlZCByYW5nZVxuICAgICAqL1xuICAgIGNvbnN0IHJldHJ5RmFpbGVkUmFuZ2UgPSBhc3luYyAocmFuZ2VJZDogbnVtYmVyKTogUHJvbWlzZTxhbnlbXT4gPT4ge1xuICAgICAgZmFpbGVkUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgIGNvbnN0IG9mZnNldCA9IHJhbmdlSWQgKiByYW5nZVNpemU7XG4gICAgICByZXR1cm4gbG9hZFJhbmdlKG9mZnNldCwgcmFuZ2VTaXplKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0IHRvdGFsIGl0ZW1zIGNvdW50XG4gICAgICovXG4gICAgY29uc3Qgc2V0VG90YWxJdGVtcyA9ICh0b3RhbDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICB0b3RhbEl0ZW1zID0gdG90YWw7XG5cbiAgICAgIC8vIFVwZGF0ZSB2aWV3cG9ydCBzdGF0ZSdzIHRvdGFsIGl0ZW1zXG4gICAgICBjb25zdCB2aWV3cG9ydFN0YXRlID0gKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLnN0YXRlO1xuICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zID0gdG90YWw7XG4gICAgICB9XG5cbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDp0b3RhbC1pdGVtcy1jaGFuZ2VkXCIsIHsgdG90YWwgfSk7XG4gICAgfTtcblxuICAgIC8vIEhvb2sgaW50byB2aWV3cG9ydCBpbml0aWFsaXphdGlvblxuICAgIGNvbnN0IG9yaWdpbmFsSW5pdGlhbGl6ZSA9IGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplO1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplID0gKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gb3JpZ2luYWxJbml0aWFsaXplKCk7XG4gICAgICAvLyBTa2lwIGlmIGFscmVhZHkgaW5pdGlhbGl6ZWRcbiAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IGluaXRpYWwgdG90YWwgaWYgcHJvdmlkZWRcbiAgICAgIGlmIChjb21wb25lbnQudG90YWxJdGVtcykge1xuICAgICAgICB0b3RhbEl0ZW1zID0gY29tcG9uZW50LnRvdGFsSXRlbXM7XG4gICAgICB9XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgZHJhZyBldmVudHNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6ZHJhZy1zdGFydFwiLCAoKSA9PiB7XG4gICAgICAgIGlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6ZHJhZy1lbmRcIiwgKCkgPT4ge1xuICAgICAgICBpc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgIC8vIFByb2Nlc3MgYW55IHF1ZXVlZCByZXF1ZXN0cyBhZnRlciBkcmFnIGVuZHMgKHNhZmV0eSBtZWFzdXJlKVxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgcGxhY2Vob2xkZXJzIGFyZSByZXBsYWNlZCBldmVuIGlmIGlkbGUgZGV0ZWN0aW9uIGZhaWxzXG4gICAgICAgIGlmIChsb2FkT25EcmFnRW5kKSB7XG4gICAgICAgICAgcHJvY2Vzc1F1ZXVlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIHJhbmdlIGNoYW5nZXNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6cmFuZ2UtY2hhbmdlZFwiLCBhc3luYyAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIC8vIEV4dHJhY3QgcmFuZ2UgZnJvbSBldmVudCBkYXRhIC0gdmlydHVhbCBmZWF0dXJlIGVtaXRzIHsgcmFuZ2U6IHsgc3RhcnQsIGVuZCB9LCBzY3JvbGxQb3NpdGlvbiB9XG4gICAgICAgIGNvbnN0IHJhbmdlID0gZGF0YS5yYW5nZSB8fCBkYXRhO1xuXG4gICAgICAgIC8vIERvbid0IGxvYWQgZHVyaW5nIGZhc3Qgc2Nyb2xsaW5nIC0gbG9hZE1pc3NpbmdSYW5nZXMgd2lsbCBoYW5kbGUgdmVsb2NpdHkgY2hlY2tcblxuICAgICAgICAvLyBTa2lwIGlmIGF1dG9Mb2FkIGlzIGRpc2FibGVkIEFORCB3ZSBoYXZlbid0IG1hbnVhbGx5IGxvYWRlZCB5ZXRcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyB1bndhbnRlZCBwYWdlIDEgbG9hZHMgd2hlbiB1c2luZyByZWxvYWRBdCgpXG4gICAgICAgIC8vIEJ1dCBhbGxvd3Mgc3Vic2VxdWVudCBsb2FkcyBmcm9tIHNjcm9sbGluZyBhZnRlciByZWxvYWRBdCgpIGNvbXBsZXRlc1xuICAgICAgICBpZiAoIWF1dG9Mb2FkICYmICFoYXNNYW51YWxseUxvYWRlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gcmFuZ2U7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgcmFuZ2UgYmVmb3JlIGxvYWRpbmdcbiAgICAgICAgaWYgKHR5cGVvZiBzdGFydCAhPT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgZW5kICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgXCJbQ29sbGVjdGlvbl0gSW52YWxpZCByYW5nZSBpbiB2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkIGV2ZW50OlwiLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNraXAgbG9hZGluZyBwYWdlIDEgaWYgd2UgaGF2ZSBhbiBpbml0aWFsU2Nyb2xsSW5kZXggYW5kIGhhdmVuJ3QgY29tcGxldGVkIGluaXRpYWwgbG9hZCB5ZXRcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aGUgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIGluIHZpcnR1YWwudHMgZnJvbSB0cmlnZ2VyaW5nIGEgcGFnZSAxIGxvYWRcbiAgICAgICAgLy8gYWZ0ZXIgd2UndmUgYWxyZWFkeSBzdGFydGVkIGxvYWRpbmcgdGhlIGNvcnJlY3QgaW5pdGlhbCBwYWdlXG4gICAgICAgIGlmIChoYXNJbml0aWFsU2Nyb2xsSW5kZXggJiYgIWhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQpIHtcbiAgICAgICAgICBjb25zdCBwYWdlMUVuZEluZGV4ID0gcmFuZ2VTaXplIC0gMTsgLy8gZS5nLiwgMjkgZm9yIHJhbmdlU2l6ZT0zMFxuICAgICAgICAgIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPD0gcGFnZTFFbmRJbmRleCkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHJlcXVlc3QgZm9yIHBhZ2UgMSwgc2tpcCBpdFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNraXAgbG9hZGluZyBwYWdlIDEgaWYgYSByZWxvYWQgaXMgaW4gcHJvZ3Jlc3MgKGUuZy4sIHJlbG9hZEF0IGlzIGxvYWRpbmcgYSBzcGVjaWZpYyBwYWdlKVxuICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHN0YWxlIHZpZXdwb3J0OnJhbmdlLWNoYW5nZWQgZXZlbnRzIGZyb20gbG9hZGluZyBwYWdlIDFcbiAgICAgICAgLy8gd2hpbGUgcmVsb2FkQXQgaXMgbG9hZGluZyBhIGRpZmZlcmVudCBwYWdlXG4gICAgICAgIGlmIChyZWxvYWRJblByb2dyZXNzICYmIHJlbG9hZFRhcmdldFJhbmdlKSB7XG4gICAgICAgICAgY29uc3QgcGFnZTFFbmRJbmRleCA9IHJhbmdlU2l6ZSAtIDE7XG4gICAgICAgICAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA8PSBwYWdlMUVuZEluZGV4KSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEgcmVxdWVzdCBmb3IgcGFnZSAxIGR1cmluZyBhIHJlbG9hZCB0YXJnZXRpbmcgYSBkaWZmZXJlbnQgcmFuZ2VcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgcmFuZ2UgaXMgTk9UIHBhZ2UgMVxuICAgICAgICAgICAgaWYgKHJlbG9hZFRhcmdldFJhbmdlLnN0YXJ0ID4gcGFnZTFFbmRJbmRleCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG9hZCBtaXNzaW5nIHJhbmdlcyBpZiBuZWVkZWQgLSBkb24ndCBhd2FpdCB0byBhdm9pZCBibG9ja2luZyBzY3JvbGxcbiAgICAgICAgLy8gVGhlIGxvYWRpbmcgaGFwcGVucyBpbiB0aGUgYmFja2dyb3VuZCBhbmQgVUkgdXBkYXRlcyB3aGVuIGRhdGEgYXJyaXZlc1xuICAgICAgICBsb2FkTWlzc2luZ1Jhbmdlcyh7IHN0YXJ0LCBlbmQgfSwgXCJ2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkXCIpO1xuXG4gICAgICAgIC8vIEV2aWN0IGRpc3RhbnQgaXRlbXMgdG8gcHJldmVudCBtZW1vcnkgYmxvYXRcbiAgICAgICAgZXZpY3REaXN0YW50SXRlbXMoc3RhcnQsIGVuZCk7XG5cbiAgICAgICAgLy8gRm9yIGN1cnNvciBtb2RlLCBjaGVjayBpZiB3ZSBuZWVkIHRvIHVwZGF0ZSB2aXJ0dWFsIHNpemVcbiAgICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImN1cnNvclwiICYmICFoYXNSZWFjaGVkRW5kKSB7XG4gICAgICAgICAgLy8gVXNlIGNhY2hlZEl0ZW1Db3VudCBpbnN0ZWFkIG9mIE8obikgZmlsdGVyIG9wZXJhdGlvblxuICAgICAgICAgIGNvbnN0IGxvYWRlZEl0ZW1zQ291bnQgPSBjYWNoZWRJdGVtQ291bnQ7XG4gICAgICAgICAgY29uc3QgbWFyZ2luSXRlbXMgPVxuICAgICAgICAgICAgcmFuZ2VTaXplICpcbiAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QQUdJTkFUSU9OLkNVUlNPUl9TQ1JPTExfTUFSR0lOX01VTFRJUExJRVI7XG4gICAgICAgICAgY29uc3QgbWluVmlydHVhbEl0ZW1zID1cbiAgICAgICAgICAgIHJhbmdlU2l6ZSAqXG4gICAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUEFHSU5BVElPTi5DVVJTT1JfTUlOX1ZJUlRVQUxfU0laRV9NVUxUSVBMSUVSO1xuICAgICAgICAgIGNvbnN0IGR5bmFtaWNUb3RhbCA9IE1hdGgubWF4KFxuICAgICAgICAgICAgbG9hZGVkSXRlbXNDb3VudCArIG1hcmdpbkl0ZW1zLFxuICAgICAgICAgICAgbWluVmlydHVhbEl0ZW1zLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoZHluYW1pY1RvdGFsICE9PSB0b3RhbEl0ZW1zKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBVcGRhdGluZyBjdXJzb3IgdmlydHVhbCBzaXplIGZyb20gJHt0b3RhbEl0ZW1zfSB0byAke2R5bmFtaWNUb3RhbH1gLFxuICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgIHNldFRvdGFsSXRlbXMoZHluYW1pY1RvdGFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIHZlbG9jaXR5IGNoYW5nZXNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6dmVsb2NpdHktY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmVsb2NpdHkgPSBjdXJyZW50VmVsb2NpdHk7XG4gICAgICAgIGN1cnJlbnRWZWxvY2l0eSA9IE1hdGguYWJzKGRhdGEudmVsb2NpdHkgfHwgMCk7XG5cbiAgICAgICAgLy8gV2hlbiB2ZWxvY2l0eSBkcm9wcyBiZWxvdyB0aHJlc2hvbGQsIHByb2Nlc3MgcXVldWVcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByZXZpb3VzVmVsb2NpdHkgPiBjYW5jZWxMb2FkVGhyZXNob2xkICYmXG4gICAgICAgICAgY3VycmVudFZlbG9jaXR5IDw9IGNhbmNlbExvYWRUaHJlc2hvbGRcbiAgICAgICAgKSB7XG4gICAgICAgICAgcHJvY2Vzc1F1ZXVlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGlkbGUgc3RhdGUgdG8gcHJvY2VzcyBxdWV1ZVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDppZGxlXCIsIGFzeW5jIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY3VycmVudFZlbG9jaXR5ID0gMDtcblxuICAgICAgICAvLyBSZXNldCBkcmFnZ2luZyBzdGF0ZSBvbiBpZGxlIHNpbmNlIHVzZXIgaGFzIHN0b3BwZWQgbW92aW5nXG4gICAgICAgIGlmIChpc0RyYWdnaW5nKSB7XG4gICAgICAgICAgaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGN1cnJlbnQgdmlzaWJsZSByYW5nZSBmcm9tIHZpZXdwb3J0XG4gICAgICAgIGNvbnN0IHZpZXdwb3J0U3RhdGUgPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU7XG4gICAgICAgIGNvbnN0IHZpc2libGVSYW5nZSA9IHZpZXdwb3J0U3RhdGU/LnZpc2libGVSYW5nZTtcblxuICAgICAgICBpZiAodmlzaWJsZVJhbmdlKSB7XG4gICAgICAgICAgLy8gQ2xlYXIgc3RhbGUgcmVxdWVzdHMgZnJvbSBxdWV1ZSB0aGF0IGFyZSBmYXIgZnJvbSBjdXJyZW50IHZpc2libGUgcmFuZ2VcbiAgICAgICAgICBjb25zdCBidWZmZXIgPSByYW5nZVNpemUgKiAyOyAvLyBBbGxvdyBzb21lIGJ1ZmZlclxuICAgICAgICAgIGxvYWRSZXF1ZXN0UXVldWUgPSBsb2FkUmVxdWVzdFF1ZXVlLmZpbHRlcigocmVxdWVzdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdEVuZCA9IHJlcXVlc3QucmFuZ2UuZW5kO1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdFN0YXJ0ID0gcmVxdWVzdC5yYW5nZS5zdGFydDtcbiAgICAgICAgICAgIGNvbnN0IGlzUmVsZXZhbnQgPVxuICAgICAgICAgICAgICByZXF1ZXN0RW5kID49IHZpc2libGVSYW5nZS5zdGFydCAtIGJ1ZmZlciAmJlxuICAgICAgICAgICAgICByZXF1ZXN0U3RhcnQgPD0gdmlzaWJsZVJhbmdlLmVuZCArIGJ1ZmZlcjtcblxuICAgICAgICAgICAgaWYgKCFpc1JlbGV2YW50KSB7XG4gICAgICAgICAgICAgIHJlcXVlc3QucmVzb2x2ZSgpOyAvLyBSZXNvbHZlIHRvIGF2b2lkIGhhbmdpbmcgcHJvbWlzZXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpc1JlbGV2YW50O1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gTG9hZCB0aGUgY3VycmVudCB2aXNpYmxlIHJhbmdlIGlmIG5lZWRlZFxuICAgICAgICAgIGF3YWl0IGxvYWRNaXNzaW5nUmFuZ2VzKHZpc2libGVSYW5nZSwgXCJ2aWV3cG9ydDppZGxlXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxzbyBwcm9jZXNzIGFueSBxdWV1ZWQgcmVxdWVzdHNcbiAgICAgICAgcHJvY2Vzc1F1ZXVlKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBpdGVtIHJlbW92YWwgLSBET04nVCBjbGVhciBsb2FkZWRSYW5nZXMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZWxvYWRcbiAgICAgIC8vIFRoZSBkYXRhIGlzIGFscmVhZHkgc2hpZnRlZCBsb2NhbGx5IGluIGFwaS50cyBhbmQgcmVuZGVyaW5nLnRzXG4gICAgICAvLyBSZWxvYWRpbmcgd291bGQgY2F1c2UgcmFjZSBjb25kaXRpb25zIGFuZCBvdmVyd3JpdGUgdGhlIGNvcnJlY3QgdG90YWxJdGVtc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJpdGVtOnJlbW92ZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW0NvbGxlY3Rpb25dIGl0ZW06cmVtb3ZlZCBldmVudCAtIGluZGV4OiAke2RhdGEuaW5kZXh9YCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBbQ29sbGVjdGlvbl0gaXRlbXMubGVuZ3RoOiAke2l0ZW1zLmxlbmd0aH1gKTtcblxuICAgICAgICAvLyBVcGRhdGUgZGlzY292ZXJlZFRvdGFsIHRvIG1hdGNoIHRoZSBuZXcgY291bnRcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBzdGFsZSBkaXNjb3ZlcmVkVG90YWwgZnJvbSBiZWluZyB1c2VkIG9uIG5leHQgbG9hZFxuICAgICAgICBpZiAoZGlzY292ZXJlZFRvdGFsICE9PSBudWxsICYmIGRpc2NvdmVyZWRUb3RhbCA+IDApIHtcbiAgICAgICAgICBkaXNjb3ZlcmVkVG90YWwgPSBkaXNjb3ZlcmVkVG90YWwgLSAxO1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBVcGRhdGVkIGRpc2NvdmVyZWRUb3RhbCB0bzogJHtkaXNjb3ZlcmVkVG90YWx9YCxcbiAgICAgICAgICAvLyApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTk9URTogRG8gTk9UIGRlY3JlbWVudCB0b3RhbEl0ZW1zIGhlcmUhXG4gICAgICAgIC8vIGFwaS50cyBhbHJlYWR5IGNhbGxzIHNldFRvdGFsSXRlbXMoKSBhZnRlciBlbWl0dGluZyBpdGVtOnJlbW92ZS1yZXF1ZXN0LFxuICAgICAgICAvLyB3aGljaCBwcm9wZXJseSB1cGRhdGVzIHRvdGFsSXRlbXMuIERlY3JlbWVudGluZyBoZXJlIHdvdWxkIGNhdXNlIGEgZG91YmxlLWRlY3JlbWVudC5cblxuICAgICAgICAvLyBET04nVCBjbGVhciBsb2FkZWRSYW5nZXMgLSB3ZSB3YW50IHRvIGtlZXAgdXNpbmcgdGhlIGxvY2FsIGRhdGFcbiAgICAgICAgLy8gVGhlIGRhdGEgaGFzIGJlZW4gc2hpZnRlZCBsb2NhbGx5IGFuZCBpcyBzdGlsbCB2YWxpZFxuICAgICAgICAvLyBDbGVhcmluZyB3b3VsZCB0cmlnZ2VyIGEgcmVsb2FkIHdoaWNoIGNhdXNlcyByYWNlIGNvbmRpdGlvbnNcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBLZWVwaW5nIGxvYWRlZFJhbmdlcyBpbnRhY3Q6YCxcbiAgICAgICAgLy8gICBBcnJheS5mcm9tKGxvYWRlZFJhbmdlcyksXG4gICAgICAgIC8vICk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTG9hZCBpbml0aWFsIGRhdGEgaWYgY29sbGVjdGlvbiBpcyBhdmFpbGFibGUgYW5kIGF1dG9Mb2FkIGlzIGVuYWJsZWRcbiAgICAgIGlmIChjb2xsZWN0aW9uICYmIGF1dG9Mb2FkKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgYW4gaW5pdGlhbCBzY3JvbGwgaW5kZXggT1IgYSBzZWxlY3RJZCwgbG9hZCBkYXRhIGZvciB0aGF0IHBvc2l0aW9uIGRpcmVjdGx5XG4gICAgICAgIC8vIERvbid0IHVzZSBzY3JvbGxUb0luZGV4KCkgYXMgaXQgdHJpZ2dlcnMgYW5pbWF0aW9uL3ZlbG9jaXR5IHRyYWNraW5nXG4gICAgICAgIC8vIHZpcnR1YWwudHMgaGFzIGFscmVhZHkgc2V0IHRoZSBzY3JvbGwgcG9zaXRpb24gYW5kIGNhbGN1bGF0ZWQgdGhlIHZpc2libGUgcmFuZ2VcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGluaXRpYWxTY3JvbGxJbmRleCA+IDAgfHxcbiAgICAgICAgICAoc2VsZWN0SWQgIT09IHVuZGVmaW5lZCAmJiBzZWxlY3RJZCAhPT0gbnVsbClcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gR2V0IHRoZSB2aXNpYmxlIHJhbmdlIHRoYXQgd2FzIGFscmVhZHkgY2FsY3VsYXRlZCBieSB2aXJ0dWFsLnRzXG4gICAgICAgICAgLy8gV2UgbWlzc2VkIHRoZSBpbml0aWFsIHZpZXdwb3J0OnJhbmdlLWNoYW5nZWQgZXZlbnQgYmVjYXVzZSBvdXIgbGlzdGVuZXIgd2Fzbid0IHJlYWR5IHlldFxuICAgICAgICAgIGNvbnN0IHZpc2libGVSYW5nZSA9IGNvbXBvbmVudC52aWV3cG9ydD8uZ2V0VmlzaWJsZVJhbmdlPy4oKTtcblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHZpc2libGVSYW5nZSAmJlxuICAgICAgICAgICAgKHZpc2libGVSYW5nZS5zdGFydCA+IDAgfHwgdmlzaWJsZVJhbmdlLmVuZCA+IDApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBVc2UgdGhlIHByZS1jYWxjdWxhdGVkIHZpc2libGUgcmFuZ2UgZnJvbSB2aXJ0dWFsLnRzXG4gICAgICAgICAgICBsb2FkTWlzc2luZ1Jhbmdlcyh2aXNpYmxlUmFuZ2UsIFwiaW5pdGlhbC1wb3NpdGlvblwiKVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgLy8gRW1pdCBldmVudCB0byBzZWxlY3QgaXRlbSBhZnRlciBpbml0aWFsIGxvYWQgaWYgc2VsZWN0SWQgaXMgcHJvdmlkZWRcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImNvbGxlY3Rpb246aW5pdGlhbC1sb2FkLWNvbXBsZXRlXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0SWQsXG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxTY3JvbGxJbmRleCxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICBcIltDb2xsZWN0aW9uXSBGYWlsZWQgdG8gbG9hZCBpbml0aWFsIHBvc2l0aW9uIGRhdGE6XCIsXG4gICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQgPSB0cnVlOyAvLyBBbGxvdyBub3JtYWwgbG9hZGluZyBldmVuIG9uIGVycm9yXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGYWxsYmFjazogY2FsY3VsYXRlIHJhbmdlIGZyb20gaW5pdGlhbFNjcm9sbEluZGV4XG4gICAgICAgICAgICAvLyBUaGlzIGhhbmRsZXMgZWRnZSBjYXNlcyB3aGVyZSB2aXNpYmxlUmFuZ2Ugd2Fzbid0IHJlYWR5XG4gICAgICAgICAgICBjb25zdCBvdmVyc2NhbiA9IDI7XG4gICAgICAgICAgICBjb25zdCBlc3RpbWF0ZWRWaXNpYmxlQ291bnQgPSBNYXRoLmNlaWwoNjAwIC8gNTApOyAvLyB+MTIgaXRlbXNcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoMCwgaW5pdGlhbFNjcm9sbEluZGV4IC0gb3ZlcnNjYW4pO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gaW5pdGlhbFNjcm9sbEluZGV4ICsgZXN0aW1hdGVkVmlzaWJsZUNvdW50ICsgb3ZlcnNjYW47XG5cbiAgICAgICAgICAgIGxvYWRNaXNzaW5nUmFuZ2VzKHsgc3RhcnQsIGVuZCB9LCBcImluaXRpYWwtcG9zaXRpb24tZmFsbGJhY2tcIilcbiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vIEVtaXQgZXZlbnQgdG8gc2VsZWN0IGl0ZW0gYWZ0ZXIgaW5pdGlhbCBsb2FkIGlmIHNlbGVjdElkIGlzIHByb3ZpZGVkXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJjb2xsZWN0aW9uOmluaXRpYWwtbG9hZC1jb21wbGV0ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdElkLFxuICAgICAgICAgICAgICAgICAgICBpbml0aWFsU2Nyb2xsSW5kZXgsXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgXCJbQ29sbGVjdGlvbl0gRmFpbGVkIHRvIGxvYWQgaW5pdGlhbCBwb3NpdGlvbiBkYXRhIChmYWxsYmFjayk6XCIsXG4gICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQgPSB0cnVlOyAvLyBBbGxvdyBub3JtYWwgbG9hZGluZyBldmVuIG9uIGVycm9yXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyBpbml0aWFsIHNjcm9sbCBpbmRleCAtIGxvYWQgZnJvbSBiZWdpbm5pbmcgYXMgbm9ybWFsXG4gICAgICAgIGxvYWRSYW5nZSgwLCByYW5nZVNpemUsIFwiaW5pdGlhbGl6ZS1wYWdlMVwiKVxuICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBhdXRvU2VsZWN0Rmlyc3QgLSBnZXQgZmlyc3QgaXRlbSBJRCBhbmQgZW1pdCBzZWxlY3Rpb24gZXZlbnRcbiAgICAgICAgICAgIGlmIChhdXRvU2VsZWN0Rmlyc3QgJiYgaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBjb25zdCBmaXJzdEl0ZW0gPSBpdGVtc1swXTtcbiAgICAgICAgICAgICAgY29uc3QgZmlyc3RJZCA9IGZpcnN0SXRlbT8uX2lkIHx8IGZpcnN0SXRlbT8uaWQ7XG4gICAgICAgICAgICAgIGlmIChmaXJzdElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY29sbGVjdGlvbjppbml0aWFsLWxvYWQtY29tcGxldGVcIiwge1xuICAgICAgICAgICAgICAgICAgc2VsZWN0SWQ6IGZpcnN0SWQsXG4gICAgICAgICAgICAgICAgICBpbml0aWFsU2Nyb2xsSW5kZXg6IDAsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbQ29sbGVjdGlvbl0gRmFpbGVkIHRvIGxvYWQgaW5pdGlhbCBkYXRhOlwiLCBlcnJvcik7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlc2V0IGNvbGxlY3Rpb24gc3RhdGUgd2l0aG91dCBkZXN0cm95aW5nIHRoZSBjb21wb25lbnRcbiAgICAgKiBDbGVhcnMgYWxsIGxvYWRlZCBkYXRhIGFuZCBwcmVwYXJlcyBmb3IgZnJlc2ggbG9hZFxuICAgICAqL1xuICAgIGNvbnN0IHJlc2V0ID0gKCkgPT4ge1xuICAgICAgbG9nTWVtb3J5U3RhdHMoXCJyZXNldDpiZWZvcmVcIik7XG5cbiAgICAgIC8vIEFib3J0IGFsbCBpbi1mbGlnaHQgcmVxdWVzdHNcbiAgICAgIGFib3J0Q29udHJvbGxlcnMuZm9yRWFjaCgoY29udHJvbGxlcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIElnbm9yZSBhYm9ydCBlcnJvcnNcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBhYm9ydENvbnRyb2xsZXJzLmNsZWFyKCk7XG5cbiAgICAgIC8vIENsZWFyIGFsbCBkYXRhIHN0cnVjdHVyZXNcbiAgICAgIGl0ZW1zLmxlbmd0aCA9IDA7XG4gICAgICBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgICBsb2FkZWRSYW5nZXMuY2xlYXIoKTtcbiAgICAgIHBlbmRpbmdSYW5nZXMuY2xlYXIoKTtcbiAgICAgIGZhaWxlZFJhbmdlcy5jbGVhcigpO1xuICAgICAgYWN0aXZlTG9hZFJhbmdlcy5jbGVhcigpO1xuICAgICAgYWN0aXZlUmVxdWVzdHMuY2xlYXIoKTtcbiAgICAgIGN1cnNvck1hcC5jbGVhcigpO1xuICAgICAgcGFnZVRvT2Zmc2V0TWFwLmNsZWFyKCk7XG5cbiAgICAgIC8vIFJlc2V0IHN0YXRlXG4gICAgICB0b3RhbEl0ZW1zID0gMDtcbiAgICAgIGN1cnJlbnRDdXJzb3IgPSBudWxsO1xuICAgICAgaGlnaGVzdExvYWRlZFBhZ2UgPSAwO1xuICAgICAgZGlzY292ZXJlZFRvdGFsID0gbnVsbDtcbiAgICAgIGhhc1JlYWNoZWRFbmQgPSBmYWxzZTtcbiAgICAgIGhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQgPSBmYWxzZTtcbiAgICAgIGhhc01hbnVhbGx5TG9hZGVkID0gZmFsc2U7XG5cbiAgICAgIC8vIFJlc2V0IGNhY2hlZCBpdGVtIGNvdW50XG4gICAgICBjYWNoZWRJdGVtQ291bnQgPSAwO1xuXG4gICAgICAvLyBSZXNldCBjb3VudGVyc1xuICAgICAgYWN0aXZlTG9hZENvdW50ID0gMDtcbiAgICAgIGNvbXBsZXRlZExvYWRzID0gMDtcbiAgICAgIGZhaWxlZExvYWRzID0gMDtcbiAgICAgIGNhbmNlbGxlZExvYWRzID0gMDtcblxuICAgICAgLy8gVXBkYXRlIGNvbXBvbmVudCByZWZlcmVuY2VcbiAgICAgIGNvbXBvbmVudC5pdGVtcyA9IGl0ZW1zO1xuICAgICAgY29tcG9uZW50LnRvdGFsSXRlbXMgPSAwO1xuXG4gICAgICBsb2dNZW1vcnlTdGF0cyhcInJlc2V0OmFmdGVyXCIpO1xuXG4gICAgICAvLyBFbWl0IHJlc2V0IGV2ZW50XG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwiY29sbGVjdGlvbjpyZXNldFwiKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgdGhlIHJlcXVlc3QgcXVldWUgLSB1c2VkIGJ5IHJlbG9hZEF0IHRvIHByZXZlbnQgc3RhbGUgcXVldWVkIHJlcXVlc3RzXG4gICAgICovXG4gICAgY29uc3QgY2xlYXJRdWV1ZSA9ICgpID0+IHtcbiAgICAgIC8vIFJlc29sdmUgYWxsIHBlbmRpbmcgcHJvbWlzZXMgdG8gYXZvaWQgaGFuZ2luZ1xuICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5mb3JFYWNoKChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJlcXVlc3QucmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgICBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIE1hcmsgdGhhdCBkYXRhIGhhcyBiZWVuIG1hbnVhbGx5IGxvYWRlZCAoZS5nLiwgdmlhIHJlbG9hZEF0KVxuICAgICAqIFRoaXMgZW5hYmxlcyBzdWJzZXF1ZW50IGxvYWRzIGZyb20gdmlld3BvcnQ6cmFuZ2UtY2hhbmdlZFxuICAgICAqL1xuICAgIGNvbnN0IHNldE1hbnVhbGx5TG9hZGVkID0gKCkgPT4ge1xuICAgICAgaGFzTWFudWFsbHlMb2FkZWQgPSB0cnVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXQgcmVsb2FkIGluIHByb2dyZXNzIGZsYWcgd2l0aCB0YXJnZXQgcmFuZ2VcbiAgICAgKiBVc2VkIGJ5IHJlbG9hZEF0IHRvIHByZXZlbnQgdmlld3BvcnQ6cmFuZ2UtY2hhbmdlZCBmcm9tIGxvYWRpbmcgcGFnZSAxXG4gICAgICovXG4gICAgY29uc3Qgc2V0UmVsb2FkSW5Qcm9ncmVzcyA9IChcbiAgICAgIGluUHJvZ3Jlc3M6IGJvb2xlYW4sXG4gICAgICB0YXJnZXRSYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSxcbiAgICApID0+IHtcbiAgICAgIHJlbG9hZEluUHJvZ3Jlc3MgPSBpblByb2dyZXNzO1xuICAgICAgcmVsb2FkVGFyZ2V0UmFuZ2UgPSB0YXJnZXRSYW5nZSB8fCBudWxsO1xuICAgIH07XG5cbiAgICAvLyBBZGQgY29sbGVjdGlvbiBBUEkgdG8gdmlld3BvcnRcbiAgICBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbiA9IHtcbiAgICAgIGxvYWRSYW5nZTogKG9mZnNldDogbnVtYmVyLCBsaW1pdDogbnVtYmVyKSA9PiBsb2FkUmFuZ2Uob2Zmc2V0LCBsaW1pdCksXG4gICAgICBsb2FkTWlzc2luZ1JhbmdlczogKFxuICAgICAgICByYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9LFxuICAgICAgICBjYWxsZXI/OiBzdHJpbmcsXG4gICAgICApID0+IGxvYWRNaXNzaW5nUmFuZ2VzKHJhbmdlLCBjYWxsZXIgfHwgXCJ2aWV3cG9ydC5jb2xsZWN0aW9uXCIpLFxuICAgICAgZ2V0TG9hZGVkUmFuZ2VzOiAoKSA9PiBsb2FkZWRSYW5nZXMsXG4gICAgICBnZXRQZW5kaW5nUmFuZ2VzOiAoKSA9PiBwZW5kaW5nUmFuZ2VzLFxuICAgICAgY2xlYXJGYWlsZWRSYW5nZXM6ICgpID0+IGZhaWxlZFJhbmdlcy5jbGVhcigpLFxuICAgICAgY2xlYXJRdWV1ZSxcbiAgICAgIHNldE1hbnVhbGx5TG9hZGVkLFxuICAgICAgc2V0UmVsb2FkSW5Qcm9ncmVzcyxcbiAgICAgIHJldHJ5RmFpbGVkUmFuZ2UsXG4gICAgICBzZXRUb3RhbEl0ZW1zLFxuICAgICAgZ2V0VG90YWxJdGVtczogKCkgPT4gdG90YWxJdGVtcyxcbiAgICAgIC8vIEN1cnNvci1zcGVjaWZpYyBtZXRob2RzXG4gICAgICBnZXRDdXJyZW50Q3Vyc29yOiAoKSA9PiBjdXJyZW50Q3Vyc29yLFxuICAgICAgZ2V0Q3Vyc29yRm9yUGFnZTogKHBhZ2U6IG51bWJlcikgPT4gY3Vyc29yTWFwLmdldChwYWdlKSB8fCBudWxsLFxuICAgICAgLy8gUmVzZXQgbWV0aG9kIGZvciByZWxvYWQgZnVuY3Rpb25hbGl0eVxuICAgICAgcmVzZXQsXG4gICAgfTtcblxuICAgIC8vIEFkZCBjb2xsZWN0aW9uIGRhdGEgYWNjZXNzIHdpdGggZGlyZWN0IGFzc2lnbm1lbnRcbiAgICAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbiA9IHtcbiAgICAgIGl0ZW1zLFxuICAgICAgZ2V0SXRlbXM6ICgpID0+IGl0ZW1zLFxuICAgICAgZ2V0SXRlbTogKGluZGV4OiBudW1iZXIpID0+IGl0ZW1zW2luZGV4XSxcbiAgICAgIGxvYWRSYW5nZSxcbiAgICAgIGxvYWRNaXNzaW5nUmFuZ2VzOiAoXG4gICAgICAgIHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0sXG4gICAgICAgIGNhbGxlcj86IHN0cmluZyxcbiAgICAgICkgPT4gbG9hZE1pc3NpbmdSYW5nZXMocmFuZ2UsIGNhbGxlciB8fCBcImNvbXBvbmVudC5jb2xsZWN0aW9uXCIpLFxuICAgICAgZ2V0TG9hZGluZ1N0YXRzOiAoKSA9PiAoe1xuICAgICAgICBwZW5kaW5nUmVxdWVzdHM6IGFjdGl2ZUxvYWRDb3VudCxcbiAgICAgICAgY29tcGxldGVkUmVxdWVzdHM6IGNvbXBsZXRlZExvYWRzLFxuICAgICAgICBmYWlsZWRSZXF1ZXN0czogZmFpbGVkTG9hZHMsXG4gICAgICAgIGNhbmNlbGxlZFJlcXVlc3RzOiBjYW5jZWxsZWRMb2FkcyxcbiAgICAgICAgY3VycmVudFZlbG9jaXR5LFxuICAgICAgICBjYW5Mb2FkOiBjYW5Mb2FkKCksXG4gICAgICAgIHF1ZXVlZFJlcXVlc3RzOiBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCxcbiAgICAgIH0pLFxuICAgICAgLy8gVG90YWwgaXRlbXMgbWFuYWdlbWVudFxuICAgICAgZ2V0VG90YWxJdGVtczogKCkgPT4gdG90YWxJdGVtcyxcbiAgICAgIHNldFRvdGFsSXRlbXMsXG4gICAgICAvLyBDdXJzb3IgbWV0aG9kc1xuICAgICAgZ2V0Q3VycmVudEN1cnNvcjogKCkgPT4gY3VycmVudEN1cnNvcixcbiAgICAgIGdldEN1cnNvckZvclBhZ2U6IChwYWdlOiBudW1iZXIpID0+IGN1cnNvck1hcC5nZXQocGFnZSkgfHwgbnVsbCxcbiAgICAgIC8vIFJlc2V0IG1ldGhvZCBmb3IgcmVsb2FkIGZ1bmN0aW9uYWxpdHlcbiAgICAgIHJlc2V0LFxuICAgIH07XG5cbiAgICAvLyBBbHNvIGVuc3VyZSBjb21wb25lbnQuaXRlbXMgaXMgdXBkYXRlZFxuICAgIGNvbXBvbmVudC5pdGVtcyA9IGl0ZW1zO1xuXG4gICAgLy8gQ2xlYW51cCBmdW5jdGlvbiAtIGNvbXByZWhlbnNpdmUgbWVtb3J5IGNsZWFudXBcbiAgICBjb25zdCBkZXN0cm95ID0gKCkgPT4ge1xuICAgICAgbG9nTWVtb3J5U3RhdHMoXCJkZXN0cm95OmJlZm9yZVwiKTtcblxuICAgICAgLy8gQWJvcnQgYWxsIGluLWZsaWdodCByZXF1ZXN0c1xuICAgICAgYWJvcnRDb250cm9sbGVycy5mb3JFYWNoKChjb250cm9sbGVyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gSWdub3JlIGFib3J0IGVycm9yc1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGFib3J0Q29udHJvbGxlcnMuY2xlYXIoKTtcblxuICAgICAgLy8gQ2xlYXIgYWxsIGRhdGEgc3RydWN0dXJlc1xuICAgICAgaXRlbXMubGVuZ3RoID0gMDtcbiAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoID0gMDtcbiAgICAgIGxvYWRlZFJhbmdlcy5jbGVhcigpO1xuICAgICAgcGVuZGluZ1Jhbmdlcy5jbGVhcigpO1xuICAgICAgZmFpbGVkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICBhY3RpdmVMb2FkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICBhY3RpdmVSZXF1ZXN0cy5jbGVhcigpO1xuICAgICAgY3Vyc29yTWFwLmNsZWFyKCk7XG4gICAgICBwYWdlVG9PZmZzZXRNYXAuY2xlYXIoKTtcblxuICAgICAgLy8gUmVzZXQgc3RhdGVcbiAgICAgIHRvdGFsSXRlbXMgPSAwO1xuICAgICAgY3VycmVudEN1cnNvciA9IG51bGw7XG4gICAgICBoaWdoZXN0TG9hZGVkUGFnZSA9IDA7XG4gICAgICBkaXNjb3ZlcmVkVG90YWwgPSBudWxsO1xuICAgICAgaGFzUmVhY2hlZEVuZCA9IGZhbHNlO1xuXG4gICAgICAvLyBDbGVhciBjb21wb25lbnQgcmVmZXJlbmNlXG4gICAgICBpZiAoY29tcG9uZW50Lml0ZW1zID09PSBpdGVtcykge1xuICAgICAgICBjb21wb25lbnQuaXRlbXMgPSBbXTtcbiAgICAgIH1cblxuICAgICAgbG9nTWVtb3J5U3RhdHMoXCJkZXN0cm95OmFmdGVyXCIpO1xuICAgIH07XG5cbiAgICAvLyBXaXJlIGRlc3Ryb3kgaW50byB0aGUgY29tcG9uZW50J3MgZGVzdHJveSBjaGFpblxuICAgIHdyYXBEZXN0cm95KGNvbXBvbmVudCwgZGVzdHJveSk7XG5cbiAgICAvLyBSZXR1cm4gZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIGNvbGxlY3Rpb246IHtcbiAgICAgICAgLy8gRGF0YSBhY2Nlc3MgbWV0aG9kc1xuICAgICAgICBpdGVtcyxcbiAgICAgICAgZ2V0SXRlbXM6ICgpID0+IGl0ZW1zLFxuICAgICAgICBnZXRJdGVtOiAoaW5kZXg6IG51bWJlcikgPT4gaXRlbXNbaW5kZXhdLFxuICAgICAgICAvLyBMb2FkaW5nIG1ldGhvZHNcbiAgICAgICAgbG9hZFJhbmdlLFxuICAgICAgICBsb2FkTWlzc2luZ1JhbmdlczogKFxuICAgICAgICAgIHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0sXG4gICAgICAgICAgY2FsbGVyPzogc3RyaW5nLFxuICAgICAgICApID0+IGxvYWRNaXNzaW5nUmFuZ2VzKHJhbmdlLCBjYWxsZXIgfHwgXCJyZXR1cm4uY29sbGVjdGlvblwiKSxcbiAgICAgICAgZ2V0TG9hZGVkUmFuZ2VzOiAoKSA9PiBsb2FkZWRSYW5nZXMsXG4gICAgICAgIGdldFBlbmRpbmdSYW5nZXM6ICgpID0+IHBlbmRpbmdSYW5nZXMsXG4gICAgICAgIGNsZWFyRmFpbGVkUmFuZ2VzOiAoKSA9PiBmYWlsZWRSYW5nZXMuY2xlYXIoKSxcbiAgICAgICAgY2xlYXJRdWV1ZSxcbiAgICAgICAgc2V0TWFudWFsbHlMb2FkZWQsXG4gICAgICAgIHNldFJlbG9hZEluUHJvZ3Jlc3MsXG4gICAgICAgIHJldHJ5RmFpbGVkUmFuZ2UsXG4gICAgICAgIHNldFRvdGFsSXRlbXMsXG4gICAgICAgIGdldFRvdGFsSXRlbXM6ICgpID0+IHRvdGFsSXRlbXMsXG4gICAgICAgIC8vIEN1cnNvci1zcGVjaWZpYyBtZXRob2RzXG4gICAgICAgIGdldEN1cnJlbnRDdXJzb3I6ICgpID0+IGN1cnJlbnRDdXJzb3IsXG4gICAgICAgIGdldEN1cnNvckZvclBhZ2U6IChwYWdlOiBudW1iZXIpID0+IGN1cnNvck1hcC5nZXQocGFnZSkgfHwgbnVsbCxcbiAgICAgICAgLy8gUmVzZXQgbWV0aG9kIGZvciByZWxvYWQgZnVuY3Rpb25hbGl0eVxuICAgICAgICByZXNldCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbn1cbiIsCiAgICAiLy8gc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvcGxhY2Vob2xkZXJzLnRzXG5cbi8qKlxuICogUGxhY2Vob2xkZXIgRmVhdHVyZSAtIFNtYXJ0IHBsYWNlaG9sZGVyIGdlbmVyYXRpb25cbiAqIEFuYWx5emVzIGZpcnN0IGxvYWRlZCBkYXRhIHRvIGdlbmVyYXRlIHJlYWxpc3RpYyBtYXNrZWQgcGxhY2Vob2xkZXJzXG4gKiBTaG93cyBwbGFjZWhvbGRlcnMgd2hpbGUgZGF0YSBpcyBsb2FkaW5nXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgQ29sbGVjdGlvbkNvbXBvbmVudCB9IGZyb20gXCIuL2NvbGxlY3Rpb25cIjtcbmltcG9ydCB7IFZJRVdQT1JUX0NPTlNUQU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBwbGFjZWhvbGRlciBmZWF0dXJlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGxhY2Vob2xkZXJDb25maWcge1xuICBlbmFibGVkPzogYm9vbGVhbjtcbiAgYW5hbHl6ZUZpcnN0TG9hZD86IGJvb2xlYW47XG4gIG1hc2tDaGFyYWN0ZXI/OiBzdHJpbmc7XG4gIHJhbmRvbUxlbmd0aFZhcmlhbmNlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBGaWVsZCBzdHJ1Y3R1cmUgZm9yIHBsYWNlaG9sZGVyIGdlbmVyYXRpb25cbiAqL1xuaW50ZXJmYWNlIEZpZWxkU3RydWN0dXJlIHtcbiAgbWluTGVuZ3RoOiBudW1iZXI7XG4gIG1heExlbmd0aDogbnVtYmVyO1xuICBhdmdMZW5ndGg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGFjZWhvbGRlckNvbXBvbmVudCB7XG4gIHBsYWNlaG9sZGVyczoge1xuICAgIGFuYWx5emVEYXRhU3RydWN0dXJlOiAoaXRlbXM6IGFueVtdKSA9PiB2b2lkO1xuICAgIGhhc0FuYWx5emVkU3RydWN0dXJlOiAoKSA9PiBib29sZWFuO1xuICAgIGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtOiAoaW5kZXg6IG51bWJlcikgPT4gYW55O1xuICAgIGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtczogKHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pID0+IGFueVtdO1xuICAgIHNob3dQbGFjZWhvbGRlcnM6IChyYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9KSA9PiB2b2lkO1xuICAgIGlzUGxhY2Vob2xkZXI6IChpdGVtOiBhbnkpID0+IGJvb2xlYW47XG4gICAgcmVwbGFjZVBsYWNlaG9sZGVyczogKGl0ZW1zOiBhbnlbXSwgb2Zmc2V0OiBudW1iZXIpID0+IHZvaWQ7XG4gICAgY2xlYXI6ICgpID0+IHZvaWQ7XG4gIH07XG59XG5cbi8qKlxuICogQWRkcyBwbGFjZWhvbGRlciBmdW5jdGlvbmFsaXR5IHRvIHZpZXdwb3J0IGNvbXBvbmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFBsYWNlaG9sZGVycyhjb25maWc6IFBsYWNlaG9sZGVyQ29uZmlnID0ge30pIHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgQ29sbGVjdGlvbkNvbXBvbmVudD4oXG4gICAgY29tcG9uZW50OiBUXG4gICk6IFQgJiBQbGFjZWhvbGRlckNvbXBvbmVudCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgZW5hYmxlZCA9IHRydWUsXG4gICAgICBhbmFseXplRmlyc3RMb2FkID0gdHJ1ZSxcbiAgICAgIG1hc2tDaGFyYWN0ZXIgPSBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuTUFTS19DSEFSQUNURVIsXG4gICAgICByYW5kb21MZW5ndGhWYXJpYW5jZSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUlxuICAgICAgICAuUkFORE9NX0xFTkdUSF9WQVJJQU5DRSxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gU3RhdGVcbiAgICBsZXQgZmllbGRTdHJ1Y3R1cmVzOiBNYXA8c3RyaW5nLCBGaWVsZFN0cnVjdHVyZT4gfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaGFzQW5hbHl6ZWQgPSBmYWxzZTtcbiAgICBsZXQgcGxhY2Vob2xkZXJJZENvdW50ZXIgPSAwO1xuXG4gICAgLyoqXG4gICAgICogQW5hbHl6ZSBkYXRhIHN0cnVjdHVyZSBmcm9tIGZpcnN0IGxvYWRlZCBpdGVtc1xuICAgICAqL1xuICAgIGNvbnN0IGFuYWx5emVEYXRhU3RydWN0dXJlID0gKGl0ZW1zOiBhbnlbXSk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFlbmFibGVkIHx8IGhhc0FuYWx5emVkIHx8ICFpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYPCflI0gW1BMQUNFSE9MREVSU10gQW5hbHl6aW5nIGRhdGEgc3RydWN0dXJlIGZyb20gJHtpdGVtcy5sZW5ndGh9IGl0ZW1zYFxuICAgICAgLy8gKTtcblxuICAgICAgY29uc3Qgc3RydWN0dXJlcyA9IG5ldyBNYXA8c3RyaW5nLCBGaWVsZFN0cnVjdHVyZT4oKTtcbiAgICAgIGNvbnN0IHNhbXBsZVNpemUgPSBNYXRoLm1pbihcbiAgICAgICAgaXRlbXMubGVuZ3RoLFxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuTUFYX1NBTVBMRV9TSVpFXG4gICAgICApO1xuXG4gICAgICAvLyBBbmFseXplIGVhY2ggZmllbGQgYWNyb3NzIGFsbCBzYW1wbGUgaXRlbXNcbiAgICAgIGNvbnN0IGZpZWxkU3RhdHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyW10+KCk7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2FtcGxlU2l6ZTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgICAgaWYgKCFpdGVtIHx8IHR5cGVvZiBpdGVtICE9PSBcIm9iamVjdFwiKSBjb250aW51ZTtcblxuICAgICAgICBPYmplY3Qua2V5cyhpdGVtKS5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgIC8vIFNraXAgaW50ZXJuYWwgZmllbGRzXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZmllbGQuc3RhcnRzV2l0aChcIl9cIikgfHxcbiAgICAgICAgICAgIGZpZWxkID09PSBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuUExBQ0VIT0xERVJfRkxBR1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gU3RyaW5nKGl0ZW1bZmllbGRdIHx8IFwiXCIpO1xuICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcblxuICAgICAgICAgIGlmICghZmllbGRTdGF0cy5oYXMoZmllbGQpKSB7XG4gICAgICAgICAgICBmaWVsZFN0YXRzLnNldChmaWVsZCwgW10pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmaWVsZFN0YXRzLmdldChmaWVsZCkhLnB1c2gobGVuZ3RoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBzdGF0aXN0aWNzIGZvciBlYWNoIGZpZWxkXG4gICAgICBmaWVsZFN0YXRzLmZvckVhY2goKGxlbmd0aHMsIGZpZWxkKSA9PiB7XG4gICAgICAgIGlmIChsZW5ndGhzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IG1pbkxlbmd0aCA9IE1hdGgubWluKC4uLmxlbmd0aHMpO1xuICAgICAgICBjb25zdCBtYXhMZW5ndGggPSBNYXRoLm1heCguLi5sZW5ndGhzKTtcbiAgICAgICAgY29uc3QgYXZnTGVuZ3RoID0gTWF0aC5yb3VuZChcbiAgICAgICAgICBsZW5ndGhzLnJlZHVjZSgoc3VtLCBsZW4pID0+IHN1bSArIGxlbiwgMCkgLyBsZW5ndGhzLmxlbmd0aFxuICAgICAgICApO1xuXG4gICAgICAgIHN0cnVjdHVyZXMuc2V0KGZpZWxkLCB7XG4gICAgICAgICAgbWluTGVuZ3RoLFxuICAgICAgICAgIG1heExlbmd0aCxcbiAgICAgICAgICBhdmdMZW5ndGgsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGZpZWxkU3RydWN0dXJlcyA9IHN0cnVjdHVyZXM7XG4gICAgICBoYXNBbmFseXplZCA9IHRydWU7XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBg4pyFIFtQTEFDRUhPTERFUlNdIFN0cnVjdHVyZSBhbmFseXplZDpgLFxuICAgICAgLy8gICBPYmplY3QuZnJvbUVudHJpZXMoc3RydWN0dXJlcylcbiAgICAgIC8vICk7XG5cbiAgICAgIC8vIEVtaXQgZXZlbnRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpwbGFjZWhvbGRlcnMtc3RydWN0dXJlLWFuYWx5emVkXCIsIHtcbiAgICAgICAgc3RydWN0dXJlOiBPYmplY3QuZnJvbUVudHJpZXMoc3RydWN0dXJlcyksXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgYSBzaW5nbGUgcGxhY2Vob2xkZXIgaXRlbVxuICAgICAqL1xuICAgIGNvbnN0IGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtID0gKGluZGV4OiBudW1iZXIpOiBhbnkgPT4ge1xuICAgICAgY29uc3QgcGxhY2Vob2xkZXI6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICAgIGlkOiBgcGxhY2Vob2xkZXItJHtwbGFjZWhvbGRlcklkQ291bnRlcisrfWAsXG4gICAgICAgIFtWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuUExBQ0VIT0xERVJfRkxBR106IHRydWUsXG4gICAgICAgIF9pbmRleDogaW5kZXgsXG4gICAgICB9O1xuXG4gICAgICBpZiAoIWZpZWxkU3RydWN0dXJlcyB8fCBmaWVsZFN0cnVjdHVyZXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAvLyBObyBzdHJ1Y3R1cmUgYW5hbHl6ZWQgeWV0IC0gcmV0dXJuIGJhc2ljIHBsYWNlaG9sZGVyXG4gICAgICAgIHBsYWNlaG9sZGVyLmxhYmVsID0gbWFza0NoYXJhY3Rlci5yZXBlYXQoMTApO1xuICAgICAgICByZXR1cm4gcGxhY2Vob2xkZXI7XG4gICAgICB9XG5cbiAgICAgIC8vIEdlbmVyYXRlIGZpZWxkcyBiYXNlZCBvbiBhbmFseXplZCBzdHJ1Y3R1cmVcbiAgICAgIGZpZWxkU3RydWN0dXJlcy5mb3JFYWNoKChzdHJ1Y3R1cmUsIGZpZWxkKSA9PiB7XG4gICAgICAgIGxldCBsZW5ndGg6IG51bWJlcjtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgcmFuZG9tTGVuZ3RoVmFyaWFuY2UgJiZcbiAgICAgICAgICBzdHJ1Y3R1cmUubWluTGVuZ3RoICE9PSBzdHJ1Y3R1cmUubWF4TGVuZ3RoXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIFJhbmRvbSBsZW5ndGggd2l0aGluIHJhbmdlXG4gICAgICAgICAgbGVuZ3RoID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgIE1hdGgucmFuZG9tKCkgKiAoc3RydWN0dXJlLm1heExlbmd0aCAtIHN0cnVjdHVyZS5taW5MZW5ndGggKyAxKSArXG4gICAgICAgICAgICAgIHN0cnVjdHVyZS5taW5MZW5ndGhcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFVzZSBhdmVyYWdlIGxlbmd0aFxuICAgICAgICAgIGxlbmd0aCA9IHN0cnVjdHVyZS5hdmdMZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBzb21lIHZhcmlhdGlvbiB0byBtYWtlIGl0IGxvb2sgbW9yZSBuYXR1cmFsXG4gICAgICAgIGlmIChyYW5kb21MZW5ndGhWYXJpYW5jZSAmJiBNYXRoLnJhbmRvbSgpIDwgMC4zKSB7XG4gICAgICAgICAgbGVuZ3RoID0gTWF0aC5tYXgoMSwgbGVuZ3RoICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMykgLSAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBsYWNlaG9sZGVyW2ZpZWxkXSA9IG1hc2tDaGFyYWN0ZXIucmVwZWF0KGxlbmd0aCk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHBsYWNlaG9sZGVyO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBtdWx0aXBsZSBwbGFjZWhvbGRlciBpdGVtc1xuICAgICAqL1xuICAgIGNvbnN0IGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtcyA9IChyYW5nZToge1xuICAgICAgc3RhcnQ6IG51bWJlcjtcbiAgICAgIGVuZDogbnVtYmVyO1xuICAgIH0pOiBhbnlbXSA9PiB7XG4gICAgICBjb25zdCBpdGVtczogYW55W10gPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSByYW5nZS5zdGFydDsgaSA8PSByYW5nZS5lbmQ7IGkrKykge1xuICAgICAgICBpdGVtcy5wdXNoKGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtKGkpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVtcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2hvdyBwbGFjZWhvbGRlcnMgZm9yIGEgcmFuZ2VcbiAgICAgKi9cbiAgICBjb25zdCBzaG93UGxhY2Vob2xkZXJzID0gKHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pOiB2b2lkID0+IHtcbiAgICAgIGlmICghZW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBwbGFjZWhvbGRlcnMgPSBnZW5lcmF0ZVBsYWNlaG9sZGVySXRlbXMocmFuZ2UpO1xuXG4gICAgICAvLyBVcGRhdGUgaXRlbXMgYXJyYXlcbiAgICAgIGlmIChjb21wb25lbnQuaXRlbXMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbGFjZWhvbGRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHJhbmdlLnN0YXJ0ICsgaTtcbiAgICAgICAgICBpZiAoIWNvbXBvbmVudC5pdGVtc1tpbmRleF0pIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5pdGVtc1tpbmRleF0gPSBwbGFjZWhvbGRlcnNbaV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBg8J+UhCBbUExBQ0VIT0xERVJTXSBTaG93aW5nICR7cGxhY2Vob2xkZXJzLmxlbmd0aH0gcGxhY2Vob2xkZXJzIGZvciByYW5nZSAke3JhbmdlLnN0YXJ0fS0ke3JhbmdlLmVuZH1gXG4gICAgICApO1xuXG4gICAgICAvLyBFbWl0IGV2ZW50XG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6cGxhY2Vob2xkZXJzLXNob3duXCIsIHtcbiAgICAgICAgcmFuZ2UsXG4gICAgICAgIGNvdW50OiBwbGFjZWhvbGRlcnMubGVuZ3RoLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGFuIGl0ZW0gaXMgYSBwbGFjZWhvbGRlclxuICAgICAqL1xuICAgIGNvbnN0IGlzUGxhY2Vob2xkZXIgPSAoaXRlbTogYW55KTogYm9vbGVhbiA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBpdGVtICYmXG4gICAgICAgIHR5cGVvZiBpdGVtID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIGl0ZW1bVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLlBMQUNFSE9MREVSX0ZMQUddID09PSB0cnVlXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXBsYWNlIHBsYWNlaG9sZGVycyB3aXRoIHJlYWwgZGF0YVxuICAgICAqL1xuICAgIGNvbnN0IHJlcGxhY2VQbGFjZWhvbGRlcnMgPSAoaXRlbXM6IGFueVtdLCBvZmZzZXQ6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFjb21wb25lbnQuaXRlbXMpIHJldHVybjtcblxuICAgICAgbGV0IHJlcGxhY2VkQ291bnQgPSAwO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gb2Zmc2V0ICsgaTtcbiAgICAgICAgY29uc3QgY3VycmVudEl0ZW0gPSBjb21wb25lbnQuaXRlbXNbaW5kZXhdO1xuXG4gICAgICAgIGlmIChpc1BsYWNlaG9sZGVyKGN1cnJlbnRJdGVtKSkge1xuICAgICAgICAgIGNvbXBvbmVudC5pdGVtc1tpbmRleF0gPSBpdGVtc1tpXTtcbiAgICAgICAgICByZXBsYWNlZENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJlcGxhY2VkQ291bnQgPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGDinKggW1BMQUNFSE9MREVSU10gUmVwbGFjZWQgJHtyZXBsYWNlZENvdW50fSBwbGFjZWhvbGRlcnMgYXQgb2Zmc2V0ICR7b2Zmc2V0fWBcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBFbWl0IGV2ZW50XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpwbGFjZWhvbGRlcnMtcmVwbGFjZWRcIiwge1xuICAgICAgICAgIG9mZnNldCxcbiAgICAgICAgICBjb3VudDogcmVwbGFjZWRDb3VudCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENsZWFyIGFsbCBwbGFjZWhvbGRlciBzdGF0ZVxuICAgICAqL1xuICAgIGNvbnN0IGNsZWFyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgZmllbGRTdHJ1Y3R1cmVzID0gbnVsbDtcbiAgICAgIGhhc0FuYWx5emVkID0gZmFsc2U7XG4gICAgICBwbGFjZWhvbGRlcklkQ291bnRlciA9IDA7XG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgZnVuY3Rpb25cbiAgICBjb25zdCBpbml0aWFsaXplID0gKCkgPT4ge1xuICAgICAgaWYgKCFlbmFibGVkKSByZXR1cm47XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgZmlyc3QgZGF0YSBsb2FkIHRvIGFuYWx5emUgc3RydWN0dXJlXG4gICAgICBpZiAoYW5hbHl6ZUZpcnN0TG9hZCkge1xuICAgICAgICBjb25zdCBoYW5kbGVSYW5nZUxvYWRlZCA9IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoIWhhc0FuYWx5emVkICYmIGRhdGEuaXRlbXMgJiYgZGF0YS5pdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhbmFseXplRGF0YVN0cnVjdHVyZShkYXRhLml0ZW1zKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSZXBsYWNlIGFueSBwbGFjZWhvbGRlcnMgd2l0aCByZWFsIGRhdGFcbiAgICAgICAgICByZXBsYWNlUGxhY2Vob2xkZXJzKGRhdGEuaXRlbXMsIGRhdGEub2Zmc2V0KTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBoYW5kbGVSYW5nZUxvYWRlZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNob3cgaW5pdGlhbCBwbGFjZWhvbGRlcnMgaWYgY29uZmlndXJlZFxuICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGNvbXBvbmVudC5jb2xsZWN0aW9uPy5nZXRUb3RhbEl0ZW1zKCkgfHwgMDtcbiAgICAgIGlmICh0b3RhbEl0ZW1zID4gMCkge1xuICAgICAgICBjb25zdCBpbml0aWFsUmFuZ2UgPSB7XG4gICAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgICAgZW5kOiBNYXRoLm1pbihcbiAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVhfU0FNUExFX1NJWkUgLSAxLFxuICAgICAgICAgICAgdG90YWxJdGVtcyAtIDFcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgICBzaG93UGxhY2Vob2xkZXJzKGluaXRpYWxSYW5nZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIENsZWFudXAgZnVuY3Rpb25cbiAgICBjb25zdCBkZXN0cm95ID0gKCkgPT4ge1xuICAgICAgY2xlYXIoKTtcbiAgICB9O1xuXG4gICAgLy8gU3RvcmUgZnVuY3Rpb25zIGZvciB2aWV3cG9ydCB0byBjYWxsXG4gICAgKGNvbXBvbmVudCBhcyBhbnkpLl9wbGFjZWhvbGRlcnNJbml0aWFsaXplID0gaW5pdGlhbGl6ZTtcbiAgICAoY29tcG9uZW50IGFzIGFueSkuX3BsYWNlaG9sZGVyc0Rlc3Ryb3kgPSBkZXN0cm95O1xuXG4gICAgLy8gUmV0dXJuIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBwbGFjZWhvbGRlcnM6IHtcbiAgICAgICAgYW5hbHl6ZURhdGFTdHJ1Y3R1cmUsXG4gICAgICAgIGhhc0FuYWx5emVkU3RydWN0dXJlOiAoKSA9PiBoYXNBbmFseXplZCxcbiAgICAgICAgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW0sXG4gICAgICAgIGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtcyxcbiAgICAgICAgc2hvd1BsYWNlaG9sZGVycyxcbiAgICAgICAgaXNQbGFjZWhvbGRlcixcbiAgICAgICAgcmVwbGFjZVBsYWNlaG9sZGVycyxcbiAgICAgICAgY2xlYXIsXG4gICAgICB9LFxuICAgIH07XG4gIH07XG59XG4iLAogICAgIi8qKlxuICogUmVuZGVyaW5nIEZlYXR1cmUgLSBJdGVtIHJlbmRlcmluZyBhbmQgcG9zaXRpb25pbmcgZm9yIHZpZXdwb3J0XG4gKiBIYW5kbGVzIERPTSBlbGVtZW50IGNyZWF0aW9uLCBwb3NpdGlvbmluZywgcmVjeWNsaW5nLCBhbmQgdXBkYXRlc1xuICovXG5cbmltcG9ydCB7IGFkZENsYXNzLCByZW1vdmVDbGFzcywgaGFzQ2xhc3MgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBWSUVXUE9SVF9DT05TVEFOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBpc1BsYWNlaG9sZGVyLFxuICBnZXRWaWV3cG9ydFN0YXRlLFxuICB3cmFwSW5pdGlhbGl6ZSxcbiAgd3JhcERlc3Ryb3ksXG59IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBjcmVhdGVMYXlvdXQgfSBmcm9tIFwiLi4vLi4vbGF5b3V0XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyaW5nQ29uZmlnIHtcbiAgdGVtcGxhdGU/OiAoXG4gICAgaXRlbTogYW55LFxuICAgIGluZGV4OiBudW1iZXIsXG4gICkgPT4gc3RyaW5nIHwgSFRNTEVsZW1lbnQgfCBhbnlbXSB8IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIG92ZXJzY2FuPzogbnVtYmVyO1xuICBtZWFzdXJlSXRlbXM/OiBib29sZWFuO1xuICBlbmFibGVSZWN5Y2xpbmc/OiBib29sZWFuO1xuICBtYXhQb29sU2l6ZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIE1haW50YWluIERPTSBvcmRlciB0byBtYXRjaCB2aXN1YWwgaW5kZXggb3JkZXIuXG4gICAqIEVuYWJsZXMgQ1NTIHNlbGVjdG9ycyBsaWtlIDpmaXJzdC1jaGlsZCwgOm50aC1jaGlsZCgpIHRvIHdvcmsgY29ycmVjdGx5LlxuICAgKiBEZWZhdWx0OiB0cnVlXG4gICAqL1xuICBtYWludGFpbkRvbU9yZGVyPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFZpZXdwb3J0U3RhdGUge1xuICBzY3JvbGxQb3NpdGlvbjogbnVtYmVyO1xuICB0b3RhbEl0ZW1zOiBudW1iZXI7XG4gIGl0ZW1TaXplOiBudW1iZXI7XG4gIGNvbnRhaW5lclNpemU6IG51bWJlcjtcbiAgdmlydHVhbFRvdGFsU2l6ZTogbnVtYmVyO1xuICB2aXNpYmxlUmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfTtcbiAgaXRlbXNDb250YWluZXI6IEhUTUxFbGVtZW50IHwgbnVsbDtcbn1cblxuLyoqXG4gKiBSZW5kZXJpbmcgZmVhdHVyZSBmb3Igdmlld3BvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhSZW5kZXJpbmcgPSAoY29uZmlnOiBSZW5kZXJpbmdDb25maWcgPSB7fSkgPT4ge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBWaWV3cG9ydENvbXBvbmVudD4oY29tcG9uZW50OiBUKTogVCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgdGVtcGxhdGUsXG4gICAgICBvdmVyc2NhbiA9IDUsXG4gICAgICBtZWFzdXJlSXRlbXMgPSBmYWxzZSxcbiAgICAgIGVuYWJsZVJlY3ljbGluZyA9IHRydWUsXG4gICAgICBtYXhQb29sU2l6ZSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5SRU5ERVJJTkcuREVGQVVMVF9NQVhfUE9PTF9TSVpFLFxuICAgICAgbWFpbnRhaW5Eb21PcmRlciA9IHRydWUsXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIEhlbHBlciB0byBnZXQgaXRlbXMgZnJvbSBjb2xsZWN0aW9uIChzaW5nbGUgc291cmNlIG9mIHRydXRoKVxuICAgIGNvbnN0IGdldENvbGxlY3Rpb25JdGVtcyA9ICgpOiBhbnlbXSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbj8uaXRlbXMgfHwgKGNvbXBvbmVudCBhcyBhbnkpLml0ZW1zIHx8IFtdXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvLyBTdGF0ZVxuICAgIGNvbnN0IHJlbmRlcmVkRWxlbWVudHMgPSBuZXcgTWFwPG51bWJlciwgSFRNTEVsZW1lbnQ+KCk7XG4gICAgY29uc3QgZWxlbWVudFBvb2w6IEhUTUxFbGVtZW50W10gPSBbXTtcbiAgICBjb25zdCBwb29sU3RhdHMgPSB7IGNyZWF0ZWQ6IDAsIHJlY3ljbGVkOiAwLCBwb29sU2l6ZTogMCwgcmVsZWFzZWQ6IDAgfTtcblxuICAgIC8vIFN0b3JlIGxheW91dCByZXN1bHRzIGZvciBwcm9wZXIgY2xlYW51cCAocHJldmVudHMgbWVtb3J5IGxlYWspXG4gICAgY29uc3QgbGF5b3V0UmVzdWx0cyA9IG5ldyBXZWFrTWFwPEhUTUxFbGVtZW50LCB7IGRlc3Ryb3k6ICgpID0+IHZvaWQgfT4oKTtcblxuICAgIC8vIFJldXNhYmxlIHRlbXBsYXRlIGVsZW1lbnQgZm9yIEhUTUwgc3RyaW5nIHBhcnNpbmcgKG1vcmUgZWZmaWNpZW50IHRoYW4gZGl2KVxuICAgIGNvbnN0IHRlbXBsYXRlUGFyc2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuXG4gICAgbGV0IHZpZXdwb3J0U3RhdGU6IFZpZXdwb3J0U3RhdGUgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgY3VycmVudFZpc2libGVSYW5nZSA9IHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xuICAgIGxldCBsYXN0UmVuZGVyVGltZSA9IDA7XG4gICAgbGV0IGlzUmVtb3ZpbmdJdGVtID0gZmFsc2U7XG5cbiAgICAvLyBFbGVtZW50IHBvb2wgbWFuYWdlbWVudFxuICAgIGNvbnN0IGdldFBvb2xlZEVsZW1lbnQgPSAoKTogSFRNTEVsZW1lbnQgPT4ge1xuICAgICAgaWYgKGVuYWJsZVJlY3ljbGluZyAmJiBlbGVtZW50UG9vbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHBvb2xTdGF0cy5yZWN5Y2xlZCsrO1xuICAgICAgICByZXR1cm4gZWxlbWVudFBvb2wucG9wKCkhO1xuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBlbGVtZW50LmNsYXNzTmFtZSA9IFwibXRybC12aWV3cG9ydC1pdGVtXCI7XG4gICAgICBwb29sU3RhdHMuY3JlYXRlZCsrO1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlbGVhc2VFbGVtZW50ID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCA9PiB7XG4gICAgICBwb29sU3RhdHMucmVsZWFzZWQrKztcblxuICAgICAgLy8gQ1JJVElDQUw6IENhbGwgZGVzdHJveSBvbiBsYXlvdXRSZXN1bHQgdG8gY2xlYW4gdXAgY29tcG9uZW50cyBhbmQgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAvLyBUaGlzIGZpeGVzIHRoZSBtZW1vcnkgbGVhayB3aGVuIHVzaW5nIGxheW91dCB0ZW1wbGF0ZXNcbiAgICAgIGNvbnN0IGxheW91dFJlc3VsdCA9IGxheW91dFJlc3VsdHMuZ2V0KGVsZW1lbnQpO1xuICAgICAgaWYgKGxheW91dFJlc3VsdCAmJiB0eXBlb2YgbGF5b3V0UmVzdWx0LmRlc3Ryb3kgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxheW91dFJlc3VsdC5kZXN0cm95KCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBJZ25vcmUgZGVzdHJveSBlcnJvcnMgLSBlbGVtZW50IG1heSBhbHJlYWR5IGJlIGNsZWFuZWQgdXBcbiAgICAgICAgfVxuICAgICAgICBsYXlvdXRSZXN1bHRzLmRlbGV0ZShlbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbmFibGVSZWN5Y2xpbmcpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gQ2xlYW4gZWxlbWVudCBmb3IgcmV1c2UgKG5vIGNsb25pbmcgLSByZXVzZSB0aGUgYWN0dWFsIGVsZW1lbnQpXG4gICAgICBlbGVtZW50LmNsYXNzTmFtZSA9IFwibXRybC12aWV3cG9ydC1pdGVtXCI7XG4gICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShcImRhdGEtaW5kZXhcIik7XG4gICAgICBlbGVtZW50LnN0eWxlLmNzc1RleHQgPSBcIlwiO1xuICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSBcIlwiO1xuXG4gICAgICAvLyBSZW1vdmUgZnJvbSBET00gZmlyc3RcbiAgICAgIGlmIChlbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgdG8gcG9vbCBpZiBub3QgZnVsbFxuICAgICAgaWYgKGVsZW1lbnRQb29sLmxlbmd0aCA8IG1heFBvb2xTaXplKSB7XG4gICAgICAgIGVsZW1lbnRQb29sLnB1c2goZWxlbWVudCk7XG4gICAgICAgIHBvb2xTdGF0cy5wb29sU2l6ZSA9IGVsZW1lbnRQb29sLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIC8vIElmIHBvb2wgaXMgZnVsbCwgZWxlbWVudCBpcyBqdXN0IGRlcmVmZXJlbmNlZCBhbmQgR0MnZFxuICAgIH07XG5cbiAgICAvLyBJbml0aWFsaXplXG4gICAgd3JhcEluaXRpYWxpemUoY29tcG9uZW50LCAoKSA9PiB7XG4gICAgICB2aWV3cG9ydFN0YXRlID0gZ2V0Vmlld3BvcnRTdGF0ZShjb21wb25lbnQpIGFzIFZpZXdwb3J0U3RhdGU7XG5cbiAgICAgIC8vIFNldCBpbml0aWFsIGl0ZW1zIGNvbnRhaW5lciBoZWlnaHQgZnJvbSBjdXJyZW50IHZpcnR1YWwgc2l6ZVxuICAgICAgaWYgKHZpZXdwb3J0U3RhdGU/Lml0ZW1zQ29udGFpbmVyICYmIHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZSA+IDApIHtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS5pdGVtc0NvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBgJHt2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemV9cHhgO1xuICAgICAgfVxuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGl0ZW0gdXBkYXRlIHJlcXVlc3RzIGZyb20gQVBJXG4gICAgICBjb21wb25lbnQub24/LihcIml0ZW06dXBkYXRlLXJlcXVlc3RcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB7IGluZGV4LCBpdGVtLCBwcmV2aW91c0l0ZW0gfSA9IGRhdGE7XG5cbiAgICAgICAgLy8gSXRlbSBpcyBhbHJlYWR5IHVwZGF0ZWQgaW4gY29sbGVjdGlvbi5pdGVtcyBieSBhcGkudHNcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGl0ZW0gaXMgY3VycmVudGx5IHJlbmRlcmVkXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGluZGV4KTtcbiAgICAgICAgY29uc3Qgd2FzVmlzaWJsZSA9ICEhZXhpc3RpbmdFbGVtZW50O1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGl0ZW0gd2FzIHNlbGVjdGVkIGJlZm9yZSB1cGRhdGVcbiAgICAgICAgY29uc3Qgd2FzU2VsZWN0ZWQgPSBleGlzdGluZ0VsZW1lbnRcbiAgICAgICAgICA/IGhhc0NsYXNzKFxuICAgICAgICAgICAgICBleGlzdGluZ0VsZW1lbnQsXG4gICAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5TRUxFQ1RJT04uU0VMRUNURURfQ0xBU1MsXG4gICAgICAgICAgICApIHx8IGhhc0NsYXNzKGV4aXN0aW5nRWxlbWVudCwgXCJtdHJsLXZpZXdwb3J0LWl0ZW0tLXNlbGVjdGVkXCIpXG4gICAgICAgICAgOiBmYWxzZTtcblxuICAgICAgICBpZiAoZXhpc3RpbmdFbGVtZW50ICYmIGV4aXN0aW5nRWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgLy8gUmUtcmVuZGVyIHRoZSBpdGVtXG4gICAgICAgICAgY29uc3QgbmV3RWxlbWVudCA9IHJlbmRlckl0ZW0oaXRlbSwgaW5kZXgpO1xuXG4gICAgICAgICAgaWYgKG5ld0VsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIENvcHkgcG9zaXRpb24gc3R5bGVzIGZyb20gZXhpc3RpbmcgZWxlbWVudFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihuZXdFbGVtZW50LnN0eWxlLCB7XG4gICAgICAgICAgICAgIHBvc2l0aW9uOiBleGlzdGluZ0VsZW1lbnQuc3R5bGUucG9zaXRpb24sXG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogZXhpc3RpbmdFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgd2lkdGg6IGV4aXN0aW5nRWxlbWVudC5zdHlsZS53aWR0aCxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBQcmVzZXJ2ZSBzZWxlY3RlZCBzdGF0ZVxuICAgICAgICAgICAgaWYgKHdhc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgIGFkZENsYXNzKG5ld0VsZW1lbnQsIFZJRVdQT1JUX0NPTlNUQU5UUy5TRUxFQ1RJT04uU0VMRUNURURfQ0xBU1MpO1xuICAgICAgICAgICAgICBhZGRDbGFzcyhuZXdFbGVtZW50LCBcIm10cmwtdmlld3BvcnQtaXRlbS0tc2VsZWN0ZWRcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCB1cGRhdGUgYW5pbWF0aW9uIGNsYXNzIHRvIGlubmVyIGNvbnRlbnQgZm9yIHZpc2liaWxpdHlcbiAgICAgICAgICAgIGFkZENsYXNzKG5ld0VsZW1lbnQsIFwidmlld3BvcnQtaXRlbS0tdXBkYXRlZFwiKTtcbiAgICAgICAgICAgIC8vIEFsc28gdHJ5IHRvIGFkZCB0byBmaXJzdCBjaGlsZCBpZiBpdCBleGlzdHMgKHRoZSBhY3R1YWwgaXRlbSBjb250ZW50KVxuICAgICAgICAgICAgY29uc3QgaW5uZXJJdGVtID0gbmV3RWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGlmIChpbm5lckl0ZW0pIHtcbiAgICAgICAgICAgICAgYWRkQ2xhc3MoaW5uZXJJdGVtLCBcIml0ZW0tLXVwZGF0ZWRcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlcGxhY2UgaW4gRE9NXG4gICAgICAgICAgICBleGlzdGluZ0VsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoXG4gICAgICAgICAgICAgIG5ld0VsZW1lbnQsXG4gICAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNldChpbmRleCwgbmV3RWxlbWVudCk7XG4gICAgICAgICAgICByZWxlYXNlRWxlbWVudChleGlzdGluZ0VsZW1lbnQpO1xuXG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGFuaW1hdGlvbiBjbGFzcyBhZnRlciB0cmFuc2l0aW9uXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MobmV3RWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtLS11cGRhdGVkXCIpO1xuICAgICAgICAgICAgICBpZiAoaW5uZXJJdGVtKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MoaW5uZXJJdGVtLCBcIml0ZW0tLXVwZGF0ZWRcIik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDUwMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBjb21wbGV0aW9uIGV2ZW50XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtOnVwZGF0ZWRcIiwge1xuICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgcHJldmlvdXNJdGVtLFxuICAgICAgICAgIHdhc1Zpc2libGUsXG4gICAgICAgICAgd2FzU2VsZWN0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgaXRlbSByZW1vdmUgcmVxdWVzdHMgZnJvbSBBUElcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiaXRlbTpyZW1vdmUtcmVxdWVzdFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIGl0ZW0gfSA9IGRhdGE7XG4gICAgICAgIGlzUmVtb3ZpbmdJdGVtID0gdHJ1ZTtcblxuICAgICAgICAvLyBJdGVtIGlzIGFscmVhZHkgcmVtb3ZlZCBmcm9tIGNvbGxlY3Rpb24uaXRlbXMgYnkgYXBpLnRzXG4gICAgICAgIC8vIFdlIGp1c3QgbmVlZCB0byB1cGRhdGUgcmVuZGVyZWQgZWxlbWVudHNcblxuICAgICAgICAvLyBSZW1vdmUgdGhlIHJlbmRlcmVkIGVsZW1lbnQgYXQgdGhpcyBpbmRleFxuICAgICAgICBjb25zdCBleGlzdGluZ0VsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnRzLmdldChpbmRleCk7XG4gICAgICAgIGlmIChleGlzdGluZ0VsZW1lbnQgJiYgZXhpc3RpbmdFbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICByZWxlYXNlRWxlbWVudChleGlzdGluZ0VsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcmVkRWxlbWVudHMuZGVsZXRlKGluZGV4KTtcblxuICAgICAgICAvLyBTaGlmdCByZW5kZXJlZCBlbGVtZW50cyBpbmRpY2VzIGRvd25cbiAgICAgICAgY29uc3QgcmVuZGVyZWRLZXlzID0gQXJyYXkuZnJvbShyZW5kZXJlZEVsZW1lbnRzLmtleXMoKSkuc29ydChcbiAgICAgICAgICAoYSwgYikgPT4gYSAtIGIsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IG5ld1JlbmRlcmVkRWxlbWVudHMgPSBuZXcgTWFwPG51bWJlciwgSFRNTEVsZW1lbnQ+KCk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHJlbmRlcmVkS2V5cykge1xuICAgICAgICAgIGlmIChrZXkgPiBpbmRleCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAvLyBVcGRhdGUgZGF0YS1pbmRleCBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgZWxlbWVudC5kYXRhc2V0LmluZGV4ID0gU3RyaW5nKGtleSAtIDEpO1xuICAgICAgICAgICAgICBuZXdSZW5kZXJlZEVsZW1lbnRzLnNldChrZXkgLSAxLCBlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGtleSA8IGluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50cy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgIG5ld1JlbmRlcmVkRWxlbWVudHMuc2V0KGtleSwgZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlbmRlcmVkRWxlbWVudHMuY2xlYXIoKTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBlbGVtZW50XSBvZiBuZXdSZW5kZXJlZEVsZW1lbnRzKSB7XG4gICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5zZXQoa2V5LCBlbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlY3JlbWVudCB0b3RhbEl0ZW1zIE5PVyBzbyByZW5kZXJJdGVtcygpIHVzZXMgdGhlIGNvcnJlY3QgY291bnRcbiAgICAgICAgLy8gc2V0VG90YWxJdGVtcygpIHdpbGwgYmUgY2FsbGVkIGxhdGVyIGJ5IHRoZSBBUEksIHdoaWNoIHdpbGwgZW1pdFxuICAgICAgICAvLyB2aWV3cG9ydDp0b3RhbC1pdGVtcy1jaGFuZ2VkIGZvciB2aXJ0dWFsIHNpemUgcmVjYWxjdWxhdGlvblxuICAgICAgICBpZiAodmlld3BvcnRTdGF0ZSAmJiB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgPiAwKSB7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zLS07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXNldCB2aXNpYmxlIHJhbmdlIHRvIGZvcmNlIHJlLXJlbmRlclxuICAgICAgICBjdXJyZW50VmlzaWJsZVJhbmdlID0geyBzdGFydDogLTEsIGVuZDogLTEgfTtcblxuICAgICAgICAvLyBFbWl0IGNvbXBsZXRpb24gZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW06cmVtb3ZlZFwiLCB7XG4gICAgICAgICAgaXRlbSxcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTk9URTogRG8gTk9UIGNsZWFyIGxvYWRlZFJhbmdlcyBvciBjYWxsIGxvYWRNaXNzaW5nUmFuZ2VzIGhlcmUhXG4gICAgICAgIC8vIFRoZSBpdGVtcyBhcnJheSBoYXMgYmVlbiBzcGxpY2VkIGluLXBsYWNlIGJ5IGFwaS50cywgc28gdGhlIGRhdGEgaXNcbiAgICAgICAgLy8gYWxyZWFkeSBpbiBtZW1vcnkuIFdoZW4gdGhlIHVzZXIgc2Nyb2xscyBhbmQgdGhlIHZpc2libGUgcmFuZ2UgY2hhbmdlcyxcbiAgICAgICAgLy8gdGhlIG5vcm1hbCB2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkIGhhbmRsZXIgd2lsbCBmZXRjaCBtaXNzaW5nIGRhdGEgaWYgbmVlZGVkLlxuICAgICAgICAvLyBDbGVhcmluZyBsb2FkZWRSYW5nZXMgaGVyZSB3b3VsZCB0cmlnZ2VyIGFuIHVubmVjZXNzYXJ5IGZldGNoIG9uIGV2ZXJ5IHJlbW92YWwuXG5cbiAgICAgICAgLy8gVHJpZ2dlciByZS1yZW5kZXIgKHVzZXMgZGF0YSBhbHJlYWR5IGluIG1lbW9yeSlcbiAgICAgICAgcmVuZGVySXRlbXMoKTtcbiAgICAgICAgaXNSZW1vdmluZ0l0ZW0gPSBmYWxzZTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGl0ZW1zIGFkZCByZXF1ZXN0cyBmcm9tIEFQSVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJpdGVtczphZGQtcmVxdWVzdFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaXRlbXM6IG5ld0l0ZW1zLCBwb3NpdGlvbiwgcHJldmlvdXNDb3VudCB9ID0gZGF0YTtcblxuICAgICAgICBpZiAoIW5ld0l0ZW1zIHx8IG5ld0l0ZW1zLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIEl0ZW1zIGFyZSBhbHJlYWR5IGFkZGVkIHRvIGNvbGxlY3Rpb24uaXRlbXMgYnkgYXBpLnRzXG4gICAgICAgIC8vIFdlIGp1c3QgbmVlZCB0byB1cGRhdGUgcmVuZGVyZWQgZWxlbWVudHMgaW5kaWNlcyBpZiBwcmVwZW5kaW5nXG5cbiAgICAgICAgY29uc3QgaXRlbXNBZGRlZCA9IG5ld0l0ZW1zLmxlbmd0aDtcblxuICAgICAgICBpZiAocG9zaXRpb24gPT09IFwic3RhcnRcIikge1xuICAgICAgICAgIC8vIEl0ZW1zIHdlcmUgcHJlcGVuZGVkIC0gc2hpZnQgcmVuZGVyZWQgZWxlbWVudCBpbmRpY2VzXG4gICAgICAgICAgY29uc3QgcmVuZGVyZWRLZXlzID0gQXJyYXkuZnJvbShyZW5kZXJlZEVsZW1lbnRzLmtleXMoKSkuc29ydChcbiAgICAgICAgICAgIChhLCBiKSA9PiBiIC0gYSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IG5ld1JlbmRlcmVkRWxlbWVudHMgPSBuZXcgTWFwPG51bWJlciwgSFRNTEVsZW1lbnQ+KCk7XG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgcmVuZGVyZWRLZXlzKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50cy5nZXQoa2V5KSE7XG4gICAgICAgICAgICBjb25zdCBuZXdJbmRleCA9IGtleSArIGl0ZW1zQWRkZWQ7XG4gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtaW5kZXhcIiwgU3RyaW5nKG5ld0luZGV4KSk7XG4gICAgICAgICAgICBuZXdSZW5kZXJlZEVsZW1lbnRzLnNldChuZXdJbmRleCwgZWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuY2xlYXIoKTtcbiAgICAgICAgICBuZXdSZW5kZXJlZEVsZW1lbnRzLmZvckVhY2goKGVsLCBpZHgpID0+XG4gICAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNldChpZHgsIGVsKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZvciBhcHBlbmQsIG5vIGluZGV4IHNoaWZ0aW5nIG5lZWRlZFxuXG4gICAgICAgIC8vIFVwZGF0ZSB0b3RhbEl0ZW1zIGluIHZpZXdwb3J0U3RhdGVcbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgPVxuICAgICAgICAgICAgKHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyB8fCAwKSArIGl0ZW1zQWRkZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXNldCB2aXNpYmxlIHJhbmdlIHRvIGZvcmNlIHJlLXJlbmRlclxuICAgICAgICBjdXJyZW50VmlzaWJsZVJhbmdlID0geyBzdGFydDogLTEsIGVuZDogLTEgfTtcblxuICAgICAgICAvLyBDbGVhciBsb2FkZWRSYW5nZXMgdG8gZW5zdXJlIHByb3BlciByZWxvYWQgdHJhY2tpbmdcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KT8uY29sbGVjdGlvbjtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24/LmdldExvYWRlZFJhbmdlcykge1xuICAgICAgICAgIGNvbnN0IGxvYWRlZFJhbmdlcyA9IGNvbGxlY3Rpb24uZ2V0TG9hZGVkUmFuZ2VzKCk7XG4gICAgICAgICAgbG9hZGVkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmlnZ2VyIHJlLXJlbmRlclxuICAgICAgICByZW5kZXJJdGVtcygpO1xuXG4gICAgICAgIC8vIEVtaXQgY29tcGxldGlvbiBldmVudFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiaXRlbXM6cmVuZGVyLWNvbXBsZXRlXCIsIHtcbiAgICAgICAgICBpdGVtczogbmV3SXRlbXMsXG4gICAgICAgICAgcG9zaXRpb24sXG4gICAgICAgICAgdG90YWw6IHZpZXdwb3J0U3RhdGU/LnRvdGFsSXRlbXMgfHwgMCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBjb2xsZWN0aW9uIGl0ZW1zIGV2aWN0ZWQgLSBjbGVhbiB1cCByZW5kZXJlZCBlbGVtZW50c1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJjb2xsZWN0aW9uOml0ZW1zLWV2aWN0ZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB7IGtlZXBTdGFydCwga2VlcEVuZCB9ID0gZGF0YTtcblxuICAgICAgICAvLyBSZWxlYXNlIHJlbmRlcmVkIGVsZW1lbnRzIG91dHNpZGUgdGhlIGtlZXAgcmFuZ2VcbiAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmIChpbmRleCA8IGtlZXBTdGFydCB8fCBpbmRleCA+IGtlZXBFbmQpIHtcbiAgICAgICAgICAgIHJlbGVhc2VFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5kZWxldGUoaW5kZXgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciByZWxvYWQ6c3RhcnQgdG8gcmVzZXQgZmVhdHVyZS1zcGVjaWZpYyBzdGF0ZVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJyZWxvYWQ6c3RhcnRcIiwgKCkgPT4ge1xuICAgICAgICAvLyBSZXNldCB2aXNpYmxlIHJhbmdlIHRyYWNraW5nXG4gICAgICAgIGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB7IHN0YXJ0OiAtMSwgZW5kOiAtMSB9O1xuICAgICAgICBsYXN0UmVuZGVyVGltZSA9IDA7XG4gICAgICAgIGlzUmVtb3ZpbmdJdGVtID0gZmFsc2U7XG5cbiAgICAgICAgLy8gQ2xlYXIgZWxlbWVudCBwb29sIHRvIGZyZWUgbWVtb3J5XG4gICAgICAgIGVsZW1lbnRQb29sLmxlbmd0aCA9IDA7XG4gICAgICAgIHBvb2xTdGF0cy5wb29sU2l6ZSA9IDA7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBjb2xsZWN0aW9uIHJlc2V0IHRvIGNsZWFyIHJlbmRlcmluZyBzdGF0ZVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJjb2xsZWN0aW9uOnJlc2V0XCIsICgpID0+IHtcbiAgICAgICAgLy8gUmVsZWFzZSBhbmQgY2xlYXIgYWxsIHJlbmRlcmVkIGVsZW1lbnRzXG4gICAgICAgIHJlbmRlcmVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgIHJlbGVhc2VFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5jbGVhcigpO1xuXG4gICAgICAgIC8vIFJlc2V0IHZpc2libGUgcmFuZ2UgdHJhY2tpbmdcbiAgICAgICAgY3VycmVudFZpc2libGVSYW5nZSA9IHsgc3RhcnQ6IC0xLCBlbmQ6IC0xIH07XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBwb29sIGNsZWFyIHJlcXVlc3QgKG9uIHJlbG9hZClcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6Y2xlYXItcG9vbFwiLCAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFyIGVsZW1lbnQgcG9vbCB0byBmcmVlIG1lbW9yeVxuICAgICAgICBlbGVtZW50UG9vbC5sZW5ndGggPSAwO1xuICAgICAgICBwb29sU3RhdHMucG9vbFNpemUgPSAwO1xuXG4gICAgICAgIC8vIFJlc2V0IGxhc3QgcmVuZGVyIHRpbWUgdG8gYXZvaWQgc3RhbGUgY2FsY3VsYXRpb25zXG4gICAgICAgIGxhc3RSZW5kZXJUaW1lID0gMDtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGNvbGxlY3Rpb24gZGF0YSBsb2FkZWRcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiY29sbGVjdGlvbjpyYW5nZS1sb2FkZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBpZiAoIWRhdGEuaXRlbXM/Lmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIEFuYWx5emUgZGF0YSBzdHJ1Y3R1cmUgb24gZmlyc3QgbG9hZFxuICAgICAgICBjb25zdCBwbGFjZWhvbGRlcnMgPSAoY29tcG9uZW50IGFzIGFueSkucGxhY2Vob2xkZXJzO1xuICAgICAgICBpZiAocGxhY2Vob2xkZXJzICYmICFwbGFjZWhvbGRlcnMuaGFzQW5hbHl6ZWRTdHJ1Y3R1cmUoKSkge1xuICAgICAgICAgIHBsYWNlaG9sZGVycy5hbmFseXplRGF0YVN0cnVjdHVyZShkYXRhLml0ZW1zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEl0ZW1zIGFyZSBhbHJlYWR5IGluIGNvbGxlY3Rpb24uaXRlbXMgLSByZXBsYWNlIGFueSBwbGFjZWhvbGRlciBET00gZWxlbWVudHNcbiAgICAgICAgZGF0YS5pdGVtcy5mb3JFYWNoKChpdGVtOiBhbnksIGk6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gZGF0YS5vZmZzZXQgKyBpO1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnRzLmdldChpbmRleCk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiBjdXJyZW50IHJlbmRlcmVkIGVsZW1lbnQgaXMgYSBwbGFjZWhvbGRlciB0aGF0IG5lZWRzIHJlcGxhY2luZ1xuICAgICAgICAgIC8vIE5vdGU6IFRoZSBhY3R1YWwgY2xhc3MgaGFzICdtdHJsLScgcHJlZml4LCBzbyBjaGVjayBmb3IgYm90aFxuICAgICAgICAgIGNvbnN0IGlzUGxhY2Vob2xkZXJFbGVtZW50ID1cbiAgICAgICAgICAgIGVsZW1lbnQ/LmNsYXNzTGlzdC5jb250YWlucyhWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuQ0xBU1MpIHx8XG4gICAgICAgICAgICBlbGVtZW50Py5jbGFzc0xpc3QuY29udGFpbnMoXG4gICAgICAgICAgICAgIGBtdHJsLSR7VklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLkNMQVNTfWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGlmIChpc1BsYWNlaG9sZGVyRWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgbmV3RWxlbWVudCA9IHJlbmRlckl0ZW0oaXRlbSwgaW5kZXgpO1xuICAgICAgICAgICAgaWYgKG5ld0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgLy8gUmVtb3ZlIHBsYWNlaG9sZGVyIGNsYXNzZXMgZnJvbSB3cmFwcGVyXG4gICAgICAgICAgICAgIHJlbW92ZUNsYXNzKG5ld0VsZW1lbnQsIFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5DTEFTUyk7XG4gICAgICAgICAgICAgIC8vIEFsc28gcmVtb3ZlIGZyb20gaW5uZXIgZWxlbWVudCAoZm9yIHN0cmluZyB0ZW1wbGF0ZXMpXG4gICAgICAgICAgICAgIGlmIChuZXdFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MoXG4gICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLkNMQVNTLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBBZGQgcmVwbGFjZWQgY2xhc3MgZm9yIGZhZGUtaW4gYW5pbWF0aW9uXG4gICAgICAgICAgICAgIGFkZENsYXNzKG5ld0VsZW1lbnQsIFwidmlld3BvcnQtaXRlbS0tcmVwbGFjZWRcIik7XG5cbiAgICAgICAgICAgICAgLy8gQ29weSBwb3NpdGlvbiBhbmQgcmVwbGFjZVxuICAgICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obmV3RWxlbWVudC5zdHlsZSwge1xuICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGVsZW1lbnQuc3R5bGUucG9zaXRpb24sXG4gICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IGVsZW1lbnQuc3R5bGUudHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgICAgd2lkdGg6IGVsZW1lbnQuc3R5bGUud2lkdGgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5wYXJlbnROb2RlPy5yZXBsYWNlQ2hpbGQobmV3RWxlbWVudCwgZWxlbWVudCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5zZXQoaW5kZXgsIG5ld0VsZW1lbnQpO1xuICAgICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJlbGVhc2VFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSByZXBsYWNlZCBjbGFzcyBhZnRlciBhbmltYXRpb24gY29tcGxldGVzXG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzKG5ld0VsZW1lbnQsIFwidmlld3BvcnQtaXRlbS0tcmVwbGFjZWRcIik7XG4gICAgICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyByZW5kZXJJdGVtIHJldHVybmVkIG51bGwgLSBzdGlsbCByZWxlYXNlIHRoZSBvbGQgZWxlbWVudFxuICAgICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJlbGVhc2VFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuZGVsZXRlKGluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8gcmVuZGVyIG5ldyBpdGVtcyAoaXRlbXMgdGhhdCB3ZXJlbid0IHJlbmRlcmVkIGF0IGFsbClcbiAgICAgICAgY29uc3QgeyB2aXNpYmxlUmFuZ2UgfSA9IHZpZXdwb3J0U3RhdGUgfHwge307XG4gICAgICAgIGlmICh2aXNpYmxlUmFuZ2UpIHtcbiAgICAgICAgICBjb25zdCByZW5kZXJTdGFydCA9IE1hdGgubWF4KDAsIHZpc2libGVSYW5nZS5zdGFydCAtIG92ZXJzY2FuKTtcbiAgICAgICAgICBjb25zdCByZW5kZXJFbmQgPSBNYXRoLm1pbihcbiAgICAgICAgICAgIHZpZXdwb3J0U3RhdGU/LnRvdGFsSXRlbXMgPz8gMCAtIDEsXG4gICAgICAgICAgICB2aXNpYmxlUmFuZ2UuZW5kICsgb3ZlcnNjYW4sXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBsb2FkZWRTdGFydCA9IGRhdGEub2Zmc2V0O1xuICAgICAgICAgIGNvbnN0IGxvYWRlZEVuZCA9IGRhdGEub2Zmc2V0ICsgZGF0YS5pdGVtcy5sZW5ndGggLSAxO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgbG9hZGVkIGRhdGEgb3ZlcmxhcHMgd2l0aCByZW5kZXIgcmFuZ2UgYW5kIHdlJ3JlIG1pc3NpbmcgcmVuZGVyZWQgZWxlbWVudHNcbiAgICAgICAgICBjb25zdCBuZWVkc1JlbmRlciA9XG4gICAgICAgICAgICBsb2FkZWRTdGFydCA8PSByZW5kZXJFbmQgJiZcbiAgICAgICAgICAgIGxvYWRlZEVuZCA+PSByZW5kZXJTdGFydCAmJlxuICAgICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5zaXplIDwgcmVuZGVyRW5kIC0gcmVuZGVyU3RhcnQgKyAxO1xuXG4gICAgICAgICAgaWYgKG5lZWRzUmVuZGVyKSByZW5kZXJJdGVtcygpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBldmVudHNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6cmFuZ2UtY2hhbmdlZFwiLCByZW5kZXJJdGVtcyk7XG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnNjcm9sbFwiLCB1cGRhdGVJdGVtUG9zaXRpb25zKTtcblxuICAgICAgLy8gVXBkYXRlIGl0ZW1zIGNvbnRhaW5lciBoZWlnaHQgd2hlbiB2aXJ0dWFsIHNpemUgY2hhbmdlc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDp2aXJ0dWFsLXNpemUtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlPy5pdGVtc0NvbnRhaW5lciAmJlxuICAgICAgICAgIGRhdGEudG90YWxWaXJ0dWFsU2l6ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuaXRlbXNDb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gYCR7ZGF0YS50b3RhbFZpcnR1YWxTaXplfXB4YDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZW1wbGF0ZSBoZWxwZXJzXG4gICAgY29uc3QgZ2V0RGVmYXVsdFRlbXBsYXRlID0gKCkgPT4gKGl0ZW06IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgLy8gVXNlIGxheW91dCBzeXN0ZW0gZm9yIGRlZmF1bHQgdGVtcGxhdGVcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0YWc6IFwiZGl2XCIsXG4gICAgICAgICAgY2xhc3M6IFwidmlld3BvcnQtaXRlbVwiLFxuICAgICAgICAgIHRleHQ6XG4gICAgICAgICAgICB0eXBlb2YgaXRlbSA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgICA/IGl0ZW0ubmFtZSB8fCBpdGVtLmxhYmVsIHx8IGl0ZW0udGV4dCB8fCBgSXRlbSAke2luZGV4fWBcbiAgICAgICAgICAgICAgOiBTdHJpbmcoaXRlbSksXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH07XG5cbiAgICAvLyBQcm9jZXNzIGxheW91dCBzY2hlbWEgd2l0aCBpdGVtIGRhdGEgc3Vic3RpdHV0aW9uXG4gICAgY29uc3QgcHJvY2Vzc0xheW91dFNjaGVtYSA9IChcbiAgICAgIHNjaGVtYTogYW55LFxuICAgICAgaXRlbTogYW55LFxuICAgICAgaW5kZXg6IG51bWJlcixcbiAgICApOiBhbnkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBzY2hlbWEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgLy8gSGFuZGxlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbiBsaWtlIHt7bmFtZX19LCB7e2luZGV4fX1cbiAgICAgICAgcmV0dXJuIHNjaGVtYS5yZXBsYWNlKC9cXHtcXHsoW159XSspXFx9XFx9L2csIChtYXRjaCwga2V5KSA9PiB7XG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJpbmRleFwiKSByZXR1cm4gU3RyaW5nKGluZGV4KTtcbiAgICAgICAgICBpZiAoa2V5ID09PSBcIml0ZW1cIikgcmV0dXJuIFN0cmluZyhpdGVtKTtcblxuICAgICAgICAgIC8vIEhhbmRsZSBuZXN0ZWQgcHJvcGVydGllcyBsaWtlIHt7dXNlci5uYW1lfX1cbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGtleS5zcGxpdChcIi5cIikucmVkdWNlKChvYmo6IGFueSwgcHJvcDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gb2JqPy5bcHJvcC50cmltKCldO1xuICAgICAgICAgIH0sIGl0ZW0pO1xuXG4gICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgPyBTdHJpbmcodmFsdWUpIDogbWF0Y2g7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEpKSB7XG4gICAgICAgIHJldHVybiBzY2hlbWEubWFwKChjaGlsZCkgPT4gcHJvY2Vzc0xheW91dFNjaGVtYShjaGlsZCwgaXRlbSwgaW5kZXgpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBzY2hlbWEgPT09IFwib2JqZWN0XCIgJiYgc2NoZW1hICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHByb2Nlc3NlZDogYW55ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNjaGVtYSkpIHtcbiAgICAgICAgICBwcm9jZXNzZWRba2V5XSA9IHByb2Nlc3NMYXlvdXRTY2hlbWEodmFsdWUsIGl0ZW0sIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvY2Vzc2VkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2NoZW1hO1xuICAgIH07XG5cbiAgICAvLyBQb3NpdGlvbiBjYWxjdWxhdGlvblxuICAgIGNvbnN0IGNhbGN1bGF0ZUl0ZW1Qb3NpdGlvbiA9IChcbiAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICBzY3JvbGxQb3NpdGlvbjogbnVtYmVyLFxuICAgICAgdG90YWxJdGVtczogbnVtYmVyLFxuICAgICAgaXRlbVNpemU6IG51bWJlcixcbiAgICAgIHZpcnR1YWxUb3RhbFNpemU6IG51bWJlcixcbiAgICAgIGNvbnRhaW5lclNpemU6IG51bWJlcixcbiAgICAgIHRhcmdldFNjcm9sbEluZGV4PzogbnVtYmVyLFxuICAgICk6IG51bWJlciA9PiB7XG4gICAgICBjb25zdCBhY3R1YWxUb3RhbFNpemUgPSB0b3RhbEl0ZW1zICogaXRlbVNpemU7XG4gICAgICBjb25zdCBpc0NvbXByZXNzZWQgPVxuICAgICAgICBhY3R1YWxUb3RhbFNpemUgPiB2aXJ0dWFsVG90YWxTaXplICYmIHZpcnR1YWxUb3RhbFNpemUgPiAwO1xuXG4gICAgICAvLyBJZiB3ZSBoYXZlIGEgdGFyZ2V0U2Nyb2xsSW5kZXggKGZyb20gaW5pdGlhbFNjcm9sbEluZGV4KSwgdXNlIGl0IGRpcmVjdGx5XG4gICAgICAvLyBUaGlzIGVuc3VyZXMgaXRlbXMgYXJlIHBvc2l0aW9uZWQgY29ycmVjdGx5IGV2ZW4gd2l0aCBjb21wcmVzc2lvblxuICAgICAgaWYgKHRhcmdldFNjcm9sbEluZGV4ICE9PSB1bmRlZmluZWQgJiYgdGFyZ2V0U2Nyb2xsSW5kZXggPiAwKSB7XG4gICAgICAgIC8vIFBvc2l0aW9uIGl0ZW1zIHJlbGF0aXZlIHRvIHRoZSB0YXJnZXQgaW5kZXhcbiAgICAgICAgLy8gVGhlIHRhcmdldCBpbmRleCBzaG91bGQgYXBwZWFyIGF0IHRoZSB0b3Agb2YgdGhlIHZpZXdwb3J0XG4gICAgICAgIHJldHVybiAoaW5kZXggLSB0YXJnZXRTY3JvbGxJbmRleCkgKiBpdGVtU2l6ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc0NvbXByZXNzZWQgfHwgdG90YWxJdGVtcyA9PT0gMCkge1xuICAgICAgICByZXR1cm4gaW5kZXggKiBpdGVtU2l6ZSAtIHNjcm9sbFBvc2l0aW9uO1xuICAgICAgfVxuXG4gICAgICAvLyBDb21wcmVzc2VkIHNwYWNlIGhhbmRsaW5nXG4gICAgICBjb25zdCBtYXhTY3JvbGxQb3NpdGlvbiA9IHZpcnR1YWxUb3RhbFNpemUgLSBjb250YWluZXJTaXplO1xuICAgICAgY29uc3QgZGlzdGFuY2VGcm9tQm90dG9tID0gbWF4U2Nyb2xsUG9zaXRpb24gLSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgIGNvbnN0IG5lYXJCb3R0b21UaHJlc2hvbGQgPSBjb250YWluZXJTaXplO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGRpc3RhbmNlRnJvbUJvdHRvbSA8PSBuZWFyQm90dG9tVGhyZXNob2xkICYmXG4gICAgICAgIGRpc3RhbmNlRnJvbUJvdHRvbSA+PSAtMVxuICAgICAgKSB7XG4gICAgICAgIC8vIE5lYXIgYm90dG9tIGludGVycG9sYXRpb25cbiAgICAgICAgY29uc3QgaXRlbXNBdEJvdHRvbSA9IE1hdGguZmxvb3IoY29udGFpbmVyU2l6ZSAvIGl0ZW1TaXplKTtcbiAgICAgICAgY29uc3QgZmlyc3RWaXNpYmxlQXRCb3R0b20gPSBNYXRoLm1heCgwLCB0b3RhbEl0ZW1zIC0gaXRlbXNBdEJvdHRvbSk7XG4gICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsVG90YWxTaXplO1xuICAgICAgICBjb25zdCBleGFjdFNjcm9sbEluZGV4ID0gc2Nyb2xsUmF0aW8gKiB0b3RhbEl0ZW1zO1xuICAgICAgICBjb25zdCBpbnRlcnBvbGF0aW9uID0gTWF0aC5tYXgoXG4gICAgICAgICAgMCxcbiAgICAgICAgICBNYXRoLm1pbigxLCAxIC0gZGlzdGFuY2VGcm9tQm90dG9tIC8gbmVhckJvdHRvbVRocmVzaG9sZCksXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgYm90dG9tUG9zaXRpb24gPSAoaW5kZXggLSBmaXJzdFZpc2libGVBdEJvdHRvbSkgKiBpdGVtU2l6ZTtcbiAgICAgICAgY29uc3Qgbm9ybWFsUG9zaXRpb24gPSAoaW5kZXggLSBleGFjdFNjcm9sbEluZGV4KSAqIGl0ZW1TaXplO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG5vcm1hbFBvc2l0aW9uICsgKGJvdHRvbVBvc2l0aW9uIC0gbm9ybWFsUG9zaXRpb24pICogaW50ZXJwb2xhdGlvblxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBOb3JtYWwgY29tcHJlc3NlZCBzY3JvbGxpbmdcbiAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsVG90YWxTaXplO1xuICAgICAgcmV0dXJuIChpbmRleCAtIHNjcm9sbFJhdGlvICogdG90YWxJdGVtcykgKiBpdGVtU2l6ZTtcbiAgICB9O1xuXG4gICAgLy8gUmVuZGVyIHNpbmdsZSBpdGVtXG4gICAgY29uc3QgcmVuZGVySXRlbSA9IChpdGVtOiBhbnksIGluZGV4OiBudW1iZXIpOiBIVE1MRWxlbWVudCB8IG51bGwgPT4ge1xuICAgICAgY29uc3QgaXRlbVRlbXBsYXRlID0gdGVtcGxhdGUgfHwgZ2V0RGVmYXVsdFRlbXBsYXRlKCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGl0ZW1UZW1wbGF0ZShpdGVtLCBpbmRleCk7XG4gICAgICAgIGxldCBlbGVtZW50OiBIVE1MRWxlbWVudDtcblxuICAgICAgICAvLyBDaGVjayBpZiByZXN1bHQgaXMgYSBsYXlvdXQgc2NoZW1hIChhcnJheSBvciBvYmplY3QpXG4gICAgICAgIGlmIChcbiAgICAgICAgICBBcnJheS5pc0FycmF5KHJlc3VsdCkgfHxcbiAgICAgICAgICAodHlwZW9mIHJlc3VsdCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgcmVzdWx0ICE9PSBudWxsICYmXG4gICAgICAgICAgICAhKHJlc3VsdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gUHJvY2VzcyBzY2hlbWEgdG8gc3Vic3RpdHV0ZSB2YXJpYWJsZXNcbiAgICAgICAgICBjb25zdCBwcm9jZXNzZWRTY2hlbWEgPSBwcm9jZXNzTGF5b3V0U2NoZW1hKHJlc3VsdCwgaXRlbSwgaW5kZXgpO1xuXG4gICAgICAgICAgLy8gVXNlIGxheW91dCBzeXN0ZW0gdG8gY3JlYXRlIGVsZW1lbnRcbiAgICAgICAgICBjb25zdCBsYXlvdXRSZXN1bHQgPSBjcmVhdGVMYXlvdXQocHJvY2Vzc2VkU2NoZW1hKTtcbiAgICAgICAgICBlbGVtZW50ID0gbGF5b3V0UmVzdWx0LmVsZW1lbnQ7XG5cbiAgICAgICAgICAvLyBJZiB0aGUgbGF5b3V0IGNyZWF0ZWQgYSB3cmFwcGVyLCB1c2UgaXQgZGlyZWN0bHlcbiAgICAgICAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAvLyBFbGVtZW50IGlzIGFscmVhZHkgY3JlYXRlZCBieSBsYXlvdXQgc3lzdGVtXG4gICAgICAgICAgICAvLyBTdG9yZSBsYXlvdXRSZXN1bHQgZm9yIGNsZWFudXAgd2hlbiBlbGVtZW50IGlzIHJlbGVhc2VkIChwcmV2ZW50cyBtZW1vcnkgbGVhaylcbiAgICAgICAgICAgIGxheW91dFJlc3VsdHMuc2V0KGVsZW1lbnQsIGxheW91dFJlc3VsdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZhbGxiYWNrIGlmIGxheW91dCBkaWRuJ3QgY3JlYXRlIGEgcHJvcGVyIGVsZW1lbnRcbiAgICAgICAgICAgIGVsZW1lbnQgPSBnZXRQb29sZWRFbGVtZW50KCk7XG4gICAgICAgICAgICBpZiAobGF5b3V0UmVzdWx0LmVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChsYXlvdXRSZXN1bHQuZWxlbWVudCk7XG4gICAgICAgICAgICAgIC8vIFN0b3JlIGxheW91dFJlc3VsdCBvbiB3cmFwcGVyIGVsZW1lbnQgZm9yIGNsZWFudXBcbiAgICAgICAgICAgICAgbGF5b3V0UmVzdWx0cy5zZXQoZWxlbWVudCwgbGF5b3V0UmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlc3VsdCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIC8vIFBhcnNlIEhUTUwgdXNpbmcgdGVtcGxhdGUgZWxlbWVudCAtIG9wdGltaXplZCBwYXRoXG4gICAgICAgICAgLy8gTW92ZSBub2RlcyBkaXJlY3RseSBpbnN0ZWFkIG9mIGNsb25pbmcgLSBtdWNoIGZhc3Rlciwgbm8gbWVtb3J5IG92ZXJoZWFkXG4gICAgICAgICAgdGVtcGxhdGVQYXJzZXIuaW5uZXJIVE1MID0gcmVzdWx0O1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSB0ZW1wbGF0ZVBhcnNlci5jb250ZW50O1xuXG4gICAgICAgICAgaWYgKGNvbnRlbnQuY2hpbGRyZW4ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAvLyBTaW5nbGUgcm9vdCBlbGVtZW50IC0gbW92ZSBkaXJlY3RseSAoZmFzdGVyIHRoYW4gY2xvbmVOb2RlKVxuICAgICAgICAgICAgZWxlbWVudCA9IGNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBjb250ZW50LnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xuICAgICAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgXCJtdHJsLXZpZXdwb3J0LWl0ZW1cIik7XG4gICAgICAgICAgICBpZiAoaXNQbGFjZWhvbGRlcihpdGVtKSkge1xuICAgICAgICAgICAgICBhZGRDbGFzcyhlbGVtZW50LCBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuQ0xBU1MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBNdWx0aXBsZSBjaGlsZHJlbiAtIG1vdmUgYWxsIGludG8gcG9vbGVkIGVsZW1lbnRcbiAgICAgICAgICAgIGVsZW1lbnQgPSBnZXRQb29sZWRFbGVtZW50KCk7XG4gICAgICAgICAgICB3aGlsZSAoY29udGVudC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY29udGVudC5maXJzdENoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgICBlbGVtZW50ID0gZ2V0UG9vbGVkRWxlbWVudCgpO1xuICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtSZW5kZXJpbmddIEludmFsaWQgdGVtcGxhdGUgcmVzdWx0IGZvciBpdGVtICR7aW5kZXh9YCk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgY2xhc3Nlc1xuICAgICAgICBpZiAoIWhhc0NsYXNzKGVsZW1lbnQsIFwidmlld3BvcnQtaXRlbVwiKSlcbiAgICAgICAgICBhZGRDbGFzcyhlbGVtZW50LCBcInZpZXdwb3J0LWl0ZW1cIik7XG4gICAgICAgIGlmIChpc1BsYWNlaG9sZGVyKGl0ZW0pKSB7XG4gICAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLkNMQVNTKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnQuZGF0YXNldC5pbmRleCA9IFN0cmluZyhpbmRleCk7XG5cbiAgICAgICAgLy8gQ29weSBkYXRhLWlkIGZyb20gaXRlbSB0byB2aWV3cG9ydCBlbGVtZW50IGZvciBzZWxlY3Rpb24gc3VwcG9ydFxuICAgICAgICBjb25zdCBpdGVtSWQgPSBpdGVtPy5faWQgfHwgaXRlbT8uaWQ7XG4gICAgICAgIGlmIChpdGVtSWQgIT09IHVuZGVmaW5lZCAmJiBpdGVtSWQgIT09IG51bGwpIHtcbiAgICAgICAgICBlbGVtZW50LmRhdGFzZXQuaWQgPSBTdHJpbmcoaXRlbUlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFtSZW5kZXJpbmddIEVycm9yIHJlbmRlcmluZyBpdGVtICR7aW5kZXh9OmAsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSBwb3NpdGlvbnNcbiAgICBjb25zdCB1cGRhdGVJdGVtUG9zaXRpb25zID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlIHx8IHJlbmRlcmVkRWxlbWVudHMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB7XG4gICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICBpdGVtU2l6ZTogaXRlbVNpemUsXG4gICAgICAgIHRvdGFsSXRlbXMsXG4gICAgICAgIHZpcnR1YWxUb3RhbFNpemUsXG4gICAgICAgIGNvbnRhaW5lclNpemUsXG4gICAgICB9ID0gdmlld3BvcnRTdGF0ZTtcbiAgICAgIGNvbnN0IGFjdHVhbFRvdGFsU2l6ZSA9IHRvdGFsSXRlbXMgKiBpdGVtU2l6ZTtcbiAgICAgIGNvbnN0IGlzQ29tcHJlc3NlZCA9XG4gICAgICAgIGFjdHVhbFRvdGFsU2l6ZSA+IHZpcnR1YWxUb3RhbFNpemUgJiYgdmlydHVhbFRvdGFsU2l6ZSA+IDA7XG5cbiAgICAgIGNvbnN0IHNvcnRlZEluZGljZXMgPSBBcnJheS5mcm9tKHJlbmRlcmVkRWxlbWVudHMua2V5cygpKS5zb3J0KFxuICAgICAgICAoYSwgYikgPT4gYSAtIGIsXG4gICAgICApO1xuICAgICAgaWYgKCFzb3J0ZWRJbmRpY2VzLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBmaXJzdEluZGV4ID0gc29ydGVkSW5kaWNlc1swXTtcbiAgICAgIGxldCBjdXJyZW50UG9zaXRpb24gPSAwO1xuXG4gICAgICBpZiAoaXNDb21wcmVzc2VkKSB7XG4gICAgICAgIGNvbnN0IG1heFNjcm9sbCA9IHZpcnR1YWxUb3RhbFNpemUgLSBjb250YWluZXJTaXplO1xuICAgICAgICBjb25zdCBkaXN0YW5jZUZyb21Cb3R0b20gPSBtYXhTY3JvbGwgLSBzY3JvbGxQb3NpdGlvbjtcblxuICAgICAgICBpZiAoZGlzdGFuY2VGcm9tQm90dG9tIDw9IGNvbnRhaW5lclNpemUgJiYgZGlzdGFuY2VGcm9tQm90dG9tID49IC0xKSB7XG4gICAgICAgICAgLy8gTmVhciBib3R0b20gaW50ZXJwb2xhdGlvblxuICAgICAgICAgIGNvbnN0IGl0ZW1zQXRCb3R0b20gPSBNYXRoLmZsb29yKGNvbnRhaW5lclNpemUgLyBpdGVtU2l6ZSk7XG4gICAgICAgICAgY29uc3QgZmlyc3RWaXNpYmxlQXRCb3R0b20gPSBNYXRoLm1heCgwLCB0b3RhbEl0ZW1zIC0gaXRlbXNBdEJvdHRvbSk7XG4gICAgICAgICAgY29uc3Qgc2Nyb2xsUmF0aW8gPSBzY3JvbGxQb3NpdGlvbiAvIHZpcnR1YWxUb3RhbFNpemU7XG4gICAgICAgICAgY29uc3QgZXhhY3RTY3JvbGxJbmRleCA9IHNjcm9sbFJhdGlvICogdG90YWxJdGVtcztcbiAgICAgICAgICBjb25zdCBpbnRlcnBvbGF0aW9uID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgTWF0aC5taW4oMSwgMSAtIGRpc3RhbmNlRnJvbUJvdHRvbSAvIGNvbnRhaW5lclNpemUpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBib3R0b21Qb3MgPSAoZmlyc3RJbmRleCAtIGZpcnN0VmlzaWJsZUF0Qm90dG9tKSAqIGl0ZW1TaXplO1xuICAgICAgICAgIGNvbnN0IG5vcm1hbFBvcyA9IChmaXJzdEluZGV4IC0gZXhhY3RTY3JvbGxJbmRleCkgKiBpdGVtU2l6ZTtcbiAgICAgICAgICBjdXJyZW50UG9zaXRpb24gPSBub3JtYWxQb3MgKyAoYm90dG9tUG9zIC0gbm9ybWFsUG9zKSAqIGludGVycG9sYXRpb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgc2Nyb2xsUmF0aW8gPSBzY3JvbGxQb3NpdGlvbiAvIHZpcnR1YWxUb3RhbFNpemU7XG4gICAgICAgICAgY3VycmVudFBvc2l0aW9uID0gKGZpcnN0SW5kZXggLSBzY3JvbGxSYXRpbyAqIHRvdGFsSXRlbXMpICogaXRlbVNpemU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnRQb3NpdGlvbiA9IGZpcnN0SW5kZXggKiBpdGVtU2l6ZSAtIHNjcm9sbFBvc2l0aW9uO1xuICAgICAgfVxuXG4gICAgICAvLyBQb3NpdGlvbiBlYWNoIGl0ZW1cbiAgICAgIHNvcnRlZEluZGljZXMuZm9yRWFjaCgoaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGluZGV4KTtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICBlbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKCR7TWF0aC5yb3VuZChcbiAgICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbixcbiAgICAgICAgICApfXB4KWA7XG5cbiAgICAgICAgICAvLyBTdHJhdGVnaWMgbG9nIGZvciBsYXN0IGl0ZW1zXG4gICAgICAgICAgLy8gaWYgKGluZGV4ID49IHRvdGFsSXRlbXMgLSA1KSB7XG4gICAgICAgICAgLy8gICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgICAgYFtSZW5kZXJpbmddIExhc3QgaXRlbSBwb3NpdGlvbmVkOiBpbmRleD0ke2luZGV4fSwgcG9zaXRpb249JHtNYXRoLnJvdW5kKFxuICAgICAgICAgIC8vICAgICAgIGN1cnJlbnRQb3NpdGlvblxuICAgICAgICAgIC8vICAgICApfXB4LCBpdGVtU2l6ZT0ke2l0ZW1TaXplfXB4LCB0b3RhbEl0ZW1zPSR7dG90YWxJdGVtc31gXG4gICAgICAgICAgLy8gICApO1xuICAgICAgICAgIC8vIH1cblxuICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbiArPSBpdGVtU2l6ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIE1haW4gcmVuZGVyIGZ1bmN0aW9uXG4gICAgY29uc3QgcmVuZGVySXRlbXMgPSAoKSA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGU/Lml0ZW1zQ29udGFpbmVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qge1xuICAgICAgICB2aXNpYmxlUmFuZ2UsXG4gICAgICAgIGl0ZW1zQ29udGFpbmVyLFxuICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICBpdGVtU2l6ZSxcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgIGNvbnRhaW5lclNpemUsXG4gICAgICAgIHZpcnR1YWxUb3RhbFNpemUsXG4gICAgICB9ID0gdmlld3BvcnRTdGF0ZTtcblxuICAgICAgLy8gVmFsaWRhdGUgcmFuZ2UgLSBza2lwIHJlbmRlcmluZyBpZiBubyBpdGVtcyBvciByYW5nZSBpcyBpbnZhbGlkXG4gICAgICBpZiAoXG4gICAgICAgICF2aXNpYmxlUmFuZ2UgfHxcbiAgICAgICAgdG90YWxJdGVtcyA8PSAwIHx8XG4gICAgICAgIHZpc2libGVSYW5nZS5zdGFydCA8IDAgfHxcbiAgICAgICAgdmlzaWJsZVJhbmdlLnN0YXJ0ID49IHRvdGFsSXRlbXMgfHxcbiAgICAgICAgdmlzaWJsZVJhbmdlLmVuZCA8IHZpc2libGVSYW5nZS5zdGFydCB8fFxuICAgICAgICBpc05hTih2aXNpYmxlUmFuZ2Uuc3RhcnQpIHx8XG4gICAgICAgIGlzTmFOKHZpc2libGVSYW5nZS5lbmQpXG4gICAgICApIHtcbiAgICAgICAgLy8gSWYgdG90YWxJdGVtcyBpcyAwLCBjbGVhciBhbGwgcmVuZGVyZWQgZWxlbWVudHMgdG8gcmVtb3ZlIHN0YWxlIHBsYWNlaG9sZGVyc1xuICAgICAgICBpZiAodG90YWxJdGVtcyA8PSAwICYmIHJlbmRlcmVkRWxlbWVudHMuc2l6ZSA+IDApIHtcbiAgICAgICAgICBBcnJheS5mcm9tKHJlbmRlcmVkRWxlbWVudHMuZW50cmllcygpKS5mb3JFYWNoKChbaW5kZXgsIGVsZW1lbnRdKSA9PiB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5wYXJlbnROb2RlKSByZWxlYXNlRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuZGVsZXRlKGluZGV4KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjdXJyZW50VmlzaWJsZVJhbmdlID0geyBzdGFydDogLTEsIGVuZDogLTEgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHJhbmdlIGNoYW5nZWRcbiAgICAgIGlmIChcbiAgICAgICAgdmlzaWJsZVJhbmdlLnN0YXJ0ID09PSBjdXJyZW50VmlzaWJsZVJhbmdlLnN0YXJ0ICYmXG4gICAgICAgIHZpc2libGVSYW5nZS5lbmQgPT09IGN1cnJlbnRWaXNpYmxlUmFuZ2UuZW5kICYmXG4gICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2l6ZSA+IDBcbiAgICAgICkge1xuICAgICAgICB1cGRhdGVJdGVtUG9zaXRpb25zKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGFzdFJlbmRlclRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgcmVuZGVyU3RhcnQgPSBNYXRoLm1heCgwLCB2aXNpYmxlUmFuZ2Uuc3RhcnQgLSBvdmVyc2Nhbik7XG4gICAgICBjb25zdCByZW5kZXJFbmQgPSBNYXRoLm1pbih0b3RhbEl0ZW1zIC0gMSwgdmlzaWJsZVJhbmdlLmVuZCArIG92ZXJzY2FuKTtcblxuICAgICAgLy8gaWYgKGlzUmVtb3ZpbmdJdGVtKSB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICAgIGBbUkVOREVSLUZJWF0gcmVuZGVySXRlbXMgY2FsYzogdmlzaWJsZVJhbmdlPSR7SlNPTi5zdHJpbmdpZnkodmlzaWJsZVJhbmdlKX0sIG92ZXJzY2FuPSR7b3ZlcnNjYW59LCB0b3RhbEl0ZW1zPSR7dG90YWxJdGVtc31gLFxuICAgICAgLy8gICApO1xuICAgICAgLy8gICBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgICBgW1JFTkRFUi1GSVhdIHJlbmRlckl0ZW1zIGNhbGM6IHJlbmRlclN0YXJ0PSR7cmVuZGVyU3RhcnR9LCByZW5kZXJFbmQ9JHtyZW5kZXJFbmR9YCxcbiAgICAgIC8vICAgKTtcbiAgICAgIC8vIH1cblxuICAgICAgLy8gUmVtb3ZlIGl0ZW1zIG91dHNpZGUgcmFuZ2VcbiAgICAgIGNvbnN0IHRvUmVtb3ZlID0gQXJyYXkuZnJvbShyZW5kZXJlZEVsZW1lbnRzLmVudHJpZXMoKSkuZmlsdGVyKFxuICAgICAgICAoW2luZGV4XSkgPT4gaW5kZXggPCByZW5kZXJTdGFydCB8fCBpbmRleCA+IHJlbmRlckVuZCxcbiAgICAgICk7XG5cbiAgICAgIHRvUmVtb3ZlLmZvckVhY2goKFtpbmRleCwgZWxlbWVudF0pID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSkgcmVsZWFzZUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgIHJlbmRlcmVkRWxlbWVudHMuZGVsZXRlKGluZGV4KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBHZXQgaXRlbXMgZnJvbSBjb2xsZWN0aW9uIChzaW5nbGUgc291cmNlIG9mIHRydXRoKVxuICAgICAgY29uc3QgaXRlbXMgPSBnZXRDb2xsZWN0aW9uSXRlbXMoKTtcbiAgICAgIGNvbnN0IG1pc3NpbmdJdGVtczogbnVtYmVyW10gPSBbXTtcblxuICAgICAgLy8gQ29sbGVjdCBuZXcgZWxlbWVudHMgdG8gaW5zZXJ0IChpbmRleCAtPiBlbGVtZW50KVxuICAgICAgY29uc3QgbmV3RWxlbWVudHM6IEFycmF5PFtudW1iZXIsIEhUTUxFbGVtZW50XT4gPSBbXTtcblxuICAgICAgLy8gUmVuZGVyIGl0ZW1zIGluIHJhbmdlXG4gICAgICBmb3IgKGxldCBpID0gcmVuZGVyU3RhcnQ7IGkgPD0gcmVuZGVyRW5kOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPCAwIHx8IGkgPj0gdG90YWxJdGVtcyB8fCByZW5kZXJlZEVsZW1lbnRzLmhhcyhpKSkgY29udGludWU7XG5cbiAgICAgICAgbGV0IGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgICAgbWlzc2luZ0l0ZW1zLnB1c2goaSk7XG4gICAgICAgICAgLy8gR2VuZXJhdGUgcGxhY2Vob2xkZXIgKHJlbmRlcmVkIGR5bmFtaWNhbGx5LCBub3Qgc3RvcmVkKVxuICAgICAgICAgIGNvbnN0IHBsYWNlaG9sZGVycyA9IChjb21wb25lbnQgYXMgYW55KS5wbGFjZWhvbGRlcnM7XG4gICAgICAgICAgaXRlbSA9IHBsYWNlaG9sZGVycz8uZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW0oaSkgfHwge1xuICAgICAgICAgICAgX3BsYWNlaG9sZGVyOiB0cnVlLFxuICAgICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgICBpZDogYHBsYWNlaG9sZGVyLSR7aX1gLFxuICAgICAgICAgICAgbmFtZTogVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLk1BU0tfQ0hBUkFDVEVSLnJlcGVhdCgxNSksXG4gICAgICAgICAgICB0ZXh0OiBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuTUFTS19DSEFSQUNURVIucmVwZWF0KDI1KSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuTUFTS19DSEFSQUNURVIucmVwZWF0KDQwKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHJlbmRlckl0ZW0oaXRlbSwgaSk7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgLy8gR2V0IHRhcmdldFNjcm9sbEluZGV4IGZyb20gdmlld3BvcnRTdGF0ZSBpZiBhdmFpbGFibGVcbiAgICAgICAgICBjb25zdCB0YXJnZXRTY3JvbGxJbmRleCA9ICh2aWV3cG9ydFN0YXRlIGFzIGFueSk/LnRhcmdldFNjcm9sbEluZGV4O1xuICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gY2FsY3VsYXRlSXRlbVBvc2l0aW9uKFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgICAgdG90YWxJdGVtcyxcbiAgICAgICAgICAgIGl0ZW1TaXplLFxuICAgICAgICAgICAgdmlydHVhbFRvdGFsU2l6ZSxcbiAgICAgICAgICAgIGNvbnRhaW5lclNpemUsXG4gICAgICAgICAgICB0YXJnZXRTY3JvbGxJbmRleCxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCB7XG4gICAgICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlWSgke3Bvc2l0aW9ufXB4KWAsXG4gICAgICAgICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBDb2xsZWN0IGZvciBiYXRjaCBpbnNlcnRpb24gKGlmIG1haW50YWluaW5nIG9yZGVyKSBvciBqdXN0IGFwcGVuZFxuICAgICAgICAgIGlmIChtYWludGFpbkRvbU9yZGVyKSB7XG4gICAgICAgICAgICBuZXdFbGVtZW50cy5wdXNoKFtpLCBlbGVtZW50XSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGl0ZW1zQ29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNldChpLCBlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBCYXRjaCBpbnNlcnQgbmV3IGVsZW1lbnRzIGluIGNvcnJlY3QgRE9NIG9yZGVyIChvbmx5IHdoZW4gbWFpbnRhaW5Eb21PcmRlciBpcyBlbmFibGVkKVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIENTUyBzZWxlY3RvcnMgbGlrZSA6Zmlyc3QtY2hpbGQsIDpudGgtY2hpbGQoKSB3b3JrIGNvcnJlY3RseVxuICAgICAgaWYgKG1haW50YWluRG9tT3JkZXIgJiYgbmV3RWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBTb3J0IG5ldyBlbGVtZW50cyBieSBpbmRleFxuICAgICAgICBuZXdFbGVtZW50cy5zb3J0KChbYV0sIFtiXSkgPT4gYSAtIGIpO1xuXG4gICAgICAgIC8vIEdldCBleGlzdGluZyBET00gY2hpbGRyZW4gc29ydGVkIGJ5IHRoZWlyIGRhdGEtaW5kZXhcbiAgICAgICAgY29uc3QgZXhpc3RpbmdDaGlsZHJlbiA9IEFycmF5LmZyb20oXG4gICAgICAgICAgaXRlbXNDb250YWluZXIuY2hpbGRyZW4sXG4gICAgICAgICkgYXMgSFRNTEVsZW1lbnRbXTtcblxuICAgICAgICAvLyBNZXJnZSBuZXcgZWxlbWVudHMgaW50byBjb3JyZWN0IHBvc2l0aW9uc1xuICAgICAgICBsZXQgbmV3SWR4ID0gMDtcbiAgICAgICAgbGV0IGV4aXN0aW5nSWR4ID0gMDtcblxuICAgICAgICB3aGlsZSAobmV3SWR4IDwgbmV3RWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgW25ld0luZGV4LCBuZXdFbGVtZW50XSA9IG5ld0VsZW1lbnRzW25ld0lkeF07XG5cbiAgICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBleGlzdGluZyBjaGlsZCB3aXRoIGluZGV4ID4gbmV3SW5kZXhcbiAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICBleGlzdGluZ0lkeCA8IGV4aXN0aW5nQ2hpbGRyZW4ubGVuZ3RoICYmXG4gICAgICAgICAgICBwYXJzZUludChleGlzdGluZ0NoaWxkcmVuW2V4aXN0aW5nSWR4XS5kYXRhc2V0LmluZGV4IHx8IFwiLTFcIiwgMTApIDxcbiAgICAgICAgICAgICAgbmV3SW5kZXhcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGV4aXN0aW5nSWR4Kys7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGV4aXN0aW5nSWR4IDwgZXhpc3RpbmdDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIEluc2VydCBiZWZvcmUgdGhlIGV4aXN0aW5nIGNoaWxkXG4gICAgICAgICAgICBpdGVtc0NvbnRhaW5lci5pbnNlcnRCZWZvcmUoXG4gICAgICAgICAgICAgIG5ld0VsZW1lbnQsXG4gICAgICAgICAgICAgIGV4aXN0aW5nQ2hpbGRyZW5bZXhpc3RpbmdJZHhdLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQXBwZW5kIGF0IHRoZSBlbmRcbiAgICAgICAgICAgIGl0ZW1zQ29udGFpbmVyLmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXdJZHgrKztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBSZXF1ZXN0IG1pc3NpbmcgaXRlbXNcbiAgICAgIGlmIChcbiAgICAgICAgbWlzc2luZ0l0ZW1zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uPy5sb2FkTWlzc2luZ1Jhbmdlc1xuICAgICAgKSB7XG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmxvYWRNaXNzaW5nUmFuZ2VzKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHN0YXJ0OiBNYXRoLm1pbiguLi5taXNzaW5nSXRlbXMpLFxuICAgICAgICAgICAgZW5kOiBNYXRoLm1heCguLi5taXNzaW5nSXRlbXMpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZW5kZXJpbmc6bWlzc2luZy1pdGVtc1wiLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50VmlzaWJsZVJhbmdlID0gdmlzaWJsZVJhbmdlO1xuXG4gICAgICAvLyBFbWl0IGl0ZW1zIHJlbmRlcmVkIGV2ZW50IHdpdGggZWxlbWVudHMgZm9yIHNpemUgY2FsY3VsYXRpb25cbiAgICAgIGNvbnN0IHJlbmRlcmVkRWxlbWVudHNBcnJheSA9IEFycmF5LmZyb20ocmVuZGVyZWRFbGVtZW50cy52YWx1ZXMoKSk7XG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6aXRlbXMtcmVuZGVyZWRcIiwge1xuICAgICAgICBlbGVtZW50czogcmVuZGVyZWRFbGVtZW50c0FycmF5LFxuICAgICAgICByYW5nZTogdmlzaWJsZVJhbmdlLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpyZW5kZXJlZFwiLCB7XG4gICAgICAgIHJhbmdlOiB2aXNpYmxlUmFuZ2UsXG4gICAgICAgIHJlbmRlcmVkQ291bnQ6IHJlbmRlcmVkRWxlbWVudHMuc2l6ZSxcbiAgICAgIH0pO1xuICAgICAgdXBkYXRlSXRlbVBvc2l0aW9ucygpO1xuXG4gICAgICAvLyBMb2FkIGRhdGEgaWYgbm8gaXRlbXMgcmVuZGVyZWRcbiAgICAgIGlmIChcbiAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5zaXplID09PSAwICYmXG4gICAgICAgIHRvdGFsSXRlbXMgPiAwICYmXG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydD8uY29sbGVjdGlvblxuICAgICAgKSB7XG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmxvYWRNaXNzaW5nUmFuZ2VzKFxuICAgICAgICAgIHZpc2libGVSYW5nZSxcbiAgICAgICAgICBcInJlbmRlcmluZzpuby1pdGVtc1wiLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBFeHRlbmQgdmlld3BvcnQgQVBJXG4gICAgY29uc3Qgb3JpZ2luYWxSZW5kZXJJdGVtcyA9IGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcztcbiAgICBjb21wb25lbnQudmlld3BvcnQucmVuZGVySXRlbXMgPSAoKSA9PiB7XG4gICAgICByZW5kZXJJdGVtcygpO1xuICAgICAgb3JpZ2luYWxSZW5kZXJJdGVtcz8uKCk7XG4gICAgfTtcblxuICAgIC8vIENsZWFudXBcbiAgICB3cmFwRGVzdHJveShjb21wb25lbnQsICgpID0+IHtcbiAgICAgIC8vIFJlbGVhc2UgYWxsIHJlbmRlcmVkIGVsZW1lbnRzIC0gdXNlIHJlbGVhc2VFbGVtZW50IHRvIHByb3Blcmx5IGRlc3Ryb3kgbGF5b3V0UmVzdWx0c1xuICAgICAgcmVuZGVyZWRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgIHJlbGVhc2VFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgfSk7XG4gICAgICByZW5kZXJlZEVsZW1lbnRzLmNsZWFyKCk7XG5cbiAgICAgIC8vIENsZWFyIGVsZW1lbnQgcG9vbFxuICAgICAgZWxlbWVudFBvb2wubGVuZ3RoID0gMDtcblxuICAgICAgLy8gUmVzZXQgc3RhdGVcbiAgICAgIGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB7IHN0YXJ0OiAtMSwgZW5kOiAtMSB9O1xuICAgICAgdmlld3BvcnRTdGF0ZSA9IG51bGw7XG4gICAgICBsYXN0UmVuZGVyVGltZSA9IDA7XG5cbiAgICAgIC8vIFJlc2V0IHBvb2wgc3RhdHNcbiAgICAgIHBvb2xTdGF0cy5jcmVhdGVkID0gMDtcbiAgICAgIHBvb2xTdGF0cy5yZWN5Y2xlZCA9IDA7XG4gICAgICBwb29sU3RhdHMucG9vbFNpemUgPSAwO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8qKlxuICogQG1vZHVsZSBjb3JlL2xheW91dC9zY2hlbWFcbiAqIEBkZXNjcmlwdGlvbiBVbmlmaWVkIGxheW91dCBzY2hlbWEgcHJvY2Vzc29yIHdpdGggaW50ZWdyYXRlZCBvcHRpbWl6YXRpb25zXG4gKiBDb25zb2xpZGF0ZXMgYXJyYXksIG9iamVjdCwgSlNYLCBhbmQgdGVtcGxhdGUgcHJvY2Vzc2luZyB3aXRoIGJ1aWx0LWluIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50c1xuICovXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRZUEVTIChFc3NlbnRpYWwgb25seSlcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBMYXlvdXRDb25maWcge1xuICAvKiogQmFzZSBsYXlvdXQgdHlwZSAqL1xuICB0eXBlPzogXCJzdGFja1wiIHwgXCJyb3dcIiB8IFwiZ3JpZFwiIHwgc3RyaW5nO1xuICAvKiogU3BhY2luZyBiZXR3ZWVuIGVsZW1lbnRzICovXG4gIGdhcD86IG51bWJlciB8IHN0cmluZztcbiAgLyoqIEFkZGl0aW9uYWwgQ1NTIGNsYXNzZXMgKi9cbiAgY2xhc3M/OiBzdHJpbmc7XG4gIC8qKiBBbGlnbm1lbnQgb2YgaXRlbXMgYWxvbmcgdGhlIGNyb3NzIGF4aXMgKi9cbiAgYWxpZ24/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiB8IFwic3RyZXRjaFwiO1xuICAvKiogQWxpZ25tZW50IG9mIGl0ZW1zIGFsb25nIHRoZSBtYWluIGF4aXMgKi9cbiAganVzdGlmeT86IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiIHwgXCJiZXR3ZWVuXCIgfCBcImFyb3VuZFwiIHwgXCJldmVubHlcIjtcbiAgLyoqIFdoZXRoZXIgYW5kIGhvdyBpdGVtcyBzaG91bGQgd3JhcCAqL1xuICB3cmFwPzogYm9vbGVhbiB8IFwicmV2ZXJzZVwiIHwgXCJub3dyYXBcIjtcbiAgLyoqIFdoZXRoZXIgcm93IGl0ZW1zIHNob3VsZCBzdGFjayB2ZXJ0aWNhbGx5IG9uIG1vYmlsZSAqL1xuICBtb2JpbGVTdGFjaz86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHJvdyBpdGVtcyBzaG91bGQgc2Nyb2xsIGhvcml6b250YWxseSBvbiBtb2JpbGUgKi9cbiAgbW9iaWxlU2Nyb2xsPzogYm9vbGVhbjtcbiAgLyoqIE51bWJlciBvZiBjb2x1bW5zIG9yIGF1dG9tYXRpYyBzaXppbmcgbWV0aG9kICovXG4gIGNvbHVtbnM/OiBudW1iZXIgfCBcImF1dG8tZml0XCIgfCBcImF1dG8tZmlsbFwiO1xuICAvKiogV2hldGhlciB0byB1c2UgZGVuc2UgcGFja2luZyBhbGdvcml0aG0gZm9yIGdyaWQgKi9cbiAgZGVuc2U/OiBib29sZWFuO1xuICAvKiogV2hldGhlciBncmlkIGl0ZW1zIHNob3VsZCBhZGp1c3QgaGVpZ2h0IGF1dG9tYXRpY2FsbHkgKi9cbiAgYXV0b0hlaWdodD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0SXRlbUNvbmZpZyB7XG4gIC8qKiBDb2x1bW4gd2lkdGggaW4gYSAxMi1jb2x1bW4gZ3JpZCAqL1xuICB3aWR0aD86IG51bWJlcjtcbiAgLyoqIFdpZHRoIG9uIHNtYWxsIHNjcmVlbnMgKi9cbiAgc20/OiBudW1iZXI7XG4gIC8qKiBXaWR0aCBvbiBtZWRpdW0gc2NyZWVucyAqL1xuICBtZD86IG51bWJlcjtcbiAgLyoqIFdpZHRoIG9uIGxhcmdlIHNjcmVlbnMgKi9cbiAgbGc/OiBudW1iZXI7XG4gIC8qKiBXaWR0aCBvbiBleHRyYS1sYXJnZSBzY3JlZW5zICovXG4gIHhsPzogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIGdyaWQgY29sdW1ucyB0byBzcGFuICovXG4gIHNwYW4/OiBudW1iZXI7XG4gIC8qKiBOdW1iZXIgb2YgZ3JpZCByb3dzIHRvIHNwYW4gKi9cbiAgcm93U3Bhbj86IG51bWJlcjtcbiAgLyoqIERpc3BsYXkgb3JkZXIgKi9cbiAgb3JkZXI/OiBudW1iZXIgfCBcImZpcnN0XCIgfCBcImxhc3RcIjtcbiAgLyoqIFNlbGYtYWxpZ25tZW50IHdpdGhpbiBjb250YWluZXIgKi9cbiAgYWxpZ24/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiB8IFwic3RyZXRjaFwiO1xuICAvKiogV2hldGhlciBpdGVtIHNob3VsZCBhdXRvbWF0aWNhbGx5IHNpemUgKi9cbiAgYXV0bz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0T3B0aW9ucyB7XG4gIC8qKiBEZWZhdWx0IGNyZWF0b3IgZnVuY3Rpb24gdG8gdXNlIGlmIG5vdCBzcGVjaWZpZWQgaW4gc2NoZW1hICovXG4gIGNyZWF0b3I/OiBGdW5jdGlvbjtcbiAgLyoqIFdoZXRoZXIgdG8gYXBwbHkgQ1NTIGNsYXNzIHByZWZpeCBAZGVmYXVsdCB0cnVlICovXG4gIHByZWZpeD86IGJvb2xlYW47XG4gIC8qKiBBZGRpdGlvbmFsIG9wdGlvbnMgKi9cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExheW91dFJlc3VsdCB7XG4gIC8qKiBUaGUgcmF3IGxheW91dCBvYmplY3Qgd2l0aCBhbGwgY29tcG9uZW50cyAqL1xuICBsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIC8qKiBSZWZlcmVuY2UgdG8gdGhlIHJvb3QgZWxlbWVudCBmb3IgY29udmVuaWVuY2UgKi9cbiAgZWxlbWVudDogSFRNTEVsZW1lbnQgfCBhbnk7XG4gIC8qKiBGbGF0dGVuZWQgY29tcG9uZW50IG1hcCAqL1xuICBjb21wb25lbnQ6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIC8qKiBHZXRzIGEgY29tcG9uZW50IGJ5IG5hbWUgKi9cbiAgZ2V0KG5hbWU6IHN0cmluZyk6IGFueTtcbiAgLyoqIEdldHMgYWxsIGNvbXBvbmVudHMgaW4gYSBmbGF0dGVuZWQgbWFwICovXG4gIGdldEFsbCgpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAvKiogRGVzdHJveXMgdGhlIGxheW91dCwgY2xlYW5pbmcgdXAgYWxsIGNvbXBvbmVudHMgKi9cbiAgZGVzdHJveSgpOiB2b2lkO1xufVxuXG50eXBlIENvbXBvbmVudExpa2UgPSB7IGVsZW1lbnQ6IEhUTUxFbGVtZW50OyBba2V5OiBzdHJpbmddOiBhbnkgfTtcbnR5cGUgU2NoZW1hSXRlbSA9IEZ1bmN0aW9uIHwgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55PiB8IFNjaGVtYUl0ZW1bXTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQlVJTFQtSU4gT1BUSU1JWkFUSU9OU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEZyYWdtZW50IFBvb2wgZm9yIGVmZmljaWVudCBEb2N1bWVudEZyYWdtZW50IHJldXNlXG4gKiBSZWR1Y2VzIEdDIHByZXNzdXJlIGluIGhpZ2gtZnJlcXVlbmN5IGxheW91dCBjcmVhdGlvbiBzY2VuYXJpb3NcbiAqL1xuY2xhc3MgRnJhZ21lbnRQb29sIHtcbiAgcHJpdmF0ZSBwb29sOiBEb2N1bWVudEZyYWdtZW50W10gPSBbXTtcbiAgcHJpdmF0ZSBtYXhTaXplID0gODsgLy8gT3B0aW1pemVkIHNpemUgZm9yIG1lbW9yeSBlZmZpY2llbmN5XG5cbiAgZ2V0KCk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIHJldHVybiB0aGlzLnBvb2wucG9wKCkgfHwgZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICB9XG5cbiAgcmVsZWFzZShmcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBvb2wubGVuZ3RoIDwgdGhpcy5tYXhTaXplICYmIGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnBvb2wucHVzaChmcmFnbWVudCk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5wb29sLmxlbmd0aCA9IDA7XG4gIH1cbn1cblxuY29uc3QgZnJhZ21lbnRQb29sID0gbmV3IEZyYWdtZW50UG9vbCgpO1xuXG4vKipcbiAqIENsYXNzIG5hbWUgY2FjaGUgZm9yIGxheW91dCBjb25maWd1cmF0aW9uc1xuICogUmVkdWNlcyBzdHJpbmcgb3BlcmF0aW9ucyBieSBjYWNoaW5nIGdlbmVyYXRlZCBjbGFzcyBuYW1lc1xuICovXG5jb25zdCBjbGFzc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuLy8gQ29uZmlndXJhdGlvbiBjb25zdGFudHNcbmNvbnN0IFBSRUZJWCA9IFwibXRybFwiOyAvLyBUT0RPOiBNYWtlIHRoaXMgY29uZmlndXJhYmxlXG5jb25zdCBQUkVGSVhfV0lUSF9EQVNIID0gYCR7UFJFRklYfS1gO1xuXG4vKipcbiAqIEdldHMgYSBjYWNoZWQgY2xhc3MgbmFtZSBmb3IgbGF5b3V0IGNvbmZpZ3VyYXRpb25cbiAqIE9wdGltaXplZCBmb3IgZGlmZmVyZW50IGNsYXNzIG5hbWluZyBwYXR0ZXJuc1xuICovXG5mdW5jdGlvbiBnZXRDYWNoZWRDbGFzc05hbWUoXG4gIHR5cGU6IHN0cmluZyxcbiAgcHJvcGVydHk6IHN0cmluZyxcbiAgdmFsdWU6IHN0cmluZyB8IG51bWJlcixcbik6IHN0cmluZyB7XG4gIGNvbnN0IGtleSA9IGAke3R5cGV9LSR7cHJvcGVydHl9LSR7dmFsdWV9YDtcbiAgaWYgKCFjbGFzc0NhY2hlLmhhcyhrZXkpKSB7XG4gICAgaWYgKHR5cGUgPT09IFwiaXRlbVwiKSB7XG4gICAgICBjbGFzc0NhY2hlLnNldChcbiAgICAgICAga2V5LFxuICAgICAgICBwcm9wZXJ0eSA9PT0gXCJcIlxuICAgICAgICAgID8gYGxheW91dF9faXRlbS0tJHt2YWx1ZX1gXG4gICAgICAgICAgOiBgbGF5b3V0X19pdGVtLS0ke3Byb3BlcnR5fS0ke3ZhbHVlfWAsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGb3IgbGF5b3V0IGNsYXNzZXMsIGFsaWduIHVzZXMgbGF5b3V0LS17dHlwZX0te3ZhbHVlfVxuICAgICAgLy8gYnV0IGp1c3RpZnkgYW5kIG90aGVycyB1c2UgbGF5b3V0LS17dHlwZX0te3Byb3BlcnR5fS17dmFsdWV9XG4gICAgICBpZiAocHJvcGVydHkgPT09IFwiYWxpZ25cIikge1xuICAgICAgICBjbGFzc0NhY2hlLnNldChrZXksIGBsYXlvdXQtLSR7dHlwZX0tJHt2YWx1ZX1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsYXNzQ2FjaGUuc2V0KGtleSwgYGxheW91dC0tJHt0eXBlfS0ke3Byb3BlcnR5fS0ke3ZhbHVlfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY2xhc3NDYWNoZS5nZXQoa2V5KSE7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE9QVElNSVpFRCBVVElMSVRJRVNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBhIGNvbXBvbmVudCBvYmplY3QgKGhhcyBhbiBlbGVtZW50IHByb3BlcnR5KVxuICovXG5mdW5jdGlvbiBpc0NvbXBvbmVudCh2YWx1ZTogYW55KTogdmFsdWUgaXMgQ29tcG9uZW50TGlrZSB7XG4gIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgXCJlbGVtZW50XCIgaW4gdmFsdWU7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRvY3VtZW50IGZyYWdtZW50IHVzaW5nIHBvb2xpbmcgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICovXG5mdW5jdGlvbiBjcmVhdGVGcmFnbWVudCgpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgcmV0dXJuIGZyYWdtZW50UG9vbC5nZXQoKTtcbn1cblxuLyoqXG4gKiBSZWxlYXNlcyBhIGZyYWdtZW50IGJhY2sgdG8gdGhlIHBvb2wgZm9yIHJldXNlXG4gKi9cbmZ1bmN0aW9uIHJlbGVhc2VGcmFnbWVudChmcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCk6IHZvaWQge1xuICBmcmFnbWVudFBvb2wucmVsZWFzZShmcmFnbWVudCk7XG59XG5cbi8qKlxuICogT3B0aW1pemVkIGNsYXNzIHByb2Nlc3Npbmcgd2l0aCBtaW5pbWFsIHN0cmluZyBvcGVyYXRpb25zXG4gKiBIYW5kbGVzIGFycmF5cywgc3RyaW5ncywgY2xhc3NOYW1lIGFsaWFzZXMsIGFuZCByYXdDbGFzcyBlZmZpY2llbnRseVxuICovXG5mdW5jdGlvbiBwcm9jZXNzQ2xhc3NOYW1lcyhcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PixcbiAgc2tpcFByZWZpeCA9IGZhbHNlLFxuKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIGlmICghb3B0aW9ucykgcmV0dXJuIG9wdGlvbnM7XG5cbiAgY29uc3QgaGFzUmF3Q2xhc3MgPSBvcHRpb25zLnJhd0NsYXNzO1xuICBjb25zdCBoYXNSZWd1bGFyQ2xhc3MgPSBvcHRpb25zLmNsYXNzIHx8IG9wdGlvbnMuY2xhc3NOYW1lO1xuXG4gIC8vIEZhc3QgcGF0aDogbm8gY2xhc3MgcHJvcGVydGllcyBhdCBhbGxcbiAgaWYgKCFoYXNSYXdDbGFzcyAmJiAhaGFzUmVndWxhckNsYXNzKSByZXR1cm4gb3B0aW9ucztcblxuICAvLyBGYXN0IHBhdGg6IG9ubHkgcmF3Q2xhc3MgYW5kIHNraXBwaW5nIHByZWZpeCAobW9zdCBjb21tb24gcmF3Q2xhc3Mgc2NlbmFyaW8pXG4gIGlmIChoYXNSYXdDbGFzcyAmJiAhaGFzUmVndWxhckNsYXNzICYmIHNraXBQcmVmaXgpIHtcbiAgICBjb25zdCBwcm9jZXNzZWQgPSB7IC4uLm9wdGlvbnMgfTtcbiAgICBkZWxldGUgcHJvY2Vzc2VkLnJhd0NsYXNzO1xuXG4gICAgLy8gRGlyZWN0IGFzc2lnbm1lbnQgZm9yIHNpbXBsZSBzdHJpbmdcbiAgICBpZiAodHlwZW9mIGhhc1Jhd0NsYXNzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBwcm9jZXNzZWQuY2xhc3MgPSBoYXNSYXdDbGFzcztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSGFuZGxlIGFycmF5IGNhc2VcbiAgICAgIHByb2Nlc3NlZC5jbGFzcyA9IGhhc1Jhd0NsYXNzLmpvaW4oXCIgXCIpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvY2Vzc2VkO1xuICB9XG5cbiAgLy8gRnVsbCBwcm9jZXNzaW5nIHBhdGggKG9ubHkgd2hlbiBuZWVkZWQpXG4gIGNvbnN0IHByb2Nlc3NlZCA9IHsgLi4ub3B0aW9ucyB9O1xuICBsZXQgZmluYWxDbGFzc2VzID0gXCJcIjtcblxuICAvLyBIYW5kbGUgcHJlZml4ZWQgY2xhc3NlcyBvbmx5IGlmIG5vdCBza2lwcGluZyBwcmVmaXhcbiAgaWYgKCFza2lwUHJlZml4ICYmIGhhc1JlZ3VsYXJDbGFzcykge1xuICAgIGxldCBwcmVmaXhlZFN0cmluZyA9IFwiXCI7XG5cbiAgICBpZiAocHJvY2Vzc2VkLmNsYXNzKSB7XG4gICAgICBwcmVmaXhlZFN0cmluZyArPSBBcnJheS5pc0FycmF5KHByb2Nlc3NlZC5jbGFzcylcbiAgICAgICAgPyBwcm9jZXNzZWQuY2xhc3Muam9pbihcIiBcIilcbiAgICAgICAgOiBwcm9jZXNzZWQuY2xhc3M7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzZWQuY2xhc3NOYW1lKSB7XG4gICAgICBwcmVmaXhlZFN0cmluZyArPSAocHJlZml4ZWRTdHJpbmcgPyBcIiBcIiA6IFwiXCIpICsgcHJvY2Vzc2VkLmNsYXNzTmFtZTtcbiAgICB9XG5cbiAgICBpZiAocHJlZml4ZWRTdHJpbmcpIHtcbiAgICAgIGZpbmFsQ2xhc3NlcyA9IHByZWZpeGVkU3RyaW5nXG4gICAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLm1hcCgoY2xzKSA9PlxuICAgICAgICAgIGNscy5zdGFydHNXaXRoKFBSRUZJWF9XSVRIX0RBU0gpID8gY2xzIDogUFJFRklYX1dJVEhfREFTSCArIGNscyxcbiAgICAgICAgKVxuICAgICAgICAuam9pbihcIiBcIik7XG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIHJhd0NsYXNzIChhbHdheXMgcHJvY2Vzc2VkIHdoZW4gcHJlc2VudClcbiAgaWYgKGhhc1Jhd0NsYXNzKSB7XG4gICAgY29uc3QgcmF3U3RyaW5nID0gQXJyYXkuaXNBcnJheShoYXNSYXdDbGFzcylcbiAgICAgID8gaGFzUmF3Q2xhc3MuZmlsdGVyKEJvb2xlYW4pLmpvaW4oXCIgXCIpXG4gICAgICA6IGhhc1Jhd0NsYXNzO1xuXG4gICAgZmluYWxDbGFzc2VzICs9IChmaW5hbENsYXNzZXMgPyBcIiBcIiA6IFwiXCIpICsgcmF3U3RyaW5nO1xuICB9XG5cbiAgaWYgKGZpbmFsQ2xhc3Nlcykge1xuICAgIHByb2Nlc3NlZC5jbGFzcyA9IGZpbmFsQ2xhc3NlcztcbiAgfVxuXG4gIC8vIENsZWFuIHVwIGluIG9uZSBvcGVyYXRpb25cbiAgZGVsZXRlIHByb2Nlc3NlZC5jbGFzc05hbWU7XG4gIGRlbGV0ZSBwcm9jZXNzZWQucmF3Q2xhc3M7XG5cbiAgcmV0dXJuIHByb2Nlc3NlZDtcbn1cblxuLyoqXG4gKiBPcHRpbWl6ZWQgcGFyYW1ldGVyIGV4dHJhY3Rpb24gZm9yIGFycmF5IHNjaGVtYXNcbiAqIFJlZHVjZXMgbXVsdGlwbGUgYXJyYXkgbG9va3VwcyB3aXRoIGJhdGNoIHByb2Nlc3NpbmdcbiAqL1xuaW50ZXJmYWNlIEV4dHJhY3RlZFBhcmFtZXRlcnMge1xuICBjcmVhdG9yOiBGdW5jdGlvbjtcbiAgbmFtZT86IHN0cmluZztcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgY29uc3VtZWQ6IG51bWJlcjtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFBhcmFtZXRlcnMoXG4gIHNjaGVtYTogU2NoZW1hSXRlbVtdLFxuICBzdGFydEluZGV4OiBudW1iZXIsXG4gIGRlZmF1bHRDcmVhdG9yOiBGdW5jdGlvbixcbik6IEV4dHJhY3RlZFBhcmFtZXRlcnMge1xuICBjb25zdCBpdGVtcyA9IHNjaGVtYS5zbGljZShzdGFydEluZGV4LCBzdGFydEluZGV4ICsgMyk7XG4gIGxldCBjcmVhdG9yLCBuYW1lLCBvcHRpb25zO1xuICBsZXQgY29uc3VtZWQgPSAxO1xuXG4gIGNvbnN0IFtmaXJzdCwgc2Vjb25kLCB0aGlyZF0gPSBpdGVtcztcblxuICBpZiAodHlwZW9mIGZpcnN0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjcmVhdG9yID0gZmlyc3Q7XG4gICAgaWYgKHR5cGVvZiBzZWNvbmQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG5hbWUgPSBzZWNvbmQ7XG4gICAgICBjb25zdW1lZCA9IDI7XG4gICAgICBpZiAoaXNPYmplY3QodGhpcmQpKSB7XG4gICAgICAgIG9wdGlvbnMgPSB0aGlyZDtcbiAgICAgICAgY29uc3VtZWQgPSAzO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNPYmplY3Qoc2Vjb25kKSkge1xuICAgICAgb3B0aW9ucyA9IHNlY29uZDtcbiAgICAgIGNvbnN1bWVkID0gMjtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIGZpcnN0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgY3JlYXRvciA9IGRlZmF1bHRDcmVhdG9yO1xuICAgIG5hbWUgPSBmaXJzdDtcbiAgICBpZiAoaXNPYmplY3Qoc2Vjb25kKSkge1xuICAgICAgb3B0aW9ucyA9IHNlY29uZDtcbiAgICAgIGNvbnN1bWVkID0gMjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QoZmlyc3QpKSB7XG4gICAgY3JlYXRvciA9IGRlZmF1bHRDcmVhdG9yO1xuICAgIG9wdGlvbnMgPSBmaXJzdDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY3JlYXRvcjogY3JlYXRvciB8fCBkZWZhdWx0Q3JlYXRvcixcbiAgICBuYW1lLFxuICAgIG9wdGlvbnM6IChvcHRpb25zIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNvbnN1bWVkLFxuICB9O1xufVxuXG4vKipcbiAqIFNpbXBsZSBvYmplY3QgdHlwZSBjaGVja1xuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBET00gVVRJTElUSUVTIChTaW1wbGlmaWVkKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFNpbXBsZSBET00gZWxlbWVudCBjcmVhdGlvblxuICovXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSk6IEhUTUxFbGVtZW50IHtcbiAgY29uc3QgdGFnID0gb3B0aW9ucy50YWcgfHwgXCJkaXZcIjtcbiAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcblxuICBpZiAob3B0aW9ucy5jbGFzcykge1xuICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gb3B0aW9ucy5jbGFzcztcbiAgfVxuXG4gIGlmIChvcHRpb25zLnN0eWxlKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnN0eWxlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcInN0eWxlXCIsIG9wdGlvbnMuc3R5bGUpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMuc3R5bGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgb3B0aW9ucy5zdHlsZSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdGlvbnMudGV4dENvbnRlbnQpIHtcbiAgICBlbGVtZW50LnRleHRDb250ZW50ID0gb3B0aW9ucy50ZXh0Q29udGVudDtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnRleHQpIHtcbiAgICBlbGVtZW50LnRleHRDb250ZW50ID0gb3B0aW9ucy50ZXh0O1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5cbi8qKlxuICogQWRkcyBhIENTUyBjbGFzcyB0byBhbiBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGFkZENsYXNzKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjbGFzc05hbWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZWxlbWVudCAmJiBjbGFzc05hbWUpIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBlbGVtZW50IGhhcyBhIENTUyBjbGFzc1xuICovXG5mdW5jdGlvbiBoYXNDbGFzcyhlbGVtZW50OiBIVE1MRWxlbWVudCwgY2xhc3NOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGVsZW1lbnQgJiYgZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVU5JRklFRCBDT01QT05FTlQgQ1JFQVRJT04gKHdpdGggZGVzdHJ1Y3R1cmluZyBvcHRpbWl6YXRpb24pXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbXBvbmVudCBpbnN0YW5jZSB3aXRoIG9wdGltaXplZCBvcHRpb24gcHJvY2Vzc2luZ1xuICogVXNlcyBkZXN0cnVjdHVyaW5nIGZvciBjbGVhbmVyIHNlcGFyYXRpb24gb2YgY29uY2VybnNcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoXG4gIENvbXBvbmVudDogYW55LFxuICBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4pOiBhbnkge1xuICB0cnkge1xuICAgIC8vIERlc3RydWN0dXJlIHNwZWNpYWwgY29uZmlncyBpbiBvbmUgb3BlcmF0aW9uXG4gICAgY29uc3Qge1xuICAgICAgbGF5b3V0OiBsYXlvdXRDb25maWcsXG4gICAgICBsYXlvdXRJdGVtOiBsYXlvdXRJdGVtQ29uZmlnLFxuICAgICAgc3R5bGU6IHN0eWxlQ29uZmlnLFxuICAgICAgYXR0cmlidXRlczogYXR0cmlidXRlc0NvbmZpZyxcbiAgICAgIGV2ZW50czogZXZlbnRzQ29uZmlnLFxuICAgICAgZXZlbnQsIC8vIExlZ2FjeSBzdXBwb3J0XG4gICAgICAuLi5jbGVhbk9wdGlvbnNcbiAgICB9ID0gb3B0aW9ucztcblxuICAgIC8vIFVzZSBldmVudHMgb3ZlciBldmVudCAoZXZlbnRzIGlzIHByZWZlcnJlZClcbiAgICBjb25zdCBmaW5hbEV2ZW50c0NvbmZpZyA9IGV2ZW50c0NvbmZpZyB8fCBldmVudDtcblxuICAgIC8vIElmIHN0eWxlIGlzIGEgc3RyaW5nLCBhbHdheXMgcGFzcyBpdCB0aHJvdWdoIHRvIHRoZSBjb21wb25lbnRcbiAgICBpZiAoc3R5bGVDb25maWcgJiYgdHlwZW9mIHN0eWxlQ29uZmlnID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjbGVhbk9wdGlvbnMuc3R5bGUgPSBzdHlsZUNvbmZpZztcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgY29tcG9uZW50XG4gICAgY29uc3QgaXNDbGFzcyA9XG4gICAgICB0eXBlb2YgQ29tcG9uZW50ID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoQ29tcG9uZW50LCBcInByb3RvdHlwZVwiKT8ud3JpdGFibGUgPT09XG4gICAgICAgIGZhbHNlO1xuXG4gICAgY29uc3QgY29tcG9uZW50ID0gaXNDbGFzc1xuICAgICAgPyBuZXcgQ29tcG9uZW50KGNsZWFuT3B0aW9ucylcbiAgICAgIDogQ29tcG9uZW50KGNsZWFuT3B0aW9ucyk7XG5cbiAgICAvLyBBcHBseSBjb25maWd1cmF0aW9ucyBpZiBjb21wb25lbnQgaGFzIGVsZW1lbnRcbiAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICBjb25zdCBlbGVtZW50ID1cbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQgfHxcbiAgICAgICAgKGNvbXBvbmVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gY29tcG9uZW50IDogbnVsbCk7XG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAvLyBBcHBseSBsYXlvdXQgY2xhc3Nlc1xuICAgICAgICBpZiAobGF5b3V0Q29uZmlnKSBhcHBseUxheW91dENsYXNzZXMoZWxlbWVudCwgbGF5b3V0Q29uZmlnKTtcblxuICAgICAgICAvLyBBcHBseSBsYXlvdXQgaXRlbSBjbGFzc2VzXG4gICAgICAgIGlmIChsYXlvdXRJdGVtQ29uZmlnKSBhcHBseUxheW91dEl0ZW1DbGFzc2VzKGVsZW1lbnQsIGxheW91dEl0ZW1Db25maWcpO1xuXG4gICAgICAgIC8vIEFwcGx5IHN0eWxlXG4gICAgICAgIGlmIChzdHlsZUNvbmZpZyAmJiB0eXBlb2Ygc3R5bGVDb25maWcgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlQ29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGx5IGF0dHJpYnV0ZXNcbiAgICAgICAgaWYgKGF0dHJpYnV0ZXNDb25maWcgJiYgdHlwZW9mIGF0dHJpYnV0ZXNDb25maWcgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzQ29uZmlnKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBldmVudHNcbiAgICAgICAgaWYgKGZpbmFsRXZlbnRzQ29uZmlnICYmIHR5cGVvZiBmaW5hbEV2ZW50c0NvbmZpZyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpbmFsRXZlbnRzQ29uZmlnKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBldmVudERlZiBvZiBmaW5hbEV2ZW50c0NvbmZpZykge1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShldmVudERlZikgJiYgZXZlbnREZWYubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbZXZlbnROYW1lLCBoYW5kbGVyXSA9IGV2ZW50RGVmO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgIHR5cGVvZiBldmVudE5hbWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICAgIHR5cGVvZiBoYW5kbGVyID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtldmVudE5hbWUsIGhhbmRsZXJdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgICAgICAgICBmaW5hbEV2ZW50c0NvbmZpZyxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGNyZWF0aW5nIGNvbXBvbmVudCBpbnN0YW5jZTpcIiwgZXJyb3IpO1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIElOVEVHUkFURUQgTEFZT1VUIENPTkZJR1VSQVRJT04gKHdpdGggY2FjaGluZylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBBcHBsaWVzIGxheW91dCBjbGFzc2VzIGJhc2VkIG9uIGNvbmZpZ3VyYXRpb25cbiAqIFVzZXMgaW50ZWdyYXRlZCBjYWNoaW5nIGZvciBvcHRpbWFsIHBlcmZvcm1hbmNlXG4gKi9cbmZ1bmN0aW9uIGFwcGx5TGF5b3V0Q2xhc3NlcyhcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gIGxheW91dENvbmZpZzogTGF5b3V0Q29uZmlnLFxuKTogdm9pZCB7XG4gIGlmICghZWxlbWVudCB8fCAhbGF5b3V0Q29uZmlnKSByZXR1cm47XG5cbiAgLy8gQXBwbHkgYmFzZSBsYXlvdXQgdHlwZVxuICBpZiAobGF5b3V0Q29uZmlnLnR5cGUpIHtcbiAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tJHtsYXlvdXRDb25maWcudHlwZX1gKTtcbiAgfVxuXG4gIC8vIEFwcGx5IHByb3BlcnRpZXMgd2l0aCBjYWNoaW5nXG4gIGNvbnN0IGxheW91dFR5cGUgPSBsYXlvdXRDb25maWcudHlwZSB8fCBnZXRMYXlvdXRUeXBlKGVsZW1lbnQpO1xuICBpZiAobGF5b3V0VHlwZSkge1xuICAgIGlmIChsYXlvdXRDb25maWcuZ2FwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICtcbiAgICAgICAgICBnZXRDYWNoZWRDbGFzc05hbWUobGF5b3V0VHlwZSwgXCJnYXBcIiwgbGF5b3V0Q29uZmlnLmdhcCksXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobGF5b3V0Q29uZmlnLmFsaWduKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArXG4gICAgICAgICAgZ2V0Q2FjaGVkQ2xhc3NOYW1lKGxheW91dFR5cGUsIFwiYWxpZ25cIiwgbGF5b3V0Q29uZmlnLmFsaWduKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChsYXlvdXRDb25maWcuanVzdGlmeSkge1xuICAgICAgYWRkQ2xhc3MoXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIFBSRUZJWF9XSVRIX0RBU0ggK1xuICAgICAgICAgIGdldENhY2hlZENsYXNzTmFtZShsYXlvdXRUeXBlLCBcImp1c3RpZnlcIiwgbGF5b3V0Q29uZmlnLmp1c3RpZnkpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBHcmlkLXNwZWNpZmljIHByb3BlcnRpZXNcbiAgaWYgKGxheW91dENvbmZpZy50eXBlID09PSBcImdyaWRcIiB8fCBnZXRMYXlvdXRUeXBlKGVsZW1lbnQpID09PSBcImdyaWRcIikge1xuICAgIGlmICh0eXBlb2YgbGF5b3V0Q29uZmlnLmNvbHVtbnMgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICtcbiAgICAgICAgICBnZXRDYWNoZWRDbGFzc05hbWUoXCJncmlkXCIsIFwiY29sc1wiLCBsYXlvdXRDb25maWcuY29sdW1ucyksXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAobGF5b3V0Q29uZmlnLmNvbHVtbnMgPT09IFwiYXV0by1maWxsXCIpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiZ3JpZFwiLCBcImZpbGxcIiwgXCJhdXRvXCIpLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGxheW91dENvbmZpZy5jb2x1bW5zID09PSBcImF1dG8tZml0XCIpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiZ3JpZFwiLCBcImNvbHNcIiwgXCJhdXRvLWZpdFwiKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChsYXlvdXRDb25maWcuZGVuc2UpXG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tZ3JpZC1kZW5zZWApO1xuICAgIGlmIChsYXlvdXRDb25maWcuYXV0b0hlaWdodClcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1ncmlkLWF1dG8taGVpZ2h0YCk7XG4gIH1cblxuICAvLyBSb3ctc3BlY2lmaWMgcHJvcGVydGllc1xuICBpZiAobGF5b3V0Q29uZmlnLnR5cGUgPT09IFwicm93XCIgfHwgZ2V0TGF5b3V0VHlwZShlbGVtZW50KSA9PT0gXCJyb3dcIikge1xuICAgIGlmIChsYXlvdXRDb25maWcud3JhcCA9PT0gZmFsc2UgfHwgbGF5b3V0Q29uZmlnLndyYXAgPT09IFwibm93cmFwXCIpIHtcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3ctbm93cmFwYCk7XG4gICAgfSBlbHNlIGlmIChsYXlvdXRDb25maWcud3JhcCA9PT0gXCJyZXZlcnNlXCIpIHtcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3ctd3JhcC1yZXZlcnNlYCk7XG4gICAgfVxuICAgIGlmIChsYXlvdXRDb25maWcubW9iaWxlU3RhY2spXG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93LW1vYmlsZS1zdGFja2ApO1xuICAgIGlmIChsYXlvdXRDb25maWcubW9iaWxlU2Nyb2xsKVxuICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLXJvdy1tb2JpbGUtc2Nyb2xsYCk7XG4gIH1cblxuICAvLyBDdXN0b20gY2xhc3Nlc1xuICBpZiAobGF5b3V0Q29uZmlnLmNsYXNzKSB7XG4gICAgbGF5b3V0Q29uZmlnLmNsYXNzXG4gICAgICAuc3BsaXQoXCIgXCIpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuZm9yRWFjaCgoY2xzKSA9PiBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xzKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBBcHBsaWVzIGxheW91dCBpdGVtIGNsYXNzZXMgYmFzZWQgb24gY29uZmlndXJhdGlvblxuICogVXNlcyBpbnRlZ3JhdGVkIGNhY2hpbmcgZm9yIG9wdGltYWwgcGVyZm9ybWFuY2VcbiAqL1xuZnVuY3Rpb24gYXBwbHlMYXlvdXRJdGVtQ2xhc3NlcyhcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gIGl0ZW1Db25maWc6IExheW91dEl0ZW1Db25maWcsXG4pOiB2b2lkIHtcbiAgaWYgKCFlbGVtZW50IHx8ICFpdGVtQ29uZmlnKSByZXR1cm47XG5cbiAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXRfX2l0ZW1gKTtcblxuICAvLyBXaWR0aCBhbmQgcmVzcG9uc2l2ZSBjbGFzc2VzIHdpdGggY2FjaGluZ1xuICBpZiAoaXRlbUNvbmZpZy53aWR0aCAmJiBpdGVtQ29uZmlnLndpZHRoID49IDEgJiYgaXRlbUNvbmZpZy53aWR0aCA8PSAxMikge1xuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwiXCIsIGl0ZW1Db25maWcud2lkdGgpLFxuICAgICk7XG4gIH1cbiAgaWYgKGl0ZW1Db25maWcuc20pXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJzbVwiLCBpdGVtQ29uZmlnLnNtKSxcbiAgICApO1xuICBpZiAoaXRlbUNvbmZpZy5tZClcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcIm1kXCIsIGl0ZW1Db25maWcubWQpLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLmxnKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwibGdcIiwgaXRlbUNvbmZpZy5sZyksXG4gICAgKTtcbiAgaWYgKGl0ZW1Db25maWcueGwpXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJ4bFwiLCBpdGVtQ29uZmlnLnhsKSxcbiAgICApO1xuXG4gIC8vIEdyaWQgc3BhbiBjbGFzc2VzXG4gIGlmIChpdGVtQ29uZmlnLnNwYW4pXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJzcGFuXCIsIGl0ZW1Db25maWcuc3BhbiksXG4gICAgKTtcbiAgaWYgKGl0ZW1Db25maWcucm93U3BhbilcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICtcbiAgICAgICAgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcInJvdy1zcGFuXCIsIGl0ZW1Db25maWcucm93U3BhbiksXG4gICAgKTtcblxuICAvLyBPcmRlciBhbmQgYWxpZ25tZW50XG4gIGlmIChpdGVtQ29uZmlnLm9yZGVyKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwib3JkZXJcIiwgaXRlbUNvbmZpZy5vcmRlciksXG4gICAgKTtcbiAgaWYgKGl0ZW1Db25maWcuYWxpZ24pXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJzZWxmXCIsIGl0ZW1Db25maWcuYWxpZ24pLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLmF1dG8pXG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXRfX2l0ZW0tLWF1dG9gKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBsYXlvdXQgdHlwZSBmcm9tIGVsZW1lbnQgY2xhc3Nlc1xuICovXG5mdW5jdGlvbiBnZXRMYXlvdXRUeXBlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogc3RyaW5nIHtcbiAgcmV0dXJuIGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1zdGFja2ApXG4gICAgPyBcInN0YWNrXCJcbiAgICA6IGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3dgKVxuICAgICAgPyBcInJvd1wiXG4gICAgICA6IGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1ncmlkYClcbiAgICAgICAgPyBcImdyaWRcIlxuICAgICAgICA6IFwiXCI7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFVOSUZJRUQgU0NIRU1BIFBST0NFU1NPUlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBQcm9jZXNzZXMgYXJyYXktYmFzZWQgc2NoZW1hIGRlZmluaXRpb25zXG4gKiBPcHRpbWl6ZWQgd2l0aCBwYXJhbWV0ZXIgZXh0cmFjdGlvbiBhbmQgaW50ZWdyYXRlZCBjb25maWd1cmF0aW9uXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NBcnJheVNjaGVtYShcbiAgc2NoZW1hOiBTY2hlbWFJdGVtW10gfCBhbnksXG4gIHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGwsXG4gIGxldmVsOiBudW1iZXIgPSAwLFxuICBvcHRpb25zOiBMYXlvdXRPcHRpb25zID0ge30sXG4pOiBMYXlvdXRSZXN1bHQge1xuICBsZXZlbCsrO1xuICBjb25zdCBsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgY29uc3QgY29tcG9uZW50czogQXJyYXk8W3N0cmluZywgYW55XT4gPSBbXTtcbiAgY29uc3QgZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudCgpO1xuICBsZXQgY29tcG9uZW50ID0gbnVsbDtcblxuICBpZiAoIUFycmF5LmlzQXJyYXkoc2NoZW1hKSkge1xuICAgIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbiAgfVxuXG4gIGNvbnN0IGRlZmF1bHRDcmVhdG9yID0gKG9wdGlvbnMgYXMgYW55KS5jcmVhdG9yIHx8IGNyZWF0ZUVsZW1lbnQ7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlbWEubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBpdGVtID0gc2NoZW1hW2ldO1xuICAgIGlmICghaXRlbSkgY29udGludWU7XG5cbiAgICAvLyBIYW5kbGUgbmVzdGVkIGFycmF5c1xuICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBjb21wb25lbnQgfHwgcGFyZW50RWxlbWVudDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHByb2Nlc3NBcnJheVNjaGVtYShpdGVtLCBjb250YWluZXIsIGxldmVsLCBvcHRpb25zKTtcbiAgICAgIC8vIE1lcmdlIG5lc3RlZCBjb21wb25lbnRzIGFycmF5IGluc3RlYWQgb2Ygb3ZlcndyaXRpbmdcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdC5sYXlvdXQuY29tcG9uZW50cykpIHtcbiAgICAgICAgY29tcG9uZW50cy5wdXNoKC4uLnJlc3VsdC5sYXlvdXQuY29tcG9uZW50cyk7XG4gICAgICAgIGRlbGV0ZSByZXN1bHQubGF5b3V0LmNvbXBvbmVudHM7XG4gICAgICB9XG4gICAgICBPYmplY3QuYXNzaWduKGxheW91dCwgcmVzdWx0LmxheW91dCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBVc2Ugb3B0aW1pemVkIHBhcmFtZXRlciBleHRyYWN0aW9uXG4gICAgY29uc3Qge1xuICAgICAgY3JlYXRvcixcbiAgICAgIG5hbWUsXG4gICAgICBvcHRpb25zOiBpdGVtT3B0aW9ucyxcbiAgICAgIGNvbnN1bWVkLFxuICAgIH0gPSBleHRyYWN0UGFyYW1ldGVycyhzY2hlbWEsIGksIGRlZmF1bHRDcmVhdG9yKTtcblxuICAgIGlmICghY3JlYXRvcikge1xuICAgICAgY29uc29sZS53YXJuKFwiU2tpcHBpbmcgdW5zdXBwb3J0ZWQgaXRlbSB0eXBlOlwiLCBpdGVtKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgdG8gZGl2IGZvciBjcmVhdGVFbGVtZW50XG4gICAgaWYgKGNyZWF0b3IgPT09IGNyZWF0ZUVsZW1lbnQgJiYgIShcInRhZ1wiIGluIGl0ZW1PcHRpb25zKSkge1xuICAgICAgaXRlbU9wdGlvbnMudGFnID0gXCJkaXZcIjtcbiAgICB9XG5cbiAgICAvLyBBZHZhbmNlIGluZGV4IGJ5IGNvbnN1bWVkIGl0ZW1zIG1pbnVzIDEgKGxvb3AgaW5jcmVtZW50IGhhbmRsZXMgdGhlICsxKVxuICAgIGkgKz0gY29uc3VtZWQgLSAxO1xuXG4gICAgLy8gUHJvY2VzcyBvcHRpb25zIHdpdGggcHJlZml4IC0gb3B0aW1pemVkIGRlY2lzaW9uIGxvZ2ljXG4gICAgY29uc3Qgc2hvdWxkQXBwbHlQcmVmaXggPVxuICAgICAgXCJwcmVmaXhcIiBpbiBpdGVtT3B0aW9ucyA/IGl0ZW1PcHRpb25zLnByZWZpeCA6IG9wdGlvbnMucHJlZml4ICE9PSBmYWxzZTtcblxuICAgIC8vIEZhc3QgcGF0aDogcHJvY2VzcyBvbmx5IHdoZW4gbmVlZGVkXG4gICAgY29uc3QgcHJvY2Vzc2VkT3B0aW9ucyA9XG4gICAgICBzaG91bGRBcHBseVByZWZpeCB8fCBpdGVtT3B0aW9ucy5yYXdDbGFzc1xuICAgICAgICA/IHByb2Nlc3NDbGFzc05hbWVzKGl0ZW1PcHRpb25zLCAhc2hvdWxkQXBwbHlQcmVmaXgpXG4gICAgICAgIDogaXRlbU9wdGlvbnM7IC8vIE5vIGNvcHkgbmVlZGVkIGlmIG5vIHByb2Nlc3NpbmdcblxuICAgIC8vIEFkZCBuYW1lIHRvIG9wdGlvbnMgaWYgbmVlZGVkXG4gICAgaWYgKFxuICAgICAgbmFtZSAmJlxuICAgICAgIShcIm5hbWVcIiBpbiBwcm9jZXNzZWRPcHRpb25zKSAmJlxuICAgICAgIShjcmVhdG9yID09PSBjcmVhdGVFbGVtZW50IHx8IChjcmVhdG9yIGFzIGFueSkuaXNFbGVtZW50KVxuICAgICkge1xuICAgICAgcHJvY2Vzc2VkT3B0aW9ucy5uYW1lID0gbmFtZTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgY29tcG9uZW50XG4gICAgY29tcG9uZW50ID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoY3JlYXRvciwgcHJvY2Vzc2VkT3B0aW9ucyk7XG4gICAgY29uc3QgZWxlbWVudCA9IGlzQ29tcG9uZW50KGNvbXBvbmVudCkgPyBjb21wb25lbnQuZWxlbWVudCA6IGNvbXBvbmVudDtcblxuICAgIGlmIChsZXZlbCA9PT0gMSkgbGF5b3V0LmVsZW1lbnQgPSBlbGVtZW50O1xuICAgIGlmIChuYW1lKSB7XG4gICAgICBsYXlvdXRbbmFtZV0gPSBjb21wb25lbnQ7XG4gICAgICBjb21wb25lbnRzLnB1c2goW25hbWUsIGNvbXBvbmVudF0pO1xuICAgIH1cblxuICAgIC8vIEFwcGVuZCB0byBET01cbiAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICBpZiAoXCJpbnNlcnRcIiBpbiBjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudC5pbnNlcnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjb21wb25lbnQuaW5zZXJ0KGZyYWdtZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50RWxlbWVudCkge1xuICAgICAgICBjb21wb25lbnQuX2NvbnRhaW5lciA9IHBhcmVudEVsZW1lbnQ7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBcIm9uSW5zZXJ0ZWRcIiBpbiBjb21wb25lbnQgJiZcbiAgICAgICAgICB0eXBlb2YgY29tcG9uZW50Lm9uSW5zZXJ0ZWQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICApIHtcbiAgICAgICAgICBjb21wb25lbnQub25JbnNlcnRlZChwYXJlbnRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEFwcGVuZCBmcmFnbWVudCB0byBwYXJlbnRcbiAgaWYgKHBhcmVudEVsZW1lbnQgJiYgZnJhZ21lbnQuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgY29uc3Qgd3JhcHBlciA9IGlzQ29tcG9uZW50KHBhcmVudEVsZW1lbnQpXG4gICAgICA/IHBhcmVudEVsZW1lbnQuZWxlbWVudFxuICAgICAgOiBwYXJlbnRFbGVtZW50O1xuICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpO1xuICB9XG5cbiAgLy8gUmVsZWFzZSBmcmFnbWVudCBiYWNrIHRvIHBvb2xcbiAgcmVsZWFzZUZyYWdtZW50KGZyYWdtZW50KTtcblxuICBsYXlvdXQuY29tcG9uZW50cyA9IGNvbXBvbmVudHM7XG4gIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgb2JqZWN0LWJhc2VkIHNjaGVtYSBkZWZpbml0aW9uc1xuICogU2ltcGxpZmllZCBhbmQgb3B0aW1pemVkIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc09iamVjdFNjaGVtYShcbiAgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgc3RyaW5nLFxuICBwYXJlbnRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsLFxuICBvcHRpb25zOiBMYXlvdXRPcHRpb25zID0ge30sXG4pOiBMYXlvdXRSZXN1bHQge1xuICBjb25zdCBsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgY29uc3QgZGVmYXVsdENyZWF0b3IgPSBvcHRpb25zLmNyZWF0b3IgfHwgY3JlYXRlRWxlbWVudDtcblxuICAvLyBIYW5kbGUgcm9vdCBlbGVtZW50IGNyZWF0aW9uXG4gIGlmICgoc2NoZW1hIGFzIGFueSkuZWxlbWVudCAmJiAhcGFyZW50RWxlbWVudCkge1xuICAgIGNvbnN0IGVsZW1lbnREZWYgPSAoc2NoZW1hIGFzIGFueSkuZWxlbWVudDtcbiAgICBjb25zdCBjcmVhdGVFbGVtZW50Rm4gPSBlbGVtZW50RGVmLmNyZWF0b3IgfHwgZGVmYXVsdENyZWF0b3I7XG5cbiAgICBjb25zdCBlbGVtZW50T3B0aW9ucyA9IGVsZW1lbnREZWYub3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBwcm9jZXNzZWRPcHRpb25zID1cbiAgICAgIG9wdGlvbnMucHJlZml4ICE9PSBmYWxzZVxuICAgICAgICA/IHByb2Nlc3NDbGFzc05hbWVzKGVsZW1lbnRPcHRpb25zKVxuICAgICAgICA6IHsgLi4uZWxlbWVudE9wdGlvbnMgfTtcblxuICAgIGNvbnN0IHJvb3RDb21wb25lbnQgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShcbiAgICAgIGNyZWF0ZUVsZW1lbnRGbixcbiAgICAgIHByb2Nlc3NlZE9wdGlvbnMsXG4gICAgKTtcbiAgICBsYXlvdXQuZWxlbWVudCA9IHJvb3RDb21wb25lbnQ7XG4gICAgaWYgKGVsZW1lbnREZWYubmFtZSkgbGF5b3V0W2VsZW1lbnREZWYubmFtZV0gPSByb290Q29tcG9uZW50O1xuXG4gICAgLy8gUHJvY2VzcyBjaGlsZHJlblxuICAgIGlmIChlbGVtZW50RGVmLmNoaWxkcmVuKSB7XG4gICAgICBjb25zdCByb290RWxlbWVudCA9IGlzQ29tcG9uZW50KHJvb3RDb21wb25lbnQpXG4gICAgICAgID8gcm9vdENvbXBvbmVudC5lbGVtZW50XG4gICAgICAgIDogcm9vdENvbXBvbmVudDtcbiAgICAgIGNvbnN0IGNoaWxkUmVzdWx0ID0gcHJvY2Vzc09iamVjdFNjaGVtYShcbiAgICAgICAgZWxlbWVudERlZi5jaGlsZHJlbixcbiAgICAgICAgcm9vdEVsZW1lbnQsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApO1xuICAgICAgT2JqZWN0LmFzc2lnbihsYXlvdXQsIGNoaWxkUmVzdWx0LmxheW91dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUxheW91dFJlc3VsdChsYXlvdXQpO1xuICB9XG5cbiAgLy8gUHJvY2VzcyBub3JtYWwgc2NoZW1hIGVsZW1lbnRzXG4gIGNvbnN0IGZyYWdtZW50ID0gcGFyZW50RWxlbWVudCA/IGNyZWF0ZUZyYWdtZW50KCkgOiBudWxsO1xuXG4gIGZvciAoY29uc3Qga2V5IGluIHNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgY29uc3QgZGVmID0gKHNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldO1xuICAgIGlmICghZGVmKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGVsZW1lbnRDcmVhdG9yID0gZGVmLmNyZWF0b3IgfHwgZGVmYXVsdENyZWF0b3I7XG4gICAgY29uc3QgZWxlbWVudE9wdGlvbnMgPSBkZWYub3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBzaG91bGRBcHBseVByZWZpeCA9XG4gICAgICBcInByZWZpeFwiIGluIGVsZW1lbnRPcHRpb25zXG4gICAgICAgID8gZWxlbWVudE9wdGlvbnMucHJlZml4XG4gICAgICAgIDogb3B0aW9ucy5wcmVmaXggIT09IGZhbHNlO1xuICAgIGNvbnN0IHByb2Nlc3NlZE9wdGlvbnMgPSBzaG91bGRBcHBseVByZWZpeFxuICAgICAgPyBwcm9jZXNzQ2xhc3NOYW1lcyhlbGVtZW50T3B0aW9ucylcbiAgICAgIDogeyAuLi5lbGVtZW50T3B0aW9ucyB9O1xuXG4gICAgaWYgKCFkZWYubmFtZSAmJiBrZXkgIT09IFwiZWxlbWVudFwiKSB7XG4gICAgICBkZWYubmFtZSA9IGtleTtcbiAgICB9XG5cbiAgICBjb25zdCBjcmVhdGVkID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoZWxlbWVudENyZWF0b3IsIHByb2Nlc3NlZE9wdGlvbnMpO1xuICAgIGxheW91dFtrZXldID0gY3JlYXRlZDtcbiAgICBpZiAoZGVmLm5hbWUgJiYgZGVmLm5hbWUgIT09IGtleSkgbGF5b3V0W2RlZi5uYW1lXSA9IGNyZWF0ZWQ7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gaXNDb21wb25lbnQoY3JlYXRlZCkgPyBjcmVhdGVkLmVsZW1lbnQgOiBjcmVhdGVkO1xuICAgIGlmIChmcmFnbWVudCkgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG5cbiAgICAvLyBQcm9jZXNzIGNoaWxkcmVuXG4gICAgaWYgKGRlZi5jaGlsZHJlbikge1xuICAgICAgY29uc3QgY2hpbGRSZXN1bHQgPSBwcm9jZXNzT2JqZWN0U2NoZW1hKGRlZi5jaGlsZHJlbiwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICBPYmplY3QuYXNzaWduKGxheW91dCwgY2hpbGRSZXN1bHQubGF5b3V0KTtcbiAgICB9XG4gIH1cblxuICAvLyBBcHBlbmQgdG8gcGFyZW50XG4gIGlmIChwYXJlbnRFbGVtZW50ICYmIGZyYWdtZW50KSB7XG4gICAgY29uc3QgcGFyZW50RG9tID0gaXNDb21wb25lbnQocGFyZW50RWxlbWVudClcbiAgICAgID8gcGFyZW50RWxlbWVudC5lbGVtZW50XG4gICAgICA6IHBhcmVudEVsZW1lbnQ7XG4gICAgcGFyZW50RG9tLmFwcGVuZENoaWxkKGZyYWdtZW50KTtcbiAgICByZWxlYXNlRnJhZ21lbnQoZnJhZ21lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZUxheW91dFJlc3VsdChsYXlvdXQpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBMQVlPVVQgUkVTVUxUIENSRUFUSU9OXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRmxhdHRlbnMgYSBuZXN0ZWQgbGF5b3V0IGludG8gYSBzaW1wbGUgb2JqZWN0IHdpdGggZWxlbWVudCBhbmQgY29tcG9uZW50IHJlZmVyZW5jZXNcbiAqL1xuZnVuY3Rpb24gZmxhdHRlbkxheW91dChsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgY29uc3QgZmxhdHRlbmVkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cbiAgaWYgKCFsYXlvdXQgfHwgdHlwZW9mIGxheW91dCAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZsYXR0ZW5lZDtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBsYXlvdXQpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGxheW91dFtrZXldO1xuICAgIGlmIChcbiAgICAgIHZhbHVlICYmXG4gICAgICB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgKHZhbHVlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHxcbiAgICAgICAgKHR5cGVvZiBTVkdFbGVtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmIHZhbHVlIGluc3RhbmNlb2YgU1ZHRWxlbWVudCkgfHxcbiAgICAgICAgaXNDb21wb25lbnQodmFsdWUpKVxuICAgICkge1xuICAgICAgZmxhdHRlbmVkW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmxhdHRlbmVkO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsYXlvdXQgcmVzdWx0IG9iamVjdCB3aXRoIHV0aWxpdHkgZnVuY3Rpb25zXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUxheW91dFJlc3VsdChsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBMYXlvdXRSZXN1bHQge1xuICBjb25zdCBmbGF0dGVuZWRDb21wb25lbnRzID0gZmxhdHRlbkxheW91dChsYXlvdXQpO1xuXG4gIHJldHVybiB7XG4gICAgbGF5b3V0LFxuICAgIGVsZW1lbnQ6IGxheW91dC5lbGVtZW50LFxuICAgIGNvbXBvbmVudDogZmxhdHRlbmVkQ29tcG9uZW50cyxcblxuICAgIGdldChuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgICAgcmV0dXJuIGxheW91dFtuYW1lXSA/PyBudWxsO1xuICAgIH0sXG5cbiAgICBnZXRBbGwoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICByZXR1cm4gZmxhdHRlbmVkQ29tcG9uZW50cztcbiAgICB9LFxuXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAgIC8vIFRyYWNrIGRlc3Ryb3llZCBjb21wb25lbnRzIHRvIGF2b2lkIGRvdWJsZS1kZXN0cm95XG4gICAgICBjb25zdCBkZXN0cm95ZWQgPSBuZXcgU2V0PGFueT4oKTtcblxuICAgICAgLy8gSGVscGVyIHRvIHNhZmVseSBkZXN0cm95IGEgY29tcG9uZW50XG4gICAgICBjb25zdCBkZXN0cm95Q29tcG9uZW50ID0gKGNvbXBvbmVudDogYW55KTogdm9pZCA9PiB7XG4gICAgICAgIGlmICghY29tcG9uZW50IHx8IGRlc3Ryb3llZC5oYXMoY29tcG9uZW50KSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFNraXAgcGxhaW4gSFRNTCBlbGVtZW50cyBhbmQgbm9uLW9iamVjdHNcbiAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IHR5cGVvZiBjb21wb25lbnQgIT09IFwib2JqZWN0XCIpXG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGl0J3MgYSBjb21wb25lbnQgd2l0aCBkZXN0cm95IG1ldGhvZFxuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBkZXN0cm95ZWQuYWRkKGNvbXBvbmVudCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5kZXN0cm95KCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gSWdub3JlIGRlc3Ryb3kgZXJyb3JzIC0gY29tcG9uZW50IG1heSBhbHJlYWR5IGJlIGNsZWFuZWQgdXBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8vIEZpcnN0IGRlc3Ryb3kgY29tcG9uZW50cyBmcm9tIHRoZSBjb21wb25lbnRzIGFycmF5IChpZiBwcmVzZW50KVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIGFsbCBuYW1lZCBjb21wb25lbnRzIGFyZSBkZXN0cm95ZWQgZXZlbiBpZiBuZXN0ZWRcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGxheW91dC5jb21wb25lbnRzKSkge1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBjb21wb25lbnRdIG9mIGxheW91dC5jb21wb25lbnRzKSB7XG4gICAgICAgICAgZGVzdHJveUNvbXBvbmVudChjb21wb25lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZW4gaXRlcmF0ZSBvdmVyIGFsbCBsYXlvdXQga2V5cyBmb3IgYW55IG1pc3NlZCBjb21wb25lbnRzXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBsYXlvdXQpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJlbGVtZW50XCIgfHwga2V5ID09PSBcImNvbXBvbmVudHNcIikgY29udGludWU7XG4gICAgICAgIGRlc3Ryb3lDb21wb25lbnQobGF5b3V0W2tleV0pO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGVhciB0aGUgY29tcG9uZW50cyBhcnJheVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGF5b3V0LmNvbXBvbmVudHMpKSB7XG4gICAgICAgIGxheW91dC5jb21wb25lbnRzLmxlbmd0aCA9IDA7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSByb290IGVsZW1lbnQgZnJvbSBET01cbiAgICAgIGlmIChsYXlvdXQuZWxlbWVudCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gaXNDb21wb25lbnQobGF5b3V0LmVsZW1lbnQpXG4gICAgICAgICAgPyBsYXlvdXQuZWxlbWVudC5lbGVtZW50XG4gICAgICAgICAgOiBsYXlvdXQuZWxlbWVudDtcbiAgICAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFyIHJlZmVyZW5jZXMgdG8gaGVscCBHQ1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbGF5b3V0KSB7XG4gICAgICAgIGRlbGV0ZSBsYXlvdXRba2V5XTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBVTklGSUVEIEVOVFJZIFBPSU5UXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ3JlYXRlcyBhIGxheW91dCBmcm9tIHZhcmlvdXMgc2NoZW1hIGZvcm1hdHNcbiAqIFVuaWZpZWQgcHJvY2Vzc29yIGZvciBhcnJheXMsIG9iamVjdHMsIEpTWCwgYW5kIEhUTUwgc3RyaW5nc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGF5b3V0KFxuICBzY2hlbWE6IGFueSxcbiAgcGFyZW50RWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbCxcbiAgb3B0aW9uczogTGF5b3V0T3B0aW9ucyA9IHt9LFxuKTogTGF5b3V0UmVzdWx0IHtcbiAgLy8gSGFuZGxlIGZ1bmN0aW9uIHNjaGVtYXNcbiAgaWYgKHR5cGVvZiBzY2hlbWEgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHNjaGVtYSA9IHNjaGVtYSgpO1xuICB9XG5cbiAgLy8gSGFuZGxlIEhUTUwgc3RyaW5nIHNjaGVtYXNcbiAgaWYgKHR5cGVvZiBzY2hlbWEgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBzY2hlbWEudHJpbSgpO1xuICAgIGNvbnN0IGZyYWdtZW50ID0gdGVtcGxhdGUuY29udGVudDtcblxuICAgIGlmIChwYXJlbnRFbGVtZW50ICYmIGZyYWdtZW50Lmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgcGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChmcmFnbWVudCk7XG4gICAgfVxuXG4gICAgY29uc3QgbGF5b3V0ID0geyBlbGVtZW50OiBmcmFnbWVudC5maXJzdEVsZW1lbnRDaGlsZCBhcyBIVE1MRWxlbWVudCB9O1xuICAgIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBKU1gtbGlrZSBzY2hlbWFzIChhcnJheSB3aXRoIGZ1bmN0aW9uLCBzdHJpbmcsIG9iamVjdCBwYXR0ZXJuKVxuICBpZiAoXG4gICAgQXJyYXkuaXNBcnJheShzY2hlbWEpICYmXG4gICAgc2NoZW1hLmxlbmd0aCA+PSAzICYmXG4gICAgdHlwZW9mIHNjaGVtYVswXSA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgdHlwZW9mIHNjaGVtYVsxXSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgIGlzT2JqZWN0KHNjaGVtYVsyXSlcbiAgKSB7XG4gICAgcmV0dXJuIHByb2Nlc3NBcnJheVNjaGVtYShzY2hlbWEsIHBhcmVudEVsZW1lbnQsIDAsIG9wdGlvbnMpO1xuICB9XG5cbiAgLy8gUm91dGUgdG8gYXBwcm9wcmlhdGUgcHJvY2Vzc29yXG4gIHJldHVybiBBcnJheS5pc0FycmF5KHNjaGVtYSlcbiAgICA/IHByb2Nlc3NBcnJheVNjaGVtYShzY2hlbWEsIHBhcmVudEVsZW1lbnQsIDAsIG9wdGlvbnMpXG4gICAgOiBwcm9jZXNzT2JqZWN0U2NoZW1hKHNjaGVtYSwgcGFyZW50RWxlbWVudCwgb3B0aW9ucyk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEVYUE9SVFNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gQ2xlYXIgZnVuY3Rpb25zIGZvciB0aGUgdW5pZmllZCBzeXN0ZW1cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckNsYXNzQ2FjaGUoKTogdm9pZCB7XG4gIGNsYXNzQ2FjaGUuY2xlYXIoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyRnJhZ21lbnRQb29sKCk6IHZvaWQge1xuICBmcmFnbWVudFBvb2wuY2xlYXIoKTtcbn1cblxuZXhwb3J0IHtcbiAgcHJvY2Vzc0NsYXNzTmFtZXMsXG4gIGlzQ29tcG9uZW50LFxuICBmbGF0dGVuTGF5b3V0LFxuICBhcHBseUxheW91dENsYXNzZXMsXG4gIGFwcGx5TGF5b3V0SXRlbUNsYXNzZXMsXG4gIGNyZWF0ZUxheW91dFJlc3VsdCxcbn07XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL2V2ZW50cy50c1xuXG4vKipcbiAqIEV2ZW50cyBGZWF0dXJlIC0gQ2VudHJhbGl6ZWQgZXZlbnQgc3lzdGVtIGZvciB2aWV3cG9ydFxuICogUHJvdmlkZXMgZXZlbnQgZW1pc3Npb24gYW5kIHN1YnNjcmlwdGlvbiBmb3IgaW50ZXItZmVhdHVyZSBjb21tdW5pY2F0aW9uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXZlbnRzQ29uZmlnIHtcbiAgZGVidWc/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEV2ZW50cyBmZWF0dXJlIGZvciB2aWV3cG9ydFxuICogQ2VudHJhbGl6ZXMgYWxsIGV2ZW50IGhhbmRsaW5nIGZvciB2aWV3cG9ydCBmZWF0dXJlc1xuICovXG5leHBvcnQgY29uc3Qgd2l0aEV2ZW50cyA9IChjb25maWc6IEV2ZW50c0NvbmZpZyA9IHt9KSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50Pihjb21wb25lbnQ6IFQpOiBUID0+IHtcbiAgICBjb25zdCB7IGRlYnVnID0gZmFsc2UgfSA9IGNvbmZpZztcblxuICAgIC8vIEV2ZW50IGxpc3RlbmVycyBtYXBcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBuZXcgTWFwPHN0cmluZywgU2V0PEZ1bmN0aW9uPj4oKTtcblxuICAgIC8vIEVtaXQgYW4gZXZlbnRcbiAgICBjb25zdCBlbWl0ID0gKGV2ZW50OiBzdHJpbmcsIGRhdGE/OiBhbnkpID0+IHtcbiAgICAgIC8vIGlmIChkZWJ1Zykge1xuICAgICAgLy8gICBjb25zb2xlLmxvZyhgW0V2ZW50c10gRW1pdDogJHtldmVudH1gLCBkYXRhKTtcbiAgICAgIC8vIH1cblxuICAgICAgY29uc3QgZXZlbnRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZ2V0KGV2ZW50KTtcbiAgICAgIGlmIChldmVudExpc3RlbmVycykge1xuICAgICAgICBldmVudExpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsaXN0ZW5lcihkYXRhKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgW0V2ZW50c10gRXJyb3IgaW4gbGlzdGVuZXIgZm9yICR7ZXZlbnR9OmAsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTdWJzY3JpYmUgdG8gYW4gZXZlbnRcbiAgICBjb25zdCBvbiA9IChldmVudDogc3RyaW5nLCBoYW5kbGVyOiBGdW5jdGlvbik6ICgoKSA9PiB2b2lkKSA9PiB7XG4gICAgICBpZiAoIWxpc3RlbmVycy5oYXMoZXZlbnQpKSB7XG4gICAgICAgIGxpc3RlbmVycy5zZXQoZXZlbnQsIG5ldyBTZXQoKSk7XG4gICAgICB9XG5cbiAgICAgIGxpc3RlbmVycy5nZXQoZXZlbnQpIS5hZGQoaGFuZGxlcik7XG5cbiAgICAgIC8vIGlmIChkZWJ1Zykge1xuICAgICAgLy8gICBjb25zb2xlLmxvZyhgW0V2ZW50c10gU3Vic2NyaWJlZCB0bzogJHtldmVudH1gKTtcbiAgICAgIC8vIH1cblxuICAgICAgLy8gUmV0dXJuIHVuc3Vic2NyaWJlIGZ1bmN0aW9uXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb25zdCBldmVudExpc3RlbmVycyA9IGxpc3RlbmVycy5nZXQoZXZlbnQpO1xuICAgICAgICBpZiAoZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgICAgICBldmVudExpc3RlbmVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIGxpc3RlbmVycy5kZWxldGUoZXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgLy8gU3Vic2NyaWJlIHRvIGFuIGV2ZW50IG9uY2VcbiAgICBjb25zdCBvbmNlID0gKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKTogKCgpID0+IHZvaWQpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZWRIYW5kbGVyID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBoYW5kbGVyKGRhdGEpO1xuICAgICAgICBvZmYoZXZlbnQsIHdyYXBwZWRIYW5kbGVyKTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gb24oZXZlbnQsIHdyYXBwZWRIYW5kbGVyKTtcbiAgICB9O1xuXG4gICAgLy8gVW5zdWJzY3JpYmUgZnJvbSBhbiBldmVudFxuICAgIGNvbnN0IG9mZiA9IChldmVudDogc3RyaW5nLCBoYW5kbGVyOiBGdW5jdGlvbikgPT4ge1xuICAgICAgY29uc3QgZXZlbnRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZ2V0KGV2ZW50KTtcbiAgICAgIGlmIChldmVudExpc3RlbmVycykge1xuICAgICAgICBldmVudExpc3RlbmVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIGlmIChldmVudExpc3RlbmVycy5zaXplID09PSAwKSB7XG4gICAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQ2xlYXIgYWxsIGxpc3RlbmVycyBmb3IgYW4gZXZlbnRcbiAgICBjb25zdCBjbGVhciA9IChldmVudD86IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgIGxpc3RlbmVycy5kZWxldGUoZXZlbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGlzdGVuZXJzLmNsZWFyKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEFkZCBldmVudCBtZXRob2RzIHRvIGNvbXBvbmVudFxuICAgIGNvbXBvbmVudC5lbWl0ID0gZW1pdDtcbiAgICBjb21wb25lbnQub24gPSBvbjtcbiAgICBjb21wb25lbnQub25jZSA9IG9uY2U7XG4gICAgY29tcG9uZW50Lm9mZiA9IG9mZjtcblxuICAgIC8vIEFkZCBldmVudHMgQVBJIHRvIHZpZXdwb3J0XG4gICAgKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLmV2ZW50cyA9IHtcbiAgICAgIGVtaXQsXG4gICAgICBvbixcbiAgICAgIG9uY2UsXG4gICAgICBvZmYsXG4gICAgICBjbGVhcixcbiAgICAgIGdldExpc3RlbmVyQ291bnQ6IChldmVudD86IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gbGlzdGVuZXJzLmdldChldmVudCk/LnNpemUgfHwgMDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdG90YWwgPSAwO1xuICAgICAgICBsaXN0ZW5lcnMuZm9yRWFjaCgoc2V0KSA9PiAodG90YWwgKz0gc2V0LnNpemUpKTtcbiAgICAgICAgcmV0dXJuIHRvdGFsO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gQ2xlYW4gdXAgb24gZGVzdHJveVxuICAgIGlmIChcImRlc3Ryb3lcIiBpbiBjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IGNvbXBvbmVudC5kZXN0cm95O1xuICAgICAgY29tcG9uZW50LmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIGNsZWFyKCk7XG4gICAgICAgIG9yaWdpbmFsRGVzdHJveT8uKCk7XG4g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QUMzQyxvQkFBb0IsT0FBTyxhQUFhLHVCQUF1QjtBQUFBLFFBQy9ELG9CQUFxQixPQUFlO0FBQUEsUUFDcEMsVUFBVyxPQUFlO0FBQUEsUUFDMUIsVUFBVyxPQUFlLGFBQWE7QUFBQSxRQUN2QyxpQkFBa0IsT0FBZTtBQUFBLFFBQ2pDLGdCQUFnQixPQUFPLE9BQU87QUFBQSxRQUM5QixnQkFBZ0IsT0FBTyxPQUFPO0FBQUEsTUFDaEMsQ0FBQyxDQUNIO0FBQUEsSUFDRjtBQUFBLElBR0EsSUFBSSxPQUFPLFlBQVksV0FBVyxPQUFPLGNBQWMsWUFBWSxPQUFPO0FBQUEsTUFDeEUsVUFBVSxLQUNSLGlCQUFpQjtBQUFBLFFBQ2YsU0FBUztBQUFBLFFBQ1Qsa0JBQWtCLE9BQU8sY0FBYyxvQkFBb0I7QUFBQSxRQUMzRCxlQUFlLE9BQU8sY0FBYztBQUFBLE1BQ3RDLENBQUMsQ0FDSDtBQUFBLElBQ0Y7QUFBQSxJQUdBLFVBQVUsS0FDUixjQUFjO0FBQUEsTUFDWixVQUFVLE9BQU87QUFBQSxNQUNqQixVQUFVLE9BQU8sU0FBUztBQUFBLE1BQzFCLGtCQUFrQixPQUFPLFdBQVc7QUFBQSxJQUN0QyxDQUFDLENBQ0g7QUFBQSxJQUdBLE1BQU0sVUFBVSxLQUFLLEdBQUcsU0FBUztBQUFBLElBR2pDLE1BQU0sV0FBVyxRQUFRLGFBQWE7QUFBQSxJQUd0QyxJQUFJLFNBQVMsU0FBUztBQUFBLE1BQ3BCLFNBQVMsU0FBUyxXQUFXO0FBQUEsSUFDL0I7QUFBQSxJQUVBLE9BQU87QUFBQTtBQUFBOyIsCiAgImRlYnVnSWQiOiAiMTdGMEE2NjgzMTk0RDk2MDY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=